@kevinmarrec/create-app 0.13.0 → 0.15.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.js → index.mjs} +1 -1
- package/package.json +16 -18
- package/template/.docker/analytics/service.yml +1 -1
- package/template/.docker/mailpit/service.yml +1 -1
- package/template/.docker/metabase/service.yml +1 -1
- package/template/.docker/studio/service.yml +1 -1
- package/template/.docker/traefik/service.yml +1 -1
- package/template/.github/workflows/ci.yml +3 -3
- package/template/api/Dockerfile +1 -1
- package/template/api/package.json +8 -8
- package/template/api/src/utils/cors.ts +1 -1
- package/template/app/package.json +15 -14
- package/template/app/src/composables/auth.ts +3 -9
- package/template/app/src/composables/content.ts +2 -12
- package/template/app/src/lib/auth.ts +11 -0
- package/template/app/src/lib/orpc.ts +9 -4
- package/template/compose.yml +2 -2
- package/template/package.json +7 -7
- package/template/app/src/utils/fetch.ts +0 -16
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.15.0",
|
|
5
|
+
"packageManager": "bun@1.3.5",
|
|
6
6
|
"description": "CLI that scaffolds an opinionated Bun & Vue fullstack application.",
|
|
7
7
|
"author": "Kevin Marrec <kevin@marrec.io>",
|
|
8
8
|
"license": "MIT",
|
|
@@ -21,9 +21,7 @@
|
|
|
21
21
|
"template/api",
|
|
22
22
|
"template/app"
|
|
23
23
|
],
|
|
24
|
-
"bin":
|
|
25
|
-
"create-app": "dist/index.js"
|
|
26
|
-
},
|
|
24
|
+
"bin": "./dist/index.mjs",
|
|
27
25
|
"files": [
|
|
28
26
|
"dist",
|
|
29
27
|
"template",
|
|
@@ -31,7 +29,7 @@
|
|
|
31
29
|
"template/.npmrc"
|
|
32
30
|
],
|
|
33
31
|
"scripts": {
|
|
34
|
-
"build": "tsdown
|
|
32
|
+
"build": "tsdown",
|
|
35
33
|
"check": "bun run check:eslint && bun run check:stylelint && bun run check:unused && bun run check:types",
|
|
36
34
|
"check:eslint": "eslint . --cache",
|
|
37
35
|
"check:stylelint": "stylelint '**/*.{css,scss,vue}' --ignorePath .gitignore --cache",
|
|
@@ -52,19 +50,19 @@
|
|
|
52
50
|
"tinyexec": "^1.0.2"
|
|
53
51
|
},
|
|
54
52
|
"devDependencies": {
|
|
55
|
-
"@faker-js/faker": "^10.
|
|
56
|
-
"@kevinmarrec/eslint-config": "^1.
|
|
57
|
-
"@kevinmarrec/stylelint-config": "^1.
|
|
58
|
-
"@kevinmarrec/tsconfig": "^1.
|
|
59
|
-
"@types/bun": "^1.3.
|
|
60
|
-
"@vitest/coverage-v8": "^4.0.
|
|
61
|
-
"bumpp": "^10.
|
|
62
|
-
"eslint": "^9.39.
|
|
63
|
-
"knip": "^5.
|
|
53
|
+
"@faker-js/faker": "^10.2.0",
|
|
54
|
+
"@kevinmarrec/eslint-config": "^1.8.1",
|
|
55
|
+
"@kevinmarrec/stylelint-config": "^1.8.1",
|
|
56
|
+
"@kevinmarrec/tsconfig": "^1.8.1",
|
|
57
|
+
"@types/bun": "^1.3.6",
|
|
58
|
+
"@vitest/coverage-v8": "^4.0.17",
|
|
59
|
+
"bumpp": "^10.4.0",
|
|
60
|
+
"eslint": "^9.39.2",
|
|
61
|
+
"knip": "^5.81.0",
|
|
64
62
|
"stylelint": "^16.26.1",
|
|
65
|
-
"tsdown": "^0.
|
|
63
|
+
"tsdown": "^0.19.0",
|
|
66
64
|
"typescript": "^5.9.3",
|
|
67
|
-
"vitest": "^4.0.
|
|
68
|
-
"vue-tsc": "^3.
|
|
65
|
+
"vitest": "^4.0.17",
|
|
66
|
+
"vue-tsc": "^3.2.2"
|
|
69
67
|
}
|
|
70
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@main
|
|
17
|
+
uses: kevinmarrec/workflows/setup-bun@4886894d0abcc5c6dd0b292aa0a53cdd94cc6dc1 # 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@main
|
|
35
|
+
uses: kevinmarrec/workflows/setup-bun@4886894d0abcc5c6dd0b292aa0a53cdd94cc6dc1 # 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@main
|
|
41
|
+
uses: kevinmarrec/workflows/filesize-diff@4886894d0abcc5c6dd0b292aa0a53cdd94cc6dc1 # main
|
|
42
42
|
with:
|
|
43
43
|
directories: app/dist,api/dist
|
package/template/api/Dockerfile
CHANGED
|
@@ -9,18 +9,18 @@
|
|
|
9
9
|
"db:migrate": "bun --bun run drizzle-kit migrate --config src/database/drizzle/config.ts"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@libsql/client": "^0.
|
|
13
|
-
"@orpc/server": "^1.
|
|
14
|
-
"better-auth": "^1.4.
|
|
15
|
-
"drizzle-orm": "^0.45.
|
|
16
|
-
"pino": "^10.
|
|
12
|
+
"@libsql/client": "^0.17.0",
|
|
13
|
+
"@orpc/server": "^1.13.4",
|
|
14
|
+
"better-auth": "^1.4.12",
|
|
15
|
+
"drizzle-orm": "^0.45.1",
|
|
16
|
+
"pino": "^10.2.0",
|
|
17
17
|
"valibot": "^1.2.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
|
-
"@kevinmarrec/tsconfig": "^1.
|
|
21
|
-
"@types/bun": "^1.3.
|
|
20
|
+
"@kevinmarrec/tsconfig": "^1.8.1",
|
|
21
|
+
"@types/bun": "^1.3.6",
|
|
22
22
|
"drizzle-kit": "^0.31.8",
|
|
23
|
-
"pg": "^8.
|
|
23
|
+
"pg": "^8.17.0",
|
|
24
24
|
"pino-pretty": "^13.1.3",
|
|
25
25
|
"typescript": "~5.9.3"
|
|
26
26
|
}
|
|
@@ -14,7 +14,7 @@ export function cors(handler: (req: Request) => Promise<Response>) {
|
|
|
14
14
|
|
|
15
15
|
if (req.method === 'OPTIONS') {
|
|
16
16
|
response.headers.append('Access-Control-Allow-Headers', 'Content-Type, Authorization, User-Agent')
|
|
17
|
-
response.headers.append('Access-Control-Allow-Methods', 'GET,
|
|
17
|
+
response.headers.append('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
|
|
18
18
|
response.headers.append('Access-Control-Max-Age', '7200') // 2 hours https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Access-Control-Max-Age
|
|
19
19
|
}
|
|
20
20
|
|
|
@@ -9,31 +9,32 @@
|
|
|
9
9
|
"preview": "vite preview --open"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@kevinmarrec/vue-i18n": "^1.
|
|
13
|
-
"@orpc/client": "^1.
|
|
14
|
-
"@
|
|
15
|
-
"@
|
|
12
|
+
"@kevinmarrec/vue-i18n": "^1.2.0",
|
|
13
|
+
"@orpc/client": "^1.13.4",
|
|
14
|
+
"@orpc/vue-colada": "^1.13.4",
|
|
15
|
+
"@pinia/colada": "^0.21.1",
|
|
16
|
+
"@unhead/vue": "^2.1.2",
|
|
16
17
|
"@vueuse/core": "^14.1.0",
|
|
17
|
-
"better-auth": "^1.4.
|
|
18
|
+
"better-auth": "^1.4.12",
|
|
18
19
|
"pinia": "^3.0.4",
|
|
19
|
-
"unocss": "^66.
|
|
20
|
-
"vue": "^3.5.
|
|
20
|
+
"unocss": "^66.6.0",
|
|
21
|
+
"vue": "^3.5.26"
|
|
21
22
|
},
|
|
22
23
|
"devDependencies": {
|
|
23
|
-
"@kevinmarrec/tsconfig": "^1.
|
|
24
|
-
"@kevinmarrec/unocss-config": "^1.
|
|
25
|
-
"@kevinmarrec/vite-plugin-dark-mode": "^1.
|
|
24
|
+
"@kevinmarrec/tsconfig": "^1.8.1",
|
|
25
|
+
"@kevinmarrec/unocss-config": "^1.8.1",
|
|
26
|
+
"@kevinmarrec/vite-plugin-dark-mode": "^1.2.0",
|
|
26
27
|
"@modyfi/vite-plugin-yaml": "^1.1.1",
|
|
27
|
-
"@unhead/addons": "^2.
|
|
28
|
-
"@vitejs/plugin-vue": "^6.0.
|
|
28
|
+
"@unhead/addons": "^2.1.2",
|
|
29
|
+
"@vitejs/plugin-vue": "^6.0.3",
|
|
29
30
|
"beasties": "^0.3.5",
|
|
30
31
|
"rollup-plugin-visualizer": "^6.0.5",
|
|
31
32
|
"typescript": "~5.9.3",
|
|
32
33
|
"valibot": "^1.2.0",
|
|
33
|
-
"vite": "^7.
|
|
34
|
+
"vite": "^7.3.1",
|
|
34
35
|
"vite-plugin-valibot-env": "^1.0.1",
|
|
35
36
|
"vite-plugin-vue-devtools": "^8.0.5",
|
|
36
37
|
"vite-ssg": "^28.2.2",
|
|
37
|
-
"vite-tsconfig-paths": "^
|
|
38
|
+
"vite-tsconfig-paths": "^6.0.4"
|
|
38
39
|
}
|
|
39
40
|
}
|
|
@@ -1,22 +1,16 @@
|
|
|
1
1
|
import { defineMutation } from '@pinia/colada'
|
|
2
2
|
import { set } from '@vueuse/core'
|
|
3
|
-
import { createAuthClient, type ErrorContext } from 'better-auth/vue'
|
|
4
3
|
import { computed, ref } from 'vue'
|
|
5
4
|
|
|
6
|
-
import {
|
|
5
|
+
import { authClient, type AuthError } from '../lib/auth'
|
|
7
6
|
|
|
8
|
-
const
|
|
9
|
-
baseURL: `${import.meta.env.VITE_API_URL}/auth`,
|
|
10
|
-
fetchOptions,
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
const authError = ref<ErrorContext['error'] | null>(null)
|
|
7
|
+
const authError = ref<AuthError>()
|
|
14
8
|
|
|
15
9
|
function defineAuthMutation<TVars, TData>(mutation: (vars: TVars) => Promise<TData>) {
|
|
16
10
|
return defineMutation({
|
|
17
11
|
mutation,
|
|
18
12
|
onMutate: () => {
|
|
19
|
-
set(authError,
|
|
13
|
+
set(authError, undefined)
|
|
20
14
|
},
|
|
21
15
|
onSettled: (_, error) => {
|
|
22
16
|
set(authError, error)
|
|
@@ -3,18 +3,8 @@ import { useQuery } from '@pinia/colada'
|
|
|
3
3
|
import { orpc } from '~/app/lib/orpc'
|
|
4
4
|
|
|
5
5
|
export function useContent() {
|
|
6
|
-
const publicContent = useQuery({
|
|
7
|
-
key: () => ['public'],
|
|
8
|
-
query: orpc.public,
|
|
9
|
-
}).data
|
|
10
|
-
|
|
11
|
-
const privateContent = useQuery({
|
|
12
|
-
key: () => ['private'],
|
|
13
|
-
query: orpc.private,
|
|
14
|
-
}).data
|
|
15
|
-
|
|
16
6
|
return {
|
|
17
|
-
publicContent,
|
|
18
|
-
privateContent,
|
|
7
|
+
publicContent: useQuery(orpc.public.queryOptions()).data,
|
|
8
|
+
privateContent: useQuery(orpc.private.queryOptions()).data,
|
|
19
9
|
}
|
|
20
10
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createAuthClient, type ErrorContext } from 'better-auth/vue'
|
|
2
|
+
|
|
3
|
+
export type AuthError = ErrorContext['error']
|
|
4
|
+
|
|
5
|
+
export const authClient = createAuthClient({
|
|
6
|
+
baseURL: `${import.meta.env.VITE_API_URL}/auth`,
|
|
7
|
+
fetchOptions: {
|
|
8
|
+
credentials: 'include',
|
|
9
|
+
onError: ({ error }) => Promise.reject(error),
|
|
10
|
+
},
|
|
11
|
+
})
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { createORPCClient } from '@orpc/client'
|
|
2
2
|
import { RPCLink } from '@orpc/client/fetch'
|
|
3
|
+
import { createORPCVueColadaUtils } from '@orpc/vue-colada'
|
|
3
4
|
|
|
4
5
|
import type { Router, RouterClient } from '~/api/orpc/router'
|
|
5
6
|
|
|
6
|
-
import { getFetchOptions } from '../utils/fetch'
|
|
7
|
-
|
|
8
7
|
const link = new RPCLink({
|
|
9
8
|
url: `${import.meta.env.VITE_API_URL}/rpc`,
|
|
10
|
-
fetch: (request, init) => globalThis.fetch(request,
|
|
9
|
+
fetch: (request, init) => globalThis.fetch(request, {
|
|
10
|
+
...init,
|
|
11
|
+
credentials: 'include',
|
|
12
|
+
signal: AbortSignal.timeout(30_000),
|
|
13
|
+
}),
|
|
11
14
|
})
|
|
12
15
|
|
|
13
|
-
|
|
16
|
+
const client = createORPCClient<RouterClient<Router>>(link)
|
|
17
|
+
|
|
18
|
+
export const orpc = createORPCVueColadaUtils(client)
|
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.6-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.6-24-alpine
|
|
40
40
|
container_name: app
|
|
41
41
|
init: true
|
|
42
42
|
depends_on:
|
package/template/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "project",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"private": true,
|
|
5
|
-
"packageManager": "bun@1.3.
|
|
5
|
+
"packageManager": "bun@1.3.5",
|
|
6
6
|
"engines": {
|
|
7
7
|
"node": "lts/*"
|
|
8
8
|
},
|
|
@@ -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.
|
|
29
|
-
"eslint": "^9.39.
|
|
30
|
-
"knip": "^5.
|
|
26
|
+
"@kevinmarrec/eslint-config": "^1.8.1",
|
|
27
|
+
"@kevinmarrec/stylelint-config": "^1.8.1",
|
|
28
|
+
"@kevinmarrec/tsconfig": "^1.8.1",
|
|
29
|
+
"eslint": "^9.39.2",
|
|
30
|
+
"knip": "^5.81.0",
|
|
31
31
|
"stylelint": "^16.26.1",
|
|
32
32
|
"typescript": "~5.9.3",
|
|
33
|
-
"vue-tsc": "^3.
|
|
33
|
+
"vue-tsc": "^3.2.2"
|
|
34
34
|
}
|
|
35
35
|
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { BetterFetchOption } from 'better-auth/vue'
|
|
2
|
-
|
|
3
|
-
const FETCH_TIMEOUT_MS = 30_000
|
|
4
|
-
|
|
5
|
-
export function getFetchOptions(init?: RequestInit): RequestInit {
|
|
6
|
-
return {
|
|
7
|
-
...init,
|
|
8
|
-
credentials: 'include',
|
|
9
|
-
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export const betterFetchOptions: BetterFetchOption = {
|
|
14
|
-
...getFetchOptions(),
|
|
15
|
-
onError: ({ error }) => Promise.reject(error),
|
|
16
|
-
}
|