ad-on-is / adonis-autoswagger

Auto-Generate swagger docs for AdonisJS
MIT License
97 stars 32 forks source link

No such file or directory #68

Closed FelipeQueFez closed 3 months ago

FelipeQueFez commented 3 months ago

I am using this package at 3.4.1 with Adonis 6.2.2 and node 20.11.1

But have the following error:

╭─────────────────────────────────────────────────╮
│                                                 │
│    Server address: http://localhost:3333        │
│    File system watcher: enabled                 │
│    Ready in: 445 ms                             │
│                                                 │
╰─────────────────────────────────────────────────╯
[ info ] watching file system for changes...
[13:30:38.100] ERROR (26452): ENOENT: no such file or directory, open 'D:\development\projects\soluevo\voomp_play_member_app\BFF\my-adonisjs-app\app\controllers\members_controller.js.ts'
    request_id: "su506xbfsleqaa91reph0d89"
    x-request-id: "su506xbfsleqaa91reph0d89"
    err: {
      "type": "Error",
      "message": "ENOENT: no such file or directory, open 'D:\\development\\projects\\soluevo\\voomp_play_member_app\\BFF\\my-adonisjs-app\\app\\controllers\\members_controller.js.ts'",
      "stack":
          Error: ENOENT: no such file or directory, open 'D:\development\projects\soluevo\voomp_play_member_app\BFF\my-adonisjs-app\app\controllers\members_controller.js.ts'
      "errno": -4058,
      "code": "ENOENT",
      "syscall": "open",
      "path": "D:\\development\\projects\\soluevo\\voomp_play_member_app\\BFF\\my-adonisjs-app\\app\\controllers\\members_controller.js.ts",
      "status": 500
    }

Package.json

{
  "name": "my-adonisjs-app",
  "version": "0.0.0",
  "private": true,
  "type": "module",
  "license": "UNLICENSED",
  "scripts": {
    "start": "node bin/server.js",
    "build": "node ace build",
    "dev": "node ace serve --watch",
    "test": "node ace test",
    "lint": "eslint .",
    "format": "prettier --write .",
    "typecheck": "tsc --noEmit"
  },
  "imports": {
    "#controllers/*": "./app/controllers/*.js",
    "#exceptions/*": "./app/exceptions/*.js",
    "#models/*": "./app/models/*.js",
    "#mails/*": "./app/mails/*.js",
    "#services/*": "./app/services/*.js",
    "#listeners/*": "./app/listeners/*.js",
    "#events/*": "./app/events/*.js",
    "#middleware/*": "./app/middleware/*.js",
    "#validators/*": "./app/validators/*.js",
    "#providers/*": "./providers/*.js",
    "#policies/*": "./app/policies/*.js",
    "#abilities/*": "./app/abilities/*.js",
    "#database/*": "./database/*.js",
    "#start/*": "./start/*.js",
    "#tests/*": "./tests/*.js",
    "#config/*": "./config/*.js"
  },
  "devDependencies": {
    "@adonisjs/assembler": "^7.1.1",
    "@adonisjs/eslint-config": "^1.2.1",
    "@adonisjs/prettier-config": "^1.2.1",
    "@adonisjs/tsconfig": "^1.2.1",
    "@japa/api-client": "^2.0.2",
    "@japa/assert": "^2.1.0",
    "@japa/plugin-adonisjs": "^3.0.0",
    "@japa/runner": "^3.1.1",
    "@swc/core": "^1.3.107",
    "@types/node": "^20.11.10",
    "eslint": "^8.56.0",
    "pino-pretty": "^10.3.1",
    "prettier": "^3.2.4",
    "ts-node": "^10.9.2",
    "typescript": "^5.3.3"
  },
  "dependencies": {
    "@adonisjs/auth": "^9.1.1",
    "@adonisjs/core": "^6.2.2",
    "@adonisjs/cors": "^2.2.1",
    "@adonisjs/lucid": "^20.1.0",
    "@vinejs/vine": "^1.7.1",
    "adonis-autoswagger": "^3.4.1",
    "axios": "^1.6.8",
    "reflect-metadata": "^0.2.1"
  },
  "eslintConfig": {
    "extends": "@adonisjs/eslint-config/app"
  },
  "prettier": "@adonisjs/prettier-config"
}

swagger.ts

// for AdonisJS v6
import path from 'node:path'
import url from 'node:url'
// ---

export default {
  // path: __dirname + "/../", for AdonisJS v5
  path: path.dirname(url.fileURLToPath(import.meta.url)) + '/../', // for AdonisJS v6
  title: 'Foo',
  version: '1.0.0',
  tagIndex: 2,
  snakeCase: true,
  debug: false, // set to true, to get some useful debug output
  ignore: ['/swagger', '/docs'],
  preferredPutPatch: 'PUT', // if PUT/PATCH are provided for the same route, prefer PUT
  common: {
    parameters: {}, // OpenAPI conform parameters that are commonly used
    headers: {}, // OpenAPI conform headers that are commonly used
  },
  persistAuthorization: true, // persist authorization between reloads on the swagger page
  showFullPath: false, // the path displayed after endpoint summary
}

Any feedback would be appreciated. Thanks.

ad-on-is commented 3 months ago

It's strange that AutoSwagger is looking for a members_controller.js.ts (.js.ts) extension. I just published a new version 3.6.0, could you try it with that and set debug: true if it still produces the same error.

FelipeQueFez commented 3 months ago

@ad-on-is thank you so much for the answer.

I use Windows and in my routes.ts my import stay that:

const MembersController = () => import('../app/controllers/members_controller.js')

When i change for this, so worked.

const MembersController = () => import('../app/controllers/members_controller')

FelipeQueFez commented 3 months ago

Now another question, i have this controller:

@inject()
export default class MembersController {
  constructor(protected loginService: LoginService) {}

    /**
   * @description Returns array of producs and it's relations
   * @responseBody 200 - <Product[]>.with(relations)
   * @paramUse(sortable, filterable)
   * @responseHeader 200 - @use(paginated)
   * @responseHeader 200 - X-pages - A description of the header - @example(test)
   */
  async login(ctx: HttpContext): Promise<String> {
    var result = await this.loginService.login(ctx.request.body() as RequestLoginDTO)

    return result
  }
}

I put the block of comments on the method login. But the texts not showing in my swagger UI, i forgotten something?

Screenshot 2024-04-04 at 23 44 49
ad-on-is commented 3 months ago

Your notation is wrong, there's no responseHeader, but responseBody. Edit: Sorry for this one. Seems like I forgot I had implemented responseHeader back than.

Also, paramUse with sortable and filterable is for the manual configs and has no effect in your case (based on your swagger.config), and I assume you just copy&pasted it.

please read the docs thoroughly, and report back if you find any issues.