From e4c9158f0ebe8e4048fb4c8713034543309a5861 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sat, 18 Jan 2025 22:51:26 +0000 Subject: [PATCH 01/35] feat: begin refactor of `create-solid` package --- packages/create-solid/package.json | 6 +- packages/create-solid/src/create-start.ts | 0 packages/create-solid/src/create-vanilla.ts | 25 ++++++ packages/create-solid/src/helpers.ts | 97 +++++++++++++++++++++ packages/create-solid/src/index.ts | 78 +++++++---------- pnpm-lock.yaml | 17 ++++ 6 files changed, 177 insertions(+), 46 deletions(-) create mode 100644 packages/create-solid/src/create-start.ts create mode 100644 packages/create-solid/src/create-vanilla.ts create mode 100644 packages/create-solid/src/helpers.ts diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index ba9ac57..ee06004 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -41,5 +41,9 @@ "publishConfig": { "access": "public" }, - "dependencies": {} + "dependencies": { + "@begit/core": "^0.0.19", + "citty": "^0.1.6", + "sucrase": "^3.35.0" + } } diff --git a/packages/create-solid/src/create-start.ts b/packages/create-solid/src/create-start.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/create-solid/src/create-vanilla.ts b/packages/create-solid/src/create-vanilla.ts new file mode 100644 index 0000000..728da6e --- /dev/null +++ b/packages/create-solid/src/create-vanilla.ts @@ -0,0 +1,25 @@ +import { downloadRepo } from "@begit/core"; +import { join } from "node:path"; +import { GIT_IGNORE, handleTSConversion } from "./helpers"; +import { writeFileSync } from "node:fs"; + +const VANILLA_TEMPLATES = ["ts"] as const; +type VanillaTemplate = (typeof VANILLA_TEMPLATES)[number]; + +type CreateVanillaArgs = { + template: VanillaTemplate, + destination: string, +} +export const createVanillaTS = async ({ template, destination }: CreateVanillaArgs) => { + return await downloadRepo({ repo: { owner: "solidjs", name: "templates", subdir: template }, dest: destination }); +} + +export const createVanillaJS = async ({ template, destination }: CreateVanillaArgs) => { + // Create typescript project in `/.project` + // then transpile this to javascript and clean up + const tempDir = join(destination, ".project"); + await createVanillaTS({ template, destination: tempDir }) + await handleTSConversion(tempDir, destination); + // Add .gitignore + writeFileSync(join(destination, ".gitignore"), GIT_IGNORE); +} \ No newline at end of file diff --git a/packages/create-solid/src/helpers.ts b/packages/create-solid/src/helpers.ts new file mode 100644 index 0000000..67203a5 --- /dev/null +++ b/packages/create-solid/src/helpers.ts @@ -0,0 +1,97 @@ +import { copyFileSync, Dirent, mkdirSync, readdirSync, writeFileSync } from "node:fs"; +import { readFile, rm } from "node:fs/promises"; +import { join, resolve } from "node:path"; +import { transform } from "sucrase"; + +const recurseFiles = (startPath: string, cb: (file: Dirent, startPath: string) => void) => { + startPath = resolve(startPath); + + const files = readdirSync(startPath, { withFileTypes: true }); + + for (const file of files) { + cb(file, startPath); + } +}; + +export const readFileToString = async (path: string) => { + return (await readFile(path)).toString(); +}; +const convertToJS = async (file: Dirent, startPath: string) => { + const src = join(startPath, file.name); + const dest = resolve(startPath.replace(".solid-start", ""), file.name); + if (file.isDirectory()) { + mkdirSync(dest, { recursive: true }); + recurseFiles(resolve(startPath, file.name), convertToJS); + } else if (file.isFile()) { + if (src.endsWith(".ts") || src.endsWith(".tsx")) { + let { code } = transform(await readFileToString(src), { + transforms: ["typescript", "jsx"], + jsxRuntime: "preserve", + }); + + writeFileSync(dest.replace(".ts", ".js"), code, { flag: "wx" }); + } else { + copyFileSync(src, dest); + } + } +}; +export const handleTSConversion = async (tempDir: string, projectName: string) => { + await rm(resolve(tempDir, "tsconfig.json")); + writeFileSync( + resolve(projectName, "jsconfig.json"), + JSON.stringify( + { + compilerOptions: { + jsx: "preserve", + jsxImportSource: "solid-js", + paths: { + "~/*": ["./src/*"], + }, + }, + }, + null, + 2, + ), + { flag: "wx" }, + ); + + // Convert all ts files in temp directory into js + recurseFiles(tempDir, convertToJS); + + // Remove temp directory + await rm(join(process.cwd(), tempDir), { + recursive: true, + force: true, + }); +}; + +export const GIT_IGNORE = ` +dist +.solid +.output +.vercel +.netlify +.vinxi +app.config.timestamp_*.js + +# Environment +.env +.env*.local + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +*.launch +.settings/ + +# Temp +gitignore + +# System Files +.DS_Store +Thumbs.db +`; \ No newline at end of file diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index c094406..7d63a21 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -1,55 +1,43 @@ #! /usr/bin/env node -import { AllSupported, handleNew, isSupported } from "@solid-cli/commands/new"; import color from "picocolors"; import { intro } from "@clack/prompts"; import packageJson from "../package.json" with { type: "json" }; -import { command, run, option, string, boolean, flag, optional, positional } from "cmd-ts"; +import { defineCommand, runMain } from "citty"; +import { createVanillaJS } from "./create-vanilla"; intro(`\n${color.bgCyan(color.black(` Create-Solid v${packageJson.version}`))}`); -const app = command({ - name: "create-solid", - description: "Create a new Solid project", +const main = defineCommand({ + meta: { + name: "create-solid", + version: packageJson.version, + }, args: { - projectNamePositional: positional({ - type: optional(string), - displayName: "Project Name", - description: "The name of the project to be generated", - }), - templatePositional: positional({ - type: optional(string), - displayName: "Template name", - description: "Name of template to be initialised", - }), - projectNameOption: option({ - type: optional(string), - long: "project-name", - short: "p", - description: "Name of your project", - }), - solidStart: flag({ - type: optional(boolean), - long: "solid-start", - short: "s", + projectNamePositional: { + type: "positional", + required: false, + description: "Project name" + }, + templatePositional: { + type: "positional", + required: false, + description: "Template name", + }, + "project-name": { + type: "string", + required: false, + alias: "p", + description: "Project name", + }, + solidstart: { + type: "boolean", + required: false, + alias: "s", description: "Create a SolidStart project", - }), - }, - handler: async ({ projectNameOption, solidStart, projectNamePositional, templatePositional }) => { - if (templatePositional && !isSupported(templatePositional)) { - console.error(`Template "${templatePositional}" is not supported`); - process.exit(0); - } - try { - await handleNew( - templatePositional as AllSupported, - projectNamePositional ?? projectNameOption, - false, - solidStart, - ); - } catch (e) { - console.error(e); - process.exit(1); - } + }, }, -}); -run(app, process.argv.slice(2)); + run({ args: { projectNamePositional, templatePositional, "project-name": projectNameOptional, solidstart } }) { + createVanillaJS({ template: "ts", destination: "./ts" }) + } +}) +runMain(main); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 71d2f67..7f6594c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -120,6 +120,16 @@ importers: version: 5.6.3 packages/create-solid: + dependencies: + '@begit/core': + specifier: ^0.0.19 + version: 0.0.19 + citty: + specifier: ^0.1.6 + version: 0.1.6 + sucrase: + specifier: ^3.35.0 + version: 3.35.0 devDependencies: '@clack/prompts': specifier: 0.7.0 @@ -1063,6 +1073,9 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + cmd-ts@0.13.0: resolution: {integrity: sha512-nsnxf6wNIM/JAS7T/x/1JmbEsjH0a8tezXqqpaL0O6+eV0/aDEnRxwjxpu0VzDdRcaC1ixGSbRlUuf/IU59I4g==} @@ -2679,6 +2692,10 @@ snapshots: ci-info@3.9.0: {} + citty@0.1.6: + dependencies: + consola: 3.2.3 + cmd-ts@0.13.0: dependencies: chalk: 4.1.2 From 5a380aa41457f612f6cfc2502a3b404d4ce2639b Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sat, 18 Jan 2025 23:02:58 +0000 Subject: [PATCH 02/35] refactor: remove custom reactivity implementation --- packages/reactivity/.gitignore | 1 - packages/reactivity/README.md | 3 - packages/reactivity/package.json | 37 -------- packages/reactivity/src/api/index.ts | 59 ------------- packages/reactivity/src/core/index.ts | 104 ----------------------- packages/reactivity/src/index.ts | 1 - packages/reactivity/test/async.test.ts | 24 ------ packages/reactivity/test/batch.test.ts | 80 ----------------- packages/reactivity/test/effects.test.ts | 54 ------------ packages/reactivity/test/memos.test.ts | 55 ------------ packages/reactivity/test/signals.test.ts | 10 --- packages/reactivity/tsconfig.json | 24 ------ packages/reactivity/tsup.config.ts | 11 --- 13 files changed, 463 deletions(-) delete mode 100644 packages/reactivity/.gitignore delete mode 100644 packages/reactivity/README.md delete mode 100644 packages/reactivity/package.json delete mode 100644 packages/reactivity/src/api/index.ts delete mode 100644 packages/reactivity/src/core/index.ts delete mode 100644 packages/reactivity/src/index.ts delete mode 100644 packages/reactivity/test/async.test.ts delete mode 100644 packages/reactivity/test/batch.test.ts delete mode 100644 packages/reactivity/test/effects.test.ts delete mode 100644 packages/reactivity/test/memos.test.ts delete mode 100644 packages/reactivity/test/signals.test.ts delete mode 100644 packages/reactivity/tsconfig.json delete mode 100644 packages/reactivity/tsup.config.ts diff --git a/packages/reactivity/.gitignore b/packages/reactivity/.gitignore deleted file mode 100644 index fbf0622..0000000 --- a/packages/reactivity/.gitignore +++ /dev/null @@ -1 +0,0 @@ -types \ No newline at end of file diff --git a/packages/reactivity/README.md b/packages/reactivity/README.md deleted file mode 100644 index d46f097..0000000 --- a/packages/reactivity/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @solid-cli/reactivity - -A lightweight reactivity system which powers some of the CLI. It is an eager system (derived state is updated immediately when the sources change) diff --git a/packages/reactivity/package.json b/packages/reactivity/package.json deleted file mode 100644 index 948af8f..0000000 --- a/packages/reactivity/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "@solid-cli/reactivity", - "version": "0.0.11", - "description": "The minimal, eager reactive system that powers the Solid CLI", - "license": "MIT", - "homepage": "https://solid-cli.netlify.app", - "repository": { - "type": "git", - "url": "https://github.com/solidjs-community/solid-cli" - }, - "files": [ - "dist", - "types" - ], - "main": "./dist/index.mjs", - "module": "./dist/index.mjs", - "types": "./types/index.d.ts", - "exports": { - ".": { - "import": "./dist/index.mjs", - "require": "./dist/index.mjs", - "types": "./types/index.d.ts" - } - }, - "scripts": { - "test": "vitest run", - "build": "tsc && tsup" - }, - "author": "Thomas Beer", - "devDependencies": { - "tsup": "^8.3.5", - "typescript": "^5.6.3" - }, - "publishConfig": { - "access": "public" - } -} diff --git a/packages/reactivity/src/api/index.ts b/packages/reactivity/src/api/index.ts deleted file mode 100644 index ffedb90..0000000 --- a/packages/reactivity/src/api/index.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Computation, Getter, Signal, batch, runWithListener } from "../core"; -export { batch, getListener, type Getter, type Setter, type Signal } from "../core"; -type OnOptions = { defer: boolean }; -export function on(deps: Getter, fn: (val: G) => T, options?: OnOptions): () => T | undefined; -export function on(deps: Getter[] | Getter, fn: (val: any) => T, options?: OnOptions) { - let shouldDefer = options?.defer ?? false; - return () => { - // Track all getters on call - let args: any[] = []; - Array.isArray(deps) ? deps.forEach((d) => args.push(d())) : args.push(deps()); - if (shouldDefer) { - shouldDefer = false; - return; - } - // Ensure that the function isn't tracked - return untrack(() => fn(args.length === 1 ? args[0] : args)); - }; -} -export function createSignal(val: T) { - const comp = new Computation(() => val); - const set = (fnOrVal: T | ((val: T | null) => T) | null) => { - if (typeof fnOrVal === "function") { - let fn = fnOrVal as (val: T | null) => T; - const newVal = fn(untrack(comp.get)); - comp.set(newVal); - } else { - comp.set(fnOrVal as T); - } - }; - return [comp.get, set] as Signal; -} -export function createEffect(fn: () => T) { - new Computation(fn); -} -export function createMemo(fn: () => T) { - const comp = new Computation(fn); - return comp.get; -} -export function createAsync(fn: () => Promise) { - const [get, set] = createSignal(null); - const [loading, setLoading] = createSignal(true); - fn().then((val) => { - batch(() => { - set(val); - setLoading(false); - }); - }); - Object.defineProperties(get, { - loading: { - get() { - return loading(); - }, - }, - }); - return get as Getter & { loading: boolean }; -} -export function untrack(fn: () => T) { - return runWithListener(null, fn); -} diff --git a/packages/reactivity/src/core/index.ts b/packages/reactivity/src/core/index.ts deleted file mode 100644 index 63e923a..0000000 --- a/packages/reactivity/src/core/index.ts +++ /dev/null @@ -1,104 +0,0 @@ -export type Getter = () => T; -export type Setter = (val: T | ((val: T | null) => T)) => void; -export type Signal = [Getter, Setter]; -let OBSERVER: Computation | null = null; -let BATCHING = false; -const UPDATEQUEUE: Computation[] = []; -export class Computation { - fn: () => T; - value: T | null = null; - state: number = 0; - queueSlot: number = -1; - sources: Set> = new Set(); - observers: Set> = new Set(); - constructor(fn: () => T) { - this.fn = fn; - this.update(); - } - track() { - if (!OBSERVER) return; - this.observers.add(OBSERVER); - OBSERVER.sources.add(this); - } - get = () => { - // We need to make sure memos update if they're accessed during a `batch` - if (this.queueSlot != -1) { - UPDATEQUEUE.splice(this.queueSlot, 1); - const prev = BATCHING; - BATCHING = false; - this.update(); - BATCHING = prev; - this.queueSlot = -1; - } - this.track(); - return this.value; - }; - set = (newVal: T) => { - if (newVal === this.value) return; - this.value = newVal; - this.notifyObservers(); - }; - removeParentObservers() { - if (!this.sources) return; - this.sources.forEach((s) => s.observers.delete(this)); - this.sources.clear(); - } - pullSourceUpdates() { - if (!this.sources) return; - this.sources.forEach((s) => s.update()); - } - update() { - if (BATCHING) { - if (this.queueSlot != -1) return; - this.queueSlot = UPDATEQUEUE.length; - UPDATEQUEUE.push(this); - return; - } - // this.removeParentObservers(); - const prev = OBSERVER; - OBSERVER = this; - const newVal = this.fn(); - OBSERVER = prev; - if (newVal === this.value) return; - this.value = newVal; - } - increment() { - this.state++; - // Only increment children if the state has increased to 1, as we don't want to repeatedly re-increment if this node has multiple parents that need updating - if (this.state === 1) { - this.observers.forEach((o) => o.increment()); - } - } - decrement() { - this.state--; - if (this.state === 0) { - this.update(); - this.observers.forEach((o) => o.decrement()); - } - } - notifyObservers() { - this.observers.forEach((o) => o.increment()); - this.observers.forEach((o) => o.decrement()); - } -} -function stabilize() { - UPDATEQUEUE.forEach((u) => u.update()); - UPDATEQUEUE.length = 0; -} -export function batch(fn: () => T) { - BATCHING = true; - const res = fn(); - BATCHING = false; - stabilize(); - return res; -} -export function getListener() { - return OBSERVER; -} -export function runWithListener(listener: Computation | null, fn: () => T) { - const prev = OBSERVER; - OBSERVER = listener; - const res = fn(); - OBSERVER = prev; - return res; -} diff --git a/packages/reactivity/src/index.ts b/packages/reactivity/src/index.ts deleted file mode 100644 index d158c57..0000000 --- a/packages/reactivity/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./api"; diff --git a/packages/reactivity/test/async.test.ts b/packages/reactivity/test/async.test.ts deleted file mode 100644 index 481fd75..0000000 --- a/packages/reactivity/test/async.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { describe, expect, test } from "vitest"; -import { createAsync, createEffect } from "../src"; - -describe("createAsync", () => { - test("An async function resolves to a value", async () => { - const asyncFn = createAsync(async () => { - return 123; - }); - const res = await new Promise((res) => { - createEffect(() => { - const result = asyncFn(); - if (result) res(result); - }); - }); - expect(res).toBe(123); - }); - test("An async function has a loading state", async () => { - const asyncFn = createAsync(async () => { - return 123; - }); - expect(asyncFn.loading).toBe(true); - queueMicrotask(() => expect(asyncFn.loading).toBe(false)); - }); -}); diff --git a/packages/reactivity/test/batch.test.ts b/packages/reactivity/test/batch.test.ts deleted file mode 100644 index 4a9f647..0000000 --- a/packages/reactivity/test/batch.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { test, expect } from "vitest"; -import { describe } from "vitest"; -import { batch, createAsync, createEffect, createMemo, createSignal } from "../src"; - -describe("batch", () => { - test("Multiple updates should only trigger an effect once", () => { - const [get, set] = createSignal(0); - let updates = 0; - createEffect(() => { - get(); - updates++; - }); - batch(() => { - set(1); - set(2); - }); - expect(updates).toBe(2); - expect(get()).toBe(2); - }); - test("A memo called within a batch should get its value updated", () => { - const [get, set] = createSignal(0); - const memo = createMemo(() => get() * 2); - batch(() => { - set(1); - expect(memo()).toBe(2); - }); - }); - test("An effect depending on both loading and data should only run once when the async resolves", async () => { - const data = createAsync(async () => { - return 123; - }); - let updates = 0; - await new Promise((res) => - createEffect(() => { - // We track both the data itself and the loading signal - const d = data(); - const loading = data.loading; - updates++; - if (d === 123 && loading === false) res(d); - }), - ); - expect(updates).toBe(2); - }); - test("A derived memo accessed within a batch should resolve to the correct value", () => { - const [get, set] = createSignal(0); - const memo = createMemo(() => get() * 2); - let updates = 0; - // First update on initial run - const derived = createMemo(() => { - updates++; - return memo()! * 2; - }); - batch(() => { - set(1); - set(2); - // 2nd Update on access - expect(derived()).toBe(8); - set(3); - // 3rd update on access - expect(derived()).toBe(12); - }); - expect(updates).toBe(3); - }); - test.skip("Diamond problem with memos accessed in a batch", () => { - const [get, set] = createSignal(0); - let updates = 0; - const A = createMemo(() => { - updates++; - get(); - }); - const B = createMemo(() => A()! * 2); - const C = createMemo(() => A()! * 3); - const D = createMemo(() => B()! + C()!); - batch(() => { - set(2); - }); - // Actually currently get 3 here - expect(updates).toBe(2); - }); -}); diff --git a/packages/reactivity/test/effects.test.ts b/packages/reactivity/test/effects.test.ts deleted file mode 100644 index 735f405..0000000 --- a/packages/reactivity/test/effects.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { describe, test, expect } from "vitest"; -import { createEffect, createSignal } from "../src"; -describe("createEffect", () => { - test("An effect executes once when created", () => { - let updates = 0; - createEffect(() => { - updates++; - }); - expect(updates).toBe(1); - }); - test("An effect re-executes when a dependency changes", () => { - let updates = 0; - const [value, setValue] = createSignal(0); - createEffect(() => { - value(); - updates++; - }); - expect(updates).toBe(1); - setValue(1); - expect(updates).toBe(2); - }); - test("Changes propagate correctly", () => { - const [get, set] = createSignal(0); - let updates = 0; - createEffect(() => { - get(); - updates++; - }); - expect(updates).toBe(1); - set(1); - expect(updates).toBe(2); - set(2); - expect(updates).toBe(3); - }); - test("Nested effects", () => { - const [A, setA] = createSignal(0); - let updates = 0; - createEffect(() => { - A(); - updates++; - let nestedUpdates = 0; - const [get, set] = createSignal(0); - createEffect(() => { - get(); - nestedUpdates++; - }); - expect(nestedUpdates).toBe(1); - set(1); - expect(nestedUpdates).toBe(2); - }); - setA(1); - expect(updates).toBe(2); - }); -}); diff --git a/packages/reactivity/test/memos.test.ts b/packages/reactivity/test/memos.test.ts deleted file mode 100644 index e18c764..0000000 --- a/packages/reactivity/test/memos.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { describe, test, expect } from "vitest"; -import { createMemo, createSignal } from "../src"; -describe("createMemo", () => { - test("A memo is executed once on creation", () => { - let updates = 0; - createMemo(() => { - updates++; - }); - expect(updates).toBe(1); - }); - test("A memo updates when its dependencies change", () => { - const [value, setValue] = createSignal(0); - let updates = 0; - createMemo(() => { - value(); - updates++; - }); - expect(updates).toBe(1); - setValue(1); - expect(updates).toBe(2); - }); - test("Memos don't overexecute if a dependency doesn't change", () => { - const [value, setValue] = createSignal(0); - const memo1 = createMemo(() => { - value(); - return 1; - }); - let updates = 0; - const memo2 = createMemo(() => { - updates++; - return memo1(); - }); - expect(memo2()).toBe(1); - setValue(0); - expect(updates).toBe(1); - }); - test("Memos don't overexecute in a diamond (The diamond problem)", () => { - const [A, setA] = createSignal(0); - const B = createMemo(() => { - return A() * 2; - }); - const C = createMemo(() => { - return A() + 2; - }); - let updates = 0; - const D = createMemo(() => { - updates++; - return B()! + C()!; - }); - expect(D()).toBe(2); - setA(1); - expect(D()).toBe(5); - expect(updates).toBe(2); - }); -}); diff --git a/packages/reactivity/test/signals.test.ts b/packages/reactivity/test/signals.test.ts deleted file mode 100644 index c227cfe..0000000 --- a/packages/reactivity/test/signals.test.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, test, expect } from "vitest"; -import { createSignal } from "../src"; -describe("createSignal", () => { - test("A signal should hold a value that can be updated", () => { - const [value, setValue] = createSignal(0); - expect(value()).toBe(0); - setValue(1); - expect(value()).toBe(1); - }); -}); diff --git a/packages/reactivity/tsconfig.json b/packages/reactivity/tsconfig.json deleted file mode 100644 index 1bd37fb..0000000 --- a/packages/reactivity/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "skipLibCheck": true, - "declaration": true, - "emitDeclarationOnly": true, - /* Bundler mode */ - "moduleResolution": "bundler", - // "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - // "noEmit": true, - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "outDir": "types" - }, - "include": ["src/*"] -} diff --git a/packages/reactivity/tsup.config.ts b/packages/reactivity/tsup.config.ts deleted file mode 100644 index aaf7a65..0000000 --- a/packages/reactivity/tsup.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: ["src/index.ts"], - target: "esnext", - format: ["esm", "cjs"], - splitting: false, - sourcemap: true, - minify: true, - clean: true, -}); From 971535c134cbb8ac8073178dbf68650adea73021 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sat, 18 Jan 2025 23:31:29 +0000 Subject: [PATCH 03/35] feat: add basic autocomplete flow --- packages/commands/package.json | 1 - packages/core/package.json | 1 - packages/create-solid/package.json | 1 + packages/create-solid/src/create-vanilla.ts | 8 +++- packages/create-solid/src/helpers.ts | 44 ++++++++++++++++++++- packages/create-solid/src/index.ts | 24 +++++++++-- packages/ui/package.json | 1 - packages/utils/package.json | 1 - pnpm-lock.yaml | 24 ++--------- 9 files changed, 74 insertions(+), 31 deletions(-) diff --git a/packages/commands/package.json b/packages/commands/package.json index 916076c..16b5e2a 100644 --- a/packages/commands/package.json +++ b/packages/commands/package.json @@ -44,7 +44,6 @@ "dependencies": { "@begit/core": "^0.0.19", "@clack/prompts": "0.7.0", - "@solid-cli/reactivity": "workspace:*", "@solid-cli/ui": "workspace:*", "@solid-cli/utils": "workspace:*", "execa": "^8.0.1", diff --git a/packages/core/package.json b/packages/core/package.json index e961d0c..6bc3f13 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -25,7 +25,6 @@ "@clack/core": "0.3.4", "@clack/prompts": "0.7.0", "@solid-cli/commands": "workspace:*", - "@solid-cli/reactivity": "workspace:*", "@solid-cli/ui": "workspace:*", "@solid-cli/utils": "workspace:*", "cmd-ts": "^0.13.0", diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index ee06004..0642c24 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -31,6 +31,7 @@ "devDependencies": { "@clack/prompts": "0.7.0", "@solid-cli/commands": "workspace:*", + "@solid-cli/ui": "workspace:*", "@types/node": "^22.9.0", "cmd-ts": "^0.13.0", "jiti": "^2.4.0", diff --git a/packages/create-solid/src/create-vanilla.ts b/packages/create-solid/src/create-vanilla.ts index 728da6e..9dcf82d 100644 --- a/packages/create-solid/src/create-vanilla.ts +++ b/packages/create-solid/src/create-vanilla.ts @@ -3,13 +3,17 @@ import { join } from "node:path"; import { GIT_IGNORE, handleTSConversion } from "./helpers"; import { writeFileSync } from "node:fs"; -const VANILLA_TEMPLATES = ["ts"] as const; -type VanillaTemplate = (typeof VANILLA_TEMPLATES)[number]; type CreateVanillaArgs = { template: VanillaTemplate, destination: string, } +export const createVanilla = (args: CreateVanillaArgs, js?: boolean) => { + if (js) { + return createVanillaJS(args); + } + return createVanillaTS(args); +} export const createVanillaTS = async ({ template, destination }: CreateVanillaArgs) => { return await downloadRepo({ repo: { owner: "solidjs", name: "templates", subdir: template }, dest: destination }); } diff --git a/packages/create-solid/src/helpers.ts b/packages/create-solid/src/helpers.ts index 67203a5..4b48011 100644 --- a/packages/create-solid/src/helpers.ts +++ b/packages/create-solid/src/helpers.ts @@ -94,4 +94,46 @@ gitignore # System Files .DS_Store Thumbs.db -`; \ No newline at end of file +`; + +import { log, spinner } from "@clack/prompts"; +type SpinnerItem = { + startText: string; + finishText: string; + fn: () => Promise; +}; +export async function spinnerify(spinners: SpinnerItem): Promise; +export async function spinnerify(spinners: SpinnerItem[]): Promise; +export async function spinnerify(spinners: SpinnerItem[] | SpinnerItem) { + if (!Array.isArray(spinners)) spinners = [spinners]; + let results: any[] = []; + const s = spinner(); + for (const { startText, finishText, fn } of spinners) { + s.start(startText); + results.push(await fn()); + s.stop(finishText); + } + return results.length === 1 ? results[0] : results; +} + +export const cancelable = async (prompt: Promise, cancelMessage: string = "Canceled"): Promise => { + const value = await prompt; + + if (typeof value === "symbol") { + log.warn(cancelMessage); + process.exit(0); + } + + return value; +}; +const VANILLA_TEMPLATES = ["ts"] as const; +type VanillaTemplate = (typeof VANILLA_TEMPLATES)[number]; + +const START_TEMPLATES = ["basic"] as const; +type StartTemplate = (typeof VANILLA_TEMPLATES)[number]; +export const getTemplatesList = async (isStart: boolean) => { + if (isStart) { + return START_TEMPLATES; + } + return VANILLA_TEMPLATES; +} \ No newline at end of file diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index 7d63a21..8bb76bb 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -4,7 +4,8 @@ import { intro } from "@clack/prompts"; import packageJson from "../package.json" with { type: "json" }; import { defineCommand, runMain } from "citty"; import { createVanillaJS } from "./create-vanilla"; - +import * as p from "@clack/prompts"; +import { cancelable, getTemplatesList } from "./helpers"; intro(`\n${color.bgCyan(color.black(` Create-Solid v${packageJson.version}`))}`); const main = defineCommand({ @@ -36,8 +37,25 @@ const main = defineCommand({ description: "Create a SolidStart project", }, }, - run({ args: { projectNamePositional, templatePositional, "project-name": projectNameOptional, solidstart } }) { - createVanillaJS({ template: "ts", destination: "./ts" }) + async run({ args: { projectNamePositional, templatePositional, "project-name": projectNameOptional, solidstart } }) { + let projectName: string = projectNamePositional ?? projectNameOptional; + let template: string = templatePositional; + let isStart: boolean = solidstart; + let isJS = false; + projectName ??= await cancelable( + p.text({ message: "Project Name", placeholder: "solid-project", defaultValue: "solid-project" }), + ); + isStart ??= await cancelable(p.confirm({ message: "Is this a SolidStart project?" })); + const template_opts = await getTemplatesList(isStart); + template ??= (await cancelable( + p.select({ + message: "Which template would you like to use?", + initialValue: "ts", + options: template_opts.map((s: string) => ({ label: s, value: s })), + }), + )); + isJS = !(await cancelable(p.confirm({ message: "Use Typescript?" }))) + // createVanillaJS({ template: "ts", destination: "./ts" }) } }) runMain(main); diff --git a/packages/ui/package.json b/packages/ui/package.json index 39b8a9a..68d933d 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -38,7 +38,6 @@ "@clack/core": "0.3.4", "@clack/prompts": "0.7.0", "picocolors": "^1.1.1", - "@solid-cli/reactivity": "workspace:*", "@solid-cli/utils": "workspace:*" } } diff --git a/packages/utils/package.json b/packages/utils/package.json index 95e521f..eefd3f6 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -76,7 +76,6 @@ "dependencies": { "@clack/core": "0.3.4", "@clack/prompts": "0.7.0", - "@solid-cli/reactivity": "workspace:*", "cmd-ts": "^0.13.0", "execa": "^8.0.1", "picocolors": "^1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7f6594c..635f91b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,9 +32,6 @@ importers: '@clack/prompts': specifier: 0.7.0 version: 0.7.0 - '@solid-cli/reactivity': - specifier: workspace:* - version: link:../reactivity '@solid-cli/ui': specifier: workspace:* version: link:../ui @@ -78,9 +75,6 @@ importers: '@solid-cli/commands': specifier: workspace:* version: link:../commands - '@solid-cli/reactivity': - specifier: workspace:* - version: link:../reactivity '@solid-cli/ui': specifier: workspace:* version: link:../ui @@ -137,6 +131,9 @@ importers: '@solid-cli/commands': specifier: workspace:* version: link:../commands + '@solid-cli/ui': + specifier: workspace:* + version: link:../ui '@types/node': specifier: ^22.9.0 version: 22.9.0 @@ -156,15 +153,6 @@ importers: specifier: ^5.6.3 version: 5.6.3 - packages/reactivity: - devDependencies: - tsup: - specifier: ^8.3.5 - version: 8.3.5(@swc/core@1.5.5)(jiti@2.4.0)(postcss@8.4.38)(typescript@5.6.3) - typescript: - specifier: ^5.6.3 - version: 5.6.3 - packages/ui: dependencies: '@clack/core': @@ -173,9 +161,6 @@ importers: '@clack/prompts': specifier: 0.7.0 version: 0.7.0 - '@solid-cli/reactivity': - specifier: workspace:* - version: link:../reactivity '@solid-cli/utils': specifier: workspace:* version: link:../utils @@ -201,9 +186,6 @@ importers: '@clack/prompts': specifier: 0.7.0 version: 0.7.0 - '@solid-cli/reactivity': - specifier: workspace:* - version: link:../reactivity cmd-ts: specifier: ^0.13.0 version: 0.13.0 From c3ffbbd345c90b2846e3001ae840529546404bf6 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sat, 18 Jan 2025 23:36:37 +0000 Subject: [PATCH 04/35] feat: pass input from interactive prompts to vanilla creation functions --- packages/create-solid/src/create-start.ts | 11 +++++++++++ packages/create-solid/src/create-vanilla.ts | 2 +- packages/create-solid/src/helpers.ts | 4 ++-- packages/create-solid/src/index.ts | 11 ++++++++--- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/packages/create-solid/src/create-start.ts b/packages/create-solid/src/create-start.ts index e69de29..ac51e25 100644 --- a/packages/create-solid/src/create-start.ts +++ b/packages/create-solid/src/create-start.ts @@ -0,0 +1,11 @@ +export const createStartTS = () => { + +} + +export const createStartJS = () => { + +} + +export const createStart = () => { + +} \ No newline at end of file diff --git a/packages/create-solid/src/create-vanilla.ts b/packages/create-solid/src/create-vanilla.ts index 9dcf82d..4f08980 100644 --- a/packages/create-solid/src/create-vanilla.ts +++ b/packages/create-solid/src/create-vanilla.ts @@ -1,6 +1,6 @@ import { downloadRepo } from "@begit/core"; import { join } from "node:path"; -import { GIT_IGNORE, handleTSConversion } from "./helpers"; +import { GIT_IGNORE, handleTSConversion, VanillaTemplate } from "./helpers"; import { writeFileSync } from "node:fs"; diff --git a/packages/create-solid/src/helpers.ts b/packages/create-solid/src/helpers.ts index 4b48011..59acde1 100644 --- a/packages/create-solid/src/helpers.ts +++ b/packages/create-solid/src/helpers.ts @@ -127,9 +127,9 @@ export const cancelable = async (prompt: Promise, cance return value; }; const VANILLA_TEMPLATES = ["ts"] as const; -type VanillaTemplate = (typeof VANILLA_TEMPLATES)[number]; +export type VanillaTemplate = (typeof VANILLA_TEMPLATES)[number]; -const START_TEMPLATES = ["basic"] as const; +export const START_TEMPLATES = ["basic"] as const; type StartTemplate = (typeof VANILLA_TEMPLATES)[number]; export const getTemplatesList = async (isStart: boolean) => { if (isStart) { diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index 8bb76bb..02834f2 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -3,9 +3,9 @@ import color from "picocolors"; import { intro } from "@clack/prompts"; import packageJson from "../package.json" with { type: "json" }; import { defineCommand, runMain } from "citty"; -import { createVanillaJS } from "./create-vanilla"; +import { createVanilla, createVanillaJS } from "./create-vanilla"; import * as p from "@clack/prompts"; -import { cancelable, getTemplatesList } from "./helpers"; +import { cancelable, getTemplatesList, VanillaTemplate } from "./helpers"; intro(`\n${color.bgCyan(color.black(` Create-Solid v${packageJson.version}`))}`); const main = defineCommand({ @@ -55,7 +55,12 @@ const main = defineCommand({ }), )); isJS = !(await cancelable(p.confirm({ message: "Use Typescript?" }))) - // createVanillaJS({ template: "ts", destination: "./ts" }) + + if (isStart) { + + } else { + createVanilla({ template: template as VanillaTemplate, destination: projectName }, isJS); + } } }) runMain(main); From c42e2a085a7df8098c06a268dce541944ba0010b Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sat, 18 Jan 2025 23:43:27 +0000 Subject: [PATCH 05/35] feat: allow creating SolidStart projects --- packages/create-solid/src/create-start.ts | 30 ++++++++++++++++++++--- packages/create-solid/src/helpers.ts | 4 +-- packages/create-solid/src/index.ts | 5 ++-- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/packages/create-solid/src/create-start.ts b/packages/create-solid/src/create-start.ts index ac51e25..78f655e 100644 --- a/packages/create-solid/src/create-start.ts +++ b/packages/create-solid/src/create-start.ts @@ -1,11 +1,33 @@ -export const createStartTS = () => { +import { downloadRepo } from "@begit/core"; +import { GIT_IGNORE, handleTSConversion, StartTemplate } from "./helpers" +import { join } from "path"; +import { writeFileSync } from "fs"; +type CreateStartArgs = { + template: StartTemplate, + destination: string, } -export const createStartJS = () => { - +export const createStartTS = ({ template, destination }: CreateStartArgs) => { + return downloadRepo({ + repo: { owner: "solidjs", name: "solid-start", subdir: `examples/${template}` }, + dest: destination, + }); } -export const createStart = () => { +export const createStartJS = async ({ template, destination }: CreateStartArgs) => { + // Create typescript project in `/.project` + // then transpile this to javascript and clean up + const tempDir = join(destination, ".project"); + await createStartTS({ template, destination: tempDir }) + await handleTSConversion(tempDir, destination); + // Add .gitignore + writeFileSync(join(destination, ".gitignore"), GIT_IGNORE); +} +export const createStart = (args: CreateStartArgs, js?: boolean) => { + if (js) { + return createStartJS(args); + } + return createStartTS(args); } \ No newline at end of file diff --git a/packages/create-solid/src/helpers.ts b/packages/create-solid/src/helpers.ts index 59acde1..3da7840 100644 --- a/packages/create-solid/src/helpers.ts +++ b/packages/create-solid/src/helpers.ts @@ -129,8 +129,8 @@ export const cancelable = async (prompt: Promise, cance const VANILLA_TEMPLATES = ["ts"] as const; export type VanillaTemplate = (typeof VANILLA_TEMPLATES)[number]; -export const START_TEMPLATES = ["basic"] as const; -type StartTemplate = (typeof VANILLA_TEMPLATES)[number]; +const START_TEMPLATES = ["basic"] as const; +export type StartTemplate = (typeof VANILLA_TEMPLATES)[number]; export const getTemplatesList = async (isStart: boolean) => { if (isStart) { return START_TEMPLATES; diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index 02834f2..4ed2a5a 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -5,7 +5,8 @@ import packageJson from "../package.json" with { type: "json" }; import { defineCommand, runMain } from "citty"; import { createVanilla, createVanillaJS } from "./create-vanilla"; import * as p from "@clack/prompts"; -import { cancelable, getTemplatesList, VanillaTemplate } from "./helpers"; +import { cancelable, getTemplatesList, StartTemplate, VanillaTemplate } from "./helpers"; +import { createStart } from "./create-start"; intro(`\n${color.bgCyan(color.black(` Create-Solid v${packageJson.version}`))}`); const main = defineCommand({ @@ -57,7 +58,7 @@ const main = defineCommand({ isJS = !(await cancelable(p.confirm({ message: "Use Typescript?" }))) if (isStart) { - + createVanilla({ template: template as StartTemplate, destination: projectName }, isJS); } else { createVanilla({ template: template as VanillaTemplate, destination: projectName }, isJS); } From 3533539b803871ee5f43598bca2abac493de6386 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 00:19:23 +0000 Subject: [PATCH 06/35] refactor: reorganise helper functions --- packages/create-solid/package.json | 10 +-- packages/create-solid/src/create-start.ts | 6 +- packages/create-solid/src/create-vanilla.ts | 5 +- packages/create-solid/src/create.ts | 13 ++++ packages/create-solid/src/helpers.ts | 67 ------------------- packages/create-solid/src/index.ts | 15 ++++- .../create-solid/src/utils/file-system.ts | 18 +++++ .../create-solid/src/utils/ts-conversion.ts | 53 +++++++++++++++ packages/create-solid/tsup.config.ts | 3 +- pnpm-lock.yaml | 60 +++++++++++++---- 10 files changed, 156 insertions(+), 94 deletions(-) create mode 100644 packages/create-solid/src/create.ts create mode 100644 packages/create-solid/src/utils/file-system.ts create mode 100644 packages/create-solid/src/utils/ts-conversion.ts diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index 0642c24..f31fb09 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -29,7 +29,7 @@ "build": "tsc && tsup" }, "devDependencies": { - "@clack/prompts": "0.7.0", + "@clack/prompts": "0.9.1", "@solid-cli/commands": "workspace:*", "@solid-cli/ui": "workspace:*", "@types/node": "^22.9.0", @@ -37,14 +37,14 @@ "jiti": "^2.4.0", "picocolors": "^1.1.1", "tsup": "^8.3.5", - "typescript": "^5.6.3" + "typescript": "^5.6.3", + "@begit/core": "^0.1.1", + "citty": "^0.1.6", + "sucrase": "^3.35.0" }, "publishConfig": { "access": "public" }, "dependencies": { - "@begit/core": "^0.0.19", - "citty": "^0.1.6", - "sucrase": "^3.35.0" } } diff --git a/packages/create-solid/src/create-start.ts b/packages/create-solid/src/create-start.ts index 78f655e..e41c2a8 100644 --- a/packages/create-solid/src/create-start.ts +++ b/packages/create-solid/src/create-start.ts @@ -1,9 +1,9 @@ import { downloadRepo } from "@begit/core"; -import { GIT_IGNORE, handleTSConversion, StartTemplate } from "./helpers" +import { GIT_IGNORE, StartTemplate } from "./helpers" import { join } from "path"; import { writeFileSync } from "fs"; - -type CreateStartArgs = { +import { handleTSConversion } from "./utils/ts-conversion" +export type CreateStartArgs = { template: StartTemplate, destination: string, } diff --git a/packages/create-solid/src/create-vanilla.ts b/packages/create-solid/src/create-vanilla.ts index 4f08980..394ba41 100644 --- a/packages/create-solid/src/create-vanilla.ts +++ b/packages/create-solid/src/create-vanilla.ts @@ -1,10 +1,11 @@ import { downloadRepo } from "@begit/core"; import { join } from "node:path"; -import { GIT_IGNORE, handleTSConversion, VanillaTemplate } from "./helpers"; +import { GIT_IGNORE, VanillaTemplate } from "./helpers"; import { writeFileSync } from "node:fs"; +import { handleTSConversion } from "./utils/ts-conversion"; -type CreateVanillaArgs = { +export type CreateVanillaArgs = { template: VanillaTemplate, destination: string, } diff --git a/packages/create-solid/src/create.ts b/packages/create-solid/src/create.ts new file mode 100644 index 0000000..49bbd4b --- /dev/null +++ b/packages/create-solid/src/create.ts @@ -0,0 +1,13 @@ +import { createStart, CreateStartArgs } from "./create-start"; +import { createVanilla, CreateVanillaArgs } from "./create-vanilla"; + +export async function create(args: CreateVanillaArgs, js: boolean, isStart: false): Promise; +export async function create(args: CreateStartArgs, js: boolean, isStart: true): Promise; +export async function create(args: CreateVanillaArgs | CreateStartArgs, js: boolean, isStart: boolean) { + if (isStart) { + return createStart(args, js); + } + else { + return createVanilla(args, js); + } +} \ No newline at end of file diff --git a/packages/create-solid/src/helpers.ts b/packages/create-solid/src/helpers.ts index 3da7840..f53899a 100644 --- a/packages/create-solid/src/helpers.ts +++ b/packages/create-solid/src/helpers.ts @@ -1,70 +1,3 @@ -import { copyFileSync, Dirent, mkdirSync, readdirSync, writeFileSync } from "node:fs"; -import { readFile, rm } from "node:fs/promises"; -import { join, resolve } from "node:path"; -import { transform } from "sucrase"; - -const recurseFiles = (startPath: string, cb: (file: Dirent, startPath: string) => void) => { - startPath = resolve(startPath); - - const files = readdirSync(startPath, { withFileTypes: true }); - - for (const file of files) { - cb(file, startPath); - } -}; - -export const readFileToString = async (path: string) => { - return (await readFile(path)).toString(); -}; -const convertToJS = async (file: Dirent, startPath: string) => { - const src = join(startPath, file.name); - const dest = resolve(startPath.replace(".solid-start", ""), file.name); - if (file.isDirectory()) { - mkdirSync(dest, { recursive: true }); - recurseFiles(resolve(startPath, file.name), convertToJS); - } else if (file.isFile()) { - if (src.endsWith(".ts") || src.endsWith(".tsx")) { - let { code } = transform(await readFileToString(src), { - transforms: ["typescript", "jsx"], - jsxRuntime: "preserve", - }); - - writeFileSync(dest.replace(".ts", ".js"), code, { flag: "wx" }); - } else { - copyFileSync(src, dest); - } - } -}; -export const handleTSConversion = async (tempDir: string, projectName: string) => { - await rm(resolve(tempDir, "tsconfig.json")); - writeFileSync( - resolve(projectName, "jsconfig.json"), - JSON.stringify( - { - compilerOptions: { - jsx: "preserve", - jsxImportSource: "solid-js", - paths: { - "~/*": ["./src/*"], - }, - }, - }, - null, - 2, - ), - { flag: "wx" }, - ); - - // Convert all ts files in temp directory into js - recurseFiles(tempDir, convertToJS); - - // Remove temp directory - await rm(join(process.cwd(), tempDir), { - recursive: true, - force: true, - }); -}; - export const GIT_IGNORE = ` dist .solid diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index 4ed2a5a..c340ee7 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -5,8 +5,9 @@ import packageJson from "../package.json" with { type: "json" }; import { defineCommand, runMain } from "citty"; import { createVanilla, createVanillaJS } from "./create-vanilla"; import * as p from "@clack/prompts"; -import { cancelable, getTemplatesList, StartTemplate, VanillaTemplate } from "./helpers"; +import { cancelable, getTemplatesList, spinnerify, StartTemplate, VanillaTemplate } from "./helpers"; import { createStart } from "./create-start"; +import { create } from "./create"; intro(`\n${color.bgCyan(color.black(` Create-Solid v${packageJson.version}`))}`); const main = defineCommand({ @@ -58,9 +59,17 @@ const main = defineCommand({ isJS = !(await cancelable(p.confirm({ message: "Use Typescript?" }))) if (isStart) { - createVanilla({ template: template as StartTemplate, destination: projectName }, isJS); + await spinnerify({ + startText: "Creating project", + finishText: "Project created 🎉", + fn: () => createStart({ template: template as StartTemplate, destination: projectName }, isJS), + }) } else { - createVanilla({ template: template as VanillaTemplate, destination: projectName }, isJS); + await spinnerify({ + startText: "Creating project", + finishText: "Project created 🎉", + fn: () => createVanilla({ template: template as VanillaTemplate, destination: projectName }, isJS), + }) } } }) diff --git a/packages/create-solid/src/utils/file-system.ts b/packages/create-solid/src/utils/file-system.ts new file mode 100644 index 0000000..0dd4c68 --- /dev/null +++ b/packages/create-solid/src/utils/file-system.ts @@ -0,0 +1,18 @@ +import { copyFileSync, Dirent, mkdirSync, readdirSync, writeFileSync } from "node:fs"; +import { readFile, rm } from "node:fs/promises"; +import { join, resolve } from "node:path"; +import { transform } from "sucrase"; + +export const recurseFiles = (startPath: string, cb: (file: Dirent, startPath: string) => void) => { + startPath = resolve(startPath); + + const files = readdirSync(startPath, { withFileTypes: true }); + + for (const file of files) { + cb(file, startPath); + } +}; + +export const readFileToString = async (path: string) => { + return (await readFile(path)).toString(); +}; \ No newline at end of file diff --git a/packages/create-solid/src/utils/ts-conversion.ts b/packages/create-solid/src/utils/ts-conversion.ts new file mode 100644 index 0000000..dc5a711 --- /dev/null +++ b/packages/create-solid/src/utils/ts-conversion.ts @@ -0,0 +1,53 @@ +import { copyFileSync, Dirent, mkdirSync, writeFileSync } from "node:fs"; +import { readFileToString, recurseFiles } from "./file-system" +import { join, resolve } from "node:path"; +import { transform } from "sucrase"; +import { rm } from "node:fs/promises"; +const convertToJS = async (file: Dirent, startPath: string) => { + const src = join(startPath, file.name); + const dest = resolve(startPath.replace(".solid-start", ""), file.name); + if (file.isDirectory()) { + mkdirSync(dest, { recursive: true }); + recurseFiles(resolve(startPath, file.name), convertToJS); + } else if (file.isFile()) { + if (src.endsWith(".ts") || src.endsWith(".tsx")) { + let { code } = transform(await readFileToString(src), { + transforms: ["typescript", "jsx"], + jsxRuntime: "preserve", + }); + + writeFileSync(dest.replace(".ts", ".js"), code, { flag: "wx" }); + } else { + copyFileSync(src, dest); + } + } +}; +export const handleTSConversion = async (tempDir: string, projectName: string) => { + await rm(resolve(tempDir, "tsconfig.json")); + writeFileSync( + resolve(projectName, "jsconfig.json"), + JSON.stringify( + { + compilerOptions: { + jsx: "preserve", + jsxImportSource: "solid-js", + paths: { + "~/*": ["./src/*"], + }, + }, + }, + null, + 2, + ), + { flag: "wx" }, + ); + + // Convert all ts files in temp directory into js + recurseFiles(tempDir, convertToJS); + + // Remove temp directory + await rm(join(process.cwd(), tempDir), { + recursive: true, + force: true, + }); +}; \ No newline at end of file diff --git a/packages/create-solid/tsup.config.ts b/packages/create-solid/tsup.config.ts index e0ff30c..831d65f 100644 --- a/packages/create-solid/tsup.config.ts +++ b/packages/create-solid/tsup.config.ts @@ -4,11 +4,10 @@ export default defineConfig({ entry: ["src/index.ts"], target: "esnext", format: "esm", - splitting: false, + splitting: true, bundle: true, sourcemap: false, clean: true, - noExternal: ["@solid-cli/commands"], treeshake: true, minify: true, banner: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 635f91b..faaaaf3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -114,20 +114,13 @@ importers: version: 5.6.3 packages/create-solid: - dependencies: - '@begit/core': - specifier: ^0.0.19 - version: 0.0.19 - citty: - specifier: ^0.1.6 - version: 0.1.6 - sucrase: - specifier: ^3.35.0 - version: 3.35.0 devDependencies: + '@begit/core': + specifier: ^0.1.1 + version: 0.1.1 '@clack/prompts': - specifier: 0.7.0 - version: 0.7.0 + specifier: 0.9.1 + version: 0.9.1 '@solid-cli/commands': specifier: workspace:* version: link:../commands @@ -137,6 +130,9 @@ importers: '@types/node': specifier: ^22.9.0 version: 22.9.0 + citty: + specifier: ^0.1.6 + version: 0.1.6 cmd-ts: specifier: ^0.13.0 version: 0.13.0 @@ -146,6 +142,9 @@ importers: picocolors: specifier: ^1.1.1 version: 1.1.1 + sucrase: + specifier: ^3.35.0 + version: 3.35.0 tsup: specifier: ^8.3.5 version: 8.3.5(@swc/core@1.5.5)(jiti@2.4.0)(postcss@8.4.38)(typescript@5.6.3) @@ -247,6 +246,9 @@ packages: '@begit/core@0.0.19': resolution: {integrity: sha512-3ypq3vJQ+PzYVi53HRkAtwdtVXTjyXjo1UzTkD75Qr9YIoacYsSy9gAdbwktfNKgTLyc1nU83W1D3SEw9kgBBA==} + '@begit/core@0.1.1': + resolution: {integrity: sha512-uxooRorqP8Xv20jf/X+nhkbDIiEodl/oXwep5gNat7ccQnlu6oG/PxepcsOyvwonL9x0ZDEmP46fC5Uhu2fivA==} + '@changesets/apply-release-plan@7.0.5': resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} @@ -324,11 +326,17 @@ packages: '@clack/core@0.3.4': resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} + '@clack/core@0.4.1': + resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==} + '@clack/prompts@0.7.0': resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} bundledDependencies: - is-unicode-supported + '@clack/prompts@0.9.1': + resolution: {integrity: sha512-JIpyaboYZeWYlyP0H+OoPPxd6nqueG/CmN6ixBiNFsIDHREevjIf0n0Ohh5gr5C8pEDknzgvz+pIJ8dMhzWIeg==} + '@esbuild/aix-ppc64@0.20.2': resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} @@ -1734,6 +1742,10 @@ packages: resolution: {integrity: sha512-XQs0S8fuAkQWuqhDeCdMlJXDX80D7EOVLDPVFkna9yQfzS+PHKgfxcei0jf6/+QAWcjqrnC8uM3fSAnrQl+XYg==} engines: {node: '>=18'} + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -1990,6 +2002,10 @@ snapshots: dependencies: tar: 7.4.0 + '@begit/core@0.1.1': + dependencies: + tar: 7.4.3 + '@changesets/apply-release-plan@7.0.5': dependencies: '@changesets/config': 3.0.3 @@ -2159,12 +2175,23 @@ snapshots: picocolors: 1.1.1 sisteransi: 1.0.5 + '@clack/core@0.4.1': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + '@clack/prompts@0.7.0': dependencies: '@clack/core': 0.3.3 picocolors: 1.1.1 sisteransi: 1.0.5 + '@clack/prompts@0.9.1': + dependencies: + '@clack/core': 0.4.1 + picocolors: 1.1.1 + sisteransi: 1.0.5 + '@esbuild/aix-ppc64@0.20.2': optional: true @@ -3333,6 +3360,15 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.0 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 + term-size@2.2.1: {} thenify-all@1.6.0: From 11c7ff690cdec7ee07ad67787e4263e11e6a1fe0 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 00:29:10 +0000 Subject: [PATCH 07/35] remove unused packages refactor create-solid code --- packages/commands/.gitignore | 1 - packages/commands/package.json | 53 ---- packages/commands/src/handlers/add.ts | 222 ---------------- packages/commands/src/handlers/new.ts | 246 ------------------ .../commands/src/handlers/start/adapter.ts | 43 --- packages/commands/src/handlers/start/api.ts | 41 --- packages/commands/src/handlers/start/data.ts | 39 --- packages/commands/src/handlers/start/index.ts | 5 - packages/commands/src/handlers/start/mode.ts | 39 --- packages/commands/src/handlers/start/route.ts | 40 --- packages/commands/src/index.ts | 3 - packages/commands/src/lib/integrations.ts | 221 ---------------- packages/commands/src/lib/utils/helpers.ts | 152 ----------- .../tests/assets/sample_app_config.txt | 7 - .../tests/assets/sample_unocss_app_result.txt | 11 - .../assets/sample_unocss_vite_result.txt | 9 - .../tests/assets/sample_vite_config.txt | 5 - .../tests/config_manipulation.test.ts | 93 ------- .../commands/tests/package_installs.test.ts | 7 - packages/commands/tsconfig.json | 20 -- packages/commands/tsup.config.ts | 13 - packages/core/.gitignore | 133 ---------- packages/core/README.md | 48 ---- packages/core/package.json | 50 ---- packages/core/src/commands/index.ts | 114 -------- packages/core/src/commands/start.ts | 97 ------- packages/core/src/index.ts | 117 --------- packages/core/src/plugins/plugins_entry.ts | 28 -- packages/core/tsconfig.json | 14 - packages/core/tsup.config.ts | 13 - packages/create-solid/src/create-start.ts | 2 +- packages/create-solid/src/create-vanilla.ts | 2 +- packages/create-solid/src/index.ts | 3 +- packages/create-solid/src/utils/constants.ts | 57 ++++ .../create-solid/src/utils/ts-conversion.ts | 11 +- .../src/{helpers.ts => utils/ui.ts} | 42 --- 36 files changed, 63 insertions(+), 1938 deletions(-) delete mode 100644 packages/commands/.gitignore delete mode 100644 packages/commands/package.json delete mode 100644 packages/commands/src/handlers/add.ts delete mode 100644 packages/commands/src/handlers/new.ts delete mode 100644 packages/commands/src/handlers/start/adapter.ts delete mode 100644 packages/commands/src/handlers/start/api.ts delete mode 100644 packages/commands/src/handlers/start/data.ts delete mode 100644 packages/commands/src/handlers/start/index.ts delete mode 100644 packages/commands/src/handlers/start/mode.ts delete mode 100644 packages/commands/src/handlers/start/route.ts delete mode 100644 packages/commands/src/index.ts delete mode 100644 packages/commands/src/lib/integrations.ts delete mode 100644 packages/commands/src/lib/utils/helpers.ts delete mode 100644 packages/commands/tests/assets/sample_app_config.txt delete mode 100644 packages/commands/tests/assets/sample_unocss_app_result.txt delete mode 100644 packages/commands/tests/assets/sample_unocss_vite_result.txt delete mode 100644 packages/commands/tests/assets/sample_vite_config.txt delete mode 100644 packages/commands/tests/config_manipulation.test.ts delete mode 100644 packages/commands/tests/package_installs.test.ts delete mode 100644 packages/commands/tsconfig.json delete mode 100644 packages/commands/tsup.config.ts delete mode 100644 packages/core/.gitignore delete mode 100644 packages/core/README.md delete mode 100644 packages/core/package.json delete mode 100644 packages/core/src/commands/index.ts delete mode 100644 packages/core/src/commands/start.ts delete mode 100644 packages/core/src/index.ts delete mode 100644 packages/core/src/plugins/plugins_entry.ts delete mode 100644 packages/core/tsconfig.json delete mode 100644 packages/core/tsup.config.ts create mode 100644 packages/create-solid/src/utils/constants.ts rename packages/create-solid/src/{helpers.ts => utils/ui.ts} (60%) diff --git a/packages/commands/.gitignore b/packages/commands/.gitignore deleted file mode 100644 index fbf0622..0000000 --- a/packages/commands/.gitignore +++ /dev/null @@ -1 +0,0 @@ -types \ No newline at end of file diff --git a/packages/commands/package.json b/packages/commands/package.json deleted file mode 100644 index 16b5e2a..0000000 --- a/packages/commands/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "@solid-cli/commands", - "version": "0.0.24", - "description": "The main command handlers for the Solid CLI", - "license": "MIT", - "homepage": "https://solid-cli.netlify.app", - "repository": { - "type": "git", - "url": "https://github.com/solidjs-community/solid-cli" - }, - "files": [ - "dist", - "types" - ], - "main": "./dist/index.mjs", - "module": "./dist/index.mjs", - "types": "./types/index.d.ts", - "exports": { - ".": { - "import": "./dist/index.mjs", - "require": "./dist/index.mjs", - "types": "./types/index.d.ts" - }, - "./new": { - "import": "./dist/handlers/new.mjs", - "require": "./dist/handlers/new.mjs", - "types": "./types/handlers/new.d.ts" - } - }, - "scripts": { - "test": "vitest run", - "build": "tsc && tsup" - }, - "devDependencies": { - "@chialab/esbuild-plugin-meta-url": "^0.18.2", - "@types/node": "^22.9.0", - "prettier": "^3.3.3", - "tsup": "^8.3.5", - "typescript": "^5.6.3" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@begit/core": "^0.0.19", - "@clack/prompts": "0.7.0", - "@solid-cli/ui": "workspace:*", - "@solid-cli/utils": "workspace:*", - "execa": "^8.0.1", - "picocolors": "^1.1.1", - "sucrase": "^3.35.0" - } -} diff --git a/packages/commands/src/handlers/add.ts b/packages/commands/src/handlers/add.ts deleted file mode 100644 index 5c8a4e6..0000000 --- a/packages/commands/src/handlers/add.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { autocomplete } from "@solid-cli/ui"; -import { S_BAR, cancelable, spinnerify } from "@solid-cli/ui"; -import { Integrations, Supported, integrations, setRootFile } from "../lib/integrations"; -import * as p from "@clack/prompts"; -import color from "picocolors"; -import { primitives, loadPrimitives } from "@solid-cli/utils/primitives"; -import { isSolidStart, t } from "@solid-cli/utils"; -import { fileExists, getRootFile, getConfigFile, validateFilePath } from "../lib/utils/helpers"; -import { writeFile, readFile } from "@solid-cli/utils/fs"; -import { transformPlugins, type PluginOptions } from "@solid-cli/utils/transform"; -import { - UPDATESQUEUE, - clearQueue, - flushCommandUpdates, - flushFileUpdates, - flushPackageUpdates, - queueUpdate, - summarizeUpdates, -} from "@solid-cli/utils/updates"; - -const handleAutocompleteAdd = async () => { - const supportedIntegrations = (Object.keys(integrations) as Supported[]).map((value) => ({ label: value, value })); - const opts = () => [...supportedIntegrations, ...primitives()]; - - loadPrimitives().catch((e) => p.log.error(e)); - - const a = await cancelable( - autocomplete({ - message: t.ADD_PACKAGES, - options: opts, - }), - ); - - if (a.length === 0) { - p.log.warn(t.NOTHING_SELECTED); - return; - } - - const shouldInstall = await cancelable( - p.select({ - options: [ - { label: t.YES, value: true }, - { label: t.NO, value: false }, - { label: t.YES_FORCE, value: [true, "force"] }, - ], - message: `${t.CONFIRM_INSTALL(a.length)} \n${color.red(S_BAR)} \n${color.red(S_BAR)} ${ - " " + color.yellow(a.map((opt) => opt.label).join(" ")) + " " - } \n${color.red(S_BAR)} `, - }), - ); - - if (!shouldInstall) return; - - let forceTransform = false; - if (Array.isArray(shouldInstall) && shouldInstall[1] === "force") { - forceTransform = true; - } - const packages = a.map((opt) => opt.value as Supported); - - return { packages, forceTransform }; -}; -const isIntegration = (str: string) => { - if (Object.keys(integrations).includes(str)) return true; - return false; -}; -/** - * Transforms a list containing primitives, either by name or full package name, and returns the corresponding primitive objects - */ -const transformPrimitives = async (ps: string[]) => { - if (!ps.length) return []; - - if (!primitives().length) { - await spinnerify({ - startText: t.LOADING_PRIMITIVES, - finishText: t.PRIMITIVES_LOADED, - fn: loadPrimitives, - }); - } - - const mappedInput = ps.map((p) => p.replace("@solid-primitives/", "")); - - return primitives().filter((p) => mappedInput.includes(p.value.replace("@solid-primitives/", ""))); -}; - -type Configs = Integrations[keyof Integrations][]; - -export const handleAdd = async (packages?: string[], forceTransform: boolean = false) => { - if (!packages?.length) { - const autocompleted = await handleAutocompleteAdd(); - - if (!autocompleted) return; - - packages = autocompleted.packages; - forceTransform = autocompleted.forceTransform; - } - const possiblePrimitives: string[] = []; - const configs: Configs = packages - .map((n) => { - if (!n) return; - if (!isIntegration(n)) { - possiblePrimitives.push(n); - return; - } - const res = integrations[n as Supported]; - if (!res) { - p.log.error(t.NO_SUPPORT(n)); - return; - } - return res; - }) - .filter((p) => p) as Configs; - - const configType = (await isSolidStart()) ? "app" : "vite"; - - const configFile = await getConfigFile(configType); - - for (let i = 0; i < configs.length; i++) { - const config = configs[i]; - config.installs.forEach((p) => queueUpdate({ type: "package", name: p, dev: false })); - config.installsDev?.forEach((p) => queueUpdate({ type: "package", name: p, dev: true })); - } - // Queue primitives - for (const primitive of await transformPrimitives(possiblePrimitives)) { - queueUpdate({ type: "package", name: primitive.value, dev: false }); - } - - if (!configs.length) return; - const pluginOptions = configs.map((c) => c.pluginOptions).filter(Boolean) as PluginOptions[]; - if (pluginOptions.length) { - await spinnerify({ - startText: "Processing config", - finishText: "Config processed", - fn: async () => { - const code = await transformPlugins( - configs.map((c) => c.pluginOptions).filter(Boolean) as PluginOptions[], - { type: configType, name: configFile, contents: (await readFile(configFile)).toString() }, - forceTransform, - undefined, - ); - await writeFile(configFile, code); - }, - }); - } - - p.log.info("Preparing post install steps for integrations"); - - let projectRoot = await getRootFile(); - setRootFile(projectRoot); - - if (!fileExists(projectRoot)) { - p.log.error(color.red(`Can't find root file \`${projectRoot.split("/")[1]}\`.`)); - await cancelable( - p.text({ - message: `Type path to root: `, - validate(value) { - if (!value.length) return `Path can not be empty`; - const path = validateFilePath(value, ["app.tsx", "index.tsx"]); - if (!path) return `File at \`${value}\` not found. Please try again`; - else setRootFile(path); - }, - }), - ); - } - // Run our additional configs - await spinnerify({ - startText: "Running additional config steps", - finishText: "Additional config steps complete", - fn: async () => { - for (const cfg of configs) { - await cfg.additionalConfig?.(); - } - }, - }); - if (UPDATESQUEUE.length === 0) return; - - const { fileUpdates, packageUpdates, commandUpdates } = summarizeUpdates(); - - // Inspired by Qwik's CLI - if (fileUpdates.length) p.log.message([`${color.cyan("Modify")}`, ...fileUpdates.map((f) => ` - ${f}`)].join("\n")); - - if (packageUpdates.length) - p.log.message([`${color.cyan("Install")}`, ...packageUpdates.map((p) => ` - ${p.name}` + (p.dev ? " (dev)" : ""))].join("\n")); - if (commandUpdates.length) - p.log.message([`${color.cyan("Run commands")}`, ...commandUpdates.map((p) => ` - ${p}`)].join("\n")); - - const confirmed = await p.confirm({ message: "Do you wish to continue?" }); - if (!confirmed || p.isCancel(confirmed)) return; - - await spinnerify({ startText: "Writing files...", finishText: "Updates written", fn: flushFileUpdates }); - await spinnerify({ startText: "Installing packages...", finishText: "Packages installed", fn: flushPackageUpdates }); - await spinnerify({ startText: "Running setup commands", finishText: "Setup commands ran", fn: flushCommandUpdates }); - - clearQueue(); - - const postInstalls = configs.filter((c) => c.postInstall); - if (postInstalls.length === 0) return; - - p.log.message( - `${postInstalls.length} ${postInstalls.length === 1 ? "package has" : "packages have" - } post install steps that need to run.`, - ); - - const pInstallConfirmed = await p.confirm({ message: "Do you wish to continue?" }); - if (!pInstallConfirmed || p.isCancel(pInstallConfirmed)) return; - - p.log.info("Running post installs"); - // Run postInstalls - for (const cfg of configs) { - await cfg.postInstall?.(); - } - - p.log.success("Post install steps complete!"); - // await spinnerify({ - // startText: t.POST_INSTALL, - // finishText: t.POST_INSTALL_COMPLETE, - // fn: async () => { - // for (const cfg of configs) { - // await cfg.postInstall?.(); - // } - // }, - // }); -}; diff --git a/packages/commands/src/handlers/new.ts b/packages/commands/src/handlers/new.ts deleted file mode 100644 index ae03fe5..0000000 --- a/packages/commands/src/handlers/new.ts +++ /dev/null @@ -1,246 +0,0 @@ -import * as p from "@clack/prompts"; -import { openInBrowser } from "@solid-cli/utils"; -import { cancelable, spinnerify } from "@solid-cli/ui"; -import { t } from "@solid-cli/utils"; -import { insertAtEnd, readFileToString } from "@solid-cli/utils/fs"; -import { flushQueue } from "@solid-cli/utils/updates"; -import { rm } from "fs/promises"; -import { join, resolve } from "path"; -import { Dirent, copyFileSync, existsSync, mkdirSync, readdirSync, writeFileSync } from "fs"; -import { downloadRepo } from "@begit/core"; -import { transform } from "sucrase"; -import { detectPackageManager } from "@solid-cli/utils/package-manager"; -const gitIgnore = ` -dist -.solid -.output -.vercel -.netlify -.vinxi -app.config.timestamp_*.js - -# Environment -.env -.env*.local - -# dependencies -/node_modules - -# IDEs and editors -/.idea -.project -.classpath -*.launch -.settings/ - -# Temp -gitignore - -# System Files -.DS_Store -Thumbs.db -`; - -const startSupported = [ - "basic", - "bare", - "hackernews", - "notes", - "todomvc", - "with-auth", - "with-authjs", - "with-drizzle", - "with-mdx", - "with-prisma", - "with-solid-styled", - "with-tailwindcss", - "with-trpc", - "with-unocss", - "with-vitest", - "experiments", -] as const; -const localSupported = ["ts", "js"] as const; -const stackblitzSupported = ["bare"] as const; - -export type AllSupported = (typeof localSupported)[number] | (typeof stackblitzSupported)[number]; -export const isSupported = (template: string): template is AllSupported => { - return localSupported.indexOf(template as any) !== -1; -}; -const modifyReadme = async (name: string) => { - await insertAtEnd( - `${name}/README.md`, - "\n## This project was created with the [Solid CLI](https://solid-cli.netlify.app)\n", - ); - await flushQueue(); -}; - -const recurseFiles = (startPath: string, cb: (file: Dirent, startPath: string) => void) => { - startPath = resolve(startPath); - - const files = readdirSync(startPath, { withFileTypes: true }); - - for (const file of files) { - cb(file, startPath); - } -}; - -const convertToJS = async (file: Dirent, startPath: string) => { - const src = join(startPath, file.name); - const dest = resolve(startPath.replace(".solid-start", ""), file.name); - if (file.isDirectory()) { - mkdirSync(dest, { recursive: true }); - recurseFiles(resolve(startPath, file.name), convertToJS); - } else if (file.isFile()) { - if (src.endsWith(".ts") || src.endsWith(".tsx")) { - let { code } = transform(await readFileToString(src), { - transforms: ["typescript", "jsx"], - jsxRuntime: "preserve", - }); - - writeFileSync(dest.replace(".ts", ".js"), code, { flag: "wx" }); - } else { - copyFileSync(src, dest); - } - } -}; - -const handleTSConversion = async (tempDir: string, projectName: string) => { - await rm(resolve(tempDir, "tsconfig.json")); - writeFileSync( - resolve(projectName, "jsconfig.json"), - JSON.stringify( - { - compilerOptions: { - jsx: "preserve", - jsxImportSource: "solid-js", - paths: { - "~/*": ["./src/*"], - }, - }, - }, - null, - 2, - ), - { flag: "wx" }, - ); - - // Convert all ts files in temp directory into js - recurseFiles(tempDir, convertToJS); - - // Remove temp directory - await rm(join(process.cwd(), tempDir), { - recursive: true, - force: true, - }); -}; - -const handleNewStartProject = async (projectName: string, variation?: AllSupported) => { - const template = await cancelable( - p.select({ - message: t.NEW_START, - initialValue: "ts", - options: startSupported.map((s) => ({ label: s, value: s })), - maxItems: process.stdout.rows - 4, - }), - ); - - const withTs = variation ? variation !== "ts" : await cancelable(p.confirm({ message: "Use Typescript?" })); - - // If the user does not want ts, we create the project in a temp directory inside the project directory - const tempDir = withTs ? projectName : join(projectName, ".solid-start"); - const readmeAlreadyExists = existsSync(join(projectName, "README.md")); - await spinnerify({ - startText: t.CREATING_PROJECT, - finishText: t.PROJECT_CREATED, - fn: async () => { - await downloadRepo({ - repo: { owner: "solidjs", name: "solid-start", subdir: `examples/${template}` }, - dest: tempDir, - }); - }, - }); - - if (!withTs) await handleTSConversion(tempDir, projectName); - - // Add .gitignore - writeFileSync(join(projectName, ".gitignore"), gitIgnore); - if (!readmeAlreadyExists) await modifyReadme(projectName); - const pM = detectPackageManager(); - p.note( - `cd ${projectName} -${pM.name} install -${pM.name} ${pM.runScriptCommand("dev")}`, - t.GET_STARTED, - ); -}; - -const handleAutocompleteNew = async (name: string, isStart?: boolean) => { - isStart ??= await cancelable(p.confirm({ message: t.IS_START_PROJECT })); - - if (isStart) { - handleNewStartProject(name); - return; - } - - const template = (await cancelable( - p.select({ - message: t.TEMPLATE, - initialValue: "ts", - options: localSupported.map((s) => ({ label: s, value: s })), - }), - )) as unknown as AllSupported; - - await handleNew(template, name); -}; -export const handleNew = async ( - variation?: AllSupported, - name?: string, - stackblitz: boolean = false, - isStart?: boolean, -) => { - name ??= await cancelable( - p.text({ message: t.PROJECT_NAME, placeholder: "solid-project", defaultValue: "solid-project" }), - ); - - if (!variation) { - await handleAutocompleteNew(name, isStart); - return; - } - - if (stackblitz) { - await spinnerify({ - startText: t.OPENING_IN_BROWSER(variation), - finishText: t.OPENED_IN_BROWSER, - fn: () => openInBrowser(`https://solid.new/${variation}`), - }); - return; - } - - const withTs = variation.startsWith("ts") ? await cancelable(p.confirm({ message: "Use Typescript?" })) : false; - - // If the user does not want ts, we create the project in a temp directory inside the project directory - // If project is already JS don't bother transpiling - const tempDir = withTs || variation.startsWith("js") ? name : join(name, ".solid-start"); - const readmeAlreadyExists = existsSync(join(name, "README.md")); - - await spinnerify({ - startText: t.CREATING_PROJECT, - finishText: t.PROJECT_CREATED, - fn: async () => { - await downloadRepo({ repo: { owner: "solidjs", name: "templates", subdir: variation }, dest: tempDir }); - }, - }); - // Don't try to convert to ts if the template used is JS - if (!withTs && !variation.startsWith("js")) await handleTSConversion(tempDir, name); - - // Add .gitignore - writeFileSync(join(name, ".gitignore"), gitIgnore); - if (!readmeAlreadyExists) await modifyReadme(name ?? variation); - const pM = detectPackageManager(); - p.note( - `cd ${name} -${pM.name} install -${pM.name} ${pM.runScriptCommand("dev")}`, - t.GET_STARTED, - ); -}; diff --git a/packages/commands/src/handlers/start/adapter.ts b/packages/commands/src/handlers/start/adapter.ts deleted file mode 100644 index f2b6ef3..0000000 --- a/packages/commands/src/handlers/start/adapter.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { readFile, writeFile } from "@solid-cli/utils/fs"; -import { transformPlugins } from "@solid-cli/utils/transform"; -import * as p from "@clack/prompts"; -import { cancelable } from "@solid-cli/ui"; - -export const supportedAdapters = [ - "aws", - "cloudflare-pages", - "cloudflare-workers", - "deno", - "netlify", - "node", - "static", - "vercel", -] as const; - -type SupportedAdapters = (typeof supportedAdapters)[number]; - -const handleAutocompleteAdapter = async () => { - const name = (await cancelable( - p.select({ - message: "Select an adapter", - options: supportedAdapters.map((a) => ({ value: a, label: a })), - }), - )) as SupportedAdapters; - await handleAdapter(name, true); -}; - -export const handleAdapter = async (name?: string, forceTransform = false) => { - if (!name) { - await handleAutocompleteAdapter(); - return; - } - const sym = Symbol(name).toString(); - let code = await transformPlugins( - [], - { type: "app", name: "app.config.ts", contents: (await readFile("app.config.ts")).toString() }, - forceTransform, - ); - code = `import ${name} from "solid-start-${name}";\n` + code; - code = code.replace(`"${sym}"`, `${name}({})`); - await writeFile("app.config.ts", code); -}; diff --git a/packages/commands/src/handlers/start/api.ts b/packages/commands/src/handlers/start/api.ts deleted file mode 100644 index 79dd2bb..0000000 --- a/packages/commands/src/handlers/start/api.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { isSolidStart, createApi } from "@solid-cli/utils"; -import * as p from "@clack/prompts"; -import { cancelable, spinnerify } from "@solid-cli/ui"; - -const handleAutocompleteApi = async () => { - const path = await cancelable( - p.text({ - message: "Enter the path in which the api file will be created", - placeholder: "/user", - validate(value) { - if (!value.length) return "Path is required"; - }, - }), - ); - - const name = await cancelable( - p.text({ - message: "Enter the name for the api file (required)", - validate(value) { - if (!value.length) return "Name is required"; - }, - }), - ); - - await handleApi(path, name); -}; -export const handleApi = async (path?: string, name?: string) => { - if (!(await isSolidStart())) { - p.log.error("Cannot run command. Your project doesn't include solid-start"); - return; - } - if (!path) { - await handleAutocompleteApi(); - return; - } - await spinnerify({ - startText: "Creating new api file", - finishText: "Api file created", - fn: () => createApi(path, name), - }); -}; diff --git a/packages/commands/src/handlers/start/data.ts b/packages/commands/src/handlers/start/data.ts deleted file mode 100644 index 380bb1b..0000000 --- a/packages/commands/src/handlers/start/data.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { isSolidStart, createData } from "@solid-cli/utils"; -import * as p from "@clack/prompts"; -import { cancelable, spinnerify } from "@solid-cli/ui"; - -const handleAutocompleteData = async () => { - const path = await cancelable( - p.text({ - message: "Enter the path in which the data file will be created", - placeholder: "/user/login", - validate(value) { - if (!value.length) return "Path is required"; - }, - }), - ); - - const name = await cancelable( - p.text({ - message: "Enter the name for the data file (leave this blank for the default)", - }), - ); - - await handleData(path, name); -}; - -export const handleData = async (path?: string, name?: string) => { - if (!(await isSolidStart())) { - p.log.error("Cannot run command. Your project doesn't include solid-start"); - return; - } - if (!path) { - await handleAutocompleteData(); - return; - } - await spinnerify({ - startText: "Creating new data file", - finishText: "Data file created", - fn: () => createData(path, name), - }); -}; diff --git a/packages/commands/src/handlers/start/index.ts b/packages/commands/src/handlers/start/index.ts deleted file mode 100644 index 2145bbb..0000000 --- a/packages/commands/src/handlers/start/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from "./adapter"; -export * from "./api"; -export * from "./data"; -export * from "./mode"; -export * from "./route"; diff --git a/packages/commands/src/handlers/start/mode.ts b/packages/commands/src/handlers/start/mode.ts deleted file mode 100644 index c3e5a2b..0000000 --- a/packages/commands/src/handlers/start/mode.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { writeFile, readFile } from "@solid-cli/utils/fs"; -import { transformPlugins } from "@solid-cli/utils/transform"; -import { isSolidStart } from "@solid-cli/utils"; -import * as p from "@clack/prompts"; -import { cancelable } from "@solid-cli/ui"; - -export const supportedModes = ["csr", "ssr", "ssg"] as const; -type SupportedModes = (typeof supportedModes)[number]; - -const handleAutocompleteMode = async () => { - const mode = (await cancelable( - p.select({ - message: "Select a mode", - options: supportedModes.map((a) => ({ value: a, label: a.toUpperCase() })), - }), - )) as SupportedModes; - await handleMode(mode); -}; - -export const handleMode = async (mode?: SupportedModes) => { - if (!(await isSolidStart())) { - p.log.error("Cannot run command. Your project doesn't include solid-start"); - return; - } - if (!mode) { - handleAutocompleteMode(); - return; - } - p.log.info("Updating config"); - if (mode != "ssg") { - const newConfig = await transformPlugins( - [], - { type: "app", name: "app.config.ts", contents: (await readFile("app.config.ts")).toString() }, - true, - true, - ); - await writeFile("app.config.ts", newConfig); - } -}; diff --git a/packages/commands/src/handlers/start/route.ts b/packages/commands/src/handlers/start/route.ts deleted file mode 100644 index 6e1ea45..0000000 --- a/packages/commands/src/handlers/start/route.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as p from "@clack/prompts"; -import { isSolidStart, createRoute } from "@solid-cli/utils"; -import { cancelable, spinnerify } from "@solid-cli/ui"; -const handleAutocompleteRoute = async () => { - const path = await cancelable( - p.text({ - message: "Please provide a path for the route", - placeholder: "/user/login", - validate(value) { - if (!value.length) return "Path is required"; - }, - }), - ); - const name = await cancelable( - p.text({ - message: "Please provide a name for the route", - - validate(value) { - if (!value.length) return "Name for route is required"; - }, - }), - ); - - await handleRoute(path, name); -}; -export const handleRoute = async (path?: string, name?: string) => { - if (!(await isSolidStart())) { - p.log.error("Cannot run command. Your project doesn't include solid-start"); - return; - } - if (!path) { - await handleAutocompleteRoute(); - return; - } - await spinnerify({ - startText: "Creating new route", - finishText: "Route created", - fn: () => createRoute(path, name), - }); -}; diff --git a/packages/commands/src/index.ts b/packages/commands/src/index.ts deleted file mode 100644 index 32fff0a..0000000 --- a/packages/commands/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./handlers/add"; -export * from "./handlers/new"; -export * from "./handlers/start"; diff --git a/packages/commands/src/lib/integrations.ts b/packages/commands/src/lib/integrations.ts deleted file mode 100644 index 04b2049..0000000 --- a/packages/commands/src/lib/integrations.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { insertAfter, insertAtBeginning } from "@solid-cli/utils/fs"; -import { writeFile } from "fs/promises"; -import { fileExists, manipulateJsonFile, validateFilePath } from "./utils/helpers"; -import { $ } from "execa"; -import { getRunnerCommand, detectPackageManager } from "@solid-cli/utils/package-manager"; -import { createSignal } from "@solid-cli/reactivity"; -import * as p from "@clack/prompts"; -import color from "picocolors"; -import { cancelable } from "@solid-cli/ui"; -import { flushQueue } from "@solid-cli/utils/updates"; -import { PluginOptions } from "@solid-cli/utils/transform"; - -// All the integrations/packages that we support -export type Supported = keyof typeof integrations; - -export type IntegrationsValue = { - pluginOptions?: PluginOptions; - installs: string[]; - installsDev?: string[]; - additionalConfig?: () => Promise; - postInstall?: () => Promise; -}; - -export type Integrations = Record; - -export const [rootFile, setRootFile] = createSignal(undefined); - -export const integrations: Record = { - "tailwind": { - installs: ["tailwindcss", "postcss", "autoprefixer"], - postInstall: async () => { - const pM = detectPackageManager(); - await $`${getRunnerCommand(pM)} tailwindcss init -p`; - let tailwindConfig = "tailwind.config.js"; - if (!fileExists(tailwindConfig)) { - p.log.error(color.red(`Can't find tailwind config file`)); - await cancelable( - p.text({ - message: `Type path to tailwind config: `, - validate(value) { - if (!value.length) return `Path can not be empty`; - const path = validateFilePath(value, "tailwind.config"); - if (!path) return `Tailwind config at \`${value}\` not found. Please try again`; - else { - tailwindConfig = path; - } - }, - }), - ); - } - - let indexCss = "./src/index.css"; - if (!fileExists(indexCss)) { - p.log.error(color.red(`Can't find index.css`)); - await cancelable( - p.text({ - message: `Type path to index.css: `, - validate(value) { - if (!value.length) return `Path can not be empty`; - const path = validateFilePath(value, "index.css"); - if (!path) return `index.css at \`${value}\` not found. Please try again`; - else { - indexCss = path; - } - }, - }), - ); - } - p.log.info("Updating tailwind config"); - await insertAfter(tailwindConfig, "content: [", '"./index.html", "./src/**/*.{js,ts,jsx,tsx}"'); - await insertAtBeginning(indexCss, "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n"); - // Instantly flush queue - await flushQueue(); - }, - }, - "unocss": { - pluginOptions: { - importName: "UnoCss", - importSource: "unocss/vite", - isDefault: true, - options: {}, - }, - installs: [""], - installsDev: ["unocss"], - additionalConfig: async () => { - const path = rootFile(); - if (!path) return; - await insertAtBeginning(path, `import "virtual:uno.css";\n`); - }, - }, - "vitepwa": { - pluginOptions: { - importName: "VitePWA", - importSource: "vite-plugin-pwa", - isDefault: false, - options: {}, - }, - installs: ["vite-plugin-pwa"], - }, - "solid-devtools": { - pluginOptions: { - importName: "devtools", - importSource: "solid-devtools/vite", - isDefault: true, - options: {}, - }, - installs: ["solid-devtools"], - additionalConfig: async () => { - const path = rootFile(); - if (!path) return; - await insertAtBeginning(path, `import "solid-devtools";\n`); - }, - }, - "vitest": { - installs: [], - installsDev: [ - "vitest", - "jsdom", - "@solidjs/testing-library", - "@testing-library/user-event", - "@testing-library/jest-dom", - ], - additionalConfig: async () => { - try { - p.log.info("Adding test script to package.json"); - let hasStart = false; - manipulateJsonFile("package.json", (packageJson) => { - if (!packageJson.scripts) { packageJson.scripts = {}; } - if (!/\bvitest\b/.test(packageJson.scripts.test || "")) { - packageJson.scripts.test = "vitest"; - } - hasStart = packageJson.dependencies["@solidjs/start"] - return packageJson; - }); - const hasTs = fileExists("tsconfig.json"); - if (hasTs) { - p.log.info("Adding testing types to tsconfig.json"); - manipulateJsonFile("tsconfig.json", (tsConfig) => { - if (!tsConfig.compilerOptions) { - tsConfig.compilerOptions = {}; - } - tsConfig.compilerOptions.types = [ - ...new Set([...(tsConfig.compilerOptions.types || []), "vite/client", "@testing-library/jest-dom"]), - ]; - return tsConfig; - }); - } - if ( - hasStart && - ["ts", "mjs", "cjs", "js"].every( - (suffix) => !fileExists(`vite.config.${suffix}`) && !fileExists(`vitest.config.${suffix}`), - ) - ) { - const suffix = hasTs ? "ts" : "mjs"; - p.log.info(`Adding vitest.config.${suffix}`); - await writeFile( - `vitest.config.${suffix}`, - `import solid from "vite-plugin-solid"; -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - plugins: [solid()], - resolve: { - conditions: ["development", "browser"], - }, -}); -`, - "utf-8", - ); - } - } catch (err) { - console.error(err); - } - }, - }, - "tauri-v1.x": { - installs: ["@tauri-apps/cli"], - postInstall: async () => { - try { - let name = ""; - manipulateJsonFile("package.json", (packageJson) => { - if (!packageJson.scripts) { packageJson.scripts = {}; } - packageJson.scripts.tauri = "tauri"; - name = packageJson.name; - return packageJson; - }); - await flushQueue(); - const pM = detectPackageManager(); - await $`${getRunnerCommand(pM)} tauri init --ci -A ${name} -W ${name} -D ../dist -P http://localhost:3000`; - p.note(`Make sure you have installed all prerequisites: https://tauri.app/v1/guides/getting-started/prerequisites - - Start tauri development with ${color.bold(pM.name)} ${color.bold(pM.runScriptCommand("tauri dev"))}`); - } catch (err) { - console.error(err); - } - }, - }, - "tauri-v2.x": { - installs: ["@tauri-apps/cli@next"], - postInstall: async () => { - try { - let name = ""; - manipulateJsonFile("package.json", (packageJson) => { - if (!packageJson.scripts) { packageJson.scripts = {}; } - packageJson.scripts.tauri = "tauri"; - name = packageJson.name; - return packageJson; - }) - await flushQueue(); - const pM = detectPackageManager(); - await $`${getRunnerCommand(pM)} tauri init --ci -A ${name} -W ${name} -D ../dist -P http://localhost:3000`; - p.note(`Make sure you have installed all prerequisites: https://v2.tauri.app/start/prerequisites/ - - Start tauri development with ${color.bold(pM.name)} ${color.bold(pM.runScriptCommand("tauri dev"))}`); - } catch (err) { - console.error(err); - } - }, - }, -}; - diff --git a/packages/commands/src/lib/utils/helpers.ts b/packages/commands/src/lib/utils/helpers.ts deleted file mode 100644 index b910217..0000000 --- a/packages/commands/src/lib/utils/helpers.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { existsSync, lstatSync, readdirSync } from "fs"; -import { readFile, writeFile } from "fs/promises"; -import { isSolidStart } from "@solid-cli/utils"; -import { join, resolve } from "path"; -import { $ } from "execa"; -import { cancelable } from "@solid-cli/ui"; -import * as p from "@clack/prompts"; -import color from "picocolors"; - -export const getProjectRoot = async () => { - const { stdout } = await $`npm root`; - - return stdout.slice(0, stdout.lastIndexOf("/")); -}; - -export const getRootFile = async () => { - if (await isSolidStart()) { - return "src/app.tsx"; - } - return "src/index.tsx"; -}; - -export const fileExists = (path: string) => { - return existsSync(path); -}; - -export function validateFilePath(path: string, lookingFor: string): string | undefined; -export function validateFilePath(path: string, lookingFor: string[]): string | undefined; -export function validateFilePath(path: string, lookingFor: string | string[]): string | undefined { - path = resolve(path); - let isDir: boolean; - try { - console.log(path); - isDir = lstatSync(path).isDirectory(); - } catch (e) { - return undefined; - } - if (isDir) { - const files = readdirSync(path, { withFileTypes: true }); - - const config = files.find((file) => { - if (Array.isArray(lookingFor)) { - return lookingFor.some((s) => file.name.startsWith(s)); - } - - return file.name.startsWith(lookingFor); - }); - return config ? join(path, config.name) : undefined; - } - - const pathIsValid = Array.isArray(lookingFor) - ? lookingFor.some((s) => path.startsWith(s)) - : path.startsWith(lookingFor); - - const exists = fileExists(path) && pathIsValid; - - return exists ? path : undefined; -} - -export async function findFiles( - startPath: string, - lookingFor: string | string[], - opts: { depth?: number; ignoreDirs?: string[]; startsWith?: boolean }, -): Promise { - let { depth = Infinity, ignoreDirs = ["node_modules", "."], startsWith = true } = opts; - - startPath = resolve(startPath); - let isDir: boolean; - try { - isDir = lstatSync(startPath).isDirectory(); - } catch (e) { - return []; - } - if (!isDir) { - startPath = resolve(startPath.slice(0, startPath.lastIndexOf("/"))); - } - - let filePaths: string[] = []; - - const files = readdirSync(startPath, { withFileTypes: true }); - - for (const file of files) { - if (file.isDirectory() && !ignoreDirs.some((s) => file.name.includes(s))) { - if (Number.isFinite(depth) && depth-- <= 0) continue; - filePaths = filePaths.concat(await findFiles(resolve(startPath, file.name), lookingFor, opts)); - continue; - } - - if (file.isFile()) { - const fileMatch = Array.isArray(lookingFor) - ? lookingFor.some((s) => (startsWith ? file.name.startsWith(s) : file.name.endsWith(s))) - : startsWith - ? file.name.startsWith(lookingFor) - : file.name.endsWith(lookingFor); - - if (fileMatch) { - filePaths.push(resolve(startPath, file.name)); - } - } - } - - return filePaths; -} - -export const getConfigFile = async (file: "app" | "vite" = "app") => { - let configFile = `${file}.config.ts`; - - const existsHere = fileExists(configFile); - - if (!existsHere) { - const root = await getProjectRoot(); - const existsInRoot = validateFilePath(root, `${file}.config`); - if (existsInRoot) { - const correctConfig = await cancelable( - p.confirm({ - message: `Could not find ${file} config in current directory, but found ${file} config in \`${root}\`. Is this the correct ${file} config?`, - }), - ); - if (correctConfig) return existsInRoot; - } - - p.log.error(color.red(`Can't find ${file}.config file`)); - await cancelable( - p.text({ - message: `Type path to ${file} config: `, - validate(value) { - const path = validateFilePath(value, `${file}.config`); - if (!path) return `${file} config not found. Please try again`; - else { - configFile = path; - } - }, - }), - ); - } - - return configFile; -}; - -export async function manipulateJsonFile(name: string, manipulate: (obj: Record) => Record) { - try { - const jsonString = await readFile(name, "utf8"); - const jsonObj = JSON.parse(jsonString); - await writeFile( - name, - JSON.stringify(manipulate(jsonObj), null, /^(\t|\s+)/m.exec(jsonString)?.[0] || 2) + "\n", - "utf8", - ); - } catch (error) { - p.log.error(color.red(error ? error.toString() : `unknown error when manipulating ${name}`)); - } -} diff --git a/packages/commands/tests/assets/sample_app_config.txt b/packages/commands/tests/assets/sample_app_config.txt deleted file mode 100644 index 50315ba..0000000 --- a/packages/commands/tests/assets/sample_app_config.txt +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from "@solidjs/start/config"; -// Simulates an app config -export default defineConfig({ - vite: { - plugins: [solid()] - } -}); diff --git a/packages/commands/tests/assets/sample_unocss_app_result.txt b/packages/commands/tests/assets/sample_unocss_app_result.txt deleted file mode 100644 index 90217f1..0000000 --- a/packages/commands/tests/assets/sample_unocss_app_result.txt +++ /dev/null @@ -1,11 +0,0 @@ -import UnoCss from "unocss/vite"; -import { defineConfig } from "@solidjs/start/config"; -// Simulates an app config -export default defineConfig({ - vite: { - plugins: [ - solid(), - UnoCss({}) - ] - } -}); diff --git a/packages/commands/tests/assets/sample_unocss_vite_result.txt b/packages/commands/tests/assets/sample_unocss_vite_result.txt deleted file mode 100644 index c5d2c91..0000000 --- a/packages/commands/tests/assets/sample_unocss_vite_result.txt +++ /dev/null @@ -1,9 +0,0 @@ -import UnoCss from "unocss/vite"; -import { defineConfig } from "vite"; -// Simulates an app config -export default defineConfig({ - plugins: [ - solid(), - UnoCss({}) - ] -}); diff --git a/packages/commands/tests/assets/sample_vite_config.txt b/packages/commands/tests/assets/sample_vite_config.txt deleted file mode 100644 index 0faac72..0000000 --- a/packages/commands/tests/assets/sample_vite_config.txt +++ /dev/null @@ -1,5 +0,0 @@ -import { defineConfig } from "vite"; -// Simulates an app config -export default defineConfig({ - plugins: [solid()] -}); diff --git a/packages/commands/tests/config_manipulation.test.ts b/packages/commands/tests/config_manipulation.test.ts deleted file mode 100644 index aec0f98..0000000 --- a/packages/commands/tests/config_manipulation.test.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { describe, expect, it, vi } from "vitest"; -import { handleAdd } from "../src/handlers/add"; -import { readFile as readFile1 } from "fs"; -import { UPDATESQUEUE } from "../../utils/src/updates"; - -const readFile = async (path: string): Promise => { - return await new Promise((res) => - // Can't use readFile from fs/promises because we've mocked it - readFile1(path, (_, data) => res(data.toString())), - ); -}; - -const removeWhitespace = (str: string) => str.replace(/\s/g, ""); - -vi.mock("fs/promises", () => { - return { - readFile: async (name: string) => { - if (name === "app.config.ts") { - const sampleConfig: string = await readFile("./packages/commands/tests/assets/sample_app_config.txt"); - return sampleConfig; - } - if (name === "vite.config.ts") { - const sampleConfig: string = await readFile("./packages/commands/tests/assets/sample_vite_config.txt"); - return sampleConfig; - } - - return "{}"; - }, - writeFile: async (_, contents: string) => { - return contents; - }, - }; -}); -vi.mock("execa", () => { - return { $: async () => ({ stdout: "" }) }; -}); - -vi.mock("@clack/prompts", async () => { - const actual: object = await vi.importActual("@clack/prompts"); - return { - ...actual, - confirm: async ({ message }: { message: string }) => true, - }; -}); - -vi.mock("@solid-cli/utils/updates", async () => { - const actual: object = await vi.importActual("@solid-cli/utils/updates"); - return { - ...actual, - clearQueue: async () => {}, - }; -}); - -vi.mock("../src/lib/utils/helpers.ts", async () => { - return { - getConfigFile: async (file: string): Promise => new Promise((r) => r(`${file}.config.ts`)), - fileExists: (path: string) => - path.includes("vite_config") || - path.includes("app_config") || - path.includes("app.tsx") || - path.includes("index.tsx"), - getRootFile: async (): Promise => new Promise((r) => r("./src/app.tsx")), - }; -}); - -let testingSolidStart = false; - -vi.mock("@solid-cli/utils", async () => { - return { - isSolidStart: async () => new Promise((r) => r(testingSolidStart)), - }; -}); - -describe("Update config", () => { - it("Adds a plugin properly to the app config", { timeout: 50000 }, async () => { - testingSolidStart = true; - await handleAdd(["unocss"]); - - const expected = await readFile("./packages/commands/tests/assets/sample_unocss_app_result.txt"); - // @ts-ignore - const newConfig = UPDATESQUEUE.find((u) => u.name === "app.config.ts")?.contents; - expect(removeWhitespace(newConfig)).toBe(removeWhitespace(expected)); - }); - it("Adds a plugin properly to the vite config", { timeout: 50000 }, async () => { - testingSolidStart = false; - await handleAdd(["unocss"]); - - const expected = await readFile("./packages/commands/tests/assets/sample_unocss_vite_result.txt"); - // @ts-ignore - const newConfig = UPDATESQUEUE.find((u) => u.name === "vite.config.ts")?.contents; - expect(removeWhitespace(newConfig)).toBe(removeWhitespace(expected)); - }); -}); diff --git a/packages/commands/tests/package_installs.test.ts b/packages/commands/tests/package_installs.test.ts deleted file mode 100644 index c0eff16..0000000 --- a/packages/commands/tests/package_installs.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { expect, describe, it } from "vitest"; - -describe("Package Installs", () => { - it("should install packages correctly", () => { - expect(true).toBe(true); - }); -}); diff --git a/packages/commands/tsconfig.json b/packages/commands/tsconfig.json deleted file mode 100644 index ecaf1e3..0000000 --- a/packages/commands/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "skipLibCheck": true, - "declaration": true, - "emitDeclarationOnly": true, - "moduleResolution": "Bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "allowSyntheticDefaultImports": true, - "strict": true, - // "noUnusedLocals": true, - // "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "outDir": "types" - }, - "include": ["src/*"] -} diff --git a/packages/commands/tsup.config.ts b/packages/commands/tsup.config.ts deleted file mode 100644 index 0e6978c..0000000 --- a/packages/commands/tsup.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from "tsup"; -import metaUrlPlugin from "@chialab/esbuild-plugin-meta-url"; - -export default defineConfig({ - entry: ["src/index.ts", "src/handlers/new.ts"], - target: "esnext", - format: "esm", - splitting: false, - sourcemap: true, - clean: true, - minify: true, - esbuildPlugins: [metaUrlPlugin()], -}); diff --git a/packages/core/.gitignore b/packages/core/.gitignore deleted file mode 100644 index bf96551..0000000 --- a/packages/core/.gitignore +++ /dev/null @@ -1,133 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional swc cache -.swc - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* diff --git a/packages/core/README.md b/packages/core/README.md deleted file mode 100644 index c922b0e..0000000 --- a/packages/core/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# @solid-cli/core - -The main package for the SolidJS CLI tool. - -## Installation - -Run the following command to install the CLI tool globally: - -```bash -npm i -g @solid-cli/core -``` - -## Usage - -For a full list of commands and how to use them, you can invoke the help command like so: - -```bash -solid --help -``` - -Which should print this: - -```bash -solid - -where can be one of: - -- add - Can add and install integrations: `solid add unocss`. -- docs -- new - Creates a new solid project -- set -- start - Commands specific to solid start -- playground - -For more help, try running `solid --help` -``` - -## Documentation - -Visit our [official documentation](https://solid-cli.netlify.app/) - -## Support - -Reach out to us on the official [SolidJS discord](https://discord.gg/solidjs) - -## Contributing - -If you would like to contribute or keep up to date with the package, come join the effort over on [our GitHub](https://github.com/solidjs-community/solid-cli) diff --git a/packages/core/package.json b/packages/core/package.json deleted file mode 100644 index 6bc3f13..0000000 --- a/packages/core/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "@solid-cli/core", - "version": "0.0.26", - "description": "A CLI for Solid", - "author": "Thomas Beer & Rahul Batra", - "license": "MIT", - "homepage": "https://solid-cli.netlify.app", - "repository": { - "type": "git", - "url": "https://github.com/solidjs-community/solid-cli" - }, - "keywords": [ - "solidjs", - "solid", - "cli" - ], - "main": "dist/index.mjs", - "bin": { - "solid": "./dist/index.mjs" - }, - "files": [ - "dist" - ], - "dependencies": { - "@clack/core": "0.3.4", - "@clack/prompts": "0.7.0", - "@solid-cli/commands": "workspace:*", - "@solid-cli/ui": "workspace:*", - "@solid-cli/utils": "workspace:*", - "cmd-ts": "^0.13.0", - "execa": "^8.0.1", - "picocolors": "^1.1.1", - "smol-toml": "^1.3.0", - "tiny-updater": "^3.5.2" - }, - "scripts": { - "start": "jiti ./src/index.ts", - "build": "tsc && tsup" - }, - "devDependencies": { - "@chialab/esbuild-plugin-meta-url": "^0.18.2", - "@types/node": "^22.9.0", - "jiti": "^2.4.0", - "tsup": "^8.3.5", - "typescript": "^5.6.3" - }, - "publishConfig": { - "access": "public" - } -} diff --git a/packages/core/src/commands/index.ts b/packages/core/src/commands/index.ts deleted file mode 100644 index 8d4bcaf..0000000 --- a/packages/core/src/commands/index.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { openInBrowser } from "@solid-cli/utils"; -import { startCommands } from "./start"; -import * as p from "@clack/prompts"; -import { boolean, command, flag, optional, positional, restPositionals, string } from "cmd-ts"; -import { oneOf } from "@solid-cli/utils"; -import { cancelable } from "@solid-cli/ui"; -import { PossibleFields, setField, t } from "@solid-cli/utils"; -import { spinnerify } from "@solid-cli/ui"; -import { handleNew, handleAdd } from "@solid-cli/commands"; - -const add = command({ - name: "add", - description: t.ADD_DESC, - args: { - packages: restPositionals({ - type: string, - displayName: "Package Name", - }), - forceTransform: flag({ type: boolean, long: "force", short: "f" }), - }, - handler: async ({ packages, forceTransform }) => { - await handleAdd(packages, forceTransform); - }, -}); - -const new_ = command({ - name: "new", - description: t.NEW_DESC, - args: { - variation: positional({ - type: optional(oneOf(["bare", "ts", "js"] as const)), - displayName: t.NEW_VARIATION_DESC, - description: "", - }), - name: positional({ - type: optional(string), - displayName: t.PROJECT_NAME, - description: t.NEW_NAME_DESC, - }), - stackblitz: flag({ type: boolean, long: "stackblitz", short: "s" }), - }, - async handler({ variation, name, stackblitz }) { - if (!name && variation) { - const _name = await cancelable( - p.text({ - message: t.PROJECT_NAME, - placeholder: `solid-${variation}`, - defaultValue: `solid-${variation}`, - }), - ); - name = _name; - } - await handleNew(variation, name, stackblitz); - }, -}); - -const docs = command({ - name: "docs", - args: { - keyword: positional({ type: optional(string), displayName: "Keyword" }), - open: flag({ type: boolean, long: "open", short: "o" }), - }, - async handler({ keyword, open }) { - if (!keyword) { - if (open) { - await spinnerify({ - startText: "Opening", - finishText: "Opened", - fn: () => openInBrowser("https://docs.solidjs.com"), - }); - return; - } - p.log.message("The solid documentation is available at https://docs.solidjs.com"); - return; - } - await spinnerify({ - startText: "Opening", - finishText: "Opened", - fn: () => - openInBrowser( - `https://www.google.com/search?q=${keyword}+site:docs.solidjs.com+OR+site:start.solidjs.com+OR+site:solidjs.com`, - ), - }); - }, -}); - -const set = command({ - name: "set", - args: { field: positional({ type: oneOf(PossibleFields) }), value: positional({ type: string }) }, - async handler({ field, value }) { - await setField(field, value); - }, -}); - -const playground = command({ - name: "playground", - args: {}, - async handler() { - await spinnerify({ - startText: "Opening", - finishText: "Opened", - fn: () => openInBrowser("https://playground.solidjs.com"), - }); - }, -}); - -export default { - add, - docs, - new: new_, - set, - start: startCommands, - playground, -}; diff --git a/packages/core/src/commands/start.ts b/packages/core/src/commands/start.ts deleted file mode 100644 index 8f2640c..0000000 --- a/packages/core/src/commands/start.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { command, flag, optional, positional, string, subcommands } from "cmd-ts"; -import { oneOf } from "@solid-cli/utils"; -import { t } from "@solid-cli/utils"; -import { - handleAdapter, - handleApi, - handleData, - handleMode, - handleRoute, - supportedAdapters, - supportedModes, -} from "@solid-cli/commands"; - -const mode = command({ - name: "mode", - args: { - mode: positional({ - type: optional(oneOf(supportedModes)), - displayName: "Mode", - description: t.START_MODE_DESC, - }), - }, - async handler({ mode }) { - await handleMode(mode); - }, -}); - -const route = command({ - name: "route", - args: { - path: positional({ type: optional(string), displayName: "Route Path" }), - name: positional({ - type: optional(string), - displayName: "Route name", - description: t.START_ROUTE_DESC, - }), - }, - async handler({ path, name }) { - await handleRoute(path, name); - }, -}); - -const data = command({ - name: "data", - args: { - path: positional({ type: optional(string), displayName: "Data Path" }), - name: positional({ - type: optional(string), - displayName: "Data name", - description: t.START_DATA_DESC, - }), - }, - async handler({ path, name }) { - await handleData(path, name); - }, -}); - -const adapter = command({ - name: "adapter", - args: { - name: positional({ - type: optional(oneOf(supportedAdapters)), - displayName: t.START_ADAPTER_DISPLAYNAME, - }), - forceTransform: flag({ short: "f", long: "force" }), - }, - async handler({ name, forceTransform }) { - await handleAdapter(name, forceTransform); - }, -}); - -const api = command({ - name: "api", - args: { - path: positional({ type: optional(string), displayName: "Api Path" }), - name: positional({ - type: optional(string), - displayName: t.START_API_DISPLAYNAME, - description: t.START_API_HINT, - }), - }, - async handler({ path, name }) { - await handleApi(path, name); - }, -}); - -export const startCommands = subcommands({ - name: "start", - description: "Commands specific to solid start", - cmds: { - mode, - route, - data, - adapter, - api, - }, -}); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts deleted file mode 100644 index c358bb3..0000000 --- a/packages/core/src/index.ts +++ /dev/null @@ -1,117 +0,0 @@ -#! /usr/bin/env node -import { run, subcommands } from "cmd-ts"; -import * as p from "@clack/prompts"; -import color from "picocolors"; -import { t, setLocale, getField } from "@solid-cli/utils"; -import { name, version } from "../package.json"; -import { readConfig } from "@solid-cli/utils"; -import loadCommands from "./plugins/plugins_entry"; -import updater from "tiny-updater"; -import { createAsync } from "@solid-cli/reactivity"; -import { - handleAdapter, - handleAdd, - handleApi, - handleData, - handleMode, - handleNew, - handleRoute, -} from "@solid-cli/commands"; - -const possibleActions = () => - [ - { value: "add", label: t.ACTION_ADD, hint: "solid add ..." }, - { value: "new", label: t.ACTION_NEW, hint: "solid new ..." }, - { value: "start", label: t.ACTION_START, hint: "solid start ..." }, - ] as const; - -export const provideStartSuggestions = async () => { - let startAction = await p.select({ - message: t.SELECT_START_ACTION, - options: [ - { value: "mode", label: t.START_MODE, hint: t.START_MODE_HINT }, - { value: "route", label: t.START_ROUTE, hint: t.START_ROUTE_HINT }, - { value: "data", label: t.START_DATA, hint: t.START_DATA_HINT }, - { - value: "adapter", - label: t.START_ADAPTER, - hint: t.START_ADAPTER_HINT, - }, - { - value: "api", - label: t.START_API, - hint: t.START_API_HINT, - }, - ], - }); - switch (startAction) { - case "mode": - await handleMode(); - break; - case "route": - await handleRoute(); - break; - case "data": - await handleData(); - break; - case "adapter": - await handleAdapter(); - break; - case "api": - await handleApi(); - break; - } -}; - -const provideSuggestions = async () => { - type ActionType = ReturnType[number]["value"]; - let action = (await p.select({ - message: t.SELECT_ACTION, - // This thing really doesn't like `as const` things - options: possibleActions() as any, - })) as ActionType; - if (!action) return; - switch (action) { - case "add": - await handleAdd(); - break; - case "new": - await handleNew(); - break; - case "start": - await provideStartSuggestions(); - break; - } -}; - -const main = async () => { - p.intro(`\n${color.bgCyan(color.black(" Solid-CLI "))}`); - await readConfig(); - const needsUpdate = createAsync(async () => await updater({ name, version, ttl: 86_400_000 })); - setLocale(getField("lang")); - const cli = subcommands({ - name: "solid", - cmds: await loadCommands(), - version, - }); - const args = process.argv.slice(2); - try { - - if (args.length === 0) { - await provideSuggestions(); - return; - } - - if (args.length === 1 && args[0] === "start") { - await provideStartSuggestions(); - return; - } - - await run(cli, args); - } - catch (e) { - console.error(e); - process.exit(1); - } -}; -main(); diff --git a/packages/core/src/plugins/plugins_entry.ts b/packages/core/src/plugins/plugins_entry.ts deleted file mode 100644 index f1aec75..0000000 --- a/packages/core/src/plugins/plugins_entry.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { join } from "path"; -import { config } from "@solid-cli/utils"; -import defaultCommands from "../commands"; - -const resolveImport = async (packagePath: string) => { - const packageJson = await import(join(packagePath, "package.json")); - return await import(join(packagePath, packageJson.module)); -}; -const loadUserCommands = async () => { - const pluginPaths = config()["plugins"] as string[]; - if (!pluginPaths) return null; - const imports = await Promise.all(pluginPaths.map((p) => resolveImport(p))); - const importedCommands = imports.map((i) => i.default); - let commands = {} as any; - importedCommands.forEach((c) => { - const name = c.name; - commands[name] = c; - }); - return commands; -}; -const loadCommands = async () => { - const cmds = { - ...defaultCommands, - ...(await loadUserCommands()), - }; - return cmds; -}; -export default loadCommands; diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json deleted file mode 100644 index b6d4e3a..0000000 --- a/packages/core/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "noEmit": true, - "module": "ESNext", - "target": "ESNext", - "moduleResolution": "Bundler", - "strict": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "skipLibCheck": true, - "resolveJsonModule": true - } -} diff --git a/packages/core/tsup.config.ts b/packages/core/tsup.config.ts deleted file mode 100644 index 75f3240..0000000 --- a/packages/core/tsup.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from "tsup"; -import metaUrlPlugin from "@chialab/esbuild-plugin-meta-url"; - -export default defineConfig({ - entry: ["src/index.ts"], - target: "esnext", - format: "esm", - splitting: false, - sourcemap: true, - clean: true, - minify: true, - esbuildPlugins: [metaUrlPlugin()], -}); diff --git a/packages/create-solid/src/create-start.ts b/packages/create-solid/src/create-start.ts index e41c2a8..68041ab 100644 --- a/packages/create-solid/src/create-start.ts +++ b/packages/create-solid/src/create-start.ts @@ -1,8 +1,8 @@ import { downloadRepo } from "@begit/core"; -import { GIT_IGNORE, StartTemplate } from "./helpers" import { join } from "path"; import { writeFileSync } from "fs"; import { handleTSConversion } from "./utils/ts-conversion" +import { GIT_IGNORE, StartTemplate } from "./utils/constants"; export type CreateStartArgs = { template: StartTemplate, destination: string, diff --git a/packages/create-solid/src/create-vanilla.ts b/packages/create-solid/src/create-vanilla.ts index 394ba41..904b010 100644 --- a/packages/create-solid/src/create-vanilla.ts +++ b/packages/create-solid/src/create-vanilla.ts @@ -1,8 +1,8 @@ import { downloadRepo } from "@begit/core"; import { join } from "node:path"; -import { GIT_IGNORE, VanillaTemplate } from "./helpers"; import { writeFileSync } from "node:fs"; import { handleTSConversion } from "./utils/ts-conversion"; +import { GIT_IGNORE, VanillaTemplate } from "./utils/constants"; export type CreateVanillaArgs = { diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index c340ee7..bdcf9b5 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -5,9 +5,10 @@ import packageJson from "../package.json" with { type: "json" }; import { defineCommand, runMain } from "citty"; import { createVanilla, createVanillaJS } from "./create-vanilla"; import * as p from "@clack/prompts"; -import { cancelable, getTemplatesList, spinnerify, StartTemplate, VanillaTemplate } from "./helpers"; +import { cancelable, spinnerify } from "./utils/ui"; import { createStart } from "./create-start"; import { create } from "./create"; +import { getTemplatesList, StartTemplate, VanillaTemplate } from "./utils/constants"; intro(`\n${color.bgCyan(color.black(` Create-Solid v${packageJson.version}`))}`); const main = defineCommand({ diff --git a/packages/create-solid/src/utils/constants.ts b/packages/create-solid/src/utils/constants.ts new file mode 100644 index 0000000..403e595 --- /dev/null +++ b/packages/create-solid/src/utils/constants.ts @@ -0,0 +1,57 @@ +export const GIT_IGNORE = ` +dist +.solid +.output +.vercel +.netlify +.vinxi +app.config.timestamp_*.js + +# Environment +.env +.env*.local + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +*.launch +.settings/ + +# Temp +gitignore + +# System Files +.DS_Store +Thumbs.db +`; + +export const JS_CONFIG = { + compilerOptions: { + jsx: "preserve", + jsxImportSource: "solid-js", + paths: { + "~/*": ["./src/*"], + }, + }, +} + +// Supported templates + +const VANILLA_TEMPLATES = ["ts"] as const; +export type VanillaTemplate = (typeof VANILLA_TEMPLATES)[number]; + +const START_TEMPLATES = ["basic"] as const; +export type StartTemplate = (typeof VANILLA_TEMPLATES)[number]; + +export const getTemplatesList = async (isStart: boolean) => { + if (isStart) { + return START_TEMPLATES; + } + return VANILLA_TEMPLATES; +} + +// \ No newline at end of file diff --git a/packages/create-solid/src/utils/ts-conversion.ts b/packages/create-solid/src/utils/ts-conversion.ts index dc5a711..6683534 100644 --- a/packages/create-solid/src/utils/ts-conversion.ts +++ b/packages/create-solid/src/utils/ts-conversion.ts @@ -3,6 +3,7 @@ import { readFileToString, recurseFiles } from "./file-system" import { join, resolve } from "node:path"; import { transform } from "sucrase"; import { rm } from "node:fs/promises"; +import { JS_CONFIG } from "./constants" const convertToJS = async (file: Dirent, startPath: string) => { const src = join(startPath, file.name); const dest = resolve(startPath.replace(".solid-start", ""), file.name); @@ -27,15 +28,7 @@ export const handleTSConversion = async (tempDir: string, projectName: string) = writeFileSync( resolve(projectName, "jsconfig.json"), JSON.stringify( - { - compilerOptions: { - jsx: "preserve", - jsxImportSource: "solid-js", - paths: { - "~/*": ["./src/*"], - }, - }, - }, + JS_CONFIG, null, 2, ), diff --git a/packages/create-solid/src/helpers.ts b/packages/create-solid/src/utils/ui.ts similarity index 60% rename from packages/create-solid/src/helpers.ts rename to packages/create-solid/src/utils/ui.ts index f53899a..fcaa5eb 100644 --- a/packages/create-solid/src/helpers.ts +++ b/packages/create-solid/src/utils/ui.ts @@ -1,34 +1,3 @@ -export const GIT_IGNORE = ` -dist -.solid -.output -.vercel -.netlify -.vinxi -app.config.timestamp_*.js - -# Environment -.env -.env*.local - -# dependencies -/node_modules - -# IDEs and editors -/.idea -.project -.classpath -*.launch -.settings/ - -# Temp -gitignore - -# System Files -.DS_Store -Thumbs.db -`; - import { log, spinner } from "@clack/prompts"; type SpinnerItem = { startText: string; @@ -59,14 +28,3 @@ export const cancelable = async (prompt: Promise, cance return value; }; -const VANILLA_TEMPLATES = ["ts"] as const; -export type VanillaTemplate = (typeof VANILLA_TEMPLATES)[number]; - -const START_TEMPLATES = ["basic"] as const; -export type StartTemplate = (typeof VANILLA_TEMPLATES)[number]; -export const getTemplatesList = async (isStart: boolean) => { - if (isStart) { - return START_TEMPLATES; - } - return VANILLA_TEMPLATES; -} \ No newline at end of file From ae7e8c510de10d59dc6609e946a4a4b38ff31538 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 00:46:08 +0000 Subject: [PATCH 08/35] remove unnecessary example --- examples/README.md | 1 - examples/plugin_template/package.json | 19 - examples/plugin_template/pnpm-lock.yaml | 930 ------------------------ examples/plugin_template/src/index.ts | 10 - examples/plugin_template/tsconfig.json | 14 - examples/plugin_template/tsup.config.ts | 10 - 6 files changed, 984 deletions(-) delete mode 100644 examples/README.md delete mode 100644 examples/plugin_template/package.json delete mode 100644 examples/plugin_template/pnpm-lock.yaml delete mode 100644 examples/plugin_template/src/index.ts delete mode 100644 examples/plugin_template/tsconfig.json delete mode 100644 examples/plugin_template/tsup.config.ts diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index bde8a57..0000000 --- a/examples/README.md +++ /dev/null @@ -1 +0,0 @@ -# Example plugins for the CLI diff --git a/examples/plugin_template/package.json b/examples/plugin_template/package.json deleted file mode 100644 index 4f9cffc..0000000 --- a/examples/plugin_template/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "test_plugin", - "version": "1.0.0", - "description": "", - "module": "./dist/index.mjs", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "build": "tsup" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "cmd-ts": "^0.13.0" - }, - "devDependencies": { - "tsup": "^7.2.0" - } -} diff --git a/examples/plugin_template/pnpm-lock.yaml b/examples/plugin_template/pnpm-lock.yaml deleted file mode 100644 index b437238..0000000 --- a/examples/plugin_template/pnpm-lock.yaml +++ /dev/null @@ -1,930 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - cmd-ts: - specifier: ^0.13.0 - version: 0.13.0 - -devDependencies: - tsup: - specifier: ^7.2.0 - version: 7.2.0 - -packages: - - /@esbuild/android-arm64@0.18.19: - resolution: {integrity: sha512-4+jkUFQxZkQfQOOxfGVZB38YUWHMJX2ihZwF+2nh8m7bHdWXpixiurgGRN3c/KMSwlltbYI0/i929jwBRMFzbA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.18.19: - resolution: {integrity: sha512-1uOoDurJYh5MNqPqpj3l/TQCI1V25BXgChEldCB7D6iryBYqYKrbZIhYO5AI9fulf66sM8UJpc3UcCly2Tv28w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.18.19: - resolution: {integrity: sha512-ae5sHYiP/Ogj2YNrLZbWkBmyHIDOhPgpkGvFnke7XFGQldBDWvc/AyYwSLpNuKw9UNkgnLlB/jPpnBmlF3G9Bg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.18.19: - resolution: {integrity: sha512-HIpQvNQWFYROmWDANMRL+jZvvTQGOiTuwWBIuAsMaQrnStedM+nEKJBzKQ6bfT9RFKH2wZ+ej+DY7+9xHBTFPg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.18.19: - resolution: {integrity: sha512-m6JdvXJQt0thNLIcWOeG079h2ivhYH4B5sVCgqb/B29zTcFd7EE8/J1nIUHhdtwGeItdUeqKaqqb4towwxvglQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.18.19: - resolution: {integrity: sha512-G0p4EFMPZhGn/xVNspUyMQbORH3nlKTV0bFNHPIwLraBuAkTeMyxNviTe0ZXUbIXQrR1lrwniFjNFU4s+x7veQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.18.19: - resolution: {integrity: sha512-hBxgRlG42+W+j/1/cvlnSa+3+OBKeDCyO7OG2ICya1YJaSCYfSpuG30KfOnQHI7Ytgu4bRqCgrYXxQEzy0zM5Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.18.19: - resolution: {integrity: sha512-X8g33tczY0GsJq3lhyBrjnFtaKjWVpp1gMq5IlF9BQJ3TUfSK74nQnz9mRIEejmcV+OIYn6bkOJeUaU1Knrljg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.18.19: - resolution: {integrity: sha512-qtWyoQskfJlb9MD45mvzCEKeO4uCnDZ7lPFeNqbfaaJHqBiH9qA5Vu2EuckqYZuFMJWy1l4dxTf9NOulCVfUjg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.18.19: - resolution: {integrity: sha512-SAkRWJgb+KN+gOhmbiE6/wu23D6HRcGQi15cB13IVtBZZgXxygTV5GJlUAKLQ5Gcx0gtlmt+XIxEmSqA6sZTOw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.18.19: - resolution: {integrity: sha512-YLAslaO8NsB9UOxBchos82AOMRDbIAWChwDKfjlGrHSzS3v1kxce7dGlSTsrb0PJwo1KYccypN3VNjQVLtz7LA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.18.19: - resolution: {integrity: sha512-vSYFtlYds/oTI8aflEP65xo3MXChMwBOG1eWPGGKs/ev9zkTeXVvciU+nifq8J1JYMz+eQ4J9JDN0O2RKF8+1Q==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.18.19: - resolution: {integrity: sha512-tgG41lRVwlzqO9tv9l7aXYVw35BxKXLtPam1qALScwSqPivI8hjkZLNH0deaaSCYCFT9cBIdB+hUjWFlFFLL9A==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.18.19: - resolution: {integrity: sha512-EgBZFLoN1S5RuB4cCJI31pBPsjE1nZ+3+fHRjguq9Ibrzo29bOLSBcH1KZJvRNh5qtd+fcYIGiIUia8Jw5r1lQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.18.19: - resolution: {integrity: sha512-q1V1rtHRojAzjSigZEqrcLkpfh5K09ShCoIsdTakozVBnM5rgV58PLFticqDp5UJ9uE0HScov9QNbbl8HBo6QQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.18.19: - resolution: {integrity: sha512-D0IiYjpZRXxGZLQfsydeAD7ZWqdGyFLBj5f2UshJpy09WPs3qizDCsEr8zyzcym6Woj/UI9ZzMIXwvoXVtyt0A==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.18.19: - resolution: {integrity: sha512-3tt3SOS8L3D54R8oER41UdDshlBIAjYhdWRPiZCTZ1E41+shIZBpTjaW5UaN/jD1ENE/Ok5lkeqhoNMbxstyxw==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.18.19: - resolution: {integrity: sha512-MxbhcuAYQPlfln1EMc4T26OUoeg/YQc6wNoEV8xvktDKZhLtBxjkoeESSo9BbPaGKhAPzusXYj5n8n5A8iZSrA==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.18.19: - resolution: {integrity: sha512-m0/UOq1wj25JpWqOJxoWBRM9VWc3c32xiNzd+ERlYstUZ6uwx5SZsQUtkiFHaYmcaoj+f6+Tfcl7atuAz3idwQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.18.19: - resolution: {integrity: sha512-L4vb6pcoB1cEcXUHU6EPnUhUc4+/tcz4OqlXTWPcSQWxegfmcOprhmIleKKwmMNQVc4wrx/+jB7tGkjjDmiupg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.18.19: - resolution: {integrity: sha512-rQng7LXSKdrDlNDb7/v0fujob6X0GAazoK/IPd9C3oShr642ri8uIBkgM37/l8B3Rd5sBQcqUXoDdEy75XC/jg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.18.19: - resolution: {integrity: sha512-z69jhyG20Gq4QL5JKPLqUT+eREuqnDAFItLbza4JCmpvUnIlY73YNjd5djlO7kBiiZnvTnJuAbOjIoZIOa1GjA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: false - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: false - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /bundle-require@4.0.1(esbuild@0.18.19): - resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.17' - dependencies: - esbuild: 0.18.19 - load-tsconfig: 0.2.5 - dev: true - - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: false - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /cmd-ts@0.13.0: - resolution: {integrity: sha512-nsnxf6wNIM/JAS7T/x/1JmbEsjH0a8tezXqqpaL0O6+eV0/aDEnRxwjxpu0VzDdRcaC1ixGSbRlUuf/IU59I4g==} - dependencies: - chalk: 4.1.2 - debug: 4.3.4 - didyoumean: 1.2.2 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: false - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false - - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: false - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /esbuild@0.18.19: - resolution: {integrity: sha512-ra3CaIKCzJp5bU5BDfrCc0FRqKj71fQi+gbld0aj6lN0ifuX2fWJYPgLVLGwPfA+ruKna+OWwOvf/yHj6n+i0g==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.19 - '@esbuild/android-arm64': 0.18.19 - '@esbuild/android-x64': 0.18.19 - '@esbuild/darwin-arm64': 0.18.19 - '@esbuild/darwin-x64': 0.18.19 - '@esbuild/freebsd-arm64': 0.18.19 - '@esbuild/freebsd-x64': 0.18.19 - '@esbuild/linux-arm': 0.18.19 - '@esbuild/linux-arm64': 0.18.19 - '@esbuild/linux-ia32': 0.18.19 - '@esbuild/linux-loong64': 0.18.19 - '@esbuild/linux-mips64el': 0.18.19 - '@esbuild/linux-ppc64': 0.18.19 - '@esbuild/linux-riscv64': 0.18.19 - '@esbuild/linux-s390x': 0.18.19 - '@esbuild/linux-x64': 0.18.19 - '@esbuild/netbsd-x64': 0.18.19 - '@esbuild/openbsd-x64': 0.18.19 - '@esbuild/sunos-x64': 0.18.19 - '@esbuild/win32-arm64': 0.18.19 - '@esbuild/win32-ia32': 0.18.19 - '@esbuild/win32-x64': 0.18.19 - dev: true - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: false - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: true - - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - dev: true - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - - /load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true - - /postcss-load-config@4.0.1: - resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 2.1.0 - yaml: 2.3.1 - dev: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rollup@3.27.2: - resolution: {integrity: sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - dependencies: - whatwg-url: 7.1.0 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: false - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: false - - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: true - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - dependencies: - punycode: 2.3.0 - dev: true - - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true - - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true - - /tsup@7.2.0: - resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} - engines: {node: '>=16.14'} - hasBin: true - peerDependencies: - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.1.0' - peerDependenciesMeta: - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true - dependencies: - bundle-require: 4.0.1(esbuild@0.18.19) - cac: 6.7.14 - chokidar: 3.5.3 - debug: 4.3.4 - esbuild: 0.18.19 - execa: 5.1.1 - globby: 11.1.0 - joycon: 3.1.1 - postcss-load-config: 4.0.1 - resolve-from: 5.0.0 - rollup: 3.27.2 - source-map: 0.8.0-beta.0 - sucrase: 3.34.0 - tree-kill: 1.2.2 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: true - - /whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} - dev: true diff --git a/examples/plugin_template/src/index.ts b/examples/plugin_template/src/index.ts deleted file mode 100644 index dd44b62..0000000 --- a/examples/plugin_template/src/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { command } from "cmd-ts"; - -export default command({ - name: "custom", - description: "A completely custom command dynamically imported at runtime!", - args: {}, - handler() { - console.log("CUSTOM COMMAND WORKS!!"); - }, -}); diff --git a/examples/plugin_template/tsconfig.json b/examples/plugin_template/tsconfig.json deleted file mode 100644 index 71dfb43..0000000 --- a/examples/plugin_template/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "jsx": "preserve", - "noEmit": true, - "module": "ESNext", - "target": "ESNext", - "moduleResolution": "node", - "strict": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "skipLibCheck": true, - "resolveJsonModule": true - } -} diff --git a/examples/plugin_template/tsup.config.ts b/examples/plugin_template/tsup.config.ts deleted file mode 100644 index d80d441..0000000 --- a/examples/plugin_template/tsup.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: ["src/index.ts"], - target: "esnext", - format: "esm", - splitting: false, - sourcemap: true, - clean: true, -}); From 6477e9909a46f56e02994dd99d2d66482cf71c45 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 00:48:46 +0000 Subject: [PATCH 09/35] remove unnecessary utils remove unused `ui` package --- packages/ui/.gitignore | 1 - packages/ui/package.json | 43 --- .../ui/src/components/autocomplete/index.ts | 304 --------------- .../ui/src/components/autocomplete/utils.ts | 95 ----- packages/ui/src/components/form/index.ts | 26 -- .../ui/src/components/spinnerify/index.ts | 19 - packages/ui/src/index.ts | 4 - packages/ui/tsconfig.json | 20 - packages/ui/tsup.config.ts | 11 - packages/utils/src/cmd-ts/index.ts | 1 - packages/utils/src/cmd-ts/oneOf.ts | 16 - packages/utils/src/config/index.ts | 43 --- packages/utils/src/index.ts | 3 - packages/utils/src/primitives/index.ts | 62 --- packages/utils/src/translations/index.ts | 1 - .../utils/src/translations/translations.ts | 354 ------------------ packages/utils/src/translations/types.ts | 6 - packages/utils/src/util-types/index.ts | 6 - 18 files changed, 1015 deletions(-) delete mode 100644 packages/ui/.gitignore delete mode 100644 packages/ui/package.json delete mode 100644 packages/ui/src/components/autocomplete/index.ts delete mode 100644 packages/ui/src/components/autocomplete/utils.ts delete mode 100644 packages/ui/src/components/form/index.ts delete mode 100644 packages/ui/src/components/spinnerify/index.ts delete mode 100644 packages/ui/src/index.ts delete mode 100644 packages/ui/tsconfig.json delete mode 100644 packages/ui/tsup.config.ts delete mode 100644 packages/utils/src/cmd-ts/index.ts delete mode 100644 packages/utils/src/cmd-ts/oneOf.ts delete mode 100644 packages/utils/src/config/index.ts delete mode 100644 packages/utils/src/primitives/index.ts delete mode 100644 packages/utils/src/translations/index.ts delete mode 100644 packages/utils/src/translations/translations.ts delete mode 100644 packages/utils/src/translations/types.ts delete mode 100644 packages/utils/src/util-types/index.ts diff --git a/packages/ui/.gitignore b/packages/ui/.gitignore deleted file mode 100644 index fbf0622..0000000 --- a/packages/ui/.gitignore +++ /dev/null @@ -1 +0,0 @@ -types \ No newline at end of file diff --git a/packages/ui/package.json b/packages/ui/package.json deleted file mode 100644 index 68d933d..0000000 --- a/packages/ui/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "@solid-cli/ui", - "version": "0.0.13", - "license": "MIT", - "homepage": "https://solid-cli.netlify.app", - "repository": { - "type": "git", - "url": "https://github.com/solidjs-community/solid-cli" - }, - "files": [ - "dist", - "types" - ], - "description": "A collection of UI utilities for the Solid CLI", - "main": "./dist/index.mjs", - "module": "./dist/index.mjs", - "types": "./types/index.d.ts", - "exports": { - ".": { - "import": "./dist/index.mjs", - "require": "./dist/index.mjs", - "types": "./types/index.d.ts" - } - }, - "scripts": { - "test": "vitest run", - "build": "tsc && tsup" - }, - "devDependencies": { - "tsup": "^8.3.5", - "typescript": "^5.6.3", - "@types/node": "22.9.0" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@clack/core": "0.3.4", - "@clack/prompts": "0.7.0", - "picocolors": "^1.1.1", - "@solid-cli/utils": "workspace:*" - } -} diff --git a/packages/ui/src/components/autocomplete/index.ts b/packages/ui/src/components/autocomplete/index.ts deleted file mode 100644 index 739ab93..0000000 --- a/packages/ui/src/components/autocomplete/index.ts +++ /dev/null @@ -1,304 +0,0 @@ -import { Key } from "node:readline"; -import { Prompt } from "@clack/core"; -import { TextOptions } from "@clack/prompts"; -import { S_CHECKBOX_ACTIVE, S_CHECKBOX_SELECTED, S_CHECKBOX_INACTIVE, S_BAR, S_BAR_END, box, S_INFO } from "./utils"; -import color from "picocolors"; -import { createEffect } from "@solid-cli/reactivity"; -import { t } from "@solid-cli/utils"; -import { Option } from "@solid-cli/utils/util-types"; - -const buildRegex = (str: string) => { - let s = ""; - - for (let i = 0; i < str.length; i++) { - s += str[i] + ".*"; - } - - s = ".*" + s; - - return RegExp(s); -}; - -const search = (values: T[], lookFor: string) => { - const group = lookFor.match(/(\w+)\/(\w+)?/); - - if (group) { - const groupData = values.filter((option) => option.group && option.group.includes(group[1])); - - const sp = group[2]; - - if (!sp) return groupData; - - const r = buildRegex(sp); - return groupData.filter((v) => r.test((v.label ?? v.value).toLowerCase())); - } - - const r = buildRegex(lookFor); - - return !lookFor.length ? values : values.filter((v) => r.test((v.label ?? v.value).toLowerCase())); -}; - -const sortByGroup = (options: T[]) => { - return [...options].sort((a, b) => { - if (a.group && b.group) return 0; - - if (a.group && !b.group) return 1; - - return -1; - }); -}; - -const opt = ( - option: any, - state: "inactive" | "active" | "selected" | "active-selected" | "submitted" | "cancelled", -) => { - const label = option.label ?? String(option.value); - if (state === "active") { - return `${color.cyan(S_CHECKBOX_ACTIVE)} ${label} ${option.hint ? color.dim(`(${option.hint})`) : ""}`; - } else if (state === "selected") { - return `${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)}`; - } else if (state === "cancelled") { - return `${color.strikethrough(color.dim(label))}`; - } else if (state === "active-selected") { - return `${color.green(S_CHECKBOX_SELECTED)} ${label} ${option.hint ? color.dim(`(${option.hint})`) : ""}`; - } else if (state === "submitted") { - return `${color.dim(label)}`; - } - return `${color.dim(S_CHECKBOX_INACTIVE)} ${color.dim(label)}`; -}; - -const aliases = new Map([ - ["k", "up"], - ["j", "down"], - ["h", "left"], - ["l", "right"], -]); - -interface AutocompleteTextOptions extends TextOptions { - options: () => T[]; - render: (this: Omit, "prompt">) => string | void; -} - -class AutocompleteText extends Prompt { - valueWithCursor = ""; - options: T[]; - - get __cursor() { - return this._cursor; - } - cursor: number = 0; - - filteredOptions: T[]; - selected: T[]; - - mode: "search" | "explore" = "explore"; - - private toggleValue() { - const cursorOption = this.filteredOptions[this.cursor]; - const selected = this.selected.find((v) => v.value === cursorOption.value) !== undefined; - - this.selected = selected - ? this.selected.filter((v) => v.value !== cursorOption.value) - : [...this.selected, cursorOption]; - } - - constructor(opts: AutocompleteTextOptions) { - super(opts); - - // // @ts-ignore - // this.rl?.clearLine(); - this.options = opts.options(); - this.filteredOptions = opts.options(); - this.selected = []; - - if (this.mode === "explore") this.value = this.options; - - createEffect(() => { - this.options = opts.options(); - this.filteredOptions = sortByGroup(search(opts.options(), "")); - this.value = this.options; - // @ts-ignore - this.render(); - }); - - this.customKeyPress = this.customKeyPress.bind(this); - - this.on("finalize", () => { - if (!this.value) { - this.value = opts.defaultValue; - } - this.valueWithCursor = this.value; - this.value = this.selected; - }); - - this.on("value", () => { - if (this.value[this.value.length - 1] === "/" && this.mode === "explore") { - // @ts-ignore - this.rl.clearLine(); - this.value = ""; - this.mode = "search"; - return; - } - if (this.mode === "explore") return; - const value = this.value as string; - if (this._cursor >= value.length) { - this.valueWithCursor = `${value}${color.inverse(color.hidden("_"))}`; - } else { - const s1 = value.slice(0, this._cursor); - const s2 = value.slice(this._cursor); - this.valueWithCursor = `${s1}${color.inverse(s2)}${s2.slice(1)}`; - } - - const indexSelector = value.match(/:(\d+)/); - // if (!indexSelector) this.cursor = 0; - - const last = value[value.length - 1]; - if (last === ":") { - const tillSelector = value.slice(0, value.length - 1); - - if (tillSelector.length > 0) { - this.filteredOptions = sortByGroup(search(this.options, tillSelector)); - } else { - this.filteredOptions = sortByGroup(this.options); - } - - return; - } - - if (indexSelector && indexSelector[1]) { - const index = Number(indexSelector[1]); - - if (this.filteredOptions.length > 1 && index > this.filteredOptions.length - 1) { - this.state = "error"; - return; - } - this.cursor = index; - return; - } - - const before = this.filteredOptions.length; - this.filteredOptions = sortByGroup(search(this.options, value.toLowerCase())); - const after = this.filteredOptions.length; - - if (before !== after) { - this.cursor = 0; - } - }); - this.on("cursor", (key) => { - if (this.mode === "explore" && key === "/") return; - switch (key) { - case "left": - case "up": - this.cursor = this.cursor === 0 ? this.filteredOptions.length - 1 : this.cursor - 1; - break; - case "down": - case "right": - this.cursor = this.cursor === this.filteredOptions.length - 1 ? 0 : this.cursor + 1; - break; - case "tab": - this.toggleValue(); - break; - } - }); - this.input.on("keypress", this.customKeyPress); - } - - private customKeyPress(char: string, key?: Key) { - if (this.mode === "explore" && key?.name && aliases.has(key.name)) { - this.emit("cursor", aliases.get(key.name)); - } - if (key?.name === "tab") { - const focusedOption = this.filteredOptions[this.cursor]; - const selected = this.selected.find((v) => v?.value === focusedOption?.value) !== undefined; - if (selected) { - this.selected = this.selected.filter((v) => v !== focusedOption); - } else { - this.selected = this.filteredOptions?.length === 0 ? this.selected : [...this.selected, focusedOption]; - } - // @ts-ignore - this.rl.clearLine(); - } else if (key?.name === "escape") { - if (this.mode === "search") { - this.mode = "explore"; - return; - } - } - } -} - -const BULLET = "•"; - -const instructions = color.gray( - `↓/j down ${BULLET} ↑/k up ${BULLET} tab select ${BULLET} Ctrl-C cancel ${BULLET} / filter`, -); - -const searchInstructions = color.gray( - `tab select ${BULLET} ESC cancel filter ${BULLET} : to highlight by index`, -); - -export const autocomplete = (opts: Omit, "render">) => { - return new AutocompleteText({ - options: opts.options, - message: opts.message, - validate: opts.validate, - placeholder: opts.placeholder, - defaultValue: opts.defaultValue, - initialValue: opts.initialValue, - render() { - const selected = - this.selected.length === 0 - ? color.gray(t.NOTHING_SELECTED) - : this.selected.map((option, i) => `${color.yellow(option.label)}`).join(" "); - const placeholder = opts.placeholder - ? color.inverse(opts.placeholder[0]) + color.dim(opts.placeholder.slice(1)) - : color.inverse(color.hidden("_")); - - const value = typeof this.value === "string" ? (!this.value ? placeholder : this.valueWithCursor) : ""; - - const textView = `${color.cyan("?")} Filter: ` + value + "\n"; - - const noResults = color.red(t.AUTOCOMPLETE_NO_RESULTS); - - let uniqueGroups = new Set(); - let start = Math.max(0, this.cursor - 11); - const filteredOptions = this.filteredOptions - .map((option, i) => { - if (i < start || i > start + 11) return; - - const selected = this.selected.find((v) => v.value === option.value) !== undefined; - const has = option.group && uniqueGroups.has(option.group); - if (!has && option.group) { - uniqueGroups.add(option.group); - } - - const isFocused = this.cursor === i; - - const active = (i === 0 && this.mode === "search") || (this.mode === "explore" && isFocused); - const state = selected ? "selected" : active ? "active" : "inactive"; - - const spacing = i > 9 ? " " : " "; - - const groupView = `${ - has || !option.group ? "" : `\n${color.cyan(S_BAR)}${color.bgBlue(color.black(option.group))}` - } ${!has && option.group ? `\n${color.cyan(S_BAR)} ` : ""}`; - - return groupView + `${i}:${spacing}` + (isFocused ? color.bgBlack(opt(option, state)) : opt(option, state)); - }) - .filter(Boolean) - .join(`\n${color.cyan(S_BAR)} `); - - // prettier-ignore - const options = `${color.cyan(S_BAR)} ${this.filteredOptions.length ? filteredOptions : noResults}\n${color.cyan(S_BAR_END,)}\n`; - - return ( - `${color.cyan(S_BAR)} \n ${color.cyan(S_BAR)} ${color.yellow(S_CHECKBOX_SELECTED)} ${ - t.AUTOCOMPLETE_SELECTED - }: ${selected}\n${color.cyan(S_BAR)} \n` + - (this.mode === "search" ? `${color.cyan(S_BAR)} ` + textView : "") + - options + - "\n" + - (this.mode === "search" ? searchInstructions : instructions) - ); - }, - }).prompt() as Promise; -}; diff --git a/packages/ui/src/components/autocomplete/utils.ts b/packages/ui/src/components/autocomplete/utils.ts deleted file mode 100644 index 78c579f..0000000 --- a/packages/ui/src/components/autocomplete/utils.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { log } from "@clack/prompts"; -import color from "picocolors"; -// Taken from https://github.com/natemoo-re/clack/blob/main/packages/prompts/src/index.ts#L642 -const S_STEP_ACTIVE = "◆"; -const S_STEP_CANCEL = "■"; -const S_STEP_ERROR = "▲"; -const S_STEP_SUBMIT = "◇"; - -const S_BAR_START = "┌"; -const S_BAR = "│"; -const S_BAR_END = "└"; - -const S_RADIO_ACTIVE = "●"; -const S_RADIO_INACTIVE = "○"; -const S_CHECKBOX_ACTIVE = "◻"; -const S_CHECKBOX_SELECTED = "◼"; -const S_CHECKBOX_INACTIVE = "◻"; -const S_PASSWORD_MASK = "▪"; - -const S_BAR_H = "─"; -const S_CORNER_TOP_RIGHT = "╮"; -const S_CONNECT_LEFT = "├"; -const S_CORNER_BOTTOM_RIGHT = "╯"; - -const S_INFO = "●"; -const S_SUCCESS = "◆"; -const S_WARN = "▲"; -const S_ERROR = "■"; - -// Adapted from https://github.com/chalk/ansi-regex -// @see LICENSE -function ansiRegex() { - const pattern = [ - "[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", - "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))", - ].join("|"); - - return new RegExp(pattern, "g"); -} - -const strip = (str: string) => str.replace(ansiRegex(), ""); -const box = (message = "", title = "") => { - const lines = `\n${message}\n`.split("\n"); - const len = - Math.max( - lines.reduce((sum, ln) => { - ln = strip(ln); - return ln.length > sum ? ln.length : sum; - }, 0), - strip(title).length, - ) + 2; - const msg = lines - .map((ln) => `${color.gray(S_BAR)} ${color.dim(ln)}${" ".repeat(len - strip(ln).length)}${color.gray(S_BAR)}`) - .join("\n"); - return `${color.gray(S_BAR)}\n${color.green(S_STEP_SUBMIT)} ${color.reset(title)} ${color.gray( - S_BAR_H.repeat(Math.max(len - title.length - 1, 1)) + S_CORNER_TOP_RIGHT, - )}\n${msg}\n${color.gray(S_CONNECT_LEFT + S_BAR_H.repeat(len + 2) + S_CORNER_BOTTOM_RIGHT)}\n`; -}; - -export { - S_CONNECT_LEFT, - S_CORNER_BOTTOM_RIGHT, - S_CORNER_TOP_RIGHT, - S_BAR, - S_BAR_START, - S_BAR_END, - S_BAR_H, - S_INFO, - S_ERROR, - S_WARN, - S_SUCCESS, - S_RADIO_ACTIVE, - S_RADIO_INACTIVE, - S_PASSWORD_MASK, - S_CHECKBOX_ACTIVE, - S_CHECKBOX_INACTIVE, - S_CHECKBOX_SELECTED, - S_STEP_ACTIVE, - S_STEP_ERROR, - S_STEP_CANCEL, - S_STEP_SUBMIT, -}; - -const cancelable = async (prompt: Promise, cancelMessage: string = "Canceled"): Promise => { - const value = await prompt; - - if (typeof value === "symbol") { - log.warn(cancelMessage); - process.exit(0); - } - - return value; -}; - -export { strip, box, cancelable }; diff --git a/packages/ui/src/components/form/index.ts b/packages/ui/src/components/form/index.ts deleted file mode 100644 index fc11479..0000000 --- a/packages/ui/src/components/form/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { TextOptions, text } from "@clack/prompts"; - -interface Field extends TextOptions { - name: string; - render?: (this: Field) => Promise; -} - -export const form = async (fields: Field[]) => { - let returns: { name: string; value: any }[] = []; - - for (const field of fields) { - if (field.render) { - const r = await field.render.bind(field)(); - if (r) { - returns.push({ name: field.name, value: r }); - } - continue; - } - - const r = await text({ ...field }); - - returns.push({ name: field.name, value: r }); - } - - return returns; -}; diff --git a/packages/ui/src/components/spinnerify/index.ts b/packages/ui/src/components/spinnerify/index.ts deleted file mode 100644 index 7205636..0000000 --- a/packages/ui/src/components/spinnerify/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { spinner } from "@clack/prompts"; -type SpinnerItem = { - startText: string; - finishText: string; - fn: () => Promise; -}; -export async function spinnerify(spinners: SpinnerItem): Promise; -export async function spinnerify(spinners: SpinnerItem[]): Promise; -export async function spinnerify(spinners: SpinnerItem[] | SpinnerItem) { - if (!Array.isArray(spinners)) spinners = [spinners]; - let results: any[] = []; - const s = spinner(); - for (const { startText, finishText, fn } of spinners) { - s.start(startText); - results.push(await fn()); - s.stop(finishText); - } - return results.length === 1 ? results[0] : results; -} diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts deleted file mode 100644 index 083c425..0000000 --- a/packages/ui/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./components/autocomplete"; -export * from "./components/form"; -export * from "./components/autocomplete/utils"; -export * from "./components/spinnerify"; diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json deleted file mode 100644 index ecaf1e3..0000000 --- a/packages/ui/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "skipLibCheck": true, - "declaration": true, - "emitDeclarationOnly": true, - "moduleResolution": "Bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "allowSyntheticDefaultImports": true, - "strict": true, - // "noUnusedLocals": true, - // "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "outDir": "types" - }, - "include": ["src/*"] -} diff --git a/packages/ui/tsup.config.ts b/packages/ui/tsup.config.ts deleted file mode 100644 index aaf7a65..0000000 --- a/packages/ui/tsup.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: ["src/index.ts"], - target: "esnext", - format: ["esm", "cjs"], - splitting: false, - sourcemap: true, - minify: true, - clean: true, -}); diff --git a/packages/utils/src/cmd-ts/index.ts b/packages/utils/src/cmd-ts/index.ts deleted file mode 100644 index 1896305..0000000 --- a/packages/utils/src/cmd-ts/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./oneOf"; diff --git a/packages/utils/src/cmd-ts/oneOf.ts b/packages/utils/src/cmd-ts/oneOf.ts deleted file mode 100644 index 79fabcb..0000000 --- a/packages/utils/src/cmd-ts/oneOf.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Type } from "cmd-ts"; -import { inspect } from "util"; - -export function oneOf(literals: readonly T[], case_sensitive: boolean = false): Type { - const examples = literals.map((x) => inspect(x)).join(", "); - return { - async from(str) { - const value = literals.find((x) => (case_sensitive ? x === str : x.toLowerCase() === str.toLowerCase())); - if (!value) { - throw new Error(`Invalid value '${str}'. Expected one of: ${examples}`); - } - return value; - }, - description: `One of ${examples}`, - }; -} diff --git a/packages/utils/src/config/index.ts b/packages/utils/src/config/index.ts deleted file mode 100644 index 9f095d2..0000000 --- a/packages/utils/src/config/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { readFile, writeFile } from "fs/promises"; -import { homedir } from "../paths"; -import { join } from "path"; -import { parse, stringify } from "smol-toml"; -import { createSignal } from "@solid-cli/reactivity"; - -export const PossibleFields = ["lang"] as const; - -const defaultConfig = { - lang: Intl.DateTimeFormat().resolvedOptions().locale.split("-")[0], -} as Record; - -type Field = (typeof PossibleFields)[number]; - -const configPath: string = join(homedir(), "/solid-cli.config.toml"); - -export const [config, setConfig] = createSignal(defaultConfig); - -export const readConfig = async () => { - try { - const file = await readFile(configPath, "utf-8"); - setConfig(parse(file)); - } catch { - await writeConfig(); - } -}; - -export const writeConfig = async () => { - await writeFile(configPath, stringify(config())); -}; - -export const setField = async (field: Field, value: any) => { - if (!(field in defaultConfig)) { - throw new Error(`Field ${field} does not exist`); - } - setConfig((prev) => ({ ...prev, [field]: value })); - await writeConfig(); -}; - -export const getField = (field: Field) => { - if (!config()[field] && defaultConfig[field]) setField(field, defaultConfig[field]); - return config()[field]; -}; diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 1310c11..b8f0dc1 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,5 +1,2 @@ -export * from "./translations"; -export * from "./config"; export * from "./start"; export * from "./open"; -export * from "./cmd-ts"; diff --git a/packages/utils/src/primitives/index.ts b/packages/utils/src/primitives/index.ts deleted file mode 100644 index 571269a..0000000 --- a/packages/utils/src/primitives/index.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { tmpdir } from "../paths"; -import type { Option } from "../util-types"; -import { createSignal } from "@solid-cli/reactivity"; -import { readFile, writeFile } from "fs/promises"; -export const [primitives, setPrimitives] = createSignal([]); -const fetchPrimitives = async () => { - const result = await ( - await fetch("https://registry.npmjs.com/-/v1/search?text=scope:solid-primitives&size=250.json") - ).json(); - - const primitives: Option[] = result.objects.map((v: any) => { - const opt: Option = { - label: v.package.name.split("/")[1], - value: v.package.name, - group: "primitives", - }; - - return opt; - }); - - return primitives; -}; -type Cache = { - timeCached: string; - primitives: Option[]; -}; -const cache = async (primitives: Option[]) => { - const tmp = tmpdir(); - const t = new Date(); - const cache: Cache = { - timeCached: t.toUTCString(), - primitives, - }; - await writeFile(`${tmp}/primitives.json`, JSON.stringify(cache)); -}; -const daysSinceEpoch = (seconds: number) => { - return seconds / (60 * 60 * 24); -}; -const getCached = async () => { - const tmp = tmpdir(); - const cached = JSON.parse((await readFile(`${tmp}/primitives.json`)).toString()) as Cache; - const timeCached = new Date(Date.parse(cached.timeCached)); - const currentTime = new Date(); - if (daysSinceEpoch(currentTime.getTime() - timeCached.getTime()) > 1) { - throw new Error("Stale cache"); - } - return cached.primitives as Option[]; -}; -export const refetchPrimitives = async () => { - const p = await fetchPrimitives(); - setPrimitives(p); - await cache(p); -}; -export const loadPrimitives = async () => { - try { - const cached = await getCached(); - setPrimitives(cached); - } catch (e) { - // Cannot fetch from cache, must fetch - await refetchPrimitives(); - } -}; diff --git a/packages/utils/src/translations/index.ts b/packages/utils/src/translations/index.ts deleted file mode 100644 index 77ffa7b..0000000 --- a/packages/utils/src/translations/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./translations"; diff --git a/packages/utils/src/translations/translations.ts b/packages/utils/src/translations/translations.ts deleted file mode 100644 index 7ca1614..0000000 --- a/packages/utils/src/translations/translations.ts +++ /dev/null @@ -1,354 +0,0 @@ -import { createEffect, createMemo, createSignal } from "@solid-cli/reactivity"; -import { SL, SupportedLanguages, TemplateFunction, Translations } from "./types"; -import { on } from "@solid-cli/reactivity"; -import { log } from "@clack/prompts"; -import { config, setConfig } from "../config"; -export const [locale, setLocale] = createSignal(null); -export const validatedLocale = createMemo(() => { - const l = locale(); - if (!l) return "en"; - const supported = !!SupportedLanguages.find((lang) => lang.toLowerCase() === l.toLowerCase()); - if (!supported) { - log.warn(`Unsupported language: ${l}. Defaulting to English.`); - } - return supported ? l : "en"; -}); -createEffect( - on( - validatedLocale, - (l) => { - setConfig({ ...config(), lang: l }); - }, - { defer: true }, - ), -); -const TRANSLATIONS = { - AUTOCOMPLETE_SELECTED: { - en: "Selected Packages", - es: "Paquetes seleccionados", - fr: "Forfaits sélectionnés", - ja: "選択されたパッケージ", - }, - AUTOCOMPLETE_NO_RESULTS: { - en: "No results", - es: "No hay resultados", - fr: "Aucun résultat", - ja: "結果がありません", - }, - SELECT_START_ACTION: { - en: "Select a SolidStart specific action", - es: "Seleccione una acción específica de SolidStart", - fr: "Sélectionnez une action spécifique à SolidStart", - ja: "SolidStart 固有のアクションを選択します", - }, - SELECT_ACTION: { - en: "Select an action", - es: "Seleccione una acción", - fr: "Sélectionnez une action", - ja: "アクションを選択してください", - }, - ACTION_ADD: { - en: "Add an integration", - es: "Añadir una integración", - fr: "Ajouter une intégration", - ja: "統合を追加する", - }, - ACTION_NEW: { - en: "Create new project", - es: "Crear nuevo proyecto", - fr: "Créer un nouveau projet", - ja: "新しいプロジェクトを作成する", - }, - ACTION_START: { - en: "A start specific action", - es: "Una acción específica de inicio", - fr: "Une action spécifique de démarrage", - ja: "特定のアクションを開始する", - }, - NEW_VARIATION_DESC: { - en: "The variation to create, for example `bare`", - es: "La variación a crear, por ejemplo `bare`", - fr: "La variante à créer, par exemple `bare`", - ja: "作成するバリエーション、たとえば「bare」", - }, - NEW_NAME_DESC: { - en: "The name of the folder to create", - es: "El nombre de la carpeta a crear.", - fr: "Le nom du dossier à créer", - ja: "作成するフォルダーの名前", - }, - IS_START_PROJECT: { - en: "Is this a SolidStart project?", - es: "¿Es este un proyecto de SolidStart?", - fr: "Est-ce un projet SolidStart?", - ja: "これはソリッドスタートプロジェクトですか?", - }, - START_MODE: { - en: "Mode", - es: "Modo", - fr: "Mode", - ja: "モード", - }, - START_MODE_HINT: { - en: "Changes the mode of the solid app (SSR, CSR, SSG)", - es: "Cambia el modo de la aplicación sólida (SSR, CSR, SSG)", - fr: "Modifie le mode de l'application solide (SSR, CSR, SSG)", - ja: "ソリッドアプリのモードを変更します(SSR、CSR、SSG)", - }, - START_MODE_DESC: { - en: "The rendering mode for solid to build for, and use.", - es: "El modo de renderizado de solid para construir y usar.", - fr: "Le mode de rendu du solid pour lequel construire et utiliser.", - ja: "solid がビルドして使用するレンダリング モード。", - }, - START_ROUTE: { - en: "Route", - es: "Ruta", - fr: "Itinéraire", - ja: "ルート", - }, - START_ROUTE_HINT: { - en: "Allows you to create a new file system route", - es: "Le permite crear una nueva ruta de sistema de archivos", - fr: "Vous permet de créer une nouvelle route de système de fichiers", - ja: "新しいファイル システム ルートを作成できます。", - }, - START_ROUTE_DESC: { - en: "The name of `.tsx` file to be generated", - es: "El nombre del archivo `.tsx` que se generará", - fr: "Le nom du fichier `.tsx` à générer", - ja: "生成される `.tsx` ファイルの名前", - }, - START_DATA: { - en: "Data File", - es: "Archivo de datos", - fr: "Fichier de données", - ja: "データファイル", - }, - START_DATA_HINT: { - en: "Allows you to create a new data file within a route", - es: "Le permite crear un nuevo archivo de datos dentro de una ruta", - fr: "Permet de créer un nouveau fichier de données au sein d'un itinéraire", - ja: "ルート内に新しいデータ ファイルを作成できます。", - }, - START_DATA_DESC: { - en: "The name of the `.data.ts` file to be generated.", - es: "El nombre del archivo `.data.ts` que se generará.", - fr: "Le nom du fichier `.data.ts` à générer.", - ja: "生成される `.data.ts` ファイルの名前。", - }, - START_ADAPTER: { - en: "Adapter", - es: "Adaptador", - fr: "Adaptateur", - ja: "アダプタ", - }, - START_ADAPTER_HINT: { - en: "Allows for setting and updating the adapter used to build a start app", - es: "Permite configurar y actualizar el adaptador utilizado para crear una aplicación de inicio", - fr: "Permet de définir et de mettre à jour l'adaptateur utilisé pour créer une application de démarrage", - ja: "スタートアプリの構築に使用されるアダプターの設定と更新が可能", - }, - START_ADAPTER_DISPLAYNAME: { - en: "Adapter name", - es: "Nombre del adaptador", - fr: "Nom de l'adaptateur", - ja: "アダプター名", - }, - START_API: { - en: "API", - es: "API", - fr: "API", - ja: "API", - }, - START_API_HINT: { - en: "Create an API route", - es: "Crear una ruta API", - fr: "Créer une route d'API", - ja: "APIルートを作成する", - }, - START_API_DISPLAYNAME: { - en: "API file name", - es: "Nombre de archivo API", - fr: "Nom du fichier API", - ja: "APIファイル名", - }, - CANCELED: { - en: "Canceled", - es: "Cancelado", - fr: "Annulé", - ja: "キャンセル", - }, - CONFIRM_INSTALL: (n: number) => ({ - en: `Install the following (${n}) packages?`, - es: `Instale lo siguiente (${n}) paquetes?`, - fr: `Installez les éléments suivants (${n}) paquets?`, - ja: `以下をインストールします (${n}) パッケージ?`, - }), - NEW_START: { - en: "Which template would you like to use?", - es: "¿Qué plantilla te gustaría usar?", - fr: "Quel modèle souhaitez-vous utiliser ?", - ja: "どのテンプレートを使いたいですか?", - }, - ADD_DESC: { - en: "Can add and install integrations: `solid add unocss`.", - es: "Puede agregar e instalar integraciones: `solid add unocss`.", - fr: "Peut ajouter et installer des intégrations : `solid add unocss`.", - ja: "統合を追加およびインストールできます: `solid add unocss`。", - }, - NEW_DESC: { - en: "Creates a new solid project", - es: "Crea un nuevo proyecto sólido.", - fr: "Crée un nouveau projet solide", - ja: "新しいソリッドプロジェクトを作成します", - }, - ADD_PACKAGES: { - en: "Add packages", - es: "Agregar paquetes", - fr: "Ajouter des forfaits", - ja: "パッケージの追加", - }, - NOTHING_SELECTED: { - en: "Nothing selected", - es: "Nada seleccionado", - fr: "Rien de sélectionné", - ja: "何も選択されていません", - }, - YES: { - en: "Yes", - es: "Sí", - fr: "Oui", - ja: "はい", - }, - NO: { - en: "No", - es: "No", - fr: "Non", - ja: "いいえ", - }, - YES_FORCE: { - en: "Yes (force)", - es: "Sí (fuerza)", - fr: "Oui (forcer)", - ja: "はい(強制)", - }, - PROJECT_CREATED: { - en: "Project successfully created! 🎉", - es: "¡Proyecto creado con éxito! 🎉", - fr: "Projet créé avec succès! 🎉", - ja: "プロジェクトが正常に作成されました。 🎉", - }, - CREATING_PROJECT: { - en: "Creating project", - es: "Creando proyecto", - fr: "Création de projet", - ja: "プロジェクトの作成", - }, - TEMPLATE: { - en: "Template", - es: "Plantilla", - fr: "Modèle", - ja: "レンプレート", - }, - GET_STARTED: { - en: "To get started, run:", - es: "Para empezar, ejecuta:", - fr: "Pour commencer, exécutez :", - ja: "開始するには、次を実行します。", - }, - PROJECT_NAME: { - en: "Project Name", - es: "Nombre del proyecto", - fr: "nom du projet", - ja: "プロジェクト名", - }, - LOADING_PRIMITIVES: { - en: "Loading primitives", - es: "Cargando primitivas", - fr: "Chargement des primitives", - ja: "プリミティブのロード", - }, - PRIMITIVES_LOADED: { - en: "Primitives loaded", - es: "Primitivos cargados", - fr: "Primitives chargées", - ja: "プリミティブがロードされました", - }, - INSTALLING_VIA: (pm: string) => ({ - en: `Installing packages via ${pm}`, - es: `Instalación de paquetes a través de ${pm}`, - fr: `Installation de packages via ${pm}`, - ja: `経由でパッケージをインストールする ${pm}`, - }), - CONFIG_UPDATED: { - en: "Config updated", - es: "Configuración actualizada", - fr: "Configuration mise à jour", - ja: "構成が更新されました", - }, - PACKAGES_INSTALLED: { - en: "Packages installed", - es: "Paquetes instalados", - fr: "Paquets installés", - ja: "インストールされたパッケージ", - }, - POST_INSTALL: { - en: "Running post install steps", - es: "Ejecución de pasos posteriores a la instalación", - fr: "Exécution des étapes de post-installation", - ja: "インストール後の手順の実行", - }, - POST_INSTALL_COMPLETE: { - en: "Post install complete", - es: "Post instalación completa", - fr: "Post-installation terminée", - ja: "インストール後の完了", - }, - NO_SUPPORT: (n: string) => ({ - en: `Can't automatically configure ${n}: we don't support it.`, - es: `No se puede configurar automáticamente ${n}: no lo admitimos`, - fr: `Impossible de configurer automatiquement ${n}: nous ne le prenons pas en charge`, - ja: `${n} を自動的に構成できません: サポートされていません`, - }), - OPENING_IN_BROWSER: (s: string) => ({ - en: `Opening ${s} in browser`, - es: `Abriendo ${s} en el navegador`, - fr: `Ouverture de ${s} dans le navigateur`, - ja: `ブラウザで ${s} を開く`, - }), - OPENED_IN_BROWSER: { - en: "Successfully Opened in Browser", - es: "Abierto con éxito en el navegador", - fr: "Ouvert avec succès dans le navigateur", - ja: "ブラウザで正常に開きました", - }, -} as const satisfies Translations; - -export const t = new Proxy(TRANSLATIONS, { - get(target, p, _receiver) { - const l = validatedLocale() as SL; - let text = target[p as keyof typeof target]; - - if (typeof text === "function") { - return new Proxy(text, { - apply(target, thisArg, argArray) { - const newT = Reflect.apply(target, thisArg, argArray); - if (l in newT) { - return newT[l]; - } - return newT["en"]; - }, - }); - } - - if (l in text) { - return text[l as keyof typeof text]; - } - return text["en"]; - }, -}) as unknown as { - [k in keyof typeof TRANSLATIONS]: (typeof TRANSLATIONS)[k] extends TemplateFunction - ? (...args: Parameters<(typeof TRANSLATIONS)[k]>) => string - : string; -}; diff --git a/packages/utils/src/translations/types.ts b/packages/utils/src/translations/types.ts deleted file mode 100644 index 26eba3b..0000000 --- a/packages/utils/src/translations/types.ts +++ /dev/null @@ -1,6 +0,0 @@ -export const SupportedLanguages = ["en", "fr", "es", "de", "ru", "zh", "ja", "ko"] as const; -export type SL = (typeof SupportedLanguages)[number]; - -export type LanguageTranslations = Partial>; -export type TemplateFunction = (...args: any[]) => LanguageTranslations; -export type Translations = Record; diff --git a/packages/utils/src/util-types/index.ts b/packages/utils/src/util-types/index.ts deleted file mode 100644 index 45e9400..0000000 --- a/packages/utils/src/util-types/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type Option = { - value: any; - label?: string; - hint?: string; - group?: string; -}; From da5349bed50a7b3d014c843c169efaf7042691e6 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 00:55:30 +0000 Subject: [PATCH 10/35] chore: update deps --- package.json | 10 +- packages/create-solid/package.json | 8 +- packages/utils/package.json | 16 +- pnpm-lock.yaml | 874 ++++++++++++----------------- 4 files changed, 373 insertions(+), 535 deletions(-) diff --git a/package.json b/package.json index 04c27b1..55a3ba3 100644 --- a/package.json +++ b/package.json @@ -34,11 +34,11 @@ "./packages/*" ], "devDependencies": { - "@changesets/cli": "2.27.9", - "nodemon": "^3.1.7", - "prettier": "^3.3.3", - "turbo": "^2.2.3", - "vitest": "^2.1.5" + "@changesets/cli": "2.27.11", + "nodemon": "^3.1.9", + "prettier": "^3.4.2", + "turbo": "^2.3.3", + "vitest": "^3.0.2" }, "packageManager": "pnpm@9.6.0" } diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index f31fb09..3d07c1d 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -30,14 +30,12 @@ }, "devDependencies": { "@clack/prompts": "0.9.1", - "@solid-cli/commands": "workspace:*", - "@solid-cli/ui": "workspace:*", - "@types/node": "^22.9.0", + "@types/node": "^22.10.7", "cmd-ts": "^0.13.0", - "jiti": "^2.4.0", + "jiti": "^2.4.2", "picocolors": "^1.1.1", "tsup": "^8.3.5", - "typescript": "^5.6.3", + "typescript": "^5.7.3", "@begit/core": "^0.1.1", "citty": "^0.1.6", "sucrase": "^3.35.0" diff --git a/packages/utils/package.json b/packages/utils/package.json index eefd3f6..6c0ceb5 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -63,22 +63,22 @@ }, "devDependencies": { "@chialab/esbuild-plugin-meta-url": "^0.18.2", - "@types/node": "22.9.0", - "jiti": "^2.4.0", + "@types/node": "22.10.7", + "jiti": "^2.4.2", "magicast": "^0.3.5", "tsup": "^8.3.5", - "typescript": "^5.6.3", - "vitest": "^2.1.5" + "typescript": "^5.7.3", + "vitest": "^3.0.2" }, "publishConfig": { "access": "public" }, "dependencies": { - "@clack/core": "0.3.4", - "@clack/prompts": "0.7.0", + "@clack/core": "0.4.1", + "@clack/prompts": "0.9.1", "cmd-ts": "^0.13.0", - "execa": "^8.0.1", + "execa": "^9.5.2", "picocolors": "^1.1.1", - "smol-toml": "^1.3.0" + "smol-toml": "^1.3.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index faaaaf3..eec75b4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,109 +9,20 @@ importers: .: devDependencies: '@changesets/cli': - specifier: 2.27.9 - version: 2.27.9 + specifier: 2.27.11 + version: 2.27.11 nodemon: - specifier: ^3.1.7 - version: 3.1.7 + specifier: ^3.1.9 + version: 3.1.9 prettier: - specifier: ^3.3.3 - version: 3.3.3 + specifier: ^3.4.2 + version: 3.4.2 turbo: - specifier: ^2.2.3 - version: 2.2.3 + specifier: ^2.3.3 + version: 2.3.3 vitest: - specifier: ^2.1.5 - version: 2.1.5(@types/node@22.9.0) - - packages/commands: - dependencies: - '@begit/core': - specifier: ^0.0.19 - version: 0.0.19 - '@clack/prompts': - specifier: 0.7.0 - version: 0.7.0 - '@solid-cli/ui': - specifier: workspace:* - version: link:../ui - '@solid-cli/utils': - specifier: workspace:* - version: link:../utils - execa: - specifier: ^8.0.1 - version: 8.0.1 - picocolors: - specifier: ^1.1.1 - version: 1.1.1 - sucrase: - specifier: ^3.35.0 - version: 3.35.0 - devDependencies: - '@chialab/esbuild-plugin-meta-url': - specifier: ^0.18.2 - version: 0.18.2 - '@types/node': - specifier: ^22.9.0 - version: 22.9.0 - prettier: - specifier: ^3.3.3 - version: 3.3.3 - tsup: - specifier: ^8.3.5 - version: 8.3.5(@swc/core@1.5.5)(jiti@2.4.0)(postcss@8.4.38)(typescript@5.6.3) - typescript: - specifier: ^5.6.3 - version: 5.6.3 - - packages/core: - dependencies: - '@clack/core': - specifier: 0.3.4 - version: 0.3.4 - '@clack/prompts': - specifier: 0.7.0 - version: 0.7.0 - '@solid-cli/commands': - specifier: workspace:* - version: link:../commands - '@solid-cli/ui': - specifier: workspace:* - version: link:../ui - '@solid-cli/utils': - specifier: workspace:* - version: link:../utils - cmd-ts: - specifier: ^0.13.0 - version: 0.13.0 - execa: - specifier: ^8.0.1 - version: 8.0.1 - picocolors: - specifier: ^1.1.1 - version: 1.1.1 - smol-toml: - specifier: ^1.3.0 - version: 1.3.0 - tiny-updater: - specifier: ^3.5.2 - version: 3.5.2 - devDependencies: - '@chialab/esbuild-plugin-meta-url': - specifier: ^0.18.2 - version: 0.18.2 - '@types/node': - specifier: ^22.9.0 - version: 22.9.0 - jiti: - specifier: ^2.4.0 - version: 2.4.0 - tsup: - specifier: ^8.3.5 - version: 8.3.5(@swc/core@1.5.5)(jiti@2.4.0)(postcss@8.4.38)(typescript@5.6.3) - typescript: - specifier: ^5.6.3 - version: 5.6.3 + specifier: ^3.0.2 + version: 3.0.2(@types/node@22.10.7) packages/create-solid: devDependencies: @@ -121,15 +32,9 @@ importers: '@clack/prompts': specifier: 0.9.1 version: 0.9.1 - '@solid-cli/commands': - specifier: workspace:* - version: link:../commands - '@solid-cli/ui': - specifier: workspace:* - version: link:../ui '@types/node': - specifier: ^22.9.0 - version: 22.9.0 + specifier: ^22.10.7 + version: 22.10.7 citty: specifier: ^0.1.6 version: 0.1.6 @@ -137,8 +42,8 @@ importers: specifier: ^0.13.0 version: 0.13.0 jiti: - specifier: ^2.4.0 - version: 2.4.0 + specifier: ^2.4.2 + version: 2.4.2 picocolors: specifier: ^1.1.1 version: 1.1.1 @@ -147,78 +52,53 @@ importers: version: 3.35.0 tsup: specifier: ^8.3.5 - version: 8.3.5(@swc/core@1.5.5)(jiti@2.4.0)(postcss@8.4.38)(typescript@5.6.3) + version: 8.3.5(@swc/core@1.5.5)(jiti@2.4.2)(postcss@8.4.38)(typescript@5.7.3) typescript: - specifier: ^5.6.3 - version: 5.6.3 - - packages/ui: - dependencies: - '@clack/core': - specifier: 0.3.4 - version: 0.3.4 - '@clack/prompts': - specifier: 0.7.0 - version: 0.7.0 - '@solid-cli/utils': - specifier: workspace:* - version: link:../utils - picocolors: - specifier: ^1.1.1 - version: 1.1.1 - devDependencies: - '@types/node': - specifier: 22.9.0 - version: 22.9.0 - tsup: - specifier: ^8.3.5 - version: 8.3.5(@swc/core@1.5.5)(jiti@2.4.0)(postcss@8.4.38)(typescript@5.6.3) - typescript: - specifier: ^5.6.3 - version: 5.6.3 + specifier: ^5.7.3 + version: 5.7.3 packages/utils: dependencies: '@clack/core': - specifier: 0.3.4 - version: 0.3.4 + specifier: 0.4.1 + version: 0.4.1 '@clack/prompts': - specifier: 0.7.0 - version: 0.7.0 + specifier: 0.9.1 + version: 0.9.1 cmd-ts: specifier: ^0.13.0 version: 0.13.0 execa: - specifier: ^8.0.1 - version: 8.0.1 + specifier: ^9.5.2 + version: 9.5.2 picocolors: specifier: ^1.1.1 version: 1.1.1 smol-toml: - specifier: ^1.3.0 - version: 1.3.0 + specifier: ^1.3.1 + version: 1.3.1 devDependencies: '@chialab/esbuild-plugin-meta-url': specifier: ^0.18.2 version: 0.18.2 '@types/node': - specifier: 22.9.0 - version: 22.9.0 + specifier: 22.10.7 + version: 22.10.7 jiti: - specifier: ^2.4.0 - version: 2.4.0 + specifier: ^2.4.2 + version: 2.4.2 magicast: specifier: ^0.3.5 version: 0.3.5 tsup: specifier: ^8.3.5 - version: 8.3.5(@swc/core@1.5.5)(jiti@2.4.0)(postcss@8.4.38)(typescript@5.6.3) + version: 8.3.5(@swc/core@1.5.5)(jiti@2.4.2)(postcss@8.4.38)(typescript@5.7.3) typescript: - specifier: ^5.6.3 - version: 5.6.3 + specifier: ^5.7.3 + version: 5.7.3 vitest: - specifier: ^2.1.5 - version: 2.1.5(@types/node@22.9.0) + specifier: ^3.0.2 + version: 3.0.2(@types/node@22.10.7) packages: @@ -243,27 +123,24 @@ packages: resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} - '@begit/core@0.0.19': - resolution: {integrity: sha512-3ypq3vJQ+PzYVi53HRkAtwdtVXTjyXjo1UzTkD75Qr9YIoacYsSy9gAdbwktfNKgTLyc1nU83W1D3SEw9kgBBA==} - '@begit/core@0.1.1': resolution: {integrity: sha512-uxooRorqP8Xv20jf/X+nhkbDIiEodl/oXwep5gNat7ccQnlu6oG/PxepcsOyvwonL9x0ZDEmP46fC5Uhu2fivA==} - '@changesets/apply-release-plan@7.0.5': - resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} + '@changesets/apply-release-plan@7.0.7': + resolution: {integrity: sha512-qnPOcmmmnD0MfMg9DjU1/onORFyRpDXkMMl2IJg9mECY6RnxL3wN0TCCc92b2sXt1jt8DgjAUUsZYGUGTdYIXA==} - '@changesets/assemble-release-plan@6.0.4': - resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} + '@changesets/assemble-release-plan@6.0.5': + resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} '@changesets/changelog-git@0.2.0': resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - '@changesets/cli@2.27.9': - resolution: {integrity: sha512-q42a/ZbDnxPpCb5Wkm6tMVIxgeI9C/bexntzTeCFBrQEdpisQqk8kCHllYZMDjYtEc1ZzumbMJAG8H0Z4rdvjg==} + '@changesets/cli@2.27.11': + resolution: {integrity: sha512-1QislpE+nvJgSZZo9+Lj3Lno5pKBgN46dAV8IVxKJy9wX8AOrs9nn5pYVZuDpoxWJJCALmbfOsHkyxujgetQSg==} hasBin: true - '@changesets/config@3.0.3': - resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} + '@changesets/config@3.0.5': + resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} @@ -271,14 +148,14 @@ packages: '@changesets/get-dependents-graph@2.1.2': resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} - '@changesets/get-release-plan@4.0.4': - resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} + '@changesets/get-release-plan@4.0.6': + resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@3.0.1': - resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} + '@changesets/git@3.0.2': + resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} @@ -289,8 +166,8 @@ packages: '@changesets/pre@2.0.1': resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} - '@changesets/read@0.6.1': - resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} + '@changesets/read@0.6.2': + resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} '@changesets/should-skip-package@0.1.1': resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} @@ -320,20 +197,9 @@ packages: resolution: {integrity: sha512-eV1m70Qn9pLY9xwFmZ2FlcOzwiaUywsJ7NB/ud8VB7DouvCQtIHkQ3Om7uPX0ojXGEG1LCyO96kZkvbNTxNu0Q==} engines: {node: '>=18'} - '@clack/core@0.3.3': - resolution: {integrity: sha512-5ZGyb75BUBjlll6eOa1m/IZBxwk91dooBWhPSL67sWcLS0zt9SnswRL0l26TVdBhb0wnWORRxUn//uH6n4z7+A==} - - '@clack/core@0.3.4': - resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} - '@clack/core@0.4.1': resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==} - '@clack/prompts@0.7.0': - resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} - bundledDependencies: - - is-unicode-supported - '@clack/prompts@0.9.1': resolution: {integrity: sha512-JIpyaboYZeWYlyP0H+OoPPxd6nqueG/CmN6ixBiNFsIDHREevjIf0n0Ohh5gr5C8pEDknzgvz+pIJ8dMhzWIeg==} @@ -844,6 +710,13 @@ packages: cpu: [x64] os: [win32] + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@swc/core-darwin-arm64@1.5.5': resolution: {integrity: sha512-Ol5ZwZYdTOZsv2NwjcT/qVVALKzVFeh+IJ4GNarr3P99+38Dkwi81OqCI1o/WaDXQYKAQC/V+CzMbkEuJJfq9Q==} engines: {node: '>=10'} @@ -928,37 +801,37 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.9.0': - resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} + '@types/node@22.10.7': + resolution: {integrity: sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==} - '@vitest/expect@2.1.5': - resolution: {integrity: sha512-nZSBTW1XIdpZvEJyoP/Sy8fUg0b8od7ZpGDkTUcfJ7wz/VoZAFzFfLyxVxGFhUjJzhYqSbIpfMtl/+k/dpWa3Q==} + '@vitest/expect@3.0.2': + resolution: {integrity: sha512-dKSHLBcoZI+3pmP5hiZ7I5grNru2HRtEW8Z5Zp4IXog8QYcxhlox7JUPyIIFWfN53+3HW3KPLIl6nSzUGgKSuQ==} - '@vitest/mocker@2.1.5': - resolution: {integrity: sha512-XYW6l3UuBmitWqSUXTNXcVBUCRytDogBsWuNXQijc00dtnU/9OqpXWp4OJroVrad/gLIomAq9aW8yWDBtMthhQ==} + '@vitest/mocker@3.0.2': + resolution: {integrity: sha512-Hr09FoBf0jlwwSyzIF4Xw31OntpO3XtZjkccpcBf8FeVW3tpiyKlkeUzxS/txzHqpUCNIX157NaTySxedyZLvA==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 + vite: ^5.0.0 || ^6.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@2.1.5': - resolution: {integrity: sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==} + '@vitest/pretty-format@3.0.2': + resolution: {integrity: sha512-yBohcBw/T/p0/JRgYD+IYcjCmuHzjC3WLAKsVE4/LwiubzZkE8N49/xIQ/KGQwDRA8PaviF8IRO8JMWMngdVVQ==} - '@vitest/runner@2.1.5': - resolution: {integrity: sha512-pKHKy3uaUdh7X6p1pxOkgkVAFW7r2I818vHDthYLvUyjRfkKOU6P45PztOch4DZarWQne+VOaIMwA/erSSpB9g==} + '@vitest/runner@3.0.2': + resolution: {integrity: sha512-GHEsWoncrGxWuW8s405fVoDfSLk6RF2LCXp6XhevbtDjdDme1WV/eNmUueDfpY1IX3MJaCRelVCEXsT9cArfEg==} - '@vitest/snapshot@2.1.5': - resolution: {integrity: sha512-zmYw47mhfdfnYbuhkQvkkzYroXUumrwWDGlMjpdUr4jBd3HZiV2w7CQHj+z7AAS4VOtWxI4Zt4bWt4/sKcoIjg==} + '@vitest/snapshot@3.0.2': + resolution: {integrity: sha512-h9s67yD4+g+JoYG0zPCo/cLTabpDqzqNdzMawmNPzDStTiwxwkyYM1v5lWE8gmGv3SVJ2DcxA2NpQJZJv9ym3g==} - '@vitest/spy@2.1.5': - resolution: {integrity: sha512-aWZF3P0r3w6DiYTVskOYuhBc7EMc3jvn1TkBg8ttylFFRqNN2XGD7V5a4aQdk6QiUzZQ4klNBSpCLJgWNdIiNw==} + '@vitest/spy@3.0.2': + resolution: {integrity: sha512-8mI2iUn+PJFMT44e3ISA1R+K6ALVs47W6eriDTfXe6lFqlflID05MB4+rIFhmDSLBj8iBsZkzBYlgSkinxLzSQ==} - '@vitest/utils@2.1.5': - resolution: {integrity: sha512-yfj6Yrp0Vesw2cwJbP+cl04OC+IHFsuQsrsJBL9pyGeQXE56v1UAOQco+SR55Vf1nQzfV0QJg1Qum7AaWUwwYg==} + '@vitest/utils@3.0.2': + resolution: {integrity: sha512-Qu01ZYZlgHvDP02JnMBRpX43nRaZtNpIzw3C1clDXmn8eakgX6iQVGzTQ/NjkIr64WD8ioqOjkaYRVvHQI5qiw==} abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -1022,6 +895,10 @@ packages: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + bundle-require@5.0.0: resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1087,13 +964,14 @@ packages: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -1103,8 +981,8 @@ packages: supports-color: optional: true - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1112,8 +990,8 @@ packages: supports-color: optional: true - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1154,8 +1032,8 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} @@ -1175,9 +1053,9 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@9.5.2: + resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} + engines: {node: ^18.19.0 || >=20.5.0} expect-type@1.1.0: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} @@ -1205,10 +1083,18 @@ packages: picomatch: optional: true + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -1233,9 +1119,9 @@ packages: get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -1264,9 +1150,9 @@ packages: human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + human-signals@8.0.0: + resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} + engines: {node: '>=18.18.0'} iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} @@ -1279,9 +1165,6 @@ packages: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} - ionstore@1.0.0: - resolution: {integrity: sha512-ikEvmeZFh9u5SkjKbFqJlmmhaQTulB3P7QoSoZ/xL8EDP5uj5QWbPeKcQ8ZJtszBLHRRnhIJJE8P1dhFx/oCMw==} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1302,14 +1185,22 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -1321,8 +1212,8 @@ packages: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} - jiti@2.4.0: - resolution: {integrity: sha512-H5UpaUI+aHOqZXlYOaFP/8AzKsg+guWu+Pr3Y8i7+Y3zr1aXAvCvTAQ1RxSc6oVD8R8c7brgNtTVP91E7upH/g==} + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true joycon@3.1.1: @@ -1367,22 +1258,16 @@ packages: resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} engines: {node: 14 || >=16.14} - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - magic-string@0.30.12: - resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1391,6 +1276,10 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -1399,10 +1288,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1445,8 +1330,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nodemon@3.1.7: - resolution: {integrity: sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==} + nodemon@3.1.9: + resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==} engines: {node: '>=10'} hasBin: true @@ -1458,18 +1343,14 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -1500,6 +1381,10 @@ packages: package-manager-detector@0.2.0: resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1520,8 +1405,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.2: + resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} @@ -1573,13 +1458,14 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} hasBin: true - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} @@ -1640,18 +1526,10 @@ packages: engines: {node: '>=10'} hasBin: true - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -1659,9 +1537,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -1677,8 +1552,8 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - smol-toml@1.3.0: - resolution: {integrity: sha512-tWpi2TsODPScmi48b/OQZGi2lgUmBCHy6SZrhi/FdnnHiU1GwebbCfuQuxsC3nHaLwtYeJGPrDZDIeodDOc4pA==} + smol-toml@1.3.1: + resolution: {integrity: sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==} engines: {node: '>= 18'} source-map-js@1.2.0: @@ -1689,8 +1564,8 @@ packages: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} - spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -1721,9 +1596,9 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} @@ -1738,10 +1613,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - tar@7.4.0: - resolution: {integrity: sha512-XQs0S8fuAkQWuqhDeCdMlJXDX80D7EOVLDPVFkna9yQfzS+PHKgfxcei0jf6/+QAWcjqrnC8uM3fSAnrQl+XYg==} - engines: {node: '>=18'} - tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} @@ -1757,28 +1628,25 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - tiny-colors@2.0.2: - resolution: {integrity: sha512-FYzA5Q5myp26PIZ4mx/03SreNgB1dGqcHJnj1Z8UVQ8/CBw0c6qRoPgRdk8rKpviY5diZyOmRGYMYKLYbjnmWQ==} - - tiny-updater@3.5.2: - resolution: {integrity: sha512-5EjK01h0rvgv+Eb0XaiTZJZR+ujdjCDHZ1ZCVCu+1h4+MyOYZ+za8UKuKdNOOOSKhkkC9B08o6ZhF4JnQg7ZLg==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinyexec@0.3.1: resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.10: resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} engines: {node: '>=12.0.0'} - tinypool@1.0.1: - resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} tinyspy@3.0.2: @@ -1830,58 +1698,62 @@ packages: typescript: optional: true - turbo-darwin-64@2.2.3: - resolution: {integrity: sha512-Rcm10CuMKQGcdIBS3R/9PMeuYnv6beYIHqfZFeKWVYEWH69sauj4INs83zKMTUiZJ3/hWGZ4jet9AOwhsssLyg==} + turbo-darwin-64@2.3.3: + resolution: {integrity: sha512-bxX82xe6du/3rPmm4aCC5RdEilIN99VUld4HkFQuw+mvFg6darNBuQxyWSHZTtc25XgYjQrjsV05888w1grpaA==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.2.3: - resolution: {integrity: sha512-+EIMHkuLFqUdJYsA3roj66t9+9IciCajgj+DVek+QezEdOJKcRxlvDOS2BUaeN8kEzVSsNiAGnoysFWYw4K0HA==} + turbo-darwin-arm64@2.3.3: + resolution: {integrity: sha512-DYbQwa3NsAuWkCUYVzfOUBbSUBVQzH5HWUFy2Kgi3fGjIWVZOFk86ss+xsWu//rlEAfYwEmopigsPYSmW4X15A==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.2.3: - resolution: {integrity: sha512-UBhJCYnqtaeOBQLmLo8BAisWbc9v9daL9G8upLR+XGj6vuN/Nz6qUAhverN4Pyej1g4Nt1BhROnj6GLOPYyqxQ==} + turbo-linux-64@2.3.3: + resolution: {integrity: sha512-eHj9OIB0dFaP6BxB88jSuaCLsOQSYWBgmhy2ErCu6D2GG6xW3b6e2UWHl/1Ho9FsTg4uVgo4DB9wGsKa5erjUA==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.2.3: - resolution: {integrity: sha512-hJYT9dN06XCQ3jBka/EWvvAETnHRs3xuO/rb5bESmDfG+d9yQjeTMlhRXKrr4eyIMt6cLDt1LBfyi+6CQ+VAwQ==} + turbo-linux-arm64@2.3.3: + resolution: {integrity: sha512-NmDE/NjZoDj1UWBhMtOPmqFLEBKhzGS61KObfrDEbXvU3lekwHeoPvAMfcovzswzch+kN2DrtbNIlz+/rp8OCg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.2.3: - resolution: {integrity: sha512-NPrjacrZypMBF31b4HE4ROg4P3nhMBPHKS5WTpMwf7wydZ8uvdEHpESVNMOtqhlp857zbnKYgP+yJF30H3N2dQ==} + turbo-windows-64@2.3.3: + resolution: {integrity: sha512-O2+BS4QqjK3dOERscXqv7N2GXNcqHr9hXumkMxDj/oGx9oCatIwnnwx34UmzodloSnJpgSqjl8iRWiY65SmYoQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.2.3: - resolution: {integrity: sha512-fnNrYBCqn6zgKPKLHu4sOkihBI/+0oYFr075duRxqUZ+1aLWTAGfHZLgjVeLh3zR37CVzuerGIPWAEkNhkWEIw==} + turbo-windows-arm64@2.3.3: + resolution: {integrity: sha512-dW4ZK1r6XLPNYLIKjC4o87HxYidtRRcBeo/hZ9Wng2XM/MqqYkAyzJXJGgRMsc0MMEN9z4+ZIfnSNBrA0b08ag==} cpu: [arm64] os: [win32] - turbo@2.2.3: - resolution: {integrity: sha512-5lDvSqIxCYJ/BAd6rQGK/AzFRhBkbu4JHVMLmGh/hCb7U3CqSnr5Tjwfy9vc+/5wG2DJ6wttgAaA7MoCgvBKZQ==} + turbo@2.3.3: + resolution: {integrity: sha512-DUHWQAcC8BTiUZDRzAYGvpSpGLiaOQPfYXlCieQbwUvmml/LRGIe3raKdrOPOoiX0DYlzxs2nH6BoWJoZrj8hA==} hasBin: true - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - vite-node@2.1.5: - resolution: {integrity: sha512-rd0QIgx74q4S1Rd56XIiL2cYEdyWn13cunYBIuqh9mpmQr7gGS0IxXoP8R6OaZtNQQLyXSWbd4rXKYUbhFpK5w==} - engines: {node: ^18.0.0 || >=20.0.0} + vite-node@3.0.2: + resolution: {integrity: sha512-hsEQerBAHvVAbv40m3TFQe/lTEbOp7yDpyqMJqr2Tnd+W58+DEYOt+fluQgekOePcsNBmR77lpVAnIU2Xu4SvQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true vite@5.2.10: @@ -1912,15 +1784,15 @@ packages: terser: optional: true - vitest@2.1.5: - resolution: {integrity: sha512-P4ljsdpuzRTPI/kbND2sDZ4VmieerR2c9szEZpjc+98Z9ebvnXmM5+0tHEKqYZumXqlvnmfWsjeFOjXVriDG7A==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@3.0.2: + resolution: {integrity: sha512-5bzaHakQ0hmVVKLhfh/jXf6oETDBtgPo8tQCHYB+wftNgFJ+Hah67IsWc8ivx4vFL025Ow8UiuTf4W57z4izvQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.5 - '@vitest/ui': 2.1.5 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.0.2 + '@vitest/ui': 3.0.2 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -1943,13 +1815,6 @@ packages: whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - when-exit@2.1.1: - resolution: {integrity: sha512-XLipGldz/UcleuGaoQjbYuWwD+ICRnzIjlldtwTaTWr7aZz8yQW49rXk6MHQnh+KxOiWiJpM1vIyaxprOnlW4g==} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1968,9 +1833,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -1978,6 +1840,10 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} + snapshots: '@babel/helper-string-parser@7.24.8': {} @@ -1998,19 +1864,15 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - '@begit/core@0.0.19': - dependencies: - tar: 7.4.0 - '@begit/core@0.1.1': dependencies: tar: 7.4.3 - '@changesets/apply-release-plan@7.0.5': + '@changesets/apply-release-plan@7.0.7': dependencies: - '@changesets/config': 3.0.3 + '@changesets/config': 3.0.5 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.1 + '@changesets/git': 3.0.2 '@changesets/should-skip-package': 0.1.1 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 @@ -2022,7 +1884,7 @@ snapshots: resolve-from: 5.0.0 semver: 7.6.0 - '@changesets/assemble-release-plan@6.0.4': + '@changesets/assemble-release-plan@6.0.5': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.2 @@ -2035,19 +1897,19 @@ snapshots: dependencies: '@changesets/types': 6.0.0 - '@changesets/cli@2.27.9': + '@changesets/cli@2.27.11': dependencies: - '@changesets/apply-release-plan': 7.0.5 - '@changesets/assemble-release-plan': 6.0.4 + '@changesets/apply-release-plan': 7.0.7 + '@changesets/assemble-release-plan': 6.0.5 '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.3 + '@changesets/config': 3.0.5 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.2 - '@changesets/get-release-plan': 4.0.4 - '@changesets/git': 3.0.1 + '@changesets/get-release-plan': 4.0.6 + '@changesets/git': 3.0.2 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.1 + '@changesets/read': 0.6.2 '@changesets/should-skip-package': 0.1.1 '@changesets/types': 6.0.0 '@changesets/write': 0.3.2 @@ -2063,10 +1925,10 @@ snapshots: picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.6.0 - spawndamnit: 2.0.0 + spawndamnit: 3.0.1 term-size: 2.2.1 - '@changesets/config@3.0.3': + '@changesets/config@3.0.5': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.2 @@ -2074,7 +1936,7 @@ snapshots: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - micromatch: 4.0.5 + micromatch: 4.0.8 '@changesets/errors@0.2.0': dependencies: @@ -2087,24 +1949,24 @@ snapshots: picocolors: 1.1.1 semver: 7.6.0 - '@changesets/get-release-plan@4.0.4': + '@changesets/get-release-plan@4.0.6': dependencies: - '@changesets/assemble-release-plan': 6.0.4 - '@changesets/config': 3.0.3 + '@changesets/assemble-release-plan': 6.0.5 + '@changesets/config': 3.0.5 '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.1 + '@changesets/read': 0.6.2 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@3.0.1': + '@changesets/git@3.0.2': dependencies: '@changesets/errors': 0.2.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 - micromatch: 4.0.5 - spawndamnit: 2.0.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 '@changesets/logger@0.1.1': dependencies: @@ -2122,9 +1984,9 @@ snapshots: '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.1': + '@changesets/read@0.6.2': dependencies: - '@changesets/git': 3.0.1 + '@changesets/git': 3.0.2 '@changesets/logger': 0.1.1 '@changesets/parse': 0.4.0 '@changesets/types': 6.0.0 @@ -2165,27 +2027,11 @@ snapshots: '@chialab/node-resolve@0.18.0': {} - '@clack/core@0.3.3': - dependencies: - picocolors: 1.1.1 - sisteransi: 1.0.5 - - '@clack/core@0.3.4': - dependencies: - picocolors: 1.1.1 - sisteransi: 1.0.5 - '@clack/core@0.4.1': dependencies: picocolors: 1.1.1 sisteransi: 1.0.5 - '@clack/prompts@0.7.0': - dependencies: - '@clack/core': 0.3.3 - picocolors: 1.1.1 - sisteransi: 1.0.5 - '@clack/prompts@0.9.1': dependencies: '@clack/core': 0.4.1 @@ -2502,6 +2348,10 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.26.0': optional: true + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/merge-streams@4.0.0': {} + '@swc/core-darwin-arm64@1.5.5': optional: true @@ -2563,49 +2413,49 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.9.0': + '@types/node@22.10.7': dependencies: - undici-types: 6.19.8 + undici-types: 6.20.0 - '@vitest/expect@2.1.5': + '@vitest/expect@3.0.2': dependencies: - '@vitest/spy': 2.1.5 - '@vitest/utils': 2.1.5 + '@vitest/spy': 3.0.2 + '@vitest/utils': 3.0.2 chai: 5.1.2 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 - '@vitest/mocker@2.1.5(vite@5.2.10(@types/node@22.9.0))': + '@vitest/mocker@3.0.2(vite@5.2.10(@types/node@22.10.7))': dependencies: - '@vitest/spy': 2.1.5 + '@vitest/spy': 3.0.2 estree-walker: 3.0.3 - magic-string: 0.30.12 + magic-string: 0.30.17 optionalDependencies: - vite: 5.2.10(@types/node@22.9.0) + vite: 5.2.10(@types/node@22.10.7) - '@vitest/pretty-format@2.1.5': + '@vitest/pretty-format@3.0.2': dependencies: - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 - '@vitest/runner@2.1.5': + '@vitest/runner@3.0.2': dependencies: - '@vitest/utils': 2.1.5 - pathe: 1.1.2 + '@vitest/utils': 3.0.2 + pathe: 2.0.2 - '@vitest/snapshot@2.1.5': + '@vitest/snapshot@3.0.2': dependencies: - '@vitest/pretty-format': 2.1.5 - magic-string: 0.30.12 - pathe: 1.1.2 + '@vitest/pretty-format': 3.0.2 + magic-string: 0.30.17 + pathe: 2.0.2 - '@vitest/spy@2.1.5': + '@vitest/spy@3.0.2': dependencies: tinyspy: 3.0.2 - '@vitest/utils@2.1.5': + '@vitest/utils@3.0.2': dependencies: - '@vitest/pretty-format': 2.1.5 + '@vitest/pretty-format': 3.0.2 loupe: 3.1.2 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 abbrev@1.1.1: {} @@ -2657,6 +2507,10 @@ snapshots: dependencies: fill-range: 7.0.1 + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + bundle-require@5.0.0(esbuild@0.24.0): dependencies: esbuild: 0.24.0 @@ -2726,13 +2580,13 @@ snapshots: consola@3.2.3: {} - cross-spawn@5.1.0: + cross-spawn@7.0.3: dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -2742,13 +2596,13 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.3.5(supports-color@5.5.0): + debug@4.3.7(supports-color@5.5.0): dependencies: - ms: 2.1.2 + ms: 2.1.3 optionalDependencies: supports-color: 5.5.0 - debug@4.3.7: + debug@4.4.0: dependencies: ms: 2.1.3 @@ -2775,7 +2629,7 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - es-module-lexer@1.5.4: {} + es-module-lexer@1.6.0: {} esbuild@0.20.2: optionalDependencies: @@ -2836,17 +2690,20 @@ snapshots: dependencies: '@types/estree': 1.0.5 - execa@8.0.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 + execa@9.5.2: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.0 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 signal-exit: 4.1.0 - strip-final-newline: 3.0.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 expect-type@1.1.0: {} @@ -2874,10 +2731,18 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -2905,7 +2770,10 @@ snapshots: get-func-name@2.0.2: {} - get-stream@8.0.1: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 glob-parent@5.1.2: dependencies: @@ -2936,7 +2804,7 @@ snapshots: human-id@1.0.2: {} - human-signals@5.0.0: {} + human-signals@8.0.0: {} iconv-lite@0.4.24: dependencies: @@ -2946,8 +2814,6 @@ snapshots: ignore@5.2.4: {} - ionstore@1.0.0: {} - is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 @@ -2962,12 +2828,16 @@ snapshots: is-number@7.0.0: {} - is-stream@3.0.0: {} + is-plain-obj@4.1.0: {} + + is-stream@4.0.1: {} is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 + is-unicode-supported@2.1.0: {} + is-windows@1.0.2: {} isexe@2.0.0: {} @@ -2978,7 +2848,7 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@2.4.0: {} + jiti@2.4.2: {} joycon@3.1.1: {} @@ -3013,16 +2883,11 @@ snapshots: lru-cache@10.1.0: {} - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - lru-cache@6.0.0: dependencies: yallist: 4.0.0 - magic-string@0.30.12: + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -3032,8 +2897,6 @@ snapshots: '@babel/types': 7.25.6 source-map-js: 1.2.0 - merge-stream@2.0.0: {} - merge2@1.4.1: {} micromatch@4.0.5: @@ -3041,14 +2904,17 @@ snapshots: braces: 3.0.2 picomatch: 2.3.1 + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + mime-db@1.52.0: {} mime-types@2.1.35: dependencies: mime-db: 1.52.0 - mimic-fn@4.0.0: {} - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -3082,10 +2948,10 @@ snapshots: nanoid@3.3.7: {} - nodemon@3.1.7: + nodemon@3.1.9: dependencies: chokidar: 3.6.0 - debug: 4.3.5(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 @@ -3101,16 +2967,13 @@ snapshots: normalize-path@3.0.0: {} - npm-run-path@5.3.0: + npm-run-path@6.0.0: dependencies: path-key: 4.0.0 + unicorn-magic: 0.3.0 object-assign@4.1.1: {} - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - os-tmpdir@1.0.2: {} outdent@0.5.0: {} @@ -3133,6 +2996,8 @@ snapshots: package-manager-detector@0.2.0: {} + parse-ms@4.0.0: {} + path-exists@4.0.0: {} path-key@3.1.1: {} @@ -3146,7 +3011,7 @@ snapshots: path-type@4.0.0: {} - pathe@1.1.2: {} + pathe@2.0.2: {} pathval@2.0.0: {} @@ -3160,11 +3025,11 @@ snapshots: pirates@4.0.6: {} - postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.38): + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.4.38): dependencies: lilconfig: 3.1.2 optionalDependencies: - jiti: 2.4.0 + jiti: 2.4.2 postcss: 8.4.38 postcss@8.4.38: @@ -3175,9 +3040,11 @@ snapshots: prettier@2.8.8: {} - prettier@3.3.3: {} + prettier@3.4.2: {} - pseudomap@1.0.2: {} + pretty-ms@9.2.0: + dependencies: + parse-ms: 4.0.0 pstree.remy@1.1.8: {} @@ -3264,22 +3131,14 @@ snapshots: dependencies: lru-cache: 6.0.0 - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} simple-update-notifier@2.0.0: @@ -3290,7 +3149,7 @@ snapshots: slash@3.0.0: {} - smol-toml@1.3.0: {} + smol-toml@1.3.1: {} source-map-js@1.2.0: {} @@ -3298,10 +3157,10 @@ snapshots: dependencies: whatwg-url: 7.1.0 - spawndamnit@2.0.0: + spawndamnit@3.0.1: dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 + cross-spawn: 7.0.6 + signal-exit: 4.1.0 sprintf-js@1.0.3: {} @@ -3331,7 +3190,7 @@ snapshots: strip-bom@3.0.0: {} - strip-final-newline@3.0.0: {} + strip-final-newline@4.0.0: {} sucrase@3.35.0: dependencies: @@ -3351,15 +3210,6 @@ snapshots: dependencies: has-flag: 4.0.0 - tar@7.4.0: - dependencies: - '@isaacs/fs-minipass': 4.0.0 - chownr: 3.0.0 - minipass: 7.1.2 - minizlib: 3.0.1 - mkdirp: 3.0.1 - yallist: 5.0.0 - tar@7.4.3: dependencies: '@isaacs/fs-minipass': 4.0.0 @@ -3379,26 +3229,20 @@ snapshots: dependencies: any-promise: 1.3.0 - tiny-colors@2.0.2: {} - - tiny-updater@3.5.2: - dependencies: - ionstore: 1.0.0 - tiny-colors: 2.0.2 - when-exit: 2.1.1 - tinybench@2.9.0: {} tinyexec@0.3.1: {} + tinyexec@0.3.2: {} + tinyglobby@0.2.10: dependencies: fdir: 6.4.2(picomatch@4.0.2) picomatch: 4.0.2 - tinypool@1.0.1: {} + tinypool@1.0.2: {} - tinyrainbow@1.2.0: {} + tinyrainbow@2.0.0: {} tinyspy@3.0.2: {} @@ -3424,17 +3268,17 @@ snapshots: ts-interface-checker@0.1.13: {} - tsup@8.3.5(@swc/core@1.5.5)(jiti@2.4.0)(postcss@8.4.38)(typescript@5.6.3): + tsup@8.3.5(@swc/core@1.5.5)(jiti@2.4.2)(postcss@8.4.38)(typescript@5.7.3): dependencies: bundle-require: 5.0.0(esbuild@0.24.0) cac: 6.7.14 chokidar: 4.0.1 consola: 3.2.3 - debug: 4.3.7 + debug: 4.3.7(supports-color@5.5.0) esbuild: 0.24.0 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.4.0)(postcss@8.4.38) + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.4.38) resolve-from: 5.0.0 rollup: 4.26.0 source-map: 0.8.0-beta.0 @@ -3445,55 +3289,57 @@ snapshots: optionalDependencies: '@swc/core': 1.5.5 postcss: 8.4.38 - typescript: 5.6.3 + typescript: 5.7.3 transitivePeerDependencies: - jiti - supports-color - tsx - yaml - turbo-darwin-64@2.2.3: + turbo-darwin-64@2.3.3: optional: true - turbo-darwin-arm64@2.2.3: + turbo-darwin-arm64@2.3.3: optional: true - turbo-linux-64@2.2.3: + turbo-linux-64@2.3.3: optional: true - turbo-linux-arm64@2.2.3: + turbo-linux-arm64@2.3.3: optional: true - turbo-windows-64@2.2.3: + turbo-windows-64@2.3.3: optional: true - turbo-windows-arm64@2.2.3: + turbo-windows-arm64@2.3.3: optional: true - turbo@2.2.3: + turbo@2.3.3: optionalDependencies: - turbo-darwin-64: 2.2.3 - turbo-darwin-arm64: 2.2.3 - turbo-linux-64: 2.2.3 - turbo-linux-arm64: 2.2.3 - turbo-windows-64: 2.2.3 - turbo-windows-arm64: 2.2.3 + turbo-darwin-64: 2.3.3 + turbo-darwin-arm64: 2.3.3 + turbo-linux-64: 2.3.3 + turbo-linux-arm64: 2.3.3 + turbo-windows-64: 2.3.3 + turbo-windows-arm64: 2.3.3 - typescript@5.6.3: {} + typescript@5.7.3: {} undefsafe@2.0.5: {} - undici-types@6.19.8: {} + undici-types@6.20.0: {} + + unicorn-magic@0.3.0: {} universalify@0.1.2: {} - vite-node@2.1.5(@types/node@22.9.0): + vite-node@3.0.2(@types/node@22.10.7): dependencies: cac: 6.7.14 - debug: 4.3.7 - es-module-lexer: 1.5.4 - pathe: 1.1.2 - vite: 5.2.10(@types/node@22.9.0) + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.2 + vite: 5.2.10(@types/node@22.10.7) transitivePeerDependencies: - '@types/node' - less @@ -3504,39 +3350,39 @@ snapshots: - supports-color - terser - vite@5.2.10(@types/node@22.9.0): + vite@5.2.10(@types/node@22.10.7): dependencies: esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.19.0 optionalDependencies: - '@types/node': 22.9.0 + '@types/node': 22.10.7 fsevents: 2.3.3 - vitest@2.1.5(@types/node@22.9.0): + vitest@3.0.2(@types/node@22.10.7): dependencies: - '@vitest/expect': 2.1.5 - '@vitest/mocker': 2.1.5(vite@5.2.10(@types/node@22.9.0)) - '@vitest/pretty-format': 2.1.5 - '@vitest/runner': 2.1.5 - '@vitest/snapshot': 2.1.5 - '@vitest/spy': 2.1.5 - '@vitest/utils': 2.1.5 + '@vitest/expect': 3.0.2 + '@vitest/mocker': 3.0.2(vite@5.2.10(@types/node@22.10.7)) + '@vitest/pretty-format': 3.0.2 + '@vitest/runner': 3.0.2 + '@vitest/snapshot': 3.0.2 + '@vitest/spy': 3.0.2 + '@vitest/utils': 3.0.2 chai: 5.1.2 - debug: 4.3.7 + debug: 4.4.0 expect-type: 1.1.0 - magic-string: 0.30.12 - pathe: 1.1.2 + magic-string: 0.30.17 + pathe: 2.0.2 std-env: 3.8.0 tinybench: 2.9.0 - tinyexec: 0.3.1 - tinypool: 1.0.1 - tinyrainbow: 1.2.0 - vite: 5.2.10(@types/node@22.9.0) - vite-node: 2.1.5(@types/node@22.9.0) + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 5.2.10(@types/node@22.10.7) + vite-node: 3.0.2(@types/node@22.10.7) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.9.0 + '@types/node': 22.10.7 transitivePeerDependencies: - less - lightningcss @@ -3555,12 +3401,6 @@ snapshots: tr46: 1.0.1 webidl-conversions: 4.0.2 - when-exit@2.1.1: {} - - which@1.3.1: - dependencies: - isexe: 2.0.0 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -3582,8 +3422,8 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - yallist@2.1.2: {} - yallist@4.0.0: {} yallist@5.0.0: {} + + yoctocolors@2.1.1: {} From 27f9e99b13904c9425352f953ae1a8e6072af10a Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 01:03:22 +0000 Subject: [PATCH 11/35] feat: export command in separate file to binary This allows for `create-solid` to be imported by another package and used there --- packages/create-solid/package.json | 4 ++-- packages/create-solid/src/bin.ts | 11 +++++++++++ packages/create-solid/src/index.ts | 15 +++++---------- packages/create-solid/tsup.config.ts | 2 +- packages/utils/src/open/index.ts | 3 +-- 5 files changed, 20 insertions(+), 15 deletions(-) create mode 100644 packages/create-solid/src/bin.ts diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index 3d07c1d..98cd91f 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -19,13 +19,13 @@ ], "main": "dist/index.mjs", "bin": { - "create-solid": "./dist/index.mjs" + "create-solid": "./dist/bin.mjs" }, "files": [ "dist" ], "scripts": { - "start": "jiti ./src/index.ts", + "start": "jiti ./src/bin.ts", "build": "tsc && tsup" }, "devDependencies": { diff --git a/packages/create-solid/src/bin.ts b/packages/create-solid/src/bin.ts new file mode 100644 index 0000000..acd39b8 --- /dev/null +++ b/packages/create-solid/src/bin.ts @@ -0,0 +1,11 @@ +#! /usr/bin/env node + +import { runMain } from "citty"; +import { main } from "."; +import { intro } from "@clack/prompts"; +import color from "picocolors"; +import packageJson from "../package.json" with { type: "json" }; + +intro(`\n${color.bgCyan(color.black(` Create-Solid v${packageJson.version}`))}`); + +runMain(main(packageJson.version)); \ No newline at end of file diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index bdcf9b5..74239c5 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -1,20 +1,16 @@ #! /usr/bin/env node -import color from "picocolors"; -import { intro } from "@clack/prompts"; -import packageJson from "../package.json" with { type: "json" }; -import { defineCommand, runMain } from "citty"; -import { createVanilla, createVanillaJS } from "./create-vanilla"; + +import { defineCommand } from "citty"; +import { createVanilla } from "./create-vanilla"; import * as p from "@clack/prompts"; import { cancelable, spinnerify } from "./utils/ui"; import { createStart } from "./create-start"; -import { create } from "./create"; import { getTemplatesList, StartTemplate, VanillaTemplate } from "./utils/constants"; -intro(`\n${color.bgCyan(color.black(` Create-Solid v${packageJson.version}`))}`); -const main = defineCommand({ +export const main = (version: string) => defineCommand({ meta: { name: "create-solid", - version: packageJson.version, + version: version, }, args: { projectNamePositional: { @@ -74,4 +70,3 @@ const main = defineCommand({ } } }) -runMain(main); diff --git a/packages/create-solid/tsup.config.ts b/packages/create-solid/tsup.config.ts index 831d65f..abd8918 100644 --- a/packages/create-solid/tsup.config.ts +++ b/packages/create-solid/tsup.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from "tsup"; export default defineConfig({ - entry: ["src/index.ts"], + entry: ["src/index.ts", "src/bin.ts"], target: "esnext", format: "esm", splitting: true, diff --git a/packages/utils/src/open/index.ts b/packages/utils/src/open/index.ts index 68ce0da..b946650 100644 --- a/packages/utils/src/open/index.ts +++ b/packages/utils/src/open/index.ts @@ -1,5 +1,4 @@ // Taken verbatim from https://github.com/withastro/astro/blob/main/packages/astro/src/cli/docs/open.ts -import type { ExecaChildProcess } from "execa"; import { execa } from "execa"; /** @@ -27,7 +26,7 @@ const getPlatformSpecificCommand = (): [string] | [string, string[]] => { } }; -export async function openInBrowser(url: string): Promise { +export async function openInBrowser(url: string) { const [command, args = []] = getPlatformSpecificCommand(); return execa(command, [...args, encodeURI(url)]); } From ece3bf679fb98fa0bb41df791334ffa97fa8dbef Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 01:09:56 +0000 Subject: [PATCH 12/35] refactor: rename `main` to `createSolid` --- packages/create-solid/src/bin.ts | 4 ++-- packages/create-solid/src/index.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/create-solid/src/bin.ts b/packages/create-solid/src/bin.ts index acd39b8..673067d 100644 --- a/packages/create-solid/src/bin.ts +++ b/packages/create-solid/src/bin.ts @@ -1,11 +1,11 @@ #! /usr/bin/env node import { runMain } from "citty"; -import { main } from "."; +import { createSolid } from "."; import { intro } from "@clack/prompts"; import color from "picocolors"; import packageJson from "../package.json" with { type: "json" }; intro(`\n${color.bgCyan(color.black(` Create-Solid v${packageJson.version}`))}`); -runMain(main(packageJson.version)); \ No newline at end of file +runMain(createSolid(packageJson.version)); \ No newline at end of file diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index 74239c5..7a7d284 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -7,7 +7,7 @@ import { cancelable, spinnerify } from "./utils/ui"; import { createStart } from "./create-start"; import { getTemplatesList, StartTemplate, VanillaTemplate } from "./utils/constants"; -export const main = (version: string) => defineCommand({ +export const createSolid = (version: string) => defineCommand({ meta: { name: "create-solid", version: version, From 2a9a9da799b070b6389c25ad4a9d75bf5bd0a22d Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 01:14:37 +0000 Subject: [PATCH 13/35] feat: add description to `create-solid` --- packages/create-solid/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index 7a7d284..143c7ff 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -10,6 +10,7 @@ import { getTemplatesList, StartTemplate, VanillaTemplate } from "./utils/consta export const createSolid = (version: string) => defineCommand({ meta: { name: "create-solid", + description: "A CLI for scaffolding new Solid projects", version: version, }, args: { From 3ce2ac0d0e270ed89717b1fe8d879b0ea730d865 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:22:31 +0000 Subject: [PATCH 14/35] feat: add all templates from start and vanilla format --- packages/create-solid/package.json | 3 +- packages/create-solid/src/bin.ts | 2 +- packages/create-solid/src/create-start.ts | 44 +++--- packages/create-solid/src/create-vanilla.ts | 37 +++--- packages/create-solid/src/create.ts | 13 +- packages/create-solid/src/index.ts | 125 +++++++++--------- packages/create-solid/src/utils/constants.ts | 42 +++++- .../create-solid/src/utils/file-system.ts | 14 +- .../create-solid/src/utils/ts-conversion.ts | 64 ++++----- packages/create-solid/src/utils/ui.ts | 41 +++--- packages/utils/src/updates/index.ts | 3 +- turbo.json | 34 ++--- 12 files changed, 221 insertions(+), 201 deletions(-) diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index 98cd91f..9f9c724 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -43,6 +43,5 @@ "publishConfig": { "access": "public" }, - "dependencies": { - } + "dependencies": {} } diff --git a/packages/create-solid/src/bin.ts b/packages/create-solid/src/bin.ts index 673067d..f9a3f43 100644 --- a/packages/create-solid/src/bin.ts +++ b/packages/create-solid/src/bin.ts @@ -8,4 +8,4 @@ import packageJson from "../package.json" with { type: "json" }; intro(`\n${color.bgCyan(color.black(` Create-Solid v${packageJson.version}`))}`); -runMain(createSolid(packageJson.version)); \ No newline at end of file +runMain(createSolid(packageJson.version)); diff --git a/packages/create-solid/src/create-start.ts b/packages/create-solid/src/create-start.ts index 68041ab..7088cc7 100644 --- a/packages/create-solid/src/create-start.ts +++ b/packages/create-solid/src/create-start.ts @@ -1,33 +1,33 @@ import { downloadRepo } from "@begit/core"; import { join } from "path"; import { writeFileSync } from "fs"; -import { handleTSConversion } from "./utils/ts-conversion" +import { handleTSConversion } from "./utils/ts-conversion"; import { GIT_IGNORE, StartTemplate } from "./utils/constants"; export type CreateStartArgs = { - template: StartTemplate, - destination: string, -} + template: StartTemplate; + destination: string; +}; export const createStartTS = ({ template, destination }: CreateStartArgs) => { - return downloadRepo({ - repo: { owner: "solidjs", name: "solid-start", subdir: `examples/${template}` }, - dest: destination, - }); -} + return downloadRepo({ + repo: { owner: "solidjs", name: "solid-start", subdir: `examples/${template}` }, + dest: destination, + }); +}; export const createStartJS = async ({ template, destination }: CreateStartArgs) => { - // Create typescript project in `/.project` - // then transpile this to javascript and clean up - const tempDir = join(destination, ".project"); - await createStartTS({ template, destination: tempDir }) - await handleTSConversion(tempDir, destination); - // Add .gitignore - writeFileSync(join(destination, ".gitignore"), GIT_IGNORE); -} + // Create typescript project in `/.project` + // then transpile this to javascript and clean up + const tempDir = join(destination, ".project"); + await createStartTS({ template, destination: tempDir }); + await handleTSConversion(tempDir, destination); + // Add .gitignore + writeFileSync(join(destination, ".gitignore"), GIT_IGNORE); +}; export const createStart = (args: CreateStartArgs, js?: boolean) => { - if (js) { - return createStartJS(args); - } - return createStartTS(args); -} \ No newline at end of file + if (js) { + return createStartJS(args); + } + return createStartTS(args); +}; diff --git a/packages/create-solid/src/create-vanilla.ts b/packages/create-solid/src/create-vanilla.ts index 904b010..dc2dc2d 100644 --- a/packages/create-solid/src/create-vanilla.ts +++ b/packages/create-solid/src/create-vanilla.ts @@ -4,27 +4,26 @@ import { writeFileSync } from "node:fs"; import { handleTSConversion } from "./utils/ts-conversion"; import { GIT_IGNORE, VanillaTemplate } from "./utils/constants"; - export type CreateVanillaArgs = { - template: VanillaTemplate, - destination: string, -} + template: VanillaTemplate; + destination: string; +}; export const createVanilla = (args: CreateVanillaArgs, js?: boolean) => { - if (js) { - return createVanillaJS(args); - } - return createVanillaTS(args); -} + if (js) { + return createVanillaJS(args); + } + return createVanillaTS(args); +}; export const createVanillaTS = async ({ template, destination }: CreateVanillaArgs) => { - return await downloadRepo({ repo: { owner: "solidjs", name: "templates", subdir: template }, dest: destination }); -} + return await downloadRepo({ repo: { owner: "solidjs", name: "templates", subdir: template }, dest: destination }); +}; export const createVanillaJS = async ({ template, destination }: CreateVanillaArgs) => { - // Create typescript project in `/.project` - // then transpile this to javascript and clean up - const tempDir = join(destination, ".project"); - await createVanillaTS({ template, destination: tempDir }) - await handleTSConversion(tempDir, destination); - // Add .gitignore - writeFileSync(join(destination, ".gitignore"), GIT_IGNORE); -} \ No newline at end of file + // Create typescript project in `/.project` + // then transpile this to javascript and clean up + const tempDir = join(destination, ".project"); + await createVanillaTS({ template, destination: tempDir }); + await handleTSConversion(tempDir, destination); + // Add .gitignore + writeFileSync(join(destination, ".gitignore"), GIT_IGNORE); +}; diff --git a/packages/create-solid/src/create.ts b/packages/create-solid/src/create.ts index 49bbd4b..6629041 100644 --- a/packages/create-solid/src/create.ts +++ b/packages/create-solid/src/create.ts @@ -4,10 +4,9 @@ import { createVanilla, CreateVanillaArgs } from "./create-vanilla"; export async function create(args: CreateVanillaArgs, js: boolean, isStart: false): Promise; export async function create(args: CreateStartArgs, js: boolean, isStart: true): Promise; export async function create(args: CreateVanillaArgs | CreateStartArgs, js: boolean, isStart: boolean) { - if (isStart) { - return createStart(args, js); - } - else { - return createVanilla(args, js); - } -} \ No newline at end of file + if (isStart) { + return createStart(args, js); + } else { + return createVanilla(args, js); + } +} diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index 143c7ff..dd0e5aa 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -7,67 +7,70 @@ import { cancelable, spinnerify } from "./utils/ui"; import { createStart } from "./create-start"; import { getTemplatesList, StartTemplate, VanillaTemplate } from "./utils/constants"; -export const createSolid = (version: string) => defineCommand({ - meta: { - name: "create-solid", - description: "A CLI for scaffolding new Solid projects", - version: version, - }, - args: { - projectNamePositional: { - type: "positional", - required: false, - description: "Project name" +export const createSolid = (version: string) => + defineCommand({ + meta: { + name: "create-solid", + description: "A CLI for scaffolding new Solid projects", + version: version, }, - templatePositional: { - type: "positional", - required: false, - description: "Template name", + args: { + "projectNamePositional": { + type: "positional", + required: false, + description: "Project name", + }, + "templatePositional": { + type: "positional", + required: false, + description: "Template name", + }, + "project-name": { + type: "string", + required: false, + alias: "p", + description: "Project name", + }, + "solidstart": { + type: "boolean", + required: false, + alias: "s", + description: "Create a SolidStart project", + }, }, - "project-name": { - type: "string", - required: false, - alias: "p", - description: "Project name", - }, - solidstart: { - type: "boolean", - required: false, - alias: "s", - description: "Create a SolidStart project", - }, - }, - async run({ args: { projectNamePositional, templatePositional, "project-name": projectNameOptional, solidstart } }) { - let projectName: string = projectNamePositional ?? projectNameOptional; - let template: string = templatePositional; - let isStart: boolean = solidstart; - let isJS = false; - projectName ??= await cancelable( - p.text({ message: "Project Name", placeholder: "solid-project", defaultValue: "solid-project" }), - ); - isStart ??= await cancelable(p.confirm({ message: "Is this a SolidStart project?" })); - const template_opts = await getTemplatesList(isStart); - template ??= (await cancelable( - p.select({ - message: "Which template would you like to use?", - initialValue: "ts", - options: template_opts.map((s: string) => ({ label: s, value: s })), - }), - )); - isJS = !(await cancelable(p.confirm({ message: "Use Typescript?" }))) + async run({ + args: { projectNamePositional, templatePositional, "project-name": projectNameOptional, solidstart }, + }) { + let projectName: string = projectNamePositional ?? projectNameOptional; + let template: string = templatePositional; + let isStart: boolean = solidstart; + projectName ??= await cancelable( + p.text({ message: "Project Name", placeholder: "solid-project", defaultValue: "solid-project" }), + ); + isStart ??= await cancelable(p.confirm({ message: "Is this a SolidStart project?" })); + const template_opts = await getTemplatesList(isStart); + template ??= await cancelable( + p.select({ + message: "Which template would you like to use?", + initialValue: "ts", + options: template_opts.map((s: string) => ({ label: s, value: s })), + }), + ); + // Project must be javascript if the template name begins with `js-` + const isJS = template.startsWith("js") ? true : !(await cancelable(p.confirm({ message: "Use Typescript?" }))); - if (isStart) { - await spinnerify({ - startText: "Creating project", - finishText: "Project created 🎉", - fn: () => createStart({ template: template as StartTemplate, destination: projectName }, isJS), - }) - } else { - await spinnerify({ - startText: "Creating project", - finishText: "Project created 🎉", - fn: () => createVanilla({ template: template as VanillaTemplate, destination: projectName }, isJS), - }) - } - } -}) + if (isStart) { + await spinnerify({ + startText: "Creating project", + finishText: "Project created 🎉", + fn: () => createStart({ template: template as StartTemplate, destination: projectName }, isJS), + }); + } else { + await spinnerify({ + startText: "Creating project", + finishText: "Project created 🎉", + fn: () => createVanilla({ template: template as VanillaTemplate, destination: projectName }, isJS), + }); + } + }, + }); diff --git a/packages/create-solid/src/utils/constants.ts b/packages/create-solid/src/utils/constants.ts index 403e595..dbf98de 100644 --- a/packages/create-solid/src/utils/constants.ts +++ b/packages/create-solid/src/utils/constants.ts @@ -37,14 +37,46 @@ export const JS_CONFIG = { "~/*": ["./src/*"], }, }, -} +}; // Supported templates -const VANILLA_TEMPLATES = ["ts"] as const; +const VANILLA_TEMPLATES = [ + "ts", + "ts-vitest", + "ts-uvu", + "ts-unocss", + "ts-tailwindcss", + "ts-sass", + "ts-router", + "ts-router-file-based", + "ts-minimal", + "ts-jest", + "ts-bootstrap", + "js", + "js-vitest", + "js-tailwindcss", +] as const; export type VanillaTemplate = (typeof VANILLA_TEMPLATES)[number]; -const START_TEMPLATES = ["basic"] as const; +const START_TEMPLATES = [ + "basic", + "bare", + "hackernews", + "notes", + "todomvc", + "with-auth", + "with-authjs", + "with-drizzle", + "with-mdx", + "with-prisma", + "with-solid-styled", + "with-tailwindcss", + "with-trpc", + "with-unocss", + "with-vitest", + "experiments", +] as const; export type StartTemplate = (typeof VANILLA_TEMPLATES)[number]; export const getTemplatesList = async (isStart: boolean) => { @@ -52,6 +84,6 @@ export const getTemplatesList = async (isStart: boolean) => { return START_TEMPLATES; } return VANILLA_TEMPLATES; -} +}; -// \ No newline at end of file +// diff --git a/packages/create-solid/src/utils/file-system.ts b/packages/create-solid/src/utils/file-system.ts index 0dd4c68..33aa860 100644 --- a/packages/create-solid/src/utils/file-system.ts +++ b/packages/create-solid/src/utils/file-system.ts @@ -4,15 +4,15 @@ import { join, resolve } from "node:path"; import { transform } from "sucrase"; export const recurseFiles = (startPath: string, cb: (file: Dirent, startPath: string) => void) => { - startPath = resolve(startPath); + startPath = resolve(startPath); - const files = readdirSync(startPath, { withFileTypes: true }); + const files = readdirSync(startPath, { withFileTypes: true }); - for (const file of files) { - cb(file, startPath); - } + for (const file of files) { + cb(file, startPath); + } }; export const readFileToString = async (path: string) => { - return (await readFile(path)).toString(); -}; \ No newline at end of file + return (await readFile(path)).toString(); +}; diff --git a/packages/create-solid/src/utils/ts-conversion.ts b/packages/create-solid/src/utils/ts-conversion.ts index 6683534..001923a 100644 --- a/packages/create-solid/src/utils/ts-conversion.ts +++ b/packages/create-solid/src/utils/ts-conversion.ts @@ -1,46 +1,38 @@ import { copyFileSync, Dirent, mkdirSync, writeFileSync } from "node:fs"; -import { readFileToString, recurseFiles } from "./file-system" +import { readFileToString, recurseFiles } from "./file-system"; import { join, resolve } from "node:path"; import { transform } from "sucrase"; import { rm } from "node:fs/promises"; -import { JS_CONFIG } from "./constants" +import { JS_CONFIG } from "./constants"; const convertToJS = async (file: Dirent, startPath: string) => { - const src = join(startPath, file.name); - const dest = resolve(startPath.replace(".solid-start", ""), file.name); - if (file.isDirectory()) { - mkdirSync(dest, { recursive: true }); - recurseFiles(resolve(startPath, file.name), convertToJS); - } else if (file.isFile()) { - if (src.endsWith(".ts") || src.endsWith(".tsx")) { - let { code } = transform(await readFileToString(src), { - transforms: ["typescript", "jsx"], - jsxRuntime: "preserve", - }); + const src = join(startPath, file.name); + const dest = resolve(startPath.replace(".solid-start", ""), file.name); + if (file.isDirectory()) { + mkdirSync(dest, { recursive: true }); + recurseFiles(resolve(startPath, file.name), convertToJS); + } else if (file.isFile()) { + if (src.endsWith(".ts") || src.endsWith(".tsx")) { + let { code } = transform(await readFileToString(src), { + transforms: ["typescript", "jsx"], + jsxRuntime: "preserve", + }); - writeFileSync(dest.replace(".ts", ".js"), code, { flag: "wx" }); - } else { - copyFileSync(src, dest); - } - } + writeFileSync(dest.replace(".ts", ".js"), code, { flag: "wx" }); + } else { + copyFileSync(src, dest); + } + } }; export const handleTSConversion = async (tempDir: string, projectName: string) => { - await rm(resolve(tempDir, "tsconfig.json")); - writeFileSync( - resolve(projectName, "jsconfig.json"), - JSON.stringify( - JS_CONFIG, - null, - 2, - ), - { flag: "wx" }, - ); + await rm(resolve(tempDir, "tsconfig.json")); + writeFileSync(resolve(projectName, "jsconfig.json"), JSON.stringify(JS_CONFIG, null, 2), { flag: "wx" }); - // Convert all ts files in temp directory into js - recurseFiles(tempDir, convertToJS); + // Convert all ts files in temp directory into js + recurseFiles(tempDir, convertToJS); - // Remove temp directory - await rm(join(process.cwd(), tempDir), { - recursive: true, - force: true, - }); -}; \ No newline at end of file + // Remove temp directory + await rm(join(process.cwd(), tempDir), { + recursive: true, + force: true, + }); +}; diff --git a/packages/create-solid/src/utils/ui.ts b/packages/create-solid/src/utils/ui.ts index fcaa5eb..baf8b4b 100644 --- a/packages/create-solid/src/utils/ui.ts +++ b/packages/create-solid/src/utils/ui.ts @@ -1,30 +1,33 @@ import { log, spinner } from "@clack/prompts"; type SpinnerItem = { - startText: string; - finishText: string; - fn: () => Promise; + startText: string; + finishText: string; + fn: () => Promise; }; export async function spinnerify(spinners: SpinnerItem): Promise; export async function spinnerify(spinners: SpinnerItem[]): Promise; export async function spinnerify(spinners: SpinnerItem[] | SpinnerItem) { - if (!Array.isArray(spinners)) spinners = [spinners]; - let results: any[] = []; - const s = spinner(); - for (const { startText, finishText, fn } of spinners) { - s.start(startText); - results.push(await fn()); - s.stop(finishText); - } - return results.length === 1 ? results[0] : results; + if (!Array.isArray(spinners)) spinners = [spinners]; + let results: any[] = []; + const s = spinner(); + for (const { startText, finishText, fn } of spinners) { + s.start(startText); + results.push(await fn()); + s.stop(finishText); + } + return results.length === 1 ? results[0] : results; } -export const cancelable = async (prompt: Promise, cancelMessage: string = "Canceled"): Promise => { - const value = await prompt; +export const cancelable = async ( + prompt: Promise, + cancelMessage: string = "Canceled", +): Promise => { + const value = await prompt; - if (typeof value === "symbol") { - log.warn(cancelMessage); - process.exit(0); - } + if (typeof value === "symbol") { + log.warn(cancelMessage); + process.exit(0); + } - return value; + return value; }; diff --git a/packages/utils/src/updates/index.ts b/packages/utils/src/updates/index.ts index e996680..65e3854 100644 --- a/packages/utils/src/updates/index.ts +++ b/packages/utils/src/updates/index.ts @@ -66,8 +66,7 @@ export const flushPackageUpdates = async () => { for (const update of packageUpdates) { if (update.dev) { await $`${pM.name} ${instlCmd} -D ${update.name}`; - } - else { + } else { await $`${pM.name} ${instlCmd} ${update.name}`; } } diff --git a/turbo.json b/turbo.json index dc2279d..d13c31c 100644 --- a/turbo.json +++ b/turbo.json @@ -1,22 +1,16 @@ { - "$schema": "https://turbo.build/schema.json", - "tasks": { - "build": { - "dependsOn": [ - "^build" - ], - "outputs": [ - "dist/**" - ] - }, - "test": { - "dependsOn": [ - "^test" - ] - }, - "dev": { - "cache": false, - "persistent": true - } - } + "$schema": "https://turbo.build/schema.json", + "tasks": { + "build": { + "dependsOn": ["^build"], + "outputs": ["dist/**"] + }, + "test": { + "dependsOn": ["^test"] + }, + "dev": { + "cache": false, + "persistent": true + } + } } From a0780bf2fbc5cd9daae1a005b5486eb4dd936d47 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:25:01 +0000 Subject: [PATCH 15/35] refactor: remove unused imports --- packages/create-solid/src/utils/file-system.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/create-solid/src/utils/file-system.ts b/packages/create-solid/src/utils/file-system.ts index 33aa860..c17c0f9 100644 --- a/packages/create-solid/src/utils/file-system.ts +++ b/packages/create-solid/src/utils/file-system.ts @@ -1,7 +1,6 @@ -import { copyFileSync, Dirent, mkdirSync, readdirSync, writeFileSync } from "node:fs"; -import { readFile, rm } from "node:fs/promises"; -import { join, resolve } from "node:path"; -import { transform } from "sucrase"; +import { Dirent, readdirSync } from "node:fs"; +import { readFile } from "node:fs/promises"; +import { resolve } from "node:path"; export const recurseFiles = (startPath: string, cb: (file: Dirent, startPath: string) => void) => { startPath = resolve(startPath); From cb5287b7fd7ccf1584830633e2dada639d172550 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:28:41 +0000 Subject: [PATCH 16/35] fix: don't transpile if the project template is already js --- packages/create-solid/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index dd0e5aa..2f286c1 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -56,8 +56,8 @@ export const createSolid = (version: string) => options: template_opts.map((s: string) => ({ label: s, value: s })), }), ); - // Project must be javascript if the template name begins with `js-` - const isJS = template.startsWith("js") ? true : !(await cancelable(p.confirm({ message: "Use Typescript?" }))); + // Don't transpile project if it's already javascript! + const isJS = template.startsWith("js") ? false : !(await cancelable(p.confirm({ message: "Use Typescript?" }))); if (isStart) { await spinnerify({ From 38c349554e90e3e0451d632e0b529330c48045d4 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:21:16 +0000 Subject: [PATCH 17/35] attempts at mocking the file system --- __mocks__/fs.cjs | 2 + __mocks__/fs/promises.cjs | 2 + package.json | 1 + packages/create-solid/package.json | 3 +- packages/create-solid/src/index.ts | 2 +- packages/create-solid/tests/template.test.ts | 21 ++++++ pnpm-lock.yaml | 79 ++++++++++++++++++++ 7 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 __mocks__/fs.cjs create mode 100644 __mocks__/fs/promises.cjs create mode 100644 packages/create-solid/tests/template.test.ts diff --git a/__mocks__/fs.cjs b/__mocks__/fs.cjs new file mode 100644 index 0000000..d1b5789 --- /dev/null +++ b/__mocks__/fs.cjs @@ -0,0 +1,2 @@ +const { fs } = require('memfs') +module.exports = fs \ No newline at end of file diff --git a/__mocks__/fs/promises.cjs b/__mocks__/fs/promises.cjs new file mode 100644 index 0000000..0bb2b07 --- /dev/null +++ b/__mocks__/fs/promises.cjs @@ -0,0 +1,2 @@ +const { fs } = require('memfs') +module.exports = fs.promises \ No newline at end of file diff --git a/package.json b/package.json index 55a3ba3..923577d 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ ], "devDependencies": { "@changesets/cli": "2.27.11", + "memfs": "^4.17.0", "nodemon": "^3.1.9", "prettier": "^3.4.2", "turbo": "^2.3.3", diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index 9f9c724..84e87e7 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -26,7 +26,8 @@ ], "scripts": { "start": "jiti ./src/bin.ts", - "build": "tsc && tsup" + "build": "tsc && tsup", + "test": "vitest run" }, "devDependencies": { "@clack/prompts": "0.9.1", diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index 2f286c1..ce65542 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -6,7 +6,7 @@ import * as p from "@clack/prompts"; import { cancelable, spinnerify } from "./utils/ui"; import { createStart } from "./create-start"; import { getTemplatesList, StartTemplate, VanillaTemplate } from "./utils/constants"; - +export { createVanilla, createStart } export const createSolid = (version: string) => defineCommand({ meta: { diff --git a/packages/create-solid/tests/template.test.ts b/packages/create-solid/tests/template.test.ts new file mode 100644 index 0000000..b7a6551 --- /dev/null +++ b/packages/create-solid/tests/template.test.ts @@ -0,0 +1,21 @@ +import { beforeEach, expect, it, vi } from "vitest"; +import { createVanilla } from "../src" +import { vol, fs } from 'memfs' +import { cwd } from "process"; +import { readdir, readdirSync, readFileSync } from "fs"; +import { toTreeSync } from "memfs/lib/print"; +vi.mock("node:fs"); +vi.mock("node:fs/promises") +vi.mock("fs"); +vi.mock("fs/promises") +beforeEach(() => { + // reset the state of in-memory fs + vol.reset() +}) +it("downloads and extracts the typescript template", async () => { + const res = await createVanilla({ template: "ts", destination: "test/ts" }, false) + + // const res = readdirSync(cwd()); + // console.log(res); + console.log(toTreeSync(fs)) +}) \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eec75b4..1b31e4b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@changesets/cli': specifier: 2.27.11 version: 2.27.11 + memfs: + specifier: ^4.17.0 + version: 4.17.0 nodemon: specifier: ^3.1.9 version: 3.1.9 @@ -514,6 +517,24 @@ packages: '@jridgewell/trace-mapping@0.3.19': resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.1.1': + resolution: {integrity: sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.5.0': + resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -1154,6 +1175,10 @@ packages: resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} engines: {node: '>=18.18.0'} + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -1268,6 +1293,10 @@ packages: magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + memfs@4.17.0: + resolution: {integrity: sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==} + engines: {node: '>= 4.0.0'} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1628,6 +1657,12 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thingies@1.21.0: + resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -1672,6 +1707,12 @@ packages: tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tree-dump@1.0.2: + resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -1679,6 +1720,9 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsup@8.3.5: resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==} engines: {node: '>=18'} @@ -2211,6 +2255,22 @@ snapshots: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.1.1(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.24.4 @@ -2806,6 +2866,8 @@ snapshots: human-signals@8.0.0: {} + hyperdyperid@1.2.0: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -2897,6 +2959,13 @@ snapshots: '@babel/types': 7.25.6 source-map-js: 1.2.0 + memfs@4.17.0: + dependencies: + '@jsonjoy.com/json-pack': 1.1.1(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + tree-dump: 1.0.2(tslib@2.8.1) + tslib: 2.8.1 + merge2@1.4.1: {} micromatch@4.0.5: @@ -3229,6 +3298,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thingies@1.21.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + tinybench@2.9.0: {} tinyexec@0.3.1: {} @@ -3264,10 +3337,16 @@ snapshots: dependencies: punycode: 2.3.0 + tree-dump@1.0.2(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + tree-kill@1.2.2: {} ts-interface-checker@0.1.13: {} + tslib@2.8.1: {} + tsup@8.3.5(@swc/core@1.5.5)(jiti@2.4.2)(postcss@8.4.38)(typescript@5.7.3): dependencies: bundle-require: 5.0.0(esbuild@0.24.0) From 1ab5a80d09b82016aa16127598564685aa07b11f Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 14:06:27 +0000 Subject: [PATCH 18/35] feat: replace attempts at in-memory fs testing with just using the actual filesystem --- .gitignore | 4 +- __mocks__/fs.cjs | 2 - __mocks__/fs/promises.cjs | 2 - package.json | 3 +- packages/create-solid/src/index.ts | 2 +- packages/create-solid/tests/template.test.ts | 24 ++---- pnpm-lock.yaml | 79 -------------------- setup.ts | 6 ++ vitest.config.ts | 4 + 9 files changed, 21 insertions(+), 105 deletions(-) delete mode 100644 __mocks__/fs.cjs delete mode 100644 __mocks__/fs/promises.cjs create mode 100644 setup.ts create mode 100644 vitest.config.ts diff --git a/.gitignore b/.gitignore index b1d8509..3359d16 100644 --- a/.gitignore +++ b/.gitignore @@ -135,5 +135,5 @@ dist .yarn/install-state.gz .pnp.* -# Testing directory -testing \ No newline at end of file +# Test directory +test \ No newline at end of file diff --git a/__mocks__/fs.cjs b/__mocks__/fs.cjs deleted file mode 100644 index d1b5789..0000000 --- a/__mocks__/fs.cjs +++ /dev/null @@ -1,2 +0,0 @@ -const { fs } = require('memfs') -module.exports = fs \ No newline at end of file diff --git a/__mocks__/fs/promises.cjs b/__mocks__/fs/promises.cjs deleted file mode 100644 index 0bb2b07..0000000 --- a/__mocks__/fs/promises.cjs +++ /dev/null @@ -1,2 +0,0 @@ -const { fs } = require('memfs') -module.exports = fs.promises \ No newline at end of file diff --git a/package.json b/package.json index 923577d..1e46299 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/solidjs-community/solid-cli" }, "scripts": { - "test": "vitest", + "test": "vitest run", "test:all": "turbo run test", "build": "turbo run build", "release": "pnpm build && changeset publish", @@ -35,7 +35,6 @@ ], "devDependencies": { "@changesets/cli": "2.27.11", - "memfs": "^4.17.0", "nodemon": "^3.1.9", "prettier": "^3.4.2", "turbo": "^2.3.3", diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index ce65542..e38148c 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -6,7 +6,7 @@ import * as p from "@clack/prompts"; import { cancelable, spinnerify } from "./utils/ui"; import { createStart } from "./create-start"; import { getTemplatesList, StartTemplate, VanillaTemplate } from "./utils/constants"; -export { createVanilla, createStart } +export { createVanilla, createStart }; export const createSolid = (version: string) => defineCommand({ meta: { diff --git a/packages/create-solid/tests/template.test.ts b/packages/create-solid/tests/template.test.ts index b7a6551..d2e01b5 100644 --- a/packages/create-solid/tests/template.test.ts +++ b/packages/create-solid/tests/template.test.ts @@ -1,21 +1,11 @@ -import { beforeEach, expect, it, vi } from "vitest"; +import { afterAll, beforeEach, expect, it, vi } from "vitest"; import { createVanilla } from "../src" -import { vol, fs } from 'memfs' import { cwd } from "process"; -import { readdir, readdirSync, readFileSync } from "fs"; -import { toTreeSync } from "memfs/lib/print"; -vi.mock("node:fs"); -vi.mock("node:fs/promises") -vi.mock("fs"); -vi.mock("fs/promises") -beforeEach(() => { - // reset the state of in-memory fs - vol.reset() -}) +import { existsSync, readdir, readdirSync, readFileSync } from "fs"; +import { rm } from "fs/promises"; it("downloads and extracts the typescript template", async () => { - const res = await createVanilla({ template: "ts", destination: "test/ts" }, false) - - // const res = readdirSync(cwd()); - // console.log(res); - console.log(toTreeSync(fs)) + await createVanilla({ template: "ts", destination: "./test/ts" }, false) + + const appTsx = existsSync("./test/ts/src/App.tsx"); + expect(appTsx).toBe(true); }) \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1b31e4b..eec75b4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,9 +11,6 @@ importers: '@changesets/cli': specifier: 2.27.11 version: 2.27.11 - memfs: - specifier: ^4.17.0 - version: 4.17.0 nodemon: specifier: ^3.1.9 version: 3.1.9 @@ -517,24 +514,6 @@ packages: '@jridgewell/trace-mapping@0.3.19': resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} - '@jsonjoy.com/base64@1.1.2': - resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pack@1.1.1': - resolution: {integrity: sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/util@1.5.0': - resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -1175,10 +1154,6 @@ packages: resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} engines: {node: '>=18.18.0'} - hyperdyperid@1.2.0: - resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} - engines: {node: '>=10.18'} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -1293,10 +1268,6 @@ packages: magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - memfs@4.17.0: - resolution: {integrity: sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==} - engines: {node: '>= 4.0.0'} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1657,12 +1628,6 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thingies@1.21.0: - resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} - engines: {node: '>=10.18'} - peerDependencies: - tslib: ^2 - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -1707,12 +1672,6 @@ packages: tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tree-dump@1.0.2: - resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -1720,9 +1679,6 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsup@8.3.5: resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==} engines: {node: '>=18'} @@ -2255,22 +2211,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/json-pack@1.1.1(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.24.4 @@ -2866,8 +2806,6 @@ snapshots: human-signals@8.0.0: {} - hyperdyperid@1.2.0: {} - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -2959,13 +2897,6 @@ snapshots: '@babel/types': 7.25.6 source-map-js: 1.2.0 - memfs@4.17.0: - dependencies: - '@jsonjoy.com/json-pack': 1.1.1(tslib@2.8.1) - '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) - tree-dump: 1.0.2(tslib@2.8.1) - tslib: 2.8.1 - merge2@1.4.1: {} micromatch@4.0.5: @@ -3298,10 +3229,6 @@ snapshots: dependencies: any-promise: 1.3.0 - thingies@1.21.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - tinybench@2.9.0: {} tinyexec@0.3.1: {} @@ -3337,16 +3264,10 @@ snapshots: dependencies: punycode: 2.3.0 - tree-dump@1.0.2(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - tree-kill@1.2.2: {} ts-interface-checker@0.1.13: {} - tslib@2.8.1: {} - tsup@8.3.5(@swc/core@1.5.5)(jiti@2.4.2)(postcss@8.4.38)(typescript@5.7.3): dependencies: bundle-require: 5.0.0(esbuild@0.24.0) diff --git a/setup.ts b/setup.ts new file mode 100644 index 0000000..73583ec --- /dev/null +++ b/setup.ts @@ -0,0 +1,6 @@ +import type { TestProject } from 'vitest/node' +import { rmSync } from "fs"; +export default function setup(project: TestProject) { + // Clean up test directory before running tests + rmSync("./test", { recursive: true }) +} \ No newline at end of file diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..e2f77f6 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,4 @@ +import { defineConfig } from "vitest/config"; +export default defineConfig({ + test: { globalSetup: ["./setup.ts"] } +}) \ No newline at end of file From 3875bbc2e1884967a7add6c09cdccc12920981df Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 14:06:44 +0000 Subject: [PATCH 19/35] refactor: remove unused imports --- packages/create-solid/tests/template.test.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/create-solid/tests/template.test.ts b/packages/create-solid/tests/template.test.ts index d2e01b5..c29d52b 100644 --- a/packages/create-solid/tests/template.test.ts +++ b/packages/create-solid/tests/template.test.ts @@ -1,8 +1,6 @@ -import { afterAll, beforeEach, expect, it, vi } from "vitest"; +import { expect, it } from "vitest"; import { createVanilla } from "../src" -import { cwd } from "process"; -import { existsSync, readdir, readdirSync, readFileSync } from "fs"; -import { rm } from "fs/promises"; +import { existsSync } from "fs"; it("downloads and extracts the typescript template", async () => { await createVanilla({ template: "ts", destination: "./test/ts" }, false) From d066fbe6a0d13914cc6e6ea79440d76f7fbcf4af Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 14:28:38 +0000 Subject: [PATCH 20/35] fix: only remove `test` directory if it exists --- setup.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/setup.ts b/setup.ts index 73583ec..0da5513 100644 --- a/setup.ts +++ b/setup.ts @@ -1,6 +1,7 @@ import type { TestProject } from 'vitest/node' -import { rmSync } from "fs"; +import { existsSync, rmSync } from "fs"; export default function setup(project: TestProject) { // Clean up test directory before running tests - rmSync("./test", { recursive: true }) + if (existsSync("./test")) + rmSync("./test", { recursive: true }) } \ No newline at end of file From d4a2de5a774a6cc653d3cff5900f92c8e35826cb Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 14:45:37 +0000 Subject: [PATCH 21/35] feat: add next steps --- packages/create-solid/package.json | 3 ++- packages/create-solid/src/index.ts | 11 +++++++++++ pnpm-lock.yaml | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index 84e87e7..e4c4b9d 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -39,7 +39,8 @@ "typescript": "^5.7.3", "@begit/core": "^0.1.1", "citty": "^0.1.6", - "sucrase": "^3.35.0" + "sucrase": "^3.35.0", + "@solid-cli/utils": "workspace:*" }, "publishConfig": { "access": "public" diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts index e38148c..79848e8 100644 --- a/packages/create-solid/src/index.ts +++ b/packages/create-solid/src/index.ts @@ -6,6 +6,7 @@ import * as p from "@clack/prompts"; import { cancelable, spinnerify } from "./utils/ui"; import { createStart } from "./create-start"; import { getTemplatesList, StartTemplate, VanillaTemplate } from "./utils/constants"; +import { detectPackageManager } from "@solid-cli/utils/package-manager"; export { createVanilla, createStart }; export const createSolid = (version: string) => defineCommand({ @@ -41,6 +42,7 @@ export const createSolid = (version: string) => async run({ args: { projectNamePositional, templatePositional, "project-name": projectNameOptional, solidstart }, }) { + // Show prompts for any unknown arguments let projectName: string = projectNamePositional ?? projectNameOptional; let template: string = templatePositional; let isStart: boolean = solidstart; @@ -56,6 +58,7 @@ export const createSolid = (version: string) => options: template_opts.map((s: string) => ({ label: s, value: s })), }), ); + // Don't transpile project if it's already javascript! const isJS = template.startsWith("js") ? false : !(await cancelable(p.confirm({ message: "Use Typescript?" }))); @@ -72,5 +75,13 @@ export const createSolid = (version: string) => fn: () => createVanilla({ template: template as VanillaTemplate, destination: projectName }, isJS), }); } + + // Next steps.. + const pM = detectPackageManager(); + p.note( + `cd ${projectName} +${pM.name} install +${pM.name} ${pM.runScriptCommand("dev")}`, + "To get started, run:"); }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eec75b4..d47b0ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: '@clack/prompts': specifier: 0.9.1 version: 0.9.1 + '@solid-cli/utils': + specifier: workspace:* + version: link:../utils '@types/node': specifier: ^22.10.7 version: 22.10.7 From f07f7157325f2dc18a53d2baa44f65153ccb4f33 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 15:14:30 +0000 Subject: [PATCH 22/35] feat: add `full-solid` package which re-exports the `create` prompt under a subcommand --- .gitignore | 5 +++- packages/create-solid/package.json | 14 +++++++-- packages/create-solid/tsconfig.json | 8 +++-- packages/full-solid/README.md | 1 + packages/full-solid/package.json | 45 +++++++++++++++++++++++++++++ packages/full-solid/src/bin.ts | 14 +++++++++ packages/full-solid/tsconfig.json | 15 ++++++++++ packages/full-solid/tsup.config.ts | 17 +++++++++++ pnpm-lock.yaml | 27 +++++++++++++++++ turbo.json | 2 +- 10 files changed, 141 insertions(+), 7 deletions(-) create mode 100644 packages/full-solid/README.md create mode 100644 packages/full-solid/package.json create mode 100644 packages/full-solid/src/bin.ts create mode 100644 packages/full-solid/tsconfig.json create mode 100644 packages/full-solid/tsup.config.ts diff --git a/.gitignore b/.gitignore index 3359d16..ba04bab 100644 --- a/.gitignore +++ b/.gitignore @@ -136,4 +136,7 @@ dist .pnp.* # Test directory -test \ No newline at end of file +test + +# Build output +types \ No newline at end of file diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index e4c4b9d..dc731d5 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -17,12 +17,22 @@ "solid", "cli" ], - "main": "dist/index.mjs", + "main": "./dist/index.mjs", + "module": "./dist/index.mjs", + "types": "./types/src/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.mjs", + "require": "./dist/index.mjs", + "types": "./types/src/index.d.ts" + } + }, "bin": { "create-solid": "./dist/bin.mjs" }, "files": [ - "dist" + "dist", + "types" ], "scripts": { "start": "jiti ./src/bin.ts", diff --git a/packages/create-solid/tsconfig.json b/packages/create-solid/tsconfig.json index 55a0135..51a5a37 100644 --- a/packages/create-solid/tsconfig.json +++ b/packages/create-solid/tsconfig.json @@ -1,7 +1,5 @@ { "compilerOptions": { - "baseUrl": ".", - "noEmit": true, "module": "ESNext", "target": "ESNext", "moduleResolution": "Bundler", @@ -9,7 +7,11 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "skipLibCheck": true, - "resolveJsonModule": true + "resolveJsonModule": true, + + "declaration": true, + "emitDeclarationOnly": true, + "outDir": "types" }, "include": ["src/*"] } diff --git a/packages/full-solid/README.md b/packages/full-solid/README.md new file mode 100644 index 0000000..0a9a706 --- /dev/null +++ b/packages/full-solid/README.md @@ -0,0 +1 @@ +# Full Solid diff --git a/packages/full-solid/package.json b/packages/full-solid/package.json new file mode 100644 index 0000000..c684adf --- /dev/null +++ b/packages/full-solid/package.json @@ -0,0 +1,45 @@ +{ + "name": "@solid-cli/full", + "version": "0.5.13", + "description": "Create Solid apps with low configuration", + "author": "Thomas Beer", + "contributors": [ + "Rahul Batra" + ], + "license": "MIT", + "homepage": "https://solid-cli.netlify.app", + "repository": { + "type": "git", + "url": "https://github.com/solidjs-community/solid-cli" + }, + "keywords": [ + "solidjs", + "solid", + "cli" + ], + "main": "dist/index.mjs", + "bin": { + "sd": "./dist/bin.mjs" + }, + "files": [ + "dist" + ], + "scripts": { + "start": "jiti ./src/bin.ts", + "build": "tsc && tsup", + "test": "vitest run" + }, + "devDependencies": { + "@clack/prompts": "0.9.1", + "picocolors": "^1.1.1", + "@types/node": "^22.10.7", + "citty": "^0.1.6", + "create-solid": "workspace:*", + "jiti": "^2.4.2", + "tsup": "^8.3.5", + "typescript": "^5.7.3" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/full-solid/src/bin.ts b/packages/full-solid/src/bin.ts new file mode 100644 index 0000000..79b8f47 --- /dev/null +++ b/packages/full-solid/src/bin.ts @@ -0,0 +1,14 @@ +#! /usr/bin/env node + +import { defineCommand, runMain } from "citty"; +import { createSolid } from "create-solid"; +import packageJson from "../package.json" with { type: "json" }; +import { intro } from "@clack/prompts"; +import * as color from "picocolors"; +intro(`\n${color.bgCyan(color.black(` Solid CLI v${packageJson.version}`))}`); + +const main = defineCommand({ + subCommands: { create: createSolid(packageJson.version) }, +}) + +runMain(main); \ No newline at end of file diff --git a/packages/full-solid/tsconfig.json b/packages/full-solid/tsconfig.json new file mode 100644 index 0000000..55a0135 --- /dev/null +++ b/packages/full-solid/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "noEmit": true, + "module": "ESNext", + "target": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "resolveJsonModule": true + }, + "include": ["src/*"] +} diff --git a/packages/full-solid/tsup.config.ts b/packages/full-solid/tsup.config.ts new file mode 100644 index 0000000..ed15cdf --- /dev/null +++ b/packages/full-solid/tsup.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/bin.ts"], + target: "esnext", + format: "esm", + splitting: true, + bundle: true, + sourcemap: false, + clean: true, + treeshake: true, + minify: true, + banner: { + js: `import { createRequire } from "module"; + const require = createRequire(import.meta.url);`, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d47b0ad..fd3c1bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,6 +60,33 @@ importers: specifier: ^5.7.3 version: 5.7.3 + packages/full-solid: + devDependencies: + '@clack/prompts': + specifier: 0.9.1 + version: 0.9.1 + '@types/node': + specifier: ^22.10.7 + version: 22.10.7 + citty: + specifier: ^0.1.6 + version: 0.1.6 + create-solid: + specifier: workspace:* + version: link:../create-solid + jiti: + specifier: ^2.4.2 + version: 2.4.2 + picocolors: + specifier: ^1.1.1 + version: 1.1.1 + tsup: + specifier: ^8.3.5 + version: 8.3.5(@swc/core@1.5.5)(jiti@2.4.2)(postcss@8.4.38)(typescript@5.7.3) + typescript: + specifier: ^5.7.3 + version: 5.7.3 + packages/utils: dependencies: '@clack/core': diff --git a/turbo.json b/turbo.json index d13c31c..2bd8cbe 100644 --- a/turbo.json +++ b/turbo.json @@ -3,7 +3,7 @@ "tasks": { "build": { "dependsOn": ["^build"], - "outputs": ["dist/**"] + "outputs": ["dist/**", "types/**"] }, "test": { "dependsOn": ["^test"] From 43cddeb4e9d6fd312827290e4d240930c48f858a Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 15:25:12 +0000 Subject: [PATCH 23/35] feat: add `@solid-cli/create` package feat: export nothing from `create-solid` so it can be as small as possible --- packages/create-solid/package.json | 2 +- packages/create-solid/src/bin.ts | 2 +- packages/create-solid/tsup.config.ts | 2 +- packages/create/README.md | 29 ++++++++++ packages/create/package.json | 57 +++++++++++++++++++ .../src/create-start.ts | 0 .../src/create-vanilla.ts | 0 .../{create-solid => create}/src/create.ts | 0 .../{create-solid => create}/src/index.ts | 0 .../src/utils/constants.ts | 0 .../src/utils/file-system.ts | 0 .../src/utils/ts-conversion.ts | 0 .../{create-solid => create}/src/utils/ui.ts | 0 packages/create/tests/template.test.ts | 9 +++ packages/create/tsconfig.json | 17 ++++++ packages/create/tsup.config.ts | 15 +++++ packages/full-solid/package.json | 2 +- packages/full-solid/src/bin.ts | 2 +- pnpm-lock.yaml | 47 +++++++++++++-- 19 files changed, 174 insertions(+), 10 deletions(-) create mode 100644 packages/create/README.md create mode 100644 packages/create/package.json rename packages/{create-solid => create}/src/create-start.ts (100%) rename packages/{create-solid => create}/src/create-vanilla.ts (100%) rename packages/{create-solid => create}/src/create.ts (100%) rename packages/{create-solid => create}/src/index.ts (100%) rename packages/{create-solid => create}/src/utils/constants.ts (100%) rename packages/{create-solid => create}/src/utils/file-system.ts (100%) rename packages/{create-solid => create}/src/utils/ts-conversion.ts (100%) rename packages/{create-solid => create}/src/utils/ui.ts (100%) create mode 100644 packages/create/tests/template.test.ts create mode 100644 packages/create/tsconfig.json create mode 100644 packages/create/tsup.config.ts diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index dc731d5..89a7dda 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -50,7 +50,7 @@ "@begit/core": "^0.1.1", "citty": "^0.1.6", "sucrase": "^3.35.0", - "@solid-cli/utils": "workspace:*" + "@solid-cli/create": "workspace:*" }, "publishConfig": { "access": "public" diff --git a/packages/create-solid/src/bin.ts b/packages/create-solid/src/bin.ts index f9a3f43..5b848bd 100644 --- a/packages/create-solid/src/bin.ts +++ b/packages/create-solid/src/bin.ts @@ -1,7 +1,7 @@ #! /usr/bin/env node import { runMain } from "citty"; -import { createSolid } from "."; +import { createSolid } from "@solid-cli/create"; import { intro } from "@clack/prompts"; import color from "picocolors"; import packageJson from "../package.json" with { type: "json" }; diff --git a/packages/create-solid/tsup.config.ts b/packages/create-solid/tsup.config.ts index abd8918..ed15cdf 100644 --- a/packages/create-solid/tsup.config.ts +++ b/packages/create-solid/tsup.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from "tsup"; export default defineConfig({ - entry: ["src/index.ts", "src/bin.ts"], + entry: ["src/bin.ts"], target: "esnext", format: "esm", splitting: true, diff --git a/packages/create/README.md b/packages/create/README.md new file mode 100644 index 0000000..ce864de --- /dev/null +++ b/packages/create/README.md @@ -0,0 +1,29 @@ +--- +description: Create Solid apps in one command with create-solid. +--- + +# Create Solid + +The easiest way to get started with Solid is by using `create-solid`. This CLI tool enables you to quickly start building a new Solid application, with everything set up for you. You can create a new app using the default SolidStart template or use one of the [Official SolidStart Examples](https://github.com/solidjs/solid-start/tree/main/examples). To get started, use the following command: + +```bash +#or +npm init solid@latest + +#or +pnpm create solid@latest + +# or +yarn create solid + +# or +bunx create-solid +``` + +## Why use Create Solid? + +`create-solid` allows you to create a new Solid app within seconds. It includes a number of benefits: + +- **Interactive Experience**: Running `npm init solid@latest` (with no arguments) launches an interactive experience that guides you through setting up a project. +- **Zero Dependencies**: Initializing a project is as quick as one second. Create Solid has zero runtime dependencies. +- **Support for Examples**: Create Solid App can bootstrap your application using an example from the SolidStart official examples collection. diff --git a/packages/create/package.json b/packages/create/package.json new file mode 100644 index 0000000..6d14e43 --- /dev/null +++ b/packages/create/package.json @@ -0,0 +1,57 @@ +{ + "name": "@solid-cli/create", + "version": "0.5.13", + "description": "Create Solid apps with low configuration", + "author": "Thomas Beer", + "contributors": [ + "Rahul Batra" + ], + "license": "MIT", + "homepage": "https://solid-cli.netlify.app", + "repository": { + "type": "git", + "url": "https://github.com/solidjs-community/solid-cli" + }, + "keywords": [ + "solidjs", + "solid", + "cli" + ], + "main": "./dist/index.mjs", + "module": "./dist/index.mjs", + "types": "./types/src/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.mjs", + "require": "./dist/index.mjs", + "types": "./types/src/index.d.ts" + } + }, + "files": [ + "dist", + "types" + ], + "scripts": { + "start": "jiti ./src/bin.ts", + "build": "tsc && tsup", + "test": "vitest run" + }, + "devDependencies": { + "typescript": "^5.7.3", + "@types/node": "^22.10.7", + "tsup": "^8.3.5", + "jiti": "^2.4.2" + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@clack/prompts": "0.9.1", + "cmd-ts": "^0.13.0", + "picocolors": "^1.1.1", + "@begit/core": "^0.1.1", + "citty": "^0.1.6", + "sucrase": "^3.35.0", + "@solid-cli/utils": "workspace:*" + } +} diff --git a/packages/create-solid/src/create-start.ts b/packages/create/src/create-start.ts similarity index 100% rename from packages/create-solid/src/create-start.ts rename to packages/create/src/create-start.ts diff --git a/packages/create-solid/src/create-vanilla.ts b/packages/create/src/create-vanilla.ts similarity index 100% rename from packages/create-solid/src/create-vanilla.ts rename to packages/create/src/create-vanilla.ts diff --git a/packages/create-solid/src/create.ts b/packages/create/src/create.ts similarity index 100% rename from packages/create-solid/src/create.ts rename to packages/create/src/create.ts diff --git a/packages/create-solid/src/index.ts b/packages/create/src/index.ts similarity index 100% rename from packages/create-solid/src/index.ts rename to packages/create/src/index.ts diff --git a/packages/create-solid/src/utils/constants.ts b/packages/create/src/utils/constants.ts similarity index 100% rename from packages/create-solid/src/utils/constants.ts rename to packages/create/src/utils/constants.ts diff --git a/packages/create-solid/src/utils/file-system.ts b/packages/create/src/utils/file-system.ts similarity index 100% rename from packages/create-solid/src/utils/file-system.ts rename to packages/create/src/utils/file-system.ts diff --git a/packages/create-solid/src/utils/ts-conversion.ts b/packages/create/src/utils/ts-conversion.ts similarity index 100% rename from packages/create-solid/src/utils/ts-conversion.ts rename to packages/create/src/utils/ts-conversion.ts diff --git a/packages/create-solid/src/utils/ui.ts b/packages/create/src/utils/ui.ts similarity index 100% rename from packages/create-solid/src/utils/ui.ts rename to packages/create/src/utils/ui.ts diff --git a/packages/create/tests/template.test.ts b/packages/create/tests/template.test.ts new file mode 100644 index 0000000..c29d52b --- /dev/null +++ b/packages/create/tests/template.test.ts @@ -0,0 +1,9 @@ +import { expect, it } from "vitest"; +import { createVanilla } from "../src" +import { existsSync } from "fs"; +it("downloads and extracts the typescript template", async () => { + await createVanilla({ template: "ts", destination: "./test/ts" }, false) + + const appTsx = existsSync("./test/ts/src/App.tsx"); + expect(appTsx).toBe(true); +}) \ No newline at end of file diff --git a/packages/create/tsconfig.json b/packages/create/tsconfig.json new file mode 100644 index 0000000..51a5a37 --- /dev/null +++ b/packages/create/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "ESNext", + "target": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "resolveJsonModule": true, + + "declaration": true, + "emitDeclarationOnly": true, + "outDir": "types" + }, + "include": ["src/*"] +} diff --git a/packages/create/tsup.config.ts b/packages/create/tsup.config.ts new file mode 100644 index 0000000..4a06abf --- /dev/null +++ b/packages/create/tsup.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/index.ts"], + target: "esnext", + format: "esm", + splitting: true, + sourcemap: false, + clean: true, + treeshake: true, + banner: { + js: `import { createRequire } from "module"; + const require = createRequire(import.meta.url);`, + }, +}); diff --git a/packages/full-solid/package.json b/packages/full-solid/package.json index c684adf..3d6bc37 100644 --- a/packages/full-solid/package.json +++ b/packages/full-solid/package.json @@ -34,7 +34,7 @@ "picocolors": "^1.1.1", "@types/node": "^22.10.7", "citty": "^0.1.6", - "create-solid": "workspace:*", + "@solid-cli/create": "workspace:*", "jiti": "^2.4.2", "tsup": "^8.3.5", "typescript": "^5.7.3" diff --git a/packages/full-solid/src/bin.ts b/packages/full-solid/src/bin.ts index 79b8f47..c509d5a 100644 --- a/packages/full-solid/src/bin.ts +++ b/packages/full-solid/src/bin.ts @@ -1,7 +1,7 @@ #! /usr/bin/env node import { defineCommand, runMain } from "citty"; -import { createSolid } from "create-solid"; +import { createSolid } from "@solid-cli/create"; import packageJson from "../package.json" with { type: "json" }; import { intro } from "@clack/prompts"; import * as color from "picocolors"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd3c1bd..209b968 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^3.0.2 version: 3.0.2(@types/node@22.10.7) - packages/create-solid: - devDependencies: + packages/create: + dependencies: '@begit/core': specifier: ^0.1.1 version: 0.1.1 @@ -35,6 +35,43 @@ importers: '@solid-cli/utils': specifier: workspace:* version: link:../utils + citty: + specifier: ^0.1.6 + version: 0.1.6 + cmd-ts: + specifier: ^0.13.0 + version: 0.13.0 + picocolors: + specifier: ^1.1.1 + version: 1.1.1 + sucrase: + specifier: ^3.35.0 + version: 3.35.0 + devDependencies: + '@types/node': + specifier: ^22.10.7 + version: 22.10.7 + jiti: + specifier: ^2.4.2 + version: 2.4.2 + tsup: + specifier: ^8.3.5 + version: 8.3.5(@swc/core@1.5.5)(jiti@2.4.2)(postcss@8.4.38)(typescript@5.7.3) + typescript: + specifier: ^5.7.3 + version: 5.7.3 + + packages/create-solid: + devDependencies: + '@begit/core': + specifier: ^0.1.1 + version: 0.1.1 + '@clack/prompts': + specifier: 0.9.1 + version: 0.9.1 + '@solid-cli/create': + specifier: workspace:* + version: link:../create '@types/node': specifier: ^22.10.7 version: 22.10.7 @@ -65,15 +102,15 @@ importers: '@clack/prompts': specifier: 0.9.1 version: 0.9.1 + '@solid-cli/create': + specifier: workspace:* + version: link:../create '@types/node': specifier: ^22.10.7 version: 22.10.7 citty: specifier: ^0.1.6 version: 0.1.6 - create-solid: - specifier: workspace:* - version: link:../create-solid jiti: specifier: ^2.4.2 version: 2.4.2 From 054c5bedf3045b8653cd5560a32697d68053e2e4 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 15:27:13 +0000 Subject: [PATCH 24/35] feat: don't emit or include types in `create-solid` --- packages/create-solid/package.json | 3 +-- packages/create-solid/tsconfig.json | 5 +---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index 89a7dda..775dd46 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -31,8 +31,7 @@ "create-solid": "./dist/bin.mjs" }, "files": [ - "dist", - "types" + "dist" ], "scripts": { "start": "jiti ./src/bin.ts", diff --git a/packages/create-solid/tsconfig.json b/packages/create-solid/tsconfig.json index 51a5a37..1115998 100644 --- a/packages/create-solid/tsconfig.json +++ b/packages/create-solid/tsconfig.json @@ -8,10 +8,7 @@ "forceConsistentCasingInFileNames": true, "skipLibCheck": true, "resolveJsonModule": true, - - "declaration": true, - "emitDeclarationOnly": true, - "outDir": "types" + "noEmit": true }, "include": ["src/*"] } From b26317ea6b16c641e9b4c91d9a909a66d47f03c8 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 15:28:38 +0000 Subject: [PATCH 25/35] fix: remove shebang from `@solid-cli/create` --- packages/create/src/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/create/src/index.ts b/packages/create/src/index.ts index 79848e8..9047ba8 100644 --- a/packages/create/src/index.ts +++ b/packages/create/src/index.ts @@ -1,5 +1,3 @@ -#! /usr/bin/env node - import { defineCommand } from "citty"; import { createVanilla } from "./create-vanilla"; import * as p from "@clack/prompts"; From d6a0e0c10e8e25796d8d094e410ed8cbfbdface6 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 15:29:30 +0000 Subject: [PATCH 26/35] refactor: actually remove all exports from `create-solid` --- packages/create-solid/package.json | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index 775dd46..3d69f12 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -20,13 +20,6 @@ "main": "./dist/index.mjs", "module": "./dist/index.mjs", "types": "./types/src/index.d.ts", - "exports": { - ".": { - "import": "./dist/index.mjs", - "require": "./dist/index.mjs", - "types": "./types/src/index.d.ts" - } - }, "bin": { "create-solid": "./dist/bin.mjs" }, From e7ceae32b24549a01bb1792d5560cbae7461f2ac Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 15:43:43 +0000 Subject: [PATCH 27/35] fix: change types export for `@solid-cli/create` --- packages/create/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/create/package.json b/packages/create/package.json index 6d14e43..1dc1b05 100644 --- a/packages/create/package.json +++ b/packages/create/package.json @@ -19,12 +19,12 @@ ], "main": "./dist/index.mjs", "module": "./dist/index.mjs", - "types": "./types/src/index.d.ts", + "types": "./types/index.d.ts", "exports": { ".": { "import": "./dist/index.mjs", "require": "./dist/index.mjs", - "types": "./types/src/index.d.ts" + "types": "./types/index.d.ts" } }, "files": [ From 792a55408a849c4f30a5aa799c6bf638ab401059 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 15:44:50 +0000 Subject: [PATCH 28/35] fix: remove unnecessary test --- packages/create-solid/tests/template.test.ts | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 packages/create-solid/tests/template.test.ts diff --git a/packages/create-solid/tests/template.test.ts b/packages/create-solid/tests/template.test.ts deleted file mode 100644 index c29d52b..0000000 --- a/packages/create-solid/tests/template.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { expect, it } from "vitest"; -import { createVanilla } from "../src" -import { existsSync } from "fs"; -it("downloads and extracts the typescript template", async () => { - await createVanilla({ template: "ts", destination: "./test/ts" }, false) - - const appTsx = existsSync("./test/ts/src/App.tsx"); - expect(appTsx).toBe(true); -}) \ No newline at end of file From c3f4fca61349856672f49bcaa36fa47e5fcab76c Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 16:09:30 +0000 Subject: [PATCH 29/35] feat: run tests on ubuntu, windows, and macos This should help catch platform-specific bugs --- .github/workflows/tests.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 357d2cb..3f71550 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -8,7 +8,10 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] steps: - uses: actions/checkout@v4 From 2de6bec3450bb2cb37c137939e11e01c2e451b9a Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 16:48:14 +0000 Subject: [PATCH 30/35] refactor: remove unused dependencies refactor: make `jiti` a workspace dependency --- package.json | 11 +- packages/create-solid/package.json | 4 - packages/create/package.json | 4 +- packages/full-solid/package.json | 1 - packages/utils/package.json | 1 - pnpm-lock.yaml | 186 +---------------------------- 6 files changed, 11 insertions(+), 196 deletions(-) diff --git a/package.json b/package.json index 1e46299..fff9261 100644 --- a/package.json +++ b/package.json @@ -14,11 +14,6 @@ "test:all": "turbo run test", "build": "turbo run build", "release": "pnpm build && changeset publish", - "watch:all": "nodemon --no-stdin -q --watch packages/core/src -e ts --exec 'turbo run build --scope=core' --watch packages/reactivity/src -e ts --exec 'turbo run build --scope=reactivity' --watch packages/ui/src -e ts --exec 'turbo run build --scope=ui' --watch packages/utils/src -e ts --exec 'turbo run build --scope=utils'", - "watch:core": "nodemon --watch packages/core/src -e ts --exec 'turbo run build --scope=core'", - "watch:reactivity": "nodemon --watch packages/reactivity/src -e ts --exec 'turbo run build --scope=reactivity'", - "watch:ui": "nodemon --watch packages/ui/src -e ts --exec 'turbo run build --scope=ui'", - "watch:utils": "nodemon --watch packages/utils/src -e ts --exec 'turbo run build --scope=utils'", "start": "cd packages/core && pnpm start", "format": "prettier --write ." }, @@ -35,10 +30,12 @@ ], "devDependencies": { "@changesets/cli": "2.27.11", - "nodemon": "^3.1.9", "prettier": "^3.4.2", "turbo": "^2.3.3", "vitest": "^3.0.2" }, - "packageManager": "pnpm@9.6.0" + "packageManager": "pnpm@9.6.0", + "dependencies": { + "jiti": "^2.4.2" + } } diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index 3d69f12..67f2183 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -34,14 +34,10 @@ "devDependencies": { "@clack/prompts": "0.9.1", "@types/node": "^22.10.7", - "cmd-ts": "^0.13.0", - "jiti": "^2.4.2", "picocolors": "^1.1.1", "tsup": "^8.3.5", "typescript": "^5.7.3", - "@begit/core": "^0.1.1", "citty": "^0.1.6", - "sucrase": "^3.35.0", "@solid-cli/create": "workspace:*" }, "publishConfig": { diff --git a/packages/create/package.json b/packages/create/package.json index 1dc1b05..d432bce 100644 --- a/packages/create/package.json +++ b/packages/create/package.json @@ -39,15 +39,13 @@ "devDependencies": { "typescript": "^5.7.3", "@types/node": "^22.10.7", - "tsup": "^8.3.5", - "jiti": "^2.4.2" + "tsup": "^8.3.5" }, "publishConfig": { "access": "public" }, "dependencies": { "@clack/prompts": "0.9.1", - "cmd-ts": "^0.13.0", "picocolors": "^1.1.1", "@begit/core": "^0.1.1", "citty": "^0.1.6", diff --git a/packages/full-solid/package.json b/packages/full-solid/package.json index 3d6bc37..6d8e038 100644 --- a/packages/full-solid/package.json +++ b/packages/full-solid/package.json @@ -35,7 +35,6 @@ "@types/node": "^22.10.7", "citty": "^0.1.6", "@solid-cli/create": "workspace:*", - "jiti": "^2.4.2", "tsup": "^8.3.5", "typescript": "^5.7.3" }, diff --git a/packages/utils/package.json b/packages/utils/package.json index 6c0ceb5..d172aad 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -64,7 +64,6 @@ "devDependencies": { "@chialab/esbuild-plugin-meta-url": "^0.18.2", "@types/node": "22.10.7", - "jiti": "^2.4.2", "magicast": "^0.3.5", "tsup": "^8.3.5", "typescript": "^5.7.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 209b968..8382e3f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,13 +7,14 @@ settings: importers: .: + dependencies: + jiti: + specifier: ^2.4.2 + version: 2.4.2 devDependencies: '@changesets/cli': specifier: 2.27.11 version: 2.27.11 - nodemon: - specifier: ^3.1.9 - version: 3.1.9 prettier: specifier: ^3.4.2 version: 3.4.2 @@ -38,9 +39,6 @@ importers: citty: specifier: ^0.1.6 version: 0.1.6 - cmd-ts: - specifier: ^0.13.0 - version: 0.13.0 picocolors: specifier: ^1.1.1 version: 1.1.1 @@ -51,9 +49,6 @@ importers: '@types/node': specifier: ^22.10.7 version: 22.10.7 - jiti: - specifier: ^2.4.2 - version: 2.4.2 tsup: specifier: ^8.3.5 version: 8.3.5(@swc/core@1.5.5)(jiti@2.4.2)(postcss@8.4.38)(typescript@5.7.3) @@ -63,9 +58,6 @@ importers: packages/create-solid: devDependencies: - '@begit/core': - specifier: ^0.1.1 - version: 0.1.1 '@clack/prompts': specifier: 0.9.1 version: 0.9.1 @@ -78,18 +70,9 @@ importers: citty: specifier: ^0.1.6 version: 0.1.6 - cmd-ts: - specifier: ^0.13.0 - version: 0.13.0 - jiti: - specifier: ^2.4.2 - version: 2.4.2 picocolors: specifier: ^1.1.1 version: 1.1.1 - sucrase: - specifier: ^3.35.0 - version: 3.35.0 tsup: specifier: ^8.3.5 version: 8.3.5(@swc/core@1.5.5)(jiti@2.4.2)(postcss@8.4.38)(typescript@5.7.3) @@ -111,9 +94,6 @@ importers: citty: specifier: ^0.1.6 version: 0.1.6 - jiti: - specifier: ^2.4.2 - version: 2.4.2 picocolors: specifier: ^1.1.1 version: 1.1.1 @@ -151,9 +131,6 @@ importers: '@types/node': specifier: 22.10.7 version: 22.10.7 - jiti: - specifier: ^2.4.2 - version: 2.4.2 magicast: specifier: ^0.3.5 version: 0.3.5 @@ -900,9 +877,6 @@ packages: '@vitest/utils@3.0.2': resolution: {integrity: sha512-Qu01ZYZlgHvDP02JnMBRpX43nRaZtNpIzw3C1clDXmn8eakgX6iQVGzTQ/NjkIr64WD8ioqOjkaYRVvHQI5qiw==} - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -926,10 +900,6 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -948,13 +918,6 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -991,10 +954,6 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - chokidar@4.0.1: resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} @@ -1024,9 +983,6 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -1206,10 +1162,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1225,17 +1177,10 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1355,9 +1300,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -1397,19 +1339,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nodemon@3.1.9: - resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==} - engines: {node: '>=10'} - hasBin: true - - nopt@1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - npm-run-path@6.0.0: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} @@ -1534,9 +1463,6 @@ packages: resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} engines: {node: '>=18'} - pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -1548,10 +1474,6 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - readdirp@4.0.2: resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} engines: {node: '>= 14.16.0'} @@ -1608,10 +1530,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -1672,10 +1590,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1732,10 +1646,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - touch@3.1.0: - resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} - hasBin: true - tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -1804,9 +1714,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} @@ -2524,8 +2431,6 @@ snapshots: loupe: 3.1.2 tinyrainbow: 2.0.0 - abbrev@1.1.1: {} - ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -2540,11 +2445,6 @@ snapshots: any-promise@1.3.0: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -2559,13 +2459,6 @@ snapshots: dependencies: is-windows: 1.0.2 - binary-extensions@2.2.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -2602,18 +2495,6 @@ snapshots: check-error@2.1.1: {} - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - chokidar@4.0.1: dependencies: readdirp: 4.0.2 @@ -2643,8 +2524,6 @@ snapshots: commander@4.1.1: {} - concat-map@0.0.1: {} - consola@3.2.3: {} cross-spawn@7.0.3: @@ -2663,11 +2542,9 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.3.7(supports-color@5.5.0): + debug@4.3.7: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 5.5.0 debug@4.4.0: dependencies: @@ -2865,8 +2742,6 @@ snapshots: graceful-fs@4.2.11: {} - has-flag@3.0.0: {} - has-flag@4.0.0: {} human-id@1.0.2: {} @@ -2877,14 +2752,8 @@ snapshots: dependencies: safer-buffer: 2.1.2 - ignore-by-default@1.0.1: {} - ignore@5.2.4: {} - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.2.0 - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -2982,10 +2851,6 @@ snapshots: dependencies: mime-db: 1.52.0 - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 @@ -3015,25 +2880,6 @@ snapshots: nanoid@3.3.7: {} - nodemon@3.1.9: - dependencies: - chokidar: 3.6.0 - debug: 4.3.7(supports-color@5.5.0) - ignore-by-default: 1.0.1 - minimatch: 3.1.2 - pstree.remy: 1.1.8 - semver: 7.6.0 - simple-update-notifier: 2.0.0 - supports-color: 5.5.0 - touch: 3.1.0 - undefsafe: 2.0.5 - - nopt@1.0.10: - dependencies: - abbrev: 1.1.1 - - normalize-path@3.0.0: {} - npm-run-path@6.0.0: dependencies: path-key: 4.0.0 @@ -3113,8 +2959,6 @@ snapshots: dependencies: parse-ms: 4.0.0 - pstree.remy@1.1.8: {} - punycode@2.3.0: {} queue-microtask@1.2.3: {} @@ -3126,10 +2970,6 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - readdirp@4.0.2: {} regenerator-runtime@0.14.1: {} @@ -3208,10 +3048,6 @@ snapshots: signal-exit@4.1.0: {} - simple-update-notifier@2.0.0: - dependencies: - semver: 7.6.0 - sisteransi@1.0.5: {} slash@3.0.0: {} @@ -3269,10 +3105,6 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -3323,10 +3155,6 @@ snapshots: dependencies: is-number: 7.0.0 - touch@3.1.0: - dependencies: - nopt: 1.0.10 - tr46@1.0.1: dependencies: punycode: 2.3.0 @@ -3341,7 +3169,7 @@ snapshots: cac: 6.7.14 chokidar: 4.0.1 consola: 3.2.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7 esbuild: 0.24.0 joycon: 3.1.1 picocolors: 1.1.1 @@ -3392,8 +3220,6 @@ snapshots: typescript@5.7.3: {} - undefsafe@2.0.5: {} - undici-types@6.20.0: {} unicorn-magic@0.3.0: {} From 442e55dd16b4883eaa398347adbfe66f9f677210 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 16:58:03 +0000 Subject: [PATCH 31/35] fix: reorder `types` in `package.json`s to avoid build warning feat: use `turbo watch` for automatically rebuilding on change --- package.json | 3 ++- packages/create-solid/package.json | 1 - packages/create/package.json | 4 ++-- packages/full-solid/src/bin.ts | 2 +- packages/utils/package.json | 32 +++++++++++++++--------------- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index fff9261..97e62cc 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "build": "turbo run build", "release": "pnpm build && changeset publish", "start": "cd packages/core && pnpm start", - "format": "prettier --write ." + "format": "prettier --write .", + "watch:build": "turbo watch build" }, "contributors": [ { diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index 67f2183..ea58685 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -19,7 +19,6 @@ ], "main": "./dist/index.mjs", "module": "./dist/index.mjs", - "types": "./types/src/index.d.ts", "bin": { "create-solid": "./dist/bin.mjs" }, diff --git a/packages/create/package.json b/packages/create/package.json index d432bce..2196c4e 100644 --- a/packages/create/package.json +++ b/packages/create/package.json @@ -22,9 +22,9 @@ "types": "./types/index.d.ts", "exports": { ".": { + "types": "./types/index.d.ts", "import": "./dist/index.mjs", - "require": "./dist/index.mjs", - "types": "./types/index.d.ts" + "require": "./dist/index.mjs" } }, "files": [ diff --git a/packages/full-solid/src/bin.ts b/packages/full-solid/src/bin.ts index c509d5a..4c1c95e 100644 --- a/packages/full-solid/src/bin.ts +++ b/packages/full-solid/src/bin.ts @@ -9,6 +9,6 @@ intro(`\n${color.bgCyan(color.black(` Solid CLI v${packageJson.version}`))}`); const main = defineCommand({ subCommands: { create: createSolid(packageJson.version) }, -}) +}); runMain(main); \ No newline at end of file diff --git a/packages/utils/package.json b/packages/utils/package.json index d172aad..d0894fe 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -17,44 +17,44 @@ "types": "./types/index.d.ts", "exports": { ".": { + "types": "./types/index.d.ts", "import": "./dist/index.mjs", - "require": "./dist/index.mjs", - "types": "./types/index.d.ts" + "require": "./dist/index.mjs" }, "./paths": { + "types": "./types/paths/index.d.ts", "import": "./dist/paths/index.mjs", - "require": "./dist/paths/index.mjs", - "types": "./types/paths/index.d.ts" + "require": "./dist/paths/index.mjs" }, "./transform": { + "types": "./types/transform/index.d.ts", "import": "./dist/transform/index.mjs", - "require": "./dist/transform/index.mjs", - "types": "./types/transform/index.d.ts" + "require": "./dist/transform/index.mjs" }, "./updates": { + "types": "./types/updates/index.d.ts", "import": "./dist/updates/index.mjs", - "require": "./dist/updates/index.mjs", - "types": "./types/updates/index.d.ts" + "require": "./dist/updates/index.mjs" }, "./fs": { + "types": "./types/fs/index.d.ts", "import": "./dist/fs/index.mjs", - "require": "./dist/fs/index.mjs", - "types": "./types/fs/index.d.ts" + "require": "./dist/fs/index.mjs" }, "./util-types": { + "types": "./types/util-types/index.d.ts", "import": "./dist/util-types/index.mjs", - "require": "./dist/util-types/index.mjs", - "types": "./types/util-types/index.d.ts" + "require": "./dist/util-types/index.mjs" }, "./primitives": { + "types": "./types/primitives/index.d.ts", "import": "./dist/primitives/index.mjs", - "require": "./dist/primitives/index.mjs", - "types": "./types/primitives/index.d.ts" + "require": "./dist/primitives/index.mjs" }, "./package-manager": { + "types": "./types/package-manager/index.d.ts", "import": "./dist/package-manager/index.mjs", - "require": "./dist/package-manager/index.mjs", - "types": "./types/package-manager/index.d.ts" + "require": "./dist/package-manager/index.mjs" } }, "scripts": { From 1089fdc726c19391314adfb89e8038a0b8205fce Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 17:07:35 +0000 Subject: [PATCH 32/35] refactor(utils): remove in-memory cache from filesystem helpers --- packages/utils/src/fs/index.ts | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/utils/src/fs/index.ts b/packages/utils/src/fs/index.ts index 8f992b3..a252d99 100644 --- a/packages/utils/src/fs/index.ts +++ b/packages/utils/src/fs/index.ts @@ -1,22 +1,22 @@ -import { readFile as readFile1 } from "fs/promises"; -import { queueUpdate, readQueuedFile, unqueueUpdate } from "../updates"; -export const writeFile = (path: string, data: string, checked: boolean = false) => { - // First, unqueue all previous updates to this file - unqueueUpdate(path, "file"); - queueUpdate({ type: "file", name: path, contents: data, checked }); -}; -export const readFile = async (path: string) => { - const queued = readQueuedFile(path); - if (queued) return queued.contents; - return await readFile1(path); -}; +import { readFile, writeFile } from "fs/promises"; +// import { queueUpdate, readQueuedFile, unqueueUpdate } from "../updates"; +// export const writeFile = (path: string, data: string, checked: boolean = false) => { +// // First, unqueue all previous updates to this file +// unqueueUpdate(path, "file"); +// queueUpdate({ type: "file", name: path, contents: data, checked }); +// }; +// export const readFile = async (path: string) => { +// const queued = readQueuedFile(path); +// if (queued) return queued.contents; +// return await readFile1(path); +// }; export const readFileToString = async (path: string) => { return (await readFile(path)).toString(); }; -export const writeChecked = async (path: string, contents: string) => { - unqueueUpdate(path, "file"); - queueUpdate({ type: "file", name: path, contents, checked: true }); -}; +// export const writeChecked = async (path: string, contents: string) => { +// unqueueUpdate(path, "file"); +// queueUpdate({ type: "file", name: path, contents, checked: true }); +// }; export const insertAtBeginning = async (path: string, text: string) => { const contents = await readFileToString(path); writeFile(path, text + contents); From b7bb42d3b07394e7fc4ecfbb57ca4f5208bfbd5f Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 17:10:36 +0000 Subject: [PATCH 33/35] feat: add "Created with Solid CLI" text to README --- packages/create/src/index.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/create/src/index.ts b/packages/create/src/index.ts index 9047ba8..22ed52a 100644 --- a/packages/create/src/index.ts +++ b/packages/create/src/index.ts @@ -5,6 +5,8 @@ import { cancelable, spinnerify } from "./utils/ui"; import { createStart } from "./create-start"; import { getTemplatesList, StartTemplate, VanillaTemplate } from "./utils/constants"; import { detectPackageManager } from "@solid-cli/utils/package-manager"; +import { insertAtEnd } from "@solid-cli/utils/fs"; +import { existsSync } from "node:fs"; export { createVanilla, createStart }; export const createSolid = (version: string) => defineCommand({ @@ -73,7 +75,12 @@ export const createSolid = (version: string) => fn: () => createVanilla({ template: template as VanillaTemplate, destination: projectName }, isJS), }); } - + // Add "Created with Solid CLI" text to bottom of README + if (existsSync(`${projectName}/README.md`)) + await insertAtEnd( + `${projectName}/README.md`, + "\n## This project was created with the [Solid CLI](https://solid-cli.netlify.app)\n", + ); // Next steps.. const pM = detectPackageManager(); p.note( From 558b2bdd767843684f62287913ee09257b9175aa Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 17:13:07 +0000 Subject: [PATCH 34/35] fix: add blank `writeChecked` implementation to fix build --- packages/utils/src/fs/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/utils/src/fs/index.ts b/packages/utils/src/fs/index.ts index a252d99..1953f2c 100644 --- a/packages/utils/src/fs/index.ts +++ b/packages/utils/src/fs/index.ts @@ -17,6 +17,7 @@ export const readFileToString = async (path: string) => { // unqueueUpdate(path, "file"); // queueUpdate({ type: "file", name: path, contents, checked: true }); // }; +export const writeChecked = async (_path: string, _contents: string) => { throw new Error("Unimplemented") } export const insertAtBeginning = async (path: string, text: string) => { const contents = await readFileToString(path); writeFile(path, text + contents); From b66cee387a8c71f0c1c4213c6e690ae1c61a2480 Mon Sep 17 00:00:00 2001 From: Thomas Beer <71586988+Tommypop2@users.noreply.github.com> Date: Sun, 19 Jan 2025 17:32:55 +0000 Subject: [PATCH 35/35] release alpha package versions --- .changeset/pre.json | 11 +++++++++++ packages/create-solid/package.json | 2 +- packages/create/package.json | 2 +- packages/full-solid/package.json | 2 +- packages/utils/package.json | 2 +- 5 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 .changeset/pre.json diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 0000000..d94f0a0 --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,11 @@ +{ + "mode": "pre", + "tag": "alpha", + "initialVersions": { + "@solid-cli/create": "0.6.0-alpha.0", + "create-solid": "0.6.0-alpha.1", + "@solid-cli/full": "0.6.0-alpha.0", + "@solid-cli/utils": "0.6.0-alpha.0" + }, + "changesets": [] +} diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json index ea58685..f79ad38 100644 --- a/packages/create-solid/package.json +++ b/packages/create-solid/package.json @@ -1,6 +1,6 @@ { "name": "create-solid", - "version": "0.5.13", + "version": "0.6.0-alpha.1", "description": "Create Solid apps with low configuration", "author": "Thomas Beer", "contributors": [ diff --git a/packages/create/package.json b/packages/create/package.json index 2196c4e..b3cd0d6 100644 --- a/packages/create/package.json +++ b/packages/create/package.json @@ -1,6 +1,6 @@ { "name": "@solid-cli/create", - "version": "0.5.13", + "version": "0.6.0-alpha.0", "description": "Create Solid apps with low configuration", "author": "Thomas Beer", "contributors": [ diff --git a/packages/full-solid/package.json b/packages/full-solid/package.json index 6d8e038..b5314dc 100644 --- a/packages/full-solid/package.json +++ b/packages/full-solid/package.json @@ -1,6 +1,6 @@ { "name": "@solid-cli/full", - "version": "0.5.13", + "version": "0.6.0-alpha.0", "description": "Create Solid apps with low configuration", "author": "Thomas Beer", "contributors": [ diff --git a/packages/utils/package.json b/packages/utils/package.json index d0894fe..135c353 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@solid-cli/utils", - "version": "0.0.15", + "version": "0.6.0-alpha.0", "description": "A collection of utilities for the Solid CLI", "license": "MIT", "homepage": "https://solid-cli.netlify.app",