create-absolutejs 0.18.0 → 0.19.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.
- package/CHANGELOG.md +10 -0
- package/changelog.json +14 -0
- package/dist/commands/migrateDatabase.d.ts +6 -0
- package/dist/commands/migrateDatabase.js +53 -0
- package/dist/data.d.ts +1 -1
- package/dist/data.js +1 -0
- package/dist/generators/configurations/generateDrizzleConfig.d.ts +5 -3
- package/dist/generators/configurations/generateDrizzleConfig.js +40 -14
- package/dist/generators/configurations/generateEnv.js +6 -0
- package/dist/generators/configurations/generatePackageJson.js +30 -3
- package/dist/generators/db/drizzleTargets.d.ts +5 -0
- package/dist/generators/db/drizzleTargets.js +27 -0
- package/dist/generators/db/generateDatabaseTypes.js +10 -6
- package/dist/generators/db/generateDockerContainer.d.ts +5 -0
- package/dist/generators/db/generateDockerContainer.js +22 -4
- package/dist/generators/db/generateDrizzleSchema.js +65 -81
- package/dist/generators/db/handlerTemplates.d.ts +4 -4
- package/dist/generators/db/handlerTemplates.js +7 -10
- package/dist/generators/db/scaffoldDatabase.js +17 -4
- package/dist/generators/db/scaffoldDocker.d.ts +2 -1
- package/dist/generators/db/scaffoldDocker.js +7 -3
- package/dist/generators/project/generateDBBlock.js +11 -2
- package/dist/generators/project/generateImportsBlock.js +11 -6
- package/dist/generators/project/generateServer.js +2 -1
- package/dist/index.js +2 -1
- package/dist/messages.d.ts +2 -1
- package/dist/messages.js +2 -1
- package/dist/questions/authOption.js +4 -1
- package/dist/questions/databaseEngine.d.ts +1 -1
- package/dist/scaffold.d.ts +1 -0
- package/dist/scaffold.js +21 -3
- package/dist/templates/configurations/eslint.config.example.mjs +80 -41
- package/dist/templates/db/migrations/cockroach-count-history/20260926210314_init/migration.sql +5 -0
- package/dist/templates/db/migrations/cockroach-count-history/20260926210314_init/snapshot.json +69 -0
- package/dist/templates/db/migrations/cockroach-users/20260926210315_init/migration.sql +5 -0
- package/dist/templates/db/migrations/cockroach-users/20260926210315_init/snapshot.json +62 -0
- package/dist/templates/db/migrations/mssql-count-history/20260926210316_init/migration.sql +6 -0
- package/dist/templates/db/migrations/mssql-count-history/20260926210316_init/snapshot.json +64 -0
- package/dist/templates/db/migrations/mssql-users/20260926210317_init/migration.sql +6 -0
- package/dist/templates/db/migrations/mssql-users/20260926210317_init/snapshot.json +70 -0
- package/dist/templates/db/migrations/mysql-count-history/20260926210318_init/migration.sql +5 -0
- package/dist/templates/db/migrations/mysql-count-history/20260926210318_init/snapshot.json +61 -0
- package/dist/templates/db/migrations/mysql-users/20260926210319_init/migration.sql +5 -0
- package/dist/templates/db/migrations/mysql-users/20260926210319_init/snapshot.json +61 -0
- package/dist/templates/db/migrations/postgresql-count-history/20260926210320_init/migration.sql +5 -0
- package/dist/templates/db/migrations/postgresql-count-history/20260926210320_init/snapshot.json +71 -0
- package/dist/templates/db/migrations/postgresql-users/20260926210320_init/migration.sql +5 -0
- package/dist/templates/db/migrations/postgresql-users/20260926210320_init/snapshot.json +62 -0
- package/dist/templates/db/migrations/singlestore-count-history/20260926210321_init/migration.sql +5 -0
- package/dist/templates/db/migrations/singlestore-count-history/20260926210321_init/snapshot.json +61 -0
- package/dist/templates/db/migrations/singlestore-users/20260926210322_init/migration.sql +5 -0
- package/dist/templates/db/migrations/singlestore-users/20260926210322_init/snapshot.json +61 -0
- package/dist/templates/db/migrations/sqlite-count-history/20260926210323_init/migration.sql +5 -0
- package/dist/templates/db/migrations/sqlite-count-history/20260926210323_init/snapshot.json +50 -0
- package/dist/templates/db/migrations/sqlite-users/20260926210324_init/migration.sql +5 -0
- package/dist/templates/db/migrations/sqlite-users/20260926210324_init/snapshot.json +50 -0
- package/dist/templates/db/migrations/turso-count-history/20260926210324_init/migration.sql +5 -0
- package/dist/templates/db/migrations/turso-count-history/20260926210324_init/snapshot.json +50 -0
- package/dist/templates/db/migrations/turso-users/20260926210325_init/migration.sql +5 -0
- package/dist/templates/db/migrations/turso-users/20260926210325_init/snapshot.json +50 -0
- package/dist/templates/git/gitignore +0 -3
- package/dist/typeGuards.js +2 -2
- package/dist/utils/parseCommandLineOptions.js +16 -25
- package/dist/utils/validateDatabaseSelection.d.ts +11 -0
- package/dist/utils/validateDatabaseSelection.js +31 -0
- package/package.json +3 -1
- package/dist/templates/configurations/drizzle.config.ts +0 -13
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "7",
|
|
3
|
+
"dialect": "sqlite",
|
|
4
|
+
"id": "1d80fd4a-732f-4fd7-b39b-2e83811d8795",
|
|
5
|
+
"prevIds": ["00000000-0000-0000-0000-000000000000"],
|
|
6
|
+
"ddl": [
|
|
7
|
+
{
|
|
8
|
+
"name": "count_history",
|
|
9
|
+
"entityType": "tables"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"type": "integer",
|
|
13
|
+
"notNull": false,
|
|
14
|
+
"autoincrement": true,
|
|
15
|
+
"default": null,
|
|
16
|
+
"generated": null,
|
|
17
|
+
"name": "uid",
|
|
18
|
+
"entityType": "columns",
|
|
19
|
+
"table": "count_history"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"type": "integer",
|
|
23
|
+
"notNull": true,
|
|
24
|
+
"autoincrement": false,
|
|
25
|
+
"default": null,
|
|
26
|
+
"generated": null,
|
|
27
|
+
"name": "count",
|
|
28
|
+
"entityType": "columns",
|
|
29
|
+
"table": "count_history"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"type": "integer",
|
|
33
|
+
"notNull": true,
|
|
34
|
+
"autoincrement": false,
|
|
35
|
+
"default": "((julianday('now') - 2440587.5) * 86400000)",
|
|
36
|
+
"generated": null,
|
|
37
|
+
"name": "created_at",
|
|
38
|
+
"entityType": "columns",
|
|
39
|
+
"table": "count_history"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"columns": ["uid"],
|
|
43
|
+
"nameExplicit": false,
|
|
44
|
+
"name": "count_history_pk",
|
|
45
|
+
"table": "count_history",
|
|
46
|
+
"entityType": "pks"
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
"renames": []
|
|
50
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "7",
|
|
3
|
+
"dialect": "sqlite",
|
|
4
|
+
"id": "7334265f-6de3-4ba2-a99c-55a6ee3fc67f",
|
|
5
|
+
"prevIds": ["00000000-0000-0000-0000-000000000000"],
|
|
6
|
+
"ddl": [
|
|
7
|
+
{
|
|
8
|
+
"name": "users",
|
|
9
|
+
"entityType": "tables"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"type": "text",
|
|
13
|
+
"notNull": false,
|
|
14
|
+
"autoincrement": false,
|
|
15
|
+
"default": null,
|
|
16
|
+
"generated": null,
|
|
17
|
+
"name": "auth_sub",
|
|
18
|
+
"entityType": "columns",
|
|
19
|
+
"table": "users"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"type": "integer",
|
|
23
|
+
"notNull": true,
|
|
24
|
+
"autoincrement": false,
|
|
25
|
+
"default": "((julianday('now') - 2440587.5) * 86400000)",
|
|
26
|
+
"generated": null,
|
|
27
|
+
"name": "created_at",
|
|
28
|
+
"entityType": "columns",
|
|
29
|
+
"table": "users"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"type": "text",
|
|
33
|
+
"notNull": false,
|
|
34
|
+
"autoincrement": false,
|
|
35
|
+
"default": "'{}'",
|
|
36
|
+
"generated": null,
|
|
37
|
+
"name": "metadata",
|
|
38
|
+
"entityType": "columns",
|
|
39
|
+
"table": "users"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"columns": ["auth_sub"],
|
|
43
|
+
"nameExplicit": false,
|
|
44
|
+
"name": "users_pk",
|
|
45
|
+
"table": "users",
|
|
46
|
+
"entityType": "pks"
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
"renames": []
|
|
50
|
+
}
|
package/dist/typeGuards.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { availableDatabaseEngines, availableDatabaseHosts, availableDrizzleDialects, availablePrismaDialects, frontendLabels } from './data';
|
|
1
|
+
import { availableDatabaseEngines, availableDatabaseHosts, availableDrizzleDialects, availableORMs, availablePrismaDialects, frontendLabels } from './data';
|
|
2
2
|
export const isCodeQualityTool = (value) => value === 'eslint+prettier' || value === 'biome' || value === undefined;
|
|
3
3
|
export const isDatabaseEngine = (value) => availableDatabaseEngines.some((engine) => engine === value);
|
|
4
4
|
export const isDatabaseHost = (value) => availableDatabaseHosts.some((host) => host === value);
|
|
@@ -6,6 +6,6 @@ export const isDirectoryConfig = (value) => value === 'default' || value === 'cu
|
|
|
6
6
|
export const isDrizzleDialect = (value) => availableDrizzleDialects.some((dialect) => dialect === value);
|
|
7
7
|
export const isFrontend = (value) => value !== undefined && Object.keys(frontendLabels).includes(value);
|
|
8
8
|
export const isGithubLinkOption = (value) => value === 'existing' || value === 'create' || value === 'skip';
|
|
9
|
-
export const isORM = (value) => value ===
|
|
9
|
+
export const isORM = (value) => value === undefined || availableORMs.some((orm) => orm === value);
|
|
10
10
|
export const isPrismaDialect = (value) => availablePrismaDialects.some((dialect) => dialect === value);
|
|
11
11
|
export const isValidAuthOption = (value) => value === 'abs' || value === 'none' || value === undefined;
|
|
@@ -2,9 +2,10 @@ import { argv, exit } from 'process';
|
|
|
2
2
|
import { parseArgs } from 'util';
|
|
3
3
|
import { isValidProviderOption, providers } from '@absolutejs/auth';
|
|
4
4
|
import { DEFAULT_ARG_LENGTH } from '../constants';
|
|
5
|
-
import { availableAuthProviders, availableDatabaseEngines, availableDatabaseHosts, availableDirectoryConfigurations,
|
|
6
|
-
import { isValidAuthOption, isDatabaseEngine, isDatabaseHost, isDirectoryConfig,
|
|
5
|
+
import { availableAuthProviders, availableDatabaseEngines, availableDatabaseHosts, availableDirectoryConfigurations, availableORMs, availablePrismaDialects } from '../data';
|
|
6
|
+
import { isValidAuthOption, isDatabaseEngine, isDatabaseHost, isDirectoryConfig, isGithubLinkOption, isORM, isPrismaDialect } from '../typeGuards';
|
|
7
7
|
import { normalizeRepoInput } from './github';
|
|
8
|
+
import { validateDatabaseSelection } from './validateDatabaseSelection';
|
|
8
9
|
export const parseCommandLineOptions = () => {
|
|
9
10
|
const { values, positionals } = parseArgs({
|
|
10
11
|
allowNegative: true,
|
|
@@ -129,37 +130,25 @@ export const parseCommandLineOptions = () => {
|
|
|
129
130
|
codeQualityTool = undefined;
|
|
130
131
|
}
|
|
131
132
|
const defaultDirectory = values.skip ? 'default' : undefined;
|
|
132
|
-
const directoryConfig = values.directory !== undefined && isDirectoryConfig(values.directory)
|
|
133
|
+
const directoryConfig = values.directory !== undefined && isDirectoryConfig(values.directory)
|
|
134
|
+
? values.directory
|
|
135
|
+
: defaultDirectory;
|
|
133
136
|
if (values.directory !== undefined && directoryConfig === undefined) {
|
|
134
137
|
errors.push(`Invalid directory configuration: "${values.directory}". Expected: [ ${availableDirectoryConfigurations.join(', ')} ]`);
|
|
135
138
|
}
|
|
136
|
-
|
|
137
|
-
databaseEngine
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
139
|
+
const databaseSelection = validateDatabaseSelection({
|
|
140
|
+
databaseEngine,
|
|
141
|
+
databaseHost,
|
|
142
|
+
orm
|
|
143
|
+
});
|
|
144
|
+
({ databaseEngine } = databaseSelection);
|
|
145
|
+
errors.push(...databaseSelection.errors);
|
|
142
146
|
if (values.orm === 'prisma' &&
|
|
143
147
|
databaseEngine !== undefined &&
|
|
144
148
|
databaseEngine !== 'none' &&
|
|
145
149
|
!isPrismaDialect(databaseEngine)) {
|
|
146
150
|
errors.push(`Invalid database engine for Prisma ORM: "${databaseEngine}". Expected: [ ${availablePrismaDialects.join(', ')} ]`);
|
|
147
151
|
}
|
|
148
|
-
if (values['db-host'] === 'turso' &&
|
|
149
|
-
(databaseEngine === undefined || databaseEngine === 'none')) {
|
|
150
|
-
databaseEngine = 'sqlite';
|
|
151
|
-
}
|
|
152
|
-
else if (values['db-host'] === 'turso' && databaseEngine !== 'sqlite') {
|
|
153
|
-
errors.push(`Invalid database engine for Turso: "${databaseEngine}". Expected: "sqlite".`);
|
|
154
|
-
}
|
|
155
|
-
if (values['db-host'] === 'neon' && databaseEngine !== 'postgresql') {
|
|
156
|
-
errors.push(`Invalid database engine for Neon: "${databaseEngine}". Expected: "postgresql".`);
|
|
157
|
-
}
|
|
158
|
-
if (values['db-host'] === 'planetscale' &&
|
|
159
|
-
databaseEngine !== 'postgresql' &&
|
|
160
|
-
databaseEngine !== 'mysql') {
|
|
161
|
-
errors.push(`Invalid database engine for PlanetScale: "${databaseEngine}". Expected: "postgresql" or "mysql".`);
|
|
162
|
-
}
|
|
163
152
|
if (errors.length > 0) {
|
|
164
153
|
console.error(errors.join('\n'));
|
|
165
154
|
exit(1);
|
|
@@ -261,7 +250,9 @@ export const parseCommandLineOptions = () => {
|
|
|
261
250
|
databaseHost,
|
|
262
251
|
directoryConfig,
|
|
263
252
|
frontendDirectories,
|
|
264
|
-
frontends: selectedFrontends.length
|
|
253
|
+
frontends: selectedFrontends.length
|
|
254
|
+
? selectedFrontends
|
|
255
|
+
: defaultFrontends,
|
|
265
256
|
githubLink: isGithubLinkOption(values.github)
|
|
266
257
|
? values.github
|
|
267
258
|
: undefined,
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DatabaseEngine, DatabaseHost, ORM } from '../types';
|
|
2
|
+
type DatabaseSelection = {
|
|
3
|
+
databaseEngine: DatabaseEngine;
|
|
4
|
+
databaseHost: DatabaseHost;
|
|
5
|
+
orm: ORM;
|
|
6
|
+
};
|
|
7
|
+
export declare const validateDatabaseSelection: ({ databaseEngine, databaseHost, orm }: DatabaseSelection) => {
|
|
8
|
+
databaseEngine: DatabaseEngine;
|
|
9
|
+
errors: string[];
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { availableDrizzleDialects } from '../data';
|
|
2
|
+
import { isDrizzleDialect } from '../typeGuards';
|
|
3
|
+
const hostEngines = {
|
|
4
|
+
neon: { engines: ['postgresql'], label: 'Neon' },
|
|
5
|
+
none: undefined,
|
|
6
|
+
planetscale: { engines: ['postgresql', 'mysql'], label: 'PlanetScale' },
|
|
7
|
+
turso: { engines: ['sqlite'], label: 'Turso' }
|
|
8
|
+
};
|
|
9
|
+
const formatEngines = (engines) => engines.map((engine) => `"${engine}"`).join(' or ');
|
|
10
|
+
/* Every engine/host/ORM combination the CLI accepts must scaffold working code,
|
|
11
|
+
so unsupported ones are refused here, before anything is written. Turso only
|
|
12
|
+
serves SQLite, so choosing it without an engine selects SQLite. */
|
|
13
|
+
export const validateDatabaseSelection = ({ databaseEngine, databaseHost, orm }) => {
|
|
14
|
+
const errors = [];
|
|
15
|
+
const hasEngine = databaseEngine !== undefined && databaseEngine !== 'none';
|
|
16
|
+
const resolvedEngine = databaseHost === 'turso' && !hasEngine ? 'sqlite' : databaseEngine;
|
|
17
|
+
if (orm === 'drizzle' && databaseEngine === 'gel') {
|
|
18
|
+
errors.push('Drizzle ORM 1.0 does not support Gel. Use "--orm none" with "--db gel".');
|
|
19
|
+
}
|
|
20
|
+
else if (orm === 'drizzle' &&
|
|
21
|
+
hasEngine &&
|
|
22
|
+
!isDrizzleDialect(databaseEngine)) {
|
|
23
|
+
errors.push(`Invalid database engine for Drizzle ORM: "${databaseEngine}". Expected: [ ${availableDrizzleDialects.join(', ')} ]`);
|
|
24
|
+
}
|
|
25
|
+
const host = databaseHost === undefined ? undefined : hostEngines[databaseHost];
|
|
26
|
+
const acceptsEngine = host?.engines.some((engine) => engine === resolvedEngine);
|
|
27
|
+
if (host !== undefined && !acceptsEngine) {
|
|
28
|
+
errors.push(`Invalid database engine for ${host.label}: "${resolvedEngine}". Expected: ${formatEngines(host.engines)}.`);
|
|
29
|
+
}
|
|
30
|
+
return { databaseEngine: resolvedEngine, errors };
|
|
31
|
+
};
|
package/package.json
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"@absolutejs/changelog": "0.7.0",
|
|
15
15
|
"@elysia/eden": "2.0.0-beta.5",
|
|
16
16
|
"@eslint/compat": "2.1.1",
|
|
17
|
+
"@eslint/js": "10.0.1",
|
|
17
18
|
"@stylistic/eslint-plugin": "5.10.0",
|
|
18
19
|
"@types/bun": "1.4.2",
|
|
19
20
|
"@types/react": "19.3.0",
|
|
@@ -26,6 +27,7 @@
|
|
|
26
27
|
"eslint-plugin-import": "2.32.0",
|
|
27
28
|
"eslint-plugin-promise": "7.3.0",
|
|
28
29
|
"eslint-plugin-security": "4.0.1",
|
|
30
|
+
"globals": "17.12.0",
|
|
29
31
|
"prettier": "3.9.9",
|
|
30
32
|
"prettier-plugin-svelte": "4.1.1",
|
|
31
33
|
"svelte": "5.57.1",
|
|
@@ -61,5 +63,5 @@
|
|
|
61
63
|
"typecheck": "bun run tsc --noEmit"
|
|
62
64
|
},
|
|
63
65
|
"type": "module",
|
|
64
|
-
"version": "0.
|
|
66
|
+
"version": "0.19.0"
|
|
65
67
|
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { env } from 'bun';
|
|
2
|
-
import { defineConfig } from 'drizzle-kit';
|
|
3
|
-
|
|
4
|
-
if (env.DATABASE_URL === undefined) {
|
|
5
|
-
throw new Error('DATABASE_URL must be set in the environment variables');
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export default defineConfig({
|
|
9
|
-
dbCredentials: {
|
|
10
|
-
url: env.DATABASE_URL
|
|
11
|
-
},
|
|
12
|
-
dialect: 'postgresql'
|
|
13
|
-
});
|