@kevinmarrec/create-app 0.16.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +2 -2
- package/package.json +15 -15
- package/template/.docker/analytics/service.yml +1 -0
- package/template/.docker/mailpit/service.yml +2 -1
- package/template/.docker/metabase/service.yml +2 -1
- package/template/.docker/postgres/service.yml +1 -1
- package/template/.docker/studio/service.yml +1 -0
- package/template/.docker/traefik/service.yml +1 -1
- package/template/.github/workflows/ci.yml +3 -3
- package/template/.node-version +1 -0
- package/template/api/Dockerfile +1 -1
- package/template/api/package.json +7 -7
- package/template/api/src/env.ts +8 -8
- package/template/api/src/main.ts +2 -3
- package/template/api/src/orpc/router/index.ts +2 -9
- package/template/api/src/utils/stopper.ts +9 -13
- package/template/app/Dockerfile +2 -2
- package/template/app/package.json +15 -15
- package/template/app/src/composables/auth.ts +2 -3
- package/template/compose.yml +2 -2
- package/template/knip.config.ts +2 -1
- package/template/package.json +8 -8
package/dist/index.mjs
CHANGED
|
@@ -8,7 +8,7 @@ import { x } from "tinyexec";
|
|
|
8
8
|
import fs from "node:fs/promises";
|
|
9
9
|
|
|
10
10
|
//#region package.json
|
|
11
|
-
var version = "0.
|
|
11
|
+
var version = "0.17.0";
|
|
12
12
|
|
|
13
13
|
//#endregion
|
|
14
14
|
//#region src/utils/fs.ts
|
|
@@ -79,7 +79,7 @@ async function run() {
|
|
|
79
79
|
message: "Project name",
|
|
80
80
|
placeholder: "my-app",
|
|
81
81
|
validate: (value) => {
|
|
82
|
-
if (!value
|
|
82
|
+
if (!value?.trim()) return "Project name cannot be empty";
|
|
83
83
|
}
|
|
84
84
|
});
|
|
85
85
|
maybeCancel(projectName);
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kevinmarrec/create-app",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
5
|
-
"packageManager": "bun@1.3.
|
|
4
|
+
"version": "0.17.0",
|
|
5
|
+
"packageManager": "bun@1.3.9",
|
|
6
6
|
"description": "CLI that scaffolds an opinionated Bun & Vue fullstack application.",
|
|
7
7
|
"author": "Kevin Marrec <kevin@marrec.io>",
|
|
8
8
|
"license": "MIT",
|
|
@@ -44,25 +44,25 @@
|
|
|
44
44
|
"test:coverage": "vitest --coverage"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@clack/prompts": "^0.
|
|
47
|
+
"@clack/prompts": "^1.0.1",
|
|
48
48
|
"ansis": "^4.2.0",
|
|
49
49
|
"pathe": "^2.0.3",
|
|
50
50
|
"tinyexec": "^1.0.2"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@faker-js/faker": "^10.
|
|
54
|
-
"@kevinmarrec/eslint-config": "^1.
|
|
55
|
-
"@kevinmarrec/stylelint-config": "^1.
|
|
56
|
-
"@kevinmarrec/tsconfig": "^1.
|
|
57
|
-
"@types/bun": "^1.3.
|
|
58
|
-
"@vitest/coverage-v8": "^4.0.
|
|
59
|
-
"bumpp": "^10.4.
|
|
53
|
+
"@faker-js/faker": "^10.3.0",
|
|
54
|
+
"@kevinmarrec/eslint-config": "^1.11.0",
|
|
55
|
+
"@kevinmarrec/stylelint-config": "^1.11.0",
|
|
56
|
+
"@kevinmarrec/tsconfig": "^1.11.0",
|
|
57
|
+
"@types/bun": "^1.3.9",
|
|
58
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
59
|
+
"bumpp": "^10.4.1",
|
|
60
60
|
"eslint": "^9.39.2",
|
|
61
|
-
"knip": "^5.
|
|
62
|
-
"stylelint": "^17.
|
|
63
|
-
"tsdown": "^0.
|
|
61
|
+
"knip": "^5.84.1",
|
|
62
|
+
"stylelint": "^17.3.0",
|
|
63
|
+
"tsdown": "^0.20.3",
|
|
64
64
|
"typescript": "^5.9.3",
|
|
65
|
-
"vitest": "^4.0.
|
|
66
|
-
"vue-tsc": "^3.2.
|
|
65
|
+
"vitest": "^4.0.18",
|
|
66
|
+
"vue-tsc": "^3.2.4"
|
|
67
67
|
}
|
|
68
68
|
}
|
|
@@ -14,7 +14,7 @@ jobs:
|
|
|
14
14
|
runs-on: ubuntu-latest
|
|
15
15
|
steps:
|
|
16
16
|
- name: Setup Bun
|
|
17
|
-
uses: kevinmarrec/workflows/setup-bun@
|
|
17
|
+
uses: kevinmarrec/workflows/setup-bun@9d2e32941c6fbf76894926019c66ef428ddcc4d2 # main
|
|
18
18
|
|
|
19
19
|
- name: Lint
|
|
20
20
|
run: bun run lint
|
|
@@ -32,12 +32,12 @@ jobs:
|
|
|
32
32
|
pull-requests: write
|
|
33
33
|
steps:
|
|
34
34
|
- name: Setup Bun
|
|
35
|
-
uses: kevinmarrec/workflows/setup-bun@
|
|
35
|
+
uses: kevinmarrec/workflows/setup-bun@9d2e32941c6fbf76894926019c66ef428ddcc4d2 # main
|
|
36
36
|
|
|
37
37
|
- name: Build project
|
|
38
38
|
run: bun run build
|
|
39
39
|
|
|
40
40
|
- name: Analyze project build size differences
|
|
41
|
-
uses: kevinmarrec/workflows/filesize-diff@
|
|
41
|
+
uses: kevinmarrec/workflows/filesize-diff@9d2e32941c6fbf76894926019c66ef428ddcc4d2 # main
|
|
42
42
|
with:
|
|
43
43
|
directories: app/dist,api/dist
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
24.13.1
|
package/template/api/Dockerfile
CHANGED
|
@@ -10,17 +10,17 @@
|
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@libsql/client": "^0.17.0",
|
|
13
|
-
"@orpc/server": "^1.13.
|
|
14
|
-
"better-auth": "^1.4.
|
|
13
|
+
"@orpc/server": "^1.13.5",
|
|
14
|
+
"better-auth": "^1.4.18",
|
|
15
15
|
"drizzle-orm": "^0.45.1",
|
|
16
|
-
"pino": "^10.
|
|
16
|
+
"pino": "^10.3.1",
|
|
17
17
|
"valibot": "^1.2.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
|
-
"@kevinmarrec/tsconfig": "^1.
|
|
21
|
-
"@types/bun": "^1.3.
|
|
22
|
-
"drizzle-kit": "^0.31.
|
|
23
|
-
"pg": "^8.
|
|
20
|
+
"@kevinmarrec/tsconfig": "^1.11.0",
|
|
21
|
+
"@types/bun": "^1.3.9",
|
|
22
|
+
"drizzle-kit": "^0.31.9",
|
|
23
|
+
"pg": "^8.18.0",
|
|
24
24
|
"pino-pretty": "^13.1.3",
|
|
25
25
|
"typescript": "~5.9.3"
|
|
26
26
|
}
|
package/template/api/src/env.ts
CHANGED
|
@@ -27,14 +27,14 @@ const schema = v.object({
|
|
|
27
27
|
),
|
|
28
28
|
}),
|
|
29
29
|
log: v.object({
|
|
30
|
-
level: v.optional(v.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
30
|
+
level: v.optional(v.picklist([
|
|
31
|
+
'fatal',
|
|
32
|
+
'error',
|
|
33
|
+
'warn',
|
|
34
|
+
'info',
|
|
35
|
+
'debug',
|
|
36
|
+
'trace',
|
|
37
|
+
'silent',
|
|
38
38
|
]), 'info'),
|
|
39
39
|
}),
|
|
40
40
|
server: v.object({
|
package/template/api/src/main.ts
CHANGED
|
@@ -5,11 +5,10 @@ import { createRpc } from './orpc'
|
|
|
5
5
|
import { router } from './orpc/router'
|
|
6
6
|
import { cors } from './utils/cors'
|
|
7
7
|
import { logger } from './utils/logger'
|
|
8
|
-
import {
|
|
8
|
+
import { bindGracefulShutdown } from './utils/stopper'
|
|
9
9
|
|
|
10
10
|
const auth = createBetterAuth({ db, logger })
|
|
11
11
|
const rpc = createRpc({ auth, db, logger }, router)
|
|
12
|
-
const stopper = createStopper({ logger })
|
|
13
12
|
|
|
14
13
|
const server = Bun.serve({
|
|
15
14
|
hostname: env.server.host,
|
|
@@ -25,6 +24,6 @@ const server = Bun.serve({
|
|
|
25
24
|
},
|
|
26
25
|
})
|
|
27
26
|
|
|
28
|
-
|
|
27
|
+
bindGracefulShutdown(server, logger)
|
|
29
28
|
|
|
30
29
|
logger.info(`Listening on ${server.url}`)
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { os } from '@orpc/server'
|
|
2
|
-
import * as v from 'valibot'
|
|
3
2
|
|
|
4
3
|
import type { Context } from '../context'
|
|
5
4
|
import { authMiddleware } from '../middlewares/auth'
|
|
@@ -17,15 +16,9 @@ const authed = pub
|
|
|
17
16
|
|
|
18
17
|
export const router = {
|
|
19
18
|
public: pub
|
|
20
|
-
.
|
|
21
|
-
.handler(async () => {
|
|
22
|
-
return 'public'
|
|
23
|
-
}),
|
|
19
|
+
.handler(async () => 'public'),
|
|
24
20
|
private: authed
|
|
25
|
-
.
|
|
26
|
-
.handler(async () => {
|
|
27
|
-
return 'private'
|
|
28
|
-
}),
|
|
21
|
+
.handler(async () => 'private'),
|
|
29
22
|
}
|
|
30
23
|
|
|
31
24
|
export type Router = typeof router
|
|
@@ -2,18 +2,14 @@ import process from 'node:process'
|
|
|
2
2
|
|
|
3
3
|
import type { Logger } from './logger'
|
|
4
4
|
|
|
5
|
-
export function
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
logger.info('Server stopped. Exiting process.')
|
|
12
|
-
process.exit(0)
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
process.on('SIGINT', gracefulShutdown)
|
|
16
|
-
process.on('SIGTERM', gracefulShutdown)
|
|
17
|
-
},
|
|
5
|
+
export function bindGracefulShutdown(server: Bun.Server<unknown>, logger: Logger) {
|
|
6
|
+
async function gracefulShutdown() {
|
|
7
|
+
logger.info('Received termination signal. Gracefully shutting down...')
|
|
8
|
+
await server.stop()
|
|
9
|
+
logger.info('Server stopped. Exiting process.')
|
|
10
|
+
process.exit(0)
|
|
18
11
|
}
|
|
12
|
+
|
|
13
|
+
process.on('SIGINT', gracefulShutdown)
|
|
14
|
+
process.on('SIGTERM', gracefulShutdown)
|
|
19
15
|
}
|
package/template/app/Dockerfile
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
FROM --platform=$BUILDPLATFORM imbios/bun-node:1.3.
|
|
1
|
+
FROM --platform=$BUILDPLATFORM imbios/bun-node:1.3.9-24.13.1-alpine AS build
|
|
2
2
|
|
|
3
3
|
ARG TARGETARCH
|
|
4
4
|
|
|
@@ -14,7 +14,7 @@ COPY app/ ./app/
|
|
|
14
14
|
|
|
15
15
|
RUN bun -F ./app build
|
|
16
16
|
|
|
17
|
-
FROM nginx:1.29.
|
|
17
|
+
FROM nginx:1.29.5-alpine AS serve
|
|
18
18
|
|
|
19
19
|
COPY --from=build --chown=nonroot:nonroot /build/app/dist/ /usr/share/nginx/html
|
|
20
20
|
|
|
@@ -10,31 +10,31 @@
|
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@kevinmarrec/vue-i18n": "^1.2.1",
|
|
13
|
-
"@orpc/client": "^1.13.
|
|
14
|
-
"@orpc/vue-colada": "^1.13.
|
|
15
|
-
"@pinia/colada": "^0.21.
|
|
16
|
-
"@unhead/vue": "^2.1.
|
|
17
|
-
"@vueuse/core": "^14.1
|
|
18
|
-
"better-auth": "^1.4.
|
|
13
|
+
"@orpc/client": "^1.13.5",
|
|
14
|
+
"@orpc/vue-colada": "^1.13.5",
|
|
15
|
+
"@pinia/colada": "^0.21.4",
|
|
16
|
+
"@unhead/vue": "^2.1.4",
|
|
17
|
+
"@vueuse/core": "^14.2.1",
|
|
18
|
+
"better-auth": "^1.4.18",
|
|
19
19
|
"pinia": "^3.0.4",
|
|
20
20
|
"unocss": "^66.6.0",
|
|
21
|
-
"vue": "^3.5.
|
|
21
|
+
"vue": "^3.5.28"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@kevinmarrec/tsconfig": "^1.
|
|
25
|
-
"@kevinmarrec/unocss-config": "^1.
|
|
24
|
+
"@kevinmarrec/tsconfig": "^1.11.0",
|
|
25
|
+
"@kevinmarrec/unocss-config": "^1.11.0",
|
|
26
26
|
"@kevinmarrec/vite-plugin-dark-mode": "^1.2.1",
|
|
27
27
|
"@modyfi/vite-plugin-yaml": "^1.1.1",
|
|
28
|
-
"@unhead/addons": "^2.1.
|
|
29
|
-
"@vitejs/plugin-vue": "^6.0.
|
|
30
|
-
"beasties": "^0.
|
|
28
|
+
"@unhead/addons": "^2.1.4",
|
|
29
|
+
"@vitejs/plugin-vue": "^6.0.4",
|
|
30
|
+
"beasties": "^0.4.1",
|
|
31
31
|
"rollup-plugin-visualizer": "^6.0.5",
|
|
32
32
|
"typescript": "~5.9.3",
|
|
33
33
|
"valibot": "^1.2.0",
|
|
34
34
|
"vite": "^7.3.1",
|
|
35
35
|
"vite-plugin-valibot-env": "^1.0.1",
|
|
36
|
-
"vite-plugin-vue-devtools": "^8.0.
|
|
37
|
-
"vite-ssg": "^28.
|
|
38
|
-
"vite-tsconfig-paths": "^6.
|
|
36
|
+
"vite-plugin-vue-devtools": "^8.0.6",
|
|
37
|
+
"vite-ssg": "^28.3.0",
|
|
38
|
+
"vite-tsconfig-paths": "^6.1.1"
|
|
39
39
|
}
|
|
40
40
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { defineMutation } from '@pinia/colada'
|
|
2
|
-
import { set } from '@vueuse/core'
|
|
3
2
|
import { computed, ref } from 'vue'
|
|
4
3
|
|
|
5
4
|
import { authClient, type AuthError } from '../lib/auth'
|
|
@@ -10,10 +9,10 @@ function defineAuthMutation<TVars, TData>(mutation: (vars: TVars) => Promise<TDa
|
|
|
10
9
|
return defineMutation({
|
|
11
10
|
mutation,
|
|
12
11
|
onMutate: () => {
|
|
13
|
-
|
|
12
|
+
authError.value = undefined
|
|
14
13
|
},
|
|
15
14
|
onSettled: (_, error) => {
|
|
16
|
-
|
|
15
|
+
authError.value = error as AuthError
|
|
17
16
|
},
|
|
18
17
|
})
|
|
19
18
|
}
|
package/template/compose.yml
CHANGED
|
@@ -16,7 +16,7 @@ services:
|
|
|
16
16
|
|
|
17
17
|
api:
|
|
18
18
|
<<: *common
|
|
19
|
-
image: oven/bun:1.3.
|
|
19
|
+
image: oven/bun:1.3.9-alpine
|
|
20
20
|
container_name: api
|
|
21
21
|
init: true
|
|
22
22
|
depends_on:
|
|
@@ -36,7 +36,7 @@ services:
|
|
|
36
36
|
|
|
37
37
|
app:
|
|
38
38
|
<<: *common
|
|
39
|
-
image: imbios/bun-node:1.3.
|
|
39
|
+
image: imbios/bun-node:1.3.9-24.13.1-alpine
|
|
40
40
|
container_name: app
|
|
41
41
|
init: true
|
|
42
42
|
depends_on:
|
package/template/knip.config.ts
CHANGED
package/template/package.json
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"name": "project",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"private": true,
|
|
5
|
-
"packageManager": "bun@1.3.
|
|
5
|
+
"packageManager": "bun@1.3.9",
|
|
6
6
|
"engines": {
|
|
7
|
-
"node": "
|
|
7
|
+
"node": ">=24.13.1"
|
|
8
8
|
},
|
|
9
9
|
"workspaces": [
|
|
10
10
|
"api",
|
|
@@ -23,13 +23,13 @@
|
|
|
23
23
|
"update": "bunx taze -I -rwi"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@kevinmarrec/eslint-config": "^1.
|
|
27
|
-
"@kevinmarrec/stylelint-config": "^1.
|
|
28
|
-
"@kevinmarrec/tsconfig": "^1.
|
|
26
|
+
"@kevinmarrec/eslint-config": "^1.11.0",
|
|
27
|
+
"@kevinmarrec/stylelint-config": "^1.11.0",
|
|
28
|
+
"@kevinmarrec/tsconfig": "^1.11.0",
|
|
29
29
|
"eslint": "^9.39.2",
|
|
30
|
-
"knip": "^5.
|
|
31
|
-
"stylelint": "^17.
|
|
30
|
+
"knip": "^5.84.1",
|
|
31
|
+
"stylelint": "^17.3.0",
|
|
32
32
|
"typescript": "~5.9.3",
|
|
33
|
-
"vue-tsc": "^3.2.
|
|
33
|
+
"vue-tsc": "^3.2.4"
|
|
34
34
|
}
|
|
35
35
|
}
|