generateQueries function

Future<GeneratedQueries> generateQueries(
  1. String sourcePath, {
  2. String? outputPath,
})

Analyzes named SQL declarations and reads their SQL files without writing.

outputPath determines relative Dart imports and defaults to the source basename with a .queries.dart extension. Generation validates declarations; use checkSqlQueries to ask a selected database to validate the SQL itself.

Implementation

Future<GeneratedQueries> generateQueries(
  String sourcePath, {
  String? outputPath,
}) async {
  final source = p.normalize(p.absolute(sourcePath));
  final output = p.normalize(
    p.absolute(outputPath ?? p.setExtension(source, '.queries.dart')),
  );
  if (source == output || p.extension(output) != '.dart') {
    throw const GenerationException(
      'Query output must be a separate .dart file.',
    );
  }
  final contexts = AnalysisContextCollection(includedPaths: [source]);
  try {
    final resolved = await contexts
        .contextFor(source)
        .currentSession
        .getResolvedUnit(source);
    if (resolved is! ResolvedUnitResult) {
      throw GenerationException('Cannot analyze $source.');
    }
    final errors = resolved.diagnostics.where(
      (e) => e.severity.name.toLowerCase() == 'error',
    );
    if (errors.isNotEmpty) {
      throw GenerationException(errors.map((e) => e.toString()).join('\n'));
    }
    return await generateResolvedQueries(
      resolved.unit,
      resolved.libraryElement,
      p.relative(source, from: p.dirname(output)).replaceAll(r'\', '/'),
      (uri) => uri.scheme == 'file'
          ? p
                .relative(uri.toFilePath(), from: p.dirname(output))
                .replaceAll(r'\', '/')
          : uri.toString(),
      (path) => File(p.join(p.dirname(source), path)).readAsString(),
    );
  } finally {
    await contexts.dispose();
  }
}