@energica-city/shared-amplify-utils
Version:
Shared utilities for AWS Amplify projects
78 lines • 11.2 kB
JavaScript
// queries/initialize.ts
import { Amplify } from 'aws-amplify';
import { ClientManager } from './ClientManager';
import { QueryFactory } from './QueryFactory';
import { logger } from '../log';
// Global state
let globalAmplifyOutputs = null;
let initializationPromise = null;
const queryFactories = new Map();
/**
* Initialize queries with schema and generate query factories automatically.
*
* @param config Configuration object
* @param config.amplifyOutputs The outputs from your Amplify backend
* @param config.schema The Amplify schema definition
* @param config.entities Optional array of entity names to initialize. If not provided, all entities will be initialized
* @param config.clientKey A unique key for the client instance, defaults to 'default'
*/
export async function initializeQueries(config) {
const { amplifyOutputs, schema, entities, clientKey = 'default' } = config;
// Initialize Amplify system once
if (!initializationPromise) {
initializationPromise = (async () => {
try {
logger.info('Configuring Amplify globally...');
Amplify.configure(amplifyOutputs);
globalAmplifyOutputs = amplifyOutputs;
const manager = ClientManager.getInstance(clientKey);
await manager.initialize();
logger.info('Amplify system initialized successfully', { clientKey });
}
catch (error) {
initializationPromise = null;
const errorMessage = error instanceof Error ? error.message : String(error);
logger.error('Failed to initialize Amplify system', {
error: errorMessage,
});
throw error;
}
})();
}
await initializationPromise;
// Get entity names to initialize - ensure they are strings
const schemaModelNames = Object.keys(schema.models || {}).filter((key) => typeof key === 'string');
const entitiesToInitialize = entities ?? schemaModelNames;
const queries = {};
// Generate query factories
for (const entityName of entitiesToInitialize) {
const entityKey = String(entityName);
if (queryFactories.has(entityKey)) {
queries[entityName] = queryFactories.get(entityKey);
continue;
}
try {
const queryFactory = await QueryFactory({
name: entityKey,
clientKey,
});
queryFactories.set(entityKey, queryFactory);
queries[entityName] = queryFactory;
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
throw new Error(`Failed to initialize entity "${entityKey}": ${errorMessage}`);
}
}
logger.info('Query factories initialized successfully', {
totalFactories: Object.keys(queries).length,
});
return queries;
}
/**
* Gets the global Amplify outputs
*/
export function getGlobalAmplifyOutputs() {
return globalAmplifyOutputs;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3F1ZXJpZXMvaW5pdGlhbGl6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3QkFBd0I7QUFDeEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFHaEMsZUFBZTtBQUNmLElBQUksb0JBQW9CLEdBQTBCLElBQUksQ0FBQztBQUN2RCxJQUFJLHFCQUFxQixHQUF5QixJQUFJLENBQUM7QUFDdkQsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7QUFFbEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUdyQyxNQUtEO0lBS0MsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsR0FBRyxTQUFTLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFM0UsaUNBQWlDO0lBQ2pDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzNCLHFCQUFxQixHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDbEMsSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQztnQkFDL0MsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDbEMsb0JBQW9CLEdBQUcsY0FBYyxDQUFDO2dCQUV0QyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNLE9BQU8sQ0FBQyxVQUFVLEVBQVUsQ0FBQztnQkFFbkMsTUFBTSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDeEUsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2dCQUM3QixNQUFNLFlBQVksR0FDaEIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6RCxNQUFNLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFO29CQUNsRCxLQUFLLEVBQUUsWUFBWTtpQkFDcEIsQ0FBQyxDQUFDO2dCQUNILE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxDQUFDO0lBQ0QsTUFBTSxxQkFBcUIsQ0FBQztJQUU1QiwyREFBMkQ7SUFDM0QsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUM5RCxDQUFDLEdBQUcsRUFBaUIsRUFBRSxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FDaEQsQ0FBQztJQUNGLE1BQU0sb0JBQW9CLEdBQUcsUUFBUSxJQUFJLGdCQUFnQixDQUFDO0lBRTFELE1BQU0sT0FBTyxHQUE0QixFQUFFLENBQUM7SUFFNUMsMkJBQTJCO0lBQzNCLEtBQUssTUFBTSxVQUFVLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUM5QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFckMsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDcEQsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLFlBQVksR0FBRyxNQUFNLFlBQVksQ0FBaUI7Z0JBQ3RELElBQUksRUFBRSxTQUFTO2dCQUNmLFNBQVM7YUFDVixDQUFDLENBQUM7WUFFSCxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM1QyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsWUFBWSxDQUFDO1FBQ3JDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxZQUFZLEdBQ2hCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6RCxNQUFNLElBQUksS0FBSyxDQUNiLGdDQUFnQyxTQUFTLE1BQU0sWUFBWSxFQUFFLENBQzlELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsMENBQTBDLEVBQUU7UUFDdEQsY0FBYyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTTtLQUM1QyxDQUFDLENBQUM7SUFFSCxPQUFPLE9BSU4sQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSx1QkFBdUI7SUFDckMsT0FBTyxvQkFBb0IsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcXVlcmllcy9pbml0aWFsaXplLnRzXG5pbXBvcnQgeyBBbXBsaWZ5IH0gZnJvbSAnYXdzLWFtcGxpZnknO1xuaW1wb3J0IHsgQ2xpZW50TWFuYWdlciB9IGZyb20gJy4vQ2xpZW50TWFuYWdlcic7XG5pbXBvcnQgeyBRdWVyeUZhY3RvcnkgfSBmcm9tICcuL1F1ZXJ5RmFjdG9yeSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2cnO1xuaW1wb3J0IHR5cGUgeyBBbXBsaWZ5T3V0cHV0cywgQW1wbGlmeU1vZGVsVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBHbG9iYWwgc3RhdGVcbmxldCBnbG9iYWxBbXBsaWZ5T3V0cHV0czogQW1wbGlmeU91dHB1dHMgfCBudWxsID0gbnVsbDtcbmxldCBpbml0aWFsaXphdGlvblByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbmNvbnN0IHF1ZXJ5RmFjdG9yaWVzID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBxdWVyaWVzIHdpdGggc2NoZW1hIGFuZCBnZW5lcmF0ZSBxdWVyeSBmYWN0b3JpZXMgYXV0b21hdGljYWxseS5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gY29uZmlnLmFtcGxpZnlPdXRwdXRzIFRoZSBvdXRwdXRzIGZyb20geW91ciBBbXBsaWZ5IGJhY2tlbmRcbiAqIEBwYXJhbSBjb25maWcuc2NoZW1hIFRoZSBBbXBsaWZ5IHNjaGVtYSBkZWZpbml0aW9uXG4gKiBAcGFyYW0gY29uZmlnLmVudGl0aWVzIE9wdGlvbmFsIGFycmF5IG9mIGVudGl0eSBuYW1lcyB0byBpbml0aWFsaXplLiBJZiBub3QgcHJvdmlkZWQsIGFsbCBlbnRpdGllcyB3aWxsIGJlIGluaXRpYWxpemVkXG4gKiBAcGFyYW0gY29uZmlnLmNsaWVudEtleSBBIHVuaXF1ZSBrZXkgZm9yIHRoZSBjbGllbnQgaW5zdGFuY2UsIGRlZmF1bHRzIHRvICdkZWZhdWx0J1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZVF1ZXJpZXM8XG4gIFRTY2hlbWEgZXh0ZW5kcyB7IG1vZGVsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSxcbiAgVFR5cGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgQW1wbGlmeU1vZGVsVHlwZT4sXG4+KGNvbmZpZzoge1xuICBhbXBsaWZ5T3V0cHV0czogQW1wbGlmeU91dHB1dHM7XG4gIHNjaGVtYTogVFNjaGVtYTtcbiAgZW50aXRpZXM/OiAoa2V5b2YgVFR5cGVzICYgc3RyaW5nKVtdO1xuICBjbGllbnRLZXk/OiBzdHJpbmc7XG59KTogUHJvbWlzZTx7XG4gIFtLIGluIGtleW9mIFRUeXBlc106IEF3YWl0ZWQ8XG4gICAgUmV0dXJuVHlwZTx0eXBlb2YgUXVlcnlGYWN0b3J5PEsgJiBzdHJpbmcsIFRUeXBlcz4+XG4gID47XG59PiB7XG4gIGNvbnN0IHsgYW1wbGlmeU91dHB1dHMsIHNjaGVtYSwgZW50aXRpZXMsIGNsaWVudEtleSA9ICdkZWZhdWx0JyB9ID0gY29uZmlnO1xuXG4gIC8vIEluaXRpYWxpemUgQW1wbGlmeSBzeXN0ZW0gb25jZVxuICBpZiAoIWluaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgIGluaXRpYWxpemF0aW9uUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2dnZXIuaW5mbygnQ29uZmlndXJpbmcgQW1wbGlmeSBnbG9iYWxseS4uLicpO1xuICAgICAgICBBbXBsaWZ5LmNvbmZpZ3VyZShhbXBsaWZ5T3V0cHV0cyk7XG4gICAgICAgIGdsb2JhbEFtcGxpZnlPdXRwdXRzID0gYW1wbGlmeU91dHB1dHM7XG5cbiAgICAgICAgY29uc3QgbWFuYWdlciA9IENsaWVudE1hbmFnZXIuZ2V0SW5zdGFuY2UoY2xpZW50S2V5KTtcbiAgICAgICAgYXdhaXQgbWFuYWdlci5pbml0aWFsaXplPFRUeXBlcz4oKTtcblxuICAgICAgICBsb2dnZXIuaW5mbygnQW1wbGlmeSBzeXN0ZW0gaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5JywgeyBjbGllbnRLZXkgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpbml0aWFsaXphdGlvblByb21pc2UgPSBudWxsO1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBBbXBsaWZ5IHN5c3RlbScsIHtcbiAgICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuICBhd2FpdCBpbml0aWFsaXphdGlvblByb21pc2U7XG5cbiAgLy8gR2V0IGVudGl0eSBuYW1lcyB0byBpbml0aWFsaXplIC0gZW5zdXJlIHRoZXkgYXJlIHN0cmluZ3NcbiAgY29uc3Qgc2NoZW1hTW9kZWxOYW1lcyA9IE9iamVjdC5rZXlzKHNjaGVtYS5tb2RlbHMgfHwge30pLmZpbHRlcihcbiAgICAoa2V5KToga2V5IGlzIHN0cmluZyA9PiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyxcbiAgKTtcbiAgY29uc3QgZW50aXRpZXNUb0luaXRpYWxpemUgPSBlbnRpdGllcyA/PyBzY2hlbWFNb2RlbE5hbWVzO1xuXG4gIGNvbnN0IHF1ZXJpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLy8gR2VuZXJhdGUgcXVlcnkgZmFjdG9yaWVzXG4gIGZvciAoY29uc3QgZW50aXR5TmFtZSBvZiBlbnRpdGllc1RvSW5pdGlhbGl6ZSkge1xuICAgIGNvbnN0IGVudGl0eUtleSA9IFN0cmluZyhlbnRpdHlOYW1lKTtcblxuICAgIGlmIChxdWVyeUZhY3Rvcmllcy5oYXMoZW50aXR5S2V5KSkge1xuICAgICAgcXVlcmllc1tlbnRpdHlOYW1lXSA9IHF1ZXJ5RmFjdG9yaWVzLmdldChlbnRpdHlLZXkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5RmFjdG9yeSA9IGF3YWl0IFF1ZXJ5RmFjdG9yeTxzdHJpbmcsIFRUeXBlcz4oe1xuICAgICAgICBuYW1lOiBlbnRpdHlLZXksXG4gICAgICAgIGNsaWVudEtleSxcbiAgICAgIH0pO1xuXG4gICAgICBxdWVyeUZhY3Rvcmllcy5zZXQoZW50aXR5S2V5LCBxdWVyeUZhY3RvcnkpO1xuICAgICAgcXVlcmllc1tlbnRpdHlOYW1lXSA9IHF1ZXJ5RmFjdG9yeTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGluaXRpYWxpemUgZW50aXR5IFwiJHtlbnRpdHlLZXl9XCI6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5pbmZvKCdRdWVyeSBmYWN0b3JpZXMgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgIHRvdGFsRmFjdG9yaWVzOiBPYmplY3Qua2V5cyhxdWVyaWVzKS5sZW5ndGgsXG4gIH0pO1xuXG4gIHJldHVybiBxdWVyaWVzIGFzIHtcbiAgICBbSyBpbiBrZXlvZiBUVHlwZXNdOiBBd2FpdGVkPFxuICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgUXVlcnlGYWN0b3J5PEsgJiBzdHJpbmcsIFRUeXBlcz4+XG4gICAgPjtcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBnbG9iYWwgQW1wbGlmeSBvdXRwdXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxBbXBsaWZ5T3V0cHV0cygpOiBBbXBsaWZ5T3V0cHV0cyB8IG51bGwge1xuICByZXR1cm4gZ2xvYmFsQW1wbGlmeU91dHB1dHM7XG59XG4iXX0=