shadowaudit
Advanced tools
| /** | ||
| * Rails auth detection — cross-file pattern. | ||
| * | ||
| * Rails controllers declare auth via `before_action`: | ||
| * | ||
| * class UsersController < ApplicationController | ||
| * before_action :require_user! # all actions require auth | ||
| * before_action :authenticate_user! # Devise auth | ||
| * before_action :require_admin, only: [:destroy, :update] | ||
| * before_action :set_user, only: [:show, :update] | ||
| * skip_before_action :require_user!, only: [:index] # public exception | ||
| * | ||
| * class API::V1::BaseController < ApplicationController | ||
| * before_action :require_user! # inherited by all subclasses | ||
| * end | ||
| * | ||
| * We also detect: | ||
| * - `protect_from_forgery with: :null_session` — API mode (often paired with token auth) | ||
| * - `http_basic_authenticate_with name: ..., password: ...` — HTTP Basic | ||
| * - `devise :controllers` — Devise controllers (auth endpoints themselves) | ||
| * | ||
| * Limitations (v0.8.0): | ||
| * - Does NOT honor `skip_before_action` (would need to parse :only/:except) | ||
| * - Does NOT walk the inheritance chain (ApplicationController → BaseController) | ||
| * because that requires resolving class names to files. We only look at | ||
| * the single controller file. | ||
| * - Both limitations are tracked for v0.9.0. | ||
| */ | ||
| /** | ||
| * Hardcoded Rails auth patterns — ALWAYS checked. | ||
| * | ||
| * These cover the most common Rails auth idioms: | ||
| * - `before_action :require_user!` / `:require_user` / `:require_login` | ||
| * - `before_action :authenticate_user!` (Devise default) | ||
| * - `before_action :require_admin` / `:require_staff` / `:require_moderator` | ||
| * - `http_basic_authenticate_with` (HTTP Basic) | ||
| * - `protect_from_forgery with: :null_session` (API mode marker — often | ||
| * paired with token auth) | ||
| */ | ||
| export declare const RAILS_AUTH_PATTERNS: readonly string[]; | ||
| /** | ||
| * Patterns that explicitly DISABLE auth — if found, the controller is | ||
| * considered public (unless a stronger auth pattern is also present). | ||
| */ | ||
| export declare const RAILS_PUBLIC_PATTERNS: readonly string[]; | ||
| /** | ||
| * Detects whether a Rails controller file declares auth. | ||
| * | ||
| * Returns true if ANY auth pattern is found AND no skip pattern overrides it | ||
| * for the whole controller. (Per-action :only/:except on skip_before_action | ||
| * is not honored — see limitations above.) | ||
| * | ||
| * v0.8.0 ADVERSARIAL FIX: Skip-detection only applies to `before_action` | ||
| * patterns. Non-before_action patterns (http_basic_authenticate_with, | ||
| * protect_from_forgery, devise) have no skip equivalent, so finding them | ||
| * always means auth is present. Previously the skip-detection was running | ||
| * on ALL patterns, which caused http_basic_authenticate_with to falsely | ||
| * match its own "skip" line (since skipMatch was identical to the pattern | ||
| * when there was no 'before_action' to replace). | ||
| * | ||
| * @param controllerContent Full source of the _controller.rb file | ||
| * @param userAuthPatterns Additional patterns from user config | ||
| */ | ||
| export declare function detectRailsAuthInController(controllerContent: string, userAuthPatterns: string[]): boolean; | ||
| //# sourceMappingURL=rails-auth.d.ts.map |
| {"version":3,"file":"rails-auth.d.ts","sourceRoot":"","sources":["../../src/scanners/rails-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAyBhD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EASlD,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,2BAA2B,CACzC,iBAAiB,EAAE,MAAM,EACzB,gBAAgB,EAAE,MAAM,EAAE,GACzB,OAAO,CAuCT"} |
| "use strict"; | ||
| /** | ||
| * Rails auth detection — cross-file pattern. | ||
| * | ||
| * Rails controllers declare auth via `before_action`: | ||
| * | ||
| * class UsersController < ApplicationController | ||
| * before_action :require_user! # all actions require auth | ||
| * before_action :authenticate_user! # Devise auth | ||
| * before_action :require_admin, only: [:destroy, :update] | ||
| * before_action :set_user, only: [:show, :update] | ||
| * skip_before_action :require_user!, only: [:index] # public exception | ||
| * | ||
| * class API::V1::BaseController < ApplicationController | ||
| * before_action :require_user! # inherited by all subclasses | ||
| * end | ||
| * | ||
| * We also detect: | ||
| * - `protect_from_forgery with: :null_session` — API mode (often paired with token auth) | ||
| * - `http_basic_authenticate_with name: ..., password: ...` — HTTP Basic | ||
| * - `devise :controllers` — Devise controllers (auth endpoints themselves) | ||
| * | ||
| * Limitations (v0.8.0): | ||
| * - Does NOT honor `skip_before_action` (would need to parse :only/:except) | ||
| * - Does NOT walk the inheritance chain (ApplicationController → BaseController) | ||
| * because that requires resolving class names to files. We only look at | ||
| * the single controller file. | ||
| * - Both limitations are tracked for v0.9.0. | ||
| */ | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.RAILS_PUBLIC_PATTERNS = exports.RAILS_AUTH_PATTERNS = void 0; | ||
| exports.detectRailsAuthInController = detectRailsAuthInController; | ||
| /** | ||
| * Hardcoded Rails auth patterns — ALWAYS checked. | ||
| * | ||
| * These cover the most common Rails auth idioms: | ||
| * - `before_action :require_user!` / `:require_user` / `:require_login` | ||
| * - `before_action :authenticate_user!` (Devise default) | ||
| * - `before_action :require_admin` / `:require_staff` / `:require_moderator` | ||
| * - `http_basic_authenticate_with` (HTTP Basic) | ||
| * - `protect_from_forgery with: :null_session` (API mode marker — often | ||
| * paired with token auth) | ||
| */ | ||
| exports.RAILS_AUTH_PATTERNS = [ | ||
| 'before_action :require_user', | ||
| 'before_action :require_login', | ||
| 'before_action :require_admin', | ||
| 'before_action :require_staff', | ||
| 'before_action :require_moderator', | ||
| 'before_action :require_role', | ||
| 'before_action :require_permission', | ||
| 'before_action :authenticate_user', | ||
| 'before_action :authenticate_admin', | ||
| 'before_action :authenticate_account', | ||
| 'before_action :authenticate_person', | ||
| 'before_action :authenticate_member', | ||
| 'before_action :verify_user', | ||
| 'before_action :check_auth', | ||
| 'before_action :check_login', | ||
| 'before_action :ensure_login', | ||
| 'before_action :ensure_user', | ||
| 'before_action :authorize', // Pundit / CanCan | ||
| 'before_action :authorize_resource', | ||
| 'before_action :load_and_authorize_resource', // CanCan | ||
| 'http_basic_authenticate_with', | ||
| 'protect_from_forgery with: :null_session', | ||
| // Devise controllers (auth endpoints themselves) | ||
| 'devise ', | ||
| ]; | ||
| /** | ||
| * Patterns that explicitly DISABLE auth — if found, the controller is | ||
| * considered public (unless a stronger auth pattern is also present). | ||
| */ | ||
| exports.RAILS_PUBLIC_PATTERNS = [ | ||
| 'skip_before_action :require_user', | ||
| 'skip_before_action :require_login', | ||
| 'skip_before_action :authenticate_user', | ||
| 'skip_before_action :verify_user', | ||
| 'skip_before_action :check_auth', | ||
| 'skip_before_action :check_login', | ||
| 'skip_before_action :ensure_login', | ||
| 'skip_before_action :ensure_user', | ||
| ]; | ||
| /** | ||
| * Detects whether a Rails controller file declares auth. | ||
| * | ||
| * Returns true if ANY auth pattern is found AND no skip pattern overrides it | ||
| * for the whole controller. (Per-action :only/:except on skip_before_action | ||
| * is not honored — see limitations above.) | ||
| * | ||
| * v0.8.0 ADVERSARIAL FIX: Skip-detection only applies to `before_action` | ||
| * patterns. Non-before_action patterns (http_basic_authenticate_with, | ||
| * protect_from_forgery, devise) have no skip equivalent, so finding them | ||
| * always means auth is present. Previously the skip-detection was running | ||
| * on ALL patterns, which caused http_basic_authenticate_with to falsely | ||
| * match its own "skip" line (since skipMatch was identical to the pattern | ||
| * when there was no 'before_action' to replace). | ||
| * | ||
| * @param controllerContent Full source of the _controller.rb file | ||
| * @param userAuthPatterns Additional patterns from user config | ||
| */ | ||
| function detectRailsAuthInController(controllerContent, userAuthPatterns) { | ||
| // Check user-configured patterns first (cheaper, often project-specific) | ||
| for (const p of userAuthPatterns) { | ||
| if (p && controllerContent.includes(p)) | ||
| return true; | ||
| } | ||
| // Check hardcoded patterns | ||
| for (const p of exports.RAILS_AUTH_PATTERNS) { | ||
| if (controllerContent.includes(p)) { | ||
| // Skip-detection only makes sense for before_action patterns. | ||
| // Non-before_action patterns (http_basic, protect_from_forgery, devise) | ||
| // have no skip equivalent — finding them always means auth is present. | ||
| if (!p.startsWith('before_action')) { | ||
| return true; | ||
| } | ||
| // For before_action patterns, check if a corresponding skip_before_action | ||
| // disables it for the whole controller. | ||
| // skip_before_action :authenticate_user! (no only:/except:) = global skip. | ||
| // skip_before_action :authenticate_user!, only: [:index] = per-action skip (we ignore). | ||
| const skipMatch = p.replace('before_action', 'skip_before_action'); | ||
| const lines = controllerContent.split('\n'); | ||
| let skipped = false; | ||
| for (const line of lines) { | ||
| if (line.includes(skipMatch) && !line.includes('only:') && !line.includes('except:')) { | ||
| // Whole-controller skip for THIS pattern — but other before_action | ||
| // patterns might still apply. Mark as skipped and continue scanning. | ||
| skipped = true; | ||
| break; | ||
| } | ||
| } | ||
| if (!skipped) { | ||
| return true; | ||
| } | ||
| // This pattern was skipped — continue checking other patterns | ||
| } | ||
| } | ||
| return false; | ||
| } | ||
| /** | ||
| * Escapes a string for use in a RegExp. | ||
| */ | ||
| function escapeRegex(s) { | ||
| return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); | ||
| } | ||
| //# sourceMappingURL=rails-auth.js.map |
| {"version":3,"file":"rails-auth.js","sourceRoot":"","sources":["../../src/scanners/rails-auth.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;AAyEH,kEA0CC;AAjHD;;;;;;;;;;GAUG;AACU,QAAA,mBAAmB,GAAsB;IACpD,6BAA6B;IAC7B,8BAA8B;IAC9B,8BAA8B;IAC9B,8BAA8B;IAC9B,kCAAkC;IAClC,6BAA6B;IAC7B,mCAAmC;IACnC,kCAAkC;IAClC,mCAAmC;IACnC,qCAAqC;IACrC,oCAAoC;IACpC,oCAAoC;IACpC,4BAA4B;IAC5B,2BAA2B;IAC3B,4BAA4B;IAC5B,6BAA6B;IAC7B,4BAA4B;IAC5B,0BAA0B,EAAE,kBAAkB;IAC9C,mCAAmC;IACnC,4CAA4C,EAAE,SAAS;IACvD,8BAA8B;IAC9B,0CAA0C;IAC1C,iDAAiD;IACjD,SAAS;CACV,CAAC;AAEF;;;GAGG;AACU,QAAA,qBAAqB,GAAsB;IACtD,kCAAkC;IAClC,mCAAmC;IACnC,uCAAuC;IACvC,iCAAiC;IACjC,gCAAgC;IAChC,iCAAiC;IACjC,kCAAkC;IAClC,iCAAiC;CAClC,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,2BAA2B,CACzC,iBAAyB,EACzB,gBAA0B;IAE1B,yEAAyE;IACzE,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IACtD,CAAC;IAED,2BAA2B;IAC3B,KAAK,MAAM,CAAC,IAAI,2BAAmB,EAAE,CAAC;QACpC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,8DAA8D;YAC9D,wEAAwE;YACxE,uEAAuE;YACvE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,0EAA0E;YAC1E,wCAAwC;YACxC,4EAA4E;YAC5E,wFAAwF;YACxF,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBACrF,mEAAmE;oBACnE,qEAAqE;oBACrE,OAAO,GAAG,IAAI,CAAC;oBACf,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC;YACd,CAAC;YACD,8DAA8D;QAChE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC"} |
| /** | ||
| * Rails REST resource expansion. | ||
| * | ||
| * In Rails, `resources :users` generates 7 standard routes: | ||
| * GET /users → users#index | ||
| * POST /users → users#create | ||
| * GET /users/new → users#new | ||
| * GET /users/:id → users#show | ||
| * GET /users/:id/edit → users#edit | ||
| * PATCH /users/:id → users#update | ||
| * PUT /users/:id → users#update | ||
| * DELETE /users/:id → users#destroy | ||
| * | ||
| * `resource :session` (singular) generates 6 routes (no `:id`): | ||
| * GET /session/new → sessions#new | ||
| * GET /session/edit → sessions#edit | ||
| * GET /session → sessions#show | ||
| * PATCH /session → sessions#update | ||
| * PUT /session → sessions#update | ||
| * DELETE /session → sessions#destroy | ||
| * POST /session → sessions#create | ||
| * | ||
| * Both accept `only:` and `except:` to filter the generated routes. | ||
| * | ||
| * v0.8.0: This module is separated from rails.ts so it can be unit-tested | ||
| * in isolation (the expansion logic is the most bug-prone part of the | ||
| * scanner — every route table bug traces back to here). | ||
| */ | ||
| export interface ResourceRoute { | ||
| method: string; | ||
| pathSuffix: string; | ||
| action: string; | ||
| } | ||
| /** | ||
| * The 8 standard routes generated by `resources :name`. | ||
| * (Rails generates 7 actions but PATCH+PUT both map to update, so 8 routes total.) | ||
| */ | ||
| export declare const PLURAL_RESOURCE_ROUTES: readonly ResourceRoute[]; | ||
| /** | ||
| * The 6 standard routes generated by `resource :name` (singular — no :id). | ||
| */ | ||
| export declare const SINGULAR_RESOURCE_ROUTES: readonly ResourceRoute[]; | ||
| /** | ||
| * Parses an `only:` or `except:` argument from a Ruby routes.rb line. | ||
| * | ||
| * Handles three forms: | ||
| * only: :show → ['show'] | ||
| * only: [:show, :index] → ['show', 'index'] | ||
| * only: %i[show index create] → ['show', 'index', 'create'] | ||
| * | ||
| * Returns null if the argument is not found or unparseable. | ||
| */ | ||
| export declare function parseOnlyExcept(arg: string): { | ||
| only?: Set<string>; | ||
| except?: Set<string>; | ||
| } | null; | ||
| /** | ||
| * Expands a `resources :name` declaration into individual routes. | ||
| * | ||
| * @param resourceName The Ruby symbol name (e.g. 'users', 'statuses') | ||
| * @param modifiers Rest of the line (may contain only:/except:/path:/param:) | ||
| * @returns Array of { method, pathSuffix, action } for each generated route | ||
| */ | ||
| export declare function expandPluralResource(resourceName: string, modifiers: string): ResourceRoute[]; | ||
| /** | ||
| * Expands a `resource :name` (singular) declaration into individual routes. | ||
| * | ||
| * @param resourceName The Ruby symbol name (e.g. 'session', 'inbox') | ||
| * @param modifiers Rest of the line (may contain only:/except:/path:) | ||
| * @returns Array of { method, pathSuffix, action } | ||
| */ | ||
| export declare function expandSingularResource(resourceName: string, modifiers: string): ResourceRoute[]; | ||
| /** | ||
| * Get the URL path segment for an expanded resource route. | ||
| * Falls back to resourceName if no _pathSegment override was set. | ||
| */ | ||
| export declare function getResourcePathSegment(route: ResourceRoute, resourceName: string): string; | ||
| //# sourceMappingURL=rails-resource.d.ts.map |
| {"version":3,"file":"rails-resource.d.ts","sourceRoot":"","sources":["../../src/scanners/rails-resource.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,aAAa,EAS1D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,aAAa,EAQ5D,CAAC;AAYF;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,CAoBhG;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,aAAa,EAAE,CA2BjB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,aAAa,EAAE,CAoBjB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,YAAY,EAAE,MAAM,GACnB,MAAM,CAER"} |
| "use strict"; | ||
| /** | ||
| * Rails REST resource expansion. | ||
| * | ||
| * In Rails, `resources :users` generates 7 standard routes: | ||
| * GET /users → users#index | ||
| * POST /users → users#create | ||
| * GET /users/new → users#new | ||
| * GET /users/:id → users#show | ||
| * GET /users/:id/edit → users#edit | ||
| * PATCH /users/:id → users#update | ||
| * PUT /users/:id → users#update | ||
| * DELETE /users/:id → users#destroy | ||
| * | ||
| * `resource :session` (singular) generates 6 routes (no `:id`): | ||
| * GET /session/new → sessions#new | ||
| * GET /session/edit → sessions#edit | ||
| * GET /session → sessions#show | ||
| * PATCH /session → sessions#update | ||
| * PUT /session → sessions#update | ||
| * DELETE /session → sessions#destroy | ||
| * POST /session → sessions#create | ||
| * | ||
| * Both accept `only:` and `except:` to filter the generated routes. | ||
| * | ||
| * v0.8.0: This module is separated from rails.ts so it can be unit-tested | ||
| * in isolation (the expansion logic is the most bug-prone part of the | ||
| * scanner — every route table bug traces back to here). | ||
| */ | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.SINGULAR_RESOURCE_ROUTES = exports.PLURAL_RESOURCE_ROUTES = void 0; | ||
| exports.parseOnlyExcept = parseOnlyExcept; | ||
| exports.expandPluralResource = expandPluralResource; | ||
| exports.expandSingularResource = expandSingularResource; | ||
| exports.getResourcePathSegment = getResourcePathSegment; | ||
| /** | ||
| * The 8 standard routes generated by `resources :name`. | ||
| * (Rails generates 7 actions but PATCH+PUT both map to update, so 8 routes total.) | ||
| */ | ||
| exports.PLURAL_RESOURCE_ROUTES = [ | ||
| { method: 'GET', pathSuffix: '', action: 'index' }, | ||
| { method: 'POST', pathSuffix: '', action: 'create' }, | ||
| { method: 'GET', pathSuffix: '/new', action: 'new' }, | ||
| { method: 'GET', pathSuffix: '/:id', action: 'show' }, | ||
| { method: 'GET', pathSuffix: '/:id/edit', action: 'edit' }, | ||
| { method: 'PATCH', pathSuffix: '/:id', action: 'update' }, | ||
| { method: 'PUT', pathSuffix: '/:id', action: 'update' }, | ||
| { method: 'DELETE', pathSuffix: '/:id', action: 'destroy' }, | ||
| ]; | ||
| /** | ||
| * The 6 standard routes generated by `resource :name` (singular — no :id). | ||
| */ | ||
| exports.SINGULAR_RESOURCE_ROUTES = [ | ||
| { method: 'GET', pathSuffix: '/new', action: 'new' }, | ||
| { method: 'GET', pathSuffix: '/edit', action: 'edit' }, | ||
| { method: 'GET', pathSuffix: '', action: 'show' }, | ||
| { method: 'PATCH', pathSuffix: '', action: 'update' }, | ||
| { method: 'PUT', pathSuffix: '', action: 'update' }, | ||
| { method: 'DELETE', pathSuffix: '', action: 'destroy' }, | ||
| { method: 'POST', pathSuffix: '', action: 'create' }, | ||
| ]; | ||
| /** | ||
| * All valid action names for `only:` / `except:` filtering. | ||
| */ | ||
| const ALL_PLURAL_ACTIONS = new Set([ | ||
| 'index', 'create', 'new', 'show', 'edit', 'update', 'destroy', | ||
| ]); | ||
| const ALL_SINGULAR_ACTIONS = new Set([ | ||
| 'new', 'edit', 'show', 'update', 'destroy', 'create', | ||
| ]); | ||
| /** | ||
| * Parses an `only:` or `except:` argument from a Ruby routes.rb line. | ||
| * | ||
| * Handles three forms: | ||
| * only: :show → ['show'] | ||
| * only: [:show, :index] → ['show', 'index'] | ||
| * only: %i[show index create] → ['show', 'index', 'create'] | ||
| * | ||
| * Returns null if the argument is not found or unparseable. | ||
| */ | ||
| function parseOnlyExcept(arg) { | ||
| const result = {}; | ||
| // Match: only: :action OR only: [:a, :b] OR only: %i[a b c] | ||
| const onlyMatch = arg.match(/only:\s*(?::(\w+)|\[([^\]]*)\]|%i\[([^\]]*)\])/); | ||
| if (onlyMatch) { | ||
| const raw = onlyMatch[1] || onlyMatch[2] || onlyMatch[3] || ''; | ||
| const actions = raw.split(/[,\s]+/).map((s) => s.replace(/^:/, '').trim()).filter(Boolean); | ||
| result.only = new Set(actions); | ||
| } | ||
| const exceptMatch = arg.match(/except:\s*(?::(\w+)|\[([^\]]*)\]|%i\[([^\]]*)\])/); | ||
| if (exceptMatch) { | ||
| const raw = exceptMatch[1] || exceptMatch[2] || exceptMatch[3] || ''; | ||
| const actions = raw.split(/[,\s]+/).map((s) => s.replace(/^:/, '').trim()).filter(Boolean); | ||
| result.except = new Set(actions); | ||
| } | ||
| if (!result.only && !result.except) | ||
| return null; | ||
| return result; | ||
| } | ||
| /** | ||
| * Expands a `resources :name` declaration into individual routes. | ||
| * | ||
| * @param resourceName The Ruby symbol name (e.g. 'users', 'statuses') | ||
| * @param modifiers Rest of the line (may contain only:/except:/path:/param:) | ||
| * @returns Array of { method, pathSuffix, action } for each generated route | ||
| */ | ||
| function expandPluralResource(resourceName, modifiers) { | ||
| const filter = parseOnlyExcept(modifiers); | ||
| let routes = exports.PLURAL_RESOURCE_ROUTES; | ||
| if (filter?.only) { | ||
| routes = routes.filter((r) => filter.only.has(r.action)); | ||
| } | ||
| if (filter?.except) { | ||
| routes = routes.filter((r) => !filter.except.has(r.action)); | ||
| } | ||
| // path: modifier renames the URL segment (e.g. resources :accounts, path: 'users') | ||
| // param: modifier renames the :id parameter (e.g. param: :username → :username) | ||
| const pathMatch = modifiers.match(/path:\s*['":]([^,'"\s]+)/); | ||
| const pathSegment = pathMatch ? pathMatch[1] : resourceName; | ||
| const paramMatch = modifiers.match(/param:\s*:(\w+)/); | ||
| const paramName = paramMatch ? paramMatch[1] : 'id'; | ||
| return routes.map((r) => ({ | ||
| method: r.method, | ||
| pathSuffix: r.pathSuffix.replace(/:id\b/g, `:${paramName}`), | ||
| action: r.action, | ||
| // pathSegment is applied by the caller (rails.ts) which knows the prefix stack | ||
| // — we stash it on the route via a private field for the caller to read. | ||
| ...(pathSegment !== resourceName ? { _pathSegment: pathSegment } : {}), | ||
| })); | ||
| } | ||
| /** | ||
| * Expands a `resource :name` (singular) declaration into individual routes. | ||
| * | ||
| * @param resourceName The Ruby symbol name (e.g. 'session', 'inbox') | ||
| * @param modifiers Rest of the line (may contain only:/except:/path:) | ||
| * @returns Array of { method, pathSuffix, action } | ||
| */ | ||
| function expandSingularResource(resourceName, modifiers) { | ||
| const filter = parseOnlyExcept(modifiers); | ||
| let routes = exports.SINGULAR_RESOURCE_ROUTES; | ||
| if (filter?.only) { | ||
| routes = routes.filter((r) => filter.only.has(r.action)); | ||
| } | ||
| if (filter?.except) { | ||
| routes = routes.filter((r) => !filter.except.has(r.action)); | ||
| } | ||
| const pathMatch = modifiers.match(/path:\s*['":]([^,'"\s]+)/); | ||
| const pathSegment = pathMatch ? pathMatch[1] : resourceName; | ||
| return routes.map((r) => ({ | ||
| method: r.method, | ||
| pathSuffix: r.pathSuffix, | ||
| action: r.action, | ||
| ...(pathSegment !== resourceName ? { _pathSegment: pathSegment } : {}), | ||
| })); | ||
| } | ||
| /** | ||
| * Get the URL path segment for an expanded resource route. | ||
| * Falls back to resourceName if no _pathSegment override was set. | ||
| */ | ||
| function getResourcePathSegment(route, resourceName) { | ||
| return route._pathSegment ?? resourceName; | ||
| } | ||
| //# sourceMappingURL=rails-resource.js.map |
| {"version":3,"file":"rails-resource.js","sourceRoot":"","sources":["../../src/scanners/rails-resource.ts"],"names":[],"mappings":"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"} |
| import { Route } from '../types'; | ||
| interface ParsedRoute { | ||
| method: string; | ||
| path: string; | ||
| controllerAction: string; | ||
| isRedirect: boolean; | ||
| line: number; | ||
| } | ||
| /** | ||
| * Parse a Ruby routes.rb source string into ParsedRoute[]. | ||
| * | ||
| * @param code The full source of routes.rb (or a routes/*.rb subfile) | ||
| * @param filename Relative path (for reporting) | ||
| * @param baseDir Absolute path to the project root (for draw(:symbol) resolution) | ||
| */ | ||
| export declare function parseRoutesFromRuby(code: string, filename: string, baseDir: string): ParsedRoute[]; | ||
| /** | ||
| * Scans a Rails project for route definitions. | ||
| * | ||
| * Looks for: | ||
| * - config/routes.rb (main routes file) | ||
| * - config/routes/(subfiles).rb (subfiles loaded via draw(:symbol)) | ||
| * | ||
| * Then runs cross-file auth detection by reading app/controllers/<star>_controller.rb. | ||
| * | ||
| * @param dir Project root directory | ||
| * @param ignore Directories to ignore | ||
| * @param authPatterns Additional auth patterns (user-configured) | ||
| * @param concurrency Parallel file read concurrency (default 8) | ||
| */ | ||
| export declare function scanRails(dir: string, ignore: string[], authPatterns: string[], concurrency?: number): Promise<Route[]>; | ||
| export default scanRails; | ||
| //# sourceMappingURL=rails.d.ts.map |
| {"version":3,"file":"rails.d.ts","sourceRoot":"","sources":["../../src/scanners/rails.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAiOjC,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAigBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,WAAW,EAAE,CAoHf;AAiBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EAAE,EAChB,YAAY,EAAE,MAAM,EAAE,EACtB,WAAW,GAAE,MAA4B,GACxC,OAAO,CAAC,KAAK,EAAE,CAAC,CAuGlB;AAeD,eAAe,SAAS,CAAC"} |
| "use strict"; | ||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| var desc = Object.getOwnPropertyDescriptor(m, k); | ||
| if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
| desc = { enumerable: true, get: function() { return m[k]; } }; | ||
| } | ||
| Object.defineProperty(o, k2, desc); | ||
| }) : (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| o[k2] = m[k]; | ||
| })); | ||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
| Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
| }) : function(o, v) { | ||
| o["default"] = v; | ||
| }); | ||
| var __importStar = (this && this.__importStar) || (function () { | ||
| var ownKeys = function(o) { | ||
| ownKeys = Object.getOwnPropertyNames || function (o) { | ||
| var ar = []; | ||
| for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; | ||
| return ar; | ||
| }; | ||
| return ownKeys(o); | ||
| }; | ||
| return function (mod) { | ||
| if (mod && mod.__esModule) return mod; | ||
| var result = {}; | ||
| if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); | ||
| __setModuleDefault(result, mod); | ||
| return result; | ||
| }; | ||
| })(); | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
| return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.parseRoutesFromRuby = parseRoutesFromRuby; | ||
| exports.scanRails = scanRails; | ||
| const glob_1 = __importDefault(require("glob")); | ||
| const path = __importStar(require("path")); | ||
| const logger_1 = require("../utils/logger"); | ||
| const parallel_1 = require("./utils/parallel"); | ||
| const rails_resource_1 = require("./rails-resource"); | ||
| const rails_auth_1 = require("./rails-auth"); | ||
| function glob(pattern, options) { | ||
| return new Promise((resolve, reject) => { | ||
| (0, glob_1.default)(pattern, options, (err, matches) => { | ||
| if (err) | ||
| reject(err); | ||
| else | ||
| resolve(matches ?? []); | ||
| }); | ||
| }); | ||
| } | ||
| function makeRootContext() { | ||
| return { | ||
| pathPrefix: '', | ||
| modulePath: '', | ||
| currentResource: null, | ||
| memberMode: 'none', | ||
| }; | ||
| } | ||
| function cloneContext(ctx) { | ||
| return { | ||
| pathPrefix: ctx.pathPrefix, | ||
| modulePath: ctx.modulePath, | ||
| currentResource: ctx.currentResource ? { ...ctx.currentResource } : null, | ||
| memberMode: ctx.memberMode, | ||
| }; | ||
| } | ||
| // ───────────────────────────────────────────────────────────────────── | ||
| // Path normalization | ||
| // ───────────────────────────────────────────────────────────────────── | ||
| /** | ||
| * Joins path segments, collapsing duplicate slashes, ensuring a leading slash, | ||
| * and stripping trailing slashes (unless the path is just '/'). | ||
| */ | ||
| function joinPath(...segments) { | ||
| let joined = segments.join('/'); | ||
| // Collapse multiple slashes | ||
| joined = joined.replace(/\/+/g, '/'); | ||
| // Ensure leading slash | ||
| if (!joined.startsWith('/')) | ||
| joined = '/' + joined; | ||
| // Strip trailing slash unless root | ||
| if (joined.length > 1 && joined.endsWith('/')) { | ||
| joined = joined.slice(0, -1); | ||
| } | ||
| return joined; | ||
| } | ||
| /** | ||
| * Converts Rails `:param` syntax to OpenAPI `{param}` for spec comparison. | ||
| * Also handles Rails `(*any)` wildcard → {any}. | ||
| */ | ||
| function convertParamsToOpenAPI(railsPath) { | ||
| let p = railsPath; | ||
| // :param → {param} | ||
| p = p.replace(/:(\w+)/g, '{$1}'); | ||
| // (*any) → {any} (Rails wildcard glob) | ||
| p = p.replace(/\(\*(\w+)\)/g, '{$1}'); | ||
| // (*any) without name → {glob} | ||
| p = p.replace(/\(\*\)/g, '{glob}'); | ||
| return p; | ||
| } | ||
| // ───────────────────────────────────────────────────────────────────── | ||
| // Regex patterns for route declarations | ||
| // ───────────────────────────────────────────────────────────────────── | ||
| /** Match: get '/path', to: '...' OR get :symbol (member/collection action) */ | ||
| const GET_POST_PUT_DELETE_PATCH_REGEX = /^(get|post|put|delete|patch|head|options)\s+(?:(['"])([^'"]+)\2|:(\w+))(?:.*)$/; | ||
| /** Match: match 'path', via: [:get, :post], to: '...' */ | ||
| const MATCH_VIA_REGEX = /^match\s+(['"])([^'"]+)\1\s*,\s*via:\s*(?::(\w+)|\[([^\]]*)\])/; | ||
| /** Match: root to: 'controller#action' OR root 'controller#action' */ | ||
| const ROOT_REGEX = /^root\s+(?:to:\s*)?(['"])([^'"]+)\1/; | ||
| /** Match: resources :name, only: ... / except: ... etc. */ | ||
| const RESOURCES_REGEX = /^resources\s+:(\w+)\s*(?:,\s*(.*))?$/; | ||
| /** Match: resource :name (singular) */ | ||
| const RESOURCE_SINGULAR_REGEX = /^resource\s+:(\w+)\s*(?:,\s*(.*))?$/; | ||
| /** Match: namespace :name do */ | ||
| const NAMESPACE_REGEX = /^namespace\s+:(\w+)\s*(?:,\s*(.*))?\s*do\s*$/; | ||
| /** Match: scope path: '...', module: :name do */ | ||
| const SCOPE_REGEX = /^scope\s+(.*?)(?:\s+do\s*)?$/; | ||
| /** Match: member do / collection do / member { ... } / collection { ... } */ | ||
| const MEMBER_REGEX = /^member\s*(do|\{)\s*$/; | ||
| const COLLECTION_REGEX = /^collection\s*(do|\{)\s*$/; | ||
| const MEMBER_INLINE_REGEX = /^member\s*\{([^}]+)\}/; | ||
| const COLLECTION_INLINE_REGEX = /^collection\s*\{([^}]+)\}/; | ||
| /** Match: constraints(...) do / constraints ... do */ | ||
| const CONSTRAINTS_REGEX = /^constraints\s*\(?.*?\)?\s*(?:do|\{)\s*$/; | ||
| /** Match: devise_scope :user do */ | ||
| const DEVISE_SCOPE_REGEX = /^devise_scope\s+:(\w+)\s+do\s*$/; | ||
| /** Match: with_options(...) do */ | ||
| const WITH_OPTIONS_REGEX = /^with_options\s+(.*?)(?:\s+do\s*)?$/; | ||
| /** Match: mount Engine, at: '/path' OR mount Engine => '/path' */ | ||
| const MOUNT_REGEX = /^mount\s+([\w:]+(?:Engine)?(?:Web)?)\s*(?:,|=>)\s*(?:at:\s*)?['"]([^'"]+)['"]/; | ||
| /** Match: draw(:symbol) — loads config/routes/symbol.rb */ | ||
| const DRAW_REGEX = /^draw\s*\(\s*:(\w+)\s*\)/; | ||
| /** Match: devise_for :users, path: 'auth', ... */ | ||
| const DEVISE_FOR_REGEX = /^devise_for\s+:(\w+)\s*(?:,\s*(.*))?$/; | ||
| /** Match: concern :name do / concerns :name */ | ||
| const CONCERN_DEF_REGEX = /^concern\s+:(\w+)\s+do\s*$/; | ||
| const CONCERNS_USE_REGEX = /concerns:\s*(?::(\w+)|\[([^\]]*)\])/; | ||
| /** Match: use_doorkeeper do */ | ||
| const USE_DOORKEEPER_REGEX = /^use_doorkeeper\b/; | ||
| /** Match: redirect(...) target — used to mark routes as redirects */ | ||
| const REDIRECT_REGEX = /\bredirect(?:\s*\(|\s+)/; | ||
| /** Match: end of block */ | ||
| const END_REGEX = /^\s*end\s*$/; | ||
| /** | ||
| * Strip Ruby comments and trailing whitespace from a line. | ||
| * Preserves strings (so # inside a string is not treated as a comment). | ||
| */ | ||
| function stripComment(line) { | ||
| // Walk char by char, track string state | ||
| let result = ''; | ||
| let inSingle = false; | ||
| let inDouble = false; | ||
| let prev = ''; | ||
| for (let i = 0; i < line.length; i++) { | ||
| const ch = line[i]; | ||
| if (ch === '#' && !inSingle && !inDouble) { | ||
| break; // rest is comment | ||
| } | ||
| if (ch === "'" && !inDouble && prev !== '\\') | ||
| inSingle = !inSingle; | ||
| if (ch === '"' && !inSingle && prev !== '\\') | ||
| inDouble = !inDouble; | ||
| result += ch; | ||
| prev = ch; | ||
| } | ||
| return result.trim(); | ||
| } | ||
| /** | ||
| * Get the current context (top of stack). | ||
| */ | ||
| function currentCtx(state) { | ||
| return state.contextStack[state.contextStack.length - 1]; | ||
| } | ||
| /** | ||
| * Compute the full URL path for a route given the current context stack. | ||
| * | ||
| * v0.8.0 ADVERSARIAL FIX: Each context's pathPrefix is the FULL accumulated | ||
| * prefix (not a delta), because cloneContext copies the parent's pathPrefix | ||
| * and joinPath appends to it. So we only need the TOP context's pathPrefix — | ||
| * walking the whole stack would double-count (e.g. /api + /api/v1 → /api/api/v1). | ||
| * | ||
| * Path components (from outer to inner): | ||
| * 1. Top context's accumulated pathPrefix (already includes all parents) | ||
| * 2. Current resource path segment (if inside resources block — already | ||
| * included in pathPrefix when the resources `do` block opened) | ||
| * 3. :id prefix (if inside member block) | ||
| * 4. The route's own path | ||
| */ | ||
| function computeFullPath(state, routePath) { | ||
| const ctx = currentCtx(state); | ||
| const segments = []; | ||
| // Top context's pathPrefix already includes all parent prefixes | ||
| // (because namespace/scope clones the parent and appends its own segment). | ||
| if (ctx.pathPrefix) | ||
| segments.push(ctx.pathPrefix); | ||
| // If inside a resources block, the pathSegment is ALREADY in pathPrefix | ||
| // (we pushed it when the `do` block opened). So we do NOT add it again here. | ||
| // The only exception: member/collection routes inside the resources block — | ||
| // but those are handled by memberMode below. | ||
| // If inside a member block, prefix with /:id | ||
| if (ctx.memberMode === 'member' && ctx.currentResource) { | ||
| segments.push(ctx.currentResource.param); | ||
| } | ||
| // The route's own path (may be empty for resource actions like index) | ||
| if (routePath) | ||
| segments.push(routePath); | ||
| return joinPath(...segments); | ||
| } | ||
| /** | ||
| * Parses a single-line route declaration (get/post/match/etc.) and pushes | ||
| * the resulting ParsedRoute(s) onto state.routes. | ||
| */ | ||
| function parseRouteDeclaration(state, line, lineNum) { | ||
| // Try get/post/put/delete/patch/head/options | ||
| // Handles two forms: | ||
| // get '/path', to: '...' (quoted string — group 3) | ||
| // get :action (symbol — group 4, used in member/collection blocks) | ||
| const simpleMatch = line.match(GET_POST_PUT_DELETE_PATCH_REGEX); | ||
| if (simpleMatch) { | ||
| const method = simpleMatch[1].toUpperCase(); | ||
| const routePath = simpleMatch[3] ?? simpleMatch[4] ?? ''; | ||
| const isRedirect = REDIRECT_REGEX.test(line); | ||
| const rawControllerAction = extractControllerAction(line) || 'unknown#unknown'; | ||
| // v0.8.0: Apply module path from current namespace/scope context | ||
| const controllerAction = applyModulePath(rawControllerAction, currentCtx(state).modulePath); | ||
| state.routes.push({ | ||
| method, | ||
| path: convertParamsToOpenAPI(computeFullPath(state, routePath)), | ||
| controllerAction, | ||
| isRedirect, | ||
| line: lineNum, | ||
| }); | ||
| return; | ||
| } | ||
| // Try match 'path', via: [:get, :post] | ||
| const matchMatch = line.match(MATCH_VIA_REGEX); | ||
| if (matchMatch) { | ||
| const routePath = matchMatch[2]; | ||
| // via: :get OR via: [:get, :post] | ||
| const viaMethods = matchMatch[3] | ||
| ? [matchMatch[3].toUpperCase()] | ||
| : (matchMatch[4] || '') | ||
| .split(/[,\s]+/) | ||
| .map((s) => s.replace(/^:/, '').trim().toUpperCase()) | ||
| .filter(Boolean); | ||
| const isRedirect = REDIRECT_REGEX.test(line); | ||
| const rawControllerAction = extractControllerAction(line) || 'unknown#unknown'; | ||
| // v0.8.0: Apply module path from current namespace/scope context | ||
| const controllerAction = applyModulePath(rawControllerAction, currentCtx(state).modulePath); | ||
| const fullPath = convertParamsToOpenAPI(computeFullPath(state, routePath)); | ||
| for (const method of viaMethods) { | ||
| state.routes.push({ | ||
| method, | ||
| path: fullPath, | ||
| controllerAction, | ||
| isRedirect, | ||
| line: lineNum, | ||
| }); | ||
| } | ||
| return; | ||
| } | ||
| // Try root to: 'controller#action' | ||
| const rootMatch = line.match(ROOT_REGEX); | ||
| if (rootMatch) { | ||
| state.routes.push({ | ||
| method: 'GET', | ||
| path: '/', | ||
| controllerAction: rootMatch[2], | ||
| isRedirect: false, | ||
| line: lineNum, | ||
| }); | ||
| return; | ||
| } | ||
| // Try mount Engine, at: '/path' | ||
| const mountMatch = line.match(MOUNT_REGEX); | ||
| if (mountMatch) { | ||
| // Engine mounts are middleware — mark as USE so comparator excludes them | ||
| state.routes.push({ | ||
| method: 'USE', | ||
| path: mountMatch[2], | ||
| controllerAction: mountMatch[1], | ||
| isRedirect: false, | ||
| line: lineNum, | ||
| }); | ||
| return; | ||
| } | ||
| // Try resources :name | ||
| const resourcesMatch = line.match(RESOURCES_REGEX); | ||
| if (resourcesMatch) { | ||
| expandResourceDeclaration(state, resourcesMatch[1], resourcesMatch[2] || '', false, lineNum); | ||
| return; | ||
| } | ||
| // Try resource :name (singular) | ||
| const resourceSingularMatch = line.match(RESOURCE_SINGULAR_REGEX); | ||
| if (resourceSingularMatch) { | ||
| expandResourceDeclaration(state, resourceSingularMatch[1], resourceSingularMatch[2] || '', true, lineNum); | ||
| return; | ||
| } | ||
| // Try member { get :action } / collection { post :action } | ||
| const memberInline = line.match(MEMBER_INLINE_REGEX); | ||
| if (memberInline) { | ||
| parseInlineBlock(state, memberInline[1], 'member', lineNum); | ||
| return; | ||
| } | ||
| const collectionInline = line.match(COLLECTION_INLINE_REGEX); | ||
| if (collectionInline) { | ||
| parseInlineBlock(state, collectionInline[1], 'collection', lineNum); | ||
| return; | ||
| } | ||
| // Try draw(:symbol) — loads config/routes/symbol.rb | ||
| const drawMatch = line.match(DRAW_REGEX); | ||
| if (drawMatch) { | ||
| loadDrawFile(state, drawMatch[1], lineNum); | ||
| return; | ||
| } | ||
| // Try devise_for :users | ||
| const deviseForMatch = line.match(DEVISE_FOR_REGEX); | ||
| if (deviseForMatch) { | ||
| expandDeviseFor(state, deviseForMatch[1], deviseForMatch[2] || '', lineNum); | ||
| return; | ||
| } | ||
| // If we get here, the line was inside a block but didn't match any known | ||
| // declaration. Skip silently — we'd rather miss a route than crash. | ||
| } | ||
| /** | ||
| * Extracts the controller#action from a Ruby route line. | ||
| * Handles: to: 'users#index', => 'users#index', controller: :users, action: :index | ||
| * | ||
| * v0.8.0: Does NOT apply module path — caller must do that via applyModulePath(). | ||
| */ | ||
| function extractControllerAction(line) { | ||
| // to: 'controller#action' | ||
| const toMatch = line.match(/to:\s*['"]([^'"]+)['"]/); | ||
| if (toMatch) | ||
| return toMatch[1]; | ||
| // 'controller#action' (bare, after =>) | ||
| const arrowMatch = line.match(/=>\s*['"]([^'"]+)['"]/); | ||
| if (arrowMatch) | ||
| return arrowMatch[1]; | ||
| // action: :show (controller inferred from context) | ||
| const actionMatch = line.match(/action:\s*:(\w+)/); | ||
| if (actionMatch) | ||
| return `inferred#${actionMatch[1]}`; | ||
| return null; | ||
| } | ||
| /** | ||
| * v0.8.0: Applies the current module path to a controller#action string. | ||
| * | ||
| * In Rails, `namespace :api do get '/x', to: 'credentials#show' end` maps to | ||
| * `Api::CredentialsController`, NOT `CredentialsController`. So the controller | ||
| * name from `to:` must be prefixed with the current module path. | ||
| * | ||
| * If the controllerAction already contains a path (e.g. 'api/v1/users#index'), | ||
| * it's already qualified — don't double-prefix. | ||
| */ | ||
| function applyModulePath(controllerAction, modulePath) { | ||
| if (!modulePath) | ||
| return controllerAction; | ||
| if (controllerAction.includes('/')) { | ||
| // Already qualified — leave it alone | ||
| return controllerAction; | ||
| } | ||
| // controllerAction is like 'credentials#show' → 'api/v1/accounts/credentials#show' | ||
| const hashIdx = controllerAction.indexOf('#'); | ||
| if (hashIdx === -1) | ||
| return controllerAction; | ||
| const controller = controllerAction.slice(0, hashIdx); | ||
| const action = controllerAction.slice(hashIdx + 1); | ||
| return `${modulePath}/${controller}#${action}`; | ||
| } | ||
| /** | ||
| * Expands a `resources :name` or `resource :name` declaration into REST routes. | ||
| * | ||
| * Two cases: | ||
| * 1. Line ends with `do` — opens a block for nested routes / member / collection | ||
| * 2. Line is standalone — just expand the REST routes and continue | ||
| */ | ||
| function expandResourceDeclaration(state, name, modifiers, isSingular, lineNum) { | ||
| const expanded = isSingular | ||
| ? (0, rails_resource_1.expandSingularResource)(name, modifiers) | ||
| : (0, rails_resource_1.expandPluralResource)(name, modifiers); | ||
| const pathSegment = (0, rails_resource_1.getResourcePathSegment)(expanded[0] || { method: '', pathSuffix: '', action: '' }, name); | ||
| // Parse param: modifier (default :id for plural, none for singular) | ||
| const paramMatch = modifiers.match(/param:\s*:(\w+)/); | ||
| const paramName = paramMatch ? `:${paramMatch[1]}` : ':id'; | ||
| // Push the REST routes for this resource (at the current context level) | ||
| // v0.8.0 FIX: Use currentCtx's pathPrefix (already includes all parents) | ||
| // instead of walking the whole stack (which would double-count). | ||
| // | ||
| // v0.8.0 FIX #2: If we're inside a parent resources block (currentResource | ||
| // is set AND memberMode is 'none', meaning we're at the top of the block), | ||
| // the parent's :id must be part of the path. E.g.: | ||
| // resources :accounts do # /accounts | ||
| // resources :statuses, only: [:show] # /accounts/:id/statuses/:id | ||
| // end | ||
| // | ||
| // v0.8.0 FIX #3: Build the full controller name from the module path. | ||
| // In Rails, `namespace :api do resources :users end` maps to | ||
| // `Api::UsersController` (file: app/controllers/api/users_controller.rb). | ||
| // The module path is accumulated from namespace + scope module: blocks | ||
| // (NOT from resources blocks — resources don't affect controller module). | ||
| const ctx = currentCtx(state); | ||
| let basePath = ctx.pathPrefix; | ||
| if (ctx.currentResource && ctx.memberMode === 'none') { | ||
| // We're inside a parent resources block — add the parent's :id | ||
| basePath = joinPath(basePath, ctx.currentResource.param); | ||
| } | ||
| const fullControllerName = ctx.modulePath | ||
| ? `${ctx.modulePath}/${name}` | ||
| : name; | ||
| for (const r of expanded) { | ||
| // For plural resources, the pathSuffix may contain :id — we need to | ||
| // apply the resource's path segment + suffix | ||
| const routePath = r.pathSuffix; // e.g. '', '/new', '/:id', '/:id/edit' | ||
| state.routes.push({ | ||
| method: r.method, | ||
| path: convertParamsToOpenAPI(joinPath(basePath, pathSegment, routePath.replace(/:id\b/g, isSingular ? '' : paramName))), | ||
| controllerAction: `${fullControllerName}#${r.action}`, | ||
| isRedirect: false, | ||
| line: lineNum, | ||
| }); | ||
| } | ||
| // If line ends with `do`, open a new context for nested routes | ||
| if (/\bdo\s*$/.test(modifiers) || /\bdo\s+/.test(modifiers)) { | ||
| const parentCtx = currentCtx(state); | ||
| const newCtx = cloneContext(parentCtx); | ||
| // v0.8.0 FIX: If we're inside a parent resources block, the parent's | ||
| // :id must be part of the path prefix for nested routes. E.g.: | ||
| // resources :accounts, param: :username do # /accounts | ||
| // resources :statuses do # /accounts/:username/statuses | ||
| // member do | ||
| // get :activity # /accounts/:username/statuses/:id/activity | ||
| // end | ||
| // end | ||
| // end | ||
| let prefixForNested = newCtx.pathPrefix; | ||
| if (parentCtx.currentResource && parentCtx.memberMode === 'none') { | ||
| prefixForNested = joinPath(prefixForNested, parentCtx.currentResource.param); | ||
| } | ||
| newCtx.pathPrefix = joinPath(prefixForNested, pathSegment); | ||
| newCtx.currentResource = { | ||
| name, | ||
| pathSegment, | ||
| isSingular, | ||
| param: paramName, | ||
| }; | ||
| newCtx.memberMode = 'none'; | ||
| state.contextStack.push(newCtx); | ||
| } | ||
| } | ||
| /** | ||
| * Parses an inline block like `member { get :preview }` or `collection { post :batch }`. | ||
| */ | ||
| function parseInlineBlock(state, blockContent, mode, lineNum) { | ||
| // Push a context with memberMode set | ||
| const newCtx = cloneContext(currentCtx(state)); | ||
| newCtx.memberMode = mode; | ||
| state.contextStack.push(newCtx); | ||
| // Parse each statement in the block content | ||
| for (const stmt of blockContent.split(';')) { | ||
| const trimmed = stmt.trim(); | ||
| if (!trimmed) | ||
| continue; | ||
| // For member/collection blocks, the route path is just the action name | ||
| // e.g. `get :preview` → GET /:id/preview | ||
| const actionMatch = trimmed.match(/^(get|post|put|delete|patch)\s+:(\w+)/); | ||
| if (actionMatch) { | ||
| const method = actionMatch[1].toUpperCase(); | ||
| const action = actionMatch[2]; | ||
| const ctx = currentCtx(state); | ||
| // v0.8.0 FIX: ctx.pathPrefix already includes the resource's pathSegment | ||
| // (pushed when the resources `do` block opened). So we just add :id (for | ||
| // member) and the action name. | ||
| const path = mode === 'member' | ||
| ? joinPath(ctx.pathPrefix, ctx.currentResource?.param || '', action) | ||
| : joinPath(ctx.pathPrefix, action); | ||
| state.routes.push({ | ||
| method, | ||
| path: convertParamsToOpenAPI(path), | ||
| controllerAction: `${ctx.currentResource?.name || 'unknown'}#${action}`, | ||
| isRedirect: false, | ||
| line: lineNum, | ||
| }); | ||
| } | ||
| } | ||
| // Pop the inline context (it's a one-liner) | ||
| state.contextStack.pop(); | ||
| } | ||
| /** | ||
| * Loads a `draw(:symbol)` subfile (e.g. config/routes/api.rb) and parses it | ||
| * in the current context. | ||
| */ | ||
| function loadDrawFile(state, symbol, _lineNum) { | ||
| const subfilePath = path.join(state.baseDir, 'config', 'routes', `${symbol}.rb`); | ||
| if (!fileExistsSync(subfilePath)) { | ||
| logger_1.logger.warn(`draw(:${symbol}) — file not found: ${subfilePath}`); | ||
| return; | ||
| } | ||
| let content; | ||
| try { | ||
| content = readFile(subfilePath); | ||
| } | ||
| catch { | ||
| logger_1.logger.warn(`draw(:${symbol}) — could not read: ${subfilePath}`); | ||
| return; | ||
| } | ||
| // We can't use readFile sync — but we already read it. Parse the cached content. | ||
| // (This is called from the async parseRoutesFromRuby which has already read the file.) | ||
| // Actually we need to restructure — loadDrawFile should be async. | ||
| // For now, log and skip. The caller (scanRails) handles draw() at the file level. | ||
| logger_1.logger.info(`draw(:${symbol}) — subfile routes not yet supported (v0.8.0 limitation)`); | ||
| } | ||
| /** | ||
| * Synchronous file existence check (used by loadDrawFile). | ||
| */ | ||
| function fileExistsSync(p) { | ||
| try { | ||
| const fs = require('fs'); | ||
| return fs.existsSync(p); | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| } | ||
| /** | ||
| * Synchronous file read (used by loadDrawFile). | ||
| */ | ||
| function readFile(p) { | ||
| try { | ||
| const fs = require('fs'); | ||
| return fs.readFileSync(p, 'utf-8'); | ||
| } | ||
| catch { | ||
| return null; | ||
| } | ||
| } | ||
| /** | ||
| * Expands `devise_for :users` into the standard Devise auth routes. | ||
| * | ||
| * Devise generates (with path: 'auth' override): | ||
| * GET /auth/sign_in → sessions#new | ||
| * POST /auth/sign_in → sessions#create | ||
| * DELETE /auth/sign_out → sessions#destroy | ||
| * GET /auth/sign_up → registrations#new | ||
| * POST /auth/sign_up → registrations#create | ||
| * GET /auth/password/new → passwords#new | ||
| * POST /auth/password → passwords#create | ||
| * GET /auth/password/edit → passwords#edit | ||
| * PATCH /auth/password → passwords#update | ||
| * PUT /auth/password → passwords#update | ||
| * | ||
| * These are all auth routes (they ARE the auth endpoints), so they're | ||
| * marked hasAuth=true by the auth detection pass. | ||
| */ | ||
| function expandDeviseFor(state, resourceName, modifiers, lineNum) { | ||
| // path: modifier (default: resource name) | ||
| const pathMatch = modifiers.match(/path:\s*['":]([^,'"\s]+)/); | ||
| const pathSegment = pathMatch ? pathMatch[1] : resourceName; | ||
| // v0.8.0 FIX: Use currentCtx's pathPrefix (already includes all parents) | ||
| const basePath = joinPath(currentCtx(state).pathPrefix, pathSegment); | ||
| const deviseRoutes = [ | ||
| { method: 'GET', path: '/sign_in', action: 'sessions#new' }, | ||
| { method: 'POST', path: '/sign_in', action: 'sessions#create' }, | ||
| { method: 'DELETE', path: '/sign_out', action: 'sessions#destroy' }, | ||
| { method: 'GET', path: '/sign_up', action: 'registrations#new' }, | ||
| { method: 'POST', path: '/sign_up', action: 'registrations#create' }, | ||
| { method: 'DELETE', path: '', action: 'registrations#destroy' }, | ||
| { method: 'GET', path: '/password/new', action: 'passwords#new' }, | ||
| { method: 'POST', path: '/password', action: 'passwords#create' }, | ||
| { method: 'GET', path: '/password/edit', action: 'passwords#edit' }, | ||
| { method: 'PATCH', path: '/password', action: 'passwords#update' }, | ||
| { method: 'PUT', path: '/password', action: 'passwords#update' }, | ||
| { method: 'GET', path: '/cancel', action: 'registrations#cancel' }, | ||
| { method: 'GET', path: '/edit', action: 'registrations#edit' }, | ||
| { method: 'PATCH', path: '', action: 'registrations#update' }, | ||
| { method: 'PUT', path: '', action: 'registrations#update' }, | ||
| ]; | ||
| for (const r of deviseRoutes) { | ||
| state.routes.push({ | ||
| method: r.method, | ||
| path: convertParamsToOpenAPI(joinPath(basePath, r.path)), | ||
| controllerAction: r.action, | ||
| isRedirect: false, | ||
| line: lineNum, | ||
| }); | ||
| } | ||
| } | ||
| // ───────────────────────────────────────────────────────────────────── | ||
| // Main parser — processes lines, manages context stack | ||
| // ───────────────────────────────────────────────────────────────────── | ||
| /** | ||
| * Parse a Ruby routes.rb source string into ParsedRoute[]. | ||
| * | ||
| * @param code The full source of routes.rb (or a routes/*.rb subfile) | ||
| * @param filename Relative path (for reporting) | ||
| * @param baseDir Absolute path to the project root (for draw(:symbol) resolution) | ||
| */ | ||
| function parseRoutesFromRuby(code, filename, baseDir) { | ||
| const state = { | ||
| lines: code.split('\n'), | ||
| lineIdx: 0, | ||
| contextStack: [makeRootContext()], | ||
| routes: [], | ||
| concerns: new Map(), | ||
| filename, | ||
| baseDir, | ||
| }; | ||
| while (state.lineIdx < state.lines.length) { | ||
| const rawLine = state.lines[state.lineIdx]; | ||
| const line = stripComment(rawLine); | ||
| const lineNum = state.lineIdx + 1; | ||
| state.lineIdx++; | ||
| if (!line) | ||
| continue; | ||
| // ─── Block-opening constructs ───────────────────────────────── | ||
| // These push a new context onto the stack. | ||
| // namespace :name do | ||
| const nsMatch = line.match(NAMESPACE_REGEX); | ||
| if (nsMatch) { | ||
| const newCtx = cloneContext(currentCtx(state)); | ||
| newCtx.pathPrefix = joinPath(newCtx.pathPrefix, nsMatch[1]); | ||
| // v0.8.0: namespace ALSO adds to the module path (Rails convention: | ||
| // namespace :api → Api:: module prefix on controllers) | ||
| newCtx.modulePath = newCtx.modulePath | ||
| ? `${newCtx.modulePath}/${nsMatch[1]}` | ||
| : nsMatch[1]; | ||
| newCtx.currentResource = null; | ||
| newCtx.memberMode = 'none'; | ||
| state.contextStack.push(newCtx); | ||
| continue; | ||
| } | ||
| // scope path: '...', module: :... do | ||
| const scopeMatch = line.match(SCOPE_REGEX); | ||
| if (scopeMatch && /\bdo\s*$/.test(line)) { | ||
| const newCtx = cloneContext(currentCtx(state)); | ||
| const pathMatch = scopeMatch[1].match(/path:\s*['"]([^'"]+)['"]/); | ||
| const moduleMatch = scopeMatch[1].match(/module:\s*:(\w+)/); | ||
| if (pathMatch) { | ||
| newCtx.pathPrefix = joinPath(newCtx.pathPrefix, pathMatch[1]); | ||
| } | ||
| if (moduleMatch) { | ||
| // scope module: :name adds to module path but NOT to URL path | ||
| newCtx.modulePath = newCtx.modulePath | ||
| ? `${newCtx.modulePath}/${moduleMatch[1]}` | ||
| : moduleMatch[1]; | ||
| } | ||
| newCtx.currentResource = null; | ||
| newCtx.memberMode = 'none'; | ||
| state.contextStack.push(newCtx); | ||
| continue; | ||
| } | ||
| // constraints(...) do — transparent scope (doesn't change path) | ||
| if (CONSTRAINTS_REGEX.test(line)) { | ||
| state.contextStack.push(cloneContext(currentCtx(state))); | ||
| continue; | ||
| } | ||
| // devise_scope :user do — transparent scope | ||
| const deviseScopeMatch = line.match(DEVISE_SCOPE_REGEX); | ||
| if (deviseScopeMatch) { | ||
| state.contextStack.push(cloneContext(currentCtx(state))); | ||
| continue; | ||
| } | ||
| // with_options(...) do — transparent scope (options applied to inner routes | ||
| // would require deeper parsing; for v0.8.0 we treat as transparent) | ||
| if (WITH_OPTIONS_REGEX.test(line) && /\bdo\s*$/.test(line)) { | ||
| state.contextStack.push(cloneContext(currentCtx(state))); | ||
| continue; | ||
| } | ||
| // concern :name do — define a concern (reusable route block) | ||
| const concernDefMatch = line.match(CONCERN_DEF_REGEX); | ||
| if (concernDefMatch) { | ||
| // For v0.8.0 we treat concern definitions as transparent scopes — | ||
| // their inner routes are recorded but concerns: :name usage doesn't | ||
| // re-expand them. (Full concern expansion is a v0.9.0 goal.) | ||
| state.contextStack.push(cloneContext(currentCtx(state))); | ||
| continue; | ||
| } | ||
| // member do / collection do | ||
| if (MEMBER_REGEX.test(line) || COLLECTION_REGEX.test(line)) { | ||
| const newCtx = cloneContext(currentCtx(state)); | ||
| newCtx.memberMode = MEMBER_REGEX.test(line) ? 'member' : 'collection'; | ||
| state.contextStack.push(newCtx); | ||
| continue; | ||
| } | ||
| // use_doorkeeper do — transparent scope | ||
| if (USE_DOORKEEPER_REGEX.test(line)) { | ||
| state.contextStack.push(cloneContext(currentCtx(state))); | ||
| continue; | ||
| } | ||
| // ─── Block-closing ──────────────────────────────────────────── | ||
| if (END_REGEX.test(line)) { | ||
| if (state.contextStack.length > 1) { | ||
| state.contextStack.pop(); | ||
| } | ||
| continue; | ||
| } | ||
| // ─── Route declarations ─────────────────────────────────────── | ||
| parseRouteDeclaration(state, line, lineNum); | ||
| } | ||
| return state.routes; | ||
| } | ||
| // ───────────────────────────────────────────────────────────────────── | ||
| // Directory scanner | ||
| // ───────────────────────────────────────────────────────────────────── | ||
| function shouldExcludeFile(absPath, ignore) { | ||
| const segments = absPath.split(path.sep); | ||
| for (const ig of ignore) { | ||
| if (segments.includes(ig)) | ||
| return true; | ||
| } | ||
| // Skip test directories | ||
| if (segments.includes('test') || segments.includes('tests')) | ||
| return true; | ||
| if (segments.includes('spec')) | ||
| return true; // RSpec | ||
| return false; | ||
| } | ||
| /** | ||
| * Scans a Rails project for route definitions. | ||
| * | ||
| * Looks for: | ||
| * - config/routes.rb (main routes file) | ||
| * - config/routes/(subfiles).rb (subfiles loaded via draw(:symbol)) | ||
| * | ||
| * Then runs cross-file auth detection by reading app/controllers/<star>_controller.rb. | ||
| * | ||
| * @param dir Project root directory | ||
| * @param ignore Directories to ignore | ||
| * @param authPatterns Additional auth patterns (user-configured) | ||
| * @param concurrency Parallel file read concurrency (default 8) | ||
| */ | ||
| async function scanRails(dir, ignore, authPatterns, concurrency = parallel_1.DEFAULT_CONCURRENCY) { | ||
| const absDir = path.resolve(dir); | ||
| // ─── Step 1: Find and read all routes files ──────────────────── | ||
| let routesFiles; | ||
| try { | ||
| routesFiles = await glob('config/routes*.rb', { | ||
| cwd: absDir, | ||
| absolute: true, | ||
| dot: false, | ||
| nodir: true, | ||
| }); | ||
| // Also glob config/routes/*.rb (draw subfiles) | ||
| const subFiles = await glob('config/routes/**/*.rb', { | ||
| cwd: absDir, | ||
| absolute: true, | ||
| dot: false, | ||
| nodir: true, | ||
| }); | ||
| routesFiles = [...new Set([...routesFiles, ...subFiles])]; | ||
| } | ||
| catch { | ||
| logger_1.logger.warn(`Could not scan directory: ${absDir}`); | ||
| return []; | ||
| } | ||
| routesFiles = routesFiles.filter((f) => !shouldExcludeFile(f, ignore)); | ||
| if (routesFiles.length === 0) { | ||
| logger_1.logger.warn(`No config/routes.rb found in ${absDir}`); | ||
| return []; | ||
| } | ||
| // ─── Step 2: Read all routes files in parallel ───────────────── | ||
| const readResults = await (0, parallel_1.readFilesParallel)(routesFiles, concurrency); | ||
| // ─── Step 3: Parse each routes file ──────────────────────────── | ||
| const allParsedRoutes = []; | ||
| for (const { absPath, content } of readResults) { | ||
| if (content === null) | ||
| continue; | ||
| const relPath = path.relative(absDir, absPath).replace(/\\/g, '/'); | ||
| const parsed = parseRoutesFromRuby(content, relPath, absDir); | ||
| for (const r of parsed) { | ||
| allParsedRoutes.push({ ...r, file: relPath }); | ||
| } | ||
| } | ||
| // ─── Step 4: Find and read all controller files (for auth detection) ─── | ||
| let controllerFiles = []; | ||
| try { | ||
| controllerFiles = await glob('app/controllers/**/*.rb', { | ||
| cwd: absDir, | ||
| absolute: true, | ||
| dot: false, | ||
| nodir: true, | ||
| }); | ||
| } | ||
| catch { | ||
| // No controllers dir — auth detection will return all-false | ||
| } | ||
| controllerFiles = controllerFiles.filter((f) => !shouldExcludeFile(f, ignore)); | ||
| const controllerReadResults = await (0, parallel_1.readFilesParallel)(controllerFiles, concurrency); | ||
| // Build a map: controllerName (e.g. 'users') → hasAuth boolean | ||
| // We read each controller file and look for before_action :require_user!, | ||
| // before_action :authenticate_user!, etc. | ||
| const controllerAuthMap = new Map(); | ||
| for (const { absPath, content } of controllerReadResults) { | ||
| if (content === null) | ||
| continue; | ||
| const relPath = path.relative(absDir, absPath).replace(/\\/g, '/'); | ||
| // Extract controller name from path: app/controllers/api/v1/users_controller.rb → 'api/v1/users' | ||
| const controllerName = relPath | ||
| .replace(/^app\/controllers\//, '') | ||
| .replace(/\.rb$/, '') | ||
| .replace(/_controller$/, ''); | ||
| const hasAuth = (0, rails_auth_1.detectRailsAuthInController)(content, authPatterns); | ||
| controllerAuthMap.set(controllerName, hasAuth); | ||
| } | ||
| // ─── Step 5: Convert ParsedRoute[] to Route[] with auth info ─── | ||
| const routes = allParsedRoutes | ||
| .filter((r) => !r.isRedirect) // Skip redirects — they're not real handlers | ||
| .filter((r) => r.method !== 'USE') // Skip engine mounts — comparator excludes them | ||
| .map((r) => { | ||
| // controllerAction is like 'users#index' or 'api/v1/users#show' | ||
| const controllerName = r.controllerAction.split('#')[0]; | ||
| const hasAuth = controllerAuthMap.get(controllerName) ?? false; | ||
| return { | ||
| method: r.method, | ||
| path: r.path, | ||
| file: r.file, | ||
| line: r.line, | ||
| hasAuth, | ||
| }; | ||
| }); | ||
| // ─── Step 6: Dedup and sort (deterministic output) ───────────── | ||
| const deduped = dedupRoutes(routes); | ||
| deduped.sort((a, b) => { | ||
| if (a.file !== b.file) | ||
| return a.file < b.file ? -1 : 1; | ||
| return a.line - b.line; | ||
| }); | ||
| return deduped; | ||
| } | ||
| function dedupRoutes(routes) { | ||
| const seen = new Set(); | ||
| const result = []; | ||
| for (const r of routes) { | ||
| const key = `${r.method}|${r.path}|${r.file}`; | ||
| if (!seen.has(key)) { | ||
| seen.add(key); | ||
| result.push(r); | ||
| } | ||
| } | ||
| return result; | ||
| } | ||
| exports.default = scanRails; | ||
| //# sourceMappingURL=rails.js.map |
| {"version":3,"file":"rails.js","sourceRoot":"","sources":["../../src/scanners/rails.ts"],"names":[],"mappings":"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"} |
+31
-0
@@ -66,2 +66,3 @@ #!/usr/bin/env node | ||
| const nestjs_1 = require("./scanners/nestjs"); | ||
| const rails_1 = require("./scanners/rails"); | ||
| const spec_1 = require("./parsers/spec"); | ||
@@ -110,2 +111,27 @@ const comparator_1 = require("./comparator"); | ||
| } | ||
| // v0.8.0: Rails detection via Gemfile / Gemfile.lock | ||
| const gemfilePath = path.join(dir, 'Gemfile'); | ||
| if (fs.existsSync(gemfilePath)) { | ||
| try { | ||
| const gemfile = fs.readFileSync(gemfilePath, 'utf-8').toLowerCase(); | ||
| if (gemfile.includes("'rails'") || gemfile.includes('"rails"') || gemfile.includes('gem "rails') || gemfile.includes("gem 'rails")) { | ||
| return 'rails'; | ||
| } | ||
| } | ||
| catch { | ||
| // ignore | ||
| } | ||
| } | ||
| const gemfileLockPath = path.join(dir, 'Gemfile.lock'); | ||
| if (fs.existsSync(gemfileLockPath)) { | ||
| try { | ||
| const lock = fs.readFileSync(gemfileLockPath, 'utf-8'); | ||
| if (/^rails\s+\(/m.test(lock) || /\brails\s+\(/.test(lock)) { | ||
| return 'rails'; | ||
| } | ||
| } | ||
| catch { | ||
| // ignore | ||
| } | ||
| } | ||
| const reqPath = path.join(dir, 'requirements.txt'); | ||
@@ -245,2 +271,7 @@ if (fs.existsSync(reqPath)) { | ||
| } | ||
| else if (framework === 'rails') { | ||
| logger_1.logger.info('Running Rails route scanner...'); | ||
| scannedRoutes = await (0, rails_1.scanRails)(config.dir, config.ignore, config.authPatterns); | ||
| logger_1.logger.success(`Found ${scannedRoutes.length} Rails routes in ${config.dir}`); | ||
| } | ||
| // STEP 2 — Compare against spec (if provided) | ||
@@ -247,0 +278,0 @@ let result; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"action.js","sourceRoot":"","sources":["../src/action.ts"],"names":[],"mappings":";;AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,2CAAwC;AACxC,gDAAiD;AACjD,gDAAiD;AACjD,8CAA+C;AAC/C,4CAA6C;AAC7C,8CAA+C;AAC/C,yCAAyD;AACzD,6CAAkE;AAClE,8CAAkD;AAClD,8CAAiD;AAGjD,MAAM,qBAAqB,GAAa;IACtC,cAAc;IACd,gBAAgB;IAChB,aAAa;IACb,iBAAiB;IACjB,aAAa;IACb,YAAY;IACZ,uBAAuB;IACvB,WAAW;IACX,YAAY;IACZ,SAAS;CACV,CAAC;AAEF,MAAM,cAAc,GAAa,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAE9E;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,eAAe,CAC5B,GAAW;IAEX,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACnD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;YAC7D,IAAI,IAAI,CAAC,cAAc,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAC1C,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACnD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5D,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC9C,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAC5C,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,OAAO,OAAO,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;QACxD,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YACnE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC/C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAC7C,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,OAAO,OAAO,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,IAAY,EAAE,KAAsB;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAC7C,IAAI,CAAC,UAAU;QAAE,OAAO;IACxB,IAAI,CAAC;QACH,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,eAAM,CAAC,IAAI,CAAC,iCAAiC,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,sEAAsE;IACtE,mEAAmE;IACnE,6CAA6C;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAqB,CAAC;IACzE,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC1C,UAAU,CAAqB,CAAC;IAClC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC;IAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,OAAO,CAAC;IAC/D,MAAM,KAAK,GACT,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAEtE,MAAM,MAAM,GAAW;QACrB,GAAG;QACH,IAAI,EAAE,IAAI,IAAI,SAAS;QACvB,MAAM;QACN,MAAM;QACN,YAAY,EAAE,qBAAqB;QACnC,MAAM,EAAE,cAAc;KACvB,CAAC;IAEF,iEAAiE;IACjE,IAAI,SAAiB,CAAC;IACtB,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QAC9B,SAAS,GAAG,cAAc,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,eAAM,CAAC,IAAI,CACT,sFAAsF,CACvF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,SAAS,GAAG,QAAQ,CAAC;QACrB,MAAM,OAAO,GACX,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvD,eAAM,CAAC,IAAI,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,eAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACvD,eAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IACzC,eAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC,CAAC;IAC5D,eAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,eAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,eAAM,CAAC,IAAI,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC;IACxC,eAAM,CAAC,IAAI,CAAC,oBAAoB,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,eAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,uBAAuB;IACvB,IAAI,aAAa,GAAY,EAAE,CAAC;IAChC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,eAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACnD,aAAa,GAAG,MAAM,IAAA,qBAAW,EAC/B,MAAM,CAAC,GAAI,EACX,MAAM,CAAC,MAAO,EACd,MAAM,CAAC,YAAa,CACrB,CAAC;QACF,eAAM,CAAC,OAAO,CACZ,SAAS,aAAa,CAAC,MAAM,cAAc,MAAM,CAAC,GAAG,EAAE,CACxD,CAAC;IACJ,CAAC;SAAM,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,eAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,aAAa,GAAG,MAAM,IAAA,qBAAW,EAC/B,MAAM,CAAC,GAAI,EACX,MAAM,CAAC,MAAO,EACd,MAAM,CAAC,YAAa,CACrB,CAAC;QACF,eAAM,CAAC,OAAO,CACZ,SAAS,aAAa,CAAC,MAAM,sBAAsB,MAAM,CAAC,GAAG,EAAE,CAChE,CAAC;IACJ,CAAC;SAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,eAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC/C,aAAa,GAAG,MAAM,IAAA,mBAAU,EAC9B,MAAM,CAAC,GAAI,EACX,MAAM,CAAC,MAAO,EACd,MAAM,CAAC,YAAa,CACrB,CAAC;QACF,eAAM,CAAC,OAAO,CACZ,SAAS,aAAa,CAAC,MAAM,qBAAqB,MAAM,CAAC,GAAG,EAAE,CAC/D,CAAC;IACJ,CAAC;SAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACjC,eAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC9C,aAAa,GAAG,MAAM,IAAA,iBAAS,EAC7B,MAAM,CAAC,GAAI,EACX,MAAM,CAAC,MAAO,EACd,MAAM,CAAC,YAAa,CACrB,CAAC;QACF,eAAM,CAAC,OAAO,CACZ,SAAS,aAAa,CAAC,MAAM,oBAAoB,MAAM,CAAC,GAAG,EAAE,CAC9D,CAAC;IACJ,CAAC;SAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,eAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC/C,aAAa,GAAG,MAAM,IAAA,mBAAU,EAC9B,MAAM,CAAC,GAAI,EACX,MAAM,CAAC,MAAO,EACd,MAAM,CAAC,YAAa,CACrB,CAAC;QACF,eAAM,CAAC,OAAO,CACZ,SAAS,aAAa,CAAC,MAAM,qBAAqB,MAAM,CAAC,GAAG,EAAE,CAC/D,CAAC;IACJ,CAAC;IAED,8CAA8C;IAC9C,IAAI,MAAM,CAAC;IACX,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,eAAM,CAAC,IAAI,CACT,oDAAoD,CACrD,CAAC;QACF,wDAAwD;QACxD,MAAM,GAAG,IAAA,0BAAa,EAAC,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAY,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,gBAAgB,GAAG,MAAM,IAAA,gBAAS,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,IAAA,gCAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,uEAAuE;QACvE,gDAAgD;QAChD,MAAM,GAAG,IAAA,0BAAa,EAAC,aAAa,EAAE,gBAAgB,EAAE;YACtD,YAAY,EAAE,QAAQ,CAAC,QAAQ;YAC/B,gBAAgB,EAAE,QAAQ,CAAC,YAAY;SACxC,CAAC,CAAC;IACL,CAAC;IAED,eAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,eAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,eAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IACjE,eAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IACnE,eAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/D,eAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,eAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,0DAA0D;IAC1D,IAAA,oBAAY,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE7B,kDAAkD;IAClD,eAAe,CAAC,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,eAAe,CAAC,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACzD,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjD,4DAA4D;IAC5D,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QAEnC,IAAI,QAAQ,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClC,eAAM,CAAC,IAAI,CAAC,+BAA+B,QAAQ,KAAK,CAAC,CAAC;YAC1D,MAAM,IAAA,uBAAa,EAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChE,CAAC;aAAM,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,eAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,IAAI,CACT,2DAA2D,CAC5D,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,WAAW,IAAI,CAAC,KAAK,EAAE,CAAC;QACjC,eAAM,CAAC,IAAI,CACT,gEAAgE,CACjE,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC9D,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;SAAM,IACL,MAAM,CAAC,MAAM,KAAK,MAAM;QACxB,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,EACpD,CAAC;QACD,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CACV,qBAAqB,MAAM,CAAC,KAAK,CAAC,QAAQ,cAAc,MAAM,CAAC,KAAK,CAAC,IAAI,4BAA4B,MAAM,CAAC,MAAM,GAAG,CACtH,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,eAAM,CAAC,OAAO,CAAC,8DAA8D,CAAC,CAAC;IAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACjC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,eAAM,CAAC,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"} | ||
| {"version":3,"file":"action.js","sourceRoot":"","sources":["../src/action.ts"],"names":[],"mappings":"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"} |
+43
-10
@@ -49,2 +49,3 @@ #!/usr/bin/env node | ||
| const nestjs_1 = require("./scanners/nestjs"); | ||
| const rails_1 = require("./scanners/rails"); | ||
| const parallel_1 = require("./scanners/utils/parallel"); | ||
@@ -66,3 +67,3 @@ const spec_1 = require("./parsers/spec"); | ||
| .option('--fail-on <level>', 'Fail CI pipeline on: critical, high, info') | ||
| .option('--framework <name>', 'Force framework: express, fastapi, django, flask, nestjs') | ||
| .option('--framework <name>', 'Force framework: express, fastapi, django, flask, nestjs, rails') | ||
| .option('--generate-spec', 'Generate OpenAPI spec from scanned routes (no comparison)') | ||
@@ -77,12 +78,14 @@ .option('--diff', 'Show only new findings since last scan (requires persistent cache)') | ||
| * Detection order (first match wins): | ||
| * 1. package.json exists → 'express' | ||
| * 2. requirements.txt contains fastapi → 'fastapi' | ||
| * 3. requirements.txt contains django → 'django' | ||
| * 4. pyproject.toml contains fastapi → 'fastapi' | ||
| * 5. pyproject.toml contains django → 'django' | ||
| * 6. none of the above → null | ||
| * 1. package.json with @nestjs/core → 'nestjs' | ||
| * 2. package.json with express → 'express' | ||
| * 3. package.json (any other) → 'express' (default for Node) | ||
| * 4. Gemfile with rails → 'rails' | ||
| * 5. Gemfile with sinatra → null (not supported) | ||
| * 6. requirements.txt with fastapi → 'fastapi' | ||
| * 7. requirements.txt with django → 'django' | ||
| * 8. requirements.txt with flask → 'flask' | ||
| * 9. pyproject.toml (same checks) → fastapi/django/flask | ||
| * 10. none of the above → null | ||
| * | ||
| * The Express check is intentionally broad — if a package.json exists, we | ||
| * assume Express because shadowaudit doesn't yet support Koa/Nest/etc. | ||
| * Users with other Node frameworks can override with --framework. | ||
| * v0.8.0: Added Rails detection via Gemfile. | ||
| */ | ||
@@ -105,2 +108,28 @@ async function detectFramework(dir) { | ||
| } | ||
| // v0.8.0: Rails detection via Gemfile | ||
| const gemfilePath = path.join(dir, 'Gemfile'); | ||
| if (fs.existsSync(gemfilePath)) { | ||
| try { | ||
| const gemfile = fs.readFileSync(gemfilePath, 'utf-8').toLowerCase(); | ||
| if (gemfile.includes("'rails'") || gemfile.includes('"rails"') || gemfile.includes('gem "rails') || gemfile.includes("gem 'rails")) { | ||
| return 'rails'; | ||
| } | ||
| } | ||
| catch { | ||
| // ignore read errors | ||
| } | ||
| } | ||
| // Also check for Gemfile.lock (more reliable — always has the gem name in quotes) | ||
| const gemfileLockPath = path.join(dir, 'Gemfile.lock'); | ||
| if (fs.existsSync(gemfileLockPath)) { | ||
| try { | ||
| const lock = fs.readFileSync(gemfileLockPath, 'utf-8'); | ||
| if (/^rails\s+\(/m.test(lock) || /\brails\s+\(/.test(lock)) { | ||
| return 'rails'; | ||
| } | ||
| } | ||
| catch { | ||
| // ignore | ||
| } | ||
| } | ||
| const reqPath = path.join(dir, 'requirements.txt'); | ||
@@ -236,2 +265,6 @@ if (fs.existsSync(reqPath)) { | ||
| } | ||
| if (fw === 'rails') { | ||
| logger_1.logger.info('Running Rails route scanner...'); | ||
| return (0, rails_1.scanRails)(config.dir, config.ignore, config.authPatterns, concurrency); | ||
| } | ||
| return []; | ||
@@ -238,0 +271,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
+1
-1
| { | ||
| "name": "shadowaudit", | ||
| "version": "0.7.1", | ||
| "version": "0.8.0", | ||
| "description": "Static API security scanner — detects undocumented and unauthenticated Express.js routes before they reach production", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
+6
-5
@@ -43,3 +43,3 @@ # shadowaudit | ||
| ```yaml | ||
| - uses: darkmaster0345/shadow-Audit@v0.7.1 | ||
| - uses: darkmaster0345/shadow-Audit@v0.8.0 | ||
| with: | ||
@@ -123,2 +123,3 @@ dir: './src' | ||
| - **NestJS** ✅ (`@Controller()` + `@Get()` / `@Post()` decorator extraction, `@UseGuards()` auth detection, `@Public()` override, controller prefix + method path combination) | ||
| - **Rails** ✅ (v0.8.0+ — `config/routes.rb` block-aware parser: `namespace`, `scope`, `resources`/`resource` macros, `member`/`collection` blocks, `devise_for`, `draw(:subfile)`, cross-file auth via `before_action` in controllers) | ||
@@ -178,3 +179,3 @@ --- | ||
| --fail-on <level> Fail CI pipeline on: critical, high, info (default: "critical") | ||
| --framework <name> Force framework: express, fastapi, django, flask, nestjs (default: "auto") | ||
| --framework <name> Force framework: express, fastapi, django, flask, nestjs, rails (default: "auto") | ||
| --generate-spec Generate OpenAPI spec from scanned routes (no comparison) | ||
@@ -309,3 +310,3 @@ --diff Show only new findings since last scan (requires --spec) | ||
| "tool": "shadowaudit", | ||
| "version": "0.7.1", | ||
| "version": "0.8.0", | ||
| "timestamp": "2026-01-15T12:00:00.000Z", | ||
@@ -348,3 +349,3 @@ "stats": { "total": 7, "documented": 5, "undocumented": 2, "critical": 2, "high": 0, "info": 0 } | ||
| ╔════════════════════════════════╗ | ||
| ║ shadowaudit v0.7.1 ║ | ||
| ║ shadowaudit v0.8.0 ║ | ||
| ║ API Shadow Route Scanner ║ | ||
@@ -519,3 +520,3 @@ ╚════════════════════════════════╝ | ||
| ├── action.yml # GitHub Marketplace Action definition | ||
| ├── ROADMAP.md # v0.7.1 → v1.0.0 roadmap | ||
| ├── ROADMAP.md # v0.8.0 → v1.0.0 roadmap | ||
| ├── CONTRIBUTING.md # How to add framework scanners | ||
@@ -522,0 +523,0 @@ ├── package.json |
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
517696
22.32%104
13.04%7734
21.95%573
0.17%21
10.53%