create-absolutejs 0.6.1 → 0.8.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 (78) hide show
  1. package/LICENSE +24 -24
  2. package/README.md +179 -179
  3. package/dist/commands/formatProject.js +3 -2
  4. package/dist/commands/initializeGit.js +1 -1
  5. package/dist/commands/installDependencies.js +4 -3
  6. package/dist/data.js +22 -21
  7. package/dist/generators/configurations/generateDrizzleConfig.js +15 -15
  8. package/dist/generators/configurations/generatePackageJson.js +41 -62
  9. package/dist/generators/configurations/generatePrettierrc.js +9 -9
  10. package/dist/generators/db/dockerInitTemplates.d.ts +4 -0
  11. package/dist/generators/db/dockerInitTemplates.js +83 -79
  12. package/dist/generators/db/generateDatabaseTypes.js +6 -6
  13. package/dist/generators/db/generateDockerContainer.js +53 -16
  14. package/dist/generators/db/generateDrizzleSchema.js +17 -17
  15. package/dist/generators/db/generateSqliteSchema.js +8 -8
  16. package/dist/generators/db/handlerTemplates.d.ts +1 -1
  17. package/dist/generators/db/handlerTemplates.js +260 -260
  18. package/dist/generators/db/scaffoldDatabase.d.ts +3 -1
  19. package/dist/generators/db/scaffoldDatabase.js +4 -2
  20. package/dist/generators/db/scaffoldDocker.d.ts +3 -1
  21. package/dist/generators/db/scaffoldDocker.js +21 -11
  22. package/dist/generators/html/generateHTMLPage.js +60 -60
  23. package/dist/generators/htmx/generateHTMXPage.js +86 -86
  24. package/dist/generators/project/generateAbsoluteAuthConfig.d.ts +1 -1
  25. package/dist/generators/project/generateAbsoluteAuthConfig.js +100 -89
  26. package/dist/generators/project/generateDBBlock.js +9 -9
  27. package/dist/generators/project/generateImportsBlock.js +4 -1
  28. package/dist/generators/project/generateMarkupCSS.js +145 -145
  29. package/dist/generators/project/generateRoutesBlock.d.ts +3 -2
  30. package/dist/generators/project/generateRoutesBlock.js +37 -36
  31. package/dist/generators/project/generateServer.js +22 -18
  32. package/dist/generators/project/scaffoldBackend.js +2 -1
  33. package/dist/generators/project/scaffoldFrontends.d.ts +2 -2
  34. package/dist/generators/project/scaffoldFrontends.js +5 -2
  35. package/dist/generators/react/generateReactComponents.js +95 -95
  36. package/dist/generators/svelte/generateSveltePage.js +210 -210
  37. package/dist/generators/vue/generateVuePage.js +261 -261
  38. package/dist/index.js +11 -2
  39. package/dist/messages.js +43 -43
  40. package/dist/questions/projectName.js +1 -1
  41. package/dist/scaffold.d.ts +3 -1
  42. package/dist/scaffold.js +10 -5
  43. package/dist/templates/README.md +35 -35
  44. package/dist/templates/assets/svg/google-logo.svg +7 -7
  45. package/dist/templates/assets/svg/htmx-logo-black.svg +9 -9
  46. package/dist/templates/assets/svg/htmx-logo-white.svg +9 -9
  47. package/dist/templates/assets/svg/vue-logo.svg +4 -4
  48. package/dist/templates/configurations/.prettierignore +3 -3
  49. package/dist/templates/configurations/.prettierrc.json +9 -9
  50. package/dist/templates/configurations/drizzle.config.ts +13 -13
  51. package/dist/templates/configurations/eslint.config.mjs +243 -243
  52. package/dist/templates/configurations/tsconfig.example.json +98 -98
  53. package/dist/templates/constants.ts +2 -2
  54. package/dist/templates/db/docker-compose.db.yml +15 -15
  55. package/dist/templates/git/gitignore +51 -51
  56. package/dist/templates/html/scripts/typescript-example.ts +21 -21
  57. package/dist/templates/react/components/App.tsx +52 -52
  58. package/dist/templates/react/components/Head.tsx +34 -34
  59. package/dist/templates/react/components/OAuthLink.tsx +39 -39
  60. package/dist/templates/react/components/ProfilePicture.tsx +56 -56
  61. package/dist/templates/styles/colors.ts +11 -11
  62. package/dist/templates/styles/reset.css +84 -84
  63. package/dist/templates/svelte/components/Counter.svelte +19 -19
  64. package/dist/templates/svelte/composables/counter.svelte.ts +14 -14
  65. package/dist/templates/tailwind/postcss.config.ts +8 -8
  66. package/dist/templates/tailwind/tailwind.config.ts +7 -7
  67. package/dist/templates/tailwind/tailwind.css +1 -1
  68. package/dist/templates/vue/components/CountButton.vue +39 -39
  69. package/dist/templates/vue/composables/useCount.ts +14 -14
  70. package/dist/utils/checkDockerInstalled.d.ts +9 -1
  71. package/dist/utils/checkDockerInstalled.js +137 -39
  72. package/dist/utils/checkSqliteInstalled.js +13 -13
  73. package/dist/utils/commandMaps.d.ts +1 -1
  74. package/dist/utils/commandMaps.js +4 -4
  75. package/dist/versions.d.ts +50 -0
  76. package/dist/versions.js +62 -0
  77. package/package.json +22 -21
  78. package/dist/templates/styles/tailwind.css +0 -1
@@ -4,5 +4,7 @@ type ScaffoldDatabaseProps = Pick<CreateConfiguration, 'projectName' | 'database
4
4
  backendDirectory: string;
5
5
  typesDirectory: string;
6
6
  };
7
- export declare const scaffoldDatabase: ({ projectName, databaseEngine, databaseHost, databaseDirectory, backendDirectory, authOption, orm, typesDirectory }: ScaffoldDatabaseProps) => Promise<void>;
7
+ export declare const scaffoldDatabase: ({ projectName, databaseEngine, databaseHost, databaseDirectory, backendDirectory, authOption, orm, typesDirectory }: ScaffoldDatabaseProps) => Promise<{
8
+ dockerFreshInstall: boolean;
9
+ }>;
8
10
  export {};
@@ -37,12 +37,13 @@ export const scaffoldDatabase = async ({ projectName, databaseEngine, databaseHo
37
37
  databaseEngine !== 'sqlite' &&
38
38
  databaseEngine !== undefined &&
39
39
  databaseEngine !== 'none') {
40
- await scaffoldDocker({
40
+ const { dockerFreshInstall } = await scaffoldDocker({
41
41
  authOption,
42
42
  databaseEngine,
43
43
  projectDatabaseDirectory,
44
44
  projectName
45
45
  });
46
+ return { dockerFreshInstall };
46
47
  }
47
48
  if (orm === 'drizzle') {
48
49
  if (!isDrizzleDialect(databaseEngine)) {
@@ -60,9 +61,10 @@ export const scaffoldDatabase = async ({ projectName, databaseEngine, databaseHo
60
61
  databaseHost
61
62
  });
62
63
  writeFileSync(join(typesDirectory, 'databaseTypes.ts'), drizzleTypes);
63
- return;
64
+ return { dockerFreshInstall: false };
64
65
  }
65
66
  if (orm === 'prisma') {
66
67
  console.warn(`${dim('│')}\n${yellow('▲')} Prisma support is not implemented yet`);
67
68
  }
69
+ return { dockerFreshInstall: false };
68
70
  };
@@ -5,5 +5,7 @@ type ScaffoldDockerProps = {
5
5
  authOption: AuthOption;
6
6
  projectName: string;
7
7
  };
8
- export declare const scaffoldDocker: ({ databaseEngine, projectDatabaseDirectory, projectName, authOption }: ScaffoldDockerProps) => Promise<void>;
8
+ export declare const scaffoldDocker: ({ databaseEngine, projectDatabaseDirectory, projectName, authOption }: ScaffoldDockerProps) => Promise<{
9
+ dockerFreshInstall: boolean;
10
+ }>;
9
11
  export {};
@@ -1,7 +1,7 @@
1
1
  import { writeFileSync } from 'fs';
2
2
  import { join } from 'path';
3
3
  import { $ } from 'bun';
4
- import { checkDockerInstalled } from '../../utils/checkDockerInstalled';
4
+ import { checkDockerInstalled, ensureDockerDaemonRunning, resolveDockerExe, shutdownDockerDaemon } from '../../utils/checkDockerInstalled';
5
5
  import { countHistoryTables, initTemplates, userTables } from './dockerInitTemplates';
6
6
  import { generateDockerContainer } from './generateDockerContainer';
7
7
  export const scaffoldDocker = async ({ databaseEngine, projectDatabaseDirectory, projectName, authOption }) => {
@@ -10,20 +10,30 @@ export const scaffoldDocker = async ({ databaseEngine, projectDatabaseDirectory,
10
10
  databaseEngine === 'sqlite') {
11
11
  throw new Error('Internal type error: databaseEngine must be defined and not "none" or "sqlite"');
12
12
  }
13
- await checkDockerInstalled();
13
+ const { freshInstall } = await checkDockerInstalled(databaseEngine);
14
+ const { daemonWasStarted } = await ensureDockerDaemonRunning();
14
15
  const dbContainer = generateDockerContainer(databaseEngine);
15
16
  writeFileSync(join(projectDatabaseDirectory, 'docker-compose.db.yml'), dbContainer, 'utf-8');
16
- if (databaseEngine === 'mongodb') {
17
- }
18
- else {
19
- const { wait, cli } = initTemplates[databaseEngine];
17
+ const docker = resolveDockerExe();
18
+ const hasSchemaInit = databaseEngine in userTables;
19
+ if (hasSchemaInit) {
20
+ const dbKey = databaseEngine;
21
+ const { wait, cli } = initTemplates[dbKey];
20
22
  const usesAuth = authOption !== undefined && authOption !== 'none';
21
23
  const dbCommand = usesAuth
22
- ? userTables[databaseEngine]
23
- : countHistoryTables[databaseEngine];
24
- await $ `bun db:up`.cwd(projectName);
25
- await $ `docker compose -p ${databaseEngine} -f db/docker-compose.db.yml exec -T db \
24
+ ? userTables[dbKey]
25
+ : countHistoryTables[dbKey];
26
+ await $ `${docker} compose -p ${databaseEngine} -f db/docker-compose.db.yml up -d db`.cwd(projectName);
27
+ await $ `${docker} compose -p ${databaseEngine} -f db/docker-compose.db.yml exec -T db \
26
28
  bash -lc '${wait} && ${cli} "${dbCommand}"'`.cwd(projectName);
27
- await $ `bun db:down`.cwd(projectName);
29
+ await $ `${docker} compose -p ${databaseEngine} -f db/docker-compose.db.yml down`.cwd(projectName);
30
+ }
31
+ else {
32
+ await $ `${docker} compose -p ${databaseEngine} -f db/docker-compose.db.yml up -d --wait db`.cwd(projectName);
33
+ await $ `${docker} compose -p ${databaseEngine} -f db/docker-compose.db.yml down`.cwd(projectName);
34
+ }
35
+ if (daemonWasStarted) {
36
+ await shutdownDockerDaemon();
28
37
  }
38
+ return { dockerFreshInstall: freshInstall };
29
39
  };
@@ -5,65 +5,65 @@ export const generateHTMLPage = (frontends, useHTMLScripts) => {
5
5
  const scriptTagBlock = useHTMLScripts
6
6
  ? ` <script src="../scripts/typescript-example.ts"></script>\n`
7
7
  : '';
8
- return `<!doctype html>
9
- <html>
10
- <head>
11
- <title>AbsoluteJS + HTML</title>
12
- <meta name="description" content="AbsoluteJS HTML Example" />
13
- <meta charset="utf-8" />
14
- <meta name="viewport" content="width=device-width, initial-scale=1" />
15
- <link
16
- rel="stylesheet"
17
- type="text/css"
18
- href="../styles/html-example.css"
19
- />
20
- <link rel="icon" href="/assets/ico/favicon.ico" />
21
- </head>
22
- <body>
23
- <header>
24
- <a href="/">AbsoluteJS</a>
25
- <details>
26
- <summary>Pages</summary>
27
- <nav>
28
- ${navLinks}
29
- </nav>
30
- </details>
31
- </header>
32
- <main>
33
- <nav>
34
- <a href="https://absolutejs.com" target="_blank">
35
- <img
36
- class="logo"
37
- src="/assets/png/absolutejs-temp.png"
38
- alt="AbsoluteJS Logo"
39
- />
40
- </a>
41
- <a href="https://html.spec.whatwg.org/multipage/">
42
- <img
43
- class="logo html"
44
- src="/assets/svg/HTML5_Badge.svg"
45
- alt="HTML Logo"
46
- />
47
- </a>
48
- </nav>
49
- <h1>AbsoluteJS + HTML</h1>
50
- <button id="counter-button">
51
- count is <span id="counter">${initialCount}</span>
52
- </button>
53
- <p>
54
- Edit <code>example/html/pages/HtmlExample.html</code> save and
55
- rebuild to update the page.
56
- </p>
57
- <p style="color: #777">( Hot Module Reloading is coming soon )</p>
58
- <p style="margin-top: 2rem">
59
- Explore the other pages to see how AbsoluteJS seamlessly unifies
60
- multiple frameworks on a single server.
61
- </p>
62
- <p style="margin-top: 2rem; font-size: 1rem; color: #777">
63
- Click on the AbsoluteJS and HTML logos to learn more.
64
- </p>
65
- </main>
66
- ${scriptTagBlock} </body>
67
- </html>
8
+ return `<!doctype html>
9
+ <html>
10
+ <head>
11
+ <title>AbsoluteJS + HTML</title>
12
+ <meta name="description" content="AbsoluteJS HTML Example" />
13
+ <meta charset="utf-8" />
14
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
15
+ <link
16
+ rel="stylesheet"
17
+ type="text/css"
18
+ href="../styles/html-example.css"
19
+ />
20
+ <link rel="icon" href="/assets/ico/favicon.ico" />
21
+ </head>
22
+ <body>
23
+ <header>
24
+ <a href="/">AbsoluteJS</a>
25
+ <details>
26
+ <summary>Pages</summary>
27
+ <nav>
28
+ ${navLinks}
29
+ </nav>
30
+ </details>
31
+ </header>
32
+ <main>
33
+ <nav>
34
+ <a href="https://absolutejs.com" target="_blank">
35
+ <img
36
+ class="logo"
37
+ src="/assets/png/absolutejs-temp.png"
38
+ alt="AbsoluteJS Logo"
39
+ />
40
+ </a>
41
+ <a href="https://html.spec.whatwg.org/multipage/">
42
+ <img
43
+ class="logo html"
44
+ src="/assets/svg/HTML5_Badge.svg"
45
+ alt="HTML Logo"
46
+ />
47
+ </a>
48
+ </nav>
49
+ <h1>AbsoluteJS + HTML</h1>
50
+ <button id="counter-button">
51
+ count is <span id="counter">${initialCount}</span>
52
+ </button>
53
+ <p>
54
+ Edit <code>example/html/pages/HtmlExample.html</code> save and
55
+ rebuild to update the page.
56
+ </p>
57
+ <p style="color: #777">( Hot Module Reloading is coming soon )</p>
58
+ <p style="margin-top: 2rem">
59
+ Explore the other pages to see how AbsoluteJS seamlessly unifies
60
+ multiple frameworks on a single server.
61
+ </p>
62
+ <p style="margin-top: 2rem; font-size: 1rem; color: #777">
63
+ Click on the AbsoluteJS and HTML logos to learn more.
64
+ </p>
65
+ </main>
66
+ ${scriptTagBlock} </body>
67
+ </html>
68
68
  `;
69
69
  };
@@ -1,91 +1,91 @@
1
1
  import { formatNavLink } from '../../utils/formatNavLink';
2
2
  export const generateHTMXPage = (isSingle, frontends) => {
3
3
  const navLinks = frontends.map(formatNavLink).join('\n\t\t\t');
4
- return `<!doctype html>
5
- <html>
6
- <head>
7
- <title>AbsoluteJS + HTMX</title>
8
- <meta name="description" content="AbsoluteJS HTMX Example" />
9
- <meta charset="utf-8" />
10
- <meta name="viewport" content="width=device-width, initial-scale=1" />
11
- <link
12
- rel="stylesheet"
13
- type="text/css"
14
- href="../styles/htmx-example.css"
15
- />
16
- <link rel="icon" href="/assets/ico/favicon.ico" />
17
- <script src="${isSingle ? '' : '/htmx'}/htmx.min.js"></script>
18
- </head>
19
- <body
20
- hx-post="/htmx/reset"
21
- hx-trigger="beforeunload from:window once"
22
- hx-swap="none"
23
- >
24
- <header>
25
- <a href="/">AbsoluteJS</a>
26
- <details
27
- hx-on:pointerenter="this.open = true"
28
- hx-on:pointerleave="this.open = false"
29
- >
30
- <summary>Pages</summary>
31
- <nav>
32
- ${navLinks}
33
- </nav>
34
- </details>
35
- </header>
36
- <main>
37
- <nav>
38
- <a href="https://absolutejs.com" target="_blank">
39
- <img
40
- class="logo"
41
- src="/assets/png/absolutejs-temp.png"
42
- alt="AbsoluteJS Logo"
43
- />
44
- </a>
45
- <a href="https://htmx.org" target="_blank">
46
- <picture>
47
- <source
48
- srcset="/assets/svg/htmx-logo-white.svg"
49
- media="(prefers-color-scheme: dark)"
50
- />
51
-
52
- <img
53
- src="/assets/svg/htmx-logo-black.svg"
54
- alt="HTMX logo"
55
- class="logo htmx"
56
- />
57
- </picture>
58
- </a>
59
- </nav>
60
- <h1>AbsoluteJS + HTMX</h1>
61
- <button
62
- hx-post="/htmx/increment"
63
- hx-target="#count"
64
- hx-swap="innerHTML"
65
- >
66
- count is
67
- <span
68
- id="count"
69
- hx-get="/htmx/count"
70
- hx-trigger="load"
71
- hx-swap="innerHTML"
72
- >0</span
73
- >
74
- </button>
75
- <p>
76
- Edit <code>example/htmx/pages/HtmxHome.html</code> save and
77
- rebuild to update the page.
78
- </p>
79
- <p style="color: #777">( Hot Module Reloading is coming soon )</p>
80
- <p style="margin-top: 2rem">
81
- Explore the other pages to see how AbsoluteJS seamlessly unifies
82
- multiple frameworks on a single server.
83
- </p>
84
- <p style="margin-top: 2rem; font-size: 1rem; color: #777">
85
- Click on the AbsoluteJS and HTML logos to learn more.
86
- </p>
87
- </main>
88
- </body>
89
- </html>
4
+ return `<!doctype html>
5
+ <html>
6
+ <head>
7
+ <title>AbsoluteJS + HTMX</title>
8
+ <meta name="description" content="AbsoluteJS HTMX Example" />
9
+ <meta charset="utf-8" />
10
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
11
+ <link
12
+ rel="stylesheet"
13
+ type="text/css"
14
+ href="../styles/htmx-example.css"
15
+ />
16
+ <link rel="icon" href="/assets/ico/favicon.ico" />
17
+ <script src="${isSingle ? '' : '/htmx'}/htmx.min.js"></script>
18
+ </head>
19
+ <body
20
+ hx-post="/htmx/reset"
21
+ hx-trigger="beforeunload from:window once"
22
+ hx-swap="none"
23
+ >
24
+ <header>
25
+ <a href="/">AbsoluteJS</a>
26
+ <details
27
+ hx-on:pointerenter="this.open = true"
28
+ hx-on:pointerleave="this.open = false"
29
+ >
30
+ <summary>Pages</summary>
31
+ <nav>
32
+ ${navLinks}
33
+ </nav>
34
+ </details>
35
+ </header>
36
+ <main>
37
+ <nav>
38
+ <a href="https://absolutejs.com" target="_blank">
39
+ <img
40
+ class="logo"
41
+ src="/assets/png/absolutejs-temp.png"
42
+ alt="AbsoluteJS Logo"
43
+ />
44
+ </a>
45
+ <a href="https://htmx.org" target="_blank">
46
+ <picture>
47
+ <source
48
+ srcset="/assets/svg/htmx-logo-white.svg"
49
+ media="(prefers-color-scheme: dark)"
50
+ />
51
+
52
+ <img
53
+ src="/assets/svg/htmx-logo-black.svg"
54
+ alt="HTMX logo"
55
+ class="logo htmx"
56
+ />
57
+ </picture>
58
+ </a>
59
+ </nav>
60
+ <h1>AbsoluteJS + HTMX</h1>
61
+ <button
62
+ hx-post="/htmx/increment"
63
+ hx-target="#count"
64
+ hx-swap="innerHTML"
65
+ >
66
+ count is
67
+ <span
68
+ id="count"
69
+ hx-get="/htmx/count"
70
+ hx-trigger="load"
71
+ hx-swap="innerHTML"
72
+ >0</span
73
+ >
74
+ </button>
75
+ <p>
76
+ Edit <code>example/htmx/pages/HtmxHome.html</code> save and
77
+ rebuild to update the page.
78
+ </p>
79
+ <p style="color: #777">( Hot Module Reloading is coming soon )</p>
80
+ <p style="margin-top: 2rem">
81
+ Explore the other pages to see how AbsoluteJS seamlessly unifies
82
+ multiple frameworks on a single server.
83
+ </p>
84
+ <p style="margin-top: 2rem; font-size: 1rem; color: #777">
85
+ Click on the AbsoluteJS and HTML logos to learn more.
86
+ </p>
87
+ </main>
88
+ </body>
89
+ </html>
90
90
  `;
91
91
  };
@@ -1,2 +1,2 @@
1
1
  import { ProviderOption } from '@absolutejs/auth';
2
- export declare const generateAbsoluteAuthConfig: (absProviders: ProviderOption[] | undefined) => string;
2
+ export declare const generateAbsoluteAuthConfig: (absProviders: ProviderOption[] | undefined, hasDatabase: boolean) => string;
@@ -12,7 +12,7 @@ const defaultProviderConfigurations = {
12
12
  searchParams: [['access_type', 'offline']]
13
13
  }
14
14
  };
15
- export const generateAbsoluteAuthConfig = (absProviders) => {
15
+ export const generateAbsoluteAuthConfig = (absProviders, hasDatabase) => {
16
16
  const providerConfigs = (absProviders ?? [])
17
17
  .map((provider) => {
18
18
  const config = defaultProviderConfigurations[provider];
@@ -27,102 +27,113 @@ export const generateAbsoluteAuthConfig = (absProviders) => {
27
27
  ` redirectUri: getEnv('OAUTH2_CALLBACK_URI')`
28
28
  ].join(',\n');
29
29
  const scopePart = config.scope
30
- ? `,
30
+ ? `,
31
31
  scope: ${JSON.stringify(config.scope)}`
32
32
  : '';
33
33
  const searchParamsPart = config.searchParams && config.searchParams.length > 0
34
- ? `,
34
+ ? `,
35
35
  searchParams: ${JSON.stringify(config.searchParams)}`
36
36
  : '';
37
- return ` ${provider}: {
38
- credentials: {
39
- ${credentialsLines}
40
- }${scopePart}${searchParamsPart}
37
+ return ` ${provider}: {
38
+ credentials: {
39
+ ${credentialsLines}
40
+ }${scopePart}${searchParamsPart}
41
41
  }`;
42
42
  })
43
43
  .filter((entry) => entry !== null)
44
44
  .join(',\n');
45
- return `import { getEnv } from '@absolutejs/absolute';
46
- import {
47
- AbsoluteAuthProps,
48
- extractPropFromIdentity,
49
- instantiateUserSession,
50
- providers
51
- } from '@absolutejs/auth';
52
- import { DatabaseType, User } from '../../types/databaseTypes';
53
- import { createUser, getUser } from '../handlers/userHandlers';
54
-
55
- export const absoluteAuthConfig = (
56
- db: DatabaseType
57
- ): AbsoluteAuthProps<User> => ({
58
- providersConfiguration: {
59
- ${providerConfigs}
60
- },
61
- onCallbackSuccess: async ({
62
- authProvider,
63
- providerInstance,
64
- tokenResponse,
65
- unregisteredSession,
66
- cookie: { user_session_id },
67
- status,
68
- session
69
- }) =>
70
- instantiateUserSession({
71
- authProvider,
72
- providerInstance,
73
- session,
74
- tokenResponse,
75
- unregisteredSession,
76
- user_session_id,
77
- getUser: async (userIdentity) => {
78
- const provider = authProvider.toUpperCase();
79
- const providerConfiguration = providers[authProvider];
80
-
81
- const subject = extractPropFromIdentity(
82
- userIdentity,
83
- providerConfiguration.subject,
84
- providerConfiguration.subjectType
85
- );
86
- const authSub = \`\${provider}|\${subject}\`;
87
-
88
- try {
89
- const user = await getUser(db, authSub);
90
-
91
- return user;
92
- } catch (error) {
93
- console.error('Error fetching user:', error);
94
- return status(
95
- 'Internal Server Error',
96
- 'Could not fetch user data.'
97
- );
98
- }
99
- },
100
- onNewUser: async (userIdentity) => {
101
- const provider = authProvider.toUpperCase();
102
- const providerConfiguration = providers[authProvider];
103
-
104
- const subject = extractPropFromIdentity(
105
- userIdentity,
106
- providerConfiguration.subject,
107
- providerConfiguration.subjectType
108
- );
109
- const authSub = \`\${provider}|\${subject}\`;
110
-
111
- try {
112
- const newUser = await createUser(db, {
113
- auth_sub: authSub,
114
- metadata: userIdentity
115
- });
116
- return newUser;
117
- } catch (error) {
118
- console.error('Error creating user:', error);
119
- return status(
120
- 'Internal Server Error',
121
- 'Could not create new user.'
122
- );
123
- }
124
- }
125
- })
126
- });
45
+ if (!hasDatabase) {
46
+ return `import { getEnv } from '@absolutejs/absolute';
47
+ import { AbsoluteAuthProps } from '@absolutejs/auth';
48
+
49
+ export const absoluteAuthConfig = (): AbsoluteAuthProps => ({
50
+ providersConfiguration: {
51
+ ${providerConfigs}
52
+ }
53
+ });
54
+ `;
55
+ }
56
+ return `import { getEnv } from '@absolutejs/absolute';
57
+ import {
58
+ AbsoluteAuthProps,
59
+ extractPropFromIdentity,
60
+ instantiateUserSession,
61
+ providers
62
+ } from '@absolutejs/auth';
63
+ import { DatabaseType, User } from '../../types/databaseTypes';
64
+ import { createUser, getUser } from '../handlers/userHandlers';
65
+
66
+ export const absoluteAuthConfig = (
67
+ db: DatabaseType
68
+ ): AbsoluteAuthProps<User> => ({
69
+ providersConfiguration: {
70
+ ${providerConfigs}
71
+ },
72
+ onCallbackSuccess: async ({
73
+ authProvider,
74
+ providerInstance,
75
+ tokenResponse,
76
+ unregisteredSession,
77
+ cookie: { user_session_id },
78
+ status,
79
+ session
80
+ }) =>
81
+ instantiateUserSession({
82
+ authProvider,
83
+ providerInstance,
84
+ session,
85
+ tokenResponse,
86
+ unregisteredSession,
87
+ user_session_id,
88
+ getUser: async (userIdentity) => {
89
+ const provider = authProvider.toUpperCase();
90
+ const providerConfiguration = providers[authProvider];
91
+
92
+ const subject = extractPropFromIdentity(
93
+ userIdentity,
94
+ providerConfiguration.subject,
95
+ providerConfiguration.subjectType
96
+ );
97
+ const authSub = \`\${provider}|\${subject}\`;
98
+
99
+ try {
100
+ const user = await getUser(db, authSub);
101
+
102
+ return user;
103
+ } catch (error) {
104
+ console.error('Error fetching user:', error);
105
+ return status(
106
+ 'Internal Server Error',
107
+ 'Could not fetch user data.'
108
+ );
109
+ }
110
+ },
111
+ onNewUser: async (userIdentity) => {
112
+ const provider = authProvider.toUpperCase();
113
+ const providerConfiguration = providers[authProvider];
114
+
115
+ const subject = extractPropFromIdentity(
116
+ userIdentity,
117
+ providerConfiguration.subject,
118
+ providerConfiguration.subjectType
119
+ );
120
+ const authSub = \`\${provider}|\${subject}\`;
121
+
122
+ try {
123
+ const newUser = await createUser(db, {
124
+ auth_sub: authSub,
125
+ metadata: userIdentity
126
+ });
127
+ return newUser;
128
+ } catch (error) {
129
+ console.error('Error creating user:', error);
130
+ return status(
131
+ 'Internal Server Error',
132
+ 'Could not create new user.'
133
+ );
134
+ }
135
+ }
136
+ })
137
+ });
127
138
  `;
128
139
  };
@@ -61,19 +61,19 @@ export const generateDBBlock = ({ databaseEngine, orm, databaseHost }) => {
61
61
  return '';
62
62
  if ((databaseEngine === 'mysql' || databaseEngine === 'mariadb') &&
63
63
  databaseHost !== 'planetscale') {
64
- return `
65
- const pool = createPool(getEnv("DATABASE_URL"))
66
- const db = drizzle(pool, { schema, mode: 'default' })
64
+ return `
65
+ const pool = createPool(getEnv("DATABASE_URL"))
66
+ const db = drizzle(pool, { schema, mode: 'default' })
67
67
  `;
68
68
  }
69
69
  if (databaseEngine === 'postgresql' && databaseHost === 'neon') {
70
- return `
71
- const sql = neon(getEnv('DATABASE_URL'));
72
- const db = drizzle(sql, { schema });
70
+ return `
71
+ const sql = neon(getEnv('DATABASE_URL'));
72
+ const db = drizzle(sql, { schema });
73
73
  `;
74
74
  }
75
- return `
76
- const pool = ${expr}
77
- const db = drizzle(pool, { schema })
75
+ return `
76
+ const pool = ${expr}
77
+ const db = drizzle(pool, { schema })
78
78
  `;
79
79
  };