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.
Files changed (75) hide show
  1. package/dist/constants.d.ts +2 -2
  2. package/dist/constants.js +2 -2
  3. package/dist/data.d.ts +10 -10
  4. package/dist/data.js +88 -95
  5. package/dist/generators/angular/generateAngularPage.d.ts +11 -0
  6. package/dist/generators/angular/generateAngularPage.js +174 -0
  7. package/dist/generators/angular/scaffoldAngular.d.ts +2 -0
  8. package/dist/generators/angular/scaffoldAngular.js +38 -0
  9. package/dist/generators/configurations/generatePackageJson.js +28 -3
  10. package/dist/generators/configurations/scaffoldConfigurationFiles.js +26 -2
  11. package/dist/generators/db/dockerInitTemplates.d.ts +9 -9
  12. package/dist/generators/db/dockerInitTemplates.js +9 -9
  13. package/dist/generators/db/generateDatabaseTypes.js +5 -0
  14. package/dist/generators/db/generateDockerContainer.js +4 -2
  15. package/dist/generators/db/generateDrizzleSchema.js +16 -6
  16. package/dist/generators/db/handlerTemplates.d.ts +5 -0
  17. package/dist/generators/db/handlerTemplates.js +6 -0
  18. package/dist/generators/db/scaffoldDocker.js +42 -30
  19. package/dist/generators/html/generateHTMLPage.d.ts +1 -1
  20. package/dist/generators/html/generateHTMLPage.js +3 -3
  21. package/dist/generators/html/scaffoldHTML.d.ts +1 -1
  22. package/dist/generators/html/scaffoldHTML.js +4 -6
  23. package/dist/generators/htmx/generateHTMXPage.d.ts +1 -1
  24. package/dist/generators/htmx/generateHTMXPage.js +3 -3
  25. package/dist/generators/htmx/scaffoldHTMX.d.ts +1 -1
  26. package/dist/generators/htmx/scaffoldHTMX.js +4 -6
  27. package/dist/generators/project/computeFlags.d.ts +1 -0
  28. package/dist/generators/project/computeFlags.js +1 -0
  29. package/dist/generators/project/generateBuildBlock.d.ts +2 -1
  30. package/dist/generators/project/generateBuildBlock.js +12 -7
  31. package/dist/generators/project/generateDBBlock.js +6 -0
  32. package/dist/generators/project/generateImportsBlock.d.ts +1 -2
  33. package/dist/generators/project/generateImportsBlock.js +48 -50
  34. package/dist/generators/project/generateMarkupCSS.d.ts +1 -1
  35. package/dist/generators/project/generateMarkupCSS.js +5 -1
  36. package/dist/generators/project/generateRoutesBlock.d.ts +1 -4
  37. package/dist/generators/project/generateRoutesBlock.js +44 -38
  38. package/dist/generators/project/generateServer.js +5 -12
  39. package/dist/generators/project/scaffoldFrontends.js +40 -4
  40. package/dist/generators/react/generateReactComponents.d.ts +2 -2
  41. package/dist/generators/react/generateReactComponents.js +33 -33
  42. package/dist/generators/react/scaffoldReact.d.ts +1 -1
  43. package/dist/generators/react/scaffoldReact.js +4 -6
  44. package/dist/generators/svelte/generateSveltePage.d.ts +1 -1
  45. package/dist/generators/svelte/generateSveltePage.js +20 -2
  46. package/dist/generators/svelte/scaffoldSvelte.d.ts +1 -1
  47. package/dist/generators/svelte/scaffoldSvelte.js +4 -6
  48. package/dist/generators/vue/generateVuePage.d.ts +1 -1
  49. package/dist/generators/vue/generateVuePage.js +2 -229
  50. package/dist/generators/vue/scaffoldVue.d.ts +1 -1
  51. package/dist/generators/vue/scaffoldVue.js +6 -2
  52. package/dist/questions/databaseEngine.d.ts +1 -1
  53. package/dist/questions/frontendDirectoryConfigurations.d.ts +1 -1
  54. package/dist/questions/frontends.d.ts +1 -1
  55. package/dist/questions/frontends.js +3 -3
  56. package/dist/scaffold.js +14 -2
  57. package/dist/templates/assets/svg/angular.svg +18 -0
  58. package/dist/templates/configurations/tsconfig.example.json +12 -12
  59. package/dist/templates/react/components/App.tsx +2 -2
  60. package/dist/templates/react/components/Head.tsx +7 -7
  61. package/dist/templates/react/components/OAuthLink.tsx +2 -2
  62. package/dist/templates/styles/colors.ts +6 -8
  63. package/dist/templates/styles/reset.css +15 -0
  64. package/dist/templates/svelte/components/Counter.svelte +4 -0
  65. package/dist/templates/vue/components/CountButton.vue +1 -1
  66. package/dist/typeGuards.d.ts +6 -6
  67. package/dist/typeGuards.js +6 -6
  68. package/dist/types.d.ts +3 -0
  69. package/dist/utils/checkDockerInstalled.d.ts +4 -4
  70. package/dist/utils/checkDockerInstalled.js +78 -71
  71. package/dist/utils/parseCommandLineOptions.js +13 -16
  72. package/dist/versions.d.ts +38 -29
  73. package/dist/versions.js +49 -39
  74. package/package.json +10 -9
  75. /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, flags, frontendDirectories, authOption, buildDirectory }) => {
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
- : `() => ${handlerCall}`;
19
- const createHandlerCall = (frontend, directory) => {
20
- const base = `${buildDirectory}${directory ? `/${directory}` : ''}/pages`;
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(\`${base}/HTMLExample.html\`)`;
31
+ return `handleHTMLPageRequest(asset(manifest, 'HTMLExample'))`;
23
32
  if (frontend === 'htmx')
24
- return `handleHTMXPageRequest(\`${base}/HTMXExample.html\`)`;
33
+ return `handleHTMXPageRequest(asset(manifest, 'HTMXExample'))`;
25
34
  if (frontend === 'react') {
26
35
  const reactProps = authOption === 'abs'
27
- ? `{ initialCount: 0, cssPath: asset(result, 'ReactExampleCSS'), user, providerConfiguration }`
28
- : `{ initialCount: 0, cssPath: asset(result, 'ReactExampleCSS') }`;
29
- return `handleReactPageRequest(
30
- ReactExample,
31
- asset(result, 'ReactExampleIndex'),
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
- SvelteExample,
38
- asset(result, 'SvelteExample'),
39
- asset(result, 'SvelteExampleIndex'),
40
- { initialCount: 0, cssPath: asset(result, 'SvelteExampleCSS') }
41
- )`;
42
- if (frontend === 'vue') {
43
- const vueComponent = flags.requiresSvelte
44
- ? 'vueImports.VueExample'
45
- : 'VueExample';
46
- return `handleVuePageRequest(
47
- ${vueComponent},
48
- asset(result, 'VueExample'),
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
- { initialCount: 0 }
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, directory], entryIndex) => {
65
+ Object.entries(frontendDirectories).forEach(([frontend], entryIndex) => {
61
66
  if (!isFrontend(frontend))
62
67
  return;
63
- const handlerCall = createHandlerCall(frontend, directory);
68
+ const handlerCall = createHandlerCall(frontend);
64
69
  if (!handlerCall)
65
70
  return;
66
- const handler = wrap(handlerCall);
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
- ${hmrBlock}
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 stylesTargetDirectory = join(frontendDirectory, 'styles');
10
- cpSync(join(templatesDirectory, 'styles'), stylesTargetDirectory, {
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
- console.warn('Angular is not yet supported. Refer to the documentation for more information.');
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>example/react/pages/ReactExample.tsx</code> and save
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, assetsDirectory, projectAssetsDirectory, absProviders }: ScaffoldFrontendProps) => void;
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 = ({ isSingleFrontend, authOption, targetDirectory, templatesDirectory, frontends, assetsDirectory, projectAssetsDirectory, absProviders }) => {
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 cssOutputDir = join(targetDirectory, 'styles');
24
- mkdirSync(cssOutputDir, { recursive: true });
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>example/svelte/pages/SvelteExample.svelte</code> and save
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, 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 = ({ isSingleFrontend, targetDirectory, frontends, templatesDirectory, projectAssetsDirectory }) => {
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 cssOutputDirectory = join(targetDirectory, 'styles');
15
- mkdirSync(cssOutputDirectory, { recursive: true });
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;