create-absolutejs 0.10.3 → 0.11.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/constants.d.ts +2 -2
- package/dist/constants.js +2 -2
- package/dist/data.d.ts +10 -10
- package/dist/data.js +88 -95
- package/dist/generators/angular/generateAngularPage.d.ts +7 -0
- package/dist/generators/angular/generateAngularPage.js +175 -0
- package/dist/generators/angular/scaffoldAngular.d.ts +2 -0
- package/dist/generators/angular/scaffoldAngular.js +34 -0
- package/dist/generators/configurations/generatePackageJson.js +26 -3
- package/dist/generators/configurations/scaffoldConfigurationFiles.js +26 -2
- package/dist/generators/db/dockerInitTemplates.d.ts +9 -9
- package/dist/generators/db/dockerInitTemplates.js +9 -9
- package/dist/generators/db/generateDatabaseTypes.js +5 -0
- package/dist/generators/db/generateDockerContainer.js +4 -2
- package/dist/generators/db/generateDrizzleSchema.js +16 -6
- package/dist/generators/db/handlerTemplates.d.ts +5 -0
- package/dist/generators/db/handlerTemplates.js +6 -0
- package/dist/generators/db/scaffoldDocker.js +42 -30
- package/dist/generators/html/generateHTMLPage.d.ts +1 -1
- package/dist/generators/html/generateHTMLPage.js +2 -2
- package/dist/generators/html/scaffoldHTML.d.ts +1 -1
- package/dist/generators/html/scaffoldHTML.js +2 -2
- package/dist/generators/htmx/generateHTMXPage.d.ts +1 -1
- package/dist/generators/htmx/generateHTMXPage.js +2 -2
- package/dist/generators/htmx/scaffoldHTMX.d.ts +1 -1
- package/dist/generators/htmx/scaffoldHTMX.js +2 -2
- package/dist/generators/project/computeFlags.d.ts +1 -0
- package/dist/generators/project/computeFlags.js +1 -0
- package/dist/generators/project/generateBuildBlock.d.ts +2 -1
- package/dist/generators/project/generateBuildBlock.js +11 -7
- package/dist/generators/project/generateDBBlock.js +6 -0
- package/dist/generators/project/generateImportsBlock.js +39 -27
- package/dist/generators/project/generateMarkupCSS.js +4 -0
- package/dist/generators/project/generateRoutesBlock.d.ts +1 -2
- package/dist/generators/project/generateRoutesBlock.js +28 -17
- package/dist/generators/project/generateServer.js +5 -10
- package/dist/generators/project/scaffoldFrontends.js +20 -1
- package/dist/generators/react/generateReactComponents.d.ts +2 -2
- package/dist/generators/react/generateReactComponents.js +33 -33
- package/dist/generators/react/scaffoldReact.d.ts +1 -1
- package/dist/generators/react/scaffoldReact.js +2 -2
- package/dist/generators/svelte/generateSveltePage.d.ts +1 -1
- package/dist/generators/svelte/generateSveltePage.js +20 -2
- package/dist/generators/svelte/scaffoldSvelte.d.ts +1 -1
- package/dist/generators/svelte/scaffoldSvelte.js +2 -2
- package/dist/generators/vue/generateVuePage.d.ts +1 -1
- package/dist/generators/vue/generateVuePage.js +20 -2
- package/dist/generators/vue/scaffoldVue.d.ts +1 -1
- package/dist/generators/vue/scaffoldVue.js +2 -2
- package/dist/questions/databaseEngine.d.ts +1 -1
- package/dist/questions/frontendDirectoryConfigurations.d.ts +1 -1
- package/dist/questions/frontends.d.ts +1 -1
- package/dist/questions/frontends.js +3 -3
- package/dist/scaffold.js +14 -2
- package/dist/templates/assets/svg/angular.svg +18 -0
- package/dist/templates/configurations/tsconfig.example.json +12 -12
- package/dist/templates/react/components/App.tsx +2 -2
- package/dist/templates/react/components/Head.tsx +7 -7
- package/dist/templates/react/components/OAuthLink.tsx +2 -2
- package/dist/templates/styles/colors.ts +6 -8
- package/dist/templates/styles/reset.css +15 -0
- package/dist/templates/svelte/components/Counter.svelte +4 -0
- package/dist/templates/vue/components/CountButton.vue +1 -1
- package/dist/typeGuards.d.ts +6 -6
- package/dist/typeGuards.js +6 -6
- package/dist/types.d.ts +1 -0
- package/dist/utils/checkDockerInstalled.d.ts +4 -4
- package/dist/utils/checkDockerInstalled.js +78 -71
- package/dist/utils/parseCommandLineOptions.js +13 -16
- package/dist/versions.d.ts +37 -29
- package/dist/versions.js +48 -39
- package/package.json +10 -9
- /package/dist/templates/configurations/{eslint.config.mjs → eslint.config.example.mjs} +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { copyFileSync, cpSync, mkdirSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
+
import { scaffoldAngular } from '../angular/scaffoldAngular';
|
|
3
4
|
import { scaffoldHTML } from '../html/scaffoldHTML';
|
|
4
5
|
import { scaffoldHTMX } from '../htmx/scaffoldHTMX';
|
|
5
6
|
import { scaffoldReact } from '../react/scaffoldReact';
|
|
@@ -25,12 +26,16 @@ export const scaffoldFrontends = ({ frontendDirectory, assetsDirectory, absProvi
|
|
|
25
26
|
const targetDirectory = join(frontendDirectory, directory);
|
|
26
27
|
if (!isSingleFrontend)
|
|
27
28
|
mkdirSync(targetDirectory);
|
|
29
|
+
const editBasePath = directory
|
|
30
|
+
? `src/frontend/${directory}`
|
|
31
|
+
: 'src/frontend';
|
|
28
32
|
switch (frontendName) {
|
|
29
33
|
case 'react':
|
|
30
34
|
scaffoldReact({
|
|
31
35
|
absProviders,
|
|
32
36
|
assetsDirectory,
|
|
33
37
|
authOption,
|
|
38
|
+
editBasePath,
|
|
34
39
|
frontends,
|
|
35
40
|
isSingleFrontend,
|
|
36
41
|
projectAssetsDirectory,
|
|
@@ -43,6 +48,7 @@ export const scaffoldFrontends = ({ frontendDirectory, assetsDirectory, absProvi
|
|
|
43
48
|
absProviders,
|
|
44
49
|
assetsDirectory,
|
|
45
50
|
authOption,
|
|
51
|
+
editBasePath,
|
|
46
52
|
frontends,
|
|
47
53
|
isSingleFrontend,
|
|
48
54
|
projectAssetsDirectory,
|
|
@@ -55,6 +61,7 @@ export const scaffoldFrontends = ({ frontendDirectory, assetsDirectory, absProvi
|
|
|
55
61
|
absProviders,
|
|
56
62
|
assetsDirectory,
|
|
57
63
|
authOption,
|
|
64
|
+
editBasePath,
|
|
58
65
|
frontends,
|
|
59
66
|
projectAssetsDirectory,
|
|
60
67
|
targetDirectory,
|
|
@@ -63,13 +70,24 @@ export const scaffoldFrontends = ({ frontendDirectory, assetsDirectory, absProvi
|
|
|
63
70
|
copyFileSync(join(templatesDirectory, 'types', 'vue-shim.d.ts'), join(typesDirectory, 'vue-shim.d.ts'));
|
|
64
71
|
break;
|
|
65
72
|
case 'angular':
|
|
66
|
-
|
|
73
|
+
scaffoldAngular({
|
|
74
|
+
absProviders,
|
|
75
|
+
assetsDirectory,
|
|
76
|
+
authOption,
|
|
77
|
+
editBasePath,
|
|
78
|
+
frontends,
|
|
79
|
+
isSingleFrontend,
|
|
80
|
+
projectAssetsDirectory,
|
|
81
|
+
targetDirectory,
|
|
82
|
+
templatesDirectory
|
|
83
|
+
});
|
|
67
84
|
break;
|
|
68
85
|
case 'html':
|
|
69
86
|
scaffoldHTML({
|
|
70
87
|
absProviders,
|
|
71
88
|
assetsDirectory,
|
|
72
89
|
authOption,
|
|
90
|
+
editBasePath,
|
|
73
91
|
frontends,
|
|
74
92
|
isSingleFrontend,
|
|
75
93
|
projectAssetsDirectory,
|
|
@@ -83,6 +101,7 @@ export const scaffoldFrontends = ({ frontendDirectory, assetsDirectory, absProvi
|
|
|
83
101
|
absProviders,
|
|
84
102
|
assetsDirectory,
|
|
85
103
|
authOption,
|
|
104
|
+
editBasePath,
|
|
86
105
|
frontends,
|
|
87
106
|
isSingleFrontend,
|
|
88
107
|
projectAssetsDirectory,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ProviderOption } from '@absolutejs/auth';
|
|
2
2
|
import { AuthOption, Frontend } from '../../types';
|
|
3
|
-
export declare const generateAppComponent: (frontends: Frontend[]) => string;
|
|
3
|
+
export declare const generateAppComponent: (frontends: Frontend[], editBasePath: string) => string;
|
|
4
4
|
export declare const generateDropdownComponent: (frontends: Frontend[]) => string;
|
|
5
|
-
export declare const generateSignInComponent: (absProviders: ProviderOption[] | undefined) => string;
|
|
6
5
|
export declare const generateReactExamplePage: (authOption: AuthOption) => string;
|
|
6
|
+
export declare const generateSignInComponent: (absProviders: ProviderOption[] | undefined) => string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { formatNavLink } from '../../utils/formatNavLink';
|
|
2
|
-
export const generateAppComponent = (frontends) => {
|
|
2
|
+
export const generateAppComponent = (frontends, editBasePath) => {
|
|
3
3
|
const exploreBlock = frontends.length > 1
|
|
4
4
|
? `\n\t\t\t<p style={{ marginTop: '2rem' }}>\n\t\t\t\tExplore the other pages to see multiple frameworks running\n\t\t\t\ttogether.\n\t\t\t</p>`
|
|
5
5
|
: '';
|
|
@@ -33,7 +33,7 @@ export const App = ({ initialCount }: AppProps) => {
|
|
|
33
33
|
count is {count}
|
|
34
34
|
</button>
|
|
35
35
|
<p>
|
|
36
|
-
Edit <code
|
|
36
|
+
Edit <code>${editBasePath}/pages/ReactExample.tsx</code> and save
|
|
37
37
|
to test HMR.
|
|
38
38
|
</p>${exploreBlock}
|
|
39
39
|
<p
|
|
@@ -73,37 +73,6 @@ export const generateDropdownComponent = (frontends) => {
|
|
|
73
73
|
);
|
|
74
74
|
`;
|
|
75
75
|
};
|
|
76
|
-
export const generateSignInComponent = (absProviders) => `import { OAuthLink } from './OAuthLink';
|
|
77
|
-
|
|
78
|
-
export const SignIn = () => (
|
|
79
|
-
<details
|
|
80
|
-
onPointerEnter={(event) => {
|
|
81
|
-
if (event.pointerType === 'mouse') {
|
|
82
|
-
event.currentTarget.open = true;
|
|
83
|
-
}
|
|
84
|
-
}}
|
|
85
|
-
onPointerLeave={(event) => {
|
|
86
|
-
if (event.pointerType === 'mouse') {
|
|
87
|
-
event.currentTarget.open = false;
|
|
88
|
-
}
|
|
89
|
-
}}
|
|
90
|
-
>
|
|
91
|
-
<summary>Sign In</summary>
|
|
92
|
-
<nav>
|
|
93
|
-
${absProviders && absProviders.length > 0
|
|
94
|
-
? absProviders
|
|
95
|
-
.map((provider) => {
|
|
96
|
-
const logoUrl = `/assets/svg/google-logo.svg`;
|
|
97
|
-
const name = provider.charAt(0).toUpperCase() +
|
|
98
|
-
provider.slice(1).toLowerCase();
|
|
99
|
-
return `<OAuthLink provider="${provider}" logoUrl="${logoUrl}" name="${name}" mode="in" />`;
|
|
100
|
-
})
|
|
101
|
-
.join('\n\t\t\t')
|
|
102
|
-
: `<p>No OAuth providers configured</p>`}
|
|
103
|
-
</nav>
|
|
104
|
-
</details>
|
|
105
|
-
);
|
|
106
|
-
`;
|
|
107
76
|
export const generateReactExamplePage = (authOption) => {
|
|
108
77
|
const useBlockReturn = authOption === 'abs';
|
|
109
78
|
const propsType = `
|
|
@@ -178,3 +147,34 @@ ${authOption === 'abs' ? extractProps : ''}
|
|
|
178
147
|
${closing}
|
|
179
148
|
`;
|
|
180
149
|
};
|
|
150
|
+
export const generateSignInComponent = (absProviders) => `import { OAuthLink } from './OAuthLink';
|
|
151
|
+
|
|
152
|
+
export const SignIn = () => (
|
|
153
|
+
<details
|
|
154
|
+
onPointerEnter={(event) => {
|
|
155
|
+
if (event.pointerType === 'mouse') {
|
|
156
|
+
event.currentTarget.open = true;
|
|
157
|
+
}
|
|
158
|
+
}}
|
|
159
|
+
onPointerLeave={(event) => {
|
|
160
|
+
if (event.pointerType === 'mouse') {
|
|
161
|
+
event.currentTarget.open = false;
|
|
162
|
+
}
|
|
163
|
+
}}
|
|
164
|
+
>
|
|
165
|
+
<summary>Sign In</summary>
|
|
166
|
+
<nav>
|
|
167
|
+
${absProviders && absProviders.length > 0
|
|
168
|
+
? absProviders
|
|
169
|
+
.map((provider) => {
|
|
170
|
+
const logoUrl = `/assets/svg/google-logo.svg`;
|
|
171
|
+
const name = provider.charAt(0).toUpperCase() +
|
|
172
|
+
provider.slice(1).toLowerCase();
|
|
173
|
+
return `<OAuthLink provider="${provider}" logoUrl="${logoUrl}" name="${name}" mode="in" />`;
|
|
174
|
+
})
|
|
175
|
+
.join('\n\t\t\t')
|
|
176
|
+
: `<p>No OAuth providers configured</p>`}
|
|
177
|
+
</nav>
|
|
178
|
+
</details>
|
|
179
|
+
);
|
|
180
|
+
`;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { ScaffoldFrontendProps } from '../../types';
|
|
2
|
-
export declare const scaffoldReact: ({ isSingleFrontend, authOption, targetDirectory, templatesDirectory, frontends,
|
|
2
|
+
export declare const scaffoldReact: ({ isSingleFrontend, authOption, editBasePath, targetDirectory, templatesDirectory, frontends, projectAssetsDirectory, absProviders }: ScaffoldFrontendProps) => void;
|
|
@@ -2,14 +2,14 @@ import { copyFileSync, cpSync, mkdirSync, writeFileSync } from 'fs';
|
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { generateMarkupCSS } from '../project/generateMarkupCSS';
|
|
4
4
|
import { generateAppComponent, generateDropdownComponent, generateReactExamplePage, generateSignInComponent } from './generateReactComponents';
|
|
5
|
-
export const scaffoldReact = ({ isSingleFrontend, authOption, targetDirectory, templatesDirectory, frontends,
|
|
5
|
+
export const scaffoldReact = ({ isSingleFrontend, authOption, editBasePath, targetDirectory, templatesDirectory, frontends, projectAssetsDirectory, absProviders }) => {
|
|
6
6
|
mkdirSync(join(projectAssetsDirectory, 'svg'), { recursive: true });
|
|
7
7
|
copyFileSync(join(templatesDirectory, 'assets', 'svg', 'react.svg'), join(projectAssetsDirectory, 'svg', 'react.svg'));
|
|
8
8
|
copyFileSync(join(templatesDirectory, 'assets', 'svg', 'google-logo.svg'), join(projectAssetsDirectory, 'svg', 'google-logo.svg'));
|
|
9
9
|
cpSync(join(templatesDirectory, 'react'), targetDirectory, {
|
|
10
10
|
recursive: true
|
|
11
11
|
});
|
|
12
|
-
const appComponent = generateAppComponent(frontends);
|
|
12
|
+
const appComponent = generateAppComponent(frontends, editBasePath);
|
|
13
13
|
writeFileSync(join(targetDirectory, 'components', 'App.tsx'), appComponent, 'utf-8');
|
|
14
14
|
const dropdownComponent = generateDropdownComponent(frontends);
|
|
15
15
|
writeFileSync(join(targetDirectory, 'components', 'Dropdown.tsx'), dropdownComponent, 'utf-8');
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { Frontend } from '../../types';
|
|
2
|
-
export declare const generateSveltePage: (frontends: Frontend[]) => string;
|
|
2
|
+
export declare const generateSveltePage: (frontends: Frontend[], editBasePath: string) => string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { formatNavLink } from '../../utils/formatNavLink';
|
|
2
|
-
export const generateSveltePage = (frontends) => {
|
|
2
|
+
export const generateSveltePage = (frontends, editBasePath) => {
|
|
3
3
|
const navLinks = frontends.map(formatNavLink).join('\n\t\t\t');
|
|
4
4
|
return `<script lang="ts">
|
|
5
5
|
type SvelteExampleProps = {
|
|
@@ -77,7 +77,7 @@ export const generateSveltePage = (frontends) => {
|
|
|
77
77
|
<h1>AbsoluteJS + Svelte</h1>
|
|
78
78
|
<Counter {initialCount} />
|
|
79
79
|
<p>
|
|
80
|
-
Edit <code
|
|
80
|
+
Edit <code>${editBasePath}/pages/SvelteExample.svelte</code> and save
|
|
81
81
|
to test HMR.
|
|
82
82
|
</p>
|
|
83
83
|
${frontends.length > 1
|
|
@@ -149,6 +149,10 @@ ${frontends.length > 1
|
|
|
149
149
|
filter: drop-shadow(0 0 2rem #ff3e00);
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
+
button:hover {
|
|
153
|
+
border-color: #ff3e00;
|
|
154
|
+
}
|
|
155
|
+
|
|
152
156
|
nav {
|
|
153
157
|
display: flex;
|
|
154
158
|
gap: 4rem;
|
|
@@ -241,10 +245,24 @@ ${frontends.length > 1
|
|
|
241
245
|
}
|
|
242
246
|
}
|
|
243
247
|
|
|
248
|
+
code {
|
|
249
|
+
background-color: rgba(255, 255, 255, 0.08);
|
|
250
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
251
|
+
border-radius: 0.375rem;
|
|
252
|
+
font-family: 'SF Mono', SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;
|
|
253
|
+
font-size: 0.875em;
|
|
254
|
+
padding: 0.2rem 0.5rem;
|
|
255
|
+
}
|
|
256
|
+
|
|
244
257
|
@media (prefers-color-scheme: light) {
|
|
245
258
|
header {
|
|
246
259
|
background-color: #ffffff;
|
|
247
260
|
}
|
|
261
|
+
|
|
262
|
+
code {
|
|
263
|
+
background-color: rgba(0, 0, 0, 0.06);
|
|
264
|
+
border-color: rgba(0, 0, 0, 0.1);
|
|
265
|
+
}
|
|
248
266
|
}
|
|
249
267
|
</style>
|
|
250
268
|
`;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { ScaffoldFrontendProps } from '../../types';
|
|
2
|
-
export declare const scaffoldSvelte: ({ isSingleFrontend, targetDirectory, frontends, templatesDirectory, projectAssetsDirectory }: ScaffoldFrontendProps) => void;
|
|
2
|
+
export declare const scaffoldSvelte: ({ editBasePath, isSingleFrontend, targetDirectory, frontends, templatesDirectory, projectAssetsDirectory }: ScaffoldFrontendProps) => void;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { copyFileSync, cpSync, mkdirSync, writeFileSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { generateSveltePage } from './generateSveltePage';
|
|
4
|
-
export const scaffoldSvelte = ({ isSingleFrontend, targetDirectory, frontends, templatesDirectory, projectAssetsDirectory }) => {
|
|
4
|
+
export const scaffoldSvelte = ({ editBasePath, isSingleFrontend, targetDirectory, frontends, templatesDirectory, projectAssetsDirectory }) => {
|
|
5
5
|
copyFileSync(join(templatesDirectory, 'assets', 'svg', 'svelte-logo.svg'), join(projectAssetsDirectory, 'svg', 'svelte-logo.svg'));
|
|
6
6
|
cpSync(join(templatesDirectory, 'svelte'), targetDirectory, {
|
|
7
7
|
recursive: true
|
|
8
8
|
});
|
|
9
|
-
const sveltePage = generateSveltePage(frontends);
|
|
9
|
+
const sveltePage = generateSveltePage(frontends, editBasePath);
|
|
10
10
|
const pagesDirectory = join(targetDirectory, 'pages');
|
|
11
11
|
mkdirSync(pagesDirectory, { recursive: true });
|
|
12
12
|
const svelteFilePath = join(pagesDirectory, 'SvelteExample.svelte');
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { Frontend } from '../../types';
|
|
2
|
-
export declare const generateVuePage: (frontends: Frontend[]) => string;
|
|
2
|
+
export declare const generateVuePage: (frontends: Frontend[], editBasePath: string) => string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { formatNavLink } from '../../utils/formatNavLink';
|
|
2
|
-
export const generateVuePage = (frontends) => {
|
|
2
|
+
export const generateVuePage = (frontends, editBasePath) => {
|
|
3
3
|
const navLinks = frontends.map(formatNavLink).join('\n\t\t\t');
|
|
4
4
|
return `<script setup lang="ts">
|
|
5
5
|
import CountButton from '../components/CountButton.vue';
|
|
@@ -60,7 +60,7 @@ const closeDropdown = (event: PointerEvent) => {
|
|
|
60
60
|
<h1>AbsoluteJS + Vue</h1>
|
|
61
61
|
<CountButton :initialCount="count" />
|
|
62
62
|
<p>
|
|
63
|
-
Edit <code
|
|
63
|
+
Edit <code>${editBasePath}/pages/VueExample.vue</code> and save
|
|
64
64
|
to test HMR.
|
|
65
65
|
</p>
|
|
66
66
|
${frontends.length > 1
|
|
@@ -191,6 +191,10 @@ h1 {
|
|
|
191
191
|
filter: drop-shadow(0 0 2rem #42b883);
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
+
button:hover {
|
|
195
|
+
border-color: #42b883;
|
|
196
|
+
}
|
|
197
|
+
|
|
194
198
|
nav {
|
|
195
199
|
display: flex;
|
|
196
200
|
gap: 4rem;
|
|
@@ -295,6 +299,15 @@ header details nav a {
|
|
|
295
299
|
}
|
|
296
300
|
}
|
|
297
301
|
|
|
302
|
+
code {
|
|
303
|
+
background-color: rgba(255, 255, 255, 0.08);
|
|
304
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
305
|
+
border-radius: 0.375rem;
|
|
306
|
+
font-family: 'SF Mono', SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;
|
|
307
|
+
font-size: 0.875em;
|
|
308
|
+
padding: 0.2rem 0.5rem;
|
|
309
|
+
}
|
|
310
|
+
|
|
298
311
|
@media (prefers-color-scheme: light) {
|
|
299
312
|
:global(body) {
|
|
300
313
|
background-color: #f5f5f5;
|
|
@@ -308,6 +321,11 @@ header details nav a {
|
|
|
308
321
|
button {
|
|
309
322
|
background-color: #ffffff;
|
|
310
323
|
}
|
|
324
|
+
|
|
325
|
+
code {
|
|
326
|
+
background-color: rgba(0, 0, 0, 0.06);
|
|
327
|
+
border-color: rgba(0, 0, 0, 0.1);
|
|
328
|
+
}
|
|
311
329
|
}
|
|
312
330
|
</style>
|
|
313
331
|
`;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { ScaffoldFrontendProps } from '../../types';
|
|
2
2
|
type ScaffoldVueProps = Omit<ScaffoldFrontendProps, 'isSingleFrontend'>;
|
|
3
|
-
export declare const scaffoldVue: ({ targetDirectory, templatesDirectory, frontends, projectAssetsDirectory }: ScaffoldVueProps) => void;
|
|
3
|
+
export declare const scaffoldVue: ({ editBasePath, targetDirectory, templatesDirectory, frontends, projectAssetsDirectory }: ScaffoldVueProps) => void;
|
|
4
4
|
export {};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { cpSync, copyFileSync, mkdirSync, writeFileSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { generateVuePage } from './generateVuePage';
|
|
4
|
-
export const scaffoldVue = ({ targetDirectory, templatesDirectory, frontends, projectAssetsDirectory }) => {
|
|
4
|
+
export const scaffoldVue = ({ editBasePath, targetDirectory, templatesDirectory, frontends, projectAssetsDirectory }) => {
|
|
5
5
|
copyFileSync(join(templatesDirectory, 'assets', 'svg', 'vue-logo.svg'), join(projectAssetsDirectory, 'svg', 'vue-logo.svg'));
|
|
6
6
|
cpSync(join(templatesDirectory, 'vue'), targetDirectory, {
|
|
7
7
|
recursive: true
|
|
8
8
|
});
|
|
9
|
-
const vuePage = generateVuePage(frontends);
|
|
9
|
+
const vuePage = generateVuePage(frontends, editBasePath);
|
|
10
10
|
const pagesDirectory = join(targetDirectory, 'pages');
|
|
11
11
|
mkdirSync(pagesDirectory, { recursive: true });
|
|
12
12
|
const vueFilePath = join(pagesDirectory, 'VueExample.vue');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const getDatabaseEngine: () => Promise<"gel" | "
|
|
1
|
+
export declare const getDatabaseEngine: () => Promise<"gel" | "mariadb" | "mssql" | "mysql" | "postgresql" | "singlestore" | "sqlite" | "mongodb" | "cockroachdb" | undefined>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { DirectoryConfiguration, Frontend } from '../types';
|
|
2
|
-
export declare const getFrontendDirectoryConfigurations: (directoryConfiguration: DirectoryConfiguration, frontends: Frontend[], passedFrontendDirectories: Partial<Record<Frontend, string>> | undefined) => Promise<Partial<Record<"react" | "html" | "svelte" | "vue" | "htmx", string>>>;
|
|
2
|
+
export declare const getFrontendDirectoryConfigurations: (directoryConfiguration: DirectoryConfiguration, frontends: Frontend[], passedFrontendDirectories: Partial<Record<Frontend, string>> | undefined) => Promise<Partial<Record<"react" | "html" | "svelte" | "vue" | "htmx" | "angular", string>>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const getFrontends: () => Promise<("react" | "html" | "svelte" | "vue" | "htmx")[]>;
|
|
1
|
+
export declare const getFrontends: () => Promise<("react" | "html" | "svelte" | "vue" | "htmx" | "angular")[]>;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { multiselect, isCancel } from '@clack/prompts';
|
|
2
|
-
import { frontendLabels } from '../data';
|
|
2
|
+
import { availableFrontends, frontendLabels } from '../data';
|
|
3
3
|
import { isFrontend } from '../typeGuards';
|
|
4
4
|
import { abort } from '../utils/abort';
|
|
5
5
|
export const getFrontends = async () => {
|
|
6
6
|
const frontends = await multiselect({
|
|
7
7
|
message: 'Frontend(s) (space to select, enter to finish):',
|
|
8
|
-
options:
|
|
9
|
-
label,
|
|
8
|
+
options: availableFrontends.map((value) => ({
|
|
9
|
+
label: frontendLabels[value],
|
|
10
10
|
value
|
|
11
11
|
}))
|
|
12
12
|
});
|
package/dist/scaffold.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { copyFileSync } from 'fs';
|
|
1
|
+
import { copyFileSync, mkdirSync, writeFileSync } from 'fs';
|
|
2
2
|
import { join, dirname } from 'path';
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
4
|
import { formatProject } from './commands/formatProject';
|
|
@@ -66,7 +66,7 @@ export const scaffold = async ({ response: { projectName, codeQualityTool, initi
|
|
|
66
66
|
projectName,
|
|
67
67
|
typesDirectory
|
|
68
68
|
});
|
|
69
|
-
dockerFreshInstall = result
|
|
69
|
+
({ dockerFreshInstall } = result);
|
|
70
70
|
}
|
|
71
71
|
scaffoldFrontends({
|
|
72
72
|
absProviders,
|
|
@@ -81,6 +81,18 @@ export const scaffold = async ({ response: { projectName, codeQualityTool, initi
|
|
|
81
81
|
useHTMLScripts,
|
|
82
82
|
useTailwind
|
|
83
83
|
});
|
|
84
|
+
const utilsDirectory = join(frontendDirectory, 'utils');
|
|
85
|
+
mkdirSync(utilsDirectory, { recursive: true });
|
|
86
|
+
writeFileSync(join(utilsDirectory, 'edenTreaty.ts'), `import { treaty } from '@elysiajs/eden'
|
|
87
|
+
import type { Server } from '../../backend/server'
|
|
88
|
+
|
|
89
|
+
const serverUrl =
|
|
90
|
+
typeof window !== 'undefined'
|
|
91
|
+
? window.location.origin
|
|
92
|
+
: 'http://localhost:3000'
|
|
93
|
+
|
|
94
|
+
export const server = treaty<Server>(serverUrl)
|
|
95
|
+
`);
|
|
84
96
|
if (installDependenciesNow) {
|
|
85
97
|
await installDependencies(packageManager, projectName);
|
|
86
98
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="a" x1="64" y1="128" x2="64" y2="0" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#e40035"/>
|
|
5
|
+
<stop offset=".24" stop-color="#f60a48"/>
|
|
6
|
+
<stop offset=".352" stop-color="#f20755"/>
|
|
7
|
+
<stop offset=".494" stop-color="#dc087d"/>
|
|
8
|
+
<stop offset=".745" stop-color="#9717e7"/>
|
|
9
|
+
<stop offset="1" stop-color="#6c00f5"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<linearGradient id="b" x1="64" y1="128" x2="64" y2="0" gradientUnits="userSpaceOnUse">
|
|
12
|
+
<stop offset="0" stop-color="#ff31d9" stop-opacity=".8"/>
|
|
13
|
+
<stop offset="1" stop-color="#ff5be1" stop-opacity="0"/>
|
|
14
|
+
</linearGradient>
|
|
15
|
+
</defs>
|
|
16
|
+
<path fill="url(#a)" d="M7.9 89.9 3.5 21.3 49.7 0ZM124.5 21.3 120.1 89.9 78.3 0ZM64 34.1 80.5 74.3 47.5 74.3ZM95.5 110 64 128 32.5 110 38.9 94.5 89.2 94.5Z"/>
|
|
17
|
+
<path fill="url(#b)" d="M7.9 89.9 3.5 21.3 49.7 0ZM124.5 21.3 120.1 89.9 78.3 0ZM64 34.1 80.5 74.3 47.5 74.3ZM95.5 110 64 128 32.5 110 38.9 94.5 89.2 94.5Z"/>
|
|
18
|
+
</svg>
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
|
-
/* Visit https://aka.ms/tsconfig to read more about this file */
|
|
4
|
-
|
|
5
|
-
/* Projects */
|
|
6
|
-
"incremental": true,
|
|
7
|
-
"tsBuildInfoFile": ".absolutejs/tsconfig.tsbuildinfo",
|
|
8
3
|
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
|
|
9
4
|
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
|
|
10
5
|
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
|
|
@@ -50,9 +45,13 @@
|
|
|
50
45
|
/* Interop Constraints */
|
|
51
46
|
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
|
|
52
47
|
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
|
|
53
|
-
"esModuleInterop": true, // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node.
|
|
54
|
-
/* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ "forceConsistentCasingInFileNames": true, // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment.
|
|
55
|
-
/*
|
|
48
|
+
"esModuleInterop": true, // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */,
|
|
49
|
+
/* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ "forceConsistentCasingInFileNames": true, // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */,
|
|
50
|
+
/* Visit https://aka.ms/tsconfig to read more about this file */
|
|
51
|
+
|
|
52
|
+
/* Projects */
|
|
53
|
+
"incremental": true,
|
|
54
|
+
/* Ensure that casing is correct in imports. */ "jsx": "react-jsx", // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */,
|
|
56
55
|
/* Specify what JSX code is generated. */ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
|
|
57
56
|
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
|
|
58
57
|
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
|
|
@@ -62,8 +61,8 @@
|
|
|
62
61
|
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
|
|
63
62
|
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
|
|
64
63
|
/* Modules */
|
|
65
|
-
"module": "ESNext", // "rootDir": "./", /* Specify the root folder within your source files.
|
|
66
|
-
/* Specify what module code is generated. */ "moduleResolution": "bundler", // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type.
|
|
64
|
+
"module": "ESNext", // "rootDir": "./", /* Specify the root folder within your source files. */,
|
|
65
|
+
/* Specify what module code is generated. */ "moduleResolution": "bundler", // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */,
|
|
67
66
|
/* Specify how TypeScript looks up a file from a given module specifier. */ // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
|
|
68
67
|
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
|
|
69
68
|
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
|
|
@@ -76,7 +75,7 @@
|
|
|
76
75
|
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
|
|
77
76
|
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
|
|
78
77
|
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
|
|
79
|
-
"noUncheckedIndexedAccess": true, // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier.
|
|
78
|
+
"noUncheckedIndexedAccess": true, // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */,
|
|
80
79
|
/* Add 'undefined' to a type when accessed using an index. */ // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
|
|
81
80
|
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
|
|
82
81
|
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
|
|
@@ -86,7 +85,8 @@
|
|
|
86
85
|
/* Skip type checking all .d.ts files. */ "strict": true /* Visit https://aka.ms/tsconfig to read more about this file */,
|
|
87
86
|
/* Enable all strict type-checking options. */ /* Projects */
|
|
88
87
|
/* Language and Environment */
|
|
89
|
-
"target": "ESNext"
|
|
88
|
+
"target": "ESNext",
|
|
89
|
+
"tsBuildInfoFile": ".absolutejs/tsconfig.tsbuildinfo"
|
|
90
90
|
/* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ /* Skip type checking all .d.ts files. */
|
|
91
91
|
}
|
|
92
92
|
}
|
|
@@ -10,16 +10,16 @@ export const App = ({ initialCount }: AppProps) => {
|
|
|
10
10
|
<nav>
|
|
11
11
|
<a href="https://absolutejs.com" target="_blank">
|
|
12
12
|
<img
|
|
13
|
+
alt="AbsoluteJS Logo"
|
|
13
14
|
className="logo"
|
|
14
15
|
src="/assets/png/absolutejs-temp.png"
|
|
15
|
-
alt="AbsoluteJS Logo"
|
|
16
16
|
/>
|
|
17
17
|
</a>
|
|
18
18
|
<a href="https://react.dev/">
|
|
19
19
|
<img
|
|
20
|
+
alt="React Logo"
|
|
20
21
|
className="logo react"
|
|
21
22
|
src="/assets/svg/react.svg"
|
|
22
|
-
alt="React Logo"
|
|
23
23
|
/>
|
|
24
24
|
</a>
|
|
25
25
|
</nav>
|
|
@@ -16,19 +16,19 @@ export const Head = ({
|
|
|
16
16
|
<head>
|
|
17
17
|
<meta charSet="utf-8" />
|
|
18
18
|
<title>{title}</title>
|
|
19
|
-
<meta name="description"
|
|
20
|
-
<meta
|
|
21
|
-
<link rel="icon"
|
|
22
|
-
<link
|
|
19
|
+
<meta content={description} name="description" />
|
|
20
|
+
<meta content="width=device-width, initial-scale=1" name="viewport" />
|
|
21
|
+
<link href={icon} rel="icon" />
|
|
22
|
+
<link href="https://fonts.googleapis.com" rel="preconnect" />
|
|
23
23
|
<link
|
|
24
|
-
rel="preconnect"
|
|
25
|
-
href="https://fonts.gstatic.com"
|
|
26
24
|
crossOrigin="anonymous"
|
|
25
|
+
href="https://fonts.gstatic.com"
|
|
26
|
+
rel="preconnect"
|
|
27
27
|
/>
|
|
28
28
|
<link
|
|
29
29
|
href={`https://fonts.googleapis.com/css2?family=${font}:wght@100..900&display=swap`}
|
|
30
30
|
rel="stylesheet"
|
|
31
31
|
/>
|
|
32
|
-
{cssPath && <link rel="stylesheet"
|
|
32
|
+
{cssPath && <link href={cssPath} rel="stylesheet" type="text/css" />}
|
|
33
33
|
</head>
|
|
34
34
|
);
|
|
@@ -17,18 +17,18 @@ export const OAuthLink = ({
|
|
|
17
17
|
|
|
18
18
|
return (
|
|
19
19
|
<a
|
|
20
|
+
href={provider ? `/oauth2/${provider}/authorization` : undefined}
|
|
20
21
|
style={{
|
|
21
22
|
alignItems: 'center',
|
|
22
23
|
display: 'flex',
|
|
23
24
|
gap: '0.5rem'
|
|
24
25
|
}}
|
|
25
|
-
href={provider ? `/oauth2/${provider}/authorization` : undefined}
|
|
26
26
|
>
|
|
27
27
|
{provider ? (
|
|
28
28
|
<img
|
|
29
|
-
style={{ height: '2rem', width: '2rem' }}
|
|
30
29
|
alt={`${name} logo`}
|
|
31
30
|
src={logoUrl}
|
|
31
|
+
style={{ height: '2rem', width: '2rem' }}
|
|
32
32
|
/>
|
|
33
33
|
) : (
|
|
34
34
|
<p>Provider not configured</p>
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
export const primaryColor = '#5FBEEB';
|
|
2
|
-
export const secondaryColor = '#35d5a2';
|
|
3
|
-
export const tertiaryColor = '#ff4b91';
|
|
4
|
-
|
|
5
|
-
export const lightPrimaryColor = '#ffffff';
|
|
6
|
-
export const lightSecondaryColor = '#f5f5f5';
|
|
7
|
-
export const lightTertiaryColor = '#e0e0e0';
|
|
8
|
-
|
|
9
1
|
export const darkPrimaryColor = '#1a1a1a';
|
|
10
2
|
export const darkSecondaryColor = '#2c2c2c';
|
|
11
3
|
export const darkTertiaryColor = '#3c3c3c';
|
|
4
|
+
export const lightPrimaryColor = '#ffffff';
|
|
5
|
+
export const lightSecondaryColor = '#f5f5f5';
|
|
6
|
+
export const lightTertiaryColor = '#e0e0e0';
|
|
7
|
+
export const primaryColor = '#5FBEEB';
|
|
8
|
+
export const secondaryColor = '#35d5a2';
|
|
9
|
+
export const tertiaryColor = '#ff4b91';
|
|
@@ -76,6 +76,16 @@ button:focus-visible {
|
|
|
76
76
|
outline: 4px auto -webkit-focus-ring-color;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
code {
|
|
80
|
+
background-color: rgba(255, 255, 255, 0.08);
|
|
81
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
82
|
+
border-radius: 0.375rem;
|
|
83
|
+
font-family:
|
|
84
|
+
'SF Mono', SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;
|
|
85
|
+
font-size: 0.875em;
|
|
86
|
+
padding: 0.2rem 0.5rem;
|
|
87
|
+
}
|
|
88
|
+
|
|
79
89
|
@media (max-width: 480px) {
|
|
80
90
|
main {
|
|
81
91
|
padding: 1rem;
|
|
@@ -95,4 +105,9 @@ button:focus-visible {
|
|
|
95
105
|
background-color: #f5f5f5;
|
|
96
106
|
color: #1a1a1a;
|
|
97
107
|
}
|
|
108
|
+
|
|
109
|
+
code {
|
|
110
|
+
background-color: rgba(0, 0, 0, 0.06);
|
|
111
|
+
border-color: rgba(0, 0, 0, 0.1);
|
|
112
|
+
}
|
|
98
113
|
}
|