orchid-orm 1.6.3 → 1.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin.js CHANGED
@@ -9,13 +9,17 @@ var prompts = require('prompts');
9
9
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
10
10
 
11
11
  var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
12
- var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
13
12
  var https__default = /*#__PURE__*/_interopDefaultLegacy(https);
14
13
  var prompts__default = /*#__PURE__*/_interopDefaultLegacy(prompts);
15
14
 
16
- const dirPath = path__default["default"].resolve(process.cwd(), "src", "db");
17
15
  const askOrchidORMConfig = async () => {
18
16
  const response = await prompts__default["default"]([
17
+ {
18
+ type: "text",
19
+ name: "path",
20
+ message: "Where would you like to install Orchid ORM?",
21
+ initial: "."
22
+ },
19
23
  {
20
24
  type: "select",
21
25
  name: "timestamp",
@@ -58,18 +62,20 @@ const askOrchidORMConfig = async () => {
58
62
  return response;
59
63
  };
60
64
  const initOrchidORM = async (config) => {
65
+ config.path = path.resolve(config.path);
66
+ const dirPath = path.join(config.path, "src", "db");
61
67
  await fs__default["default"].mkdir(dirPath, { recursive: true });
62
68
  await setupPackageJson(config);
63
- await setupTSConfig();
69
+ await setupTSConfig(config);
64
70
  await setupEnv(config);
65
- await setupGitIgnore();
66
- await setupBaseTable(config);
67
- await setupTables(config);
68
- await setupConfig(config);
69
- await setupMainDb(config);
70
- await setupMigrationScript(config);
71
- await createMigrations(config);
72
- await createSeed(config);
71
+ await setupGitIgnore(config);
72
+ await setupBaseTable(config, dirPath);
73
+ await setupTables(config, dirPath);
74
+ await setupConfig(config, dirPath);
75
+ await setupMainDb(config, dirPath);
76
+ await setupMigrationScript(config, dirPath);
77
+ await createMigrations(config, dirPath);
78
+ await createSeed(config, dirPath);
73
79
  greet();
74
80
  };
75
81
  const setupPackageJson = async (config) => {
@@ -94,7 +100,7 @@ const setupPackageJson = async (config) => {
94
100
  const [key, { version, kind }] = item;
95
101
  (kind === "dependencies" ? deps : devDeps)[key] = version;
96
102
  }
97
- const packageJsonPath = path__default["default"].resolve(process.cwd(), "package.json");
103
+ const packageJsonPath = path.join(config.path, "package.json");
98
104
  const content = await readFileSafe(packageJsonPath);
99
105
  const json = content ? JSON.parse(content) : {};
100
106
  if (!json.scripts)
@@ -113,20 +119,20 @@ const setupPackageJson = async (config) => {
113
119
  await fs__default["default"].writeFile(packageJsonPath, JSON.stringify(json, null, " ") + "\n");
114
120
  };
115
121
  const getLatestPackageVersion = (name, kind) => {
116
- return new Promise((resolve, reject) => {
122
+ return new Promise((resolve2, reject) => {
117
123
  https__default["default"].get(`https://registry.npmjs.org/${name}/latest`, (res) => {
118
124
  let data = "";
119
125
  res.on("data", (chunk) => data += chunk);
120
126
  res.on(
121
127
  "end",
122
- () => resolve([name, { version: `^${JSON.parse(data).version}`, kind }])
128
+ () => resolve2([name, { version: `^${JSON.parse(data).version}`, kind }])
123
129
  );
124
130
  }).on("error", reject);
125
131
  });
126
132
  };
127
- const readFileSafe = async (path2) => {
133
+ const readFileSafe = async (path) => {
128
134
  try {
129
- return await fs__default["default"].readFile(path2, "utf-8");
135
+ return await fs__default["default"].readFile(path, "utf-8");
130
136
  } catch (err) {
131
137
  if (err.code === "ENOENT") {
132
138
  return void 0;
@@ -134,9 +140,9 @@ const readFileSafe = async (path2) => {
134
140
  throw err;
135
141
  }
136
142
  };
137
- const setupTSConfig = async () => {
143
+ const setupTSConfig = async (config) => {
138
144
  var _a;
139
- const tsConfigPath = path__default["default"].resolve(process.cwd(), "tsconfig.json");
145
+ const tsConfigPath = path.join(config.path, "tsconfig.json");
140
146
  const content = await readFileSafe(tsConfigPath);
141
147
  const json = content ? JSON.parse(content) : {};
142
148
  if (!json["ts-node"]) {
@@ -154,7 +160,7 @@ const setupTSConfig = async () => {
154
160
  }
155
161
  };
156
162
  const setupEnv = async (config) => {
157
- const envPath = path__default["default"].resolve(process.cwd(), ".env");
163
+ const envPath = path.join(config.path, ".env");
158
164
  let content = (await readFileSafe(envPath) || "").trim();
159
165
  let changed = false;
160
166
  if (!content.match(/^DATABASE_URL=/m)) {
@@ -172,8 +178,8 @@ DATABASE_TEST_URL=postgres://user:password@localhost:5432/dbname-test?ssl=false`
172
178
  `);
173
179
  }
174
180
  };
175
- const setupGitIgnore = async () => {
176
- const gitignorePath = path__default["default"].resolve(process.cwd(), ".gitignore");
181
+ const setupGitIgnore = async (config) => {
182
+ const gitignorePath = path.join(config.path, ".gitignore");
177
183
  let content = (await readFileSafe(gitignorePath) || "").trim();
178
184
  let changed = false;
179
185
  if (!content.match(/^node_modules\b/m)) {
@@ -191,8 +197,8 @@ node_modules`;
191
197
  `);
192
198
  }
193
199
  };
194
- const setupBaseTable = async (config) => {
195
- const filePath = path__default["default"].join(dirPath, "baseTable.ts");
200
+ const setupBaseTable = async (config, dirPath) => {
201
+ const filePath = path.join(dirPath, "baseTable.ts");
196
202
  let content = `import { createBaseTable } from 'orchid-orm';
197
203
 
198
204
  export const BaseTable = createBaseTable({
@@ -211,20 +217,20 @@ export const BaseTable = createBaseTable({
211
217
  `;
212
218
  await fs__default["default"].writeFile(filePath, content);
213
219
  };
214
- const setupTables = async (config) => {
220
+ const setupTables = async (config, dirPath) => {
215
221
  if (!config.demoTables)
216
222
  return;
217
- const tablesDir = path__default["default"].join(dirPath, "tables");
223
+ const tablesDir = path.join(dirPath, "tables");
218
224
  await fs__default["default"].mkdir(tablesDir, { recursive: true });
219
225
  await fs__default["default"].writeFile(
220
- path__default["default"].join(tablesDir, "post.table.ts"),
226
+ path.join(tablesDir, "post.table.ts"),
221
227
  `import { BaseTable } from '../baseTable';
222
228
  import { CommentTable } from './comment.table';
223
229
  ${config.addSchemaToZod ? `import { tableToZod } from 'orchid-orm-schema-to-zod';
224
230
  ` : ""}
225
231
  export type Post = PostTable['columns']['type'];
226
232
  export class PostTable extends BaseTable {
227
- table = 'post';
233
+ readonly table = 'post';
228
234
  columns = this.setColumns((t) => ({
229
235
  id: t.serial().primaryKey(),
230
236
  title: t.text(3, 100).unique(),
@@ -244,14 +250,14 @@ export const postSchema = tableToZod(PostTable);
244
250
  ` : ""}`
245
251
  );
246
252
  await fs__default["default"].writeFile(
247
- path__default["default"].join(tablesDir, "comment.table.ts"),
253
+ path.join(tablesDir, "comment.table.ts"),
248
254
  `import { BaseTable } from '../baseTable';
249
255
  import { PostTable } from './post.table';
250
256
  ${config.addSchemaToZod ? `import { tableToZod } from 'orchid-orm-schema-to-zod';
251
257
  ` : ""}
252
258
  export type Comment = CommentTable['columns']['type'];
253
259
  export class CommentTable extends BaseTable {
254
- table = 'comment';
260
+ readonly table = 'comment';
255
261
  columns = this.setColumns((t) => ({
256
262
  id: t.serial().primaryKey(),
257
263
  postId: t
@@ -274,8 +280,8 @@ export const commentSchema = tableToZod(CommentTable);
274
280
  ` : ""}`
275
281
  );
276
282
  };
277
- const setupConfig = async (config) => {
278
- const configPath = path__default["default"].join(dirPath, "config.ts");
283
+ const setupConfig = async (config, dirPath) => {
284
+ const configPath = path.join(dirPath, "config.ts");
279
285
  let content = `import 'dotenv/config';
280
286
 
281
287
  const database = {
@@ -314,7 +320,7 @@ export const config = {`;
314
320
  `;
315
321
  await fs__default["default"].writeFile(configPath, content);
316
322
  };
317
- const setupMainDb = async (config) => {
323
+ const setupMainDb = async (config, dirPath) => {
318
324
  let imports = "";
319
325
  let tables = "";
320
326
  if (config.demoTables) {
@@ -325,7 +331,7 @@ import { CommentTable } from './tables/comment.table';`;
325
331
  post: PostTable,
326
332
  comment: CommentTable,`;
327
333
  }
328
- const dbPath = path__default["default"].join(dirPath, "db.ts");
334
+ const dbPath = path.join(dirPath, "db.ts");
329
335
  await fs__default["default"].writeFile(
330
336
  dbPath,
331
337
  `import { orchidORM } from 'orchid-orm';
@@ -336,8 +342,8 @@ export const db = orchidORM(config.database, {${tables}
336
342
  `
337
343
  );
338
344
  };
339
- const setupMigrationScript = async (config) => {
340
- const filePath = path__default["default"].join(dirPath, "dbScripts.ts");
345
+ const setupMigrationScript = async (config, dirPath) => {
346
+ const filePath = path.join(dirPath, "dbScripts.ts");
341
347
  await fs__default["default"].writeFile(
342
348
  filePath,
343
349
  `import { rakeDb } from 'rake-db';
@@ -363,13 +369,13 @@ rakeDb(${config.testDatabase ? "config.allDatabases" : "config.database"}, {
363
369
  `
364
370
  );
365
371
  };
366
- const createMigrations = async (config) => {
367
- const migrationsPath = path__default["default"].join(dirPath, "migrations");
372
+ const createMigrations = async (config, dirPath) => {
373
+ const migrationsPath = path.join(dirPath, "migrations");
368
374
  await fs__default["default"].mkdir(migrationsPath);
369
375
  if (!config.demoTables)
370
376
  return;
371
377
  const now = new Date();
372
- const postPath = path__default["default"].join(
378
+ const postPath = path.join(
373
379
  migrationsPath,
374
380
  `${makeFileTimeStamp(now)}_createPost.ts`
375
381
  );
@@ -388,7 +394,7 @@ change(async (db) => {
388
394
  `
389
395
  );
390
396
  now.setTime(now.getTime() + 1e3);
391
- const commentPath = path__default["default"].join(
397
+ const commentPath = path.join(
392
398
  migrationsPath,
393
399
  `${makeFileTimeStamp(now)}_createComment.ts`
394
400
  );
@@ -417,8 +423,8 @@ const makeFileTimeStamp = (now) => {
417
423
  now.getUTCSeconds()
418
424
  ].map((value) => value < 10 ? `0${value}` : value).join("");
419
425
  };
420
- const createSeed = async (config) => {
421
- const filePath = path__default["default"].join(dirPath, "seed.ts");
426
+ const createSeed = async (config, dirPath) => {
427
+ const filePath = path.join(dirPath, "seed.ts");
422
428
  let content;
423
429
  if (config.demoTables) {
424
430
  content = `await db.post.findBy({ title: 'Sample post' }).orCreate({
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sources":["../src/bin/init.ts","../src/bin/bin.ts"],"sourcesContent":["import fs from 'fs/promises';\nimport path from 'path';\nimport https from 'https';\nimport prompts from 'prompts';\n\nexport type InitConfig = {\n testDatabase?: boolean;\n addSchemaToZod?: boolean;\n addTestFactory?: boolean;\n demoTables?: boolean;\n timestamp?: 'date' | 'number';\n};\n\ntype DependencyKind = 'dependencies' | 'devDependencies';\n\nconst dirPath = path.resolve(process.cwd(), 'src', 'db');\n\nexport const askOrchidORMConfig = async () => {\n const response = await prompts([\n {\n type: 'select',\n name: 'timestamp',\n message: 'Preferred type of returned timestamps:',\n choices: [\n {\n title: 'string (as returned from db)',\n },\n {\n title: 'number (epoch)',\n value: 'number',\n },\n {\n title: 'Date object',\n value: 'date',\n },\n ],\n },\n {\n type: 'confirm',\n name: 'testDatabase',\n message: 'Should I add a separate database for tests?',\n },\n {\n type: 'confirm',\n name: 'addSchemaToZod',\n message: 'Are you going to use Zod for validation?',\n },\n {\n type: 'confirm',\n name: 'addTestFactory',\n message: 'Do you want object factories for writing tests?',\n },\n {\n type: 'confirm',\n name: 'demoTables',\n message: 'Should I add demo tables?',\n },\n ]);\n\n return response as InitConfig;\n};\n\nexport const initOrchidORM = async (config: InitConfig) => {\n await fs.mkdir(dirPath, { recursive: true });\n\n await setupPackageJson(config);\n await setupTSConfig();\n await setupEnv(config);\n await setupGitIgnore();\n await setupBaseTable(config);\n await setupTables(config);\n await setupConfig(config);\n await setupMainDb(config);\n await setupMigrationScript(config);\n await createMigrations(config);\n await createSeed(config);\n\n greet();\n};\n\nconst setupPackageJson = async (config: InitConfig) => {\n const pairs = await Promise.all([\n getLatestPackageVersion('dotenv', 'dependencies'),\n getLatestPackageVersion('orchid-orm', 'dependencies'),\n getLatestPackageVersion('pqb', 'dependencies'),\n getLatestPackageVersion('pg', 'dependencies'),\n config.addSchemaToZod &&\n getLatestPackageVersion('orchid-orm-schema-to-zod', 'dependencies'),\n getLatestPackageVersion('rake-db', 'devDependencies'),\n config.addTestFactory &&\n getLatestPackageVersion('orchid-orm-test-factory', 'devDependencies'),\n getLatestPackageVersion('@swc/core', 'devDependencies'),\n getLatestPackageVersion('@types/node', 'devDependencies'),\n getLatestPackageVersion('ts-node', 'devDependencies'),\n getLatestPackageVersion('typescript', 'devDependencies'),\n ]);\n\n const deps: Record<string, string> = {};\n const devDeps: Record<string, string> = {};\n for (const item of pairs) {\n if (!item) continue;\n const [key, { version, kind }] = item;\n (kind === 'dependencies' ? deps : devDeps)[key] = version;\n }\n\n const packageJsonPath = path.resolve(process.cwd(), 'package.json');\n const content = await readFileSafe(packageJsonPath);\n const json = content ? JSON.parse(content) : {};\n\n if (!json.scripts) json.scripts = {};\n json.scripts.db = 'ts-node src/db/dbScripts.ts';\n\n if (!json.dependencies) json.dependencies = {};\n\n for (const key in deps) {\n json.dependencies[key] = deps[key];\n }\n\n if (!json.devDependencies) json.devDependencies = {};\n for (const key in devDeps) {\n json.devDependencies[key] = devDeps[key];\n }\n\n await fs.writeFile(packageJsonPath, JSON.stringify(json, null, ' ') + '\\n');\n};\n\nconst getLatestPackageVersion = (\n name: string,\n kind: DependencyKind,\n): Promise<[string, { version: string; kind: DependencyKind }]> => {\n return new Promise((resolve, reject) => {\n https\n .get(`https://registry.npmjs.org/${name}/latest`, (res) => {\n let data = '';\n res.on('data', (chunk) => (data += chunk));\n res.on('end', () =>\n resolve([name, { version: `^${JSON.parse(data).version}`, kind }]),\n );\n })\n .on('error', reject);\n });\n};\n\nconst readFileSafe = async (path: string) => {\n try {\n return await fs.readFile(path, 'utf-8');\n } catch (err) {\n if ((err as unknown as { code: string }).code === 'ENOENT') {\n return undefined;\n }\n throw err;\n }\n};\n\nconst setupTSConfig = async () => {\n const tsConfigPath = path.resolve(process.cwd(), 'tsconfig.json');\n const content = await readFileSafe(tsConfigPath);\n const json = content ? JSON.parse(content) : {};\n if (!json['ts-node']) {\n json['ts-node'] = {};\n }\n if (!json['ts-node'].swc) {\n json['ts-node'].swc = true;\n }\n if (!json.compilerOptions?.strict) {\n if (!json.compilerOptions) json.compilerOptions = {};\n json.compilerOptions.strict = true;\n await fs.writeFile(tsConfigPath, `${JSON.stringify(json, null, ' ')}\\n`);\n }\n};\n\nconst setupEnv = async (config: InitConfig) => {\n const envPath = path.resolve(process.cwd(), '.env');\n let content = ((await readFileSafe(envPath)) || '').trim();\n let changed = false;\n\n if (!content.match(/^DATABASE_URL=/m)) {\n content += `\\nDATABASE_URL=postgres://user:password@localhost:5432/dbname?ssl=false`;\n changed = true;\n }\n\n if (config.testDatabase && !content.match(/^DATABASE_TEST_URL=/m)) {\n content += `\\nDATABASE_TEST_URL=postgres://user:password@localhost:5432/dbname-test?ssl=false`;\n changed = true;\n }\n\n if (changed) {\n await fs.writeFile(envPath, `${content.trim()}\\n`);\n }\n};\n\nconst setupGitIgnore = async () => {\n const gitignorePath = path.resolve(process.cwd(), '.gitignore');\n let content = ((await readFileSafe(gitignorePath)) || '').trim();\n let changed = false;\n\n if (!content.match(/^node_modules\\b/m)) {\n content += `\\nnode_modules`;\n changed = true;\n }\n\n if (!content.match(/^.env\\b/m)) {\n content += `\\n.env`;\n changed = true;\n }\n\n if (changed) {\n await fs.writeFile(gitignorePath, `${content.trim()}\\n`);\n }\n};\n\nconst setupBaseTable = async (config: InitConfig) => {\n const filePath = path.join(dirPath, 'baseTable.ts');\n\n let content = `import { createBaseTable } from 'orchid-orm';\n\nexport const BaseTable = createBaseTable({\n columnTypes: (t) => ({\n ...t,\n text: (min = 0, max = Infinity) => t.text(min, max),`;\n\n const { timestamp } = config;\n if (timestamp) {\n content += `\n timestamp: <P extends number>(precision?: P) =>\n t.timestamp<P>(precision).${\n timestamp === 'date' ? 'asDate' : 'asNumber'\n }(),`;\n }\n\n content += `\n }),\n});\n`;\n\n await fs.writeFile(filePath, content);\n};\n\nconst setupTables = async (config: InitConfig) => {\n if (!config.demoTables) return;\n\n const tablesDir = path.join(dirPath, 'tables');\n await fs.mkdir(tablesDir, { recursive: true });\n\n await fs.writeFile(\n path.join(tablesDir, 'post.table.ts'),\n `import { BaseTable } from '../baseTable';\nimport { CommentTable } from './comment.table';\n${\n config.addSchemaToZod\n ? `import { tableToZod } from 'orchid-orm-schema-to-zod';\\n`\n : ''\n}\nexport type Post = PostTable['columns']['type'];\nexport class PostTable extends BaseTable {\n table = 'post';\n columns = this.setColumns((t) => ({\n id: t.serial().primaryKey(),\n title: t.text(3, 100).unique(),\n text: t.text(20, 10000),\n ...t.timestamps(),\n }));\n\n relations = {\n comments: this.hasMany(() => CommentTable, {\n primaryKey: 'id',\n foreignKey: 'postId',\n }),\n };\n}\n${\n config.addSchemaToZod\n ? `\\nexport const postSchema = tableToZod(PostTable);\\n`\n : ''\n}`,\n );\n\n await fs.writeFile(\n path.join(tablesDir, 'comment.table.ts'),\n `import { BaseTable } from '../baseTable';\nimport { PostTable } from './post.table';\n${\n config.addSchemaToZod\n ? `import { tableToZod } from 'orchid-orm-schema-to-zod';\\n`\n : ''\n}\nexport type Comment = CommentTable['columns']['type'];\nexport class CommentTable extends BaseTable {\n table = 'comment';\n columns = this.setColumns((t) => ({\n id: t.serial().primaryKey(),\n postId: t\n .integer()\n .foreignKey(() => PostTable, 'id')\n .index(),\n text: t.text(5, 1000),\n ...t.timestamps(),\n }));\n\n relations = {\n post: this.belongsTo(() => PostTable, {\n primaryKey: 'id',\n foreignKey: 'postId',\n }),\n };\n}\n${\n config.addSchemaToZod\n ? `\\nexport const commentSchema = tableToZod(CommentTable);\\n`\n : ''\n}`,\n );\n};\n\nconst setupConfig = async (config: InitConfig) => {\n const configPath = path.join(dirPath, 'config.ts');\n\n let content = `import 'dotenv/config';\n\nconst database = {\n databaseURL: process.env.DATABASE_URL,\n};\nif (!database.databaseURL) throw new Error('DATABASE_URL is missing in .env');`;\n\n if (config.testDatabase) {\n content += `\n\nconst testDatabase = {\n databaseURL: process.env.DATABASE_TEST_URL,\n};\n\nconst allDatabases = [database];\n\nif (testDatabase.databaseURL) {\n allDatabases.push(testDatabase);\n}`;\n }\n\n content += `\n\nexport const config = {`;\n\n if (config.testDatabase) {\n content += `\n allDatabases,`;\n }\n\n if (config.testDatabase) {\n content += `\n database: process.env.NODE_ENV === 'test' ? testDatabase : database,`;\n } else {\n content += `\n database,`;\n }\n content += `\n};\n`;\n\n await fs.writeFile(configPath, content);\n};\n\nconst setupMainDb = async (config: InitConfig) => {\n let imports = '';\n let tables = '';\n if (config.demoTables) {\n imports += `\nimport { PostTable } from './tables/post.table';\nimport { CommentTable } from './tables/comment.table';`;\n tables += `\n post: PostTable,\n comment: CommentTable,`;\n }\n\n const dbPath = path.join(dirPath, 'db.ts');\n await fs.writeFile(\n dbPath,\n `import { orchidORM } from 'orchid-orm';\nimport { config } from './config';${imports}\n\nexport const db = orchidORM(config.database, {${tables}\n});\n`,\n );\n};\n\nconst setupMigrationScript = async (config: InitConfig) => {\n const filePath = path.join(dirPath, 'dbScripts.ts');\n await fs.writeFile(\n filePath,\n `import { rakeDb } from 'rake-db';\nimport { config } from './config';\nimport { appCodeUpdater } from 'orchid-orm';\n\nrakeDb(${config.testDatabase ? 'config.allDatabases' : 'config.database'}, {\n migrationsPath: './migrations',\n appCodeUpdater: appCodeUpdater({\n tablePath: (tableName) => \\`./tables/\\${tableName}.table.ts\\`,\n baseTablePath: './baseTable.ts',\n baseTableName: 'BaseTable',\n mainFilePath: './db.ts',\n }),\n useCodeUpdater: true, // set to false to disable code updater\n commands: {\n async seed() {\n const { seed } = await import('./seed');\n await seed();\n },\n },\n});\n`,\n );\n};\n\nconst createMigrations = async (config: InitConfig) => {\n const migrationsPath = path.join(dirPath, 'migrations');\n await fs.mkdir(migrationsPath);\n\n if (!config.demoTables) return;\n\n const now = new Date();\n\n const postPath = path.join(\n migrationsPath,\n `${makeFileTimeStamp(now)}_createPost.ts`,\n );\n await fs.writeFile(\n postPath,\n `import { change } from 'rake-db';\n\nchange(async (db) => {\n await db.createTable('post', (t) => ({\n id: t.serial().primaryKey(),\n title: t.text().unique(),\n text: t.text(),\n ...t.timestamps(),\n }));\n});\n`,\n );\n\n now.setTime(now.getTime() + 1000);\n\n const commentPath = path.join(\n migrationsPath,\n `${makeFileTimeStamp(now)}_createComment.ts`,\n );\n await fs.writeFile(\n commentPath,\n `import { change } from 'rake-db';\n\nchange(async (db) => {\n await db.createTable('comment', (t) => ({\n id: t.serial().primaryKey(),\n postId: t.integer().foreignKey('post', 'id').index(),\n text: t.text(),\n ...t.timestamps(),\n }));\n});\n`,\n );\n};\n\nconst makeFileTimeStamp = (now: Date) => {\n return [\n now.getUTCFullYear(),\n now.getUTCMonth() + 1,\n now.getUTCDate(),\n now.getUTCHours(),\n now.getUTCMinutes(),\n now.getUTCSeconds(),\n ]\n .map((value) => (value < 10 ? `0${value}` : value))\n .join('');\n};\n\nconst createSeed = async (config: InitConfig) => {\n const filePath = path.join(dirPath, 'seed.ts');\n\n let content;\n if (config.demoTables) {\n content = `await db.post.findBy({ title: 'Sample post' }).orCreate({\n title: 'Post',\n text: 'This is a text for a sample post. It contains words, spaces, and punctuation.',\n comments: {\n create: [\n {\n text: 'Nice post!',\n },\n {\n text: \\`Too long, didn't read\\`,\n },\n ],\n },\n });`;\n } else {\n content = `// create records here`;\n }\n\n await fs.writeFile(\n filePath,\n `import { db } from './db';\n\nexport const seed = async () => {\n ${content}\n\n await db.$close();\n};\n`,\n );\n};\n\nconst greet = () => {\n console.log(`\nThank you for trying Orchid ORM!\n \nTo finish setup, install dependencies:\n\n> npm i\n\nEnter the correct database credentials to the .env file,\nthen create the database:\n\n> npm run db create\n\nAnd run the migrations:\n\n> npm run db migrate\n`);\n};\n","import { askOrchidORMConfig, initOrchidORM } from './init';\n\naskOrchidORMConfig().then(initOrchidORM);\n"],"names":["path","prompts","fs","https"],"mappings":"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"}
1
+ {"version":3,"file":"bin.js","sources":["../src/bin/init.ts","../src/bin/bin.ts"],"sourcesContent":["import fs from 'fs/promises';\nimport { resolve, join } from 'path';\nimport https from 'https';\nimport prompts from 'prompts';\n\nexport type InitConfig = {\n path: string;\n testDatabase?: boolean;\n addSchemaToZod?: boolean;\n addTestFactory?: boolean;\n demoTables?: boolean;\n timestamp?: 'date' | 'number';\n};\n\ntype DependencyKind = 'dependencies' | 'devDependencies';\n\nexport const askOrchidORMConfig = async () => {\n const response = await prompts([\n {\n type: 'text',\n name: 'path',\n message: 'Where would you like to install Orchid ORM?',\n initial: '.',\n },\n {\n type: 'select',\n name: 'timestamp',\n message: 'Preferred type of returned timestamps:',\n choices: [\n {\n title: 'string (as returned from db)',\n },\n {\n title: 'number (epoch)',\n value: 'number',\n },\n {\n title: 'Date object',\n value: 'date',\n },\n ],\n },\n {\n type: 'confirm',\n name: 'testDatabase',\n message: 'Should I add a separate database for tests?',\n },\n {\n type: 'confirm',\n name: 'addSchemaToZod',\n message: 'Are you going to use Zod for validation?',\n },\n {\n type: 'confirm',\n name: 'addTestFactory',\n message: 'Do you want object factories for writing tests?',\n },\n {\n type: 'confirm',\n name: 'demoTables',\n message: 'Should I add demo tables?',\n },\n ]);\n\n return response as InitConfig;\n};\n\nexport const initOrchidORM = async (config: InitConfig) => {\n config.path = resolve(config.path);\n const dirPath = join(config.path, 'src', 'db');\n\n await fs.mkdir(dirPath, { recursive: true });\n\n await setupPackageJson(config);\n await setupTSConfig(config);\n await setupEnv(config);\n await setupGitIgnore(config);\n await setupBaseTable(config, dirPath);\n await setupTables(config, dirPath);\n await setupConfig(config, dirPath);\n await setupMainDb(config, dirPath);\n await setupMigrationScript(config, dirPath);\n await createMigrations(config, dirPath);\n await createSeed(config, dirPath);\n\n greet();\n};\n\nconst setupPackageJson = async (config: InitConfig) => {\n const pairs = await Promise.all([\n getLatestPackageVersion('dotenv', 'dependencies'),\n getLatestPackageVersion('orchid-orm', 'dependencies'),\n getLatestPackageVersion('pqb', 'dependencies'),\n getLatestPackageVersion('pg', 'dependencies'),\n config.addSchemaToZod &&\n getLatestPackageVersion('orchid-orm-schema-to-zod', 'dependencies'),\n getLatestPackageVersion('rake-db', 'devDependencies'),\n config.addTestFactory &&\n getLatestPackageVersion('orchid-orm-test-factory', 'devDependencies'),\n getLatestPackageVersion('@swc/core', 'devDependencies'),\n getLatestPackageVersion('@types/node', 'devDependencies'),\n getLatestPackageVersion('ts-node', 'devDependencies'),\n getLatestPackageVersion('typescript', 'devDependencies'),\n ]);\n\n const deps: Record<string, string> = {};\n const devDeps: Record<string, string> = {};\n for (const item of pairs) {\n if (!item) continue;\n const [key, { version, kind }] = item;\n (kind === 'dependencies' ? deps : devDeps)[key] = version;\n }\n\n const packageJsonPath = join(config.path, 'package.json');\n const content = await readFileSafe(packageJsonPath);\n const json = content ? JSON.parse(content) : {};\n\n if (!json.scripts) json.scripts = {};\n json.scripts.db = 'ts-node src/db/dbScripts.ts';\n\n if (!json.dependencies) json.dependencies = {};\n\n for (const key in deps) {\n json.dependencies[key] = deps[key];\n }\n\n if (!json.devDependencies) json.devDependencies = {};\n for (const key in devDeps) {\n json.devDependencies[key] = devDeps[key];\n }\n\n await fs.writeFile(packageJsonPath, JSON.stringify(json, null, ' ') + '\\n');\n};\n\nconst getLatestPackageVersion = (\n name: string,\n kind: DependencyKind,\n): Promise<[string, { version: string; kind: DependencyKind }]> => {\n return new Promise((resolve, reject) => {\n https\n .get(`https://registry.npmjs.org/${name}/latest`, (res) => {\n let data = '';\n res.on('data', (chunk) => (data += chunk));\n res.on('end', () =>\n resolve([name, { version: `^${JSON.parse(data).version}`, kind }]),\n );\n })\n .on('error', reject);\n });\n};\n\nconst readFileSafe = async (path: string) => {\n try {\n return await fs.readFile(path, 'utf-8');\n } catch (err) {\n if ((err as unknown as { code: string }).code === 'ENOENT') {\n return undefined;\n }\n throw err;\n }\n};\n\nconst setupTSConfig = async (config: InitConfig) => {\n const tsConfigPath = join(config.path, 'tsconfig.json');\n const content = await readFileSafe(tsConfigPath);\n const json = content ? JSON.parse(content) : {};\n if (!json['ts-node']) {\n json['ts-node'] = {};\n }\n if (!json['ts-node'].swc) {\n json['ts-node'].swc = true;\n }\n if (!json.compilerOptions?.strict) {\n if (!json.compilerOptions) json.compilerOptions = {};\n json.compilerOptions.strict = true;\n await fs.writeFile(tsConfigPath, `${JSON.stringify(json, null, ' ')}\\n`);\n }\n};\n\nconst setupEnv = async (config: InitConfig) => {\n const envPath = join(config.path, '.env');\n let content = ((await readFileSafe(envPath)) || '').trim();\n let changed = false;\n\n if (!content.match(/^DATABASE_URL=/m)) {\n content += `\\nDATABASE_URL=postgres://user:password@localhost:5432/dbname?ssl=false`;\n changed = true;\n }\n\n if (config.testDatabase && !content.match(/^DATABASE_TEST_URL=/m)) {\n content += `\\nDATABASE_TEST_URL=postgres://user:password@localhost:5432/dbname-test?ssl=false`;\n changed = true;\n }\n\n if (changed) {\n await fs.writeFile(envPath, `${content.trim()}\\n`);\n }\n};\n\nconst setupGitIgnore = async (config: InitConfig) => {\n const gitignorePath = join(config.path, '.gitignore');\n let content = ((await readFileSafe(gitignorePath)) || '').trim();\n let changed = false;\n\n if (!content.match(/^node_modules\\b/m)) {\n content += `\\nnode_modules`;\n changed = true;\n }\n\n if (!content.match(/^.env\\b/m)) {\n content += `\\n.env`;\n changed = true;\n }\n\n if (changed) {\n await fs.writeFile(gitignorePath, `${content.trim()}\\n`);\n }\n};\n\nconst setupBaseTable = async (config: InitConfig, dirPath: string) => {\n const filePath = join(dirPath, 'baseTable.ts');\n\n let content = `import { createBaseTable } from 'orchid-orm';\n\nexport const BaseTable = createBaseTable({\n columnTypes: (t) => ({\n ...t,\n text: (min = 0, max = Infinity) => t.text(min, max),`;\n\n const { timestamp } = config;\n if (timestamp) {\n content += `\n timestamp: <P extends number>(precision?: P) =>\n t.timestamp<P>(precision).${\n timestamp === 'date' ? 'asDate' : 'asNumber'\n }(),`;\n }\n\n content += `\n }),\n});\n`;\n\n await fs.writeFile(filePath, content);\n};\n\nconst setupTables = async (config: InitConfig, dirPath: string) => {\n if (!config.demoTables) return;\n\n const tablesDir = join(dirPath, 'tables');\n await fs.mkdir(tablesDir, { recursive: true });\n\n await fs.writeFile(\n join(tablesDir, 'post.table.ts'),\n `import { BaseTable } from '../baseTable';\nimport { CommentTable } from './comment.table';\n${\n config.addSchemaToZod\n ? `import { tableToZod } from 'orchid-orm-schema-to-zod';\\n`\n : ''\n}\nexport type Post = PostTable['columns']['type'];\nexport class PostTable extends BaseTable {\n readonly table = 'post';\n columns = this.setColumns((t) => ({\n id: t.serial().primaryKey(),\n title: t.text(3, 100).unique(),\n text: t.text(20, 10000),\n ...t.timestamps(),\n }));\n\n relations = {\n comments: this.hasMany(() => CommentTable, {\n primaryKey: 'id',\n foreignKey: 'postId',\n }),\n };\n}\n${\n config.addSchemaToZod\n ? `\\nexport const postSchema = tableToZod(PostTable);\\n`\n : ''\n}`,\n );\n\n await fs.writeFile(\n join(tablesDir, 'comment.table.ts'),\n `import { BaseTable } from '../baseTable';\nimport { PostTable } from './post.table';\n${\n config.addSchemaToZod\n ? `import { tableToZod } from 'orchid-orm-schema-to-zod';\\n`\n : ''\n}\nexport type Comment = CommentTable['columns']['type'];\nexport class CommentTable extends BaseTable {\n readonly table = 'comment';\n columns = this.setColumns((t) => ({\n id: t.serial().primaryKey(),\n postId: t\n .integer()\n .foreignKey(() => PostTable, 'id')\n .index(),\n text: t.text(5, 1000),\n ...t.timestamps(),\n }));\n\n relations = {\n post: this.belongsTo(() => PostTable, {\n primaryKey: 'id',\n foreignKey: 'postId',\n }),\n };\n}\n${\n config.addSchemaToZod\n ? `\\nexport const commentSchema = tableToZod(CommentTable);\\n`\n : ''\n}`,\n );\n};\n\nconst setupConfig = async (config: InitConfig, dirPath: string) => {\n const configPath = join(dirPath, 'config.ts');\n\n let content = `import 'dotenv/config';\n\nconst database = {\n databaseURL: process.env.DATABASE_URL,\n};\nif (!database.databaseURL) throw new Error('DATABASE_URL is missing in .env');`;\n\n if (config.testDatabase) {\n content += `\n\nconst testDatabase = {\n databaseURL: process.env.DATABASE_TEST_URL,\n};\n\nconst allDatabases = [database];\n\nif (testDatabase.databaseURL) {\n allDatabases.push(testDatabase);\n}`;\n }\n\n content += `\n\nexport const config = {`;\n\n if (config.testDatabase) {\n content += `\n allDatabases,`;\n }\n\n if (config.testDatabase) {\n content += `\n database: process.env.NODE_ENV === 'test' ? testDatabase : database,`;\n } else {\n content += `\n database,`;\n }\n content += `\n};\n`;\n\n await fs.writeFile(configPath, content);\n};\n\nconst setupMainDb = async (config: InitConfig, dirPath: string) => {\n let imports = '';\n let tables = '';\n if (config.demoTables) {\n imports += `\nimport { PostTable } from './tables/post.table';\nimport { CommentTable } from './tables/comment.table';`;\n tables += `\n post: PostTable,\n comment: CommentTable,`;\n }\n\n const dbPath = join(dirPath, 'db.ts');\n await fs.writeFile(\n dbPath,\n `import { orchidORM } from 'orchid-orm';\nimport { config } from './config';${imports}\n\nexport const db = orchidORM(config.database, {${tables}\n});\n`,\n );\n};\n\nconst setupMigrationScript = async (config: InitConfig, dirPath: string) => {\n const filePath = join(dirPath, 'dbScripts.ts');\n await fs.writeFile(\n filePath,\n `import { rakeDb } from 'rake-db';\nimport { config } from './config';\nimport { appCodeUpdater } from 'orchid-orm';\n\nrakeDb(${config.testDatabase ? 'config.allDatabases' : 'config.database'}, {\n migrationsPath: './migrations',\n appCodeUpdater: appCodeUpdater({\n tablePath: (tableName) => \\`./tables/\\${tableName}.table.ts\\`,\n baseTablePath: './baseTable.ts',\n baseTableName: 'BaseTable',\n mainFilePath: './db.ts',\n }),\n useCodeUpdater: true, // set to false to disable code updater\n commands: {\n async seed() {\n const { seed } = await import('./seed');\n await seed();\n },\n },\n});\n`,\n );\n};\n\nconst createMigrations = async (config: InitConfig, dirPath: string) => {\n const migrationsPath = join(dirPath, 'migrations');\n await fs.mkdir(migrationsPath);\n\n if (!config.demoTables) return;\n\n const now = new Date();\n\n const postPath = join(\n migrationsPath,\n `${makeFileTimeStamp(now)}_createPost.ts`,\n );\n await fs.writeFile(\n postPath,\n `import { change } from 'rake-db';\n\nchange(async (db) => {\n await db.createTable('post', (t) => ({\n id: t.serial().primaryKey(),\n title: t.text().unique(),\n text: t.text(),\n ...t.timestamps(),\n }));\n});\n`,\n );\n\n now.setTime(now.getTime() + 1000);\n\n const commentPath = join(\n migrationsPath,\n `${makeFileTimeStamp(now)}_createComment.ts`,\n );\n await fs.writeFile(\n commentPath,\n `import { change } from 'rake-db';\n\nchange(async (db) => {\n await db.createTable('comment', (t) => ({\n id: t.serial().primaryKey(),\n postId: t.integer().foreignKey('post', 'id').index(),\n text: t.text(),\n ...t.timestamps(),\n }));\n});\n`,\n );\n};\n\nconst makeFileTimeStamp = (now: Date) => {\n return [\n now.getUTCFullYear(),\n now.getUTCMonth() + 1,\n now.getUTCDate(),\n now.getUTCHours(),\n now.getUTCMinutes(),\n now.getUTCSeconds(),\n ]\n .map((value) => (value < 10 ? `0${value}` : value))\n .join('');\n};\n\nconst createSeed = async (config: InitConfig, dirPath: string) => {\n const filePath = join(dirPath, 'seed.ts');\n\n let content;\n if (config.demoTables) {\n content = `await db.post.findBy({ title: 'Sample post' }).orCreate({\n title: 'Post',\n text: 'This is a text for a sample post. It contains words, spaces, and punctuation.',\n comments: {\n create: [\n {\n text: 'Nice post!',\n },\n {\n text: \\`Too long, didn't read\\`,\n },\n ],\n },\n });`;\n } else {\n content = `// create records here`;\n }\n\n await fs.writeFile(\n filePath,\n `import { db } from './db';\n\nexport const seed = async () => {\n ${content}\n\n await db.$close();\n};\n`,\n );\n};\n\nconst greet = () => {\n console.log(`\nThank you for trying Orchid ORM!\n \nTo finish setup, install dependencies:\n\n> npm i\n\nEnter the correct database credentials to the .env file,\nthen create the database:\n\n> npm run db create\n\nAnd run the migrations:\n\n> npm run db migrate\n`);\n};\n","import { askOrchidORMConfig, initOrchidORM } from './init';\n\naskOrchidORMConfig().then(initOrchidORM);\n"],"names":["prompts","resolve","join","fs","https"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as pqb from 'pqb';
2
- import { BelongsToRelation, HasManyRelation, HasOneRelation, Db, Adapter, FromArgs, Query, FromResult, AdapterOptions, QueryLogOptions, NoPrimaryKeyOption, HasAndBelongsToManyRelation, defaultsKey, BaseRelation, RelationQuery, SetQueryReturnsOne, SetQueryReturnsOneOptional, SetQueryReturnsAll, DefaultColumnTypes, ColumnsShape, WhereResult, MergeQuery, SetQueryReturns, QueryReturnType } from 'pqb';
2
+ import { BelongsToRelation, HasManyRelation, HasOneRelation, Db, Adapter, FromArgs, Query, FromResult, AdapterOptions, QueryLogOptions, NoPrimaryKeyOption, HasAndBelongsToManyRelation, SetQueryTableAlias, defaultsKey, BaseRelation, RelationQuery, SetQueryReturnsOne, SetQueryReturnsOneOptional, SetQueryReturnsAll, DefaultColumnTypes, ColumnsShape, WhereResult, MergeQuery, SetQueryReturns, QueryReturnType } from 'pqb';
3
3
  export { columnTypes } from 'pqb';
4
4
  import * as orchid_core from 'orchid-core';
5
- import { EmptyObject, ColumnTypesBase, ColumnShapeOutput, SetOptional } from 'orchid-core';
5
+ import { StringKey, EmptyObject, ColumnTypesBase, ColumnShapeOutput, SetOptional } from 'orchid-core';
6
6
  import { AppCodeUpdater } from 'rake-db';
7
7
 
8
8
  interface BelongsTo extends RelationThunkBase {
@@ -97,7 +97,7 @@ interface RelationThunkBase {
97
97
  }
98
98
  declare type RelationThunk = BelongsTo | HasOne | HasMany | HasAndBelongsToMany;
99
99
  declare type RelationThunks = Record<string, RelationThunk>;
100
- declare type Relation<T extends Table, Relations extends RelationThunks, K extends keyof Relations, M extends Query = DbTable<ReturnType<Relations[K]['fn']>>, Info extends RelationInfo = RelationInfo<T, Relations, Relations[K]>> = {
100
+ declare type Relation<T extends Table, Relations extends RelationThunks, K extends StringKey<keyof Relations>, M extends Query = SetQueryTableAlias<DbTable<ReturnType<Relations[K]['fn']>>, K>, Info extends RelationInfo = RelationInfo<T, Relations, Relations[K]>> = {
101
101
  type: Relations[K]['type'];
102
102
  returns: Relations[K]['returns'];
103
103
  key: K;
@@ -126,7 +126,7 @@ declare type MapRelations<T extends Table> = 'relations' extends keyof T ? T['re
126
126
  declare type TableClass<T extends Table = Table> = new () => T;
127
127
  declare type TableClasses = Record<string, TableClass>;
128
128
  declare type TableToDb<T extends Table> = Db<T['table'], T['columns']['shape'], 'relations' extends keyof T ? T['relations'] extends RelationThunks ? {
129
- [K in keyof T['relations']]: Relation<T, T['relations'], K>;
129
+ [K in StringKey<keyof T['relations']>]: Relation<T, T['relations'], K>;
130
130
  } : Query['relations'] : Query['relations'], T['columnTypes']> & {
131
131
  definedAs: string;
132
132
  db: OrchidORM<TableClasses>;
package/dist/index.js CHANGED
@@ -390,36 +390,41 @@ const makeHasOneMethod = (table, relation, relationName, query) => {
390
390
  if ("through" in relation.options) {
391
391
  const { through, source } = relation.options;
392
392
  const throughRelation = getThroughRelation(table, through);
393
- const throughTable = throughRelation.table;
394
393
  const sourceRelation = getSourceRelation(throughRelation, source);
395
394
  const sourceQuery = sourceRelation.joinQuery(throughRelation.query, sourceRelation.query).as(relationName);
395
+ const whereExistsCallback = () => sourceQuery;
396
396
  return {
397
397
  returns: "one",
398
398
  method: (params) => {
399
399
  const throughQuery = table[through](params);
400
- return query.whereExists(throughTable, () => sourceQuery.merge(throughQuery));
400
+ return query.whereExists(
401
+ throughQuery,
402
+ whereExistsCallback
403
+ );
401
404
  },
402
405
  joinQuery(fromQuery, toQuery) {
403
- return toQuery.whereExists(throughTable, () => {
404
- const as = pqb.getQueryAs(toQuery);
405
- return throughRelation.joinQuery(fromQuery, throughRelation.query).merge(
406
- sourceRelation.joinQuery(
406
+ return toQuery.whereExists(
407
+ throughRelation.joinQuery(fromQuery, throughRelation.query),
408
+ () => {
409
+ const as = pqb.getQueryAs(toQuery);
410
+ return sourceRelation.joinQuery(
407
411
  throughRelation.query,
408
412
  sourceRelation.query.as(as)
409
- )
410
- );
411
- });
413
+ );
414
+ }
415
+ );
412
416
  },
413
417
  reverseJoin(fromQuery, toQuery) {
414
- return fromQuery.whereExists(throughTable, () => {
415
- const as = pqb.getQueryAs(toQuery);
416
- return throughRelation.joinQuery(fromQuery, throughRelation.query).merge(
417
- sourceRelation.joinQuery(
418
+ return fromQuery.whereExists(
419
+ throughRelation.joinQuery(fromQuery, throughRelation.query),
420
+ () => {
421
+ const as = pqb.getQueryAs(toQuery);
422
+ return sourceRelation.joinQuery(
418
423
  throughRelation.query,
419
424
  sourceRelation.query.as(as)
420
- )
421
- );
422
- });
425
+ );
426
+ }
427
+ );
423
428
  },
424
429
  primaryKey: sourceRelation.primaryKey
425
430
  };
@@ -577,40 +582,45 @@ const makeHasManyMethod = (table, relation, relationName, query) => {
577
582
  if ("through" in relation.options) {
578
583
  const { through, source } = relation.options;
579
584
  const throughRelation = getThroughRelation(table, through);
580
- const throughTable = throughRelation.table.as(through);
581
585
  const sourceRelation = getSourceRelation(throughRelation, source);
582
586
  const sourceRelationQuery = sourceRelation.query.as(relationName);
583
587
  const sourceQuery = sourceRelation.joinQuery(
584
588
  throughRelation.query,
585
589
  sourceRelationQuery
586
590
  );
591
+ const whereExistsCallback = () => sourceQuery;
587
592
  return {
588
593
  returns: "many",
589
594
  method: (params) => {
590
595
  const throughQuery = table[through](params);
591
- return query.whereExists(throughTable, () => sourceQuery.merge(throughQuery));
596
+ return query.whereExists(
597
+ throughQuery,
598
+ whereExistsCallback
599
+ );
592
600
  },
593
601
  joinQuery(fromQuery, toQuery) {
594
- return toQuery.whereExists(throughTable, () => {
595
- const as = pqb.getQueryAs(toQuery);
596
- return throughRelation.joinQuery(fromQuery, throughRelation.query).merge(
597
- sourceRelation.joinQuery(
602
+ return toQuery.whereExists(
603
+ throughRelation.joinQuery(fromQuery, throughRelation.query),
604
+ () => {
605
+ const as = pqb.getQueryAs(toQuery);
606
+ return sourceRelation.joinQuery(
598
607
  throughRelation.query,
599
608
  sourceRelation.query.as(as)
600
- )
601
- );
602
- });
609
+ );
610
+ }
611
+ );
603
612
  },
604
613
  reverseJoin(fromQuery, toQuery) {
605
- return fromQuery.whereExists(throughTable, () => {
606
- const as = pqb.getQueryAs(toQuery);
607
- return throughRelation.joinQuery(fromQuery, throughRelation.query).merge(
608
- sourceRelation.joinQuery(
614
+ return fromQuery.whereExists(
615
+ throughRelation.joinQuery(fromQuery, throughRelation.query),
616
+ () => {
617
+ const as = pqb.getQueryAs(toQuery);
618
+ return sourceRelation.joinQuery(
609
619
  throughRelation.query,
610
620
  sourceRelation.query.as(as)
611
- )
612
- );
613
- });
621
+ );
622
+ }
623
+ );
614
624
  },
615
625
  primaryKey: sourceRelation.primaryKey
616
626
  };
@@ -817,6 +827,13 @@ class HasAndBelongsToManyVirtualColumn extends pqb.VirtualColumn {
817
827
  );
818
828
  }
819
829
  }
830
+ const removeColumnName = (column) => {
831
+ if (!column.data.name)
832
+ return column;
833
+ const cloned = Object.create(column);
834
+ cloned.data = __spreadProps$3(__spreadValues$4({}, column.data), { name: void 0 });
835
+ return cloned;
836
+ };
820
837
  const makeHasAndBelongsToManyMethod = (table, qb, relation, relationName, query) => {
821
838
  const {
822
839
  primaryKey: pk,
@@ -832,8 +849,8 @@ const makeHasAndBelongsToManyMethod = (table, qb, relation, relationName, query)
832
849
  baseQuery.baseQuery = baseQuery;
833
850
  baseQuery.table = joinTable;
834
851
  baseQuery.shape = {
835
- [fk]: table.shape[pk],
836
- [afk]: query.shape[apk]
852
+ [fk]: removeColumnName(table.shape[pk]),
853
+ [afk]: removeColumnName(query.shape[apk])
837
854
  };
838
855
  baseQuery.query = __spreadProps$3(__spreadValues$4({}, baseQuery.query), {
839
856
  shape: baseQuery.shape
@@ -866,15 +883,19 @@ const makeHasAndBelongsToManyMethod = (table, qb, relation, relationName, query)
866
883
  state
867
884
  ),
868
885
  joinQuery(fromQuery, toQuery) {
869
- return toQuery.whereExists(
886
+ const join = toQuery.whereExists(
870
887
  subQuery,
871
- (q) => q._on(associationForeignKeyFull, `${pqb.getQueryAs(toQuery)}.${pk}`)._on(foreignKeyFull, `${pqb.getQueryAs(fromQuery)}.${pk}`)
888
+ (q) => q._on(associationForeignKeyFull, `${pqb.getQueryAs(toQuery)}.${apk}`)._on(foreignKeyFull, `${pqb.getQueryAs(fromQuery)}.${pk}`)
872
889
  );
890
+ join.query.joinedShapes = __spreadProps$3(__spreadValues$4({}, join.query.joinedShapes), {
891
+ [fromQuery.query.as || fromQuery.table]: fromQuery.query.shape
892
+ });
893
+ return join;
873
894
  },
874
895
  reverseJoin(fromQuery, toQuery) {
875
896
  return fromQuery.whereExists(
876
897
  subQuery,
877
- (q) => q._on(associationForeignKeyFull, `${pqb.getQueryAs(toQuery)}.${pk}`)._on(foreignKeyFull, `${pqb.getQueryAs(fromQuery)}.${pk}`)
898
+ (q) => q._on(associationForeignKeyFull, `${pqb.getQueryAs(toQuery)}.${apk}`)._on(foreignKeyFull, `${pqb.getQueryAs(fromQuery)}.${pk}`)
878
899
  );
879
900
  },
880
901
  primaryKey: pk,
@@ -1238,11 +1259,8 @@ const makeRelationQuery = (table, definedAs, relationName, data) => {
1238
1259
  toTable._take();
1239
1260
  }
1240
1261
  const query = this.isSubQuery ? toTable : toTable._whereExists(
1241
- this,
1242
- (q) => data.reverseJoin(
1243
- q,
1244
- toTable
1245
- )
1262
+ this.baseQuery,
1263
+ (q) => data.reverseJoin(this, toTable)
1246
1264
  );
1247
1265
  query.query[pqb.relationQueryKey] = {
1248
1266
  relationName,
@@ -1787,7 +1805,7 @@ const createTable = async (_a) => {
1787
1805
  if (ast.schema) {
1788
1806
  props.push(`schema = ${orchidCore.singleQuote(ast.schema)};`);
1789
1807
  }
1790
- props.push(`table = ${orchidCore.singleQuote(ast.name)};`);
1808
+ props.push(`readonly table = ${orchidCore.singleQuote(ast.name)};`);
1791
1809
  if (ast.noPrimaryKey === "ignore") {
1792
1810
  props.push("noPrimaryKey = true;");
1793
1811
  }