create-absolutejs 0.10.3 → 0.12.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 +11 -0
- package/dist/generators/angular/generateAngularPage.js +174 -0
- package/dist/generators/angular/scaffoldAngular.d.ts +2 -0
- package/dist/generators/angular/scaffoldAngular.js +38 -0
- package/dist/generators/configurations/generatePackageJson.js +28 -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 +3 -3
- package/dist/generators/html/scaffoldHTML.d.ts +1 -1
- package/dist/generators/html/scaffoldHTML.js +4 -6
- package/dist/generators/htmx/generateHTMXPage.d.ts +1 -1
- package/dist/generators/htmx/generateHTMXPage.js +3 -3
- package/dist/generators/htmx/scaffoldHTMX.d.ts +1 -1
- package/dist/generators/htmx/scaffoldHTMX.js +4 -6
- 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 +12 -7
- package/dist/generators/project/generateDBBlock.js +6 -0
- package/dist/generators/project/generateImportsBlock.d.ts +1 -2
- package/dist/generators/project/generateImportsBlock.js +48 -50
- package/dist/generators/project/generateMarkupCSS.d.ts +1 -1
- package/dist/generators/project/generateMarkupCSS.js +5 -1
- package/dist/generators/project/generateRoutesBlock.d.ts +1 -4
- package/dist/generators/project/generateRoutesBlock.js +44 -38
- package/dist/generators/project/generateServer.js +5 -12
- package/dist/generators/project/scaffoldFrontends.js +40 -4
- 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 +4 -6
- 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 +4 -6
- package/dist/generators/vue/generateVuePage.d.ts +1 -1
- package/dist/generators/vue/generateVuePage.js +2 -229
- package/dist/generators/vue/scaffoldVue.d.ts +1 -1
- package/dist/generators/vue/scaffoldVue.js +6 -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 +3 -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 +38 -29
- package/dist/versions.js +49 -39
- package/package.json +10 -9
- /package/dist/templates/configurations/{eslint.config.mjs → eslint.config.example.mjs} +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { isFrontend } from '../../typeGuards';
|
|
2
|
-
export const generateRoutesBlock = ({ databaseEngine,
|
|
2
|
+
export const generateRoutesBlock = ({ databaseEngine, frontendDirectories, authOption }) => {
|
|
3
3
|
const hasDatabase = databaseEngine !== undefined && databaseEngine !== 'none';
|
|
4
4
|
const routes = [];
|
|
5
|
-
const wrap = (handlerCall) => authOption === 'abs'
|
|
5
|
+
const wrap = (handlerCall, isAsync = false) => authOption === 'abs'
|
|
6
6
|
? `async ({ cookie: { auth_provider, user_session_id }, store: { session }, status }) => {
|
|
7
7
|
const { user, error } = await getStatus(session, user_session_id);
|
|
8
8
|
|
|
@@ -15,55 +15,61 @@ export const generateRoutesBlock = ({ databaseEngine, flags, frontendDirectories
|
|
|
15
15
|
|
|
16
16
|
return ${handlerCall};
|
|
17
17
|
}`
|
|
18
|
-
:
|
|
19
|
-
const createHandlerCall = (frontend
|
|
20
|
-
|
|
18
|
+
: `${isAsync ? 'async ' : ''}() => ${handlerCall}`;
|
|
19
|
+
const createHandlerCall = (frontend) => {
|
|
20
|
+
if (frontend === 'angular')
|
|
21
|
+
return `handleAngularPageRequest<typeof AngularExamplePage>({
|
|
22
|
+
headTag: generateHeadElement({
|
|
23
|
+
cssPath: asset(manifest, 'AngularExampleCSS'),
|
|
24
|
+
title: 'AbsoluteJS + Angular'
|
|
25
|
+
}),
|
|
26
|
+
indexPath: asset(manifest, 'AngularExampleIndex'),
|
|
27
|
+
pagePath: asset(manifest, 'AngularExample'),
|
|
28
|
+
props: { initialCount: 0 }
|
|
29
|
+
})`;
|
|
21
30
|
if (frontend === 'html')
|
|
22
|
-
return `handleHTMLPageRequest(
|
|
31
|
+
return `handleHTMLPageRequest(asset(manifest, 'HTMLExample'))`;
|
|
23
32
|
if (frontend === 'htmx')
|
|
24
|
-
return `handleHTMXPageRequest(
|
|
33
|
+
return `handleHTMXPageRequest(asset(manifest, 'HTMXExample'))`;
|
|
25
34
|
if (frontend === 'react') {
|
|
26
35
|
const reactProps = authOption === 'abs'
|
|
27
|
-
? `{
|
|
28
|
-
: `{
|
|
29
|
-
return `handleReactPageRequest(
|
|
30
|
-
ReactExample,
|
|
31
|
-
asset(
|
|
32
|
-
${reactProps}
|
|
33
|
-
)`;
|
|
36
|
+
? `{ cssPath: asset(manifest, 'ReactExampleCSS'), initialCount: 0, providerConfiguration, user }`
|
|
37
|
+
: `{ cssPath: asset(manifest, 'ReactExampleCSS'), initialCount: 0 }`;
|
|
38
|
+
return `handleReactPageRequest({
|
|
39
|
+
Page: ReactExample,
|
|
40
|
+
index: asset(manifest, 'ReactExampleIndex'),
|
|
41
|
+
props: ${reactProps}
|
|
42
|
+
})`;
|
|
34
43
|
}
|
|
35
44
|
if (frontend === 'svelte')
|
|
36
|
-
return `handleSveltePageRequest(
|
|
37
|
-
|
|
38
|
-
asset(
|
|
39
|
-
asset(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
asset(result, 'VueExampleIndex'),
|
|
50
|
-
generateHeadElement({
|
|
51
|
-
cssPath: asset(result, 'VueExampleCSS'),
|
|
52
|
-
title: 'AbsoluteJS + Vue',
|
|
53
|
-
description: 'A Vue.js example with AbsoluteJS'
|
|
45
|
+
return `handleSveltePageRequest<typeof SvelteExample>({
|
|
46
|
+
indexPath: asset(manifest, 'SvelteExampleIndex'),
|
|
47
|
+
pagePath: asset(manifest, 'SvelteExample'),
|
|
48
|
+
props: { cssPath: asset(manifest, 'SvelteExampleCSS'), initialCount: 0 }
|
|
49
|
+
})`;
|
|
50
|
+
if (frontend === 'vue')
|
|
51
|
+
return `handleVuePageRequest<typeof VueExample>({
|
|
52
|
+
headTag: generateHeadElement({
|
|
53
|
+
cssPath: [
|
|
54
|
+
asset(manifest, 'VueExampleCSS'),
|
|
55
|
+
asset(manifest, 'VueExampleCompiledCSS')
|
|
56
|
+
],
|
|
57
|
+
title: 'AbsoluteJS + Vue'
|
|
54
58
|
}),
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
59
|
+
indexPath: asset(manifest, 'VueExampleIndex'),
|
|
60
|
+
pagePath: asset(manifest, 'VueExample'),
|
|
61
|
+
props: { initialCount: 0 }
|
|
62
|
+
})`;
|
|
58
63
|
return '';
|
|
59
64
|
};
|
|
60
|
-
Object.entries(frontendDirectories).forEach(([frontend
|
|
65
|
+
Object.entries(frontendDirectories).forEach(([frontend], entryIndex) => {
|
|
61
66
|
if (!isFrontend(frontend))
|
|
62
67
|
return;
|
|
63
|
-
const handlerCall = createHandlerCall(frontend
|
|
68
|
+
const handlerCall = createHandlerCall(frontend);
|
|
64
69
|
if (!handlerCall)
|
|
65
70
|
return;
|
|
66
|
-
const
|
|
71
|
+
const isAsync = frontend === 'angular';
|
|
72
|
+
const handler = wrap(handlerCall, isAsync);
|
|
67
73
|
if (entryIndex === 0) {
|
|
68
74
|
routes.push(`.get('/', ${handler})`);
|
|
69
75
|
}
|
|
@@ -12,7 +12,6 @@ export const generateServerFile = ({ tailwind, authOption, plugins, buildDirecto
|
|
|
12
12
|
const deps = collectDependencies({ authOption, flags, plugins });
|
|
13
13
|
const importsBlock = generateImportsBlock({
|
|
14
14
|
authOption,
|
|
15
|
-
backendDirectory,
|
|
16
15
|
databaseEngine,
|
|
17
16
|
databaseHost,
|
|
18
17
|
deps,
|
|
@@ -22,6 +21,7 @@ export const generateServerFile = ({ tailwind, authOption, plugins, buildDirecto
|
|
|
22
21
|
});
|
|
23
22
|
const manifestBlock = generateBuildBlock({
|
|
24
23
|
assetsDirectory,
|
|
24
|
+
backendDirectory,
|
|
25
25
|
buildDirectory,
|
|
26
26
|
frontendDirectories,
|
|
27
27
|
publicDirectory,
|
|
@@ -59,31 +59,24 @@ export const generateServerFile = ({ tailwind, authOption, plugins, buildDirecto
|
|
|
59
59
|
})`;
|
|
60
60
|
const routesBlock = generateRoutesBlock({
|
|
61
61
|
authOption,
|
|
62
|
-
buildDirectory,
|
|
63
62
|
databaseEngine,
|
|
64
|
-
flags,
|
|
65
63
|
frontendDirectories
|
|
66
64
|
});
|
|
67
|
-
const hmrBlock = `
|
|
68
|
-
if (
|
|
69
|
-
typeof result.hmrState !== 'string' &&
|
|
70
|
-
typeof result.manifest === 'object'
|
|
71
|
-
) {
|
|
72
|
-
server.use(hmr(result.hmrState, result.manifest));
|
|
73
|
-
}`;
|
|
74
65
|
const content = `${importsBlock}
|
|
75
66
|
|
|
76
67
|
${manifestBlock}
|
|
77
68
|
${dbBlock ? `${dbBlock}\n` : ''}
|
|
78
69
|
const server = new Elysia()
|
|
70
|
+
.use(absolutejs)
|
|
79
71
|
${useBlock}${authOption === 'abs' ? `\n${guardBlock}` : ''}
|
|
80
72
|
${routesBlock}
|
|
81
73
|
.use(networking)
|
|
82
74
|
.on('error', err => {
|
|
83
75
|
const { request } = err
|
|
84
76
|
console.error(\`Server error on \${request.method} \${request.url}: \${err.message}\`)
|
|
85
|
-
})
|
|
86
|
-
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
export type Server = typeof server
|
|
87
80
|
`;
|
|
88
81
|
writeFileSync(serverFilePath, content);
|
|
89
82
|
};
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { copyFileSync, cpSync, mkdirSync } from 'fs';
|
|
2
|
-
import { join } from 'path';
|
|
2
|
+
import { dirname, 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';
|
|
6
7
|
import { scaffoldSvelte } from '../svelte/scaffoldSvelte';
|
|
7
8
|
import { scaffoldVue } from '../vue/scaffoldVue';
|
|
8
9
|
export const scaffoldFrontends = ({ frontendDirectory, assetsDirectory, absProviders, authOption, templatesDirectory, projectAssetsDirectory, typesDirectory, useHTMLScripts, useTailwind, frontendDirectories, frontends }) => {
|
|
9
|
-
const
|
|
10
|
-
|
|
10
|
+
const srcDirectory = dirname(frontendDirectory);
|
|
11
|
+
const globalStylesDirectory = join(srcDirectory, 'styles');
|
|
12
|
+
const stylesIndexesDirectory = join(globalStylesDirectory, 'indexes');
|
|
13
|
+
cpSync(join(templatesDirectory, 'styles'), globalStylesDirectory, {
|
|
11
14
|
recursive: true
|
|
12
15
|
});
|
|
16
|
+
mkdirSync(stylesIndexesDirectory, { recursive: true });
|
|
17
|
+
const stylesTargetDirectory = join(frontendDirectory, 'styles');
|
|
18
|
+
mkdirSync(stylesTargetDirectory, { recursive: true });
|
|
13
19
|
if (useTailwind) {
|
|
14
20
|
copyFileSync(join(templatesDirectory, 'tailwind', 'tailwind.css'), join(stylesTargetDirectory, 'tailwind.css'));
|
|
15
21
|
}
|
|
@@ -25,15 +31,21 @@ export const scaffoldFrontends = ({ frontendDirectory, assetsDirectory, absProvi
|
|
|
25
31
|
const targetDirectory = join(frontendDirectory, directory);
|
|
26
32
|
if (!isSingleFrontend)
|
|
27
33
|
mkdirSync(targetDirectory);
|
|
34
|
+
const editBasePath = directory
|
|
35
|
+
? `src/frontend/${directory}`
|
|
36
|
+
: 'src/frontend';
|
|
28
37
|
switch (frontendName) {
|
|
29
38
|
case 'react':
|
|
30
39
|
scaffoldReact({
|
|
31
40
|
absProviders,
|
|
32
41
|
assetsDirectory,
|
|
33
42
|
authOption,
|
|
43
|
+
editBasePath,
|
|
34
44
|
frontends,
|
|
35
45
|
isSingleFrontend,
|
|
36
46
|
projectAssetsDirectory,
|
|
47
|
+
stylesDirectory: stylesTargetDirectory,
|
|
48
|
+
stylesIndexesDirectory,
|
|
37
49
|
targetDirectory,
|
|
38
50
|
templatesDirectory
|
|
39
51
|
});
|
|
@@ -43,9 +55,12 @@ export const scaffoldFrontends = ({ frontendDirectory, assetsDirectory, absProvi
|
|
|
43
55
|
absProviders,
|
|
44
56
|
assetsDirectory,
|
|
45
57
|
authOption,
|
|
58
|
+
editBasePath,
|
|
46
59
|
frontends,
|
|
47
60
|
isSingleFrontend,
|
|
48
61
|
projectAssetsDirectory,
|
|
62
|
+
stylesDirectory: stylesTargetDirectory,
|
|
63
|
+
stylesIndexesDirectory,
|
|
49
64
|
targetDirectory,
|
|
50
65
|
templatesDirectory
|
|
51
66
|
});
|
|
@@ -55,24 +70,42 @@ export const scaffoldFrontends = ({ frontendDirectory, assetsDirectory, absProvi
|
|
|
55
70
|
absProviders,
|
|
56
71
|
assetsDirectory,
|
|
57
72
|
authOption,
|
|
73
|
+
editBasePath,
|
|
58
74
|
frontends,
|
|
59
75
|
projectAssetsDirectory,
|
|
76
|
+
stylesDirectory: stylesTargetDirectory,
|
|
77
|
+
stylesIndexesDirectory,
|
|
60
78
|
targetDirectory,
|
|
61
79
|
templatesDirectory
|
|
62
80
|
});
|
|
63
81
|
copyFileSync(join(templatesDirectory, 'types', 'vue-shim.d.ts'), join(typesDirectory, 'vue-shim.d.ts'));
|
|
64
82
|
break;
|
|
65
83
|
case 'angular':
|
|
66
|
-
|
|
84
|
+
scaffoldAngular({
|
|
85
|
+
absProviders,
|
|
86
|
+
assetsDirectory,
|
|
87
|
+
authOption,
|
|
88
|
+
editBasePath,
|
|
89
|
+
frontends,
|
|
90
|
+
isSingleFrontend,
|
|
91
|
+
projectAssetsDirectory,
|
|
92
|
+
stylesDirectory: stylesTargetDirectory,
|
|
93
|
+
stylesIndexesDirectory,
|
|
94
|
+
targetDirectory,
|
|
95
|
+
templatesDirectory
|
|
96
|
+
});
|
|
67
97
|
break;
|
|
68
98
|
case 'html':
|
|
69
99
|
scaffoldHTML({
|
|
70
100
|
absProviders,
|
|
71
101
|
assetsDirectory,
|
|
72
102
|
authOption,
|
|
103
|
+
editBasePath,
|
|
73
104
|
frontends,
|
|
74
105
|
isSingleFrontend,
|
|
75
106
|
projectAssetsDirectory,
|
|
107
|
+
stylesDirectory: stylesTargetDirectory,
|
|
108
|
+
stylesIndexesDirectory,
|
|
76
109
|
targetDirectory,
|
|
77
110
|
templatesDirectory,
|
|
78
111
|
useHTMLScripts
|
|
@@ -83,9 +116,12 @@ export const scaffoldFrontends = ({ frontendDirectory, assetsDirectory, absProvi
|
|
|
83
116
|
absProviders,
|
|
84
117
|
assetsDirectory,
|
|
85
118
|
authOption,
|
|
119
|
+
editBasePath,
|
|
86
120
|
frontends,
|
|
87
121
|
isSingleFrontend,
|
|
88
122
|
projectAssetsDirectory,
|
|
123
|
+
stylesDirectory: stylesTargetDirectory,
|
|
124
|
+
stylesIndexesDirectory,
|
|
89
125
|
targetDirectory,
|
|
90
126
|
templatesDirectory
|
|
91
127
|
});
|
|
@@ -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: ({
|
|
2
|
+
export declare const scaffoldReact: ({ authOption, editBasePath, targetDirectory, templatesDirectory, frontends, projectAssetsDirectory, absProviders, stylesIndexesDirectory }: 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 = ({
|
|
5
|
+
export const scaffoldReact = ({ authOption, editBasePath, targetDirectory, templatesDirectory, frontends, projectAssetsDirectory, absProviders, stylesIndexesDirectory }) => {
|
|
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');
|
|
@@ -20,9 +20,7 @@ export const scaffoldReact = ({ isSingleFrontend, authOption, targetDirectory, t
|
|
|
20
20
|
const pageComponent = generateReactExamplePage(authOption);
|
|
21
21
|
mkdirSync(join(targetDirectory, 'pages'), { recursive: true });
|
|
22
22
|
writeFileSync(join(targetDirectory, 'pages', 'ReactExample.tsx'), pageComponent, 'utf-8');
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
const cssOutputFile = join(cssOutputDir, 'react-example.css');
|
|
26
|
-
const reactCSS = generateMarkupCSS('react', '#61dafbaa', isSingleFrontend);
|
|
23
|
+
const cssOutputFile = join(stylesIndexesDirectory, 'react-example.css');
|
|
24
|
+
const reactCSS = generateMarkupCSS('react', '#61dafbaa');
|
|
27
25
|
writeFileSync(cssOutputFile, reactCSS, 'utf-8');
|
|
28
26
|
};
|
|
@@ -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: ({
|
|
2
|
+
export declare const scaffoldSvelte: ({ editBasePath, targetDirectory, frontends, templatesDirectory, projectAssetsDirectory, stylesIndexesDirectory }: ScaffoldFrontendProps) => void;
|
|
@@ -1,19 +1,17 @@
|
|
|
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 = ({
|
|
4
|
+
export const scaffoldSvelte = ({ editBasePath, targetDirectory, frontends, templatesDirectory, projectAssetsDirectory, stylesIndexesDirectory }) => {
|
|
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');
|
|
13
13
|
writeFileSync(svelteFilePath, sveltePage, 'utf-8');
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
const cssOutputFile = join(cssOutputDirectory, 'svelte-example.css');
|
|
17
|
-
const svelteCSS = `@import url('${isSingleFrontend ? '../' : '../../'}styles/reset.css');`;
|
|
14
|
+
const cssOutputFile = join(stylesIndexesDirectory, 'svelte-example.css');
|
|
15
|
+
const svelteCSS = `@import url('../reset.css');`;
|
|
18
16
|
writeFileSync(cssOutputFile, svelteCSS, 'utf-8');
|
|
19
17
|
};
|
|
@@ -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;
|