create-absolutejs 0.3.9 → 0.3.10

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 (53) hide show
  1. package/README.md +15 -15
  2. package/dist/data.d.ts +4 -2
  3. package/dist/data.js +23 -8
  4. package/dist/generators/configurations/generateDrizzleConfig.d.ts +2 -1
  5. package/dist/generators/configurations/generateDrizzleConfig.js +16 -6
  6. package/dist/generators/configurations/generatePackageJson.d.ts +2 -2
  7. package/dist/generators/configurations/generatePackageJson.js +39 -12
  8. package/dist/generators/db/generateDBHandlers.d.ts +6 -0
  9. package/dist/generators/db/generateDBHandlers.js +11 -0
  10. package/dist/generators/db/generateDrizzleSchema.d.ts +8 -0
  11. package/dist/generators/db/generateDrizzleSchema.js +122 -0
  12. package/dist/generators/db/handlerTemplates.d.ts +52 -0
  13. package/dist/generators/db/handlerTemplates.js +168 -0
  14. package/dist/generators/db/scaffoldDatabase.d.ts +5 -6
  15. package/dist/generators/db/scaffoldDatabase.js +37 -6
  16. package/dist/generators/html/generateHTMLPage.d.ts +2 -2
  17. package/dist/generators/html/generateHTMLPage.js +7 -4
  18. package/dist/generators/html/scaffoldHTML.js +1 -1
  19. package/dist/generators/project/collectDependencies.d.ts +9 -0
  20. package/dist/generators/project/collectDependencies.js +16 -0
  21. package/dist/generators/project/computeFlags.d.ts +9 -0
  22. package/dist/generators/project/computeFlags.js +7 -0
  23. package/dist/generators/project/generateBuildBlock.d.ts +9 -0
  24. package/dist/generators/project/generateBuildBlock.js +13 -0
  25. package/dist/generators/project/generateDBBlock.d.ts +4 -0
  26. package/dist/generators/project/generateDBBlock.js +69 -0
  27. package/dist/generators/project/generateImportsBlock.d.ts +13 -0
  28. package/dist/generators/project/generateImportsBlock.js +124 -0
  29. package/dist/generators/project/generateRoutesBlock.d.ts +10 -0
  30. package/dist/generators/project/generateRoutesBlock.js +74 -0
  31. package/dist/generators/project/generateServer.d.ts +3 -4
  32. package/dist/generators/project/generateServer.js +46 -170
  33. package/dist/generators/project/generateUseBlock.d.ts +6 -0
  34. package/dist/generators/project/generateUseBlock.js +28 -0
  35. package/dist/messages.js +13 -13
  36. package/dist/prompt.js +6 -7
  37. package/dist/questions/databaseEngine.d.ts +1 -1
  38. package/dist/questions/databaseEngine.js +2 -1
  39. package/dist/questions/databaseHost.d.ts +1 -1
  40. package/dist/questions/databaseHost.js +10 -30
  41. package/dist/questions/orm.d.ts +2 -1
  42. package/dist/questions/orm.js +13 -7
  43. package/dist/scaffold.d.ts +1 -1
  44. package/dist/scaffold.js +16 -8
  45. package/dist/templates/db/docker-compose.db.yml +15 -0
  46. package/dist/typeGuards.d.ts +3 -1
  47. package/dist/typeGuards.js +5 -19
  48. package/dist/types.d.ts +3 -1
  49. package/dist/utils/checkDockerInstalled.d.ts +2 -0
  50. package/dist/utils/checkDockerInstalled.js +179 -0
  51. package/dist/utils/parseCommandLineOptions.js +47 -15
  52. package/package.json +2 -2
  53. package/dist/templates/html/pages/HTMLExample.html +0 -66
package/README.md CHANGED
@@ -51,10 +51,10 @@ Usage: create-absolute [project-name] [options]
51
51
  - `--angular`
52
52
  Include an Angular frontend.
53
53
 
54
- - `--angular-dir <dir>`
54
+ - `--angular-dir <directory>`
55
55
  Specify the directory for and use the Angular frontend.
56
56
 
57
- - `--assets <dir>`
57
+ - `--assets <directory>`
58
58
  Directory name for your static assets.
59
59
 
60
60
  - `--auth <plugin|none>`
@@ -63,31 +63,31 @@ Usage: create-absolute [project-name] [options]
63
63
  - `--biome`
64
64
  Use Biome for code quality and formatting.
65
65
 
66
- - `--build <dir>`
66
+ - `--build <direrctory>`
67
67
  Output directory for build artifacts.
68
68
 
69
- - `--database <dir>`
69
+ - `--db <engine|none>`
70
+ Database engine (`postgresql` | `mysql` | `sqlite` | `mongodb` | `redis` | `singlestore` | `cockroachdb` | `mssql`) or `none`.
71
+
72
+ - `--db-dir <directory>`
70
73
  Directory name for your database files.
71
74
 
75
+ - `--db-host <provider|none>`
76
+ Database host provider (`neon` | `planetscale` | `supabase` | `turso` | `vercel` | `upstash` | `atlas`) or `none`.
77
+
72
78
  - `--directory <default|custom>`
73
79
  Directory-naming strategy: `default` or `custom`.
74
80
 
75
- - `--engine <engine|none>`
76
- Database engine (`postgresql` | `mysql` | `sqlite` | `mongodb` | `redis` | `singlestore` | `cockroachdb` | `mssql`) or `none`.
77
-
78
81
  - `--eslint+prettier`
79
82
  Use ESLint + Prettier for code quality and formatting.
80
83
 
81
84
  - `--git`
82
85
  Initialize a Git repository.
83
86
 
84
- - `--host <provider|none>`
85
- Database host provider (`neon` | `planetscale` | `supabase` | `turso` | `vercel` | `upstash` | `atlas`) or `none`.
86
-
87
87
  - `--html`
88
88
  Include a plain HTML frontend.
89
89
 
90
- - `--html-dir <dir>`
90
+ - `--html-dir <directory>`
91
91
  Specify the directory for and use the HTML frontend.
92
92
 
93
93
  - `--html-scripts`
@@ -96,7 +96,7 @@ Usage: create-absolute [project-name] [options]
96
96
  - `--htmx`
97
97
  Include an HTMX frontend.
98
98
 
99
- - `--htmx-dir <dir>`
99
+ - `--htmx-dir <directory>`
100
100
  Specify the directory for and use the HTMX frontend.
101
101
 
102
102
  - `--install`
@@ -114,7 +114,7 @@ Usage: create-absolute [project-name] [options]
114
114
  - `--react`
115
115
  Include a React frontend.
116
116
 
117
- - `--react-dir <dir>`
117
+ - `--react-dir <directory>`
118
118
  Specify the directory for and use the React frontend.
119
119
 
120
120
  - `--skip`
@@ -123,7 +123,7 @@ Usage: create-absolute [project-name] [options]
123
123
  - `--svelte`
124
124
  Include a Svelte frontend.
125
125
 
126
- - `--svelte-dir <dir>`
126
+ - `--svelte-dir <directory>`
127
127
  Specify the directory for and use the Svelte frontend.
128
128
 
129
129
  - `--tailwind`
@@ -138,7 +138,7 @@ Usage: create-absolute [project-name] [options]
138
138
  - `--vue`
139
139
  Include a Vue frontend.
140
140
 
141
- - `--vue-dir <dir>`
141
+ - `--vue-dir <directory>`
142
142
  Specify the directory for and use the Vue frontend.
143
143
 
144
144
  ## Directory Configuration
package/dist/data.d.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  import type { FrontendLabels, AvailableDependency } from './types';
2
2
  export declare const availableFrontends: readonly ["react", "html", "svelte", "vue", "htmx"];
3
3
  export declare const availableAuthProviders: readonly ["absoluteAuth", "none"];
4
- export declare const availableDatabaseEngines: readonly ["postgresql", "mysql", "sqlite", "mongodb", "redis", "singlestore", "cockroachdb", "mssql", "none"];
4
+ export declare const availableDrizzleDialects: readonly ["gel", "mysql", "postgresql", "sqlite", "singlestore"];
5
+ export declare const availablePrismaDialects: readonly ["mysql", "postgresql", "sqlite", "mongodb", "mariadb", "cockroachdb", "mssql"];
6
+ export declare const availableDatabaseEngines: readonly ["postgresql", "mysql", "sqlite", "mongodb", "mariadb", "gel", "singlestore", "cockroachdb", "mssql", "none"];
5
7
  export declare const availableDirectoryConfigurations: readonly ["default", "custom"];
6
8
  export declare const availableORMs: readonly ["drizzle", "prisma", "none"];
7
- export declare const availableDatabaseHosts: readonly ["neon", "planetscale", "supabase", "turso", "vercel", "upstash", "atlas", "none"];
9
+ export declare const availableDatabaseHosts: readonly ["neon", "planetscale", "turso", "none"];
8
10
  export declare const availableCodeQualityTools: readonly ["eslint+prettier", "biome"];
9
11
  export declare const frontendLabels: FrontendLabels;
10
12
  export declare const availablePlugins: AvailableDependency[];
package/dist/data.js CHANGED
@@ -8,12 +8,29 @@ export const availableFrontends = [
8
8
  'htmx'
9
9
  ];
10
10
  export const availableAuthProviders = ['absoluteAuth', 'none'];
11
+ export const availableDrizzleDialects = [
12
+ 'gel',
13
+ 'mysql',
14
+ 'postgresql',
15
+ 'sqlite',
16
+ 'singlestore'
17
+ ];
18
+ export const availablePrismaDialects = [
19
+ 'mysql',
20
+ 'postgresql',
21
+ 'sqlite',
22
+ 'mongodb',
23
+ 'mariadb',
24
+ 'cockroachdb',
25
+ 'mssql'
26
+ ];
11
27
  export const availableDatabaseEngines = [
12
28
  'postgresql',
13
29
  'mysql',
14
30
  'sqlite',
15
31
  'mongodb',
16
- 'redis',
32
+ 'mariadb',
33
+ 'gel',
17
34
  'singlestore',
18
35
  'cockroachdb',
19
36
  'mssql',
@@ -24,11 +41,7 @@ export const availableORMs = ['drizzle', 'prisma', 'none'];
24
41
  export const availableDatabaseHosts = [
25
42
  'neon',
26
43
  'planetscale',
27
- 'supabase',
28
44
  'turso',
29
- 'vercel',
30
- 'upstash',
31
- 'atlas',
32
45
  'none'
33
46
  ];
34
47
  export const availableCodeQualityTools = ['eslint+prettier', 'biome'];
@@ -65,12 +78,14 @@ export const availablePlugins = [
65
78
  export const absoluteAuthPlugin = {
66
79
  imports: [
67
80
  {
68
- config: { providersConfiguration: {} },
81
+ config: {
82
+ providersConfiguration: {}
83
+ },
69
84
  isPlugin: true,
70
85
  packageName: 'absoluteAuth'
71
86
  }
72
87
  ],
73
- latestVersion: '0.3.2',
88
+ latestVersion: '0.14.4',
74
89
  value: '@absolutejs/auth'
75
90
  };
76
91
  export const scopedStatePlugin = {
@@ -108,7 +123,7 @@ export const defaultPlugins = [
108
123
  { isPlugin: false, packageName: 'build' },
109
124
  { isPlugin: true, packageName: 'networking' }
110
125
  ],
111
- latestVersion: '0.12.2',
126
+ latestVersion: '0.12.3',
112
127
  value: '@absolutejs/absolute'
113
128
  },
114
129
  {
@@ -2,6 +2,7 @@ import type { DatabaseEngine } from '../../types';
2
2
  type CreateDrizzleConfigProps = {
3
3
  projectName: string;
4
4
  databaseEngine: DatabaseEngine;
5
+ databaseDirectory: string;
5
6
  };
6
- export declare const createDrizzleConfig: ({ projectName, databaseEngine }: CreateDrizzleConfigProps) => void;
7
+ export declare const createDrizzleConfig: ({ projectName, databaseDirectory, databaseEngine }: CreateDrizzleConfigProps) => void;
7
8
  export {};
@@ -1,11 +1,21 @@
1
1
  import { writeFileSync } from 'fs';
2
2
  import { join } from 'path';
3
- export const createDrizzleConfig = ({ projectName, databaseEngine }) => {
3
+ export const createDrizzleConfig = ({ projectName, databaseDirectory, databaseEngine }) => {
4
4
  const drizzleConfig = `import { defineConfig } from "drizzle-kit";
5
-
6
- export default defineConfig({
7
- dialect: '${databaseEngine}'
8
- });
9
- `;
5
+ import { env } from 'process';
6
+
7
+ if (!env.DATABASE_URL) {
8
+ throw new Error('DATABASE_URL must be set in the environment variables');
9
+ }
10
+
11
+ export default defineConfig({
12
+ dbCredentials: {
13
+ url: env.DATABASE_URL
14
+ },
15
+ dialect: '${databaseEngine}',
16
+ out: '${databaseDirectory}/migrations',
17
+ schema: '${databaseDirectory}/schema.ts'
18
+ });
19
+ `;
10
20
  writeFileSync(join(projectName, 'drizzle.config.ts'), drizzleConfig);
11
21
  };
@@ -1,7 +1,7 @@
1
1
  import type { CreateConfiguration } from '../../types';
2
- type CreatePackageJsonProps = Pick<CreateConfiguration, 'authProvider' | 'useTailwind' | 'plugins' | 'frontendDirectories' | 'codeQualityTool'> & {
2
+ type CreatePackageJsonProps = Pick<CreateConfiguration, 'authProvider' | 'useTailwind' | 'databaseEngine' | 'databaseHost' | 'plugins' | 'orm' | 'frontendDirectories' | 'codeQualityTool'> & {
3
3
  projectName: string;
4
4
  latest: boolean;
5
5
  };
6
- export declare const createPackageJson: ({ projectName, authProvider, plugins, useTailwind, latest, frontendDirectories, codeQualityTool }: CreatePackageJsonProps) => void;
6
+ export declare const createPackageJson: ({ projectName, authProvider, plugins, databaseEngine, orm, databaseHost, useTailwind, latest, frontendDirectories, codeQualityTool }: CreatePackageJsonProps) => void;
7
7
  export {};
@@ -4,17 +4,18 @@ import { spinner } from '@clack/prompts';
4
4
  import { green } from 'picocolors';
5
5
  import { absoluteAuthPlugin, availablePlugins, defaultPlugins, eslintAndPrettierDependencies } from '../../data';
6
6
  import { getPackageVersion } from '../../utils/getPackageVersion';
7
- export const createPackageJson = ({ projectName, authProvider, plugins, useTailwind, latest, frontendDirectories, codeQualityTool }) => {
7
+ export const createPackageJson = ({ projectName, authProvider, plugins, databaseEngine, orm, databaseHost, useTailwind, latest, frontendDirectories, codeQualityTool }) => {
8
8
  const s = spinner();
9
- void (latest && s.start('Resolving package versions…'));
9
+ if (latest)
10
+ s.start('Resolving package versions…');
10
11
  const resolveVersion = (name, listed) => latest ? (getPackageVersion(name) ?? listed) : listed;
11
12
  const dependencies = {};
12
13
  const devDependencies = {};
13
- const requiresReact = frontendDirectories['react'] !== undefined;
14
- const requiresSvelte = frontendDirectories['svelte'] !== undefined;
15
- const requiresVue = frontendDirectories['vue'] !== undefined;
16
- const requiresHtmx = frontendDirectories['htmx'] !== undefined;
17
- const requiresHtml = frontendDirectories['html'] !== undefined;
14
+ const requiresReact = Boolean(frontendDirectories['react']);
15
+ const requiresSvelte = Boolean(frontendDirectories['svelte']);
16
+ const requiresVue = Boolean(frontendDirectories['vue']);
17
+ const requiresHtmx = Boolean(frontendDirectories['htmx']);
18
+ const requiresHtml = Boolean(frontendDirectories['html']);
18
19
  for (const p of defaultPlugins) {
19
20
  dependencies[p.value] = resolveVersion(p.value, p.latestVersion);
20
21
  }
@@ -46,8 +47,9 @@ export const createPackageJson = ({ projectName, authProvider, plugins, useTailw
46
47
  }
47
48
  if (requiresSvelte) {
48
49
  dependencies['svelte'] = resolveVersion('svelte', '5.34.7');
49
- void (codeQualityTool === 'eslint+prettier' &&
50
- (devDependencies['prettier-plugin-svelte'] = resolveVersion('prettier-plugin-svelte', '3.4.0')));
50
+ }
51
+ if (requiresSvelte && codeQualityTool === 'eslint+prettier') {
52
+ devDependencies['prettier-plugin-svelte'] = resolveVersion('prettier-plugin-svelte', '3.4.0');
51
53
  }
52
54
  if (requiresVue) {
53
55
  dependencies['vue'] = resolveVersion('vue', '3.5.17');
@@ -55,14 +57,39 @@ export const createPackageJson = ({ projectName, authProvider, plugins, useTailw
55
57
  if (requiresHtmx) {
56
58
  dependencies['elysia-scoped-state'] = resolveVersion('elysia-scoped-state', '0.1.1');
57
59
  }
58
- void (latest && s.stop(green('Package versions resolved')));
60
+ if (orm === 'drizzle') {
61
+ dependencies['drizzle-orm'] = resolveVersion('drizzle-orm', '0.41.0');
62
+ }
63
+ switch (databaseHost) {
64
+ case 'neon':
65
+ dependencies['@neondatabase/serverless'] = resolveVersion('@neondatabase/serverless', '1.0.0');
66
+ break;
67
+ case 'planetscale':
68
+ dependencies['@planetscale/database'] = resolveVersion('@planetscale/database', '1.0.0');
69
+ break;
70
+ case 'turso':
71
+ dependencies['@libsql/client'] = resolveVersion('@libsql/client', '0.15.9');
72
+ break;
73
+ }
74
+ if (latest)
75
+ s.stop(green('Package versions resolved'));
59
76
  const scripts = {
60
- dev: 'bun run --watch src/backend/server.ts',
77
+ dev: 'bash -c \'trap "exit 0" INT; bun run --watch src/backend/server.ts\'',
61
78
  format: `prettier --write "./**/*.{js,ts,css,json,mjs,md${requiresReact ? ',jsx,tsx' : ''}${requiresSvelte ? ',svelte' : ''}${requiresVue ? ',vue' : ''}${requiresHtml || requiresHtmx ? ',html' : ''}}"`,
62
79
  lint: 'eslint ./src',
63
80
  test: 'echo "Error: no test specified" && exit 1',
64
81
  typecheck: 'bun run tsc --noEmit'
65
82
  };
83
+ if (databaseEngine === 'postgresql' &&
84
+ (!databaseHost || databaseHost === 'none')) {
85
+ scripts['db:up'] =
86
+ 'sh -c "docker info >/dev/null 2>&1 || sudo service docker start; docker compose -f db/docker-compose.db.yml up -d db"';
87
+ scripts['db:down'] = 'docker compose -f db/docker-compose.db.yml down';
88
+ scripts['db:psql'] =
89
+ 'docker compose -f db/docker-compose.db.yml exec db psql -U postgres -d appdb';
90
+ scripts['predev'] = 'bun db:up';
91
+ scripts['postdev'] = 'bun db:down';
92
+ }
66
93
  const packageJson = {
67
94
  dependencies,
68
95
  devDependencies,
@@ -71,5 +98,5 @@ export const createPackageJson = ({ projectName, authProvider, plugins, useTailw
71
98
  type: 'module',
72
99
  version: '0.0.0'
73
100
  };
74
- writeFileSync(join(projectName, 'package.json'), JSON.stringify(packageJson));
101
+ writeFileSync(join(projectName, 'package.json'), JSON.stringify(packageJson, null, 2));
75
102
  };
@@ -0,0 +1,6 @@
1
+ import { CreateConfiguration } from '../../types';
2
+ type GenerateDBHandlersProps = Pick<CreateConfiguration, 'databaseEngine' | 'databaseHost' | 'orm'> & {
3
+ usesAuth: boolean;
4
+ };
5
+ export declare const generateDBHandlers: ({ databaseEngine, databaseHost, orm, usesAuth }: GenerateDBHandlersProps) => string;
6
+ export {};
@@ -0,0 +1,11 @@
1
+ import { getAuthTemplate, getCountTemplate } from './handlerTemplates';
2
+ export const generateDBHandlers = ({ databaseEngine, databaseHost, orm, usesAuth }) => {
3
+ if (databaseEngine === undefined || databaseEngine === 'none') {
4
+ throw new Error('Internal Error: databaseEngine is undefined or "none".');
5
+ }
6
+ const host = databaseHost && databaseHost !== 'none' ? databaseHost : 'local';
7
+ const ormKey = orm === 'drizzle' ? 'drizzle' : 'sql';
8
+ const key = `${databaseEngine}:${ormKey}:${host}`;
9
+ // @ts-expect-error - TODO: Finish the other templates
10
+ return usesAuth ? getAuthTemplate(key) : getCountTemplate(key);
11
+ };
@@ -0,0 +1,8 @@
1
+ import { AuthProvider, AvailableDrizzleDialect, DatabaseHost } from '../../types';
2
+ type GenerateSchemaProps = {
3
+ databaseEngine: AvailableDrizzleDialect;
4
+ databaseHost: DatabaseHost;
5
+ authProvider: AuthProvider;
6
+ };
7
+ export declare const generateDrizzleSchema: ({ databaseEngine, databaseHost, authProvider }: GenerateSchemaProps) => string;
8
+ export {};
@@ -0,0 +1,122 @@
1
+ const DIALECTS = {
2
+ gel: {
3
+ builders: ['text', 'gelTable', 'timestamp', 'integer'],
4
+ json: 'text()',
5
+ pkg: 'gel-core',
6
+ string: 'text()',
7
+ table: 'gelTable',
8
+ time: 'timestamp()'
9
+ },
10
+ mysql: {
11
+ builders: ['json', 'mysqlTable', 'timestamp', 'varchar', 'int'],
12
+ json: 'json()',
13
+ pkg: 'mysql-core',
14
+ string: 'varchar({ length: 255 })',
15
+ table: 'mysqlTable',
16
+ time: 'timestamp()'
17
+ },
18
+ postgresql: {
19
+ builders: ['jsonb', 'pgTable', 'timestamp', 'varchar', 'integer'],
20
+ json: 'jsonb()',
21
+ pkg: 'pg-core',
22
+ string: 'varchar({ length: 255 })',
23
+ table: 'pgTable',
24
+ time: 'timestamp()'
25
+ },
26
+ singlestore: {
27
+ builders: ['json', 'singlestoreTable', 'timestamp', 'varchar', 'int'],
28
+ json: 'json()',
29
+ pkg: 'singlestore-core',
30
+ string: 'varchar({ length: 255 })',
31
+ table: 'singlestoreTable',
32
+ time: 'timestamp()'
33
+ },
34
+ sqlite: {
35
+ builders: ['text', 'sqliteTable', 'integer'],
36
+ json: "text('', { mode: 'json' })",
37
+ pkg: 'sqlite-core',
38
+ string: 'text()',
39
+ table: 'sqliteTable',
40
+ time: "integer({ mode: 'timestamp' })"
41
+ }
42
+ };
43
+ const builder = (expr) => expr.split('(')[0];
44
+ export const generateDrizzleSchema = ({ databaseEngine, databaseHost, authProvider }) => {
45
+ const cfg = DIALECTS[databaseEngine];
46
+ const intBuilder = databaseEngine === 'mysql' || databaseEngine === 'singlestore'
47
+ ? 'int'
48
+ : 'integer';
49
+ const timeBuilder = builder(cfg.time);
50
+ const jsonBuilder = builder(cfg.json);
51
+ const stringBuilder = builder(cfg.string);
52
+ const importBuilders = authProvider === 'absoluteAuth'
53
+ ? [cfg.table, stringBuilder, timeBuilder, jsonBuilder]
54
+ : [cfg.table, intBuilder, timeBuilder];
55
+ const uniqueBuilders = Array.from(new Set(importBuilders));
56
+ const builderImport = `import { ${uniqueBuilders.join(', ')} } from 'drizzle-orm/${cfg.pkg}';`;
57
+ const sqliteImports = databaseEngine === 'sqlite'
58
+ ? `import { sql } from 'drizzle-orm';\n`
59
+ : '';
60
+ let dbImport = '';
61
+ let dbTypeLine = '';
62
+ if (databaseHost === 'neon') {
63
+ dbImport = `import { NeonHttpDatabase } from 'drizzle-orm/neon-http';`;
64
+ dbTypeLine = 'export type DatabaseType = NeonHttpDatabase<SchemaType>;';
65
+ }
66
+ else if (databaseHost === 'planetscale') {
67
+ dbImport = `import { PlanetScaleDatabase } from 'drizzle-orm/planetscale-serverless';`;
68
+ dbTypeLine =
69
+ 'export type DatabaseType = PlanetScaleDatabase<SchemaType>;';
70
+ }
71
+ else if (databaseHost === 'turso') {
72
+ dbImport = `import { LibSQLDatabase } from 'drizzle-orm/libsql';`;
73
+ dbTypeLine = 'export type DatabaseType = LibSQLDatabase<SchemaType>;';
74
+ }
75
+ let uidColumn;
76
+ if (databaseEngine === 'mysql' || databaseEngine === 'singlestore') {
77
+ uidColumn = `${intBuilder}('uid').primaryKey().autoincrement()`;
78
+ }
79
+ else if (databaseEngine === 'sqlite') {
80
+ uidColumn = `integer('uid').primaryKey({ autoIncrement: true })`;
81
+ }
82
+ else {
83
+ uidColumn = `integer('uid').primaryKey().generatedAlwaysAsIdentity()`;
84
+ }
85
+ const constsBlock = databaseEngine === 'sqlite'
86
+ ? `const JULIAN_DAY_UNIX_EPOCH_OFFSET = 2440587.5;
87
+ const MILLIS_PER_DAY = 86400000;\n\n`
88
+ : '';
89
+ const timestampColumn = databaseEngine === 'sqlite'
90
+ ? `${cfg.time}.notNull().default(sql\`(julianday('now') - \${JULIAN_DAY_UNIX_EPOCH_OFFSET}) * \${MILLIS_PER_DAY}\`)`
91
+ : `${cfg.time}.notNull().defaultNow()`;
92
+ const tableBlock = authProvider === 'absoluteAuth'
93
+ ? `export const users = ${cfg.table}('users', {
94
+ auth_sub: ${cfg.string}.primaryKey(),
95
+ created_at: ${timestampColumn},
96
+ metadata: ${cfg.json}.$type<Record<string, unknown>>().default({})
97
+ });`
98
+ : `export const countHistory = ${cfg.table}('count_history', {
99
+ uid: ${uidColumn},
100
+ count: ${intBuilder}('count').notNull(),
101
+ created_at: ${timestampColumn}
102
+ });`;
103
+ const schemaKey = authProvider === 'absoluteAuth' ? 'users' : 'countHistory';
104
+ const extraTypes = authProvider === 'absoluteAuth'
105
+ ? `export type User = typeof users.$inferSelect;
106
+ export type NewUser = typeof users.$inferInsert;`
107
+ : `export type CountHistory = typeof countHistory.$inferSelect;
108
+ export type NewCountHistory = typeof countHistory.$inferInsert;`;
109
+ return `
110
+ ${sqliteImports}${builderImport}
111
+ ${dbImport}
112
+
113
+ ${constsBlock}${tableBlock}
114
+
115
+ export const schema = {
116
+ ${schemaKey}
117
+ };
118
+
119
+ export type SchemaType = typeof schema;
120
+ ${dbTypeLine ? `${dbTypeLine}\n\n` : '\n'}${extraTypes}
121
+ `;
122
+ };
@@ -0,0 +1,52 @@
1
+ type QueryOperations = {
2
+ selectUser: string;
3
+ insertUser: string;
4
+ selectHistory: string;
5
+ insertHistory: string;
6
+ };
7
+ declare const driverConfigurations: {
8
+ readonly 'postgresql:drizzle:local': {
9
+ readonly dbType: "BunSQLDatabase<SchemaType>";
10
+ readonly importLines: "\nimport { eq } from 'drizzle-orm'\nimport { BunSQLDatabase } from 'drizzle-orm/bun-sql'\nimport { schema, type SchemaType } from '../../../db/schema'";
11
+ readonly queries: QueryOperations;
12
+ };
13
+ readonly 'postgresql:drizzle:neon': {
14
+ readonly dbType: "NeonHttpDatabase<SchemaType>";
15
+ readonly importLines: "\nimport { eq } from 'drizzle-orm'\nimport { NeonHttpDatabase } from 'drizzle-orm/neon-http'\nimport { schema, type SchemaType } from '../../../db/schema'";
16
+ readonly queries: QueryOperations;
17
+ };
18
+ readonly 'postgresql:sql:local': {
19
+ readonly dbType: "SQL";
20
+ readonly importLines: "import { SQL } from 'bun'";
21
+ readonly queries: QueryOperations;
22
+ };
23
+ readonly 'postgresql:sql:neon': {
24
+ readonly dbType: "NeonQueryFunction<false, false>";
25
+ readonly importLines: "import { NeonQueryFunction } from '@neondatabase/serverless'";
26
+ readonly queries: QueryOperations;
27
+ };
28
+ readonly 'sqlite:drizzle:local': {
29
+ readonly dbType: "BunSQLiteDatabase<SchemaType>";
30
+ readonly importLines: "\nimport { eq } from 'drizzle-orm'\nimport { BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite'\nimport { schema, type SchemaType } from '../../../db/schema'";
31
+ readonly queries: QueryOperations;
32
+ };
33
+ readonly 'sqlite:drizzle:turso': {
34
+ readonly dbType: "LibSQLDatabase<SchemaType>";
35
+ readonly importLines: "\nimport { eq } from 'drizzle-orm'\nimport { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport { schema, type SchemaType } from '../../../db/schema'";
36
+ readonly queries: QueryOperations;
37
+ };
38
+ readonly 'sqlite:sql:local': {
39
+ readonly dbType: "Database";
40
+ readonly importLines: "import { Database } from 'bun:sqlite'";
41
+ readonly queries: QueryOperations;
42
+ };
43
+ readonly 'sqlite:sql:turso': {
44
+ readonly dbType: "Client";
45
+ readonly importLines: "import { Client } from '@libsql/client'";
46
+ readonly queries: QueryOperations;
47
+ };
48
+ };
49
+ type DriverConfigurationKey = keyof typeof driverConfigurations;
50
+ export declare const getAuthTemplate: (key: DriverConfigurationKey) => string;
51
+ export declare const getCountTemplate: (key: DriverConfigurationKey) => string;
52
+ export {};