class

Detector::Specification::Strapi

Inherits Detector < Reference < Object

Strapi generates its REST surface from the content-type schemas the Content-Type Builder writes to src/api/<name>/content-types/<name>/schema.json, plus any custom routes declared in src/api/<name>/routes/*.{ts,js}.

Scoped to v4+. Strapi v3's config/routes.json is EOL since 2023 and its shape is indistinguishable from an APISIX route export.

Constants

CORE_ROUTER_MARKER = /\bcreateCoreRouter\s*\(/
ROUTE_EXTENSIONS = {".ts", ".js", ".mts", ".cts", ".mjs", ".cjs"}
ROUTE_HANDLER = /\bhandler\s*:\s*['"]/
ROUTE_MARKER = /\broutes\s*:\s*\[/

Strapi route objects always carry handler; Express/Fastify/ SvelteKit route modules never do.

SCHEMA_FILENAME = "schema.json"
SCHEMA_MARKER = /"kind"\s*:\s*"(?:collectionType|singleType)"/

"kind": "collectionType" is a Strapi-only literal, and the singular/plural name pair under info appears in no other schema format.

Instance methods

applicable?(filename : String) : Bool

Cheap filename-only filter the detector pass uses to skip detect on files the detector cannot possibly match. The default true preserves prior behavior (every detector runs on every file). Override with the same predicate the body of detect starts with — e.g., filename.ends_with?(".py") for a Python framework detector — so the detector loop avoids the detect dispatch on files outside the detector's language.

On large codebases (saleor's 4255 .py files) this lifts ~100 virtual detect calls per file out of the hot loop because most detectors' inner first-line is exactly this kind of cheap filename check.

Source
detect(filename : String, file_contents : String) : Bool
Source
idempotent?

Registers every schema and route path in CodeLocator. Memo safety: applicable? consults the path (/content-types/ gate), not just the basename.

Source
name

Registers every schema and route path in CodeLocator. Memo safety: applicable? consults the path (/content-types/ gate), not just the basename.

Source
path_sensitive?

Registers every schema and route path in CodeLocator. Memo safety: applicable? consults the path (/content-types/ gate), not just the basename.

Source