neoorm 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +86 -0
  3. package/dist/bin/neoorm.d.ts +3 -0
  4. package/dist/bin/neoorm.d.ts.map +1 -0
  5. package/dist/bin/neoorm.js +111 -0
  6. package/dist/bin/neoorm.js.map +1 -0
  7. package/dist/codegen/emit-includes.d.ts +3 -0
  8. package/dist/codegen/emit-includes.d.ts.map +1 -0
  9. package/dist/codegen/emit-includes.js +133 -0
  10. package/dist/codegen/emit-includes.js.map +1 -0
  11. package/dist/codegen/generate.d.ts +24 -0
  12. package/dist/codegen/generate.d.ts.map +1 -0
  13. package/dist/codegen/generate.js +156 -0
  14. package/dist/codegen/generate.js.map +1 -0
  15. package/dist/codegen/schema-to-manifest.d.ts +8 -0
  16. package/dist/codegen/schema-to-manifest.d.ts.map +1 -0
  17. package/dist/codegen/schema-to-manifest.js +210 -0
  18. package/dist/codegen/schema-to-manifest.js.map +1 -0
  19. package/dist/config.d.ts +11 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +17 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/dialect/index.d.ts +3 -0
  24. package/dist/dialect/index.d.ts.map +1 -0
  25. package/dist/dialect/index.js +2 -0
  26. package/dist/dialect/index.js.map +1 -0
  27. package/dist/dialect/postgres.d.ts +5 -0
  28. package/dist/dialect/postgres.d.ts.map +1 -0
  29. package/dist/dialect/postgres.js +112 -0
  30. package/dist/dialect/postgres.js.map +1 -0
  31. package/dist/dialect/types.d.ts +79 -0
  32. package/dist/dialect/types.d.ts.map +1 -0
  33. package/dist/dialect/types.js +2 -0
  34. package/dist/dialect/types.js.map +1 -0
  35. package/dist/index.d.ts +10 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +7 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/introspect/pull.d.ts +3 -0
  40. package/dist/introspect/pull.d.ts.map +1 -0
  41. package/dist/introspect/pull.js +91 -0
  42. package/dist/introspect/pull.js.map +1 -0
  43. package/dist/migrate/runner.d.ts +9 -0
  44. package/dist/migrate/runner.d.ts.map +1 -0
  45. package/dist/migrate/runner.js +70 -0
  46. package/dist/migrate/runner.js.map +1 -0
  47. package/dist/runtime/client.d.ts +61 -0
  48. package/dist/runtime/client.d.ts.map +1 -0
  49. package/dist/runtime/client.js +54 -0
  50. package/dist/runtime/client.js.map +1 -0
  51. package/dist/runtime/executor.d.ts +10 -0
  52. package/dist/runtime/executor.d.ts.map +1 -0
  53. package/dist/runtime/executor.js +62 -0
  54. package/dist/runtime/executor.js.map +1 -0
  55. package/dist/runtime/query/compile.d.ts +23 -0
  56. package/dist/runtime/query/compile.d.ts.map +1 -0
  57. package/dist/runtime/query/compile.js +182 -0
  58. package/dist/runtime/query/compile.js.map +1 -0
  59. package/dist/runtime/query/create.d.ts +8 -0
  60. package/dist/runtime/query/create.d.ts.map +1 -0
  61. package/dist/runtime/query/create.js +139 -0
  62. package/dist/runtime/query/create.js.map +1 -0
  63. package/dist/runtime/query/delete.d.ts +12 -0
  64. package/dist/runtime/query/delete.d.ts.map +1 -0
  65. package/dist/runtime/query/delete.js +35 -0
  66. package/dist/runtime/query/delete.js.map +1 -0
  67. package/dist/runtime/query/find.d.ts +21 -0
  68. package/dist/runtime/query/find.d.ts.map +1 -0
  69. package/dist/runtime/query/find.js +172 -0
  70. package/dist/runtime/query/find.js.map +1 -0
  71. package/dist/runtime/query/update.d.ts +17 -0
  72. package/dist/runtime/query/update.d.ts.map +1 -0
  73. package/dist/runtime/query/update.js +63 -0
  74. package/dist/runtime/query/update.js.map +1 -0
  75. package/dist/runtime/types.d.ts +48 -0
  76. package/dist/runtime/types.d.ts.map +1 -0
  77. package/dist/runtime/types.js +2 -0
  78. package/dist/runtime/types.js.map +1 -0
  79. package/dist/schema/column.d.ts +39 -0
  80. package/dist/schema/column.d.ts.map +1 -0
  81. package/dist/schema/column.js +70 -0
  82. package/dist/schema/column.js.map +1 -0
  83. package/dist/schema/define-schema.d.ts +6 -0
  84. package/dist/schema/define-schema.d.ts.map +1 -0
  85. package/dist/schema/define-schema.js +4 -0
  86. package/dist/schema/define-schema.js.map +1 -0
  87. package/dist/schema/index.d.ts +13 -0
  88. package/dist/schema/index.d.ts.map +1 -0
  89. package/dist/schema/index.js +6 -0
  90. package/dist/schema/index.js.map +1 -0
  91. package/dist/schema/many-to-many.d.ts +21 -0
  92. package/dist/schema/many-to-many.d.ts.map +1 -0
  93. package/dist/schema/many-to-many.js +20 -0
  94. package/dist/schema/many-to-many.js.map +1 -0
  95. package/dist/schema/relation-types.d.ts +74 -0
  96. package/dist/schema/relation-types.d.ts.map +1 -0
  97. package/dist/schema/relation-types.js +2 -0
  98. package/dist/schema/relation-types.js.map +1 -0
  99. package/dist/schema/relation.d.ts +24 -0
  100. package/dist/schema/relation.d.ts.map +1 -0
  101. package/dist/schema/relation.js +25 -0
  102. package/dist/schema/relation.js.map +1 -0
  103. package/dist/schema/table.d.ts +28 -0
  104. package/dist/schema/table.d.ts.map +1 -0
  105. package/dist/schema/table.js +23 -0
  106. package/dist/schema/table.js.map +1 -0
  107. package/dist/schema/types.d.ts +115 -0
  108. package/dist/schema/types.d.ts.map +1 -0
  109. package/dist/schema/types.js +2 -0
  110. package/dist/schema/types.js.map +1 -0
  111. package/dist/sql/builder.d.ts +17 -0
  112. package/dist/sql/builder.d.ts.map +1 -0
  113. package/dist/sql/builder.js +51 -0
  114. package/dist/sql/builder.js.map +1 -0
  115. package/dist/sql/index.d.ts +7 -0
  116. package/dist/sql/index.d.ts.map +1 -0
  117. package/dist/sql/index.js +6 -0
  118. package/dist/sql/index.js.map +1 -0
  119. package/dist/sql/template.d.ts +16 -0
  120. package/dist/sql/template.d.ts.map +1 -0
  121. package/dist/sql/template.js +43 -0
  122. package/dist/sql/template.js.map +1 -0
  123. package/dist/utils/case.d.ts +5 -0
  124. package/dist/utils/case.d.ts.map +1 -0
  125. package/dist/utils/case.js +20 -0
  126. package/dist/utils/case.js.map +1 -0
  127. package/package.json +60 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 NeoOrm contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,86 @@
1
+ # NeoOrm
2
+
3
+ TypeScript-first PostgreSQL ORM with a schema DSL, compile-time types, codegen, and a typed query client.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install neoorm pg
9
+ ```
10
+
11
+ Peer dependency: Node.js 20+ and a PostgreSQL database.
12
+
13
+ ## Quick start
14
+
15
+ **1. Define a schema** (`schema.ts`):
16
+
17
+ ```ts
18
+ import { defineSchema, table, id, text, timestamp, fk } from "neoorm/schema";
19
+
20
+ export const schema = defineSchema({
21
+ users: table("users", {
22
+ id: id.primary(),
23
+ email: text().notNull().unique(),
24
+ createdAt: timestamp().notNull().defaultNow(),
25
+ }),
26
+
27
+ posts: table("posts", {
28
+ id: id.primary(),
29
+ authorId: fk("users.id", { as: "author", inverse: "posts", nullable: false }),
30
+ title: text().notNull(),
31
+ }),
32
+ });
33
+ ```
34
+
35
+ **2. Configure NeoOrm** (`neoorm.config.ts`):
36
+
37
+ ```ts
38
+ import { defineConfig } from "neoorm";
39
+
40
+ export default defineConfig({
41
+ schema: "./schema.ts",
42
+ out: "./neoorm",
43
+ datasource: {
44
+ provider: "postgresql",
45
+ url: process.env.DATABASE_URL!,
46
+ },
47
+ });
48
+ ```
49
+
50
+ **3. Generate the client**
51
+
52
+ ```bash
53
+ npx neoorm generate
54
+ ```
55
+
56
+ **4. Query**
57
+
58
+ ```ts
59
+ import { db } from "./neoorm/client.js";
60
+
61
+ const user = await db.users.findById("user_1", {
62
+ with: {
63
+ posts: { orderBy: { createdAt: "desc" }, limit: 10 },
64
+ },
65
+ });
66
+ ```
67
+
68
+ ## CLI
69
+
70
+ | Command | Description |
71
+ |---------|-------------|
72
+ | `neoorm generate` | Emit manifest, typed client, includes, and migrations |
73
+ | `neoorm migrate dev` | Apply pending migrations and create a new one if the schema changed |
74
+ | `neoorm migrate deploy` | Apply pending migrations |
75
+ | `neoorm db push` | Push schema to the database |
76
+ | `neoorm db pull` | Introspect the database into a schema file |
77
+
78
+ ## API surface
79
+
80
+ - `neoorm` — config helpers and `createNeoOrmClient`
81
+ - `neoorm/schema` — schema DSL (`table`, `fk`, `manyToMany`, …)
82
+ - `neoorm/sql` — tagged SQL templates and query builder
83
+
84
+ ## License
85
+
86
+ MIT
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=neoorm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neoorm.d.ts","sourceRoot":"","sources":["../../src/bin/neoorm.ts"],"names":[],"mappings":""}
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { join, resolve } from "node:path";
4
+ import { Pool } from "pg";
5
+ import { loadConfig } from "../config.js";
6
+ import { generateFromSchema } from "../codegen/generate.js";
7
+ import { migrateDeploy, dbPush } from "../migrate/runner.js";
8
+ import { introspectPostgres } from "../introspect/pull.js";
9
+ import { writeFile } from "node:fs/promises";
10
+ const program = new Command();
11
+ program
12
+ .name("neoorm")
13
+ .description("NeoOrm CLI")
14
+ .version("0.1.0");
15
+ program
16
+ .command("generate")
17
+ .description("Generate manifest, client, and migrations from schema")
18
+ .action(async () => {
19
+ const cwd = process.cwd();
20
+ const config = await loadConfig(cwd);
21
+ const schemaPath = resolve(cwd, config.schema);
22
+ const outDir = resolve(cwd, config.out);
23
+ const { migrationName } = await generateFromSchema(schemaPath, outDir);
24
+ console.log(`Generated client at ${outDir}/client.ts`);
25
+ console.log(`Generated manifest at ${outDir}/manifest.ts`);
26
+ if (migrationName) {
27
+ console.log(`Created migration: ${migrationName}`);
28
+ }
29
+ else {
30
+ console.log("No schema changes detected");
31
+ }
32
+ });
33
+ program
34
+ .command("migrate")
35
+ .description("Run migrations")
36
+ .argument("[subcommand]", "dev | deploy")
37
+ .action(async (subcommand) => {
38
+ const cwd = process.cwd();
39
+ const config = await loadConfig(cwd);
40
+ const outDir = resolve(cwd, config.out);
41
+ const migrationsDir = join(outDir, "migrations");
42
+ const pool = new Pool({ connectionString: config.datasource.url });
43
+ try {
44
+ if (subcommand === "deploy" || subcommand === "dev") {
45
+ const applied = await migrateDeploy(pool, migrationsDir);
46
+ if (applied.length === 0) {
47
+ console.log("No pending migrations");
48
+ }
49
+ else {
50
+ console.log(`Applied ${applied.length} migration(s):`);
51
+ for (const name of applied) {
52
+ console.log(` - ${name}`);
53
+ }
54
+ }
55
+ if (subcommand === "dev") {
56
+ const { generateFromSchema } = await import("../codegen/generate.js");
57
+ const schemaPath = resolve(cwd, config.schema);
58
+ const { migrationName } = await generateFromSchema(schemaPath, outDir);
59
+ if (migrationName) {
60
+ await migrateDeploy(pool, join(outDir, "migrations"));
61
+ console.log(`Created and applied: ${migrationName}`);
62
+ }
63
+ }
64
+ }
65
+ else {
66
+ console.error("Usage: neoorm migrate dev | deploy");
67
+ process.exit(1);
68
+ }
69
+ }
70
+ finally {
71
+ await pool.end();
72
+ }
73
+ });
74
+ program
75
+ .command("db")
76
+ .description("Database utilities")
77
+ .argument("<subcommand>", "push | pull")
78
+ .option("-o, --output <file>", "Output file for pull", "schema.pulled.ts")
79
+ .action(async (subcommand, options) => {
80
+ const cwd = process.cwd();
81
+ const config = await loadConfig(cwd);
82
+ const pool = new Pool({ connectionString: config.datasource.url });
83
+ try {
84
+ if (subcommand === "push") {
85
+ const outDir = resolve(cwd, config.out);
86
+ const { readSnapshot } = await import("../codegen/generate.js");
87
+ const manifest = await readSnapshot(outDir);
88
+ if (!manifest) {
89
+ console.error("Run neoorm generate first");
90
+ process.exit(1);
91
+ }
92
+ await dbPush(pool, manifest);
93
+ console.log("Database schema pushed");
94
+ }
95
+ else if (subcommand === "pull") {
96
+ const content = await introspectPostgres(pool);
97
+ const outputPath = resolve(cwd, options.output ?? "schema.pulled.ts");
98
+ await writeFile(outputPath, content, "utf-8");
99
+ console.log(`Schema written to ${outputPath}`);
100
+ }
101
+ else {
102
+ console.error("Usage: neoorm db push | pull");
103
+ process.exit(1);
104
+ }
105
+ }
106
+ finally {
107
+ await pool.end();
108
+ }
109
+ });
110
+ program.parse();
111
+ //# sourceMappingURL=neoorm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neoorm.js","sourceRoot":"","sources":["../../src/bin/neoorm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Manifest } from "../dialect/types.js";
2
+ export declare function emitIncludesTs(manifest: Manifest): string;
3
+ //# sourceMappingURL=emit-includes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-includes.d.ts","sourceRoot":"","sources":["../../src/codegen/emit-includes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAmD,MAAM,qBAAqB,CAAC;AAiIrG,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAiCzD"}
@@ -0,0 +1,133 @@
1
+ function pascalCase(str) {
2
+ return str
3
+ .replace(/(^|_)([a-z])/g, (_, __, c) => c.toUpperCase())
4
+ .replace(/_/g, "");
5
+ }
6
+ function columnUnion(columns) {
7
+ if (columns.length === 0)
8
+ return "never";
9
+ return columns.map((c) => `"${c.tsName}"`).join(" | ");
10
+ }
11
+ function selectType(columns) {
12
+ const union = columnUnion(columns);
13
+ const objectFields = columns.map((c) => `${c.tsName}?: true`).join("; ");
14
+ return `readonly (${union})[] | { ${objectFields} }`;
15
+ }
16
+ function orderByType(columns) {
17
+ if (columns.length === 0)
18
+ return "Record<string, never>";
19
+ const fields = columns.map((c) => `${c.tsName}?: OrderDirection`).join("; ");
20
+ return `{ ${fields} }`;
21
+ }
22
+ function uniqueRelations(table) {
23
+ const seen = new Set();
24
+ const result = [];
25
+ for (const rel of table.relations) {
26
+ if (seen.has(rel.name))
27
+ continue;
28
+ seen.add(rel.name);
29
+ result.push(rel);
30
+ }
31
+ return result;
32
+ }
33
+ function emitRelationIncludeType(manifest, tableAccessor, relation) {
34
+ const typeName = `${pascalCase(tableAccessor)}${pascalCase(relation.name)}Include`;
35
+ const target = manifest.tables[relation.targetAccessor];
36
+ const columns = target?.columns ?? [];
37
+ const nestedWith = `${pascalCase(relation.targetAccessor)}With`;
38
+ return `export type ${typeName} =
39
+ | boolean
40
+ | {
41
+ select?: ${selectType(columns)};
42
+ orderBy?: ${orderByType(columns)};
43
+ limit?: number;
44
+ with?: ${nestedWith};
45
+ };`;
46
+ }
47
+ function emitTableWithType(manifest, table) {
48
+ const typeName = `${pascalCase(table.accessor)}With`;
49
+ const relations = effectiveRelations(manifest, table);
50
+ if (relations.length === 0) {
51
+ return `export type ${typeName} = Record<string, never>;`;
52
+ }
53
+ const fields = relations
54
+ .map((rel) => {
55
+ const includeType = `${pascalCase(table.accessor)}${pascalCase(rel.name)}Include`;
56
+ return ` ${rel.name}?: ${includeType};`;
57
+ })
58
+ .join("\n");
59
+ return `export type ${typeName} = {\n${fields}\n};`;
60
+ }
61
+ function throughAccessors(manifest) {
62
+ return new Set(manifest.manyToMany.map((m) => m.throughAccessor));
63
+ }
64
+ /** User-facing relations: FK/inverse plus M2M aliases, excluding junction-table hops */
65
+ function effectiveRelations(manifest, table) {
66
+ const through = throughAccessors(manifest);
67
+ const seen = new Set();
68
+ const result = [];
69
+ for (const rel of uniqueRelations(table)) {
70
+ if (through.has(rel.targetAccessor))
71
+ continue;
72
+ if (seen.has(rel.name))
73
+ continue;
74
+ seen.add(rel.name);
75
+ result.push(rel);
76
+ }
77
+ for (const m2m of manifest.manyToMany) {
78
+ if (m2m.leftAccessor === table.accessor && !seen.has(m2m.as)) {
79
+ seen.add(m2m.as);
80
+ result.push({
81
+ name: m2m.as,
82
+ targetTable: m2m.rightTable,
83
+ targetAccessor: m2m.rightAccessor,
84
+ fkColumn: m2m.leftFkColumn,
85
+ fkSqlColumn: m2m.leftFkColumn,
86
+ targetColumn: "id",
87
+ cardinality: "many",
88
+ inverse: m2m.inverse,
89
+ });
90
+ }
91
+ if (m2m.rightAccessor === table.accessor && !seen.has(m2m.inverse)) {
92
+ seen.add(m2m.inverse);
93
+ result.push({
94
+ name: m2m.inverse,
95
+ targetTable: m2m.leftTable,
96
+ targetAccessor: m2m.leftAccessor,
97
+ fkColumn: m2m.rightFkColumn,
98
+ fkSqlColumn: m2m.rightFkColumn,
99
+ targetColumn: "id",
100
+ cardinality: "many",
101
+ inverse: m2m.as,
102
+ });
103
+ }
104
+ }
105
+ return result;
106
+ }
107
+ export function emitIncludesTs(manifest) {
108
+ const lines = [
109
+ "// Auto-generated by neoorm generate — do not edit",
110
+ `import type { OrderDirection } from "neoorm/schema";`,
111
+ "",
112
+ ];
113
+ const tables = Object.values(manifest.tables).sort((a, b) => a.accessor.localeCompare(b.accessor));
114
+ for (const table of tables) {
115
+ for (const rel of effectiveRelations(manifest, table)) {
116
+ lines.push(emitRelationIncludeType(manifest, table.accessor, rel));
117
+ lines.push("");
118
+ }
119
+ }
120
+ for (const table of tables) {
121
+ lines.push(emitTableWithType(manifest, table));
122
+ lines.push("");
123
+ }
124
+ const includeMapEntries = tables
125
+ .map((t) => ` ${t.accessor}: ${pascalCase(t.accessor)}With;`)
126
+ .join("\n");
127
+ lines.push(`export type NeoOrmIncludes = {`);
128
+ lines.push(includeMapEntries);
129
+ lines.push(`};`);
130
+ lines.push("");
131
+ return lines.join("\n");
132
+ }
133
+ //# sourceMappingURL=emit-includes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-includes.js","sourceRoot":"","sources":["../../src/codegen/emit-includes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Manifest } from "../dialect/types.js";
2
+ import type { ManyToManyDef } from "../schema/many-to-many.js";
3
+ export declare function loadSchemaModule(schemaPath: string): Promise<{
4
+ schema: import("../schema/define-schema.js").SchemaDef<Record<string, import("../schema/table.js").TableDef>>;
5
+ manyToMany: ManyToManyDef[];
6
+ }>;
7
+ export declare function hashManifest(manifest: Manifest): string;
8
+ export declare function readSnapshot(outDir: string): Promise<Manifest | null>;
9
+ export declare function writeSnapshot(outDir: string, manifest: Manifest): Promise<void>;
10
+ export declare function emitManifestTs(manifest: Manifest, packageImportPath: string): string;
11
+ export declare function emitClientTs(schemaImportPath: string, packageImportPath: string): string;
12
+ export declare function diffManifest(prev: Manifest | null, next: Manifest): {
13
+ isInitial: boolean;
14
+ sql: string[];
15
+ };
16
+ export declare function writeMigration(outDir: string, sql: string[], name?: string): Promise<string | null>;
17
+ export declare function writeGeneratedFiles(outDir: string, manifest: Manifest, migrationSql: string[], schemaPath: string, projectRoot: string): Promise<{
18
+ migrationName: string | null;
19
+ }>;
20
+ export declare function generateFromSchema(schemaPath: string, outDir: string, projectRoot?: string): Promise<{
21
+ manifest: Manifest;
22
+ migrationName: string | null;
23
+ }>;
24
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/codegen/generate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA0B/D,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,MAAM,EAAE,OAAO,4BAA4B,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9G,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B,CAAC,CAqBD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAKvD;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAO3E;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAMpF;AAED,wBAAgB,YAAY,CAAC,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAWxF;AAkBD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,GAAG,IAAI,EACrB,IAAI,EAAE,QAAQ,GACb;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAgCvC;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBxB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,MAAM,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAyB3C;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAmB/D"}
@@ -0,0 +1,156 @@
1
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
2
+ import { join, relative, dirname } from "node:path";
3
+ import { createHash } from "node:crypto";
4
+ import { fileURLToPath } from "node:url";
5
+ import { postgresDialect } from "../dialect/postgres.js";
6
+ import { emitIncludesTs } from "./emit-includes.js";
7
+ async function resolveManyToManyDefs() {
8
+ const { getManyToManyRegistry } = await import("../schema/many-to-many.js");
9
+ const fromDist = getManyToManyRegistry();
10
+ if (fromDist.length > 0) {
11
+ return [...fromDist];
12
+ }
13
+ // tsx path aliases may load schema DSL from src/ while codegen runs from dist/
14
+ try {
15
+ const codegenDir = dirname(fileURLToPath(import.meta.url));
16
+ const { getManyToManyRegistry: getSrcRegistry } = await import(join(codegenDir, "../../src/schema/many-to-many.js"));
17
+ const fromSrc = getSrcRegistry();
18
+ if (fromSrc.length > 0) {
19
+ return [...fromSrc];
20
+ }
21
+ }
22
+ catch {
23
+ // src/ not available in published package — dist registry is authoritative
24
+ }
25
+ return [];
26
+ }
27
+ export async function loadSchemaModule(schemaPath) {
28
+ const { pathToFileURL } = await import("node:url");
29
+ const { register } = await import("tsx/esm/api");
30
+ const { clearManyToManyRegistry } = await import("../schema/many-to-many.js");
31
+ register();
32
+ clearManyToManyRegistry();
33
+ const url = pathToFileURL(schemaPath).href;
34
+ const mod = await import(url);
35
+ const schema = mod.schema ?? mod.default?.schema ?? mod.default;
36
+ if (!schema || !schema._tables) {
37
+ throw new Error(`Schema file must export a schema via \`export const schema = defineSchema(...)\``);
38
+ }
39
+ const manyToMany = await resolveManyToManyDefs();
40
+ return { schema, manyToMany };
41
+ }
42
+ export function hashManifest(manifest) {
43
+ return createHash("sha256")
44
+ .update(JSON.stringify(manifest))
45
+ .digest("hex")
46
+ .slice(0, 16);
47
+ }
48
+ export async function readSnapshot(outDir) {
49
+ try {
50
+ const content = await readFile(join(outDir, "snapshot.json"), "utf-8");
51
+ return JSON.parse(content);
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ }
57
+ export async function writeSnapshot(outDir, manifest) {
58
+ await mkdir(outDir, { recursive: true });
59
+ await writeFile(join(outDir, "snapshot.json"), JSON.stringify(manifest, null, 2), "utf-8");
60
+ }
61
+ export function emitManifestTs(manifest, packageImportPath) {
62
+ return `// Auto-generated by neoorm generate — do not edit
63
+ import type { Manifest } from "${packageImportPath}";
64
+
65
+ export const manifest = ${JSON.stringify(manifest, null, 2)} as const satisfies Manifest;
66
+ `;
67
+ }
68
+ export function emitClientTs(schemaImportPath, packageImportPath) {
69
+ return `// Auto-generated by neoorm generate — do not edit
70
+ import { createNeoOrmClient } from "${packageImportPath}";
71
+ import type { TypedNeoOrmClient } from "${packageImportPath}";
72
+ import { manifest } from "./manifest.js";
73
+ import { schema } from "${schemaImportPath}";
74
+ import type { NeoOrmIncludes } from "./includes.js";
75
+
76
+ export const db: TypedNeoOrmClient<typeof schema._tables, NeoOrmIncludes> =
77
+ createNeoOrmClient<typeof schema._tables, NeoOrmIncludes>(manifest);
78
+ `;
79
+ }
80
+ function toImportPath(fromDir, toFile) {
81
+ let importPath = relative(fromDir, toFile).replace(/\\/g, "/");
82
+ if (!importPath.startsWith(".")) {
83
+ importPath = `./${importPath}`;
84
+ }
85
+ return importPath.replace(/\.ts$/, ".js");
86
+ }
87
+ function schemaImportPath(outDir, schemaPath) {
88
+ return toImportPath(outDir, schemaPath);
89
+ }
90
+ function packageImportPath(outDir, projectRoot) {
91
+ return toImportPath(outDir, join(projectRoot, "dist/index.js"));
92
+ }
93
+ export function diffManifest(prev, next) {
94
+ if (!prev) {
95
+ const sql = Object.values(next.tables).map((t) => postgresDialect.emitCreateTable(t));
96
+ return { isInitial: true, sql };
97
+ }
98
+ const sql = [];
99
+ const prevTables = new Set(Object.keys(prev.tables));
100
+ const nextTables = new Set(Object.keys(next.tables));
101
+ for (const accessor of nextTables) {
102
+ if (!prevTables.has(accessor)) {
103
+ const table = next.tables[accessor];
104
+ sql.push(postgresDialect.emitCreateTable(table));
105
+ }
106
+ else {
107
+ const prevTable = prev.tables[accessor];
108
+ const nextTable = next.tables[accessor];
109
+ const prevCols = new Set(prevTable.columns.map((c) => c.sqlName));
110
+ const addColumns = nextTable.columns.filter((c) => !prevCols.has(c.sqlName));
111
+ if (addColumns.length > 0) {
112
+ sql.push(...postgresDialect.emitAlterTable(nextTable, { addColumns }));
113
+ }
114
+ }
115
+ }
116
+ return { isInitial: false, sql };
117
+ }
118
+ export async function writeMigration(outDir, sql, name) {
119
+ if (sql.length === 0)
120
+ return null;
121
+ const migrationsDir = join(outDir, "migrations");
122
+ await mkdir(migrationsDir, { recursive: true });
123
+ const timestamp = new Date()
124
+ .toISOString()
125
+ .replace(/[-:T.Z]/g, "")
126
+ .slice(0, 14);
127
+ const migrationName = name ?? `${timestamp}_migration`;
128
+ const migrationDir = join(migrationsDir, migrationName);
129
+ await mkdir(migrationDir, { recursive: true });
130
+ await writeFile(join(migrationDir, "migration.sql"), sql.join("\n\n"), "utf-8");
131
+ return migrationName;
132
+ }
133
+ export async function writeGeneratedFiles(outDir, manifest, migrationSql, schemaPath, projectRoot) {
134
+ await mkdir(outDir, { recursive: true });
135
+ await writeFile(join(outDir, "manifest.ts"), emitManifestTs(manifest, packageImportPath(outDir, projectRoot)), "utf-8");
136
+ await writeFile(join(outDir, "includes.ts"), emitIncludesTs(manifest), "utf-8");
137
+ await writeFile(join(outDir, "client.ts"), emitClientTs(schemaImportPath(outDir, schemaPath), packageImportPath(outDir, projectRoot)), "utf-8");
138
+ await writeSnapshot(outDir, manifest);
139
+ const migrationName = await writeMigration(outDir, migrationSql);
140
+ return { migrationName };
141
+ }
142
+ export async function generateFromSchema(schemaPath, outDir, projectRoot) {
143
+ const { schemaToManifest, validateManifest } = await import("./schema-to-manifest.js");
144
+ const { schema, manyToMany } = await loadSchemaModule(schemaPath);
145
+ const manifest = schemaToManifest(schema, manyToMany);
146
+ const errors = validateManifest(manifest);
147
+ if (errors.length > 0) {
148
+ throw new Error(`Schema validation failed:\n${errors.join("\n")}`);
149
+ }
150
+ const prev = await readSnapshot(outDir);
151
+ const { sql } = diffManifest(prev, manifest);
152
+ const root = projectRoot ?? process.cwd();
153
+ const { migrationName } = await writeGeneratedFiles(outDir, manifest, sql, schemaPath, root);
154
+ return { manifest, migrationName };
155
+ }
156
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/codegen/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { TableDef } from "../schema/table.js";
2
+ import type { Manifest } from "../dialect/types.js";
3
+ import type { ManyToManyDef } from "../schema/many-to-many.js";
4
+ export declare function schemaToManifest<T extends Record<string, TableDef>>(schema: {
5
+ readonly _tables: T;
6
+ }, m2mDefs?: readonly ManyToManyDef[]): Manifest;
7
+ export declare function validateManifest(manifest: Manifest): string[];
8
+ //# sourceMappingURL=schema-to-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-to-manifest.d.ts","sourceRoot":"","sources":["../../src/codegen/schema-to-manifest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,oBAAoB,CAAC;AAI/D,OAAO,KAAK,EACV,QAAQ,EAMT,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAsG/D,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EACjE,MAAM,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;CAAE,EAC/B,OAAO,GAAE,SAAS,aAAa,EAA4B,GAC1D,QAAQ,CAsIV;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,CA0B7D"}