class

Detector::Specification::Supabase

Inherits Detector < Reference < Object

Supabase exposes every table in an exposed schema over PostgREST at /rest/v1/<table>, so the migration SQL is the API definition.

.sql is a file class no other Noir detector opens, and CREATE TABLE is the most universal statement in SQL — a Rails db/structure.sql, a Flyway V1__init.sql or any schema dump would match on content alone. The gate is therefore path-first, in two tiers:

  • under supabase/ -> create table is enough
  • under migrations/ -> additionally requires an RLS/Supabase fingerprint, because that directory name belongs to every migration tool there is

Bare PostgREST (a Postgres schema with no supabase/ directory) is deliberately not supported: PostgREST reads the live database and adds no syntax of its own, so nothing in the file distinguishes a schema served by PostgREST from any other schema.

Constants

DDL_MARKER = /\bcreate\s+(?:global\s+|local\s+|temp(?:orary)?\s+|unlogged\s+)*table\b|\balter\s+table\b/i

alter table counts too: a migration that only adds a column is still part of the schema, and dropping those would leave the emitted params stuck at whatever the first migration declared.

SUPABASE_FINGERPRINT = /\bauth\.uid\s*\(|\benable\s+row\s+level\s+security\b|\bcreate\s+policy\b|\bstorage\.objects\b|\bauth\.users\b|\bpgrst\b|\bsupabase\b/i

Constructs that only appear in a Supabase/PostgREST-managed schema.

Class methods

tech_name

The tech name without needing an instance, so the registry can be read off the classes themselves rather than from a parallel list.

Source

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 migration path in CodeLocator.

Source
path_sensitive?

Memo safety: applicable? consults the path (supabase/ and migrations/ gates), not just the basename.

Source
set_name

Registers every migration path in CodeLocator.

Source