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.
Files changed (73) 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 +7 -0
  6. package/dist/generators/angular/generateAngularPage.js +175 -0
  7. package/dist/generators/angular/scaffoldAngular.d.ts +2 -0
  8. package/dist/generators/angular/scaffoldAngular.js +34 -0
  9. package/dist/generators/configurations/generatePackageJson.js +26 -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 +2 -2
  21. package/dist/generators/html/scaffoldHTML.d.ts +1 -1
  22. package/dist/generators/html/scaffoldHTML.js +2 -2
  23. package/dist/generators/htmx/generateHTMXPage.d.ts +1 -1
  24. package/dist/generators/htmx/generateHTMXPage.js +2 -2
  25. package/dist/generators/htmx/scaffoldHTMX.d.ts +1 -1
  26. package/dist/generators/htmx/scaffoldHTMX.js +2 -2
  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 +11 -7
  31. package/dist/generators/project/generateDBBlock.js +6 -0
  32. package/dist/generators/project/generateImportsBlock.js +39 -27
  33. package/dist/generators/project/generateMarkupCSS.js +4 -0
  34. package/dist/generators/project/generateRoutesBlock.d.ts +1 -2
  35. package/dist/generators/project/generateRoutesBlock.js +28 -17
  36. package/dist/generators/project/generateServer.js +5 -10
  37. package/dist/generators/project/scaffoldFrontends.js +20 -1
  38. package/dist/generators/react/generateReactComponents.d.ts +2 -2
  39. package/dist/generators/react/generateReactComponents.js +33 -33
  40. package/dist/generators/react/scaffoldReact.d.ts +1 -1
  41. package/dist/generators/react/scaffoldReact.js +2 -2
  42. package/dist/generators/svelte/generateSveltePage.d.ts +1 -1
  43. package/dist/generators/svelte/generateSveltePage.js +20 -2
  44. package/dist/generators/svelte/scaffoldSvelte.d.ts +1 -1
  45. package/dist/generators/svelte/scaffoldSvelte.js +2 -2
  46. package/dist/generators/vue/generateVuePage.d.ts +1 -1
  47. package/dist/generators/vue/generateVuePage.js +20 -2
  48. package/dist/generators/vue/scaffoldVue.d.ts +1 -1
  49. package/dist/generators/vue/scaffoldVue.js +2 -2
  50. package/dist/questions/databaseEngine.d.ts +1 -1
  51. package/dist/questions/frontendDirectoryConfigurations.d.ts +1 -1
  52. package/dist/questions/frontends.d.ts +1 -1
  53. package/dist/questions/frontends.js +3 -3
  54. package/dist/scaffold.js +14 -2
  55. package/dist/templates/assets/svg/angular.svg +18 -0
  56. package/dist/templates/configurations/tsconfig.example.json +12 -12
  57. package/dist/templates/react/components/App.tsx +2 -2
  58. package/dist/templates/react/components/Head.tsx +7 -7
  59. package/dist/templates/react/components/OAuthLink.tsx +2 -2
  60. package/dist/templates/styles/colors.ts +6 -8
  61. package/dist/templates/styles/reset.css +15 -0
  62. package/dist/templates/svelte/components/Counter.svelte +4 -0
  63. package/dist/templates/vue/components/CountButton.vue +1 -1
  64. package/dist/typeGuards.d.ts +6 -6
  65. package/dist/typeGuards.js +6 -6
  66. package/dist/types.d.ts +1 -0
  67. package/dist/utils/checkDockerInstalled.d.ts +4 -4
  68. package/dist/utils/checkDockerInstalled.js +78 -71
  69. package/dist/utils/parseCommandLineOptions.js +13 -16
  70. package/dist/versions.d.ts +37 -29
  71. package/dist/versions.js +48 -39
  72. package/package.json +10 -9
  73. /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
- console.warn('Angular is not yet supported. Refer to the documentation for more information.');
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>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: ({ 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, assetsDirectory, projectAssetsDirectory, absProviders }) => {
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>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, 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>example/vue/pages/VueExample.vue</code> and save
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" | "mysql" | "postgresql" | "sqlite" | "singlestore" | "mariadb" | "mongodb" | "cockroachdb" | "mssql" | undefined>;
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: Object.entries(frontendLabels).map(([value, label]) => ({
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.dockerFreshInstall;
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
- /* Ensure that casing is correct in imports. */ "jsx": "react-jsx", // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
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" content={description} />
20
- <meta name="viewport" content="width=device-width, initial-scale=1" />
21
- <link rel="icon" href={icon} />
22
- <link rel="preconnect" href="https://fonts.googleapis.com" />
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" href={cssPath} type="text/css" />}
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
  }
@@ -11,6 +11,10 @@
11
11
  <button onclick={increment}>count is {getCount()}</button>
12
12
 
13
13
  <style>
14
+ button:hover {
15
+ border-color: #ff3e00;
16
+ }
17
+
14
18
  @media (prefers-color-scheme: light) {
15
19
  button {
16
20
  background-color: #ffffff;
@@ -24,7 +24,7 @@ button {
24
24
  transition: border-color 0.25s;
25
25
  }
26
26
  button:hover {
27
- border-color: #5fbeeb;
27
+ border-color: #42b883;
28
28
  }
29
29
  button:focus,
30
30
  button:focus-visible {