diff --git a/.changeset/rotten-tips-cry.md b/.changeset/rotten-tips-cry.md new file mode 100644 index 000000000..012c50229 --- /dev/null +++ b/.changeset/rotten-tips-cry.md @@ -0,0 +1,5 @@ +--- +'create-kitql': patch +--- + +init create kitql diff --git a/packages/create-kitql/.eslintrc.cjs b/packages/create-kitql/.eslintrc.cjs new file mode 100644 index 000000000..13b901e03 --- /dev/null +++ b/packages/create-kitql/.eslintrc.cjs @@ -0,0 +1,3 @@ +module.exports = { + extends: ['eslint-config-kitql'], +} diff --git a/packages/create-kitql/.gitignore b/packages/create-kitql/.gitignore new file mode 100644 index 000000000..ebb0ef1ce --- /dev/null +++ b/packages/create-kitql/.gitignore @@ -0,0 +1 @@ +test-* diff --git a/packages/create-kitql/CHANGELOG.md b/packages/create-kitql/CHANGELOG.md new file mode 100644 index 000000000..30dd6ab4f --- /dev/null +++ b/packages/create-kitql/CHANGELOG.md @@ -0,0 +1 @@ +# create-kitql \ No newline at end of file diff --git a/packages/create-kitql/README.md b/packages/create-kitql/README.md new file mode 100644 index 000000000..2a6588979 --- /dev/null +++ b/packages/create-kitql/README.md @@ -0,0 +1,18 @@ +# ⚡ create kitql + +_Part of [KitQL](https://github.com/jycouet/kitql#kitql), a set of tools helping 🫵 building efficient apps in a fast way._ + +## 📖 Read the doc + +[![](https://img.shields.io/badge/Documentation%20of-create%20kitql-FF3E00.svg?style=flat&logo=data:image/svg%2bxml;base64,PHN2ZyB3aWR0aD0iNTAwIiBoZWlnaHQ9IjUwMCIgdmlld0JveD0iMCAwIDUwMCA1MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjkwLjQ0NSA0NjAuMjA3QzI5MC40NDUgNDYyLjE1NyAyOTAuMjU2IDQ2NC4wNTggMjg5Ljk2MSA0NjUuOTI2QzI4OS45MjQgNDY2LjE2NCAyODkuODk2IDQ2Ni4zOTYgMjg5Ljg1NSA0NjYuNjI3QzI4Ni44MDIgNDg0LjE2NCAyNzEuNTA5IDQ5Ny41NDYgMjUzLjExMyA0OTcuNTQ2QzIzNi43MSA0OTcuNTQ2IDIyMi43NzkgNDg2Ljg5NCAyMTcuNzc3IDQ3Mi4xNTlMNjIuNDQyMiAzODIuNDg2QzQ3LjAzNzggMzczLjU5MiAzNy41NTQ0IDM1Ny4xNTIgMzcuNTU0NCAzMzkuMzc4VjE4OC4zMzJDNDMuMzA4MSAxOTAuMjgxIDQ5LjQ0MzMgMTkxLjM4NSA1NS44NTYgMTkxLjM4NUM2MS42MDk3IDE5MS4zODUgNjcuMTYwOCAxOTAuNTEyIDcyLjM5OTggMTg4LjkyOFYzMzkuMzc4QzcyLjM5OTggMzQ0LjY5MSA3NS4yNTYyIDM0OS42NDEgNzkuODcwNyAzNTIuMzAyTDIyNC43NzQgNDM1Ljk2MUMyMzEuNjI3IDQyNy45NjUgMjQxLjc3NCA0MjIuODcxIDI1My4xMTMgNDIyLjg3MUMyNjUuNDQ5IDQyMi44NzEgMjc2LjM2NCA0MjguOTAxIDI4My4xNzEgNDM4LjE0OEMyODMuMjkzIDQzOC4zMTYgMjgzLjQxOSA0MzguNDc3IDI4My41NDEgNDM4LjY0NUMyODQuMDE2IDQzOS4zMiAyODQuNDY4IDQ0MC4wMDkgMjg0LjkwMSA0NDAuNzIxQzI4NS4wNjcgNDQwLjk5MyAyODUuMjM1IDQ0MS4yNTggMjg1LjM5NiA0NDEuNTM3QzI4NS43NzkgNDQyLjE4OSAyODYuMTMxIDQ0Mi44NTkgMjg2LjQ3MiA0NDMuNTM3QzI4Ni42NTkgNDQzLjkwMSAyODYuODMyIDQ0NC4yNjUgMjg3IDQ0NC42MzZDMjg3LjI5NSA0NDUuMjY1IDI4Ny41NjcgNDQ1LjkwMSAyODcuODI1IDQ0Ni41NDhDMjg4LjAxMiA0NDcuMDEyIDI4OC4xNzMgNDQ3LjQ3NSAyODguMzQxIDQ0Ny45NDJDMjg4LjU0OCA0NDguNTMyIDI4OC43NTEgNDQ5LjEyOSAyODguOTI0IDQ0OS43M0MyODkuMDk5IDQ1MC4zMDkgMjg5LjIyNiA0NTAuODg3IDI4OS4zNzEgNDUxLjQ1OUMyODkuNTAyIDQ1Mi4wMDIgMjg5LjY0MSA0NTIuNTM5IDI4OS43NDcgNDUzLjA5QzI4OS44OTIgNDUzLjgxMSAyODkuOTg0IDQ1NC41NDIgMjkwLjA4OCA0NTUuMjc0QzI5MC4xMzggNDU1LjcyMSAyOTAuMjI2IDQ1Ni4xNDMgMjkwLjI2NyA0NTYuNTgzQzI5MC4zNzYgNDU3Ljc3OSAyOTAuNDQ1IDQ1OC45ODIgMjkwLjQ0NSA0NjAuMjA3Wk00ODEuNDgyIDEzNC4xMzlDNDgxLjQ4MiAxNDUuMzQgNDc2LjUwOSAxNTUuMzc4IDQ2OC42NjggMTYyLjIyNFYzMzkuMzc4QzQ2OC42NjggMzU3LjE1MiA0NTkuMTg5IDM3My41OTIgNDQzLjc3OSAzODIuNDg2TDMxMC4zMjUgNDU5LjUzMkMzMTAuMTc1IDQ0Ni45MjQgMzA1LjkxNSA0MzUuMzIgMjk4Ljg0OCA0MjUuOTE3TDQyNi4zNTcgMzUyLjMwMkM0MzAuOTY1IDM0OS42NDEgNDMzLjgyMyAzNDQuNjkxIDQzMy44MjMgMzM5LjM3OFYxNjkuOTkxQzQxOC4yNTEgMTY1LjUwMyA0MDYuODExIDE1MS4xNDUgNDA2LjgxMSAxMzQuMTM5QzQwNi44MTEgMTI1Ljg1OCA0MDkuNTYgMTE4LjIyNiA0MTQuMTM4IDExMi4wMzJDNDE0LjIwMyAxMTEuOTM0IDQxNC4yNzkgMTExLjgzNiA0MTQuMzUzIDExMS43MzhDNDE1LjIxNCAxMTAuNTkzIDQxNi4xNDEgMTA5LjQ4OCA0MTcuMTI3IDEwOC40NDdMNDE3LjI2IDEwOC4zMDNDNDE5LjMwOSAxMDYuMTY5IDQyMS41OTkgMTA0LjI5NSA0MjQuMDk3IDEwMi42OTRDNDI0LjM1NyAxMDIuNTI2IDQyNC42MjcgMTAyLjM3NiA0MjQuODk0IDEwMi4yMDhDNDI1Ljg4MyAxMDEuNjE4IDQyNi44OTQgMTAxLjA1NyA0MjcuOTM1IDEwMC41NTVDNDI4LjI0MiAxMDAuNDEgNDI4LjU0OCAxMDAuMjU0IDQyOC44NjIgMTAwLjExNUM0MzAuMTYxIDk5LjUyNDkgNDMxLjUwNSA5OC45ODEzIDQzMi44ODUgOTguNTUzN0M0MzIuODkyIDk4LjU1MzcgNDMyLjg5MiA5OC41NTM3IDQzMi44OTIgOTguNTQ4MkM0MzYuNDQ3IDk3LjQyMDMgNDQwLjIyNCA5Ni44MDE4IDQ0NC4xNSA5Ni44MDE4QzQ2NC43NCA5Ni44MDE4IDQ4MS40ODIgMTEzLjU0NyA0ODEuNDgyIDEzNC4xMzlaTTM3LjU1NDQgMTY2LjY0OEMyNi4yMDkyIDE2MC4yMzUgMTguNTE4NiAxNDguMDc1IDE4LjUxODYgMTM0LjEzOUMxOC41MTg2IDExMy41NDcgMzUuMjY0OCA5Ni44MDE4IDU1Ljg1NiA5Ni44MDE4QzYxLjE5MzMgOTYuODAxOCA2Ni4yNTg4IDk3Ljk1MTggNzAuODU1OCA5OS45NzU4TDIyOC4yMjEgOS4xMjE1NEMyMzUuOTE3IDQuNjc0ODEgMjQ0LjUyMSAyLjQ1NDM1IDI1My4xMDggMi40NTQzNUMyNjEuNzA3IDIuNDU0MzUgMjcwLjMwNiA0LjY3NDgxIDI3OC4wMDIgOS4xMjE1NEw0MTIuMjQyIDg2LjYzQzQwMi4zNjYgOTMuMjkxNyAzOTQuNzE3IDEwMi45NzEgMzkwLjUxOCAxMTQuMzExTDI2MC41NzggMzkuMzAwMkMyNTguMzExIDM3Ljk4NzggMjU1LjcyOCAzNy4yOTk1IDI1My4xMDggMzcuMjk5NUMyNTAuNDk1IDM3LjI5OTUgMjQ3LjkxNSAzNy45ODc4IDI0NS42NDMgMzkuMzAwMkw5Mi41OTIyIDEyNy42NjhDOTIuOTYyIDEyOS43NzMgOTMuMTg4IDEzMS45MjQgOTMuMTg4IDEzNC4xMzlDOTMuMTg4IDE1MC4yMDMgODIuOTcwMSAxNjMuODkgNjguNzEwNiAxNjkuMTQ2QzY4LjYwMDcgMTY5LjE4NyA2OC40ODUgMTY5LjIzMyA2OC4zODA5IDE2OS4yNjhDNjcuMjQxNyAxNjkuNjY3IDY2LjEwMjUgMTcwLjAxOSA2NC45Mjg4IDE3MC4zMTRDNjQuNjkxNyAxNzAuMzcyIDY0LjQ2MDQgMTcwLjQ0MiA2NC4yMjMzIDE3MC40ODhDNjMuMTQ3NyAxNzAuNzM2IDYyLjA0OTEgMTcwLjkzMyA2MC45NDQ3IDE3MS4wODlDNjAuNjQ0IDE3MS4xMjkgNjAuMzQ5MSAxNzEuMTg3IDYwLjA0MjYgMTcxLjIyMkM1OC42NjY0IDE3MS4zNzggNTcuMjcyOCAxNzEuNDc3IDU1Ljg1NiAxNzEuNDc3QzU0LjMzNTMgMTcxLjQ3NyA1Mi44Mzc2IDE3MS4zNTUgNTEuMzU3MSAxNzEuMTc2QzUwLjk2NDEgMTcxLjEyOSA1MC41NzY1IDE3MS4wNiA1MC4xNzc3IDE3MC45OTZDNDkuMDQ0MiAxNzAuODIzIDQ3LjkzNDEgMTcwLjYwNCA0Ni44Mjk1IDE3MC4zMjZDNDYuNDk0MiAxNzAuMjM5IDQ2LjE1MyAxNzAuMTY0IDQ1LjgxMiAxNzAuMDY2QzQyLjkwMzIgMTY5LjI0NCA0MC4xMzM0IDE2OC4xMDYgMzcuNTU0NCAxNjYuNjQ4WiIgZmlsbD0iI0ZGM0UwMCIvPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfNV8yKSI+CjxwYXRoIGQ9Ik0zNTIuMjI5IDEzOS40ODhDMzI2LjY3NCAxMDIuNzY2IDI3NS43OTcgOTIuMDA2OCAyMzkuMjIyIDExNS4xNjNMMTc0Ljc0NyAxNTYuMzI5QzE1Ny4xNjMgMTY3LjMyMiAxNDQuOTcxIDE4NS4zMzIgMTQxLjQ1NSAyMDUuNjgxQzEzOC40MDcgMjIyLjc1NiAxNDAuOTg2IDI0MC4yOTggMTQ5LjE5MiAyNTUuNTAyQzE0My41NjUgMjYzLjkyMiAxMzkuODEzIDI3My4yNzggMTM4LjE3MiAyODMuMTAyQzEzNC40MjEgMzAzLjkxOSAxMzkuMzQ1IDMyNS40MzcgMTUxLjUzNiAzNDIuNTEyQzE3Ny4zMjYgMzc5LjIzNCAyMjcuOTY4IDM4OS45OTMgMjY0LjU0MyAzNjYuODM3TDMyOS4wMTggMzI1LjkwNUMzNDYuNjAyIDMxNC45MTIgMzU4Ljc5NCAyOTYuOTAyIDM2Mi4zMTEgMjc2LjU1M0MzNjUuMzU5IDI1OS40NzggMzYyLjc4IDI0MS45MzYgMzU0LjU3NCAyMjYuNzMyQzM2MC4yMDEgMjE4LjMxMiAzNjMuOTUyIDIwOC45NTYgMzY1LjU5MyAxOTkuMTMyQzM2OS41NzkgMTc4LjA4MSAzNjQuNjU1IDE1Ni41NjMgMzUyLjIyOSAxMzkuNDg4WiIgZmlsbD0iI0ZGM0UwMCIvPgo8cGF0aCBkPSJNMjMyLjg5MiAzNDYuMDJDMjEyLjAyNSAzNTEuNCAxOTAuMjIxIDM0My4yMTQgMTc4LjAzIDMyNS42NzFDMTcwLjUyNyAzMTUuMzggMTY3LjcxNCAzMDIuNTE1IDE2OS44MjQgMjg5Ljg4NUMxNzAuMjkzIDI4Ny43OCAxNzAuNzYxIDI4NS45MDggMTcxLjIzIDI4My44MDNMMTcyLjQwMyAyODAuMDYxTDE3NS42ODUgMjgyLjRDMTgzLjQyMiAyODguMDE0IDE5MS44NjIgMjkyLjIyNCAyMDEuMDA2IDI5NS4wMzFMMjAzLjM1MSAyOTUuNzMyTDIwMy4xMTYgMjk4LjA3MUMyMDIuODgyIDMwMS4zNDYgMjAzLjgyIDMwNC44NTQgMjA1LjY5NSAzMDcuNjYxQzIwOS40NDYgMzEzLjA0MSAyMTYuMDExIDMxNS42MTQgMjIyLjM0MSAzMTMuOTc2QzIyMy43NDggMzEzLjUwOCAyMjUuMTU1IDMxMy4wNDEgMjI2LjMyNyAzMTIuMzM5TDI5MC41NjggMjcxLjQwN0MyOTMuODUgMjY5LjMwMiAyOTUuOTYgMjY2LjI2MSAyOTYuNjY0IDI2Mi41MTlDMjk3LjM2NyAyNTguNzc2IDI5Ni40MjkgMjU0LjggMjk0LjMxOSAyNTEuNzU5QzI5MC41NjggMjQ2LjM4IDI4NC4wMDMgMjQ0LjA0MSAyNzcuNjczIDI0NS42NzhDMjc2LjI2NiAyNDYuMTQ2IDI3NC44NTkgMjQ2LjYxNCAyNzMuNjg3IDI0Ny4zMTVMMjQ5LjA2OSAyNjIuOTg2QzI0NS4wODQgMjY1LjU1OSAyNDAuNjI5IDI2Ny40MzEgMjM1Ljk0IDI2OC42QzIxNS4wNzMgMjczLjk4IDE5My4yNjkgMjY1Ljc5MyAxODEuMDc3IDI0OC4yNTFDMTczLjgwOSAyMzcuOTU5IDE3MC43NjEgMjI1LjA5NSAxNzMuMTA2IDIxMi40NjRDMTc1LjIxNiAyMDAuMzAyIDE4Mi43MTkgMTg5LjMwOCAxOTMuMjY5IDE4Mi43NTlMMjU3Ljc0NCAxNDEuODI3QzI2MS43MyAxMzkuMjU0IDI2Ni4xODQgMTM3LjM4MyAyNzAuODc0IDEzNS45OEMyOTEuNzQgMTMwLjYgMzEzLjU0NCAxMzguNzg2IDMyNS43MzYgMTU2LjMyOUMzMzMuMjM5IDE2Ni42MiAzMzYuMDUyIDE3OS40ODUgMzMzLjk0MiAxOTIuMTE1QzMzMy40NzMgMTk0LjIyIDMzMy4wMDQgMTk2LjA5MiAzMzIuMzAxIDE5OC4xOTdMMzMxLjEyOCAyMDEuOTM5TDMyNy44NDYgMTk5LjZDMzIwLjEwOSAxOTMuOTg2IDMxMS42NjkgMTg5Ljc3NiAzMDIuNTI1IDE4Ni45NjlMMzAwLjE4IDE4Ni4yNjhMMzAwLjQxNSAxODMuOTI5QzMwMC42NDkgMTgwLjY1NCAyOTkuNzEyIDE3Ny4xNDYgMjk3LjgzNiAxNzQuMzM5QzI5NC4wODUgMTY4Ljk1OSAyODcuNTIgMTY2LjYyIDI4MS4xOSAxNjguMjU4QzI3OS43ODMgMTY4LjcyNSAyNzguMzc2IDE2OS4xOTMgMjc3LjIwNCAxNjkuODk1TDIxMi45NjMgMjEwLjgyN0MyMDkuNjgxIDIxMi45MzIgMjA3LjU3MSAyMTUuOTczIDIwNi44NjcgMjE5LjcxNUMyMDYuMTY0IDIyMy40NTggMjA3LjEwMiAyMjcuNDM0IDIwOS4yMTIgMjMwLjQ3NUMyMTIuOTYzIDIzNS44NTQgMjE5LjUyOCAyMzguMTkzIDIyNS44NTggMjM2LjU1NkMyMjcuMjY1IDIzNi4wODggMjI4LjY3MiAyMzUuNjIgMjI5Ljg0NCAyMzQuOTE5TDI1NC40NjIgMjE5LjI0N0MyNTguNDQ3IDIxNi42NzUgMjYyLjkwMiAyMTQuODAzIDI2Ny41OTEgMjEzLjRDMjg4LjQ1OCAyMDguMDIgMzEwLjI2MiAyMTYuMjA3IDMyMi40NTQgMjMzLjc0OUMzMjkuOTU2IDI0NC4wNDEgMzMyLjc3IDI1Ni45MDUgMzMwLjY2IDI2OS41MzZDMzI4LjU0OSAyODEuNjk4IDMyMS4wNDcgMjkyLjY5MiAzMTAuNDk2IDI5OS4yNDFMMjQ2LjAyMSAzNDAuMTczQzI0Mi4wMzYgMzQyLjc0NiAyMzcuNTgxIDM0NC42MTcgMjMyLjg5MiAzNDYuMDJaIiBmaWxsPSJ3aGl0ZSIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzVfMiI+CjxyZWN0IHdpZHRoPSIyMzAiIGhlaWdodD0iMjc2IiBmaWxsPSJ3aGl0ZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTM3IDEwMykiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K&logoColor=E10098)](https://kitql.dev/docs/tools/06_vite-plugin-kit-routes) + +## 🧑‍💻 Try it + +```bash +npm create kitql@latest demo-kitql +``` + +## ⭐️ Join us + +[![GitHub Repo stars](https://img.shields.io/github/stars/jycouet/kitql?logo=github&label=KitQL&color=FF3E00)](https://github.com/jycouet/kitql) + diff --git a/packages/create-kitql/bin.js b/packages/create-kitql/bin.js new file mode 100755 index 000000000..cfd9dee7b --- /dev/null +++ b/packages/create-kitql/bin.js @@ -0,0 +1,199 @@ +#!/usr/bin/env node +import * as p from '@clack/prompts' +import { bold, cyan, gray, green, italic } from '@kitql/helpers' +import { program, Option, InvalidArgumentError } from 'commander' +import fs, { readFileSync } from 'node:fs' +import path from 'node:path' +import { exit } from 'node:process' +import { fileURLToPath } from 'node:url' + +// the first argument is the name of the project +let projectDir = process.argv[2] +let projectName = projectDir + +const { version } = JSON.parse(fs.readFileSync(new URL('package.json', import.meta.url), 'utf-8')) +// eslint-disable-next-line no-console +console.log(`${gray(`create-kitql version ${version}`)}\n`) + +// prepare options +const templatesDir = sourcePath(`./templates`) +const options = fs.readdirSync(templatesDir).map(templateDir => { + // in .meta.json you can find: + /** @type {{label?: string, hint?: string, apiUrl?: string}} */ + let data = {} + const metaPath = path.join(templatesDir, templateDir, '.meta.json') + if (fs.existsSync(metaPath)) { + data = JSON.parse(readFileSync(metaPath, 'utf-8')) + } + return { ...data, value: templateDir } +}) + +program.argument('[project_name]', 'optional project name') +program.addOption( + new Option('-t, --template