build method

  1. @override
FutureOr<void> build(
  1. BuildStep buildStep
)

Generates the outputs for a given BuildStep.

Implementation

@override
FutureOr<void> build(BuildStep buildStep) async {
  SourceNode? schema;
  late AssetId _schemaId;
  final doc = await readDocument(buildStep, config.sourceExtension);
  final docPackage = buildStep.inputId.package;
  final docDirPath = p.dirname(buildStep.inputId.path);
  if (config.schemaIds != null) {
    for (final schemaId in config.schemaIds!) {
      if (docPackage == schemaId.package &&
          docDirPath.contains(p.dirname(schemaId.path))) {
        schema =
            await readDocument(buildStep, config.sourceExtension, schemaId);
        _schemaId = schemaId;
        break;
      }
    }
  }

  if (schema == null && config.schemaId != null) {
    schema = await readDocument(
        buildStep, config.sourceExtension, config.schemaId);
    _schemaId = config.schemaId!;
  }

  if (schema == null) {
    throw StateError('No schema found for ${buildStep.inputId}');
  }

  if ((config.whenExtensionConfig.generateMaybeWhenExtensionMethod ||
          config.whenExtensionConfig.generateWhenExtensionMethod) &&
      !config.shouldAddTypenames) {
    throw StateError(
        'When extensions require add_typenames to be true. Consider setting add_typenames to true in your build.yaml or disabling when_extensions in your build.yaml.');
  }

  final triStateValueConfig = config.triStateOptionalsConfig;

  final schemaOutputAsset =
      outputAssetId(_schemaId, schemaExtension, config.outputDir);

  final schemaUrl = schemaOutputAsset.uri.toString();
  final serializerOutputAsset =
      AssetId(buildStep.inputId.package, schemaOutputAsset.path);
  final serializerUrl = serializerOutputAsset.uri.toString();
  final schemaAllocator = GqlAllocator(
    buildStep.inputId.uri.toString(),
    config.sourceExtension,
    outputAssetId(buildStep.inputId, schemaExtension, config.outputDir)
        .uri
        .toString(),
    schemaUrl,
    serializerUrl,
    config.outputDir,
  );

  final varAllocator = schemaAllocator;

  final dataToVarsMode = config.dataToJsonMode;

  final libs = <String, Library>{
    astExtension: buildAstLibrary(doc),
    dataExtension: buildDataLibrary(
      config.shouldAddTypenames ? addTypenames(doc) : doc,
      addTypenames(schema),
      p.basename(generatedFilePath(buildStep.inputId, dataExtension)),
      config.typeOverrides,
      config.whenExtensionConfig,
      config.dataClassConfig,
    ),
    varExtension: buildVarLibrary(
        doc,
        addTypenames(schema),
        p.basename(generatedFilePath(buildStep.inputId, varExtension)),
        config.typeOverrides,
        varAllocator,
        triStateValueConfig,
        config.shouldGenerateVarsCreateFactories),
    reqExtension: buildReqLibrary(
      doc,
      p.basename(generatedFilePath(buildStep.inputId, reqExtension)),
      dataToVarsMode,
    ),
    schemaExtension: buildSchemaLibrary(
      doc,
      p.basename(generatedFilePath(buildStep.inputId, schemaExtension)),
      config.typeOverrides,
      config.enumFallbackConfig,
      generatePossibleTypesMap: config.shouldGeneratePossibleTypes,
      allocator: schemaAllocator,
      triStateValueConfig: triStateValueConfig,
      generateVarsCreateFactories: config.shouldGenerateVarsCreateFactories,
    ),
  };

  for (var entry in libs.entries) {
    final generatedAsset =
        outputAssetId(buildStep.inputId, entry.key, config.outputDir);
    final schemaOutputAsset =
        outputAssetId(_schemaId, schemaExtension, config.outputDir);

    final serialzerOutputAsset =
        AssetId(buildStep.inputId.package, schemaOutputAsset.path);

    final allocator = GqlAllocator(
      buildStep.inputId.uri.toString(),
      config.sourceExtension,
      generatedAsset.uri.toString(),
      schemaOutputAsset.uri.toString(),
      serialzerOutputAsset.uri.toString(),
      config.outputDir,
    );

    await writeDocument(generatedAsset, entry.value, allocator, buildStep);
  }
}