🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

shadowaudit

Package Overview
Dependencies
Maintainers
1
Versions
19
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

shadowaudit - npm Package Compare versions

Comparing version
0.7.1
to
0.8.0
+65
dist/scanners/rails-auth.d.ts
/**
* 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

@@ -1,1 +0,1 @@

{"version":3,"file":"action.js","sourceRoot":"","sources":["../src/action.ts"],"names":[],"mappings":"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"}
{"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,4CAA6C;AAC7C,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,qDAAqD;IACrD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC9C,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YACpE,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACnI,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3D,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,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;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;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"}

@@ -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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"}
{
"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",

@@ -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