UNPKG

@solvro/auth

Version:

AdonisJS Ally provider for Solvro Auth

90 lines (89 loc) 3.97 kB
import assert from "node:assert"; import { SyntaxKind } from "ts-morph"; import { stubsRoot } from "./stubs/main.js"; function addImportIfNotExists(sourceFile, importPath, importName) { const existingImports = sourceFile.getImportDeclarations(); const hasImport = existingImports.some((imp) => imp.getModuleSpecifierValue() === importPath && imp.getNamedImports().some((named) => named.getName() === importName)); if (!hasImport) { sourceFile.addImportDeclaration({ moduleSpecifier: importPath, namedImports: [{ name: importName }], }); } } function addControllerImportIfNotExists(sourceFile) { const existingVariables = sourceFile.getVariableDeclarations(); const hasControllerImport = existingVariables.some((imp) => imp.getText().includes("AuthController")); if (!hasControllerImport) { const importDeclarations = sourceFile.getImportDeclarations(); if (importDeclarations.length > 0) { const lastImport = importDeclarations[importDeclarations.length - 1]; sourceFile.insertStatements(lastImport.getChildIndex() + 1, [ "", // Add empty line for spacing 'const AuthController = () => import("#controllers/auth_controller");', ]); } else { // If no imports, add at the beginning (after any comments) sourceFile.insertStatements(0, [ 'const AuthController = () => import("#controllers/auth_controller");', ]); } } } function addNewRoutes(sourceFile) { // Find the last router statement const routerStatements = sourceFile .getDescendantsOfKind(SyntaxKind.CallExpression) .filter((call) => call.getExpression().getText().startsWith("router.")); const lastRouterStatement = routerStatements[routerStatements.length - 1]; // Add new routes after the last existing route const newRoutes = ` router.get("/auth/login", [AuthController, "login"]).use(middleware.guest()); router.get("/auth/callback", [AuthController, "callback"]).use(middleware.guest()); router.post("/auth/logout", [AuthController, "logout"]).use(middleware.auth()); `; if (lastRouterStatement) { sourceFile.insertText(lastRouterStatement.getEnd() + 1, newRoutes); } else { sourceFile.addStatements(newRoutes); } } export async function configure(command) { const codemods = await command.createCodemods(); codemods.overwriteExisting = true; command.logger.info("Konfiguracja @solvro/auth"); command.logger.info("Żeby dostać CLIENT_ID i CLIENT_SECRET, zapytaj na #main i zpinguj @Bartosz Gotowski 😍"); const clientId = await command.prompt.ask("Jaki masz CLIENT_ID? ", { hint: "web-planer", }); const clientSecret = await command.prompt.ask("Jaki masz CLIENT_SECRET? ", { hint: "a17c54tH8AmWC0yq7FSQbNpPp8wELqeN", }); await codemods.makeUsingStub(stubsRoot, "controllers/auth_controller.stub", {}); await codemods.makeUsingStub(stubsRoot, "config/ally.stub", {}); await codemods.defineEnvVariables({ APP_DOMAIN: "http://localhost:3333", SOLVRO_AUTH_CLIENT_ID: clientId, SOLVRO_AUTH_CLIENT_SECRET: clientSecret, }); await codemods.defineEnvValidations({ variables: { APP_DOMAIN: `Env.schema.string()`, SOLVRO_AUTH_CLIENT_ID: "Env.schema.string()", SOLVRO_AUTH_CLIENT_SECRET: "Env.schema.string()", }, leadingComment: "Variables for @solvro/auth", }); const action = command.logger.action("update start/routes.ts"); const project = await codemods.getTsMorphProject(); assert(project); const file = project?.getSourceFileOrThrow("start/routes.ts"); addImportIfNotExists(file, "./kernel.js", "middleware"); addControllerImportIfNotExists(file); addNewRoutes(file); await file.save(); action.succeeded(); }