{"version":3,"file":"api.mjs","sources":["../../src/plops/api.ts"],"sourcesContent":["import { join } from 'path';\nimport type { ActionType, NodePlopAPI } from 'plop';\nimport fs from 'fs-extra';\nimport tsUtils from '@strapi/typescript-utils';\n\nimport validateInput from './utils/validate-input';\nimport getFilePath from './utils/get-file-path';\nimport { appendToFile } from './utils/extend-plugin-index-files';\n\nexport default (plop: NodePlopAPI) => {\n  // API generator\n  plop.setGenerator('api', {\n    description: 'Generate a basic API',\n    prompts: [\n      {\n        type: 'input',\n        name: 'id',\n        message: 'API name',\n        validate: (input) => validateInput(input),\n      },\n      {\n        type: 'confirm',\n        name: 'isPluginApi',\n        message: 'Is this API for a plugin?',\n      },\n      {\n        when: (answers) => answers.isPluginApi,\n        type: 'list',\n        name: 'plugin',\n        message: 'Plugin name',\n        async choices() {\n          const pluginsPath = join(plop.getDestBasePath(), 'plugins');\n          const exists = await fs.pathExists(pluginsPath);\n          if (!exists) {\n            throw Error('Couldn\\'t find a \"plugins\" directory');\n          }\n\n          const pluginsDir = await fs.readdir(pluginsPath, { withFileTypes: true });\n          const pluginsDirContent = pluginsDir.filter((fd) => fd.isDirectory());\n\n          if (pluginsDirContent.length === 0) {\n            throw Error('The \"plugins\" directory is empty');\n          }\n\n          return pluginsDirContent;\n        },\n      },\n    ],\n    actions(answers) {\n      if (!answers) {\n        return [];\n      }\n\n      const filePath = getFilePath(\n        answers.destination || (answers.isPluginApi && answers.plugin ? 'plugin' : 'api')\n      );\n      const currentDir = process.cwd();\n      let language = tsUtils.isUsingTypeScriptSync(currentDir) ? 'ts' : 'js';\n\n      if (answers.plugin) {\n        // The tsconfig in plugins is located just outside the server src, not in the root of the plugin.\n        const pluginServerDir = join(\n          currentDir,\n          'src',\n          filePath.replace('{{ plugin }}', answers.plugin),\n          '../'\n        );\n        language = tsUtils.isUsingTypeScriptSync(pluginServerDir) ? 'ts' : 'js';\n      }\n\n      const baseActions: Array<ActionType> = [\n        {\n          type: 'add',\n          path: `${filePath}/controllers/{{ id }}.${language}`,\n          templateFile: `templates/${language}/controller.${language}.hbs`,\n        },\n        {\n          type: 'add',\n          path: `${filePath}/services/{{ id }}.${language}`,\n          templateFile: `templates/${language}/service.${language}.hbs`,\n        },\n        {\n          type: 'add',\n          path: `${filePath}/routes/${answers.plugin ? 'content-api/' : ''}{{ id }}.${language}`,\n          templateFile: `templates/${language}/single-route.${language}.hbs`,\n        },\n      ];\n\n      if (answers.isPluginApi) {\n        const indexFiles = ['controllers', 'services', 'routes'];\n\n        indexFiles.forEach((type) => {\n          const indexPath = join(plop.getDestBasePath(), `${filePath}/${type}/index.${language}`);\n          const exists = fs.existsSync(indexPath);\n\n          if (!exists && type !== 'routes') {\n            baseActions.push({\n              type: 'add',\n              path: `${filePath}/${type}/index.${language}`,\n              templateFile: `templates/${language}/plugin/plugin.index.${language}.hbs`,\n              skipIfExists: true,\n            });\n          }\n\n          if (type === 'routes') {\n            const indexPath = join(plop.getDestBasePath(), `${filePath}/${type}/index.${language}`);\n            const exists = fs.existsSync(indexPath);\n\n            if (!exists) {\n              baseActions.push({\n                type: 'add',\n                path: `${filePath}/${type}/index.${language}`,\n                templateFile: `templates/${language}/plugin/plugin.routes.index.${language}.hbs`,\n                skipIfExists: true,\n              });\n            }\n\n            const routeIndexFiles = ['content-api', 'admin'];\n\n            routeIndexFiles.forEach((routeType) => {\n              const routeTypeIndexPath = join(\n                plop.getDestBasePath(),\n                `${filePath}/${type}/${routeType}/index.${language}`\n              );\n              const routeTypeExists = fs.existsSync(routeTypeIndexPath);\n\n              if (!routeTypeExists) {\n                baseActions.push({\n                  type: 'add',\n                  path: `${filePath}/${type}/${routeType}/index.${language}`,\n                  templateFile: `templates/${language}/plugin/plugin.routes.type.index.${language}.hbs`,\n                  data: { type: routeType },\n                  skipIfExists: true,\n                });\n              }\n            });\n          }\n\n          baseActions.push({\n            type: 'modify',\n            path: `${filePath}/${type}/${type === 'routes' ? 'content-api/' : ''}index.${language}`,\n            transform(template: string) {\n              if (type === 'routes') {\n                return appendToFile(template, { type: 'routes', singularName: answers.id });\n              }\n\n              return appendToFile(template, { type: 'index', singularName: answers.id });\n            },\n          });\n        });\n      }\n\n      return baseActions;\n    },\n  });\n};\n"],"names":["plop","setGenerator","description","prompts","type","name","message","validate","input","validateInput","when","answers","isPluginApi","choices","pluginsPath","join","getDestBasePath","exists","fs","pathExists","Error","pluginsDir","readdir","withFileTypes","pluginsDirContent","filter","fd","isDirectory","length","actions","filePath","getFilePath","destination","plugin","currentDir","process","cwd","language","tsUtils","isUsingTypeScriptSync","pluginServerDir","replace","baseActions","path","templateFile","indexFiles","forEach","indexPath","existsSync","push","skipIfExists","routeIndexFiles","routeType","routeTypeIndexPath","routeTypeExists","data","transform","template","appendToFile","singularName","id"],"mappings":"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"}