Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/rotten-tips-cry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'create-kitql': patch
---

init create kitql
3 changes: 3 additions & 0 deletions packages/create-kitql/.eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
extends: ['eslint-config-kitql'],
}
1 change: 1 addition & 0 deletions packages/create-kitql/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
test-*
1 change: 1 addition & 0 deletions packages/create-kitql/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# create-kitql
18 changes: 18 additions & 0 deletions packages/create-kitql/README.md
Original file line number Diff line number Diff line change
@@ -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)

199 changes: 199 additions & 0 deletions packages/create-kitql/bin.js
Original file line number Diff line number Diff line change
@@ -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 <template>', 'template you want to use').choices(
options.map(c => c.value),
),
)
program.addOption(
new Option('-s, --schema <schema>', '"local" or "http..."').argParser(value => {
if (value === 'local' || value.startsWith('http')) {
return value
}
throw new InvalidArgumentError('Should be "local" or "http..." or do not set it!')
}),
)

program.parse(process.argv)
const options_cli = program.opts()

p.intro('🎨 Welcome to Svelte UX!')

// if we weren't given a directory, then we should ask
if (!projectDir) {
const dir = await p.text({
message: `Where should we create your project?`,
placeholder: ' (press Enter to use the current directory)',
})

if (p.isCancel(dir)) {
process.exit(1)
}

if (dir) {
projectDir = dir
projectName = dir
} else {
projectDir = '.'
}
}

// if we were told to use the current directory then we need
// a more appropriate name for the project
if (projectDir === '.') {
projectName = 'kitql-demo'
}
let dirToCreate = true

// project location emtpy?
if (fs.existsSync(projectDir)) {
if (fs.readdirSync(projectDir).length > 0) {
const force = await p.confirm({
message:
'Target directory is not empty. Continue anyway? This might overwrite existing files.',
initialValue: false,
})
dirToCreate = false

// bail if `force` is `false` or the user cancelled with Ctrl-C
if (force !== true) {
process.exit(1)
}
}
}

// create the project directory if necessary
if (dirToCreate && !fs.existsSync(projectDir)) {
fs.mkdirSync(projectDir)
}

const template = options_cli.template
? options_cli.template
: await p.select({
message: 'Which template do you want to use?',
initialValue: 'starter',
options,
})
if (p.isCancel(template)) {
process.exit(1)
}
const templateDir = path.join(templatesDir, template)
const templateMeta = options.find(option => option.value === template)
if (!templateMeta) {
// this will never happen, but it helps to types later
exit(1)
}

copy(
sourcePath(path.join(templatesDir, template)),
projectDir,
{
PROJECT_NAME: projectName,
SVELTE_UX_VERSION: version,
},
{ '.meta.gitignore': '.gitignore' },
['.meta.json'],
)

p.outro(`🎉 Everything is ready!

👉 Next Steps
0️⃣ Go to your project : cd ${green(projectDir)}
1️⃣ Install dependencies : ${green(`npm i`)} | ${green(`pnpm i`)}
2️⃣ Start your application : ${green(`npm run dev`)} | ${green(`pnpm dev`)}`)

// eslint-disable-next-line no-console
console.log(
gray(
italic(
`${bold('❔ More help')} ` +
`at ${cyan('https://kitql.dev/')} ` +
`(📄 Docs, ⭐ Github, 📣 Discord, ...)\n`,
),
),
)

// Function to copy files recursively
function copy(
/** @type {string} */ sourceDir,
/** @type {string} */ destDir = projectDir,
/** @type {Record<string, string>} */ transformMap = {},
/** @type {Record<string, string>} */ transformFileMap = {},
/** @type {string[]} */ ignoreList = [],
) {
if (!fs.existsSync(destDir)) {
fs.mkdirSync(destDir)
}

const files = fs.readdirSync(sourceDir)
for (const fileSource of files) {
const fileDest = Object.entries(transformFileMap).reduce((acc, [key, value]) => {
return acc.replace(key, value)
}, fileSource)
// const file = fileSource.replace(".meta.gitignore", ".gitignore")
const sourceFilePath = path.join(sourceDir, fileSource)
const sourceRelative = path.relative(templateDir, sourceFilePath)
// skip the ignore list
if (!ignoreList.includes(sourceRelative)) {
const destFilePath = path.join(destDir, fileDest)

const stats = fs.statSync(sourceFilePath)

// files need to be copied and potentially transformed
if (stats.isFile()) {
// read the source file
const source = fs.readFileSync(sourceFilePath)

// apply any transformations if necessary
const transformed = Object.entries(transformMap).reduce((prev, [pattern, value]) => {
return prev.replaceAll(pattern, value)
}, source.toString())

// write the result
fs.writeFileSync(destFilePath, transformed)
}
// if we run into a directory then we should keep going
else if (stats.isDirectory()) {
copy(sourceFilePath, destFilePath, transformMap, transformFileMap, ignoreList)
}
}
}
}

function sourcePath(/** @type {string} */ path) {
return fileURLToPath(new URL(path, import.meta.url).href)
}

// function pCancel(cancelText = 'Operation cancelled.') {
// p.cancel(cancelText)
// process.exit(1)
// }
42 changes: 42 additions & 0 deletions packages/create-kitql/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"name": "create-kitql",
"description": "A CLI for creating new projects... A lot of kind of projects!",
"keywords": [
"cli",
"svelte",
"sveltekit"
],
"version": "0.0.1",
"license": "MIT",
"type": "module",
"repository": {
"type": "git",
"url": "https://github.com/jycouet/kitql",
"directory": "packages/create-kitql",
"homepage": "https://github.com/jycouet/kitql/tree/main/packages/create-kitql"
},
"bin": "./bin.js",
"scripts": {
"dev": "node bin.js",
"lint": "kitql-lint",
"format": "kitql-lint --fix"
},
"devDependencies": {
"@types/node": "^20.9.2",
"eslint-config-kitql": "workspace:*"
},
"dependencies": {
"@clack/prompts": "^0.7.0",
"@kitql/helpers": "workspace:*",
"commander": "^11.1.0"
},
"sideEffects": false,
"publishConfig": {
"directory": "dist",
"access": "public"
},
"files": [
"templates",
"bin.js"
]
}
13 changes: 13 additions & 0 deletions packages/create-kitql/templates/kit-routes/.eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example

# Ignore files for PNPM, NPM and YARN
pnpm-lock.yaml
package-lock.json
yarn.lock
31 changes: 31 additions & 0 deletions packages/create-kitql/templates/kit-routes/.eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/** @type { import("eslint").Linter.FlatConfig } */
module.exports = {
root: true,
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:svelte/recommended',
'prettier'
],
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'],
parserOptions: {
sourceType: 'module',
ecmaVersion: 2020,
extraFileExtensions: ['.svelte']
},
env: {
browser: true,
es2017: true,
node: true
},
overrides: [
{
files: ['*.svelte'],
parser: 'svelte-eslint-parser',
parserOptions: {
parser: '@typescript-eslint/parser'
}
}
]
};
10 changes: 10 additions & 0 deletions packages/create-kitql/templates/kit-routes/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
9 changes: 9 additions & 0 deletions packages/create-kitql/templates/kit-routes/.meta..gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
!.env.example
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
4 changes: 4 additions & 0 deletions packages/create-kitql/templates/kit-routes/.meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"label": "Demo - Vite Kit Routes",
"hint": "Never go out of sync with your routes again! No more 🤞, now be confident ✅!"
}
1 change: 1 addition & 0 deletions packages/create-kitql/templates/kit-routes/.npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
engine-strict=true
13 changes: 13 additions & 0 deletions packages/create-kitql/templates/kit-routes/.prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example

# Ignore files for PNPM, NPM and YARN
pnpm-lock.yaml
package-lock.json
yarn.lock
8 changes: 8 additions & 0 deletions packages/create-kitql/templates/kit-routes/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"useTabs": true,
"singleQuote": true,
"trailingComma": "none",
"printWidth": 100,
"plugins": ["prettier-plugin-svelte"],
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
}
Loading