create-absolutejs 0.17.3 → 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 +16 -0
- package/README.md +37 -4
- package/changelog.json +24 -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 -1
- package/dist/generators/angular/generateAngularPage.d.ts +5 -6
- package/dist/generators/angular/generateAngularPage.js +16 -33
- package/dist/generators/angular/scaffoldAngular.d.ts +1 -1
- package/dist/generators/angular/scaffoldAngular.js +8 -9
- 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/generateEslintConfig.js +4 -2
- package/dist/generators/configurations/generatePackageJson.js +33 -6
- package/dist/generators/db/drizzleTargets.d.ts +5 -0
- package/dist/generators/db/drizzleTargets.js +27 -0
- package/dist/generators/db/generateDatabaseTypes.js +21 -24
- package/dist/generators/db/generateDockerContainer.d.ts +5 -0
- package/dist/generators/db/generateDockerContainer.js +22 -4
- package/dist/generators/db/generateDrizzleSchema.js +65 -77
- package/dist/generators/db/generateHandlers.js +3 -2
- package/dist/generators/db/generateRelationalSchema.d.ts +1 -1
- package/dist/generators/db/generateRelationalSchema.js +1 -1
- package/dist/generators/db/handlerTemplates.d.ts +11 -5
- package/dist/generators/db/handlerTemplates.js +14 -12
- package/dist/generators/db/scaffoldDatabase.d.ts +2 -1
- package/dist/generators/db/scaffoldDatabase.js +25 -10
- package/dist/generators/db/scaffoldDocker.d.ts +3 -1
- package/dist/generators/db/scaffoldDocker.js +11 -5
- package/dist/generators/htmx/scaffoldHTMX.js +1 -0
- package/dist/generators/project/generateAbsoluteAuthConfig.d.ts +1 -1
- package/dist/generators/project/generateAbsoluteAuthConfig.js +11 -10
- package/dist/generators/project/generateDBBlock.js +16 -7
- package/dist/generators/project/generateIdentity.d.ts +1 -0
- package/dist/generators/project/generateIdentity.js +15 -0
- package/dist/generators/project/generateImportsBlock.js +15 -15
- package/dist/generators/project/generateRoutesBlock.d.ts +2 -1
- package/dist/generators/project/generateRoutesBlock.js +8 -13
- package/dist/generators/project/generateServer.js +26 -16
- package/dist/generators/project/scaffoldAgentic.d.ts +1 -1
- package/dist/generators/project/scaffoldAgentic.js +45 -45
- package/dist/generators/project/scaffoldBackend.js +4 -9
- package/dist/generators/react/scaffoldReact.js +2 -2
- package/dist/index.js +2 -1
- package/dist/messages.d.ts +2 -1
- package/dist/messages.js +2 -1
- package/dist/prompt.js +3 -2
- package/dist/questions/authOption.js +4 -1
- package/dist/questions/databaseEngine.d.ts +1 -1
- package/dist/questions/orm.js +2 -5
- package/dist/scaffold.d.ts +3 -1
- package/dist/scaffold.js +33 -4
- package/dist/templates/configurations/eslint.config.example.mjs +81 -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/templates/htmx/LICENSE +13 -0
- package/dist/templates/htmx/htmx.2.0.11.min.js +1 -0
- package/dist/typeGuards.js +2 -2
- package/dist/utils/abort.d.ts +1 -1
- package/dist/utils/abort.js +2 -4
- package/dist/utils/getPackageVersion.js +7 -2
- package/dist/utils/parseCommandLineOptions.js +17 -34
- package/dist/utils/registryChannel.d.ts +2 -0
- package/dist/utils/registryChannel.js +20 -0
- package/dist/utils/validateDatabaseSelection.d.ts +11 -0
- package/dist/utils/validateDatabaseSelection.js +31 -0
- package/dist/versions.d.ts +66 -65
- package/dist/versions.js +66 -65
- package/package.json +27 -22
- package/dist/templates/configurations/drizzle.config.ts +0 -13
- package/dist/templates/htmx/htmx.2.0.6.min.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,22 @@ This file is generated by `absolute-changelog` from the entries in
|
|
|
6
6
|
`changelog/`. Edit an entry, not this file — and add new ones under
|
|
7
7
|
`changelog/unreleased/`.
|
|
8
8
|
|
|
9
|
+
## 0.19.0 — 2026-09-26
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **Scaffold Drizzle for every Drizzle 1.0 dialect (PostgreSQL, MySQL, MariaDB, SQLite, Turso/libSQL, SingleStore, SQL Server, CockroachDB) with a committed initial migration and db:generate / db:migrate scripts**
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- **Accept --orm none as the help text documents, and refuse unsupported database, host and ORM combinations before writing any files**
|
|
18
|
+
|
|
19
|
+
## 0.18.0 — 2026-09-23
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- **Update registry dependency pins and generate compatible Elysia 2, Drizzle 1, Angular and HTMX starters with persistent auth, typed JSON subapps, and executable starter checks**
|
|
24
|
+
|
|
9
25
|
## 0.17.3 — 2026-09-22
|
|
10
26
|
|
|
11
27
|
### Fixed
|
package/README.md
CHANGED
|
@@ -74,13 +74,13 @@ Usage: create-absolute [project-name] [options]
|
|
|
74
74
|
Output directory for build artifacts.
|
|
75
75
|
|
|
76
76
|
- `--db <engine|none>`
|
|
77
|
-
Database engine (`postgresql` | `mysql` | `sqlite` | `mongodb` | `
|
|
77
|
+
Database engine (`postgresql` | `mysql` | `mariadb` | `sqlite` | `mongodb` | `gel` | `singlestore` | `cockroachdb` | `mssql`) or `none`.
|
|
78
78
|
|
|
79
79
|
- `--db-dir <directory>`
|
|
80
80
|
Directory name for your database files.
|
|
81
81
|
|
|
82
82
|
- `--db-host <provider|none>`
|
|
83
|
-
Database host provider (`neon` | `planetscale` | `
|
|
83
|
+
Database host provider (`neon` | `planetscale` | `turso`) or `none`.
|
|
84
84
|
|
|
85
85
|
- `--directory <default|custom>`
|
|
86
86
|
Directory-naming strategy: `default` or `custom`.
|
|
@@ -112,8 +112,8 @@ Usage: create-absolute [project-name] [options]
|
|
|
112
112
|
- `--lts`
|
|
113
113
|
Use LTS versions of required packages.
|
|
114
114
|
|
|
115
|
-
- `--orm <drizzle|
|
|
116
|
-
ORM to configure: `drizzle` | `
|
|
115
|
+
- `--orm <drizzle|none>`
|
|
116
|
+
ORM to configure: `drizzle` | `none`. Prisma scaffolding is not implemented and is rejected before files are written. Drizzle 1 no longer includes the Gel dialect; choose no ORM for Gel.
|
|
117
117
|
|
|
118
118
|
- `--plugin <plugin>`
|
|
119
119
|
Elysia plugin(s) to include (repeatable); `none` skips plugin setup. Select
|
|
@@ -191,3 +191,36 @@ Contributions are welcome! Feel free to open issues or submit pull requests to i
|
|
|
191
191
|
## License
|
|
192
192
|
|
|
193
193
|
**Business Source License 1.1 (BSL-1.1)** – see [`LICENSE`](./LICENSE) for details.
|
|
194
|
+
|
|
195
|
+
## Scaffold compatibility and verification
|
|
196
|
+
|
|
197
|
+
The CLI pins published registry versions; it does not install local package links.
|
|
198
|
+
The compatibility policy in `src/utils/registryChannel.ts` also applies when
|
|
199
|
+
resolving versions at creation time, so npm's older `latest` tag cannot silently
|
|
200
|
+
switch a generated server back to Elysia 1.
|
|
201
|
+
|
|
202
|
+
- AbsoluteJS uses its current 0.20 beta channel.
|
|
203
|
+
- Elysia remains at 2.0.0-beta.6 and OpenAPI at 2.0.0-beta.2: the published
|
|
204
|
+
authentication/plugin contracts still rely on `ElysiaStatus.code`, which later
|
|
205
|
+
Elysia betas changed. Upgrading these requires a coordinated SDK migration.
|
|
206
|
+
- TypeScript 5.9.3 and Angular's current 21 LTS patches match the framework's
|
|
207
|
+
compiler peer dependencies. Newer incompatible compiler majors are not selected.
|
|
208
|
+
- Drizzle ORM and Kit use the coordinated 1.0 release-candidate channel.
|
|
209
|
+
- All other pins are checked against their latest published release channel.
|
|
210
|
+
|
|
211
|
+
Automatic authentication setup currently supplies a complete Google configuration
|
|
212
|
+
and requires a persistent database. Configure other login providers explicitly
|
|
213
|
+
using `@absolutejs/auth` after creation; the CLI rejects unsupported automatic
|
|
214
|
+
provider configurations instead of silently omitting them. Auth sessions are
|
|
215
|
+
in-memory by default; configure a shared session store for multi-instance hosting.
|
|
216
|
+
|
|
217
|
+
`bun run check-versions` checks every scaffold pin against that policy.
|
|
218
|
+
`bun run check:package` runs typechecking, unit tests, compilation and release
|
|
219
|
+
metadata validation. `bun run test:starters` scaffolds representative frontend,
|
|
220
|
+
plugin, database and agentic combinations into a temporary directory, installs
|
|
221
|
+
real registry dependencies, and checks TypeScript and ESLint. SQLite cases also
|
|
222
|
+
exercise generated HTTP validation and persistence using an isolated database.
|
|
223
|
+
The matrix creates Docker configuration files but does not start containers or
|
|
224
|
+
connect to paid providers. Use `SCAFFOLD_CHECK_CASES=sqlite-auth,all-frontends` to
|
|
225
|
+
select cases. Hosted database credentials and real OAuth acceptance are separate
|
|
226
|
+
integration checks, not implied by this matrix.
|
package/changelog.json
CHANGED
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
"contract": 1,
|
|
3
3
|
"name": "create-absolutejs",
|
|
4
4
|
"releases": [
|
|
5
|
+
{
|
|
6
|
+
"changes": [
|
|
7
|
+
{
|
|
8
|
+
"kind": "fixed",
|
|
9
|
+
"summary": "Accept --orm none as the help text documents, and refuse unsupported database, host and ORM combinations before writing any files"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"kind": "added",
|
|
13
|
+
"summary": "Scaffold Drizzle for every Drizzle 1.0 dialect (PostgreSQL, MySQL, MariaDB, SQLite, Turso/libSQL, SingleStore, SQL Server, CockroachDB) with a committed initial migration and db:generate / db:migrate scripts"
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"date": "2026-09-26",
|
|
17
|
+
"version": "0.19.0"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"changes": [
|
|
21
|
+
{
|
|
22
|
+
"kind": "fixed",
|
|
23
|
+
"summary": "Update registry dependency pins and generate compatible Elysia 2, Drizzle 1, Angular and HTMX starters with persistent auth, typed JSON subapps, and executable starter checks"
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"date": "2026-09-23",
|
|
27
|
+
"version": "0.18.0"
|
|
28
|
+
},
|
|
5
29
|
{
|
|
6
30
|
"changes": [
|
|
7
31
|
{
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CreateConfiguration } from '../types';
|
|
2
|
+
type MigrateDatabaseProps = Pick<CreateConfiguration, 'databaseEngine' | 'databaseHost' | 'projectName'> & {
|
|
3
|
+
verifyLocalDatabase: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare const migrateDatabase: ({ databaseEngine, databaseHost, projectName, verifyLocalDatabase }: MigrateDatabaseProps) => Promise<boolean>;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { spinner } from '@clack/prompts';
|
|
2
|
+
import { $ } from 'bun';
|
|
3
|
+
import { green, yellow } from 'picocolors';
|
|
4
|
+
import { isDockerDaemonRunning, resolveDockerExe } from '../utils/checkDockerInstalled';
|
|
5
|
+
const applyMigrations = async (projectName) => (await $ `bun run db:migrate`.cwd(projectName).quiet().nothrow())
|
|
6
|
+
.exitCode === 0;
|
|
7
|
+
const migrateDockerDatabase = async (projectName, databaseEngine) => {
|
|
8
|
+
if (!(await isDockerDaemonRunning()))
|
|
9
|
+
return false;
|
|
10
|
+
const docker = resolveDockerExe();
|
|
11
|
+
const compose = [
|
|
12
|
+
'compose',
|
|
13
|
+
'-p',
|
|
14
|
+
databaseEngine,
|
|
15
|
+
'-f',
|
|
16
|
+
'db/docker-compose.db.yml'
|
|
17
|
+
];
|
|
18
|
+
const started = await $ `${docker} ${compose} up -d --wait db`
|
|
19
|
+
.cwd(projectName)
|
|
20
|
+
.quiet()
|
|
21
|
+
.nothrow();
|
|
22
|
+
if (started.exitCode !== 0)
|
|
23
|
+
return false;
|
|
24
|
+
const migrated = await applyMigrations(projectName);
|
|
25
|
+
await $ `${docker} ${compose} down`.cwd(projectName).quiet().nothrow();
|
|
26
|
+
return migrated;
|
|
27
|
+
};
|
|
28
|
+
/* Applies the project's committed initial migration once dependencies are
|
|
29
|
+
installed, so a fresh Drizzle project's example tables exist on first run.
|
|
30
|
+
Local SQLite and the default local libSQL file for Turso migrate directly;
|
|
31
|
+
a Docker database is migrated only when the daemon is already up and the
|
|
32
|
+
scaffold verified it. Hosted databases are left to `db:migrate`, which needs
|
|
33
|
+
the real DATABASE_URL. Returns whether the migration ran. */
|
|
34
|
+
export const migrateDatabase = async ({ databaseEngine, databaseHost, projectName, verifyLocalDatabase }) => {
|
|
35
|
+
const isLocal = databaseHost === undefined || databaseHost === 'none';
|
|
36
|
+
const isFileDatabase = databaseEngine === 'sqlite' && (isLocal || databaseHost === 'turso');
|
|
37
|
+
const isDockerDatabase = isLocal &&
|
|
38
|
+
verifyLocalDatabase &&
|
|
39
|
+
databaseEngine !== undefined &&
|
|
40
|
+
databaseEngine !== 'none' &&
|
|
41
|
+
databaseEngine !== 'sqlite';
|
|
42
|
+
if (!isFileDatabase && !isDockerDatabase)
|
|
43
|
+
return false;
|
|
44
|
+
const spin = spinner();
|
|
45
|
+
spin.start('Applying database migrations');
|
|
46
|
+
const migrated = isFileDatabase
|
|
47
|
+
? await applyMigrations(projectName)
|
|
48
|
+
: await migrateDockerDatabase(projectName, databaseEngine ?? 'db');
|
|
49
|
+
spin.stop(migrated
|
|
50
|
+
? green('Database migrated')
|
|
51
|
+
: yellow('Database not migrated — run db:migrate once it is up'));
|
|
52
|
+
return migrated;
|
|
53
|
+
};
|
package/dist/data.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export declare const availableCodeQualityTools: readonly ["eslint+prettier", "bi
|
|
|
5
5
|
export declare const availableDatabaseEngines: readonly ["postgresql", "mysql", "sqlite", "mongodb", "mariadb", "gel", "singlestore", "cockroachdb", "mssql", "none"];
|
|
6
6
|
export declare const availableDatabaseHosts: readonly ["neon", "planetscale", "turso", "none"];
|
|
7
7
|
export declare const availableDirectoryConfigurations: readonly ["default", "custom"];
|
|
8
|
-
export declare const availableDrizzleDialects: readonly ["
|
|
8
|
+
export declare const availableDrizzleDialects: readonly ["cockroachdb", "mariadb", "mssql", "mysql", "postgresql", "singlestore", "sqlite"];
|
|
9
9
|
export declare const availableFrontends: readonly ["react", "html", "svelte", "vue", "htmx", "angular"];
|
|
10
10
|
export declare const availableORMs: readonly ["drizzle", "prisma", "none"];
|
|
11
11
|
export declare const availablePlugins: AvailableDependency[];
|
package/dist/data.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { Frontend } from '../../types';
|
|
2
|
-
export declare const generateAngularPage: (
|
|
2
|
+
export declare const generateAngularPage: (includeExamples: boolean) => "import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport type Context = {\n\tinitialCount: number;\n};\n\n@Component({\n\timports: [CommonModule],\n\tselector: 'angular-page',\n\tstandalone: true,\n\ttemplateUrl: '../templates/angular-example.html'\n})\nexport class AngularExampleComponent {}\n\nexport const factory = () => AngularExampleComponent;\n" | "import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { usePageContext } from '@absolutejs/absolute/angular';\nimport { DropdownComponent } from '../components/dropdown.component';\nimport { AppComponent } from '../components/app.component';\n\n\nexport type Context = {\n\tinitialCount: number;\n};\n\n@Component({\n\timports: [CommonModule, DropdownComponent, AppComponent],\n\tselector: 'angular-page',\n\tstandalone: true,\n\ttemplateUrl: '../templates/angular-example.html'\n})\nexport class AngularExampleComponent {\n\tinitialCount = usePageContext<Context>().initialCount;\n}\n\nexport const factory = () => AngularExampleComponent;\n";
|
|
3
3
|
export declare const generateAngularPageHtml: (includeExamples: boolean) => "<main></main>\n" | "<header>\n\t<a href=\"/\">AbsoluteJS</a>\n\t<app-dropdown></app-dropdown>\n</header>\n<app-root [initialCount]=\"initialCount\"></app-root>\n";
|
|
4
|
-
export declare const generateAppComponent: (
|
|
5
|
-
export declare const generateAppComponentCss: () => string;
|
|
4
|
+
export declare const generateAppComponent: () => string;
|
|
6
5
|
export declare const generateAppComponentHtml: (frontends: Frontend[], editBasePath: string) => string;
|
|
7
|
-
export declare const generateCounterComponent: (
|
|
8
|
-
export declare const generateCounterComponentHtml: () => string;
|
|
6
|
+
export declare const generateCounterComponent: (stylesRelativeDirectory: string) => string;
|
|
9
7
|
export declare const generateCounterComponentCss: () => string;
|
|
10
|
-
export declare const
|
|
8
|
+
export declare const generateCounterComponentHtml: () => string;
|
|
9
|
+
export declare const generateDropdownComponent: () => string;
|
|
11
10
|
export declare const generateDropdownComponentHtml: (frontends: Frontend[]) => string;
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { formatNavLink } from '../../utils/formatNavLink';
|
|
2
|
-
|
|
3
|
-
export const generateAngularPage = (_frontends, includeExamples) => {
|
|
2
|
+
export const generateAngularPage = (includeExamples) => {
|
|
4
3
|
if (!includeExamples)
|
|
5
4
|
return `import { Component } from '@angular/core';
|
|
6
5
|
import { CommonModule } from '@angular/common';
|
|
7
|
-
import { defineAngularPage } from '@absolutejs/absolute/angular';
|
|
8
6
|
|
|
9
|
-
type
|
|
7
|
+
export type Context = {
|
|
10
8
|
initialCount: number;
|
|
11
9
|
};
|
|
12
10
|
|
|
@@ -18,19 +16,16 @@ type AngularPageProps = {
|
|
|
18
16
|
})
|
|
19
17
|
export class AngularExampleComponent {}
|
|
20
18
|
|
|
21
|
-
export const
|
|
22
|
-
component: AngularExampleComponent
|
|
23
|
-
});
|
|
19
|
+
export const factory = () => AngularExampleComponent;
|
|
24
20
|
`;
|
|
25
|
-
return `import { Component
|
|
21
|
+
return `import { Component } from '@angular/core';
|
|
26
22
|
import { CommonModule } from '@angular/common';
|
|
27
|
-
import {
|
|
23
|
+
import { usePageContext } from '@absolutejs/absolute/angular';
|
|
28
24
|
import { DropdownComponent } from '../components/dropdown.component';
|
|
29
25
|
import { AppComponent } from '../components/app.component';
|
|
30
26
|
|
|
31
|
-
export const INITIAL_COUNT = new InjectionToken<number>('INITIAL_COUNT');
|
|
32
27
|
|
|
33
|
-
type
|
|
28
|
+
export type Context = {
|
|
34
29
|
initialCount: number;
|
|
35
30
|
};
|
|
36
31
|
|
|
@@ -41,17 +36,10 @@ type AngularPageProps = {
|
|
|
41
36
|
templateUrl: '../templates/angular-example.html'
|
|
42
37
|
})
|
|
43
38
|
export class AngularExampleComponent {
|
|
44
|
-
initialCount
|
|
45
|
-
|
|
46
|
-
constructor() {
|
|
47
|
-
const initialCountToken = inject(INITIAL_COUNT, { optional: true });
|
|
48
|
-
this.initialCount = initialCountToken ?? 0;
|
|
49
|
-
}
|
|
39
|
+
initialCount = usePageContext<Context>().initialCount;
|
|
50
40
|
}
|
|
51
41
|
|
|
52
|
-
export const
|
|
53
|
-
component: AngularExampleComponent
|
|
54
|
-
});
|
|
42
|
+
export const factory = () => AngularExampleComponent;
|
|
55
43
|
`;
|
|
56
44
|
};
|
|
57
45
|
export const generateAngularPageHtml = (includeExamples) => {
|
|
@@ -64,7 +52,7 @@ export const generateAngularPageHtml = (includeExamples) => {
|
|
|
64
52
|
<app-root [initialCount]="initialCount"></app-root>
|
|
65
53
|
`;
|
|
66
54
|
};
|
|
67
|
-
export const generateAppComponent = (
|
|
55
|
+
export const generateAppComponent = () => `import { Component, Input, ViewEncapsulation } from '@angular/core';
|
|
68
56
|
import { CommonModule } from '@angular/common';
|
|
69
57
|
import { CounterComponent } from './counter.component';
|
|
70
58
|
|
|
@@ -73,14 +61,12 @@ import { CounterComponent } from './counter.component';
|
|
|
73
61
|
standalone: true,
|
|
74
62
|
imports: [CommonModule, CounterComponent],
|
|
75
63
|
templateUrl: '../templates/app.component.html',
|
|
76
|
-
styleUrl: '${isSingleFrontend ? '../' : '../../'}styles/app.component.css',
|
|
77
64
|
encapsulation: ViewEncapsulation.None
|
|
78
65
|
})
|
|
79
66
|
export class AppComponent {
|
|
80
67
|
@Input() initialCount: number = 0;
|
|
81
68
|
}
|
|
82
69
|
`;
|
|
83
|
-
export const generateAppComponentCss = () => ``;
|
|
84
70
|
export const generateAppComponentHtml = (frontends, editBasePath) => {
|
|
85
71
|
const exploreBlock = frontends.length > 1
|
|
86
72
|
? `\n\t<p style="margin-top: 2rem">\n\t\tExplore the other pages to see multiple frameworks running\n\t\ttogether.\n\t</p>`
|
|
@@ -114,7 +100,7 @@ export const generateAppComponentHtml = (frontends, editBasePath) => {
|
|
|
114
100
|
</main>
|
|
115
101
|
`;
|
|
116
102
|
};
|
|
117
|
-
export const generateCounterComponent = (
|
|
103
|
+
export const generateCounterComponent = (stylesRelativeDirectory) => `import { Component, Input } from '@angular/core';
|
|
118
104
|
import { CommonModule } from '@angular/common';
|
|
119
105
|
|
|
120
106
|
@Component({
|
|
@@ -122,7 +108,7 @@ import { CommonModule } from '@angular/common';
|
|
|
122
108
|
standalone: true,
|
|
123
109
|
imports: [CommonModule],
|
|
124
110
|
templateUrl: '../templates/counter.component.html',
|
|
125
|
-
styleUrl: '${
|
|
111
|
+
styleUrl: '${stylesRelativeDirectory}/counter.component.css'
|
|
126
112
|
})
|
|
127
113
|
export class CounterComponent {
|
|
128
114
|
@Input() initialCount: number = 0;
|
|
@@ -137,10 +123,6 @@ export class CounterComponent {
|
|
|
137
123
|
}
|
|
138
124
|
}
|
|
139
125
|
`;
|
|
140
|
-
export const generateCounterComponentHtml = () => `<button (click)="increment()">
|
|
141
|
-
count is <span class="counter-value">{{ count }}</span>
|
|
142
|
-
</button>
|
|
143
|
-
`;
|
|
144
126
|
export const generateCounterComponentCss = () => `button {
|
|
145
127
|
background-color: #1a1a1a;
|
|
146
128
|
border: 1px solid transparent;
|
|
@@ -168,9 +150,11 @@ button:focus-visible {
|
|
|
168
150
|
}
|
|
169
151
|
}
|
|
170
152
|
`;
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
153
|
+
export const generateCounterComponentHtml = () => `<button (click)="increment()">
|
|
154
|
+
count is <span class="counter-value">{{ count }}</span>
|
|
155
|
+
</button>
|
|
156
|
+
`;
|
|
157
|
+
export const generateDropdownComponent = () => `import { Component } from '@angular/core';
|
|
174
158
|
import { CommonModule } from '@angular/common';
|
|
175
159
|
|
|
176
160
|
@Component({
|
|
@@ -183,7 +167,6 @@ export class DropdownComponent {
|
|
|
183
167
|
isOpen = false;
|
|
184
168
|
}
|
|
185
169
|
`;
|
|
186
|
-
};
|
|
187
170
|
export const generateDropdownComponentHtml = (frontends) => {
|
|
188
171
|
const navLinks = frontends.map(formatNavLink).join('\n\t\t');
|
|
189
172
|
return `<details
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { ScaffoldFrontendProps } from '../../types';
|
|
2
|
-
export declare const scaffoldAngular: ({ editBasePath, includeExamples,
|
|
2
|
+
export declare const scaffoldAngular: ({ editBasePath, includeExamples, targetDirectory, frontends, templatesDirectory, projectAssetsDirectory, stylesDirectory, stylesIndexesDirectory }: ScaffoldFrontendProps) => void;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { copyFileSync, mkdirSync, writeFileSync } from 'fs';
|
|
2
|
-
import { join } from 'path';
|
|
2
|
+
import { join, relative } from 'path';
|
|
3
3
|
import { generateMarkupCSS } from '../project/generateMarkupCSS';
|
|
4
|
-
import { generateAngularPage, generateAngularPageHtml, generateAppComponent,
|
|
5
|
-
export const scaffoldAngular = ({ editBasePath, includeExamples,
|
|
4
|
+
import { generateAngularPage, generateAngularPageHtml, generateAppComponent, generateAppComponentHtml, generateCounterComponent, generateCounterComponentCss, generateCounterComponentHtml, generateDropdownComponent, generateDropdownComponentHtml } from './generateAngularPage';
|
|
5
|
+
export const scaffoldAngular = ({ editBasePath, includeExamples, targetDirectory, frontends, templatesDirectory, projectAssetsDirectory, stylesDirectory, stylesIndexesDirectory }) => {
|
|
6
6
|
const pagesDirectory = join(targetDirectory, 'pages');
|
|
7
7
|
const templatesDir = join(targetDirectory, 'templates');
|
|
8
8
|
if (!includeExamples) {
|
|
9
9
|
mkdirSync(pagesDirectory, { recursive: true });
|
|
10
10
|
mkdirSync(templatesDir, { recursive: true });
|
|
11
|
-
writeFileSync(join(pagesDirectory, 'angular-example.ts'), generateAngularPage(
|
|
11
|
+
writeFileSync(join(pagesDirectory, 'angular-example.ts'), generateAngularPage(false), 'utf-8');
|
|
12
12
|
writeFileSync(join(templatesDir, 'angular-example.html'), generateAngularPageHtml(false), 'utf-8');
|
|
13
13
|
writeFileSync(join(stylesIndexesDirectory, 'angular-example.css'), `@import url('../reset.css');\n\nangular-page {\n\tdisplay: flex;\n\tflex: 1;\n\tflex-direction: column;\n}\n`, 'utf-8');
|
|
14
14
|
return;
|
|
@@ -18,14 +18,13 @@ export const scaffoldAngular = ({ editBasePath, includeExamples, isSingleFronten
|
|
|
18
18
|
mkdirSync(componentsDirectory, { recursive: true });
|
|
19
19
|
mkdirSync(pagesDirectory, { recursive: true });
|
|
20
20
|
mkdirSync(templatesDir, { recursive: true });
|
|
21
|
-
writeFileSync(join(pagesDirectory, 'angular-example.ts'), generateAngularPage(
|
|
21
|
+
writeFileSync(join(pagesDirectory, 'angular-example.ts'), generateAngularPage(true), 'utf-8');
|
|
22
22
|
writeFileSync(join(templatesDir, 'angular-example.html'), generateAngularPageHtml(true), 'utf-8');
|
|
23
|
-
writeFileSync(join(componentsDirectory, 'dropdown.component.ts'), generateDropdownComponent(
|
|
23
|
+
writeFileSync(join(componentsDirectory, 'dropdown.component.ts'), generateDropdownComponent(), 'utf-8');
|
|
24
24
|
writeFileSync(join(templatesDir, 'dropdown.component.html'), generateDropdownComponentHtml(frontends), 'utf-8');
|
|
25
|
-
writeFileSync(join(componentsDirectory, 'app.component.ts'), generateAppComponent(
|
|
25
|
+
writeFileSync(join(componentsDirectory, 'app.component.ts'), generateAppComponent(), 'utf-8');
|
|
26
26
|
writeFileSync(join(templatesDir, 'app.component.html'), generateAppComponentHtml(frontends, editBasePath), 'utf-8');
|
|
27
|
-
writeFileSync(join(
|
|
28
|
-
writeFileSync(join(componentsDirectory, 'counter.component.ts'), generateCounterComponent(isSingleFrontend), 'utf-8');
|
|
27
|
+
writeFileSync(join(componentsDirectory, 'counter.component.ts'), generateCounterComponent(relative(componentsDirectory, stylesDirectory).replaceAll('\\', '/')), 'utf-8');
|
|
29
28
|
writeFileSync(join(templatesDir, 'counter.component.html'), generateCounterComponentHtml(), 'utf-8');
|
|
30
29
|
writeFileSync(join(stylesDirectory, 'counter.component.css'), generateCounterComponentCss(), 'utf-8');
|
|
31
30
|
const angularCSS = generateMarkupCSS('angular', '#dd0031');
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AvailableDrizzleDialect, DatabaseHost } from '../../types';
|
|
2
2
|
type CreateDrizzleConfigProps = {
|
|
3
3
|
projectName: string;
|
|
4
|
-
databaseEngine:
|
|
4
|
+
databaseEngine: AvailableDrizzleDialect;
|
|
5
|
+
databaseHost: DatabaseHost;
|
|
5
6
|
databaseDirectory: string;
|
|
6
7
|
};
|
|
7
|
-
export declare const createDrizzleConfig: ({ projectName,
|
|
8
|
+
export declare const createDrizzleConfig: ({ projectName, ...options }: CreateDrizzleConfigProps) => void;
|
|
9
|
+
export declare const generateDrizzleConfig: ({ databaseDirectory, databaseEngine, databaseHost }: Omit<CreateDrizzleConfigProps, "projectName">) => string;
|
|
8
10
|
export {};
|
|
@@ -1,21 +1,47 @@
|
|
|
1
1
|
import { writeFileSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { env } from 'process';
|
|
6
|
-
|
|
7
|
-
if (!env.DATABASE_URL) {
|
|
3
|
+
import { getDrizzleKitDialect } from '../db/drizzleTargets';
|
|
4
|
+
const requireDatabaseUrl = `if (!env.DATABASE_URL) {
|
|
8
5
|
throw new Error('DATABASE_URL must be set in the environment variables');
|
|
9
6
|
}
|
|
7
|
+
`;
|
|
8
|
+
export const createDrizzleConfig = ({ projectName, ...options }) => {
|
|
9
|
+
writeFileSync(join(projectName, 'drizzle.config.ts'), generateDrizzleConfig(options));
|
|
10
|
+
};
|
|
11
|
+
export const generateDrizzleConfig = ({ databaseDirectory, databaseEngine, databaseHost }) => {
|
|
12
|
+
const dialect = getDrizzleKitDialect(databaseEngine, databaseHost);
|
|
13
|
+
const paths = `out: '${databaseDirectory}/migrations',
|
|
14
|
+
schema: '${databaseDirectory}/schema.ts'`;
|
|
15
|
+
/* Local SQLite lives in a file beside the schema — the same path the server
|
|
16
|
+
opens — so migrations need no environment at all. */
|
|
17
|
+
if (dialect === 'sqlite') {
|
|
18
|
+
return `import { defineConfig } from 'drizzle-kit';
|
|
19
|
+
|
|
20
|
+
export default defineConfig({
|
|
21
|
+
dbCredentials: {
|
|
22
|
+
url: '${databaseDirectory}/database.sqlite'
|
|
23
|
+
},
|
|
24
|
+
dialect: 'sqlite',
|
|
25
|
+
${paths}
|
|
26
|
+
});
|
|
27
|
+
`;
|
|
28
|
+
}
|
|
29
|
+
/* Turso speaks libSQL: a \`libsql://\` URL plus an auth token in the cloud,
|
|
30
|
+
or a \`file:\` URL with no token for a local libSQL database. */
|
|
31
|
+
const credentials = dialect === 'turso'
|
|
32
|
+
? `authToken: env.DATABASE_AUTH_TOKEN,
|
|
33
|
+
url: env.DATABASE_URL`
|
|
34
|
+
: 'url: env.DATABASE_URL';
|
|
35
|
+
return `import { env } from 'process';
|
|
36
|
+
import { defineConfig } from 'drizzle-kit';
|
|
10
37
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
38
|
+
${requireDatabaseUrl}
|
|
39
|
+
export default defineConfig({
|
|
40
|
+
dbCredentials: {
|
|
41
|
+
${credentials}
|
|
42
|
+
},
|
|
43
|
+
dialect: '${dialect}',
|
|
44
|
+
${paths}
|
|
45
|
+
});
|
|
19
46
|
`;
|
|
20
|
-
writeFileSync(join(projectName, 'drizzle.config.ts'), drizzleConfig);
|
|
21
47
|
};
|
|
@@ -18,6 +18,12 @@ export const generateEnv = ({ databaseEngine, databaseHost, envVariables = [], p
|
|
|
18
18
|
(databaseHost === 'none' || databaseHost === undefined)) {
|
|
19
19
|
vars.push(`DATABASE_URL=${databaseURLS[databaseEngine]}`);
|
|
20
20
|
}
|
|
21
|
+
/* A Turso project starts on a local libSQL file so it runs (and migrates)
|
|
22
|
+
before a cloud database exists; pointing it at Turso is two variables. */
|
|
23
|
+
const setsDatabaseUrl = vars.some((entry) => entry.startsWith('DATABASE_URL='));
|
|
24
|
+
if (databaseHost === 'turso' && !setsDatabaseUrl) {
|
|
25
|
+
vars.push('# Local libSQL file. For Turso use DATABASE_URL=libsql://<database>.turso.io and set DATABASE_AUTH_TOKEN.', 'DATABASE_URL=file:db/database.db');
|
|
26
|
+
}
|
|
21
27
|
if (vars.length === 0)
|
|
22
28
|
return;
|
|
23
29
|
const envPath = join(projectName, '.env');
|
|
@@ -6,7 +6,8 @@ import absolute from 'eslint-plugin-absolute';
|
|
|
6
6
|
${frontends.includes('react') ? "import reactHooks from 'eslint-plugin-react-hooks';" : ''}
|
|
7
7
|
|
|
8
8
|
export default defineConfig([
|
|
9
|
-
|
|
9
|
+
// The copied HTMX distribution is third-party minified runtime code.
|
|
10
|
+
{ ignores: ['src/frontend/**/htmx.min.js', 'node_modules/**', 'build/**', 'dist/**', '.absolutejs/**', '.data/**', '**/.absolutejs-hmr-*', 'drizzle/**'] },
|
|
10
11
|
{ linterOptions: { noInlineConfig: true, reportUnusedDisableDirectives: 'error' } },
|
|
11
12
|
...tseslint.configs.recommended,
|
|
12
13
|
{
|
|
@@ -42,7 +43,8 @@ export default defineConfig([
|
|
|
42
43
|
{ files: ['**/*.{html,vue,svelte,gjs,gts}'], plugins: { absolute }, processor: 'absolute/template-source' },
|
|
43
44
|
${frontends.includes('react')
|
|
44
45
|
? `{
|
|
45
|
-
|
|
46
|
+
// React Hooks rules do not apply to Angular's unrelated usePageContext API.
|
|
47
|
+
files: ['src/frontend/**/*.{tsx,jsx}', 'src/frontend/**/hooks/**/*.{ts,js}'],
|
|
46
48
|
plugins: { 'react-hooks': reactHooks },
|
|
47
49
|
rules: { 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'error' },
|
|
48
50
|
},`
|
|
@@ -118,6 +118,19 @@ export const createPackageJson = async ({ agentic, projectName, authOption, plug
|
|
|
118
118
|
packageNames.add('mssql');
|
|
119
119
|
packageNames.add('@types/mssql');
|
|
120
120
|
}
|
|
121
|
+
/* drizzle-orm/cockroach (and drizzle-kit's cockroach dialect) drive
|
|
122
|
+
CockroachDB through node-postgres. */
|
|
123
|
+
const usesCockroachDrizzle = isLocal && databaseEngine === 'cockroachdb' && orm === 'drizzle';
|
|
124
|
+
if (usesCockroachDrizzle) {
|
|
125
|
+
packageNames.add('pg');
|
|
126
|
+
packageNames.add('@types/pg');
|
|
127
|
+
}
|
|
128
|
+
/* drizzle-kit migrates through the first Postgres driver it can import,
|
|
129
|
+
trying pg before Neon's serverless driver (which @absolutejs/auth brings
|
|
130
|
+
in transitively and which cannot reach a local database). */
|
|
131
|
+
const needsKitPostgresDriver = isLocal && databaseEngine === 'postgresql' && orm === 'drizzle';
|
|
132
|
+
if (needsKitPostgresDriver)
|
|
133
|
+
packageNames.add('pg');
|
|
121
134
|
if (isLocal && databaseEngine === 'gel')
|
|
122
135
|
packageNames.add('gel');
|
|
123
136
|
if (databaseEngine === 'mongodb')
|
|
@@ -147,7 +160,7 @@ export const createPackageJson = async ({ agentic, projectName, authOption, plug
|
|
|
147
160
|
dependencies[absoluteAuthPlugin.value] = resolveVersion(absoluteAuthPlugin.value, absoluteAuthPlugin.latestVersion);
|
|
148
161
|
}
|
|
149
162
|
if (agentic) {
|
|
150
|
-
|
|
163
|
+
[
|
|
151
164
|
'@absolutejs/a2a',
|
|
152
165
|
'@absolutejs/agency',
|
|
153
166
|
'@absolutejs/agent-discovery',
|
|
@@ -166,9 +179,9 @@ export const createPackageJson = async ({ agentic, projectName, authOption, plug
|
|
|
166
179
|
'@absolutejs/secrets',
|
|
167
180
|
'@absolutejs/sync-bus-pg',
|
|
168
181
|
'@absolutejs/wallet'
|
|
169
|
-
]) {
|
|
182
|
+
].forEach((name) => {
|
|
170
183
|
dependencies[name] = resolveVersion(name, versions[name]);
|
|
171
|
-
}
|
|
184
|
+
});
|
|
172
185
|
devDependencies['@absolutejs/agent-conformance'] = resolveVersion('@absolutejs/agent-conformance', versions['@absolutejs/agent-conformance']);
|
|
173
186
|
}
|
|
174
187
|
for (const pluginValue of plugins) {
|
|
@@ -279,6 +292,13 @@ export const createPackageJson = async ({ agentic, projectName, authOption, plug
|
|
|
279
292
|
dependencies['mssql'] = resolveVersion('mssql', versions['mssql']);
|
|
280
293
|
devDependencies['@types/mssql'] = resolveVersion('@types/mssql', versions['@types/mssql']);
|
|
281
294
|
}
|
|
295
|
+
if (needsKitPostgresDriver) {
|
|
296
|
+
devDependencies['pg'] = resolveVersion('pg', versions['pg']);
|
|
297
|
+
}
|
|
298
|
+
if (usesCockroachDrizzle) {
|
|
299
|
+
dependencies['pg'] = resolveVersion('pg', versions['pg']);
|
|
300
|
+
devDependencies['@types/pg'] = resolveVersion('@types/pg', versions['@types/pg']);
|
|
301
|
+
}
|
|
282
302
|
if (isLocalDb && databaseEngine === 'gel') {
|
|
283
303
|
dependencies['gel'] = resolveVersion('gel', versions['gel']);
|
|
284
304
|
}
|
|
@@ -287,11 +307,18 @@ export const createPackageJson = async ({ agentic, projectName, authOption, plug
|
|
|
287
307
|
}
|
|
288
308
|
if (isLocalDb && databaseEngine === 'sqlite') {
|
|
289
309
|
scripts['db:sqlite'] = 'sqlite3 db/database.sqlite';
|
|
290
|
-
|
|
310
|
+
}
|
|
311
|
+
if (isLocalDb && databaseEngine === 'sqlite' && orm !== 'drizzle') {
|
|
312
|
+
scripts['db:init'] = 'sqlite3 db/database.sqlite < db/schema.sql';
|
|
291
313
|
}
|
|
292
314
|
if (orm === 'drizzle') {
|
|
293
|
-
|
|
294
|
-
|
|
315
|
+
/* Migrations are the schema's source of truth: `db:generate` diffs
|
|
316
|
+
db/schema.ts into a new committed migration and `db:migrate` applies
|
|
317
|
+
pending ones. drizzle-kit runs on Bun so it can use Bun's own SQL and
|
|
318
|
+
SQLite drivers, exactly as the server does. */
|
|
319
|
+
scripts['db:generate'] = 'bun --bun drizzle-kit generate';
|
|
320
|
+
scripts['db:migrate'] = 'bun --bun drizzle-kit migrate';
|
|
321
|
+
scripts['db:studio'] = 'bun --bun drizzle-kit studio';
|
|
295
322
|
/* `drizzle.config.ts` imports it and the scripts above shell out to it. */
|
|
296
323
|
devDependencies['drizzle-kit'] = resolveVersion('drizzle-kit', versions['drizzle-kit']);
|
|
297
324
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AvailableDrizzleDialect, DatabaseHost } from '../../types';
|
|
2
|
+
export declare const drizzleKitDialects: readonly ["cockroach", "mssql", "mysql", "postgresql", "singlestore", "sqlite", "turso"];
|
|
3
|
+
export type DrizzleKitDialect = (typeof drizzleKitDialects)[number];
|
|
4
|
+
export declare const getDrizzleKitDialect: (databaseEngine: AvailableDrizzleDialect, databaseHost: DatabaseHost) => "mssql" | "mysql" | "postgresql" | "singlestore" | "sqlite" | "turso" | "cockroach";
|
|
5
|
+
export declare const getMigrationTemplateName: (kitDialect: DrizzleKitDialect, usesAuth: boolean) => string;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* The `dialect` values drizzle-kit 1.0 accepts in drizzle.config.ts. Turso is
|
|
2
|
+
its own kit dialect (libSQL over HTTP/WebSocket with an auth token), even
|
|
3
|
+
though its tables are written with sqlite-core. */
|
|
4
|
+
export const drizzleKitDialects = [
|
|
5
|
+
'cockroach',
|
|
6
|
+
'mssql',
|
|
7
|
+
'mysql',
|
|
8
|
+
'postgresql',
|
|
9
|
+
'singlestore',
|
|
10
|
+
'sqlite',
|
|
11
|
+
'turso'
|
|
12
|
+
];
|
|
13
|
+
const engineKitDialects = {
|
|
14
|
+
cockroachdb: 'cockroach',
|
|
15
|
+
mariadb: 'mysql',
|
|
16
|
+
mssql: 'mssql',
|
|
17
|
+
mysql: 'mysql',
|
|
18
|
+
postgresql: 'postgresql',
|
|
19
|
+
singlestore: 'singlestore',
|
|
20
|
+
sqlite: 'sqlite'
|
|
21
|
+
};
|
|
22
|
+
export const getDrizzleKitDialect = (databaseEngine, databaseHost) => databaseEngine === 'sqlite' && databaseHost === 'turso'
|
|
23
|
+
? 'turso'
|
|
24
|
+
: engineKitDialects[databaseEngine];
|
|
25
|
+
/* The directory holding the committed initial migration for a kit dialect and
|
|
26
|
+
example table (users when auth is on, count_history otherwise). */
|
|
27
|
+
export const getMigrationTemplateName = (kitDialect, usesAuth) => `${kitDialect}-${usesAuth ? 'users' : 'count-history'}`;
|