Skip to content

Commit

Permalink
refactor(schema): using command's app container to get access to the …
Browse files Browse the repository at this point in the history
…db instance
  • Loading branch information
tomgobich committed Sep 16, 2024
1 parent 79e9fa9 commit 9b3b9a0
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 42 deletions.
11 changes: 5 additions & 6 deletions commands/generate_models.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { inject } from '@adonisjs/core'
import { BaseCommand } from '@adonisjs/core/ace'
import type { CommandOptions } from '@adonisjs/core/types/ace'
import Schema from '../src/db/schema.js'
import { CommandOptions } from '@adonisjs/core/types/ace'
import Model from '../src/model/index.js'
import { schema } from '../src/db/schema.js'

export default class GenerateModels extends BaseCommand {
static commandName = 'generate:models'
Expand All @@ -12,9 +11,9 @@ export default class GenerateModels extends BaseCommand {
startApp: true,
}

@inject()
async run(schema: Schema) {
const tables = await schema.getTables()
async run() {
const db = await this.app.container.make('lucid.db')
const { tables } = await schema(db)
const models = Model.build(tables)

console.log({ models })
Expand Down
8 changes: 7 additions & 1 deletion configure.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,10 @@

import ConfigureCommand from '@adonisjs/core/commands/configure'

export async function configure(_command: ConfigureCommand) {}
export async function configure(command: ConfigureCommand) {
const codemods = await command.createCodemods()

await codemods.updateRcFile((rcFile) => {
rcFile.addCommand('@adocasts.com/generate-models/commands')
})
}
2 changes: 2 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import { configApp } from '@adonisjs/eslint-config'
export default configApp()
40 changes: 21 additions & 19 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,61 +1,66 @@
{
"name": "generate-models",
"name": "@adocasts.com/generate-models",
"description": "Generate Lucid Models from an existing database schema",
"version": "0.0.0",
"engines": {
"node": ">=20.6.0"
},
"type": "module",
"files": [
"build/commands",
"build/src",
"build/providers",
"build/stubs",
"build/configure.d.ts",
"build/configure.js",
"build/index.d.ts",
"build/index.js"
],
"exports": {
".": "./build/index.js",
"./commands": "./build/commands/main.js",
"./types": "./build/src/types.js"
},
"scripts": {
"clean": "del-cli build",
"copy:templates": "copyfiles \"stubs/**/*.stub\" build",
"typecheck": "tsc --noEmit",
"lint": "eslint . --ext=.ts",
"lint": "eslint .",
"format": "prettier --write .",
"quick:test": "node --import=./tsnode.esm.js --enable-source-maps bin/test.ts",
"pretest": "npm run lint",
"test": "c8 npm run quick:test",
"prebuild": "npm run lint && npm run clean",
"build": "tsc",
"postbuild": "npm run copy:templates",
"postbuild": "npm run copy:templates && npm run index:commands",
"index:commands": "adonis-kit index build/commands",
"release": "np",
"version": "npm run build",
"prepublishOnly": "npm run build"
},
"devDependencies": {
"@adonisjs/assembler": "^7.7.0",
"@adonisjs/core": "^6.12.0",
"@adonisjs/eslint-config": "^1.3.0",
"@adonisjs/assembler": "^7.8.2",
"@adonisjs/core": "^6.13.1",
"@adonisjs/eslint-config": "^2.0.0-beta.6",
"@adonisjs/lucid": "^21.2.0",
"@adonisjs/prettier-config": "^1.3.0",
"@adonisjs/tsconfig": "^1.3.0",
"@adonisjs/prettier-config": "^1.4.0",
"@adonisjs/tsconfig": "^1.4.0",
"@japa/assert": "^3.0.0",
"@japa/runner": "^3.1.4",
"@swc/core": "^1.6.3",
"@types/node": "^20.14.5",
"@swc/core": "^1.7.26",
"@types/node": "^22.5.5",
"c8": "^10.1.2",
"copyfiles": "^2.4.1",
"del-cli": "^5.1.0",
"eslint": "^8.57.0",
"eslint": "^9.10.0",
"knex-schema-inspector": "^3.1.0",
"np": "^10.0.6",
"prettier": "^3.3.2",
"np": "^10.0.7",
"prettier": "^3.3.3",
"ts-node": "^10.9.2",
"typescript": "^5.4.5"
"ts-node-maintained": "^10.9.4",
"typescript": "^5.6.2"
},
"peerDependencies": {
"@adonisjs/core": "^6.2.0",
"@adonisjs/core": "^6.13.1",
"@adonisjs/lucid": "^21.2.0"
},
"author": "tomgobich,adocasts.com",
Expand All @@ -66,9 +71,6 @@
"model",
"generate"
],
"eslintConfig": {
"extends": "@adonisjs/eslint-config/package"
},
"prettier": "@adonisjs/prettier-config",
"publishConfig": {
"access": "public",
Expand Down
29 changes: 13 additions & 16 deletions src/db/schema.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,26 @@
import db from '@adonisjs/lucid/services/db'
import { Database } from '@adonisjs/lucid/database'
import { default as schemaInspectorImport } from 'knex-schema-inspector'
import type { Column } from 'knex-schema-inspector/dist/types/column.js'
import type { SchemaInspector } from 'knex-schema-inspector/dist/types/schema-inspector.js'
const schemaInspector = schemaInspectorImport.default

export type TableSchema = {
name: string
columns: Column[]
}

export default class Schema {
declare inspector: SchemaInspector
export async function schema(db: Database) {
const knex = db.connection().getWriteClient()
const inspector = schemaInspector(knex)
const tableNames = await inspector.tables()
const promises = tableNames.map(async (name) => ({
name,
columns: await inspector.columnInfo(name),
}))

constructor() {
const knex = db.connection().getWriteClient()
this.inspector = schemaInspector(knex)
}

async getTables(): Promise<TableSchema[]> {
const tableNames = await this.inspector.tables()
const promises = tableNames.map(async (name) => ({
name,
columns: await this.inspector.columnInfo(name),
}))
const tables = await Promise.all(promises)

return Promise.all(promises)
return {
inspector,
tables,
}
}

0 comments on commit 9b3b9a0

Please sign in to comment.