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");
}
}