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.
- package/dist/generators/configurations/generateEnv.d.ts +2 -2
- package/dist/generators/configurations/generateEnv.js +2 -2
- package/dist/generators/configurations/generatePackageJson.js +4 -2
- package/dist/generators/configurations/scaffoldConfigurationFiles.d.ts +7 -0
- package/dist/generators/configurations/{addConfigurationFiles.js → scaffoldConfigurationFiles.js} +2 -2
- package/dist/generators/db/handlerTemplates.d.ts +5 -0
- package/dist/generators/db/handlerTemplates.js +41 -0
- package/dist/generators/db/scaffoldDatabase.js +11 -10
- package/dist/generators/project/generateDBBlock.js +8 -2
- package/dist/generators/project/generateImportsBlock.js +11 -4
- package/dist/scaffold.js +3 -3
- package/package.json +1 -1
- package/dist/generators/configurations/addConfigurationFiles.d.ts +0 -8
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CreateConfiguration } from '../../types';
|
|
2
|
-
type GenerateEnvProps = Pick<CreateConfiguration, 'databaseEngine' | '
|
|
2
|
+
type GenerateEnvProps = Pick<CreateConfiguration, 'databaseEngine' | 'databaseHost' | 'projectName'> & {
|
|
3
3
|
envVariables?: string[];
|
|
4
4
|
};
|
|
5
|
-
export declare const generateEnv: ({ databaseEngine,
|
|
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,
|
|
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
|
-
(
|
|
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 {};
|
package/dist/generators/configurations/{addConfigurationFiles.js → scaffoldConfigurationFiles.js}
RENAMED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
70
|
-
rawImports.push(...
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
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
|
@@ -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 {};
|