Mariusz Nowak 731b3ba1e1 feat(Variables): Remove old variables resolver
BREAKING CHANGE:
Old variables resolver is permanently removed. Any resolution error as approached with current resolver is assumed as final (there's no longer fallback to old resolver)
2022-01-27 15:21:58 +01:00

71 lines
2.2 KiB
JavaScript

'use strict';
const ensureString = require('type/string/ensure');
const ServerlessError = require('../../../../serverless-error');
const _ = require('lodash');
module.exports = (serverlessInstance) => {
return {
resolve: async ({ address, params }) => {
// ssm(region = null):param-path
if (!address) {
throw new ServerlessError(
'Missing address argument in variable "ssm" source',
'MISSING_SLS_SOURCE_ADDRESS'
);
}
address = ensureString(address, {
Error: ServerlessError,
errorMessage: 'Non-string address argument in variable "ssm" source: %v',
errorCode: 'INVALID_SSM_SOURCE_ADDRESS',
});
const shouldReturnRawValue = params && params.includes('raw');
const shouldSkipDecryption = params && params.includes('noDecrypt');
_.pull(params, 'raw', 'noDecrypt');
const region = params && params[0];
const result = await (async () => {
try {
return await serverlessInstance.getProvider('aws').request(
'SSM',
'getParameter',
{
Name: address,
WithDecryption: !shouldSkipDecryption,
},
{ useCache: true, region }
);
} catch (error) {
// Check for normalized error code instead of native one
if (error.code === 'AWS_S_S_M_GET_PARAMETER_PARAMETER_NOT_FOUND') return null;
throw error;
}
})();
if (!result) return { value: null };
switch (result.Parameter.Type) {
case 'String':
return { value: result.Parameter.Value };
case 'StringList':
return {
value: shouldReturnRawValue
? result.Parameter.Value
: result.Parameter.Value.split(','),
};
case 'SecureString':
if (shouldReturnRawValue || !result.Parameter.Value.startsWith('{')) {
return { value: result.Parameter.Value };
}
try {
return { value: JSON.parse(result.Parameter.Value) };
} catch {
return { value: result.Parameter.Value };
}
default:
throw new Error(`Unexpected parameter type: "${result.Parameter.Type}"`);
}
},
};
};