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.
- package/README.md +15 -15
- package/dist/data.d.ts +4 -2
- package/dist/data.js +23 -8
- package/dist/generators/configurations/generateDrizzleConfig.d.ts +2 -1
- package/dist/generators/configurations/generateDrizzleConfig.js +16 -6
- package/dist/generators/configurations/generatePackageJson.d.ts +2 -2
- package/dist/generators/configurations/generatePackageJson.js +39 -12
- package/dist/generators/db/generateDBHandlers.d.ts +6 -0
- package/dist/generators/db/generateDBHandlers.js +11 -0
- package/dist/generators/db/generateDrizzleSchema.d.ts +8 -0
- package/dist/generators/db/generateDrizzleSchema.js +122 -0
- package/dist/generators/db/handlerTemplates.d.ts +52 -0
- package/dist/generators/db/handlerTemplates.js +168 -0
- package/dist/generators/db/scaffoldDatabase.d.ts +5 -6
- package/dist/generators/db/scaffoldDatabase.js +37 -6
- package/dist/generators/html/generateHTMLPage.d.ts +2 -2
- package/dist/generators/html/generateHTMLPage.js +7 -4
- package/dist/generators/html/scaffoldHTML.js +1 -1
- package/dist/generators/project/collectDependencies.d.ts +9 -0
- package/dist/generators/project/collectDependencies.js +16 -0
- package/dist/generators/project/computeFlags.d.ts +9 -0
- package/dist/generators/project/computeFlags.js +7 -0
- package/dist/generators/project/generateBuildBlock.d.ts +9 -0
- package/dist/generators/project/generateBuildBlock.js +13 -0
- package/dist/generators/project/generateDBBlock.d.ts +4 -0
- package/dist/generators/project/generateDBBlock.js +69 -0
- package/dist/generators/project/generateImportsBlock.d.ts +13 -0
- package/dist/generators/project/generateImportsBlock.js +124 -0
- package/dist/generators/project/generateRoutesBlock.d.ts +10 -0
- package/dist/generators/project/generateRoutesBlock.js +74 -0
- package/dist/generators/project/generateServer.d.ts +3 -4
- package/dist/generators/project/generateServer.js +46 -170
- package/dist/generators/project/generateUseBlock.d.ts +6 -0
- package/dist/generators/project/generateUseBlock.js +28 -0
- package/dist/messages.js +13 -13
- package/dist/prompt.js +6 -7
- package/dist/questions/databaseEngine.d.ts +1 -1
- package/dist/questions/databaseEngine.js +2 -1
- package/dist/questions/databaseHost.d.ts +1 -1
- package/dist/questions/databaseHost.js +10 -30
- package/dist/questions/orm.d.ts +2 -1
- package/dist/questions/orm.js +13 -7
- package/dist/scaffold.d.ts +1 -1
- package/dist/scaffold.js +16 -8
- package/dist/templates/db/docker-compose.db.yml +15 -0
- package/dist/typeGuards.d.ts +3 -1
- package/dist/typeGuards.js +5 -19
- package/dist/types.d.ts +3 -1
- package/dist/utils/checkDockerInstalled.d.ts +2 -0
- package/dist/utils/checkDockerInstalled.js +179 -0
- package/dist/utils/parseCommandLineOptions.js +47 -15
- package/package.json +2 -2
- 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 <
|
|
54
|
+
- `--angular-dir <directory>`
|
|
55
55
|
Specify the directory for and use the Angular frontend.
|
|
56
56
|
|
|
57
|
-
- `--assets <
|
|
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 <
|
|
66
|
+
- `--build <direrctory>`
|
|
67
67
|
Output directory for build artifacts.
|
|
68
68
|
|
|
69
|
-
- `--
|
|
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 <
|
|
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 <
|
|
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 <
|
|
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 <
|
|
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 <
|
|
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
|
|
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", "
|
|
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
|
-
'
|
|
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: {
|
|
81
|
+
config: {
|
|
82
|
+
providersConfiguration: {}
|
|
83
|
+
},
|
|
69
84
|
isPlugin: true,
|
|
70
85
|
packageName: 'absoluteAuth'
|
|
71
86
|
}
|
|
72
87
|
],
|
|
73
|
-
latestVersion: '0.
|
|
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.
|
|
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
|
-
|
|
7
|
-
|
|
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
|
-
|
|
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']
|
|
14
|
-
const requiresSvelte = frontendDirectories['svelte']
|
|
15
|
-
const requiresVue = frontendDirectories['vue']
|
|
16
|
-
const requiresHtmx = frontendDirectories['htmx']
|
|
17
|
-
const requiresHtml = frontendDirectories['html']
|
|
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
|
-
|
|
50
|
-
|
|
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
|
-
|
|
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 {};
|