generateQueries function
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();
}
}