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.
Files changed (67) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/changelog.json +14 -0
  3. package/dist/commands/migrateDatabase.d.ts +6 -0
  4. package/dist/commands/migrateDatabase.js +53 -0
  5. package/dist/data.d.ts +1 -1
  6. package/dist/data.js +1 -0
  7. package/dist/generators/configurations/generateDrizzleConfig.d.ts +5 -3
  8. package/dist/generators/configurations/generateDrizzleConfig.js +40 -14
  9. package/dist/generators/configurations/generateEnv.js +6 -0
  10. package/dist/generators/configurations/generatePackageJson.js +30 -3
  11. package/dist/generators/db/drizzleTargets.d.ts +5 -0
  12. package/dist/generators/db/drizzleTargets.js +27 -0
  13. package/dist/generators/db/generateDatabaseTypes.js +10 -6
  14. package/dist/generators/db/generateDockerContainer.d.ts +5 -0
  15. package/dist/generators/db/generateDockerContainer.js +22 -4
  16. package/dist/generators/db/generateDrizzleSchema.js +65 -81
  17. package/dist/generators/db/handlerTemplates.d.ts +4 -4
  18. package/dist/generators/db/handlerTemplates.js +7 -10
  19. package/dist/generators/db/scaffoldDatabase.js +17 -4
  20. package/dist/generators/db/scaffoldDocker.d.ts +2 -1
  21. package/dist/generators/db/scaffoldDocker.js +7 -3
  22. package/dist/generators/project/generateDBBlock.js +11 -2
  23. package/dist/generators/project/generateImportsBlock.js +11 -6
  24. package/dist/generators/project/generateServer.js +2 -1
  25. package/dist/index.js +2 -1
  26. package/dist/messages.d.ts +2 -1
  27. package/dist/messages.js +2 -1
  28. package/dist/questions/authOption.js +4 -1
  29. package/dist/questions/databaseEngine.d.ts +1 -1
  30. package/dist/scaffold.d.ts +1 -0
  31. package/dist/scaffold.js +21 -3
  32. package/dist/templates/configurations/eslint.config.example.mjs +80 -41
  33. package/dist/templates/db/migrations/cockroach-count-history/20260926210314_init/migration.sql +5 -0
  34. package/dist/templates/db/migrations/cockroach-count-history/20260926210314_init/snapshot.json +69 -0
  35. package/dist/templates/db/migrations/cockroach-users/20260926210315_init/migration.sql +5 -0
  36. package/dist/templates/db/migrations/cockroach-users/20260926210315_init/snapshot.json +62 -0
  37. package/dist/templates/db/migrations/mssql-count-history/20260926210316_init/migration.sql +6 -0
  38. package/dist/templates/db/migrations/mssql-count-history/20260926210316_init/snapshot.json +64 -0
  39. package/dist/templates/db/migrations/mssql-users/20260926210317_init/migration.sql +6 -0
  40. package/dist/templates/db/migrations/mssql-users/20260926210317_init/snapshot.json +70 -0
  41. package/dist/templates/db/migrations/mysql-count-history/20260926210318_init/migration.sql +5 -0
  42. package/dist/templates/db/migrations/mysql-count-history/20260926210318_init/snapshot.json +61 -0
  43. package/dist/templates/db/migrations/mysql-users/20260926210319_init/migration.sql +5 -0
  44. package/dist/templates/db/migrations/mysql-users/20260926210319_init/snapshot.json +61 -0
  45. package/dist/templates/db/migrations/postgresql-count-history/20260926210320_init/migration.sql +5 -0
  46. package/dist/templates/db/migrations/postgresql-count-history/20260926210320_init/snapshot.json +71 -0
  47. package/dist/templates/db/migrations/postgresql-users/20260926210320_init/migration.sql +5 -0
  48. package/dist/templates/db/migrations/postgresql-users/20260926210320_init/snapshot.json +62 -0
  49. package/dist/templates/db/migrations/singlestore-count-history/20260926210321_init/migration.sql +5 -0
  50. package/dist/templates/db/migrations/singlestore-count-history/20260926210321_init/snapshot.json +61 -0
  51. package/dist/templates/db/migrations/singlestore-users/20260926210322_init/migration.sql +5 -0
  52. package/dist/templates/db/migrations/singlestore-users/20260926210322_init/snapshot.json +61 -0
  53. package/dist/templates/db/migrations/sqlite-count-history/20260926210323_init/migration.sql +5 -0
  54. package/dist/templates/db/migrations/sqlite-count-history/20260926210323_init/snapshot.json +50 -0
  55. package/dist/templates/db/migrations/sqlite-users/20260926210324_init/migration.sql +5 -0
  56. package/dist/templates/db/migrations/sqlite-users/20260926210324_init/snapshot.json +50 -0
  57. package/dist/templates/db/migrations/turso-count-history/20260926210324_init/migration.sql +5 -0
  58. package/dist/templates/db/migrations/turso-count-history/20260926210324_init/snapshot.json +50 -0
  59. package/dist/templates/db/migrations/turso-users/20260926210325_init/migration.sql +5 -0
  60. package/dist/templates/db/migrations/turso-users/20260926210325_init/snapshot.json +50 -0
  61. package/dist/templates/git/gitignore +0 -3
  62. package/dist/typeGuards.js +2 -2
  63. package/dist/utils/parseCommandLineOptions.js +16 -25
  64. package/dist/utils/validateDatabaseSelection.d.ts +11 -0
  65. package/dist/utils/validateDatabaseSelection.js +31 -0
  66. package/package.json +3 -1
  67. 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,5 @@
1
+ CREATE TABLE `users` (
2
+ `auth_sub` text PRIMARY KEY,
3
+ `created_at` integer DEFAULT ((julianday('now') - 2440587.5) * 86400000) NOT NULL,
4
+ `metadata` text DEFAULT '{}'
5
+ );
@@ -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
+ }
@@ -37,9 +37,6 @@ package-lock.json
37
37
  **/*.bun
38
38
  **/*.lockb
39
39
 
40
- /db/migrations/meta
41
- /db/migrations/*.sql
42
-
43
40
  #local build files
44
41
  **/build/src/
45
42
  /build
@@ -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 === 'drizzle' || value === 'prisma' || value === undefined;
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, availableDrizzleDialects, availableORMs, availablePrismaDialects } from '../data';
6
- import { isValidAuthOption, isDatabaseEngine, isDatabaseHost, isDirectoryConfig, isDrizzleDialect, isGithubLinkOption, isORM, isPrismaDialect } from '../typeGuards';
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) ? values.directory : defaultDirectory;
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
- if (values.orm === 'drizzle' &&
137
- databaseEngine !== undefined &&
138
- databaseEngine !== 'none' &&
139
- !isDrizzleDialect(databaseEngine)) {
140
- errors.push(`Invalid database engine for Drizzle ORM: "${databaseEngine}". Expected: [ ${availableDrizzleDialects.join(', ')} ]`);
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 ? selectedFrontends : defaultFrontends,
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.18.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
- });