@aws-amplify/cli-internal
Version:
Amplify CLI
222 lines • 11.5 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AmplifyMigrationGenerateStep = void 0;
const node_path_1 = __importDefault(require("node:path"));
const node_os_1 = __importDefault(require("node:os"));
const promises_1 = __importDefault(require("node:fs/promises"));
const amplify_cli_core_1 = require("@aws-amplify/amplify-cli-core");
const step_1 = require("./_common/step");
const plan_1 = require("./_common/plan");
const assess_1 = require("./assess");
const backend_generator_1 = require("./generate/amplify/backend.generator");
const package_json_generator_1 = require("./generate/package.json.generator");
const package_json_generator_2 = require("./generate/amplify/package.json.generator");
const tsconfig_generator_1 = require("./generate/amplify/tsconfig.generator");
const amplify_yml_generator_1 = require("./generate/amplify.yml.generator");
const gitignore_generator_1 = require("./generate/gitignore.generator");
const auth_generator_1 = require("./generate/amplify/auth/auth.generator");
const reference_auth_generator_1 = require("./generate/amplify/auth/reference-auth.generator");
const data_generator_1 = require("./generate/amplify/data/data.generator");
const rest_api_generator_1 = require("./generate/amplify/rest-api/rest-api.generator");
const s3_generator_1 = require("./generate/amplify/storage/s3.generator");
const dynamodb_generator_1 = require("./generate/amplify/storage/dynamodb.generator");
const function_generator_1 = require("./generate/amplify/function/function.generator");
const kinesis_generator_1 = require("./generate/amplify/analytics/kinesis.generator");
const geo_generator_1 = require("./generate/amplify/geo/geo.generator");
const map_generator_1 = require("./generate/amplify/geo/map.generator");
const place_index_generator_1 = require("./generate/amplify/geo/place-index.generator");
const geofence_collection_generator_1 = require("./generate/amplify/geo/geofence-collection.generator");
const custom_generator_1 = require("./generate/amplify/custom-resources/custom.generator");
const AMPLIFY_DIR = 'amplify';
class AmplifyMigrationGenerateStep extends step_1.AmplifyMigrationStep {
async forward() {
const outputDir = await promises_1.default.mkdtemp(node_path_1.default.join(node_os_1.default.tmpdir(), 'amplify-gen2-'));
const backendGenerator = new backend_generator_1.BackendGenerator(outputDir, this.logger);
const packageJsonGenerator = new package_json_generator_1.RootPackageJsonGenerator(outputDir);
const generators = [];
const assessor = new assess_1.AmplifyMigrationAssessor(this.gen1App, this.logger);
const assessment = assessor.assess();
const operations = [
{
describe: async () => [],
validate: () => ({ description: 'Environment Locked', run: () => this.validateLockStatus() }),
execute: async () => { },
},
{
describe: async () => [],
validate: () => ({ description: 'Clean Working Directory', run: () => this.validateWorkingDirectory() }),
execute: async () => { },
},
{
describe: async () => [],
validate: () => ({
description: 'Assessment',
run: async () => {
const valid = assessment.validFor('generate');
return { valid, report: valid ? undefined : assessment.render() };
},
}),
execute: async () => { },
},
];
let authGenerator;
let s3Generator;
let geoGenerator;
const functionGenerators = [];
const discovered = this.gen1App.discover();
for (const resource of discovered) {
if (assessment.of(resource, 'generate').level !== 'supported') {
continue;
}
switch (resource.key) {
case 'auth:Cognito': {
const isReferenceAuth = discovered
.filter((r) => r.category === 'auth')
.some((r) => {
var _a;
const meta = ((_a = this.gen1App.categoryMeta('auth')) !== null && _a !== void 0 ? _a : {})[r.resourceName];
return (meta === null || meta === void 0 ? void 0 : meta.serviceType) === 'imported';
});
if (isReferenceAuth) {
generators.push(new reference_auth_generator_1.ReferenceAuthGenerator(this.gen1App, backendGenerator, outputDir, resource, this.logger));
}
else {
authGenerator = new auth_generator_1.AuthGenerator(this.gen1App, backendGenerator, outputDir, resource, this.logger);
generators.push(authGenerator);
}
break;
}
case 'auth:Cognito-UserPool-Groups':
break;
case 'storage:S3':
s3Generator = new s3_generator_1.S3Generator(this.gen1App, backendGenerator, outputDir, resource, this.logger);
generators.push(s3Generator);
break;
case 'storage:DynamoDB': {
generators.push(new dynamodb_generator_1.DynamoDBGenerator(this.gen1App, backendGenerator, outputDir, resource, this.logger));
break;
}
case 'api:AppSync':
generators.push(new data_generator_1.DataGenerator(this.gen1App, backendGenerator, outputDir, resource, this.logger));
break;
case 'api:API Gateway':
generators.push(new rest_api_generator_1.RestApiGenerator(this.gen1App, backendGenerator, outputDir, resource, this.logger));
break;
case 'analytics:Kinesis':
generators.push(new kinesis_generator_1.AnalyticsKinesisGenerator(this.gen1App, backendGenerator, outputDir, resource, this.logger));
break;
case 'geo:Map': {
if (!geoGenerator) {
geoGenerator = new geo_generator_1.GeoGenerator(backendGenerator, outputDir, this.logger);
}
generators.push(new map_generator_1.GeoMapGenerator(this.gen1App, outputDir, resource, geoGenerator, this.logger));
break;
}
case 'geo:PlaceIndex': {
if (!geoGenerator) {
geoGenerator = new geo_generator_1.GeoGenerator(backendGenerator, outputDir, this.logger);
}
generators.push(new place_index_generator_1.GeoPlaceIndexGenerator(this.gen1App, outputDir, resource, geoGenerator, this.logger));
break;
}
case 'geo:GeofenceCollection': {
if (!geoGenerator) {
geoGenerator = new geo_generator_1.GeoGenerator(backendGenerator, outputDir, this.logger);
}
generators.push(new geofence_collection_generator_1.GeoGeofenceCollectionGenerator(this.gen1App, outputDir, resource, geoGenerator, this.logger));
break;
}
case 'function:Lambda': {
const funcGen = new function_generator_1.FunctionGenerator({
gen1App: this.gen1App,
backendGenerator,
packageJsonGenerator,
outputDir,
resource,
logger: this.logger,
});
generators.push(funcGen);
functionGenerators.push(funcGen);
break;
}
case 'custom:customCDK':
generators.push(new custom_generator_1.CustomResourceGenerator(this.gen1App, backendGenerator, packageJsonGenerator, outputDir, resource.resourceName, this.logger));
break;
case 'UNKNOWN':
break;
}
}
for (const funcGen of functionGenerators) {
if (authGenerator)
funcGen.setAuthGenerator(authGenerator);
if (s3Generator)
funcGen.setS3Generator(s3Generator);
}
if (geoGenerator) {
generators.push(geoGenerator);
}
generators.push(backendGenerator);
generators.push(packageJsonGenerator);
generators.push(new package_json_generator_2.BackendPackageJsonGenerator(outputDir));
generators.push(new tsconfig_generator_1.TsConfigGenerator(outputDir));
generators.push(new amplify_yml_generator_1.AmplifyYmlGenerator(this.gen1App));
generators.push(new gitignore_generator_1.GitIgnoreGenerator());
for (const generator of generators) {
operations.push(...(await generator.plan()));
}
operations.push({
validate: () => undefined,
describe: async () => [],
execute: async () => {
const cwd = process.cwd();
this.logger.info('Deleting amplify/');
await promises_1.default.rm(AMPLIFY_DIR, { recursive: true });
await promises_1.default.rename(node_path_1.default.join(outputDir, 'amplify'), node_path_1.default.join(cwd, 'amplify'));
await promises_1.default.rename(node_path_1.default.join(outputDir, 'package.json'), node_path_1.default.join(cwd, 'package.json'));
await promises_1.default.rm(outputDir, { recursive: true });
},
});
return new plan_1.Plan({
operations,
logger: this.logger,
title: 'Execute',
implications: [
"Your local 'amplify/' directory will be replaced with Gen2 code",
"Your root 'package.json' will be updated with Gen2 dependencies",
],
});
}
async rollback() {
throw new amplify_cli_core_1.AmplifyError('UnsupportedOperationError', {
message: 'Rollback is not supported for the generate step.',
resolution: [
'To restore your local directory to its previous state, use git to discard the changes.',
'',
`Then restore the Amplify configuration by running: 'amplify pull --appId ${this.gen1App.appId} --envName ${this.gen1App.appName}'`,
].join('\n'),
});
}
async validateLockStatus() {
try {
await this.validations.validateLockStatus();
return { valid: true };
}
catch (e) {
return { valid: false, report: e.message };
}
}
async validateWorkingDirectory() {
try {
await this.validations.validateWorkingDirectory();
return { valid: true };
}
catch (e) {
return { valid: false, report: e.message };
}
}
}
exports.AmplifyMigrationGenerateStep = AmplifyMigrationGenerateStep;
//# sourceMappingURL=generate.js.map