create-absolutejs 0.6.1 → 0.7.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.
Files changed (67) hide show
  1. package/LICENSE +24 -24
  2. package/README.md +179 -179
  3. package/dist/commands/formatProject.js +3 -2
  4. package/dist/commands/initializeGit.js +1 -1
  5. package/dist/commands/installDependencies.js +4 -3
  6. package/dist/data.js +22 -21
  7. package/dist/generators/configurations/generateDrizzleConfig.js +15 -15
  8. package/dist/generators/configurations/generatePackageJson.js +25 -23
  9. package/dist/generators/configurations/generatePrettierrc.js +9 -9
  10. package/dist/generators/db/dockerInitTemplates.js +79 -79
  11. package/dist/generators/db/generateDatabaseTypes.js +6 -6
  12. package/dist/generators/db/generateDockerContainer.js +14 -14
  13. package/dist/generators/db/generateDrizzleSchema.js +17 -17
  14. package/dist/generators/db/generateSqliteSchema.js +8 -8
  15. package/dist/generators/db/handlerTemplates.js +259 -259
  16. package/dist/generators/db/scaffoldDocker.js +1 -1
  17. package/dist/generators/html/generateHTMLPage.js +60 -60
  18. package/dist/generators/htmx/generateHTMXPage.js +86 -86
  19. package/dist/generators/project/generateAbsoluteAuthConfig.d.ts +1 -1
  20. package/dist/generators/project/generateAbsoluteAuthConfig.js +100 -89
  21. package/dist/generators/project/generateDBBlock.js +9 -9
  22. package/dist/generators/project/generateMarkupCSS.js +145 -145
  23. package/dist/generators/project/generateRoutesBlock.d.ts +3 -2
  24. package/dist/generators/project/generateRoutesBlock.js +37 -36
  25. package/dist/generators/project/generateServer.js +22 -18
  26. package/dist/generators/project/scaffoldBackend.js +2 -1
  27. package/dist/generators/project/scaffoldFrontends.d.ts +2 -2
  28. package/dist/generators/project/scaffoldFrontends.js +5 -2
  29. package/dist/generators/react/generateReactComponents.js +95 -95
  30. package/dist/generators/svelte/generateSveltePage.js +210 -210
  31. package/dist/generators/vue/generateVuePage.js +261 -261
  32. package/dist/messages.js +43 -43
  33. package/dist/questions/projectName.js +1 -1
  34. package/dist/scaffold.js +2 -1
  35. package/dist/templates/README.md +35 -35
  36. package/dist/templates/assets/svg/google-logo.svg +7 -7
  37. package/dist/templates/assets/svg/htmx-logo-black.svg +9 -9
  38. package/dist/templates/assets/svg/htmx-logo-white.svg +9 -9
  39. package/dist/templates/assets/svg/vue-logo.svg +4 -4
  40. package/dist/templates/configurations/.prettierignore +3 -3
  41. package/dist/templates/configurations/.prettierrc.json +9 -9
  42. package/dist/templates/configurations/drizzle.config.ts +13 -13
  43. package/dist/templates/configurations/eslint.config.mjs +243 -243
  44. package/dist/templates/configurations/tsconfig.example.json +98 -98
  45. package/dist/templates/constants.ts +2 -2
  46. package/dist/templates/db/docker-compose.db.yml +15 -15
  47. package/dist/templates/git/gitignore +51 -51
  48. package/dist/templates/html/scripts/typescript-example.ts +21 -21
  49. package/dist/templates/react/components/App.tsx +52 -52
  50. package/dist/templates/react/components/Head.tsx +34 -34
  51. package/dist/templates/react/components/OAuthLink.tsx +39 -39
  52. package/dist/templates/react/components/ProfilePicture.tsx +56 -56
  53. package/dist/templates/styles/colors.ts +11 -11
  54. package/dist/templates/styles/reset.css +84 -84
  55. package/dist/templates/svelte/components/Counter.svelte +19 -19
  56. package/dist/templates/svelte/composables/counter.svelte.ts +14 -14
  57. package/dist/templates/tailwind/postcss.config.ts +8 -8
  58. package/dist/templates/tailwind/tailwind.config.ts +7 -7
  59. package/dist/templates/tailwind/tailwind.css +1 -1
  60. package/dist/templates/vue/components/CountButton.vue +39 -39
  61. package/dist/templates/vue/composables/useCount.ts +14 -14
  62. package/dist/utils/commandMaps.d.ts +1 -1
  63. package/dist/utils/commandMaps.js +4 -4
  64. package/dist/versions.d.ts +49 -0
  65. package/dist/versions.js +61 -0
  66. package/package.json +22 -21
  67. package/dist/templates/styles/tailwind.css +0 -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` +
@@ -7,5 +7,5 @@ export const getProjectName = async () => {
7
7
  });
8
8
  if (isCancel(projectName))
9
9
  abort();
10
- return projectName ?? 'absolutejs-project';
10
+ return projectName || 'absolutejs-project';
11
11
  };
package/dist/scaffold.js CHANGED
@@ -73,7 +73,8 @@ export const scaffold = async ({ response: { projectName, codeQualityTool, initi
73
73
  frontends,
74
74
  projectAssetsDirectory,
75
75
  templatesDirectory,
76
- useHTMLScripts
76
+ useHTMLScripts,
77
+ useTailwind
77
78
  });
78
79
  if (installDependenciesNow) {
79
80
  await installDependencies(packageManager, projectName);