CREATE OR REPLACE FUNCTION dev_schema_info()
RETURNS json
LANGUAGE sql
SECURITY DEFINER
SET search_path = public
AS $$
  SELECT json_agg(t ORDER BY t.table_name)
  FROM (
    SELECT
      cols.table_name,
      json_agg(
        json_build_object(
          'name',     cols.column_name,
          'type',     cols.data_type,
          'nullable', (cols.is_nullable = 'YES'),
          'default',  cols.column_default
        )
        ORDER BY cols.ordinal_position
      ) AS columns
    FROM information_schema.columns AS cols
    JOIN information_schema.tables  AS tbls
      ON  tbls.table_name   = cols.table_name
      AND tbls.table_schema = cols.table_schema
    WHERE cols.table_schema = 'public'
      AND tbls.table_type   = 'BASE TABLE'
    GROUP BY cols.table_name
  ) t
$$;
