create-absolutejs 0.8.3 → 0.9.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/LICENSE +24 -24
- package/README.md +179 -179
- package/dist/data.js +3 -0
- package/dist/generators/configurations/generateDrizzleConfig.js +15 -15
- package/dist/generators/configurations/generatePrettierrc.js +9 -9
- package/dist/generators/configurations/initializeRoot.js +2 -0
- package/dist/generators/db/dockerInitTemplates.js +79 -79
- package/dist/generators/db/generateDatabaseTypes.js +6 -6
- package/dist/generators/db/generateDockerContainer.js +19 -19
- package/dist/generators/db/generateDrizzleSchema.js +17 -17
- package/dist/generators/db/generateSqliteSchema.js +8 -8
- package/dist/generators/db/handlerTemplates.js +259 -259
- package/dist/generators/db/scaffoldDocker.js +1 -1
- package/dist/generators/html/generateHTMLPage.js +60 -60
- package/dist/generators/htmx/generateHTMXPage.js +86 -86
- package/dist/generators/project/generateAbsoluteAuthConfig.js +96 -96
- package/dist/generators/project/generateBuildBlock.d.ts +2 -1
- package/dist/generators/project/generateBuildBlock.js +9 -5
- package/dist/generators/project/generateDBBlock.js +9 -9
- package/dist/generators/project/generateImportsBlock.js +1 -0
- package/dist/generators/project/generateMarkupCSS.js +145 -145
- package/dist/generators/project/generateRoutesBlock.js +36 -36
- package/dist/generators/project/generateServer.d.ts +2 -1
- package/dist/generators/project/generateServer.js +29 -19
- package/dist/generators/project/scaffoldBackend.d.ts +2 -1
- package/dist/generators/project/scaffoldBackend.js +2 -1
- package/dist/generators/react/generateReactComponents.js +95 -95
- package/dist/generators/svelte/generateSveltePage.js +210 -210
- package/dist/generators/vue/generateVuePage.js +261 -261
- package/dist/messages.js +43 -43
- package/dist/scaffold.js +1 -0
- package/dist/templates/README.md +35 -35
- package/dist/templates/assets/svg/google-logo.svg +7 -7
- package/dist/templates/assets/svg/htmx-logo-black.svg +9 -9
- package/dist/templates/assets/svg/htmx-logo-white.svg +9 -9
- package/dist/templates/assets/svg/vue-logo.svg +4 -4
- package/dist/templates/configurations/.prettierignore +3 -3
- package/dist/templates/configurations/.prettierrc.json +9 -9
- package/dist/templates/configurations/drizzle.config.ts +13 -13
- package/dist/templates/configurations/eslint.config.mjs +243 -243
- package/dist/templates/configurations/tsconfig.example.json +98 -98
- package/dist/templates/constants.ts +2 -2
- package/dist/templates/db/docker-compose.db.yml +15 -15
- package/dist/templates/git/gitignore +51 -51
- package/dist/templates/html/scripts/typescript-example.ts +21 -21
- package/dist/templates/react/components/App.tsx +52 -52
- package/dist/templates/react/components/Head.tsx +34 -34
- package/dist/templates/react/components/OAuthLink.tsx +39 -39
- package/dist/templates/react/components/ProfilePicture.tsx +56 -56
- package/dist/templates/styles/colors.ts +11 -11
- package/dist/templates/styles/reset.css +84 -84
- package/dist/templates/svelte/components/Counter.svelte +19 -19
- package/dist/templates/svelte/composables/counter.svelte.ts +14 -14
- package/dist/templates/tailwind/postcss.config.ts +8 -8
- package/dist/templates/tailwind/tailwind.config.ts +7 -7
- package/dist/templates/tailwind/tailwind.css +1 -1
- package/dist/templates/vue/components/CountButton.vue +39 -39
- package/dist/templates/vue/composables/useCount.ts +14 -14
- package/dist/versions.d.ts +1 -1
- package/dist/versions.js +1 -1
- package/package.json +1 -1
|
@@ -1,266 +1,266 @@
|
|
|
1
1
|
import { formatNavLink } from '../../utils/formatNavLink';
|
|
2
2
|
export const generateVuePage = (frontends) => {
|
|
3
3
|
const navLinks = frontends.map(formatNavLink).join('\n\t\t\t');
|
|
4
|
-
return `<script setup lang="ts">
|
|
5
|
-
import { ref } from 'vue';
|
|
6
|
-
import CountButton from '../components/CountButton.vue';
|
|
7
|
-
|
|
8
|
-
const props = defineProps<{
|
|
9
|
-
initialCount: number;
|
|
10
|
-
}>();
|
|
11
|
-
|
|
12
|
-
const count = ref(props.initialCount);
|
|
13
|
-
const isOpen = ref(false);
|
|
14
|
-
</script>
|
|
15
|
-
|
|
16
|
-
<template>
|
|
17
|
-
<header>
|
|
18
|
-
<a href="/">AbsoluteJS</a>
|
|
19
|
-
<details
|
|
20
|
-
:open="isOpen"
|
|
21
|
-
@pointerenter="isOpen = true"
|
|
22
|
-
@pointerleave="isOpen = false"
|
|
23
|
-
>
|
|
24
|
-
<summary>Pages</summary>
|
|
25
|
-
<nav>
|
|
26
|
-
${navLinks}
|
|
27
|
-
</nav>
|
|
28
|
-
</details>
|
|
29
|
-
</header>
|
|
30
|
-
|
|
31
|
-
<main>
|
|
32
|
-
<nav>
|
|
33
|
-
<a href="https://absolutejs.com" target="_blank">
|
|
34
|
-
<img
|
|
35
|
-
class="logo"
|
|
36
|
-
src="/assets/png/absolutejs-temp.png"
|
|
37
|
-
alt="AbsoluteJS Logo"
|
|
38
|
-
/>
|
|
39
|
-
</a>
|
|
40
|
-
<a href="https://vuejs.org" target="_blank">
|
|
41
|
-
<img
|
|
42
|
-
class="logo vue"
|
|
43
|
-
src="/assets/svg/vue-logo.svg"
|
|
44
|
-
alt="Vue Logo"
|
|
45
|
-
/>
|
|
46
|
-
</a>
|
|
47
|
-
</nav>
|
|
48
|
-
<h1>AbsoluteJS + Vue</h1>
|
|
49
|
-
<CountButton :initialCount="count" />
|
|
50
|
-
<p>
|
|
51
|
-
Edit <code>example/vue/pages/VueExample.vue</code> then save and
|
|
52
|
-
refresh to update the page.
|
|
53
|
-
</p>
|
|
54
|
-
<p style="color: #777">( Hot Module Reloading is coming soon )</p>
|
|
55
|
-
<p style="margin-top: 2rem">
|
|
56
|
-
Explore the other pages to see how AbsoluteJS seamlessly unifies
|
|
57
|
-
multiple frameworks on a single server.
|
|
58
|
-
</p>
|
|
59
|
-
<p style="color: #777; font-size: 1rem; margin-top: 2rem">
|
|
60
|
-
Click on the AbsoluteJS and Vue logos to learn more.
|
|
61
|
-
</p>
|
|
62
|
-
</main>
|
|
63
|
-
</template>
|
|
64
|
-
|
|
65
|
-
<style scoped>
|
|
66
|
-
:global(*) {
|
|
67
|
-
box-sizing: border-box;
|
|
68
|
-
line-height: 1.5;
|
|
69
|
-
margin: 0;
|
|
70
|
-
padding: 0;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
:global(html) {
|
|
74
|
-
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
|
|
75
|
-
height: 100%;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
:global(body) {
|
|
79
|
-
background-color: #2c2c2c;
|
|
80
|
-
color: #f5f5f5;
|
|
81
|
-
color-scheme: light dark;
|
|
82
|
-
display: flex;
|
|
83
|
-
flex-direction: column;
|
|
84
|
-
font-synthesis: none;
|
|
85
|
-
font-weight: 400;
|
|
86
|
-
height: 100%;
|
|
87
|
-
-moz-osx-font-smoothing: grayscale;
|
|
88
|
-
text-rendering: optimizeLegibility;
|
|
89
|
-
-webkit-font-smoothing: antialiased;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
:global(#root) {
|
|
93
|
-
display: flex;
|
|
94
|
-
flex-direction: column;
|
|
95
|
-
margin: 0 auto;
|
|
96
|
-
height: 100%;
|
|
97
|
-
width: 100%;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
:global(main) {
|
|
101
|
-
align-items: center;
|
|
102
|
-
display: flex;
|
|
103
|
-
flex: 1;
|
|
104
|
-
flex-direction: column;
|
|
105
|
-
justify-content: center;
|
|
106
|
-
text-align: center;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
:global(h1),
|
|
110
|
-
:global(h2),
|
|
111
|
-
:global(h3),
|
|
112
|
-
:global(h4),
|
|
113
|
-
:global(h5),
|
|
114
|
-
:global(h6) {
|
|
115
|
-
line-height: 1.1;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
:global(p) {
|
|
119
|
-
font-size: 1.2rem;
|
|
120
|
-
max-width: 1280px;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
a {
|
|
124
|
-
color: #5fbeeb;
|
|
125
|
-
font-size: 1.5rem;
|
|
126
|
-
font-weight: 500;
|
|
127
|
-
position: relative;
|
|
128
|
-
text-decoration: none;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
header {
|
|
132
|
-
align-items: center;
|
|
133
|
-
background-color: #1a1a1a;
|
|
134
|
-
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
135
|
-
display: flex;
|
|
136
|
-
justify-content: space-between;
|
|
137
|
-
padding: 2rem;
|
|
138
|
-
text-align: center;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
header a {
|
|
142
|
-
position: relative;
|
|
143
|
-
color: #5fbeeb;
|
|
144
|
-
text-decoration: none;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
header a::after {
|
|
148
|
-
content: '';
|
|
149
|
-
position: absolute;
|
|
150
|
-
left: 0;
|
|
151
|
-
bottom: 0;
|
|
152
|
-
width: 100%;
|
|
153
|
-
height: 2px;
|
|
154
|
-
background: linear-gradient(90deg, #5fbeeb 0%, #35d5a2 50%, #ff4b91 100%);
|
|
155
|
-
transform: scaleX(0);
|
|
156
|
-
transform-origin: left;
|
|
157
|
-
transition: transform 0.25s ease-in-out;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
header a:hover::after {
|
|
161
|
-
transform: scaleX(1);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
h1 {
|
|
165
|
-
font-size: 2.5rem;
|
|
166
|
-
margin-top: 2rem;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
.logo {
|
|
170
|
-
height: 8rem;
|
|
171
|
-
width: 8rem;
|
|
172
|
-
will-change: filter;
|
|
173
|
-
transition: filter 300ms;
|
|
174
|
-
}
|
|
175
|
-
.logo:hover {
|
|
176
|
-
filter: drop-shadow(0 0 2rem #5fbeeb);
|
|
177
|
-
}
|
|
178
|
-
.logo.vue:hover {
|
|
179
|
-
filter: drop-shadow(0 0 2rem #42b883);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
nav {
|
|
183
|
-
display: flex;
|
|
184
|
-
gap: 4rem;
|
|
185
|
-
justify-content: center;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
header details {
|
|
189
|
-
position: relative;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
header details summary {
|
|
193
|
-
list-style: none;
|
|
194
|
-
appearance: none;
|
|
195
|
-
-webkit-appearance: none;
|
|
196
|
-
cursor: pointer;
|
|
197
|
-
user-select: none;
|
|
198
|
-
color: #5fbeeb;
|
|
199
|
-
font-size: 1.5rem;
|
|
200
|
-
font-weight: 500;
|
|
201
|
-
padding: 0.5rem 1rem;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
header summary::after {
|
|
205
|
-
content: '▼';
|
|
206
|
-
display: inline-block;
|
|
207
|
-
margin-left: 0.5rem;
|
|
208
|
-
font-size: 0.75rem;
|
|
209
|
-
transition: transform 0.3s ease;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
header details[open] summary::after {
|
|
213
|
-
transform: rotate(180deg);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
header details nav {
|
|
217
|
-
position: absolute;
|
|
218
|
-
top: 100%;
|
|
219
|
-
right: -0.5rem;
|
|
220
|
-
display: flex;
|
|
221
|
-
flex-direction: column;
|
|
222
|
-
gap: 0.75rem;
|
|
223
|
-
background: rgba(128, 128, 128, 0.15);
|
|
224
|
-
backdrop-filter: blur(4px);
|
|
225
|
-
border: 1px solid #5fbeeb;
|
|
226
|
-
border-radius: 1rem;
|
|
227
|
-
padding: 1rem 1.5rem;
|
|
228
|
-
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
|
|
229
|
-
opacity: 0;
|
|
230
|
-
transform: translateY(-8px);
|
|
231
|
-
pointer-events: none;
|
|
232
|
-
transition:
|
|
233
|
-
opacity 0.3s ease,
|
|
234
|
-
transform 0.3s ease;
|
|
235
|
-
z-index: 1000;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
header details[open] nav {
|
|
239
|
-
opacity: 1;
|
|
240
|
-
transform: translateY(0);
|
|
241
|
-
pointer-events: auto;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
header details nav a {
|
|
245
|
-
font-size: 1.1rem;
|
|
246
|
-
padding: 0.25rem 0;
|
|
247
|
-
white-space: nowrap;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
@media (prefers-color-scheme: light) {
|
|
251
|
-
:global(body) {
|
|
252
|
-
background-color: #f5f5f5;
|
|
253
|
-
color: #1a1a1a;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
header {
|
|
257
|
-
background-color: #ffffff;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
button {
|
|
261
|
-
background-color: #ffffff;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
</style>
|
|
4
|
+
return `<script setup lang="ts">
|
|
5
|
+
import { ref } from 'vue';
|
|
6
|
+
import CountButton from '../components/CountButton.vue';
|
|
7
|
+
|
|
8
|
+
const props = defineProps<{
|
|
9
|
+
initialCount: number;
|
|
10
|
+
}>();
|
|
11
|
+
|
|
12
|
+
const count = ref(props.initialCount);
|
|
13
|
+
const isOpen = ref(false);
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<template>
|
|
17
|
+
<header>
|
|
18
|
+
<a href="/">AbsoluteJS</a>
|
|
19
|
+
<details
|
|
20
|
+
:open="isOpen"
|
|
21
|
+
@pointerenter="isOpen = true"
|
|
22
|
+
@pointerleave="isOpen = false"
|
|
23
|
+
>
|
|
24
|
+
<summary>Pages</summary>
|
|
25
|
+
<nav>
|
|
26
|
+
${navLinks}
|
|
27
|
+
</nav>
|
|
28
|
+
</details>
|
|
29
|
+
</header>
|
|
30
|
+
|
|
31
|
+
<main>
|
|
32
|
+
<nav>
|
|
33
|
+
<a href="https://absolutejs.com" target="_blank">
|
|
34
|
+
<img
|
|
35
|
+
class="logo"
|
|
36
|
+
src="/assets/png/absolutejs-temp.png"
|
|
37
|
+
alt="AbsoluteJS Logo"
|
|
38
|
+
/>
|
|
39
|
+
</a>
|
|
40
|
+
<a href="https://vuejs.org" target="_blank">
|
|
41
|
+
<img
|
|
42
|
+
class="logo vue"
|
|
43
|
+
src="/assets/svg/vue-logo.svg"
|
|
44
|
+
alt="Vue Logo"
|
|
45
|
+
/>
|
|
46
|
+
</a>
|
|
47
|
+
</nav>
|
|
48
|
+
<h1>AbsoluteJS + Vue</h1>
|
|
49
|
+
<CountButton :initialCount="count" />
|
|
50
|
+
<p>
|
|
51
|
+
Edit <code>example/vue/pages/VueExample.vue</code> then save and
|
|
52
|
+
refresh to update the page.
|
|
53
|
+
</p>
|
|
54
|
+
<p style="color: #777">( Hot Module Reloading is coming soon )</p>
|
|
55
|
+
<p style="margin-top: 2rem">
|
|
56
|
+
Explore the other pages to see how AbsoluteJS seamlessly unifies
|
|
57
|
+
multiple frameworks on a single server.
|
|
58
|
+
</p>
|
|
59
|
+
<p style="color: #777; font-size: 1rem; margin-top: 2rem">
|
|
60
|
+
Click on the AbsoluteJS and Vue logos to learn more.
|
|
61
|
+
</p>
|
|
62
|
+
</main>
|
|
63
|
+
</template>
|
|
64
|
+
|
|
65
|
+
<style scoped>
|
|
66
|
+
:global(*) {
|
|
67
|
+
box-sizing: border-box;
|
|
68
|
+
line-height: 1.5;
|
|
69
|
+
margin: 0;
|
|
70
|
+
padding: 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
:global(html) {
|
|
74
|
+
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
|
|
75
|
+
height: 100%;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
:global(body) {
|
|
79
|
+
background-color: #2c2c2c;
|
|
80
|
+
color: #f5f5f5;
|
|
81
|
+
color-scheme: light dark;
|
|
82
|
+
display: flex;
|
|
83
|
+
flex-direction: column;
|
|
84
|
+
font-synthesis: none;
|
|
85
|
+
font-weight: 400;
|
|
86
|
+
height: 100%;
|
|
87
|
+
-moz-osx-font-smoothing: grayscale;
|
|
88
|
+
text-rendering: optimizeLegibility;
|
|
89
|
+
-webkit-font-smoothing: antialiased;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
:global(#root) {
|
|
93
|
+
display: flex;
|
|
94
|
+
flex-direction: column;
|
|
95
|
+
margin: 0 auto;
|
|
96
|
+
height: 100%;
|
|
97
|
+
width: 100%;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
:global(main) {
|
|
101
|
+
align-items: center;
|
|
102
|
+
display: flex;
|
|
103
|
+
flex: 1;
|
|
104
|
+
flex-direction: column;
|
|
105
|
+
justify-content: center;
|
|
106
|
+
text-align: center;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
:global(h1),
|
|
110
|
+
:global(h2),
|
|
111
|
+
:global(h3),
|
|
112
|
+
:global(h4),
|
|
113
|
+
:global(h5),
|
|
114
|
+
:global(h6) {
|
|
115
|
+
line-height: 1.1;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
:global(p) {
|
|
119
|
+
font-size: 1.2rem;
|
|
120
|
+
max-width: 1280px;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
a {
|
|
124
|
+
color: #5fbeeb;
|
|
125
|
+
font-size: 1.5rem;
|
|
126
|
+
font-weight: 500;
|
|
127
|
+
position: relative;
|
|
128
|
+
text-decoration: none;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
header {
|
|
132
|
+
align-items: center;
|
|
133
|
+
background-color: #1a1a1a;
|
|
134
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
135
|
+
display: flex;
|
|
136
|
+
justify-content: space-between;
|
|
137
|
+
padding: 2rem;
|
|
138
|
+
text-align: center;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
header a {
|
|
142
|
+
position: relative;
|
|
143
|
+
color: #5fbeeb;
|
|
144
|
+
text-decoration: none;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
header a::after {
|
|
148
|
+
content: '';
|
|
149
|
+
position: absolute;
|
|
150
|
+
left: 0;
|
|
151
|
+
bottom: 0;
|
|
152
|
+
width: 100%;
|
|
153
|
+
height: 2px;
|
|
154
|
+
background: linear-gradient(90deg, #5fbeeb 0%, #35d5a2 50%, #ff4b91 100%);
|
|
155
|
+
transform: scaleX(0);
|
|
156
|
+
transform-origin: left;
|
|
157
|
+
transition: transform 0.25s ease-in-out;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
header a:hover::after {
|
|
161
|
+
transform: scaleX(1);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
h1 {
|
|
165
|
+
font-size: 2.5rem;
|
|
166
|
+
margin-top: 2rem;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.logo {
|
|
170
|
+
height: 8rem;
|
|
171
|
+
width: 8rem;
|
|
172
|
+
will-change: filter;
|
|
173
|
+
transition: filter 300ms;
|
|
174
|
+
}
|
|
175
|
+
.logo:hover {
|
|
176
|
+
filter: drop-shadow(0 0 2rem #5fbeeb);
|
|
177
|
+
}
|
|
178
|
+
.logo.vue:hover {
|
|
179
|
+
filter: drop-shadow(0 0 2rem #42b883);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
nav {
|
|
183
|
+
display: flex;
|
|
184
|
+
gap: 4rem;
|
|
185
|
+
justify-content: center;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
header details {
|
|
189
|
+
position: relative;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
header details summary {
|
|
193
|
+
list-style: none;
|
|
194
|
+
appearance: none;
|
|
195
|
+
-webkit-appearance: none;
|
|
196
|
+
cursor: pointer;
|
|
197
|
+
user-select: none;
|
|
198
|
+
color: #5fbeeb;
|
|
199
|
+
font-size: 1.5rem;
|
|
200
|
+
font-weight: 500;
|
|
201
|
+
padding: 0.5rem 1rem;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
header summary::after {
|
|
205
|
+
content: '▼';
|
|
206
|
+
display: inline-block;
|
|
207
|
+
margin-left: 0.5rem;
|
|
208
|
+
font-size: 0.75rem;
|
|
209
|
+
transition: transform 0.3s ease;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
header details[open] summary::after {
|
|
213
|
+
transform: rotate(180deg);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
header details nav {
|
|
217
|
+
position: absolute;
|
|
218
|
+
top: 100%;
|
|
219
|
+
right: -0.5rem;
|
|
220
|
+
display: flex;
|
|
221
|
+
flex-direction: column;
|
|
222
|
+
gap: 0.75rem;
|
|
223
|
+
background: rgba(128, 128, 128, 0.15);
|
|
224
|
+
backdrop-filter: blur(4px);
|
|
225
|
+
border: 1px solid #5fbeeb;
|
|
226
|
+
border-radius: 1rem;
|
|
227
|
+
padding: 1rem 1.5rem;
|
|
228
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
|
|
229
|
+
opacity: 0;
|
|
230
|
+
transform: translateY(-8px);
|
|
231
|
+
pointer-events: none;
|
|
232
|
+
transition:
|
|
233
|
+
opacity 0.3s ease,
|
|
234
|
+
transform 0.3s ease;
|
|
235
|
+
z-index: 1000;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
header details[open] nav {
|
|
239
|
+
opacity: 1;
|
|
240
|
+
transform: translateY(0);
|
|
241
|
+
pointer-events: auto;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
header details nav a {
|
|
245
|
+
font-size: 1.1rem;
|
|
246
|
+
padding: 0.25rem 0;
|
|
247
|
+
white-space: nowrap;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
@media (prefers-color-scheme: light) {
|
|
251
|
+
:global(body) {
|
|
252
|
+
background-color: #f5f5f5;
|
|
253
|
+
color: #1a1a1a;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
header {
|
|
257
|
+
background-color: #ffffff;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
button {
|
|
261
|
+
background-color: #ffffff;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
</style>
|
|
265
265
|
`;
|
|
266
266
|
};
|
package/dist/messages.js
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
1
|
import { blueBright, cyan, dim, green, magenta, red } from 'picocolors';
|
|
2
2
|
import { frontendLabels } from './data';
|
|
3
|
-
export const helpMessage = `
|
|
4
|
-
Usage: create-absolute [options] [${magenta('project-name')}]
|
|
5
|
-
|
|
6
|
-
Arguments:
|
|
7
|
-
${magenta('project-name')} Name of the application to create.
|
|
8
|
-
If omitted, you'll be prompted to enter one.
|
|
9
|
-
|
|
10
|
-
Options:
|
|
11
|
-
${cyan('--help, -h')} Show this help message and exit
|
|
12
|
-
${cyan('--debug, -d')} Display a summary of the project configuration after creation
|
|
13
|
-
|
|
14
|
-
${cyan('--abs-provider')} A provider for Absolute-Auth (eg. 'google', 'github', 'discord') the full list is available at https://absolutejs.com/documentation/absolute-auth
|
|
15
|
-
${cyan('--angular')} Include an Angular frontend
|
|
16
|
-
${cyan('--angular-dir')} ${dim(cyan('<directory>'))} Specify the directory for and use the Angular frontend
|
|
17
|
-
${cyan('--assets')} ${dim(cyan('<directory>'))} Directory name for your static assets
|
|
18
|
-
${cyan('--auth')} ${dim(cyan('<plugin>'))} Pre-configured auth plugin (currently only "abs") or 'none'
|
|
19
|
-
${cyan('--biome')} Use Biome for code quality and formatting
|
|
20
|
-
${cyan('--build')} ${dim(cyan('<directory>'))} Output directory for build artifacts
|
|
21
|
-
${cyan('--db')} ${dim(cyan('<engine>'))} Database engine (postgresql | mysql | sqlite | mongodb | mariadb | gel | singlestore | cockroachdb | mssql) or 'none'
|
|
22
|
-
${cyan('--db-dir')} ${dim(cyan('<directory>'))} Directory name for your database files
|
|
23
|
-
${cyan('--db-host')} ${dim(cyan('<host>'))} Database host provider (neon | planetscale) or 'none'
|
|
24
|
-
${cyan('--directory')} ${dim(cyan('<mode>'))} Directory-naming strategy: "default" or "custom"
|
|
25
|
-
${cyan('--eslint+prettier')} Use ESLint + Prettier for code quality and formatting
|
|
26
|
-
${cyan('--git')} Initialize a Git repository
|
|
27
|
-
${cyan('--html')} Include a plain HTML frontend
|
|
28
|
-
${cyan('--html-dir')} ${dim(cyan('<directory>'))} Specify the directory for and use the HTML frontend
|
|
29
|
-
${cyan('--html-scripts')} Enable HTML scripting with TypeScript
|
|
30
|
-
${cyan('--htmx')} Include an HTMX frontend
|
|
31
|
-
${cyan('--htmx-dir')} ${dim(cyan('<directory>'))} Specify the directory for and use the HTMX frontend
|
|
32
|
-
${cyan('--install')} Use the same package manager to install dependencies
|
|
33
|
-
${cyan('--lts')} Use LTS versions of required packages
|
|
34
|
-
${cyan('--orm')} ${dim(cyan('<orm>'))} ORM to configure: "drizzle" | "prisma" | 'none'
|
|
35
|
-
${cyan('--plugin')} ${dim(cyan('<plugin>'))} Elysia plugin(s) to include (repeatable); 'none' skips plugin setup
|
|
36
|
-
${cyan('--react')} Include a React frontend
|
|
37
|
-
${cyan('--react-dir')} ${dim(cyan('<directory>'))} Specify the directory for and use the React frontend
|
|
38
|
-
${cyan('--skip')} Skip non-required prompts; use 'none' for all optional configs and "absolutejs-project" when no project name is provided.
|
|
39
|
-
${cyan('--svelte')} Include a Svelte frontend
|
|
40
|
-
${cyan('--svelte-dir')} ${dim(cyan('<directory>'))} Specify the directory for and use the Svelte frontend
|
|
41
|
-
${cyan('--tailwind')} Include Tailwind CSS setup
|
|
42
|
-
${cyan('--tailwind-input')} ${dim(cyan('<file>'))} Path to your Tailwind CSS entry file
|
|
43
|
-
${cyan('--tailwind-output')} ${dim(cyan('<file>'))} Path for the generated Tailwind CSS bundle
|
|
44
|
-
${cyan('--vue')} Include a Vue frontend
|
|
45
|
-
${cyan('--vue-dir')} ${dim(cyan('<directory>'))} Specify the directory for and use the Vue frontend
|
|
3
|
+
export const helpMessage = `
|
|
4
|
+
Usage: create-absolute [options] [${magenta('project-name')}]
|
|
5
|
+
|
|
6
|
+
Arguments:
|
|
7
|
+
${magenta('project-name')} Name of the application to create.
|
|
8
|
+
If omitted, you'll be prompted to enter one.
|
|
9
|
+
|
|
10
|
+
Options:
|
|
11
|
+
${cyan('--help, -h')} Show this help message and exit
|
|
12
|
+
${cyan('--debug, -d')} Display a summary of the project configuration after creation
|
|
13
|
+
|
|
14
|
+
${cyan('--abs-provider')} A provider for Absolute-Auth (eg. 'google', 'github', 'discord') the full list is available at https://absolutejs.com/documentation/absolute-auth
|
|
15
|
+
${cyan('--angular')} Include an Angular frontend
|
|
16
|
+
${cyan('--angular-dir')} ${dim(cyan('<directory>'))} Specify the directory for and use the Angular frontend
|
|
17
|
+
${cyan('--assets')} ${dim(cyan('<directory>'))} Directory name for your static assets
|
|
18
|
+
${cyan('--auth')} ${dim(cyan('<plugin>'))} Pre-configured auth plugin (currently only "abs") or 'none'
|
|
19
|
+
${cyan('--biome')} Use Biome for code quality and formatting
|
|
20
|
+
${cyan('--build')} ${dim(cyan('<directory>'))} Output directory for build artifacts
|
|
21
|
+
${cyan('--db')} ${dim(cyan('<engine>'))} Database engine (postgresql | mysql | sqlite | mongodb | mariadb | gel | singlestore | cockroachdb | mssql) or 'none'
|
|
22
|
+
${cyan('--db-dir')} ${dim(cyan('<directory>'))} Directory name for your database files
|
|
23
|
+
${cyan('--db-host')} ${dim(cyan('<host>'))} Database host provider (neon | planetscale) or 'none'
|
|
24
|
+
${cyan('--directory')} ${dim(cyan('<mode>'))} Directory-naming strategy: "default" or "custom"
|
|
25
|
+
${cyan('--eslint+prettier')} Use ESLint + Prettier for code quality and formatting
|
|
26
|
+
${cyan('--git')} Initialize a Git repository
|
|
27
|
+
${cyan('--html')} Include a plain HTML frontend
|
|
28
|
+
${cyan('--html-dir')} ${dim(cyan('<directory>'))} Specify the directory for and use the HTML frontend
|
|
29
|
+
${cyan('--html-scripts')} Enable HTML scripting with TypeScript
|
|
30
|
+
${cyan('--htmx')} Include an HTMX frontend
|
|
31
|
+
${cyan('--htmx-dir')} ${dim(cyan('<directory>'))} Specify the directory for and use the HTMX frontend
|
|
32
|
+
${cyan('--install')} Use the same package manager to install dependencies
|
|
33
|
+
${cyan('--lts')} Use LTS versions of required packages
|
|
34
|
+
${cyan('--orm')} ${dim(cyan('<orm>'))} ORM to configure: "drizzle" | "prisma" | 'none'
|
|
35
|
+
${cyan('--plugin')} ${dim(cyan('<plugin>'))} Elysia plugin(s) to include (repeatable); 'none' skips plugin setup
|
|
36
|
+
${cyan('--react')} Include a React frontend
|
|
37
|
+
${cyan('--react-dir')} ${dim(cyan('<directory>'))} Specify the directory for and use the React frontend
|
|
38
|
+
${cyan('--skip')} Skip non-required prompts; use 'none' for all optional configs and "absolutejs-project" when no project name is provided.
|
|
39
|
+
${cyan('--svelte')} Include a Svelte frontend
|
|
40
|
+
${cyan('--svelte-dir')} ${dim(cyan('<directory>'))} Specify the directory for and use the Svelte frontend
|
|
41
|
+
${cyan('--tailwind')} Include Tailwind CSS setup
|
|
42
|
+
${cyan('--tailwind-input')} ${dim(cyan('<file>'))} Path to your Tailwind CSS entry file
|
|
43
|
+
${cyan('--tailwind-output')} ${dim(cyan('<file>'))} Path for the generated Tailwind CSS bundle
|
|
44
|
+
${cyan('--vue')} Include a Vue frontend
|
|
45
|
+
${cyan('--vue-dir')} ${dim(cyan('<directory>'))} Specify the directory for and use the Vue frontend
|
|
46
46
|
`;
|
|
47
47
|
export const getOutroMessage = ({ projectName, packageManager, installDependenciesNow }) => `${green('Created successfully')}, you can now run:\n\n` +
|
|
48
48
|
`${cyan('cd')} ${projectName}\n` +
|