neoorm 0.1.4 → 0.2.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/README.md +423 -27
- package/dist/bin/neoorm.js +117 -30
- package/dist/bin/neoorm.js.map +1 -1
- package/dist/codegen/diff-manifest.d.ts +7 -1
- package/dist/codegen/diff-manifest.d.ts.map +1 -1
- package/dist/codegen/diff-manifest.js +100 -4
- package/dist/codegen/diff-manifest.js.map +1 -1
- package/dist/codegen/emit-includes.d.ts.map +1 -1
- package/dist/codegen/emit-includes.js +7 -1
- package/dist/codegen/emit-includes.js.map +1 -1
- package/dist/codegen/emit-models.d.ts.map +1 -1
- package/dist/codegen/emit-models.js +28 -6
- package/dist/codegen/emit-models.js.map +1 -1
- package/dist/codegen/generate-summary.d.ts +21 -0
- package/dist/codegen/generate-summary.d.ts.map +1 -0
- package/dist/codegen/generate-summary.js +101 -0
- package/dist/codegen/generate-summary.js.map +1 -0
- package/dist/codegen/generate.d.ts +12 -3
- package/dist/codegen/generate.d.ts.map +1 -1
- package/dist/codegen/generate.js +36 -13
- package/dist/codegen/generate.js.map +1 -1
- package/dist/codegen/manifest-relations.d.ts.map +1 -1
- package/dist/codegen/manifest-relations.js +9 -2
- package/dist/codegen/manifest-relations.js.map +1 -1
- package/dist/codegen/schema-to-manifest.d.ts +4 -1
- package/dist/codegen/schema-to-manifest.d.ts.map +1 -1
- package/dist/codegen/schema-to-manifest.js +69 -12
- package/dist/codegen/schema-to-manifest.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/dialect/postgres.d.ts +3 -0
- package/dist/dialect/postgres.d.ts.map +1 -1
- package/dist/dialect/postgres.js +51 -1
- package/dist/dialect/postgres.js.map +1 -1
- package/dist/dialect/types.d.ts +13 -1
- package/dist/dialect/types.d.ts.map +1 -1
- package/dist/index.d.ts +11 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/init/scaffold.d.ts +19 -0
- package/dist/init/scaffold.d.ts.map +1 -0
- package/dist/init/scaffold.js +92 -0
- package/dist/init/scaffold.js.map +1 -0
- package/dist/init/templates.d.ts +4 -0
- package/dist/init/templates.d.ts.map +1 -0
- package/dist/init/templates.js +44 -0
- package/dist/init/templates.js.map +1 -0
- package/dist/introspect/queries.d.ts +5 -0
- package/dist/introspect/queries.d.ts.map +1 -1
- package/dist/introspect/queries.js +17 -0
- package/dist/introspect/queries.js.map +1 -1
- package/dist/introspect/to-manifest.d.ts.map +1 -1
- package/dist/introspect/to-manifest.js +58 -14
- package/dist/introspect/to-manifest.js.map +1 -1
- package/dist/migrate/runner.d.ts +26 -0
- package/dist/migrate/runner.d.ts.map +1 -1
- package/dist/migrate/runner.js +166 -7
- package/dist/migrate/runner.js.map +1 -1
- package/dist/plugins/builtin.d.ts +35 -2
- package/dist/plugins/builtin.d.ts.map +1 -1
- package/dist/plugins/builtin.js +318 -1
- package/dist/plugins/builtin.js.map +1 -1
- package/dist/plugins/json/operators.d.ts +3 -0
- package/dist/plugins/json/operators.d.ts.map +1 -0
- package/dist/plugins/json/operators.js +65 -0
- package/dist/plugins/json/operators.js.map +1 -0
- package/dist/plugins/registry.d.ts.map +1 -1
- package/dist/plugins/registry.js +3 -1
- package/dist/plugins/registry.js.map +1 -1
- package/dist/plugins/types.d.ts +1 -0
- package/dist/plugins/types.d.ts.map +1 -1
- package/dist/runtime/client.d.ts +33 -3
- package/dist/runtime/client.d.ts.map +1 -1
- package/dist/runtime/client.js +54 -36
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/errors.d.ts +20 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/errors.js +68 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/executor.d.ts +1 -0
- package/dist/runtime/executor.d.ts.map +1 -1
- package/dist/runtime/executor.js +27 -4
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/pg-error.d.ts +19 -0
- package/dist/runtime/pg-error.d.ts.map +1 -0
- package/dist/runtime/pg-error.js +110 -0
- package/dist/runtime/pg-error.js.map +1 -0
- package/dist/runtime/query/aggregate.d.ts +11 -0
- package/dist/runtime/query/aggregate.d.ts.map +1 -0
- package/dist/runtime/query/aggregate.js +44 -0
- package/dist/runtime/query/aggregate.js.map +1 -0
- package/dist/runtime/query/compile.d.ts +21 -6
- package/dist/runtime/query/compile.d.ts.map +1 -1
- package/dist/runtime/query/compile.js +110 -19
- package/dist/runtime/query/compile.js.map +1 -1
- package/dist/runtime/query/count.d.ts +3 -3
- package/dist/runtime/query/count.d.ts.map +1 -1
- package/dist/runtime/query/count.js +7 -4
- package/dist/runtime/query/count.js.map +1 -1
- package/dist/runtime/query/create.d.ts +12 -2
- package/dist/runtime/query/create.d.ts.map +1 -1
- package/dist/runtime/query/create.js +74 -111
- package/dist/runtime/query/create.js.map +1 -1
- package/dist/runtime/query/cursor-codec.d.ts +3 -0
- package/dist/runtime/query/cursor-codec.d.ts.map +1 -0
- package/dist/runtime/query/cursor-codec.js +27 -0
- package/dist/runtime/query/cursor-codec.js.map +1 -0
- package/dist/runtime/query/cursor.d.ts +22 -0
- package/dist/runtime/query/cursor.d.ts.map +1 -0
- package/dist/runtime/query/cursor.js +84 -0
- package/dist/runtime/query/cursor.js.map +1 -0
- package/dist/runtime/query/delete.d.ts +4 -4
- package/dist/runtime/query/delete.d.ts.map +1 -1
- package/dist/runtime/query/delete.js +18 -8
- package/dist/runtime/query/delete.js.map +1 -1
- package/dist/runtime/query/execute.d.ts +16 -0
- package/dist/runtime/query/execute.d.ts.map +1 -0
- package/dist/runtime/query/execute.js +74 -0
- package/dist/runtime/query/execute.js.map +1 -0
- package/dist/runtime/query/find.d.ts +7 -5
- package/dist/runtime/query/find.d.ts.map +1 -1
- package/dist/runtime/query/find.js +148 -29
- package/dist/runtime/query/find.js.map +1 -1
- package/dist/runtime/query/paginate.d.ts +17 -0
- package/dist/runtime/query/paginate.d.ts.map +1 -0
- package/dist/runtime/query/paginate.js +35 -0
- package/dist/runtime/query/paginate.js.map +1 -0
- package/dist/runtime/query/primary-key.d.ts +11 -1
- package/dist/runtime/query/primary-key.d.ts.map +1 -1
- package/dist/runtime/query/primary-key.js +55 -0
- package/dist/runtime/query/primary-key.js.map +1 -1
- package/dist/runtime/query/relation-writes.d.ts +25 -0
- package/dist/runtime/query/relation-writes.d.ts.map +1 -0
- package/dist/runtime/query/relation-writes.js +404 -0
- package/dist/runtime/query/relation-writes.js.map +1 -0
- package/dist/runtime/query/unique.d.ts.map +1 -1
- package/dist/runtime/query/unique.js +1 -5
- package/dist/runtime/query/unique.js.map +1 -1
- package/dist/runtime/query/update.d.ts +4 -4
- package/dist/runtime/query/update.d.ts.map +1 -1
- package/dist/runtime/query/update.js +97 -38
- package/dist/runtime/query/update.js.map +1 -1
- package/dist/runtime/query/updated-at.d.ts +6 -0
- package/dist/runtime/query/updated-at.d.ts.map +1 -0
- package/dist/runtime/query/updated-at.js +21 -0
- package/dist/runtime/query/updated-at.js.map +1 -0
- package/dist/runtime/query/upsert.d.ts +2 -2
- package/dist/runtime/query/upsert.d.ts.map +1 -1
- package/dist/runtime/query/upsert.js +12 -8
- package/dist/runtime/query/upsert.js.map +1 -1
- package/dist/runtime/types.d.ts +21 -11
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/schema/column-where.d.ts +30 -14
- package/dist/schema/column-where.d.ts.map +1 -1
- package/dist/schema/column.d.ts +6 -2
- package/dist/schema/column.d.ts.map +1 -1
- package/dist/schema/column.js +7 -1
- package/dist/schema/column.js.map +1 -1
- package/dist/schema/index.d.ts +4 -4
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +1 -1
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/nested-relation-types.d.ts +61 -0
- package/dist/schema/nested-relation-types.d.ts.map +1 -0
- package/dist/schema/nested-relation-types.js +2 -0
- package/dist/schema/nested-relation-types.js.map +1 -0
- package/dist/schema/relation-types.d.ts +164 -22
- package/dist/schema/relation-types.d.ts.map +1 -1
- package/dist/schema/types.d.ts +83 -37
- package/dist/schema/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { access, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join, relative, resolve } from "node:path";
|
|
3
|
+
import { generateFromSchema } from "../codegen/generate.js";
|
|
4
|
+
import { envExampleTemplate, neoormConfigTemplate, schemaTemplate, } from "./templates.js";
|
|
5
|
+
const CONFIG_FILE = "neoorm.config.ts";
|
|
6
|
+
const ENV_EXAMPLE_FILE = ".env.example";
|
|
7
|
+
async function fileExists(path) {
|
|
8
|
+
try {
|
|
9
|
+
await access(path);
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function toDisplayPath(cwd, absolutePath) {
|
|
17
|
+
const rel = relative(cwd, absolutePath);
|
|
18
|
+
return rel.startsWith("..") ? absolutePath : rel || ".";
|
|
19
|
+
}
|
|
20
|
+
export async function runInit(options = {}) {
|
|
21
|
+
const cwd = resolve(options.cwd ?? process.cwd());
|
|
22
|
+
const schemaRel = options.schemaPath ?? "./schema.ts";
|
|
23
|
+
const outRel = options.outDir ?? "./neoorm";
|
|
24
|
+
const schemaPath = resolve(cwd, schemaRel);
|
|
25
|
+
const outDir = resolve(cwd, outRel);
|
|
26
|
+
const configPath = join(cwd, CONFIG_FILE);
|
|
27
|
+
const envExamplePath = join(cwd, ENV_EXAMPLE_FILE);
|
|
28
|
+
const scaffoldTargets = [
|
|
29
|
+
{ path: configPath, label: CONFIG_FILE },
|
|
30
|
+
{ path: schemaPath, label: toDisplayPath(cwd, schemaPath) },
|
|
31
|
+
{ path: envExamplePath, label: ENV_EXAMPLE_FILE },
|
|
32
|
+
];
|
|
33
|
+
const existing = [];
|
|
34
|
+
for (const target of scaffoldTargets) {
|
|
35
|
+
if (await fileExists(target.path)) {
|
|
36
|
+
existing.push(target.label);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (existing.length > 0 && !options.force) {
|
|
40
|
+
throw new Error(`Scaffold files already exist: ${existing.join(", ")}. Re-run with --force to overwrite.`);
|
|
41
|
+
}
|
|
42
|
+
const written = [];
|
|
43
|
+
const skipped = [];
|
|
44
|
+
const filesToWrite = [
|
|
45
|
+
{
|
|
46
|
+
path: configPath,
|
|
47
|
+
label: CONFIG_FILE,
|
|
48
|
+
content: neoormConfigTemplate(schemaRel, outRel),
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
path: schemaPath,
|
|
52
|
+
label: toDisplayPath(cwd, schemaPath),
|
|
53
|
+
content: schemaTemplate(),
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
path: envExamplePath,
|
|
57
|
+
label: ENV_EXAMPLE_FILE,
|
|
58
|
+
content: envExampleTemplate(),
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
for (const file of filesToWrite) {
|
|
62
|
+
if (!options.force && (await fileExists(file.path))) {
|
|
63
|
+
skipped.push(file.label);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
await writeFile(file.path, file.content, "utf-8");
|
|
67
|
+
written.push(file.label);
|
|
68
|
+
}
|
|
69
|
+
const { migrationName, summary, warnings } = await generateFromSchema(schemaPath, outDir);
|
|
70
|
+
return {
|
|
71
|
+
written,
|
|
72
|
+
skipped,
|
|
73
|
+
migrationName,
|
|
74
|
+
outDir,
|
|
75
|
+
schemaPath,
|
|
76
|
+
summary,
|
|
77
|
+
warnings,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export function formatInitNextSteps(cwd, schemaPath, outDir) {
|
|
81
|
+
const schemaImport = toDisplayPath(cwd, resolve(schemaPath));
|
|
82
|
+
const clientImport = `${outDir.replace(/^\.\//, "")}/client.js`;
|
|
83
|
+
return [
|
|
84
|
+
"Next steps:",
|
|
85
|
+
" 1. cp .env.example .env # set DATABASE_URL",
|
|
86
|
+
" 2. neoorm migrate deploy",
|
|
87
|
+
" 3. neoorm migrate down # roll back last migration in dev",
|
|
88
|
+
` 4. import { db } from "./${clientImport}"`,
|
|
89
|
+
` # schema: ${schemaImport}`,
|
|
90
|
+
];
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/init/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAa/E;AAED,wBAAgB,cAAc,IAAI,MAAM,CAwBvC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export function neoormConfigTemplate(schemaPath, outDir) {
|
|
2
|
+
return `import { defineConfig } from "neoorm";
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
schema: "${schemaPath}",
|
|
6
|
+
out: "${outDir}",
|
|
7
|
+
datasource: {
|
|
8
|
+
provider: "postgresql",
|
|
9
|
+
url: process.env.DATABASE_URL ?? "postgresql://postgres:postgres@localhost:5432/myapp",
|
|
10
|
+
enum: "check",
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
`;
|
|
14
|
+
}
|
|
15
|
+
export function schemaTemplate() {
|
|
16
|
+
return `import { defineSchema, table, id, text, timestamp, fk } from "neoorm/schema";
|
|
17
|
+
|
|
18
|
+
export const schema = defineSchema({
|
|
19
|
+
users: table("users", {
|
|
20
|
+
id: id.primary(),
|
|
21
|
+
email: text().notNull().unique(),
|
|
22
|
+
createdAt: timestamp().notNull().defaultNow(),
|
|
23
|
+
updatedAt: timestamp().notNull().defaultNow().updatedAt(),
|
|
24
|
+
}),
|
|
25
|
+
|
|
26
|
+
posts: table("posts", {
|
|
27
|
+
id: id.primary(),
|
|
28
|
+
authorId: fk("users.id", {
|
|
29
|
+
as: "author",
|
|
30
|
+
inverse: "posts",
|
|
31
|
+
nullable: false,
|
|
32
|
+
}),
|
|
33
|
+
title: text().notNull(),
|
|
34
|
+
createdAt: timestamp().notNull().defaultNow(),
|
|
35
|
+
updatedAt: timestamp().notNull().defaultNow().updatedAt(),
|
|
36
|
+
}),
|
|
37
|
+
});
|
|
38
|
+
`;
|
|
39
|
+
}
|
|
40
|
+
export function envExampleTemplate() {
|
|
41
|
+
return `DATABASE_URL=postgresql://postgres:postgres@localhost:5432/myapp
|
|
42
|
+
`;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB,CAAC,UAAkB,EAAE,MAAc;IACrE,OAAO;;;aAGI,UAAU;UACb,MAAM;;;;;;;CAOf,CAAC;AACF,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;CAsBR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;CACR,CAAC;AACF,CAAC"}
|
|
@@ -33,4 +33,9 @@ export declare function queryIndexes(pool: Pool, tableName: string): Promise<Ind
|
|
|
33
33
|
export declare function queryUniqueConstraints(pool: Pool, tableName: string): Promise<UniqueConstraintRow[]>;
|
|
34
34
|
export declare function queryPrimaryKeyColumns(pool: Pool, tableName: string): Promise<string[]>;
|
|
35
35
|
export declare function queryInstalledExtensions(pool: Pool): Promise<string[]>;
|
|
36
|
+
export type EnumTypeRow = {
|
|
37
|
+
typname: string;
|
|
38
|
+
enumlabel: string;
|
|
39
|
+
};
|
|
40
|
+
export declare function queryEnumTypes(pool: Pool): Promise<Record<string, string[]>>;
|
|
36
41
|
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/introspect/queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE/B,MAAM,MAAM,QAAQ,GAAG;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAUjE;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,EAAE,CAAC,CAWtB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,EAAE,CAAC,CA0BlB;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAqBrB;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAiBhC;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBnB;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ5E"}
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/introspect/queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE/B,MAAM,MAAM,QAAQ,GAAG;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAUjE;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,EAAE,CAAC,CAWtB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,EAAE,CAAC,CA0BlB;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAqBrB;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAiBhC;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBnB;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ5E;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAsB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAiBlF"}
|
|
@@ -99,4 +99,21 @@ export async function queryInstalledExtensions(pool) {
|
|
|
99
99
|
`);
|
|
100
100
|
return result.rows.map((row) => row.extname);
|
|
101
101
|
}
|
|
102
|
+
export async function queryEnumTypes(pool) {
|
|
103
|
+
const result = await pool.query(`
|
|
104
|
+
SELECT t.typname, e.enumlabel
|
|
105
|
+
FROM pg_type t
|
|
106
|
+
JOIN pg_enum e ON t.oid = e.enumtypid
|
|
107
|
+
JOIN pg_namespace n ON n.oid = t.typnamespace
|
|
108
|
+
WHERE n.nspname = 'public'
|
|
109
|
+
ORDER BY t.typname, e.enumsortorder
|
|
110
|
+
`);
|
|
111
|
+
const enumTypes = {};
|
|
112
|
+
for (const row of result.rows) {
|
|
113
|
+
const existing = enumTypes[row.typname] ?? [];
|
|
114
|
+
existing.push(row.enumlabel);
|
|
115
|
+
enumTypes[row.typname] = existing;
|
|
116
|
+
}
|
|
117
|
+
return enumTypes;
|
|
118
|
+
}
|
|
102
119
|
//# sourceMappingURL=queries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/introspect/queries.ts"],"names":[],"mappings":"AAkCA,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAU;IAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAW;;;;;;;GAOzC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAU,EACV,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;;;;GAKD,EACC,CAAC,SAAS,CAAC,CACZ,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAU,EACV,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;;;;;;;;;;;;;;;;;;;GAoBD,EACC,CAAC,SAAS,CAAC,CACZ,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAU,EACV,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;;;;;;;;;;;;;;GAeD,EACC,CAAC,SAAS,CAAC,CACZ,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAU,EACV,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;;;;;;;;;;GAWD,EACC,CAAC,SAAS,CAAC,CACZ,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAU,EACV,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;;;;;;;;;GAUD,EACC,CAAC,SAAS,CAAC,CACZ,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAU;IACvD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAsB;;;;;GAKpD,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC"}
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/introspect/queries.ts"],"names":[],"mappings":"AAkCA,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAU;IAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAW;;;;;;;GAOzC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAU,EACV,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;;;;GAKD,EACC,CAAC,SAAS,CAAC,CACZ,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAU,EACV,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;;;;;;;;;;;;;;;;;;;GAoBD,EACC,CAAC,SAAS,CAAC,CACZ,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAU,EACV,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;;;;;;;;;;;;;;GAeD,EACC,CAAC,SAAS,CAAC,CACZ,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAU,EACV,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;;;;;;;;;;GAWD,EACC,CAAC,SAAS,CAAC,CACZ,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAU,EACV,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;;;;;;;;;GAUD,EACC,CAAC,SAAS,CAAC,CACZ,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAU;IACvD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAsB;;;;;GAKpD,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAU;IAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAc;;;;;;;GAO5C,CAAC,CAAC;IAEH,MAAM,SAAS,GAA6B,EAAE,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7B,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;IACpC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-manifest.d.ts","sourceRoot":"","sources":["../../src/introspect/to-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"to-manifest.d.ts","sourceRoot":"","sources":["../../src/introspect/to-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,qBAAqB,CAAC;AAoQ7B,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CA+BxE"}
|
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
import { toCamelCase } from "../utils/case.js";
|
|
2
2
|
import { findIntrospectColumnType } from "../plugins/registry.js";
|
|
3
3
|
import { pgStorageSqlType } from "../dialect/postgres.js";
|
|
4
|
-
import { queryColumns, queryForeignKeys, queryIndexes, queryInstalledExtensions, queryPrimaryKeyColumns, queryTables, queryUniqueConstraints, } from "./queries.js";
|
|
4
|
+
import { queryColumns, queryForeignKeys, queryIndexes, queryInstalledExtensions, queryPrimaryKeyColumns, queryTables, queryUniqueConstraints, queryEnumTypes, } from "./queries.js";
|
|
5
5
|
function tableAccessor(tableName) {
|
|
6
6
|
return toCamelCase(tableName.endsWith("s") ? tableName : `${tableName}s`);
|
|
7
7
|
}
|
|
8
|
-
function
|
|
8
|
+
function isSerialColumn(dataType, columnDefault) {
|
|
9
|
+
if (dataType !== "integer") {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
if (!columnDefault) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return (columnDefault.includes("nextval(") ||
|
|
16
|
+
columnDefault.toLowerCase().includes("generated"));
|
|
17
|
+
}
|
|
18
|
+
function pgTypeToKind(dataType, udtName, enumTypes) {
|
|
19
|
+
if (enumTypes[udtName]) {
|
|
20
|
+
return "enum";
|
|
21
|
+
}
|
|
9
22
|
const pluginType = findIntrospectColumnType(dataType, udtName);
|
|
10
23
|
if (pluginType) {
|
|
11
24
|
return pluginType.kind;
|
|
@@ -37,10 +50,24 @@ function parseDefaultValue(kind, columnDefault) {
|
|
|
37
50
|
if (columnDefault === "false")
|
|
38
51
|
return { defaultNow: false, defaultValue: false };
|
|
39
52
|
}
|
|
40
|
-
if (kind === "int") {
|
|
41
|
-
const match = columnDefault.match(/^(-?\d+)/);
|
|
53
|
+
if (kind === "int" || kind === "decimal") {
|
|
54
|
+
const match = columnDefault.match(/^(-?\d+(?:\.\d+)?)/);
|
|
42
55
|
if (match) {
|
|
43
|
-
return { defaultNow: false, defaultValue: Number(match[1]) };
|
|
56
|
+
return { defaultNow: false, defaultValue: kind === "int" ? Number(match[1]) : match[1] };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (kind === "json" || kind === "jsonb") {
|
|
60
|
+
const jsonMatch = columnDefault.match(/^'((?:''|[^'])*)'::/);
|
|
61
|
+
if (jsonMatch) {
|
|
62
|
+
try {
|
|
63
|
+
return {
|
|
64
|
+
defaultNow: false,
|
|
65
|
+
defaultValue: JSON.parse(jsonMatch[1].replace(/''/g, "'")),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return { defaultNow: false };
|
|
70
|
+
}
|
|
44
71
|
}
|
|
45
72
|
}
|
|
46
73
|
const stringMatch = columnDefault.match(/^'((?:''|[^'])*)'::/);
|
|
@@ -95,7 +122,7 @@ function filterConstraintBackedIndexes(indexes, columns) {
|
|
|
95
122
|
return !uniqueColumns.has(index.columns[0]);
|
|
96
123
|
});
|
|
97
124
|
}
|
|
98
|
-
async function introspectTable(pool, tableName) {
|
|
125
|
+
async function introspectTable(pool, tableName, enumTypes) {
|
|
99
126
|
const [columns, fks, indexRows, uniqueRows, primaryKey] = await Promise.all([
|
|
100
127
|
queryColumns(pool, tableName),
|
|
101
128
|
queryForeignKeys(pool, tableName),
|
|
@@ -111,7 +138,9 @@ async function introspectTable(pool, tableName) {
|
|
|
111
138
|
const fk = fkMap.get(col.column_name);
|
|
112
139
|
const nullable = col.is_nullable === "YES";
|
|
113
140
|
const uniqueConstraintName = uniqueMap.get(col.column_name);
|
|
114
|
-
const defaults = parseDefaultValue(fk ? "fk" :
|
|
141
|
+
const defaults = parseDefaultValue(fk ? "fk" : isSerialColumn(col.data_type, col.column_default)
|
|
142
|
+
? "serial"
|
|
143
|
+
: pgTypeToKind(col.data_type, col.udt_name, enumTypes), col.column_default);
|
|
115
144
|
if (fk) {
|
|
116
145
|
const onDelete = mapDeleteRule(fk.delete_rule);
|
|
117
146
|
return {
|
|
@@ -132,11 +161,13 @@ async function introspectTable(pool, tableName) {
|
|
|
132
161
|
...(onDelete ? { onDelete } : {}),
|
|
133
162
|
};
|
|
134
163
|
}
|
|
135
|
-
const kind = col.
|
|
136
|
-
? "
|
|
137
|
-
: col.column_name === "id"
|
|
138
|
-
? "
|
|
139
|
-
:
|
|
164
|
+
const kind = isSerialColumn(col.data_type, col.column_default)
|
|
165
|
+
? "serial"
|
|
166
|
+
: col.column_name === "id" && col.udt_name === "uuid"
|
|
167
|
+
? "uuid"
|
|
168
|
+
: col.column_name === "id"
|
|
169
|
+
? "id"
|
|
170
|
+
: pgTypeToKind(col.data_type, col.udt_name, enumTypes);
|
|
140
171
|
const column = {
|
|
141
172
|
tsName,
|
|
142
173
|
sqlName: col.column_name,
|
|
@@ -150,12 +181,19 @@ async function introspectTable(pool, tableName) {
|
|
|
150
181
|
? { defaultValue: defaults.defaultValue }
|
|
151
182
|
: {}),
|
|
152
183
|
...(uniqueConstraintName ? { uniqueConstraintName } : {}),
|
|
184
|
+
...(kind === "serial" ? { generated: true } : {}),
|
|
153
185
|
};
|
|
154
186
|
if (kind === "uuid" && col.column_default?.includes("gen_random_uuid")) {
|
|
155
187
|
column.typeOptions = {
|
|
156
188
|
version: col.column_default.includes("uuid_generate_v4()") ? 4 : 7,
|
|
157
189
|
};
|
|
158
190
|
}
|
|
191
|
+
if (kind === "enum" && enumTypes[col.udt_name]) {
|
|
192
|
+
column.typeOptions = {
|
|
193
|
+
values: enumTypes[col.udt_name],
|
|
194
|
+
nativeTypeName: col.udt_name,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
159
197
|
return column;
|
|
160
198
|
});
|
|
161
199
|
return {
|
|
@@ -170,16 +208,22 @@ async function introspectTable(pool, tableName) {
|
|
|
170
208
|
export async function introspectToManifest(pool) {
|
|
171
209
|
const tables = await queryTables(pool);
|
|
172
210
|
const extensions = await queryInstalledExtensions(pool);
|
|
211
|
+
const enumTypes = await queryEnumTypes(pool);
|
|
173
212
|
const manifestTables = {};
|
|
174
213
|
for (const { table_name } of tables) {
|
|
175
|
-
const table = await introspectTable(pool, table_name);
|
|
214
|
+
const table = await introspectTable(pool, table_name, enumTypes);
|
|
176
215
|
manifestTables[table.accessor] = table;
|
|
177
216
|
}
|
|
178
|
-
const relevantExtensions = extensions.filter((ext) => ["postgis"].includes(ext));
|
|
217
|
+
const relevantExtensions = extensions.filter((ext) => ["postgis", "citext"].includes(ext));
|
|
218
|
+
const manifestEnumTypes = Object.fromEntries(Object.entries(enumTypes).map(([name, values]) => [name, { values }]));
|
|
179
219
|
return {
|
|
180
220
|
version: 1,
|
|
181
221
|
tables: manifestTables,
|
|
182
222
|
manyToMany: [],
|
|
223
|
+
enumMode: "native",
|
|
224
|
+
...(Object.keys(manifestEnumTypes).length > 0
|
|
225
|
+
? { enumTypes: manifestEnumTypes }
|
|
226
|
+
: {}),
|
|
183
227
|
...(relevantExtensions.length > 0
|
|
184
228
|
? { extensions: relevantExtensions }
|
|
185
229
|
: {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-manifest.js","sourceRoot":"","sources":["../../src/introspect/to-manifest.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACtB,WAAW,EACX,sBAAsB,
|
|
1
|
+
{"version":3,"file":"to-manifest.js","sourceRoot":"","sources":["../../src/introspect/to-manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/migrate/runner.d.ts
CHANGED
|
@@ -1,11 +1,37 @@
|
|
|
1
1
|
import type { Pool } from "pg";
|
|
2
2
|
import type { Manifest } from "../dialect/types.js";
|
|
3
|
+
export type MigrationRecord = {
|
|
4
|
+
name: string;
|
|
5
|
+
appliedAt: Date;
|
|
6
|
+
};
|
|
7
|
+
export type MigrationStatus = {
|
|
8
|
+
applied: MigrationRecord[];
|
|
9
|
+
pending: string[];
|
|
10
|
+
orphanApplied: string[];
|
|
11
|
+
};
|
|
3
12
|
export declare function ensureMigrationsTable(pool: Pool): Promise<void>;
|
|
13
|
+
export declare function listAppliedMigrations(pool: Pool): Promise<MigrationRecord[]>;
|
|
4
14
|
export declare function getAppliedMigrations(pool: Pool): Promise<Set<string>>;
|
|
15
|
+
export declare function listMigrationsOnDisk(migrationsDir: string): Promise<string[]>;
|
|
16
|
+
export declare function computeMigrationStatus(diskMigrations: string[], applied: MigrationRecord[]): MigrationStatus;
|
|
17
|
+
export declare function migrateStatus(pool: Pool, migrationsDir: string): Promise<MigrationStatus>;
|
|
18
|
+
export declare function formatMigrateStatus(status: MigrationStatus, migrationsDir: string): string[];
|
|
19
|
+
export declare function resetDatabaseSchema(pool: Pool): Promise<void>;
|
|
20
|
+
export declare function migrateReset(pool: Pool, migrationsDir: string, options: {
|
|
21
|
+
force: boolean;
|
|
22
|
+
skipApply?: boolean;
|
|
23
|
+
}): Promise<{
|
|
24
|
+
reapplied: string[];
|
|
25
|
+
}>;
|
|
5
26
|
export declare function listPendingMigrations(migrationsDir: string, applied: Set<string>): Promise<string[]>;
|
|
6
27
|
export declare function applySql(pool: Pool, sql: string[]): Promise<void>;
|
|
7
28
|
export declare function applyMigration(pool: Pool, migrationsDir: string, name: string): Promise<void>;
|
|
8
29
|
export declare function migrateDeploy(pool: Pool, migrationsDir: string): Promise<string[]>;
|
|
30
|
+
export declare function revertMigration(pool: Pool, migrationsDir: string, name: string): Promise<void>;
|
|
31
|
+
export declare function migrateDown(pool: Pool, migrationsDir: string, options?: {
|
|
32
|
+
steps?: number;
|
|
33
|
+
outDir?: string;
|
|
34
|
+
}): Promise<string[]>;
|
|
9
35
|
export type DbPushResult = {
|
|
10
36
|
appliedStatements: number;
|
|
11
37
|
destructiveBlocked: DestructiveChange[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/migrate/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/migrate/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/migrate/runner.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
-
import { join } from "node:path";
|
|
1
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
3
|
import { postgresDialect } from "../dialect/postgres.js";
|
|
4
4
|
import { diffManifest, formatDestructiveWarnings, resolveMigrationSql, } from "../codegen/diff-manifest.js";
|
|
5
|
+
import { writeSnapshot } from "../codegen/generate.js";
|
|
5
6
|
import { introspectToManifest } from "../introspect/to-manifest.js";
|
|
6
7
|
const MIGRATIONS_TABLE = "_neoorm_migrations";
|
|
7
8
|
export async function ensureMigrationsTable(pool) {
|
|
@@ -13,12 +14,19 @@ export async function ensureMigrationsTable(pool) {
|
|
|
13
14
|
)
|
|
14
15
|
`);
|
|
15
16
|
}
|
|
16
|
-
export async function
|
|
17
|
+
export async function listAppliedMigrations(pool) {
|
|
17
18
|
await ensureMigrationsTable(pool);
|
|
18
|
-
const result = await pool.query(`SELECT name FROM ${postgresDialect.quoteIdentifier(MIGRATIONS_TABLE)} ORDER BY id`);
|
|
19
|
-
return
|
|
19
|
+
const result = await pool.query(`SELECT name, applied_at FROM ${postgresDialect.quoteIdentifier(MIGRATIONS_TABLE)} ORDER BY id`);
|
|
20
|
+
return result.rows.map((row) => ({
|
|
21
|
+
name: row.name,
|
|
22
|
+
appliedAt: row.applied_at,
|
|
23
|
+
}));
|
|
20
24
|
}
|
|
21
|
-
export async function
|
|
25
|
+
export async function getAppliedMigrations(pool) {
|
|
26
|
+
const applied = await listAppliedMigrations(pool);
|
|
27
|
+
return new Set(applied.map((record) => record.name));
|
|
28
|
+
}
|
|
29
|
+
export async function listMigrationsOnDisk(migrationsDir) {
|
|
22
30
|
let entries;
|
|
23
31
|
try {
|
|
24
32
|
entries = await readdir(migrationsDir);
|
|
@@ -26,7 +34,93 @@ export async function listPendingMigrations(migrationsDir, applied) {
|
|
|
26
34
|
catch {
|
|
27
35
|
return [];
|
|
28
36
|
}
|
|
29
|
-
|
|
37
|
+
const migrations = [];
|
|
38
|
+
for (const entry of entries) {
|
|
39
|
+
const entryPath = join(migrationsDir, entry);
|
|
40
|
+
try {
|
|
41
|
+
const entryStat = await stat(entryPath);
|
|
42
|
+
if (!entryStat.isDirectory()) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
await readFile(join(entryPath, "migration.sql"), "utf-8");
|
|
46
|
+
migrations.push(entry);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// skip entries without migration.sql
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return migrations.sort();
|
|
53
|
+
}
|
|
54
|
+
export function computeMigrationStatus(diskMigrations, applied) {
|
|
55
|
+
const appliedNames = new Set(applied.map((record) => record.name));
|
|
56
|
+
const diskSet = new Set(diskMigrations);
|
|
57
|
+
const pending = diskMigrations.filter((name) => !appliedNames.has(name));
|
|
58
|
+
const orphanApplied = applied
|
|
59
|
+
.map((record) => record.name)
|
|
60
|
+
.filter((name) => !diskSet.has(name));
|
|
61
|
+
return { applied, pending, orphanApplied };
|
|
62
|
+
}
|
|
63
|
+
export async function migrateStatus(pool, migrationsDir) {
|
|
64
|
+
const [applied, diskMigrations] = await Promise.all([
|
|
65
|
+
listAppliedMigrations(pool),
|
|
66
|
+
listMigrationsOnDisk(migrationsDir),
|
|
67
|
+
]);
|
|
68
|
+
return computeMigrationStatus(diskMigrations, applied);
|
|
69
|
+
}
|
|
70
|
+
export function formatMigrateStatus(status, migrationsDir) {
|
|
71
|
+
const lines = [`Migration status (${migrationsDir})`, ""];
|
|
72
|
+
lines.push("Applied:");
|
|
73
|
+
if (status.applied.length === 0) {
|
|
74
|
+
lines.push(" (none)");
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
for (const record of status.applied) {
|
|
78
|
+
const appliedAt = record.appliedAt.toISOString().replace("T", " ").replace(/\.\d{3}Z$/, " UTC");
|
|
79
|
+
lines.push(` ✓ ${record.name.padEnd(28)} ${appliedAt}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
lines.push("");
|
|
83
|
+
lines.push("Pending:");
|
|
84
|
+
if (status.pending.length === 0) {
|
|
85
|
+
lines.push(" (none)");
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
for (const name of status.pending) {
|
|
89
|
+
lines.push(` ○ ${name}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (status.orphanApplied.length > 0) {
|
|
93
|
+
lines.push("");
|
|
94
|
+
lines.push("Warnings:");
|
|
95
|
+
for (const name of status.orphanApplied) {
|
|
96
|
+
lines.push(` ! Applied migration missing on disk: ${name}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
lines.push("");
|
|
100
|
+
lines.push(`Summary: ${status.applied.length} applied, ${status.pending.length} pending`);
|
|
101
|
+
return lines;
|
|
102
|
+
}
|
|
103
|
+
export async function resetDatabaseSchema(pool) {
|
|
104
|
+
await pool.query(`
|
|
105
|
+
DROP SCHEMA public CASCADE;
|
|
106
|
+
CREATE SCHEMA public;
|
|
107
|
+
GRANT ALL ON SCHEMA public TO PUBLIC;
|
|
108
|
+
`);
|
|
109
|
+
}
|
|
110
|
+
export async function migrateReset(pool, migrationsDir, options) {
|
|
111
|
+
if (!options.force) {
|
|
112
|
+
throw new Error("migrate reset requires --force. This drops the public schema and all data.");
|
|
113
|
+
}
|
|
114
|
+
await resetDatabaseSchema(pool);
|
|
115
|
+
if (options.skipApply) {
|
|
116
|
+
return { reapplied: [] };
|
|
117
|
+
}
|
|
118
|
+
const reapplied = await migrateDeploy(pool, migrationsDir);
|
|
119
|
+
return { reapplied };
|
|
120
|
+
}
|
|
121
|
+
export async function listPendingMigrations(migrationsDir, applied) {
|
|
122
|
+
const diskMigrations = await listMigrationsOnDisk(migrationsDir);
|
|
123
|
+
return diskMigrations.filter((name) => !applied.has(name));
|
|
30
124
|
}
|
|
31
125
|
export async function applySql(pool, sql) {
|
|
32
126
|
if (sql.length === 0) {
|
|
@@ -74,6 +168,71 @@ export async function migrateDeploy(pool, migrationsDir) {
|
|
|
74
168
|
}
|
|
75
169
|
return pending;
|
|
76
170
|
}
|
|
171
|
+
async function readDownSql(migrationsDir, name) {
|
|
172
|
+
const sqlPath = join(migrationsDir, name, "down.sql");
|
|
173
|
+
try {
|
|
174
|
+
return await readFile(sqlPath, "utf-8");
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
throw new Error(`Migration "${name}" has no down.sql. Re-generate the migration or add down.sql manually.`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async function readSnapshotBefore(migrationsDir, name) {
|
|
181
|
+
const snapshotPath = join(migrationsDir, name, "snapshot.before.json");
|
|
182
|
+
try {
|
|
183
|
+
const content = await readFile(snapshotPath, "utf-8");
|
|
184
|
+
return JSON.parse(content);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
throw new Error(`Migration "${name}" has no snapshot.before.json. Re-generate the migration.`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
export async function revertMigration(pool, migrationsDir, name) {
|
|
191
|
+
const sql = await readDownSql(migrationsDir, name);
|
|
192
|
+
const client = await pool.connect();
|
|
193
|
+
try {
|
|
194
|
+
await client.query("BEGIN");
|
|
195
|
+
if (sql.trim().length > 0) {
|
|
196
|
+
await client.query(sql);
|
|
197
|
+
}
|
|
198
|
+
await client.query(`DELETE FROM ${postgresDialect.quoteIdentifier(MIGRATIONS_TABLE)} WHERE name = $1`, [name]);
|
|
199
|
+
await client.query("COMMIT");
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
await client.query("ROLLBACK");
|
|
203
|
+
throw err;
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
client.release();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
export async function migrateDown(pool, migrationsDir, options) {
|
|
210
|
+
const steps = options?.steps ?? 1;
|
|
211
|
+
if (steps < 1) {
|
|
212
|
+
throw new Error("steps must be at least 1");
|
|
213
|
+
}
|
|
214
|
+
const applied = await listAppliedMigrations(pool);
|
|
215
|
+
if (applied.length === 0) {
|
|
216
|
+
throw new Error("No applied migrations to roll back");
|
|
217
|
+
}
|
|
218
|
+
if (steps > applied.length) {
|
|
219
|
+
throw new Error(`Cannot roll back ${steps} migration(s): only ${applied.length} applied`);
|
|
220
|
+
}
|
|
221
|
+
const toRevert = applied.slice(-steps).map((record) => record.name).reverse();
|
|
222
|
+
for (const name of toRevert) {
|
|
223
|
+
await readDownSql(migrationsDir, name);
|
|
224
|
+
}
|
|
225
|
+
const reverted = [];
|
|
226
|
+
for (const name of toRevert) {
|
|
227
|
+
await revertMigration(pool, migrationsDir, name);
|
|
228
|
+
reverted.push(name);
|
|
229
|
+
}
|
|
230
|
+
const outDir = options?.outDir ?? dirname(migrationsDir);
|
|
231
|
+
const oldestReverted = toRevert[toRevert.length - 1];
|
|
232
|
+
const snapshotBefore = await readSnapshotBefore(migrationsDir, oldestReverted);
|
|
233
|
+
await writeSnapshot(outDir, snapshotBefore);
|
|
234
|
+
return reverted;
|
|
235
|
+
}
|
|
77
236
|
export async function dbPush(pool, target, options = {}) {
|
|
78
237
|
const live = await introspectToManifest(pool);
|
|
79
238
|
const manifestDiff = diffManifest(live, target);
|