constructor()

in packages/type-safe-api/src/project/model/smithy/smithy-project-definition.ts [65:157]


  constructor(project: Project, options: SmithyProjectDefinitionOptions) {
    super(project);

    // Ignore gradle wrapper by default
    if (options.ignoreGradleWrapper ?? true) {
      project.gitignore.addPatterns("gradle");
      project.gitignore.addPatterns("gradlew");
      project.gitignore.addPatterns("gradlew.bat");
    }
    // Always ignore the .gradle dir which the wrapper downloads gradle into
    project.gitignore.addPatterns(".gradle");

    this.gradleProjectName = project.name.replace(/[\/\\:<>"?\*|]/g, "-");

    // Add settings.gradle
    new SmithySettingsGradleFile(project, {
      gradleProjectName: this.gradleProjectName,
    });

    const modelDir = "src/main/smithy";
    this.modelDir = modelDir;

    // Always add the following required dependencies
    const requiredDependencies = [
      "software.amazon.smithy:smithy-cli",
      "software.amazon.smithy:smithy-model",
    ];

    // Ensure dependencies always include the required dependencies, allowing users to customise the version
    const userSpecifiedDependencies =
      options.smithyBuildOptions?.maven?.dependencies ?? [];
    const userSpecifiedDependencySet = new Set(
      userSpecifiedDependencies.map((dep) =>
        dep.split(":").slice(0, -1).join(":")
      )
    );

    const dependencies = [
      ...requiredDependencies
        .filter((requiredDep) => !userSpecifiedDependencySet.has(requiredDep))
        .map((dep) => `${dep}:${DEFAULT_SMITHY_VERSION}`),
      ...userSpecifiedDependencies,
    ];

    // Add build.gradle
    this.smithyBuildGradleFile = new SmithyBuildGradleFile(project, {
      modelDir,
      dependencies: [],
      repositoryUrls: options.smithyBuildOptions?.maven?.repositoryUrls,
    });

    // Create the smithy build json file
    this.smithyBuild = new SmithyBuild(project, {
      version: "2.0",
      ...options.smithyBuildOptions,
      sources: [
        modelDir,
        ...this.asRelativePathsToProject(
          options.smithyBuildOptions?.additionalSources ?? []
        ),
      ],
      projections: {
        ...options.smithyBuildOptions?.projections,
      },
      maven: {
        dependencies: [],
        repositories: (
          options.smithyBuildOptions?.maven?.repositoryUrls ?? [
            "https://repo.maven.apache.org/maven2/",
            "file://~/.m2/repository",
          ]
        ).map((url) => ({ url })),
      },
    });

    this.addDeps(...dependencies);

    const generateTask = GenerateTask.ensure(project);

    // Copy the gradle files during build if they don't exist. We don't overwrite to allow users to BYO gradle wrapper
    // and set `ignoreGradleWrapper: false`.
    generateTask.exec(
      buildTypeSafeApiExecCommand(TypeSafeApiScript.COPY_GRADLE_WRAPPER)
    );

    // Build with gradle to generate smithy projections, and any other tasks
    generateTask.exec("./gradlew build");

    if (options.ignoreSmithyBuildOutput ?? true) {
      // Ignore the build directory, and smithy-output which was the old build directory for the cli-based generation
      project.gitignore.addPatterns("build", "smithy-output");
    }
  }