create-absolutejs 0.3.14 → 0.3.16

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.
@@ -1,6 +1,6 @@
1
1
  import { CreateConfiguration } from '../../types';
2
- type GenerateEnvProps = Pick<CreateConfiguration, 'databaseEngine' | 'orm' | 'projectName'> & {
2
+ type GenerateEnvProps = Pick<CreateConfiguration, 'databaseEngine' | 'databaseHost' | 'projectName'> & {
3
3
  envVariables?: string[];
4
4
  };
5
- export declare const generateEnv: ({ databaseEngine, orm, envVariables, projectName }: GenerateEnvProps) => void;
5
+ export declare const generateEnv: ({ databaseEngine, databaseHost, envVariables, projectName }: GenerateEnvProps) => void;
6
6
  export {};
@@ -10,12 +10,12 @@ const databaseURLS = {
10
10
  postgresql: 'postgresql://user:password@localhost:5432/database',
11
11
  singlestore: 'singlestore://user:password@localhost:3306/database'
12
12
  };
13
- export const generateEnv = ({ databaseEngine, orm, envVariables = [], projectName }) => {
13
+ export const generateEnv = ({ databaseEngine, databaseHost, envVariables = [], projectName }) => {
14
14
  const vars = [...envVariables];
15
15
  if (databaseEngine !== 'sqlite' &&
16
16
  databaseEngine !== 'none' &&
17
17
  databaseEngine !== undefined &&
18
- (orm === 'none' || orm === undefined)) {
18
+ (databaseHost === 'none' || databaseHost === undefined)) {
19
19
  vars.push(`DATABASE_URL=${databaseURLS[databaseEngine]}`);
20
20
  }
21
21
  if (vars.length === 0)
@@ -95,10 +95,12 @@ export const createPackageJson = ({ projectName, authProvider, plugins, database
95
95
  scripts['db:up'] =
96
96
  'sh -c "docker info >/dev/null 2>&1 || sudo service docker start; docker compose -f db/docker-compose.db.yml up -d db"';
97
97
  scripts['db:down'] = 'docker compose -f db/docker-compose.db.yml down';
98
+ scripts['db:reset'] =
99
+ 'docker compose -f db/docker-compose.db.yml down -v';
100
+ scripts['db:mysql'] =
101
+ 'docker compose -f db/docker-compose.db.yml exec db mysql -u user -ppassword';
98
102
  scripts['predev'] = 'bun db:up';
99
103
  scripts['postdev'] = 'bun db:down';
100
- scripts['db:mysql'] =
101
- 'docker compose -f db/docker-compose.db.yml exec db mysql -u appuser -pappuser appdb';
102
104
  }
103
105
  if (databaseEngine === 'sqlite' &&
104
106
  (!databaseHost || databaseHost === 'none')) {
@@ -0,0 +1,7 @@
1
+ import type { CreateConfiguration } from '../../types';
2
+ type AddConfigurationProps = Pick<CreateConfiguration, 'tailwind' | 'initializeGitNow' | 'codeQualityTool' | 'frontends' | 'projectName' | 'databaseEngine' | 'databaseHost'> & {
3
+ templatesDirectory: string;
4
+ envVariables: string[] | undefined;
5
+ };
6
+ export declare const scaffoldConfigurationFiles: ({ tailwind, templatesDirectory, databaseEngine, envVariables, databaseHost, codeQualityTool, frontends, initializeGitNow, projectName }: AddConfigurationProps) => void;
7
+ export {};
@@ -3,7 +3,7 @@ import { join } from 'path';
3
3
  import { dim, yellow } from 'picocolors';
4
4
  import { generateEnv } from './generateEnv';
5
5
  import { generatePrettierrc } from './generatePrettierrc';
6
- export const addConfigurationFiles = ({ tailwind, templatesDirectory, orm, databaseEngine, envVariables, codeQualityTool, frontends, initializeGitNow, projectName }) => {
6
+ export const scaffoldConfigurationFiles = ({ tailwind, templatesDirectory, databaseEngine, envVariables, databaseHost, codeQualityTool, frontends, initializeGitNow, projectName }) => {
7
7
  copyFileSync(join(templatesDirectory, 'configurations', 'tsconfig.example.json'), join(projectName, 'tsconfig.json'));
8
8
  if (tailwind) {
9
9
  copyFileSync(join(templatesDirectory, 'tailwind', 'postcss.config.ts'), join(projectName, 'postcss.config.ts'));
@@ -21,8 +21,8 @@ export const addConfigurationFiles = ({ tailwind, templatesDirectory, orm, datab
21
21
  console.warn(`${dim('│')}\n${yellow('▲')} Biome support not implemented yet`);
22
22
  generateEnv({
23
23
  databaseEngine,
24
+ databaseHost,
24
25
  envVariables,
25
- orm,
26
26
  projectName
27
27
  });
28
28
  };
@@ -34,6 +34,11 @@ declare const driverConfigurations: {
34
34
  readonly importLines: "import { ConnectionPool } from 'mssql'";
35
35
  readonly queries: QueryOperations;
36
36
  };
37
+ readonly 'mysql:drizzle:local': {
38
+ readonly dbType: "MySql2Database<SchemaType>";
39
+ readonly importLines: "\nimport { eq } from 'drizzle-orm'\nimport { MySql2Database } from 'drizzle-orm/mysql2'\nimport { schema, type SchemaType } from '../../../db/schema'";
40
+ readonly queries: QueryOperations;
41
+ };
37
42
  readonly 'mysql:sql:local': {
38
43
  readonly dbType: "Pool";
39
44
  readonly handlerTypes: HandlerType;
@@ -235,6 +235,39 @@ const mysqlHandlerTypes = {
235
235
  metadata: string;
236
236
  }`
237
237
  };
238
+ const mysqlDrizzleQueryOperations = {
239
+ insertHistory: `const [row] = await db
240
+ .insert(schema.countHistory)
241
+ .values({ count })
242
+ .$returningId();
243
+
244
+ if (!row) throw new Error('insert failed: no uid returned');
245
+ const { uid } = row;
246
+
247
+ const [newHistory] = await db
248
+ .select()
249
+ .from(schema.countHistory)
250
+ .where(eq(schema.countHistory.uid, uid));
251
+
252
+ return newHistory;`,
253
+ insertUser: `const [row] = await db
254
+ .insert(schema.users)
255
+ .values({ auth_sub: authSub, metadata: userIdentity })
256
+ .$returningId();
257
+
258
+ if (!row) throw new Error('insert failed: no uid returned');
259
+ const { uid } = row;
260
+
261
+ const [newUser] = await db
262
+ .select()
263
+ .from(schema.users)
264
+ .where(eq(schema.users.uid, uid));
265
+
266
+ if (!newUser) throw new Error('Failed to create user');
267
+ return newUser;`,
268
+ selectHistory: drizzleQueryOperations.selectHistory,
269
+ selectUser: drizzleQueryOperations.selectUser
270
+ };
238
271
  const driverConfigurations = {
239
272
  'cockroachdb:sql:local': {
240
273
  dbType: 'Pool',
@@ -261,6 +294,14 @@ const driverConfigurations = {
261
294
  importLines: `import { ConnectionPool } from 'mssql'`,
262
295
  queries: mssqlSqlQueryOperations
263
296
  },
297
+ 'mysql:drizzle:local': {
298
+ dbType: 'MySql2Database<SchemaType>',
299
+ importLines: `
300
+ import { eq } from 'drizzle-orm'
301
+ import { MySql2Database } from 'drizzle-orm/mysql2'
302
+ import { schema, type SchemaType } from '../../../db/schema'`,
303
+ queries: mysqlDrizzleQueryOperations
304
+ },
264
305
  'mysql:sql:local': {
265
306
  dbType: 'Pool',
266
307
  handlerTypes: mysqlHandlerTypes,
@@ -10,6 +10,11 @@ import { generateDatabaseContainer } from './generateDBContainer';
10
10
  import { generateDBHandlers } from './generateDBHandlers';
11
11
  import { generateDrizzleSchema } from './generateDrizzleSchema';
12
12
  import { generateSqliteSchema } from './generateSqliteSchema';
13
+ const scaffoldDocker = async (databaseEngine, projectDatabaseDirectory) => {
14
+ await checkDockerInstalled();
15
+ const dbContainer = generateDatabaseContainer(databaseEngine);
16
+ writeFileSync(join(projectDatabaseDirectory, 'docker-compose.db.yml'), dbContainer, 'utf-8');
17
+ };
13
18
  export const scaffoldDatabase = async ({ projectName, databaseEngine, databaseHost, databaseDirectory, backendDirectory, authProvider, orm }) => {
14
19
  const projectDatabaseDirectory = join(projectName, databaseDirectory);
15
20
  const handlerDirectory = join(backendDirectory, 'handlers');
@@ -30,10 +35,13 @@ export const scaffoldDatabase = async ({ projectName, databaseEngine, databaseHo
30
35
  void ((orm === undefined || orm === 'none') &&
31
36
  (await checkSqliteInstalled()));
32
37
  const sqliteSchema = generateSqliteSchema(authProvider);
33
- const sqliteSchemaFilePath = join(projectDatabaseDirectory, 'schema.sql');
34
- writeFileSync(sqliteSchemaFilePath, sqliteSchema);
38
+ writeFileSync(join(projectDatabaseDirectory, 'schema.sql'), sqliteSchema);
35
39
  await $ `sqlite3 ${databaseDirectory}/database.sqlite ".read ${join(databaseDirectory, 'schema.sql')}"`.cwd(projectName);
36
40
  }
41
+ if (databaseEngine !== 'sqlite' &&
42
+ (databaseHost === undefined || databaseHost === 'none')) {
43
+ await scaffoldDocker(databaseEngine, projectDatabaseDirectory);
44
+ }
37
45
  if (orm === 'drizzle') {
38
46
  if (!isDrizzleDialect(databaseEngine)) {
39
47
  throw new Error('Internal type error: Expected a Drizzle dialect');
@@ -43,18 +51,11 @@ export const scaffoldDatabase = async ({ projectName, databaseEngine, databaseHo
43
51
  databaseEngine,
44
52
  databaseHost
45
53
  });
46
- const schemaFilePath = join(projectDatabaseDirectory, 'schema.ts');
47
- writeFileSync(schemaFilePath, drizzleSchema);
54
+ writeFileSync(join(projectDatabaseDirectory, 'schema.ts'), drizzleSchema);
48
55
  createDrizzleConfig({ databaseDirectory, databaseEngine, projectName });
49
56
  return;
50
57
  }
51
58
  if (orm === 'prisma') {
52
59
  console.warn(`${dim('│')}\n${yellow('▲')} Prisma support is not implemented yet`);
53
- return;
54
- }
55
- if (databaseEngine !== 'sqlite' && (orm === undefined || orm === 'none')) {
56
- await checkDockerInstalled();
57
- const dbContainer = generateDatabaseContainer(databaseEngine);
58
- writeFileSync(join(projectDatabaseDirectory, 'docker-compose.db.yml'), dbContainer, 'utf-8');
59
60
  }
60
61
  };
@@ -51,14 +51,20 @@ export const generateDBBlock = ({ databaseEngine, orm, databaseHost }) => {
51
51
  return '';
52
52
  return `
53
53
  const db = ${hostCfg.expr}
54
- ${hostCfg.connect ? 'await db.connect();\n' : ''}
55
- `;
54
+ ${hostCfg.connect ? 'await db.connect();\n' : ''}`;
56
55
  }
57
56
  if (!drizzleDialectSet.has(databaseEngine))
58
57
  return '';
59
58
  const expr = engineGroup[hostKey]?.expr ?? remoteDrizzleInit[hostKey];
60
59
  if (!expr)
61
60
  return '';
61
+ if (databaseEngine === 'mysql') {
62
+ const mode = databaseHost === 'planetscale' ? 'planetscale' : 'default';
63
+ return `
64
+ const sql = ${expr}
65
+ const db = drizzle(sql, { schema, mode: '${mode}' })
66
+ `;
67
+ }
62
68
  return `
63
69
  const sql = ${expr}
64
70
  const db = drizzle(sql, { schema })
@@ -66,10 +66,17 @@ export const generateImportsBlock = ({ backendDirectory, deps, flags, orm, authP
66
66
  `import { getEnv } from '@absolutejs/absolute'`
67
67
  ]
68
68
  : [`import { Database } from 'bun:sqlite'`]));
69
- if (noOrm && databaseEngine === 'mysql') {
70
- rawImports.push(...(isRemoteHost
71
- ? connectorImports[databaseHost]
72
- : [`import { createPool } from 'mysql2/promise'`]), `import { getEnv } from '@absolutejs/absolute'`);
69
+ if (databaseEngine === 'mysql' && isRemoteHost) {
70
+ rawImports.push(...connectorImports[databaseHost]);
71
+ }
72
+ if (databaseEngine === 'mysql' && !isRemoteHost) {
73
+ rawImports.push("import { createPool } from 'mysql2/promise'");
74
+ }
75
+ if (databaseEngine === 'mysql' && orm === 'drizzle') {
76
+ rawImports.push("import { drizzle } from 'drizzle-orm/mysql2'");
77
+ }
78
+ if (databaseEngine === 'mysql') {
79
+ rawImports.push("import { getEnv } from '@absolutejs/absolute'");
73
80
  }
74
81
  if (noOrm && databaseEngine === 'postgresql')
75
82
  rawImports.push(...(isRemoteHost
package/dist/scaffold.js CHANGED
@@ -4,9 +4,9 @@ import { fileURLToPath } from 'node:url';
4
4
  import { formatProject } from './commands/formatProject';
5
5
  import { initializeGit } from './commands/initializeGit';
6
6
  import { installDependencies } from './commands/installDependencies';
7
- import { addConfigurationFiles } from './generators/configurations/addConfigurationFiles';
8
7
  import { createPackageJson } from './generators/configurations/generatePackageJson';
9
8
  import { initalizeRoot } from './generators/configurations/initializeRoot';
9
+ import { scaffoldConfigurationFiles } from './generators/configurations/scaffoldConfigurationFiles';
10
10
  import { scaffoldDatabase } from './generators/db/scaffoldDatabase';
11
11
  import { generateServerFile } from './generators/project/generateServer';
12
12
  import { scaffoldFrontends } from './generators/project/scaffoldFrontends';
@@ -15,13 +15,13 @@ export const scaffold = async ({ response: { projectName, codeQualityTool, initi
15
15
  const templatesDirectory = join(__dirname, '/templates');
16
16
  const { frontendDirectory, backendDirectory, projectAssetsDirectory } = initalizeRoot(projectName, templatesDirectory);
17
17
  copyFileSync(join(templatesDirectory, 'README.md'), join(projectName, 'README.md'));
18
- addConfigurationFiles({
18
+ scaffoldConfigurationFiles({
19
19
  codeQualityTool,
20
20
  databaseEngine,
21
+ databaseHost,
21
22
  envVariables,
22
23
  frontends,
23
24
  initializeGitNow,
24
- orm,
25
25
  projectName,
26
26
  tailwind,
27
27
  templatesDirectory
package/package.json CHANGED
@@ -47,5 +47,5 @@
47
47
  "typecheck": "bun run tsc --noEmit"
48
48
  },
49
49
  "type": "module",
50
- "version": "0.3.14"
50
+ "version": "0.3.16"
51
51
  }
@@ -1,8 +0,0 @@
1
- import type { CreateConfiguration } from '../../types';
2
- type AddConfigurationProps = Pick<CreateConfiguration, 'tailwind' | 'initializeGitNow' | 'codeQualityTool' | 'frontends' | 'projectName' | 'databaseEngine' | 'orm'> & {
3
- templatesDirectory: string;
4
- projectName: string;
5
- envVariables: string[] | undefined;
6
- };
7
- export declare const addConfigurationFiles: ({ tailwind, templatesDirectory, orm, databaseEngine, envVariables, codeQualityTool, frontends, initializeGitNow, projectName }: AddConfigurationProps) => void;
8
- export {};