@inizioevoke/evosynth 2.1.0 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -37,14 +37,23 @@ export async function evosynth(cmd, env, props) {
37
37
  if (configIndex != -1) {
38
38
  const configFile = configFiles[configIndex];
39
39
  const tsxUnregister = /^\.m?ts$/.test(extname(configFile.name)) ? register() : undefined;
40
- const module = await import(__rewriteRelativeImportExtension(pathToFileURL(join(configFile.dir, configFile.name)).toString()));
41
- tsxUnregister && tsxUnregister();
40
+ let module;
41
+ try {
42
+ module = await import(__rewriteRelativeImportExtension(pathToFileURL(join(configFile.dir, configFile.name)).toString()));
43
+ }
44
+ catch (err) {
45
+ console.error(`Failed to load config "${configFile.name}":`, err.message);
46
+ process.exit(1);
47
+ }
48
+ finally {
49
+ tsxUnregister?.();
50
+ }
42
51
  let config = undefined;
43
52
  if (configFile.env) {
44
- config = await module.default();
53
+ config = await module.default?.();
45
54
  }
46
55
  else {
47
- config = await module[env]?.();
56
+ config = await module[env.toLowerCase()]?.();
48
57
  }
49
58
  if (config) {
50
59
  if (props.profile) {
@@ -54,11 +63,19 @@ export async function evosynth(cmd, env, props) {
54
63
  case 'web-static-serverless':
55
64
  await runWebStaticServerlessApp(cmd, config);
56
65
  break;
66
+ default:
67
+ console.error(`Unsupported evosynth app type: "${config.type}"`);
68
+ process.exit(1);
69
+ break;
57
70
  }
58
71
  }
72
+ else {
73
+ console.error(`Config environment "${env}" not found`);
74
+ process.exit(1);
75
+ }
59
76
  }
60
77
  else {
61
78
  console.error('evosynth config not found!');
62
79
  }
63
80
  }
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZvc3ludGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2V2b3N5bnRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV2QyxPQUFPLEVBQUUseUJBQXlCLEVBQWdDLE1BQU0sNEJBQTRCLENBQUM7QUFtQnJHLE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUFDLEdBQWUsRUFBRSxHQUFXLEVBQUUsS0FBb0I7SUFDL0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFcEUsTUFBTSxXQUFXLEdBQUcsS0FBSztTQUN0QixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNqQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sdUNBQXVDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUMsQ0FBQztTQUNELEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ2QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNELE9BQU87WUFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDNUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxVQUFVO1NBQ3ZCLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLElBQUksV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3hHLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkIsV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxJQUFJLFdBQVcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN6RixNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sa0NBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFDLENBQUM7UUFDN0YsYUFBYSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2pDLElBQUksTUFBTSxHQUFrQyxTQUFTLENBQUM7UUFDdEQsSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbkIsTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBRUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQzFDLENBQUM7WUFDRCxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDcEIsS0FBSyx1QkFBdUI7b0JBQzFCLE1BQU0seUJBQXlCLENBQUMsR0FBRyxFQUFFLE1BQXNDLENBQUMsQ0FBQztvQkFDN0UsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO0lBRUgsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDOUMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkZGlyIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luLCBleHRuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJ3RzeC9lc20vYXBpJztcbmltcG9ydCB0eXBlIHsgRXZvc3ludGhUYWdLZXkgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBydW5XZWJTdGF0aWNTZXJ2ZXJsZXNzQXBwLCBXZWJTdGF0aWNTZXJ2ZXJsZXNzQXBwQ29uZmlnIH0gZnJvbSAnLi93ZWItc3RhdGljLXNlcnZlcmxlc3MuanMnO1xuXG5leHBvcnQgeyBXZWJTdGF0aWNTZXJ2ZXJsZXNzQXBwQ29uZmlnIH07XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50VHlwZSA9ICdkZXYnIHwgJ3Rlc3QnIHwgJ3N0YWdlJyB8ICd1YXQnIHwgJ3ByZXByb2QnICB8ICdwcm9kJyB8IChzdHJpbmcgJiB7fSk7XG5leHBvcnQgdHlwZSBDZGtDb21tYW5kID0gJ2RlcGxveScgfCAnZGVzdHJveScgfCAnZGlmZicgfCAnZHJpZnQnIHwgJ3JvbGxiYWNrJyB8ICdzeW50aCc7IC8vICdib290c3RyYXAnIHwgXG5leHBvcnQgdHlwZSBFdm9zeW50aEFwcFR5cGUgPSAnc3RyOHItY2xtJyB8ICd3ZWItc3RhdGljLXNlcnZlcmxlc3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV2b3N5bnRoQXBwQ29uZmlnIHtcbiAgdHlwZTogRXZvc3ludGhBcHBUeXBlO1xuICBlbnZUeXBlPzogRW52aXJvbm1lbnRUeXBlO1xuICBuYW1lOiBzdHJpbmc7XG4gIHJlZ2lvbjogJ3VzLWVhc3QtMScgfCAndXMtZWFzdC0yJyB8ICd1cy13ZXN0LTEnIHwgJ3VzLXdlc3QtMicgfCAoc3RyaW5nICYge30pO1xuICB0YWdzPzogUmVjb3JkPEV2b3N5bnRoVGFnS2V5LCBzdHJpbmc+LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV2b3N5bnRoUHJvcHMge1xuICBwcm9maWxlPzogc3RyaW5nO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV2b3N5bnRoKGNtZDogQ2RrQ29tbWFuZCwgZW52OiBzdHJpbmcsIHByb3BzOiBFdm9zeW50aFByb3BzKSB7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgcmVhZGRpcihwcm9jZXNzLmN3ZCgpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgY29uc3QgY29uZmlnRmlsZXMgPSBmaWxlc1xuICAgIC5maWx0ZXIoKGRpcmVudCkgPT4ge1xuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSkge1xuICAgICAgICByZXR1cm4gL15cXC5ldm9zeW50aCguKj8pXFwuKD86anN8bWpzfHRzfG10cykkL2kudGVzdChkaXJlbnQubmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSlcbiAgICAubWFwKChkaXJlbnQpID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gZGlyZW50Lm5hbWUuc3BsaXQoJy4nKS5maWx0ZXIocCA9PiBwICE9PSAnJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBkaXJlbnQubmFtZSxcbiAgICAgICAgZW52OiBwYXJ0cy5sZW5ndGggPiAyID8gcGFydHNbMV0gOiB1bmRlZmluZWQsXG4gICAgICAgIGRpcjogZGlyZW50LnBhcmVudFBhdGhcbiAgICAgIH1cbiAgICB9KTtcbiAgXG4gIGxldCBjb25maWdJbmRleCA9IGNvbmZpZ0ZpbGVzLmZpbmRJbmRleChjID0+IGMuZW52ICYmIGVudiAmJiBjLmVudi50b0xvd2VyQ2FzZSgpID09PSBlbnYudG9Mb3dlckNhc2UoKSk7XG4gIGlmIChjb25maWdJbmRleCA9PT0gLTEpIHtcbiAgICBjb25maWdJbmRleCA9IGNvbmZpZ0ZpbGVzLmZpbmRJbmRleChjID0+IGMuZW52ID09PSB1bmRlZmluZWQpO1xuICB9XG4gIGlmIChjb25maWdJbmRleCAhPSAtMSkge1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGUgPSBjb25maWdGaWxlc1tjb25maWdJbmRleF07XG4gICAgY29uc3QgdHN4VW5yZWdpc3RlciA9IC9eXFwubT90cyQvLnRlc3QoZXh0bmFtZShjb25maWdGaWxlLm5hbWUpKSA/IHJlZ2lzdGVyKCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KHBhdGhUb0ZpbGVVUkwoam9pbihjb25maWdGaWxlLmRpciwgY29uZmlnRmlsZS5uYW1lKSkudG9TdHJpbmcoKSk7XG4gICAgdHN4VW5yZWdpc3RlciAmJiB0c3hVbnJlZ2lzdGVyKCk7XG4gICAgbGV0IGNvbmZpZzogRXZvc3ludGhBcHBDb25maWcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGNvbmZpZ0ZpbGUuZW52KSB7XG4gICAgICBjb25maWcgPSBhd2FpdCBtb2R1bGUuZGVmYXVsdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcgPSBhd2FpdCBtb2R1bGVbZW52XT8uKCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgaWYgKHByb3BzLnByb2ZpbGUpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEUgPSBwcm9wcy5wcm9maWxlO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChjb25maWcudHlwZSkge1xuICAgICAgICBjYXNlICd3ZWItc3RhdGljLXNlcnZlcmxlc3MnOlxuICAgICAgICAgIGF3YWl0IHJ1bldlYlN0YXRpY1NlcnZlcmxlc3NBcHAoY21kLCBjb25maWcgYXMgV2ViU3RhdGljU2VydmVybGVzc0FwcENvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2V2b3N5bnRoIGNvbmZpZyBub3QgZm91bmQhJyk7XG4gIH1cbn0iXX0=
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZvc3ludGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2V2b3N5bnRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV2QyxPQUFPLEVBQUUseUJBQXlCLEVBQWdDLE1BQU0sNEJBQTRCLENBQUM7QUFtQnJHLE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUFDLEdBQWUsRUFBRSxHQUFXLEVBQUUsS0FBb0I7SUFDL0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFcEUsTUFBTSxXQUFXLEdBQUcsS0FBSztTQUN0QixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNqQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sdUNBQXVDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUMsQ0FBQztTQUNELEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ2QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNELE9BQU87WUFDTCxJ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QU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRkaXIgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGpvaW4sIGV4dG5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAndHN4L2VzbS9hcGknO1xuaW1wb3J0IHR5cGUgeyBFdm9zeW50aFRhZ0tleSB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IHJ1bldlYlN0YXRpY1NlcnZlcmxlc3NBcHAsIFdlYlN0YXRpY1NlcnZlcmxlc3NBcHBDb25maWcgfSBmcm9tICcuL3dlYi1zdGF0aWMtc2VydmVybGVzcy5qcyc7XG5cbmV4cG9ydCB7IFdlYlN0YXRpY1NlcnZlcmxlc3NBcHBDb25maWcgfTtcblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnRUeXBlID0gJ2RldicgfCAndGVzdCcgfCAnc3RhZ2UnIHwgJ3VhdCcgfCAncHJlcHJvZCcgIHwgJ3Byb2QnIHwgKHN0cmluZyAmIHt9KTtcbmV4cG9ydCB0eXBlIENka0NvbW1hbmQgPSAnZGVwbG95JyB8ICdkZXN0cm95JyB8ICdkaWZmJyB8ICdkcmlmdCcgfCAncm9sbGJhY2snIHwgJ3N5bnRoJzsgLy8gJ2Jvb3RzdHJhcCcgfCBcbmV4cG9ydCB0eXBlIEV2b3N5bnRoQXBwVHlwZSA9ICdzdHI4ci1jbG0nIHwgJ3dlYi1zdGF0aWMtc2VydmVybGVzcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZvc3ludGhBcHBDb25maWcge1xuICB0eXBlOiBFdm9zeW50aEFwcFR5cGU7XG4gIGVudlR5cGU/OiBFbnZpcm9ubWVudFR5cGU7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVnaW9uOiAndXMtZWFzdC0xJyB8ICd1cy1lYXN0LTInIHwgJ3VzLXdlc3QtMScgfCAndXMtd2VzdC0yJyB8IChzdHJpbmcgJiB7fSk7XG4gIHRhZ3M/OiBSZWNvcmQ8RXZvc3ludGhUYWdLZXksIHN0cmluZz4sXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZvc3ludGhQcm9wcyB7XG4gIHByb2ZpbGU/OiBzdHJpbmc7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXZvc3ludGgoY21kOiBDZGtDb21tYW5kLCBlbnY6IHN0cmluZywgcHJvcHM6IEV2b3N5bnRoUHJvcHMpIHtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKHByb2Nlc3MuY3dkKCksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICBjb25zdCBjb25maWdGaWxlcyA9IGZpbGVzXG4gICAgLmZpbHRlcigoZGlyZW50KSA9PiB7XG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpKSB7XG4gICAgICAgIHJldHVybiAvXlxcLmV2b3N5bnRoKC4qPylcXC4oPzpqc3xtanN8dHN8bXRzKSQvaS50ZXN0KGRpcmVudC5uYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5tYXAoKGRpcmVudCkgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSBkaXJlbnQubmFtZS5zcGxpdCgnLicpLmZpbHRlcihwID0+IHAgIT09ICcnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGRpcmVudC5uYW1lLFxuICAgICAgICBlbnY6IHBhcnRzLmxlbmd0aCA+IDIgPyBwYXJ0c1sxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZGlyOiBkaXJlbnQucGFyZW50UGF0aFxuICAgICAgfVxuICAgIH0pO1xuICBcbiAgbGV0IGNvbmZpZ0luZGV4ID0gY29uZmlnRmlsZXMuZmluZEluZGV4KGMgPT4gYy5lbnYgJiYgZW52ICYmIGMuZW52LnRvTG93ZXJDYXNlKCkgPT09IGVudi50b0xvd2VyQ2FzZSgpKTtcbiAgaWYgKGNvbmZpZ0luZGV4ID09PSAtMSkge1xuICAgIGNvbmZpZ0luZGV4ID0gY29uZmlnRmlsZXMuZmluZEluZGV4KGMgPT4gYy5lbnYgPT09IHVuZGVmaW5lZCk7XG4gIH1cbiAgaWYgKGNvbmZpZ0luZGV4ICE9IC0xKSB7XG4gICAgY29uc3QgY29uZmlnRmlsZSA9IGNvbmZpZ0ZpbGVzW2NvbmZpZ0luZGV4XTtcbiAgICBjb25zdCB0c3hVbnJlZ2lzdGVyID0gL15cXC5tP3RzJC8udGVzdChleHRuYW1lKGNvbmZpZ0ZpbGUubmFtZSkpID8gcmVnaXN0ZXIoKSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgbW9kdWxlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIG1vZHVsZSA9IGF3YWl0IGltcG9ydChwYXRoVG9GaWxlVVJMKGpvaW4oY29uZmlnRmlsZS5kaXIsIGNvbmZpZ0ZpbGUubmFtZSkpLnRvU3RyaW5nKCkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvYWQgY29uZmlnIFwiJHtjb25maWdGaWxlLm5hbWV9XCI6YCwgKGVyciBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRzeFVucmVnaXN0ZXI/LigpO1xuICAgIH1cbiAgICBsZXQgY29uZmlnOiBFdm9zeW50aEFwcENvbmZpZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoY29uZmlnRmlsZS5lbnYpIHtcbiAgICAgIGNvbmZpZyA9IGF3YWl0IG1vZHVsZS5kZWZhdWx0Py4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnID0gYXdhaXQgbW9kdWxlW2Vudi50b0xvd2VyQ2FzZSgpXT8uKCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgaWYgKHByb3BzLnByb2ZpbGUpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEUgPSBwcm9wcy5wcm9maWxlO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChjb25maWcudHlwZSkge1xuICAgICAgICBjYXNlICd3ZWItc3RhdGljLXNlcnZlcmxlc3MnOlxuICAgICAgICAgIGF3YWl0IHJ1bldlYlN0YXRpY1NlcnZlcmxlc3NBcHAoY21kLCBjb25maWcgYXMgV2ViU3RhdGljU2VydmVybGVzc0FwcENvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgVW5zdXBwb3J0ZWQgZXZvc3ludGggYXBwIHR5cGU6IFwiJHtjb25maWcudHlwZX1cImApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgQ29uZmlnIGVudmlyb25tZW50IFwiJHtlbnZ9XCIgbm90IGZvdW5kYCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIFxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2V2b3N5bnRoIGNvbmZpZyBub3QgZm91bmQhJyk7XG4gIH1cbn0iXX0=
@@ -4,50 +4,58 @@ import { CloudFrontErrorResponse, CloudFrontFunctionRedirects } from '../constru
4
4
  import { CodeBuildImageId, EcrBuildImage, CodeBuildSsmParameter, CodeBuildComputeType, CodeBuildNodeJs, EnvironmentVariables } from '../constructs/codebuild.ts';
5
5
  import type { EvosynthAppConfig, CdkCommand, EvosynthAppType } from './evosynth.ts';
6
6
  import type { CloudFrontFunctionEventType, CspHeaders, UUID, AWSManagedResponseHeadersPolicy } from '../types.d.ts';
7
- export interface WebStaticServerlessAppConfig extends EvosynthAppConfig {
8
- type: Extract<EvosynthAppType, 'web-static-serverless'>;
9
- description?: string;
10
- dns: {
11
- record: string;
12
- zone: string;
13
- };
14
- security?: {
15
- basicAuth?: string;
16
- basicAuthParam?: string;
17
- webAcl?: string | false;
18
- webAclParam?: string;
7
+ export interface AppConfigDnsProps {
8
+ record: string;
9
+ zone: string;
10
+ }
11
+ export interface AppConfigSecurityProps {
12
+ basicAuth?: string;
13
+ basicAuthParam?: string;
14
+ webAcl?: string | boolean;
15
+ webAclParam?: string | {
16
+ path: string;
17
+ version?: number;
19
18
  };
20
- cloudfront?: {
21
- responseHeaders?: AWSManagedResponseHeadersPolicy | UUID | false;
22
- responseHeadersParam?: string;
23
- responseHeadersPolicy?: ResponseHeadersPolicyProps;
24
- cspHeaders?: CspHeaders;
25
- redirects?: CloudFrontFunctionRedirects;
26
- function?: string | {
27
- code: string;
28
- eventType: CloudFrontFunctionEventType[];
29
- };
30
- errors?: CloudFrontErrorResponse[];
19
+ }
20
+ export interface AppConfigCloudFrontProps {
21
+ responseHeaders?: AWSManagedResponseHeadersPolicy | UUID | false;
22
+ responseHeadersParam?: string;
23
+ responseHeadersPolicy?: ResponseHeadersPolicyProps;
24
+ cspHeaders?: CspHeaders;
25
+ redirects?: CloudFrontFunctionRedirects;
26
+ function?: string | {
27
+ code: string;
28
+ eventType: CloudFrontFunctionEventType[];
31
29
  };
30
+ errorResponses?: CloudFrontErrorResponse[];
31
+ }
32
+ export interface AppConfigPipelineSourceProps {
33
+ codestarConnection?: string;
34
+ codestarConnectionParam?: string;
35
+ owner: 'evokegroup' | 'meltmedia' | (string & {});
36
+ repo: string;
37
+ branch: string;
38
+ fullClone?: boolean;
39
+ }
40
+ export interface AppConfigPipelineBuildProps {
41
+ buildSpec?: string | object;
42
+ buildImage?: IBuildImage;
43
+ buildImageEcr?: EcrBuildImage;
44
+ buildImageNodeJS?: CodeBuildNodeJs;
45
+ buildImageId?: CodeBuildImageId;
46
+ computeType?: CodeBuildComputeType;
47
+ environmentVariables?: EnvironmentVariables;
48
+ ssmParameters?: CodeBuildSsmParameter[];
49
+ }
50
+ export interface WebStaticServerlessAppConfig extends EvosynthAppConfig {
51
+ type: Extract<EvosynthAppType, 'web-static-serverless'>;
52
+ description: string;
53
+ dns: AppConfigDnsProps;
54
+ security?: AppConfigSecurityProps;
55
+ cloudfront?: AppConfigCloudFrontProps;
32
56
  pipeline?: {
33
- source: {
34
- codestarConnection?: string;
35
- codestarConnectionParam?: string;
36
- owner: 'evokegroup' | 'meltmedia' | (string & {});
37
- repo: string;
38
- branch: string;
39
- fullClone?: boolean;
40
- };
41
- build?: {
42
- buildSpec?: string | object;
43
- buildImage?: IBuildImage;
44
- buildImageEcr?: EcrBuildImage;
45
- buildImageNodeJS?: CodeBuildNodeJs;
46
- buildImageId?: CodeBuildImageId;
47
- computeType?: CodeBuildComputeType;
48
- environmentVariables?: EnvironmentVariables;
49
- ssmParameters?: CodeBuildSsmParameter[];
50
- };
57
+ source: AppConfigPipelineSourceProps;
58
+ build?: AppConfigPipelineBuildProps;
51
59
  };
52
60
  }
53
61
  export declare function runWebStaticServerlessApp(cmd: CdkCommand, config: WebStaticServerlessAppConfig): Promise<void>;
@@ -3,8 +3,8 @@ import * as core from 'aws-cdk-lib/core';
3
3
  import { Toolkit } from '@aws-cdk/toolkit-lib';
4
4
  import { getEnv } from '../index.js';
5
5
  import { WebStaticServerlessStage } from '../stages/web-static-serverless-stage.js';
6
- const cdk = new Toolkit();
7
6
  export async function runWebStaticServerlessApp(cmd, config) {
7
+ const cdk = new Toolkit();
8
8
  const cx = await cdk.fromAssemblyBuilder(async (props) => {
9
9
  const app = new core.App({
10
10
  outdir: join(process.cwd(), '.evosynth'),
@@ -18,7 +18,7 @@ export async function runWebStaticServerlessApp(cmd, config) {
18
18
  hostedZone: config.dns.zone,
19
19
  domainName: `${config.dns.record}.${config.dns.zone}`,
20
20
  basicAuth: config.security?.basicAuthParam ? { path: config.security?.basicAuthParam } : config.security?.basicAuth,
21
- webAcl: config.security?.webAclParam ? { path: config.security.webAclParam } : config.security?.webAcl,
21
+ webAcl: config.security?.webAclParam ? config.security.webAclParam.path ? config.security.webAclParam : { path: config.security.webAclParam } : config.security?.webAcl,
22
22
  redirects: config.cloudfront?.redirects,
23
23
  responseCspHeaders: config.cloudfront?.cspHeaders,
24
24
  responseHeadersPolicy: config.cloudfront?.responseHeadersParam ? { path: config.cloudfront.responseHeadersParam } : config.cloudfront?.responseHeaders,
@@ -26,7 +26,8 @@ export async function runWebStaticServerlessApp(cmd, config) {
26
26
  cloudfrontFunction: config.cloudfront?.function && typeof config.cloudfront.function == 'string' ? {
27
27
  code: config.cloudfront.function,
28
28
  eventType: ['VIEWER_REQUEST', 'VIEWER_RESPONSE'],
29
- } : config.cloudfront?.function
29
+ } : config.cloudfront?.function,
30
+ errorResponses: config.cloudfront?.errorResponses
30
31
  };
31
32
  if (config.pipeline) {
32
33
  stageProps.pipeline = {
@@ -70,4 +71,4 @@ export async function runWebStaticServerlessApp(cmd, config) {
70
71
  break;
71
72
  }
72
73
  }
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLXN0YXRpYy1zZXJ2ZXJsZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS93ZWItc3RhdGljLXNlcnZlcmxlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEtBQUssSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQU8vQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSx3QkFBd0IsRUFBaUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUVuSCxNQUFNLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBaUQxQixNQUFNLENBQUMsS0FBSyxVQUFVLHlCQUF5QixDQUFDLEdBQWUsRUFBRSxNQUFvQztJQUNuRyxNQUFNLEVBQUUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDdkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFdBQVcsQ0FBQztTQUN6QyxDQUFDLENBQUM7UUFFSCxNQUFNLFVBQVUsR0FBb0Q7WUFDbEUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzFCLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN4RSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEtBQUssTUFBTSxD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UUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVO29CQUM1QyxZQUFZLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsWUFBWTtvQkFDaEQsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO29CQUN4RCxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUztvQkFDMUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVc7b0JBQzlDLGFBQWEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhO29CQUNsRCxhQUFhLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYTtpQkFDbkQsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUUzRCxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDWixvQkFBb0I7UUFDcEIsd0hBQXdIO1FBQ3hILFdBQVc7UUFDWCxLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssU0FBUyxDQUFDO1FBQ2YsS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssVUFBVSxDQUFDO1FBQ2hCLEtBQUssT0FBTztZQUNWLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25CLE1BQU07SUFDVixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgY29yZSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IFRvb2xraXQgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgeyBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250JztcbmltcG9ydCB7IElCdWlsZEltYWdlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgeyBDbG91ZEZyb250RXJyb3JSZXNwb25zZSwgQ2xvdWRGcm9udEZ1bmN0aW9uUmVkaXJlY3RzIH0gZnJvbSAnLi4vY29uc3RydWN0cy9jbG91ZGZyb250LmpzJztcbmltcG9ydCB7IENvZGVCdWlsZEltYWdlSWQsIEVjckJ1aWxkSW1hZ2UsIENvZGVCdWlsZFNzbVBhcmFtZXRlciwgQ29kZUJ1aWxkQ29tcHV0ZVR5cGUsIENvZGVCdWlsZE5vZGVKcywgRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICcuLi9jb25zdHJ1Y3RzL2NvZGVidWlsZC50cyc7XG5pbXBvcnQgdHlwZSB7IEV2b3N5bnRoQXBwQ29uZmlnLCBDZGtDb21tYW5kLCBFdm9zeW50aEFwcFR5cGUgfSBmcm9tICcuL2V2b3N5bnRoLnRzJztcbmltcG9ydCB0eXBlIHsgQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlLCBDc3BIZWFkZXJzLCBVVUlELCBBV1NNYW5hZ2VkUmVzcG9uc2VIZWFkZXJzUG9saWN5IH0gZnJvbSAnLi4vdHlwZXMuZC50cyc7XG5pbXBvcnQgeyBnZXRFbnYgfSBmcm9tICcuLi9pbmRleC5qcyc7XG5pbXBvcnQgeyBXZWJTdGF0aWNTZXJ2ZXJsZXNzU3RhZ2UsIFdlYlN0YXRpY1NlcnZlcmxlc3NTdGFnZVByb3BzIH0gZnJvbSAnLi4vc3RhZ2VzL3dlYi1zdGF0aWMtc2VydmVybGVzcy1zdGFnZS5qcyc7XG5cbmNvbnN0IGNkayA9IG5ldyBUb29sa2l0KCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU3RhdGljU2VydmVybGVzc0FwcENvbmZpZyBleHRlbmRzIEV2b3N5bnRoQXBwQ29uZmlnIHtcbiAgdHlwZTogRXh0cmFjdDxFdm9zeW50aEFwcFR5cGUsICd3ZWItc3RhdGljLXNlcnZlcmxlc3MnPixcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGRuczoge1xuICAgIHJlY29yZDogc3RyaW5nO1xuICAgIHpvbmU6IHN0cmluZztcbiAgfSxcbiAgc2VjdXJpdHk/OiB7XG4gICAgYmFzaWNBdXRoPzogc3RyaW5nO1xuICAgIGJhc2ljQXV0aFBhcmFtPzogc3RyaW5nO1xuICAgIHdlYkFjbD86IHN0cmluZyB8IGZhbHNlO1xuICAgIHdlYkFjbFBhcmFtPzogc3RyaW5nO1xuICB9LFxuICBjbG91ZGZyb250Pzoge1xuICAgIHJlc3BvbnNlSGVhZGVycz86IEFXU01hbmFnZWRSZXNwb25zZUhlYWRlcnNQb2xpY3kgfCBVVUlEIHwgZmFsc2U7XG4gICAgcmVzcG9uc2VIZWFkZXJzUGFyYW0/OiBzdHJpbmc7XG4gICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5PzogUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM7XG4gICAgY3NwSGVhZGVycz86IENzcEhlYWRlcnM7XG4gICAgcmVkaXJlY3RzPzogQ2xvdWRGcm9udEZ1bmN0aW9uUmVkaXJlY3RzO1xuICAgIGZ1bmN0aW9uPzogc3RyaW5nIHwge1xuICAgICAgY29kZTogc3RyaW5nO1xuICAgICAgZXZlbnRUeXBlOiBDbG91ZEZyb250RnVuY3Rpb25FdmVudFR5cGVbXTtcbiAgICB9LFxuICAgIGVycm9ycz86IENsb3VkRnJvbnRFcnJvclJlc3BvbnNlW11cbiAgfSxcbiAgcGlwZWxpbmU/OiB7XG4gICAgc291cmNlOiB7XG4gICAgICBjb2Rlc3RhckNvbm5lY3Rpb24/OiBzdHJpbmc7XG4gICAgICBjb2Rlc3RhckNvbm5lY3Rpb25QYXJhbT86IHN0cmluZztcbiAgICAgIG93bmVyOiAnZXZva2Vncm91cCcgfCAnbWVsdG1lZGlhJyB8IChzdHJpbmcgJiB7fSk7XG4gICAgICByZXBvOiBzdHJpbmc7XG4gICAgICBicmFuY2g6IHN0cmluZztcbiAgICAgIGZ1bGxDbG9uZT86IGJvb2xlYW47XG4gICAgfSxcbiAgICBidWlsZD86IHtcbiAgICAgIGJ1aWxkU3BlYz86IHN0cmluZyB8IG9iamVjdDtcbiAgICAgIGJ1aWxkSW1hZ2U/OiBJQnVpbGRJbWFnZTtcbiAgICAgIGJ1aWxkSW1hZ2VFY3I/OiBFY3JCdWlsZEltYWdlO1xuICAgICAgYnVpbGRJbWFnZU5vZGVKUz86IENvZGVCdWlsZE5vZGVKcztcbiAgICAgIGJ1aWxkSW1hZ2VJZD86IENvZGVCdWlsZEltYWdlSWQ7XG4gICAgICBjb21wdXRlVHlwZT86IENvZGVCdWlsZENvbXB1dGVUeXBlO1xuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM/OiBFbnZpcm9ubWVudFZhcmlhYmxlcztcbiAgICAgIHNzbVBhcmFtZXRlcnM/OiBDb2RlQnVpbGRTc21QYXJhbWV0ZXJbXVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2ViU3RhdGljU2VydmVybGVzc0FwcChjbWQ6IENka0NvbW1hbmQsIGNvbmZpZzogV2ViU3RhdGljU2VydmVybGVzc0FwcENvbmZpZykge1xuICBjb25zdCBjeCA9IGF3YWl0IGNkay5mcm9tQXNzZW1ibHlCdWlsZGVyKGFzeW5jIChwcm9wcykgPT4ge1xuICAgIGNvbnN0IGFwcCA9IG5ldyBjb3JlLkFwcCh7XG4gICAgICBvdXRkaXI6IGpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5ldm9zeW50aCcpLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RhZ2VQcm9wczogV2ViU3RhdGljU2VydmVybGVzc1N0YWdlUHJvcHMgJiBjb3JlLlN0YWdlUHJvcHMgPSB7XG4gICAgICBlbnY6IGdldEVudihjb25maWcucmVnaW9uKSxcbiAgICAgIHN0YWdlTmFtZTogYCR7Y29uZmlnLm5hbWV9JHtjb25maWcuZW52VHlwZSA/IGAtJHtjb25maWcuZW52VHlwZX1gIDogJyd9YCxcbiAgICAgIHRhZ3M6IGNvbmZpZy50YWdzLFxuICAgICAgZW52VHlwZTogY29uZmlnLmVudlR5cGUgPT09ICdwcm9kJyA/ICdQUk9EJyA6ICdOT1RfUFJPRCcsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7Y29uZmlnLmRlc2NyaXB0aW9ufSR7Y29uZmlnLmVudlR5cGUgPyBgICR7Y29uZmlnLmVudlR5cGUudG9VcHBlckNhc2UoKX1gIDogJyd9YCxcbiAgICAgIGhvc3RlZFpvbmU6IGNvbmZpZy5kbnMuem9uZSxcbiAgICAgIGRvbWFpbk5hbWU6IGAke2NvbmZpZy5kbnMucmVjb3JkfS4ke2NvbmZpZy5kbnMuem9uZX1gLFxuICAgICAgYmFzaWNBdXRoOiBjb25maWcuc2VjdXJpdHk/LmJhc2ljQXV0aFBhcmFtID8geyBwYXRoOiBjb25maWcuc2VjdXJpdHk/LmJhc2ljQXV0aFBhcmFtIH0gOiBjb25maWcuc2VjdXJpdHk/LmJhc2ljQXV0aCxcbiAgICAgIHdlYkFjbDogY29uZmlnLnNlY3VyaXR5Py53ZWJBY2xQYXJhbSA/IHsgcGF0aDogY29uZmlnLnNlY3VyaXR5LndlYkFjbFBhcmFtIH0gOiBjb25maWcuc2VjdXJpdHk/LndlYkFjbCxcbiAgICAgIHJlZGlyZWN0czogY29uZmlnLmNsb3VkZnJvbnQ/LnJlZGlyZWN0cyxcbiAgICAgIHJlc3BvbnNlQ3NwSGVhZGVyczogY29uZmlnLmNsb3VkZnJvbnQ/LmNzcEhlYWRlcnMsXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3k6IGNvbmZpZy5jbG91ZGZyb250Py5yZXNwb25zZUhlYWRlcnNQYXJhbSA/IHsgcGF0aDogY29uZmlnLmNsb3VkZnJvbnQucmVzcG9uc2VIZWFkZXJzUGFyYW0gfSA6IGNvbmZpZy5jbG91ZGZyb250Py5yZXNwb25zZUhlYWRlcnMsXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wczogY29uZmlnLmNsb3VkZnJvbnQ/LnJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgICAgIGNsb3VkZnJvbnRGdW5jdGlvbjogY29uZmlnLmNsb3VkZnJvbnQ/LmZ1bmN0aW9uICYmIHR5cGVvZiBjb25maWcuY2xvdWRmcm9udC5mdW5jdGlvbiA9PSAnc3RyaW5nJyA/IHtcbiAgICAgICAgY29kZTogY29uZmlnLmNsb3VkZnJvbnQuZnVuY3Rpb24sXG4gICAgICAgIGV2ZW50VHlwZTogWydWSUVXRVJfUkVRVUVTVCcsJ1ZJRVdFUl9SRVNQT05TRSddLFxuICAgICAgfSA6IGNvbmZpZy5jbG91ZGZyb250Py5mdW5jdGlvbiBhcyBhbnlcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5waXBlbGluZSkge1xuICAgICAgc3RhZ2VQcm9wcy5waXBlbGluZSA9IHtcbiAgICAgICAgc291cmNlU3RhZ2U6IHtcbiAgICAgICAgICBjb2Rlc3RhckNvbm5lY3Rpb246IGNvbmZpZy5waXBlbGluZS5zb3VyY2UuY29kZXN0YXJDb25uZWN0aW9uUGFyYW0gPyB7IHBhdGg6IGNvbmZpZy5waXBlbGluZS5zb3VyY2UuY29kZXN0YXJDb25uZWN0aW9uUGFyYW0gfSA6IGNvbmZpZy5waXBlbGluZS5zb3VyY2UuY29kZXN0YXJDb25uZWN0aW9uIGFzIHN0cmluZyxcbiAgICAgICAgICByZXBvT3duZXI6IGNvbmZpZy5waXBlbGluZS5zb3VyY2Uub3duZXIsXG4gICAgICAgICAgcmVwbzogY29uZmlnLnBpcGVsaW5lLnNvdXJjZS5yZXBvLFxuICAgICAgICAgIGJyYW5jaDogY29uZmlnLnBpcGVsaW5lLnNvdXJjZS5icmFuY2gsXG4gICAgICAgICAgZnVsbENsb25lOiBjb25maWcucGlwZWxpbmUuc291cmNlLmZ1bGxDbG9uZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnBpcGVsaW5lLmJ1aWxkKSB7XG4gICAgICAgIHN0YWdlUHJvcHMucGlwZWxpbmUuYnVpbGRTdGFnZSA9IHtcbiAgICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogY29uZmlnLnBpcGVsaW5lLmJ1aWxkLmVudmlyb25tZW50VmFyaWFibGVzXG4gICAgICAgIH07XG4gICAgICAgIHN0YWdlUHJvcHMucGlwZWxpbmUuY29kZUJ1aWxkUHJvamVjdCA9IHtcbiAgICAgICAgICBidWlsZEltYWdlOiBjb25maWcucGlwZWxpbmUuYnVpbGQuYnVpbGRJbWFnZSxcbiAgICAgICAgICBidWlsZEltYWdlSWQ6IGNvbmZpZy5waXBlbGluZS5idWlsZC5idWlsZEltYWdlSWQsXG4gICAgICAgICAgYnVpbGRJbWFnZU5vZGVKUzogY29uZmlnLnBpcGVsaW5lLmJ1aWxkLmJ1aWxkSW1hZ2VOb2RlSlMsXG4gICAgICAgICAgYnVpbGRTcGVjOiBjb25maWcucGlwZWxpbmUuYnVpbGQuYnVpbGRTcGVjLFxuICAgICAgICAgIGNvbXB1dGVUeXBlOiBjb25maWcucGlwZWxpbmUuYnVpbGQuY29tcHV0ZVR5cGUsXG4gICAgICAgICAgZWNyQnVpbGRJbWFnZTogY29uZmlnLnBpcGVsaW5lLmJ1aWxkLmJ1aWxkSW1hZ2VFY3IsXG4gICAgICAgICAgc3NtUGFyYW1ldGVyczogY29uZmlnLnBpcGVsaW5lLmJ1aWxkLnNzbVBhcmFtZXRlcnNcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZXcgV2ViU3RhdGljU2VydmVybGVzc1N0YWdlKGFwcCwgY29uZmlnLnR5cGUsIHN0YWdlUHJvcHMpO1xuXG4gICAgcmV0dXJuIGFwcC5zeW50aCgpO1xuICB9KTtcblxuICBzd2l0Y2ggKGNtZCkge1xuICAgIC8vIGNhc2UgJ2Jvb3RzdHJhcCc6XG4gICAgLy8gICBhd2FpdCBjZGsuYm9vdHN0cmFwKEJvb3RzdHJhcEVudmlyb25tZW50cy5mcm9tTGlzdChbYGF3czovLyR7cHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfQUNDT1VOVH0vJHtjb25maWcucmVnaW9ufWBdKSk7XG4gICAgLy8gICBicmVhaztcbiAgICBjYXNlICdkZXBsb3knOlxuICAgIGNhc2UgJ2Rlc3Ryb3knOlxuICAgIGNhc2UgJ2RpZmYnOlxuICAgIGNhc2UgJ2RyaWZ0JzpcbiAgICBjYXNlICdyb2xsYmFjayc6XG4gICAgY2FzZSAnc3ludGgnOlxuICAgICAgYXdhaXQgY2RrW2NtZF0oY3gpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cbiJdfQ==
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLXN0YXRpYy1zZXJ2ZXJsZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS93ZWItc3RhdGljLXNlcnZlcmxlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEtBQUssSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQU8vQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSx3QkFBd0IsRUFBaUMsTUFBTSwwQ0FBMEMsQ0FBQztBQTJEbkgsTUFBTSxDQUFDLEtBQUssVUFBVSx5QkFBeUIsQ0FBQyxHQUFlLEVBQUUsTUFBb0M7SUFDbkcsTUFBTSxHQUFHLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUMxQixNQUFNLEVBQUUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDdkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFdBQVcsQ0FBQztTQUN6QyxDQUFDLENBQUM7UUFFSCxNQUFNLFVBQVUsR0FBb0Q7WUFDbEUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzFCLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN4RSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEtBQUssTUFBTSxD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dGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCAqIGFzIGNvcmUgZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBUb29sa2l0IH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IHsgUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgeyBJQnVpbGRJbWFnZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0IHsgQ2xvdWRGcm9udEVycm9yUmVzcG9uc2UsIENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cyB9IGZyb20gJy4uL2NvbnN0cnVjdHMvY2xvdWRmcm9udC5qcyc7XG5pbXBvcnQgeyBDb2RlQnVpbGRJbWFnZUlkLCBFY3JCdWlsZEltYWdlLCBDb2RlQnVpbGRTc21QYXJhbWV0ZXIsIENvZGVCdWlsZENvbXB1dGVUeXBlLCBDb2RlQnVpbGROb2RlSnMsIEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnLi4vY29uc3RydWN0cy9jb2RlYnVpbGQudHMnO1xuaW1wb3J0IHR5cGUgeyBFdm9zeW50aEFwcENvbmZpZywgQ2RrQ29tbWFuZCwgRXZvc3ludGhBcHBUeXBlIH0gZnJvbSAnLi9ldm9zeW50aC50cyc7XG5pbXBvcnQgdHlwZSB7IENsb3VkRnJvbnRGdW5jdGlvbkV2ZW50VHlwZSwgQ3NwSGVhZGVycywgVVVJRCwgQVdTTWFuYWdlZFJlc3BvbnNlSGVhZGVyc1BvbGljeSB9IGZyb20gJy4uL3R5cGVzLmQudHMnO1xuaW1wb3J0IHsgZ2V0RW52IH0gZnJvbSAnLi4vaW5kZXguanMnO1xuaW1wb3J0IHsgV2ViU3RhdGljU2VydmVybGVzc1N0YWdlLCBXZWJTdGF0aWNTZXJ2ZXJsZXNzU3RhZ2VQcm9wcyB9IGZyb20gJy4uL3N0YWdlcy93ZWItc3RhdGljLXNlcnZlcmxlc3Mtc3RhZ2UuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcENvbmZpZ0Ruc1Byb3BzIHtcbiAgcmVjb3JkOiBzdHJpbmc7XG4gIHpvbmU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBDb25maWdTZWN1cml0eVByb3BzIHtcbiAgYmFzaWNBdXRoPzogc3RyaW5nO1xuICBiYXNpY0F1dGhQYXJhbT86IHN0cmluZztcbiAgd2ViQWNsPzogc3RyaW5nIHwgYm9vbGVhbjtcbiAgd2ViQWNsUGFyYW0/OiBzdHJpbmcgfCB7IHBhdGg6IHN0cmluZywgdmVyc2lvbj86IG51bWJlciB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcENvbmZpZ0Nsb3VkRnJvbnRQcm9wcyB7XG4gIHJlc3BvbnNlSGVhZGVycz86IEFXU01hbmFnZWRSZXNwb25zZUhlYWRlcnNQb2xpY3kgfCBVVUlEIHwgZmFsc2U7XG4gIHJlc3BvbnNlSGVhZGVyc1BhcmFtPzogc3RyaW5nO1xuICByZXNwb25zZUhlYWRlcnNQb2xpY3k/OiBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcztcbiAgY3NwSGVhZGVycz86IENzcEhlYWRlcnM7XG4gIHJlZGlyZWN0cz86IENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cztcbiAgZnVuY3Rpb24/OiBzdHJpbmcgfCB7XG4gICAgY29kZTogc3RyaW5nO1xuICAgIGV2ZW50VHlwZTogQ2xvdWRGcm9udEZ1bmN0aW9uRXZlbnRUeXBlW107XG4gIH0sXG4gIGVycm9yUmVzcG9uc2VzPzogQ2xvdWRGcm9udEVycm9yUmVzcG9uc2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcENvbmZpZ1BpcGVsaW5lU291cmNlUHJvcHMge1xuICBjb2Rlc3RhckNvbm5lY3Rpb24/OiBzdHJpbmc7XG4gIGNvZGVzdGFyQ29ubmVjdGlvblBhcmFtPzogc3RyaW5nO1xuICBvd25lcjogJ2V2b2tlZ3JvdXAnIHwgJ21lbHRtZWRpYScgfCAoc3RyaW5nICYge30pO1xuICByZXBvOiBzdHJpbmc7XG4gIGJyYW5jaDogc3RyaW5nO1xuICBmdWxsQ2xvbmU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcENvbmZpZ1BpcGVsaW5lQnVpbGRQcm9wcyB7XG4gIGJ1aWxkU3BlYz86IHN0cmluZyB8IG9iamVjdDtcbiAgYnVpbGRJbWFnZT86IElCdWlsZEltYWdlO1xuICBidWlsZEltYWdlRWNyPzogRWNyQnVpbGRJbWFnZTtcbiAgYnVpbGRJbWFnZU5vZGVKUz86IENvZGVCdWlsZE5vZGVKcztcbiAgYnVpbGRJbWFnZUlkPzogQ29kZUJ1aWxkSW1hZ2VJZDtcbiAgY29tcHV0ZVR5cGU/OiBDb2RlQnVpbGRDb21wdXRlVHlwZTtcbiAgZW52aXJvbm1lbnRWYXJpYWJsZXM/OiBFbnZpcm9ubWVudFZhcmlhYmxlcztcbiAgc3NtUGFyYW1ldGVycz86IENvZGVCdWlsZFNzbVBhcmFtZXRlcltdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU3RhdGljU2VydmVybGVzc0FwcENvbmZpZyBleHRlbmRzIEV2b3N5bnRoQXBwQ29uZmlnIHtcbiAgdHlwZTogRXh0cmFjdDxFdm9zeW50aEFwcFR5cGUsICd3ZWItc3RhdGljLXNlcnZlcmxlc3MnPixcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgZG5zOiBBcHBDb25maWdEbnNQcm9wcyxcbiAgc2VjdXJpdHk/OiBBcHBDb25maWdTZWN1cml0eVByb3BzLFxuICBjbG91ZGZyb250PzogQXBwQ29uZmlnQ2xvdWRGcm9udFByb3BzLFxuICBwaXBlbGluZT86IHtcbiAgICBzb3VyY2U6IEFwcENvbmZpZ1BpcGVsaW5lU291cmNlUHJvcHMsXG4gICAgYnVpbGQ/OiBBcHBDb25maWdQaXBlbGluZUJ1aWxkUHJvcHNcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2ViU3RhdGljU2VydmVybGVzc0FwcChjbWQ6IENka0NvbW1hbmQsIGNvbmZpZzogV2ViU3RhdGljU2VydmVybGVzc0FwcENvbmZpZykge1xuICBjb25zdCBjZGsgPSBuZXcgVG9vbGtpdCgpO1xuICBjb25zdCBjeCA9IGF3YWl0IGNkay5mcm9tQXNzZW1ibHlCdWlsZGVyKGFzeW5jIChwcm9wcykgPT4ge1xuICAgIGNvbnN0IGFwcCA9IG5ldyBjb3JlLkFwcCh7XG4gICAgICBvdXRkaXI6IGpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5ldm9zeW50aCcpLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RhZ2VQcm9wczogV2ViU3RhdGljU2VydmVybGVzc1N0YWdlUHJvcHMgJiBjb3JlLlN0YWdlUHJvcHMgPSB7XG4gICAgICBlbnY6IGdldEVudihjb25maWcucmVnaW9uKSxcbiAgICAgIHN0YWdlTmFtZTogYCR7Y29uZmlnLm5hbWV9JHtjb25maWcuZW52VHlwZSA/IGAtJHtjb25maWcuZW52VHlwZX1gIDogJyd9YCxcbiAgICAgIHRhZ3M6IGNvbmZpZy50YWdzLFxuICAgICAgZW52VHlwZTogY29uZmlnLmVudlR5cGUgPT09ICdwcm9kJyA/ICdQUk9EJyA6ICdOT1RfUFJPRCcsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7Y29uZmlnLmRlc2NyaXB0aW9ufSR7Y29uZmlnLmVudlR5cGUgPyBgICR7Y29uZmlnLmVudlR5cGUudG9VcHBlckNhc2UoKX1gIDogJyd9YCxcbiAgICAgIGhvc3RlZFpvbmU6IGNvbmZpZy5kbnMuem9uZSxcbiAgICAgIGRvbWFpbk5hbWU6IGAke2NvbmZpZy5kbnMucmVjb3JkfS4ke2NvbmZpZy5kbnMuem9uZX1gLFxuICAgICAgYmFzaWNBdXRoOiBjb25maWcuc2VjdXJpdHk/LmJhc2ljQXV0aFBhcmFtID8geyBwYXRoOiBjb25maWcuc2VjdXJpdHk/LmJhc2ljQXV0aFBhcmFtIH0gOiBjb25maWcuc2VjdXJpdHk/LmJhc2ljQXV0aCxcbiAgICAgIHdlYkFjbDogY29uZmlnLnNlY3VyaXR5Py53ZWJBY2xQYXJhbSA/IChjb25maWcuc2VjdXJpdHkud2ViQWNsUGFyYW0gYXMgYW55KS5wYXRoID8gY29uZmlnLnNlY3VyaXR5LndlYkFjbFBhcmFtIDogeyBwYXRoOiBjb25maWcuc2VjdXJpdHkud2ViQWNsUGFyYW0gYXMgc3RyaW5nIH0gOiBjb25maWcuc2VjdXJpdHk/LndlYkFjbCxcbiAgICAgIHJlZGlyZWN0czogY29uZmlnLmNsb3VkZnJvbnQ/LnJlZGlyZWN0cyxcbiAgICAgIHJlc3BvbnNlQ3NwSGVhZGVyczogY29uZmlnLmNsb3VkZnJvbnQ/LmNzcEhlYWRlcnMsXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3k6IGNvbmZpZy5jbG91ZGZyb250Py5yZXNwb25zZUhlYWRlcnNQYXJhbSA/IHsgcGF0aDogY29uZmlnLmNsb3VkZnJvbnQucmVzcG9uc2VIZWFkZXJzUGFyYW0gfSA6IGNvbmZpZy5jbG91ZGZyb250Py5yZXNwb25zZUhlYWRlcnMsXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wczogY29uZmlnLmNsb3VkZnJvbnQ/LnJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgICAgIGNsb3VkZnJvbnRGdW5jdGlvbjogY29uZmlnLmNsb3VkZnJvbnQ/LmZ1bmN0aW9uICYmIHR5cGVvZiBjb25maWcuY2xvdWRmcm9udC5mdW5jdGlvbiA9PSAnc3RyaW5nJyA/IHtcbiAgICAgICAgY29kZTogY29uZmlnLmNsb3VkZnJvbnQuZnVuY3Rpb24sXG4gICAgICAgIGV2ZW50VHlwZTogWydWSUVXRVJfUkVRVUVTVCcsJ1ZJRVdFUl9SRVNQT05TRSddLFxuICAgICAgfSA6IGNvbmZpZy5jbG91ZGZyb250Py5mdW5jdGlvbiBhcyBhbnksXG4gICAgICBlcnJvclJlc3BvbnNlczogY29uZmlnLmNsb3VkZnJvbnQ/LmVycm9yUmVzcG9uc2VzXG4gICAgfVxuICAgIGlmIChjb25maWcucGlwZWxpbmUpIHtcbiAgICAgIHN0YWdlUHJvcHMucGlwZWxpbmUgPSB7XG4gICAgICAgIHNvdXJjZVN0YWdlOiB7XG4gICAgICAgICAgY29kZXN0YXJDb25uZWN0aW9uOiBjb25maWcucGlwZWxpbmUuc291cmNlLmNvZGVzdGFyQ29ubmVjdGlvblBhcmFtID8geyBwYXRoOiBjb25maWcucGlwZWxpbmUuc291cmNlLmNvZGVzdGFyQ29ubmVjdGlvblBhcmFtIH0gOiBjb25maWcucGlwZWxpbmUuc291cmNlLmNvZGVzdGFyQ29ubmVjdGlvbiBhcyBzdHJpbmcsXG4gICAgICAgICAgcmVwb093bmVyOiBjb25maWcucGlwZWxpbmUuc291cmNlLm93bmVyLFxuICAgICAgICAgIHJlcG86IGNvbmZpZy5waXBlbGluZS5zb3VyY2UucmVwbyxcbiAgICAgICAgICBicmFuY2g6IGNvbmZpZy5waXBlbGluZS5zb3VyY2UuYnJhbmNoLFxuICAgICAgICAgIGZ1bGxDbG9uZTogY29uZmlnLnBpcGVsaW5lLnNvdXJjZS5mdWxsQ2xvbmVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5waXBlbGluZS5idWlsZCkge1xuICAgICAgICBzdGFnZVByb3BzLnBpcGVsaW5lLmJ1aWxkU3RhZ2UgPSB7XG4gICAgICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IGNvbmZpZy5waXBlbGluZS5idWlsZC5lbnZpcm9ubWVudFZhcmlhYmxlc1xuICAgICAgICB9O1xuICAgICAgICBzdGFnZVByb3BzLnBpcGVsaW5lLmNvZGVCdWlsZFByb2plY3QgPSB7XG4gICAgICAgICAgYnVpbGRJbWFnZTogY29uZmlnLnBpcGVsaW5lLmJ1aWxkLmJ1aWxkSW1hZ2UsXG4gICAgICAgICAgYnVpbGRJbWFnZUlkOiBjb25maWcucGlwZWxpbmUuYnVpbGQuYnVpbGRJbWFnZUlkLFxuICAgICAgICAgIGJ1aWxkSW1hZ2VOb2RlSlM6IGNvbmZpZy5waXBlbGluZS5idWlsZC5idWlsZEltYWdlTm9kZUpTLFxuICAgICAgICAgIGJ1aWxkU3BlYzogY29uZmlnLnBpcGVsaW5lLmJ1aWxkLmJ1aWxkU3BlYyxcbiAgICAgICAgICBjb21wdXRlVHlwZTogY29uZmlnLnBpcGVsaW5lLmJ1aWxkLmNvbXB1dGVUeXBlLFxuICAgICAgICAgIGVjckJ1aWxkSW1hZ2U6IGNvbmZpZy5waXBlbGluZS5idWlsZC5idWlsZEltYWdlRWNyLFxuICAgICAgICAgIHNzbVBhcmFtZXRlcnM6IGNvbmZpZy5waXBlbGluZS5idWlsZC5zc21QYXJhbWV0ZXJzXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3IFdlYlN0YXRpY1NlcnZlcmxlc3NTdGFnZShhcHAsIGNvbmZpZy50eXBlLCBzdGFnZVByb3BzKTtcblxuICAgIHJldHVybiBhcHAuc3ludGgoKTtcbiAgfSk7XG5cbiAgc3dpdGNoIChjbWQpIHtcbiAgICAvLyBjYXNlICdib290c3RyYXAnOlxuICAgIC8vICAgYXdhaXQgY2RrLmJvb3RzdHJhcChCb290c3RyYXBFbnZpcm9ubWVudHMuZnJvbUxpc3QoW2Bhd3M6Ly8ke3Byb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlR9LyR7Y29uZmlnLnJlZ2lvbn1gXSkpO1xuICAgIC8vICAgYnJlYWs7XG4gICAgY2FzZSAnZGVwbG95JzpcbiAgICBjYXNlICdkZXN0cm95JzpcbiAgICBjYXNlICdkaWZmJzpcbiAgICBjYXNlICdkcmlmdCc6XG4gICAgY2FzZSAncm9sbGJhY2snOlxuICAgIGNhc2UgJ3N5bnRoJzpcbiAgICAgIGF3YWl0IGNka1tjbWRdKGN4KTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG4iXX0=
@@ -2,7 +2,7 @@ import { Construct } from 'constructs';
2
2
  import { ICertificate } from 'aws-cdk-lib/aws-certificatemanager';
3
3
  import { BehaviorOptions, Distribution, ErrorResponse, Function } from 'aws-cdk-lib/aws-cloudfront';
4
4
  import type { ResourceProps } from '../types.d.ts';
5
- export interface CloudFrontErrorResponse extends ErrorResponse {
5
+ export interface CloudFrontErrorResponse {
6
6
  httpStatus: 400 | 403 | 404 | 405 | 414 | 416 | 500 | 501 | 502 | 503 | 504;
7
7
  ttlSeconds?: number;
8
8
  responseStatus?: number;
@@ -75,11 +75,22 @@ export class CloudFrontFunction extends Construct {
75
75
  static createFunction(scope, id, props) {
76
76
  const csvPath = props.redirects?.pathsCsvFile ?? props.redirectsCsvPath;
77
77
  const redirectPaths = csvPath ? parseCsvRedirects(csvPath) : (props.redirects?.paths ?? {});
78
- const hasRedirects = Object.keys(redirectPaths).length > 0;
78
+ const redirects = {};
79
+ const redirectsStartsWith = {};
80
+ const redirectKeys = Object.keys(redirectPaths);
81
+ for (const key of redirectKeys) {
82
+ if (key.endsWith('*')) {
83
+ redirectsStartsWith[key.substring(0, key.length - 1)] = redirectPaths[key];
84
+ }
85
+ else {
86
+ redirects[key] = redirectPaths[key];
87
+ }
88
+ }
79
89
  props.code = props.code
80
90
  .replace('__DEFAULT_DOCUMENT__', props.defaultDocument ?? 'index.html')
81
91
  .replace('__CREDENTIALS__', props.credentials ?? 'Og==')
82
- .replace('__REDIRECTS__', hasRedirects ? JSON.stringify(redirectPaths) : 'null')
92
+ .replace('__REDIRECTS__', Object.keys(redirects).length > 0 ? JSON.stringify(redirects) : 'null')
93
+ .replace('__REDIRECTS_START_WITH__', Object.keys(redirectsStartsWith).length > 0 ? JSON.stringify(redirectsStartsWith) : 'null')
83
94
  .replace('__TRAILING_SLASH__', props.redirects?.trailingSlash?.toString() ?? 'null')
84
95
  .replace('__REDIR_DEF_DOC__', props.redirects?.redirectDefaultDocument?.toString() ?? 'false');
85
96
  return new CloudFrontFunction(scope, id || 'ViewerRequestResponseFunction', {
@@ -89,4 +100,4 @@ export class CloudFrontFunction extends Construct {
89
100
  });
90
101
  }
91
102
  }
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmcm9udC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzL2Nsb3VkZnJvbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdkMsT0FBTyxFQUFtQixZQUFZLEVBQWlCLFFBQVEsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9JLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUc1RCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQWtCdEMsTUFBTSxPQUFPLHNCQUF1QixTQUFRLFNBQVM7SUFDbkMsWUFBWSxDQUFlO0lBRTNDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0M7UUFDMUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDO1FBQzVDLFFBQVEsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pCLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssaUJBQWlCO2dCQUNwQixVQUFVLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztnQkFDeEMsTUFBTTtZQUNSLEtBQUssaUJBQWlCO2dCQUNwQixVQUFVLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztnQkFDeEMsTUFBTTtRQUNWLENBQUM7UUFFRCxJQUFJ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QUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxFQUFFLElBQUksT0FBTyxDQUFDLENBQUM7UUFFakcsT0FBTyxJQUFJLGtCQUFrQixDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksK0JBQStCLEVBQUU7WUFDMUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgRHVyYXRpb24sIFJlbW92YWxQb2xpY3kgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSUNlcnRpZmljYXRlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlcic7XG5pbXBvcnQgeyBCZWhhdmlvck9wdGlvbnMsIERpc3RyaWJ1dGlvbiwgRXJyb3JSZXNwb25zZSwgRnVuY3Rpb24sIEZ1bmN0aW9uQ29kZSwgRnVuY3Rpb25SdW50aW1lLCBQcmljZUNsYXNzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0IHsgdGFnUmVzb3VyY2UgfSBmcm9tICcuLi9saWIvdGFncy5qcyc7XG5pbXBvcnQgeyBwYXJzZUNzdlJlZGlyZWN0cyB9IGZyb20gJy4uL2xpYi9jc3YtcmVkaXJlY3RzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VQcm9wcyB9IGZyb20gJy4uL3R5cGVzLmQudHMnO1xuXG5jb25zdCBfX2Rpcm5hbWUgPSBpbXBvcnQubWV0YS5kaXJuYW1lO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRnJvbnRFcnJvclJlc3BvbnNlIGV4dGVuZHMgRXJyb3JSZXNwb25zZSB7XG4gIGh0dHBTdGF0dXM6IDQwMCB8IDQwMyB8IDQwNCB8IDQwNSB8IDQxNCB8IDQxNiB8IDUwMCB8IDUwMSB8IDUwMiB8IDUwMyB8IDUwNDtcbiAgdHRsU2Vjb25kcz86IG51bWJlcjtcbiAgcmVzcG9uc2VTdGF0dXM/OiBudW1iZXI7XG4gIHJlc3BvbnNlUGF0aD86IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRGcm9udERpc3RyaWJ1dGlvblByb3BzIGV4dGVuZHMgUmVzb3VyY2VQcm9wcyB7XG4gIGRvbWFpbk5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGRlZmF1bHRCZWhhdmlvcjogQmVoYXZpb3JPcHRpb25zO1xuICBhZGRpdGlvbmFsQmVoYXZpb3JzPzogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPjtcbiAgcHJpY2VDbGFzcz86ICdQUklDRV9DTEFTU19BTEwnIHwgJ1BSSUNFX0NMQVNTXzEwMCcgfCAnUFJJQ0VfQ0xBU1NfMjAwJyB8ICdOT1RfUFJPRCcgfCAnUFJPRCc7XG4gIGNlcnRpZmljYXRlOiBJQ2VydGlmaWNhdGU7XG4gIHdlYkFjbElkPzogc3RyaW5nO1xuICBlcnJvclJlc3BvbnNlcz86IChDbG91ZEZyb250RXJyb3JSZXNwb25zZSB8IEVycm9yUmVzcG9uc2UpW11cbn1cbmV4cG9ydCBjbGFzcyBDbG91ZEZyb250RGlzdHJpYnV0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDbG91ZEZyb250RGlzdHJpYnV0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbGV0IHByaWNlQ2xhc3MgPSBQcmljZUNsYXNzLlBSSUNFX0NMQVNTX0FMTDtcbiAgICBzd2l0Y2ggKHByb3BzLnByaWNlQ2xhc3MpIHtcbiAgICAgIGNhc2UgJ05PVF9QUk9EJzpcbiAgICAgIGNhc2UgJ1BSSUNFX0NMQVNTXzEwMCc6XG4gICAgICAgIHByaWNlQ2xhc3MgPSBQcmljZUNsYXNzLlBSSUNFX0NMQVNTXzEwMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQUklDRV9DTEFTU18yMDAnOlxuICAgICAgICBwcmljZUNsYXNzID0gUHJpY2VDbGFzcy5QUklDRV9DTEFTU18yMDA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuZGlzdHJpYnV0aW9uID0gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBgJHtpZH18Q2xvdWRGcm9udERpc3RyaWJ1dGlvbmAsIHtcbiAgICAgIGNvbW1lbnQ6IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiBwcm9wcy5kZWZhdWx0QmVoYXZpb3IsXG4gICAgICBhZGRpdGlvbmFsQmVoYXZpb3JzOiBwcm9wcy5hZGRpdGlvbmFsQmVoYXZpb3JzLFxuICAgICAgZG9tYWluTmFtZXM6IFtwcm9wcy5kb21haW5OYW1lXSxcbiAgICAgIGNlcnRpZmljYXRlOiBwcm9wcy5jZXJ0aWZpY2F0ZSxcbiAgICAgIHByaWNlQ2xhc3MsXG4gICAgICB3ZWJBY2xJZDogcHJvcHMud2ViQWNsSWQsXG4gICAgICBlcnJvclJlc3BvbnNlczogcHJvcHMuZXJyb3JSZXNwb25zZXM/Lm1hcCgocikgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGh0dHBTdGF0dXM6IHIuaHR0cFN0YXR1cyxcbiAgICAgICAgICB0dGw6IChyIGFzIENsb3VkRnJvbnRFcnJvclJlc3BvbnNlKS50dGxTZWNvbmRzICE9PSB1bmRlZmluZWQgPyBEdXJhdGlvbi5zZWNvbmRzKChyIGFzIENsb3VkRnJvbnRFcnJvclJlc3BvbnNlKS50dGxTZWNvbmRzISkgOiAociBhcyBFcnJvclJlc3BvbnNlKS50dGwsXG4gICAgICAgICAgcmVzcG9uc2VIdHRwU3RhdHVzOiAociBhcyBDbG91ZEZyb250RXJyb3JSZXNwb25zZSkucmVzcG9uc2VTdGF0dXMgPz8gKHIgYXMgRXJyb3JSZXNwb25zZSkucmVzcG9uc2VIdHRwU3RhdHVzLFxuICAgICAgICAgIHJlc3BvbnNlUGFnZVBhdGg6IChyIGFzIENsb3VkRnJvbnRFcnJvclJlc3BvbnNlKS5yZXNwb25zZVBhdGggPz8gKHIgYXMgRXJyb3JSZXNwb25zZSkucmVzcG9uc2VQYWdlUGF0aFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9KTtcbiAgICB0YWdSZXNvdXJjZSh0aGlzLmRpc3RyaWJ1dGlvbiwgcHJvcHMudGFncyk7XG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kZXN0cm95ID09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5kaXN0cmlidXRpb24uYXBwbHlSZW1vdmFsUG9saWN5KHByb3BzLmRlc3Ryb3kgPyBSZW1vdmFsUG9saWN5LkRFU1RST1kgOiBSZW1vdmFsUG9saWN5LlJFVEFJTik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIEh0dHBSZWRpcmVjdENvZGUgPSAzMDEgfCAzMDIgfCAzMDMgfCAzMDcgfCAzMDg7XG5leHBvcnQgdHlwZSBDbG91ZEZyb250RnVuY3Rpb25SZWRpcmVjdFBhdGhzID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgW3N0cmluZywgSHR0cFJlZGlyZWN0Q29kZV0+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cyB7XG4gIHRyYWlsaW5nU2xhc2g/OiBib29sZWFuO1xuICBkZWZhdWx0RG9jdW1lbnQ/OiBzdHJpbmc7XG4gIHJlZGlyZWN0RGVmYXVsdERvY3VtZW50PzogYm9vbGVhbjtcbiAgcGF0aHM/OiBDbG91ZEZyb250RnVuY3Rpb25SZWRpcmVjdFBhdGhzO1xuICBwYXRoc0NzdkZpbGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlld2VyRXZlbnRGdW5jdGlvblByb3BzIGV4dGVuZHMgUmVzb3VyY2VQcm9wcyB7XG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgZGVmYXVsdERvY3VtZW50Pzogc3RyaW5nO1xuICByZWRpcmVjdHM/OiBDbG91ZEZyb250RnVuY3Rpb25SZWRpcmVjdHM7XG4gIHJlZGlyZWN0c0NzdlBhdGg/OiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzPzogc3RyaW5nO1xuICBjb2RlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdERvY0Z1bmN0aW9uUHJvcHMgZXh0ZW5kcyBSZXNvdXJjZVByb3BzLCBQaWNrPFZpZXdlckV2ZW50RnVuY3Rpb25Qcm9wcywgJ2Z1bmN0aW9uTmFtZScgfCAnZGVmYXVsdERvY3VtZW50JyB8ICdyZWRpcmVjdHMnIHwgJ3JlZGlyZWN0c0NzdlBhdGgnPiB7XG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgZGVmYXVsdERvY3VtZW50Pzogc3RyaW5nO1xuICByZWRpcmVjdHM/OiBDbG91ZEZyb250RnVuY3Rpb25SZWRpcmVjdHM7XG4gIHJlZGlyZWN0c0NzdlBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzaWNBdXRoRGVmYXVsdERvY0Z1bmN0aW9uUHJvcHMgZXh0ZW5kcyBEZWZhdWx0RG9jRnVuY3Rpb25Qcm9wcyB7XG4gIGNyZWRlbnRpYWxzOiBzdHJpbmc7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZyb250RnVuY3Rpb25Qcm9wcyBleHRlbmRzIFJlc291cmNlUHJvcHMge1xuICBjb2RlOiBzdHJpbmc7XG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgcnVudGltZT86ICdKU18xXzAnIHwgJ0pTXzJfMCc7XG59XG5leHBvcnQgY2xhc3MgQ2xvdWRGcm9udEZ1bmN0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGZuOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ2xvdWRGcm9udEZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5mbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnQ2xvdWRGcm9udEZ1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBwcm9wcy5mdW5jdGlvbk5hbWUsXG4gICAgICBydW50aW1lOiBGdW5jdGlvblJ1bnRpbWVbcHJvcHMucnVudGltZSA/PyAnSlNfMl8wJ10sXG4gICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShwcm9wcy5jb2RlKVxuICAgIH0pO1xuICAgIHRhZ1Jlc291cmNlKHRoaXMuZm4sIHByb3BzLnRhZ3MpO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kZXN0cm95ID09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5mbi5hcHBseVJlbW92YWxQb2xpY3kocHJvcHMuZGVzdHJveSA/IFJlbW92YWxQb2xpY3kuREVTVFJPWSA6IFJlbW92YWxQb2xpY3kuUkVUQUlOKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGVmYXVsdERvYyhzY29wZTogQ29uc3RydWN0LCBwcm9wczogRGVmYXVsdERvY0Z1bmN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCBjb2RlID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoX19kaXJuYW1lLCAnLi4vdGVtcGxhdGVzL2NmZm4tZGVmYXVsdC1kb2MuanMnKSwgJ3V0ZjgnKTtcblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUZ1bmN0aW9uKHNjb3BlLCAnRGVmYXVsdERvY0Z1bmN0aW9uJywge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBjcmVkZW50aWFsczogJycsXG4gICAgICBjb2RlXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQmFzaWNBdXRoRGVmYXVsdERvYyhzY29wZTogQ29uc3RydWN0LCBwcm9wczogQmFzaWNBdXRoRGVmYXVsdERvY0Z1bmN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCBjb2RlID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoX19kaXJuYW1lLCAnLi4vdGVtcGxhdGVzL2NmZm4tZGVmYXVsdC1kb2MtYmFzaWMtYXV0aC5qcycpLCAndXRmOCcpO1xuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRnVuY3Rpb24oc2NvcGUsICdCYXNpY0F1dGhEZWZhdWx0RG9jRnVuY3Rpb24nLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGNvZGVcbiAgICB9KTtcblxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUZ1bmN0aW9uKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcgfCBudWxsLCBwcm9wczogVmlld2VyRXZlbnRGdW5jdGlvblByb3BzKSB7XG4gICAgY29uc3QgY3N2UGF0aCA9IHByb3BzLnJlZGlyZWN0cz8ucGF0aHNDc3ZGaWxlID8/IHByb3BzLnJlZGlyZWN0c0NzdlBhdGg7XG4gICAgY29uc3QgcmVkaXJlY3RQYXRocyA9IGNzdlBhdGggPyBwYXJzZUNzdlJlZGlyZWN0cyhjc3ZQYXRoKSA6IChwcm9wcy5yZWRpcmVjdHM/LnBhdGhzID8/IHt9KTtcbiAgICBjb25zdCBoYXNSZWRpcmVjdHMgPSBPYmplY3Qua2V5cyhyZWRpcmVjdFBhdGhzKS5sZW5ndGggPiAwO1xuXG4gICAgcHJvcHMuY29kZSA9IHByb3BzLmNvZGVcbiAgICAgIC5yZXBsYWNlKCdfX0RFRkFVTFRfRE9DVU1FTlRfXycsIHByb3BzLmRlZmF1bHREb2N1bWVudCA/PyAnaW5kZXguaHRtbCcpXG4gICAgICAucmVwbGFjZSgnX19DUkVERU5USUFMU19fJywgcHJvcHMuY3JlZGVudGlhbHMgPz8gJ09nPT0nKVxuICAgICAgLnJlcGxhY2UoJ19fUkVESVJFQ1RTX18nLCBoYXNSZWRpcmVjdHMgPyBKU09OLnN0cmluZ2lmeShyZWRpcmVjdFBhdGhzKSA6ICdudWxsJylcbiAgICAgIC5yZXBsYWNlKCdfX1RSQUlMSU5HX1NMQVNIX18nLCBwcm9wcy5yZWRpcmVjdHM/LnRyYWlsaW5nU2xhc2g/LnRvU3RyaW5nKCkgPz8gJ251bGwnKVxuICAgICAgLnJlcGxhY2UoJ19fUkVESVJfREVGX0RPQ19fJywgcHJvcHMucmVkaXJlY3RzPy5yZWRpcmVjdERlZmF1bHREb2N1bWVudD8udG9TdHJpbmcoKSA/PyAnZmFsc2UnKTtcblxuICAgIHJldHVybiBuZXcgQ2xvdWRGcm9udEZ1bmN0aW9uKHNjb3BlLCBpZCB8fCAnVmlld2VyUmVxdWVzdFJlc3BvbnNlRnVuY3Rpb24nLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IHByb3BzLmZ1bmN0aW9uTmFtZSxcbiAgICAgIHJ1bnRpbWU6ICdKU18yXzAnLFxuICAgICAgY29kZTogcHJvcHMuY29kZVxuICAgIH0pO1xuICB9XG59XG4iXX0=
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmcm9udC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzL2Nsb3VkZnJvbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdkMsT0FBTyxFQUFtQixZQUFZLEVBQWlCLFFBQVEsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9JLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUc1RCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQWtCdEMsTUFBTSxPQUFPLHNCQUF1QixTQUFRLFNBQVM7SUFDbkMsWUFBWSxDQUFlO0lBRTNDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0M7UUFDMUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDO1FBQzVDLFFBQVEsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pCLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssaUJBQWlCO2dCQUNwQixVQUFVLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztnQkFDeEMsTUFBTTtZQUNSLEtBQUssaUJBQWlCO2dCQUNwQixVQUFVLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztnQkFDeEMsTUFBTTtRQUNWLENBQUM7UUFFRCxJQUFJ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RUQsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSTthQUNwQixPQUFPLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLGVBQWUsSUFBSSxZQUFZLENBQUM7YUFDdEUsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDO2FBQ3ZELE9BQU8sQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7YUFDaEcsT0FBTyxDQUFDLDBCQUEwQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzthQUMvSCxPQUFPLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksTUFBTSxDQUFDO2FBQ25GLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxJQUFJLE9BQU8sQ0FBQyxDQUFDO1FBRWpHLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLCtCQUErQixFQUFFO1lBQzFFLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxPQUFPLEVBQUUsUUFBUTtZQUNqQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IER1cmF0aW9uLCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IElDZXJ0aWZpY2F0ZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JPcHRpb25zLCBEaXN0cmlidXRpb24sIEVycm9yUmVzcG9uc2UsIEZ1bmN0aW9uLCBGdW5jdGlvbkNvZGUsIEZ1bmN0aW9uUnVudGltZSwgUHJpY2VDbGFzcyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250JztcbmltcG9ydCB7IHRhZ1Jlc291cmNlIH0gZnJvbSAnLi4vbGliL3RhZ3MuanMnO1xuaW1wb3J0IHsgcGFyc2VDc3ZSZWRpcmVjdHMgfSBmcm9tICcuLi9saWIvY3N2LXJlZGlyZWN0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlUHJvcHMgfSBmcm9tICcuLi90eXBlcy5kLnRzJztcblxuY29uc3QgX19kaXJuYW1lID0gaW1wb3J0Lm1ldGEuZGlybmFtZTtcblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZyb250RXJyb3JSZXNwb25zZSB7XG4gIGh0dHBTdGF0dXM6IDQwMCB8IDQwMyB8IDQwNCB8IDQwNSB8IDQxNCB8IDQxNiB8IDUwMCB8IDUwMSB8IDUwMiB8IDUwMyB8IDUwNDtcbiAgdHRsU2Vjb25kcz86IG51bWJlcjtcbiAgcmVzcG9uc2VTdGF0dXM/OiBudW1iZXI7XG4gIHJlc3BvbnNlUGF0aD86IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRGcm9udERpc3RyaWJ1dGlvblByb3BzIGV4dGVuZHMgUmVzb3VyY2VQcm9wcyB7XG4gIGRvbWFpbk5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGRlZmF1bHRCZWhhdmlvcjogQmVoYXZpb3JPcHRpb25zO1xuICBhZGRpdGlvbmFsQmVoYXZpb3JzPzogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPjtcbiAgcHJpY2VDbGFzcz86ICdQUklDRV9DTEFTU19BTEwnIHwgJ1BSSUNFX0NMQVNTXzEwMCcgfCAnUFJJQ0VfQ0xBU1NfMjAwJyB8ICdOT1RfUFJPRCcgfCAnUFJPRCc7XG4gIGNlcnRpZmljYXRlOiBJQ2VydGlmaWNhdGU7XG4gIHdlYkFjbElkPzogc3RyaW5nO1xuICBlcnJvclJlc3BvbnNlcz86IChDbG91ZEZyb250RXJyb3JSZXNwb25zZSB8IEVycm9yUmVzcG9uc2UpW11cbn1cbmV4cG9ydCBjbGFzcyBDbG91ZEZyb250RGlzdHJpYnV0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDbG91ZEZyb250RGlzdHJpYnV0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbGV0IHByaWNlQ2xhc3MgPSBQcmljZUNsYXNzLlBSSUNFX0NMQVNTX0FMTDtcbiAgICBzd2l0Y2ggKHByb3BzLnByaWNlQ2xhc3MpIHtcbiAgICAgIGNhc2UgJ05PVF9QUk9EJzpcbiAgICAgIGNhc2UgJ1BSSUNFX0NMQVNTXzEwMCc6XG4gICAgICAgIHByaWNlQ2xhc3MgPSBQcmljZUNsYXNzLlBSSUNFX0NMQVNTXzEwMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQUklDRV9DTEFTU18yMDAnOlxuICAgICAgICBwcmljZUNsYXNzID0gUHJpY2VDbGFzcy5QUklDRV9DTEFTU18yMDA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuZGlzdHJpYnV0aW9uID0gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBgJHtpZH18Q2xvdWRGcm9udERpc3RyaWJ1dGlvbmAsIHtcbiAgICAgIGNvbW1lbnQ6IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiBwcm9wcy5kZWZhdWx0QmVoYXZpb3IsXG4gICAgICBhZGRpdGlvbmFsQmVoYXZpb3JzOiBwcm9wcy5hZGRpdGlvbmFsQmVoYXZpb3JzLFxuICAgICAgZG9tYWluTmFtZXM6IFtwcm9wcy5kb21haW5OYW1lXSxcbiAgICAgIGNlcnRpZmljYXRlOiBwcm9wcy5jZXJ0aWZpY2F0ZSxcbiAgICAgIHByaWNlQ2xhc3MsXG4gICAgICB3ZWJBY2xJZDogcHJvcHMud2ViQWNsSWQsXG4gICAgICBlcnJvclJlc3BvbnNlczogcHJvcHMuZXJyb3JSZXNwb25zZXM/Lm1hcCgocikgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGh0dHBTdGF0dXM6IHIuaHR0cFN0YXR1cyxcbiAgICAgICAgICB0dGw6IChyIGFzIENsb3VkRnJvbnRFcnJvclJlc3BvbnNlKS50dGxTZWNvbmRzICE9PSB1bmRlZmluZWQgPyBEdXJhdGlvbi5zZWNvbmRzKChyIGFzIENsb3VkRnJvbnRFcnJvclJlc3BvbnNlKS50dGxTZWNvbmRzISkgOiAociBhcyBFcnJvclJlc3BvbnNlKS50dGwsXG4gICAgICAgICAgcmVzcG9uc2VIdHRwU3RhdHVzOiAociBhcyBDbG91ZEZyb250RXJyb3JSZXNwb25zZSkucmVzcG9uc2VTdGF0dXMgPz8gKHIgYXMgRXJyb3JSZXNwb25zZSkucmVzcG9uc2VIdHRwU3RhdHVzLFxuICAgICAgICAgIHJlc3BvbnNlUGFnZVBhdGg6IChyIGFzIENsb3VkRnJvbnRFcnJvclJlc3BvbnNlKS5yZXNwb25zZVBhdGggPz8gKHIgYXMgRXJyb3JSZXNwb25zZSkucmVzcG9uc2VQYWdlUGF0aFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9KTtcbiAgICB0YWdSZXNvdXJjZSh0aGlzLmRpc3RyaWJ1dGlvbiwgcHJvcHMudGFncyk7XG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kZXN0cm95ID09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5kaXN0cmlidXRpb24uYXBwbHlSZW1vdmFsUG9saWN5KHByb3BzLmRlc3Ryb3kgPyBSZW1vdmFsUG9saWN5LkRFU1RST1kgOiBSZW1vdmFsUG9saWN5LlJFVEFJTik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIEh0dHBSZWRpcmVjdENvZGUgPSAzMDEgfCAzMDIgfCAzMDMgfCAzMDcgfCAzMDg7XG5leHBvcnQgdHlwZSBDbG91ZEZyb250RnVuY3Rpb25SZWRpcmVjdFBhdGhzID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgW3N0cmluZywgSHR0cFJlZGlyZWN0Q29kZV0+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cyB7XG4gIHRyYWlsaW5nU2xhc2g/OiBib29sZWFuO1xuICBkZWZhdWx0RG9jdW1lbnQ/OiBzdHJpbmc7XG4gIHJlZGlyZWN0RGVmYXVsdERvY3VtZW50PzogYm9vbGVhbjtcbiAgcGF0aHM/OiBDbG91ZEZyb250RnVuY3Rpb25SZWRpcmVjdFBhdGhzO1xuICBwYXRoc0NzdkZpbGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlld2VyRXZlbnRGdW5jdGlvblByb3BzIGV4dGVuZHMgUmVzb3VyY2VQcm9wcyB7XG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgZGVmYXVsdERvY3VtZW50Pzogc3RyaW5nO1xuICByZWRpcmVjdHM/OiBDbG91ZEZyb250RnVuY3Rpb25SZWRpcmVjdHM7XG4gIHJlZGlyZWN0c0NzdlBhdGg/OiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzPzogc3RyaW5nO1xuICBjb2RlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdERvY0Z1bmN0aW9uUHJvcHMgZXh0ZW5kcyBSZXNvdXJjZVByb3BzLCBQaWNrPFZpZXdlckV2ZW50RnVuY3Rpb25Qcm9wcywgJ2Z1bmN0aW9uTmFtZScgfCAnZGVmYXVsdERvY3VtZW50JyB8ICdyZWRpcmVjdHMnIHwgJ3JlZGlyZWN0c0NzdlBhdGgnPiB7XG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgZGVmYXVsdERvY3VtZW50Pzogc3RyaW5nO1xuICByZWRpcmVjdHM/OiBDbG91ZEZyb250RnVuY3Rpb25SZWRpcmVjdHM7XG4gIHJlZGlyZWN0c0NzdlBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzaWNBdXRoRGVmYXVsdERvY0Z1bmN0aW9uUHJvcHMgZXh0ZW5kcyBEZWZhdWx0RG9jRnVuY3Rpb25Qcm9wcyB7XG4gIGNyZWRlbnRpYWxzOiBzdHJpbmc7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZyb250RnVuY3Rpb25Qcm9wcyBleHRlbmRzIFJlc291cmNlUHJvcHMge1xuICBjb2RlOiBzdHJpbmc7XG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgcnVudGltZT86ICdKU18xXzAnIHwgJ0pTXzJfMCc7XG59XG5leHBvcnQgY2xhc3MgQ2xvdWRGcm9udEZ1bmN0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGZuOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ2xvdWRGcm9udEZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5mbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnQ2xvdWRGcm9udEZ1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBwcm9wcy5mdW5jdGlvbk5hbWUsXG4gICAgICBydW50aW1lOiBGdW5jdGlvblJ1bnRpbWVbcHJvcHMucnVudGltZSA/PyAnSlNfMl8wJ10sXG4gICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShwcm9wcy5jb2RlKVxuICAgIH0pO1xuICAgIHRhZ1Jlc291cmNlKHRoaXMuZm4sIHByb3BzLnRhZ3MpO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kZXN0cm95ID09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5mbi5hcHBseVJlbW92YWxQb2xpY3kocHJvcHMuZGVzdHJveSA/IFJlbW92YWxQb2xpY3kuREVTVFJPWSA6IFJlbW92YWxQb2xpY3kuUkVUQUlOKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGVmYXVsdERvYyhzY29wZTogQ29uc3RydWN0LCBwcm9wczogRGVmYXVsdERvY0Z1bmN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCBjb2RlID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoX19kaXJuYW1lLCAnLi4vdGVtcGxhdGVzL2NmZm4tZGVmYXVsdC1kb2MuanMnKSwgJ3V0ZjgnKTtcblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUZ1bmN0aW9uKHNjb3BlLCAnRGVmYXVsdERvY0Z1bmN0aW9uJywge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBjcmVkZW50aWFsczogJycsXG4gICAgICBjb2RlXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQmFzaWNBdXRoRGVmYXVsdERvYyhzY29wZTogQ29uc3RydWN0LCBwcm9wczogQmFzaWNBdXRoRGVmYXVsdERvY0Z1bmN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCBjb2RlID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoX19kaXJuYW1lLCAnLi4vdGVtcGxhdGVzL2NmZm4tZGVmYXVsdC1kb2MtYmFzaWMtYXV0aC5qcycpLCAndXRmOCcpO1xuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRnVuY3Rpb24oc2NvcGUsICdCYXNpY0F1dGhEZWZhdWx0RG9jRnVuY3Rpb24nLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGNvZGVcbiAgICB9KTtcblxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUZ1bmN0aW9uKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcgfCBudWxsLCBwcm9wczogVmlld2VyRXZlbnRGdW5jdGlvblByb3BzKSB7XG4gICAgY29uc3QgY3N2UGF0aCA9IHByb3BzLnJlZGlyZWN0cz8ucGF0aHNDc3ZGaWxlID8/IHByb3BzLnJlZGlyZWN0c0NzdlBhdGg7XG4gICAgY29uc3QgcmVkaXJlY3RQYXRocyA9IGNzdlBhdGggPyBwYXJzZUNzdlJlZGlyZWN0cyhjc3ZQYXRoKSA6IChwcm9wcy5yZWRpcmVjdHM/LnBhdGhzID8/IHt9KTtcblxuICAgIGNvbnN0IHJlZGlyZWN0czogQ2xvdWRGcm9udEZ1bmN0aW9uUmVkaXJlY3RQYXRocyA9IHt9O1xuICAgIGNvbnN0IHJlZGlyZWN0c1N0YXJ0c1dpdGg6IENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0UGF0aHMgPSB7fTtcbiAgICBjb25zdCByZWRpcmVjdEtleXMgPSBPYmplY3Qua2V5cyhyZWRpcmVjdFBhdGhzKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZWRpcmVjdEtleXMpIHtcbiAgICAgIGlmIChrZXkuZW5kc1dpdGgoJyonKSkge1xuICAgICAgICByZWRpcmVjdHNTdGFydHNXaXRoW2tleS5zdWJzdHJpbmcoMCwga2V5Lmxlbmd0aCAtIDEpXSA9IHJlZGlyZWN0UGF0aHNba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZGlyZWN0c1trZXldID0gcmVkaXJlY3RQYXRoc1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3BzLmNvZGUgPSBwcm9wcy5jb2RlXG4gICAgICAucmVwbGFjZSgnX19ERUZBVUxUX0RPQ1VNRU5UX18nLCBwcm9wcy5kZWZhdWx0RG9jdW1lbnQgPz8gJ2luZGV4Lmh0bWwnKVxuICAgICAgLnJlcGxhY2UoJ19fQ1JFREVOVElBTFNfXycsIHByb3BzLmNyZWRlbnRpYWxzID8/ICdPZz09JylcbiAgICAgIC5yZXBsYWNlKCdfX1JFRElSRUNUU19fJywgT2JqZWN0LmtleXMocmVkaXJlY3RzKS5sZW5ndGggPiAwID8gSlNPTi5zdHJpbmdpZnkocmVkaXJlY3RzKSA6ICdudWxsJylcbiAgICAgIC5yZXBsYWNlKCdfX1JFRElSRUNUU19TVEFSVF9XSVRIX18nLCBPYmplY3Qua2V5cyhyZWRpcmVjdHNTdGFydHNXaXRoKS5sZW5ndGggPiAwID8gSlNPTi5zdHJpbmdpZnkocmVkaXJlY3RzU3RhcnRzV2l0aCkgOiAnbnVsbCcpXG4gICAgICAucmVwbGFjZSgnX19UUkFJTElOR19TTEFTSF9fJywgcHJvcHMucmVkaXJlY3RzPy50cmFpbGluZ1NsYXNoPy50b1N0cmluZygpID8/ICdudWxsJylcbiAgICAgIC5yZXBsYWNlKCdfX1JFRElSX0RFRl9ET0NfXycsIHByb3BzLnJlZGlyZWN0cz8ucmVkaXJlY3REZWZhdWx0RG9jdW1lbnQ/LnRvU3RyaW5nKCkgPz8gJ2ZhbHNlJyk7XG5cbiAgICByZXR1cm4gbmV3IENsb3VkRnJvbnRGdW5jdGlvbihzY29wZSwgaWQgfHwgJ1ZpZXdlclJlcXVlc3RSZXNwb25zZUZ1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBwcm9wcy5mdW5jdGlvbk5hbWUsXG4gICAgICBydW50aW1lOiAnSlNfMl8wJyxcbiAgICAgIGNvZGU6IHByb3BzLmNvZGVcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -9,7 +9,13 @@ const BASIC_AUTH = ["Basic __CREDENTIALS__"];
9
9
  /** @type {Record<string, string | [string, 301|302|303|307|308]>} */
10
10
  const redirects = __REDIRECTS__;
11
11
 
12
+ /** @type {Record<string, string | [string, 301|302|303|307|308]>} */
13
+ const redirectsStartsWith = __REDIRECTS_START_WITH__;
14
+
15
+ /** @type {boolean | null} */
12
16
  const useTrailingSlash = __TRAILING_SLASH__;
17
+
18
+ /** @type {boolean | null} */
13
19
  const shouldRedirDefDoc = __REDIR_DEF_DOC__;
14
20
 
15
21
 
@@ -32,7 +38,19 @@ function handleRequest(event) {
32
38
  const request = event.request;
33
39
  const uri = request.uri;
34
40
 
35
- const redirect = redirects ? redirects[uri] : null;
41
+ let redirect = null;
42
+ if (redirects) {
43
+ redirect = redirects[uri];
44
+ }
45
+ if (!redirect && redirectsStartsWith) {
46
+ const keys = Object.keys(redirectsStartsWith);
47
+ for (let i=0; i<keys.length; i++) {
48
+ if (uri.startsWith(keys[i])) {
49
+ redirect = redirectsStartsWith[keys[i]];
50
+ break;
51
+ }
52
+ }
53
+ }
36
54
  if (redirect) {
37
55
  const redir = Array.isArray(redirect) ? redirect : [redirect, 301];
38
56
  return redirectResponse(event, redir[0], redir[1]);
@@ -8,7 +8,13 @@ const DEFAULT_DOCUMENT = "__DEFAULT_DOCUMENT__";
8
8
  /** @type {Record<string, string | [string, 301|302|303|307|308]>} */
9
9
  const redirects = __REDIRECTS__;
10
10
 
11
+ /** @type {Record<string, string | [string, 301|302|303|307|308]>} */
12
+ const redirectsStartsWith = __REDIRECTS_START_WITH__;
13
+
14
+ /** @type {boolean | null} */
11
15
  const useTrailingSlash = __TRAILING_SLASH__;
16
+
17
+ /** @type {boolean | null} */
12
18
  const shouldRedirDefDoc = __REDIR_DEF_DOC__;
13
19
 
14
20
 
@@ -30,7 +36,19 @@ function handleRequest(event) {
30
36
  const request = event.request;
31
37
  const uri = request.uri;
32
38
 
33
- const redirect = redirects ? redirects[uri] : null;
39
+ let redirect = null;
40
+ if (redirects) {
41
+ redirect = redirects[uri];
42
+ }
43
+ if (!redirect && redirectsStartsWith) {
44
+ const keys = Object.keys(redirectsStartsWith);
45
+ for (let i=0; i<keys.length; i++) {
46
+ if (uri.startsWith(keys[i])) {
47
+ redirect = redirectsStartsWith[keys[i]];
48
+ break;
49
+ }
50
+ }
51
+ }
34
52
  if (redirect) {
35
53
  const redir = Array.isArray(redirect) ? redirect : [redirect, 301];
36
54
  return redirectResponse(event, redir[0], redir[1]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inizioevoke/evosynth",
3
- "version": "2.1.0",
3
+ "version": "2.1.2",
4
4
  "author": "",
5
5
  "license": "ISC",
6
6
  "description": "",
@@ -10,11 +10,14 @@
10
10
  "./constructs/*": "./dist/constructs/*.js",
11
11
  "./stacks/*": "./dist/stacks/*.js",
12
12
  "./stages/*": "./dist/stages/*.js",
13
- "./types/*": "./dist/types.d.ts"
13
+ "./types": "./dist/types.d.ts"
14
14
  },
15
15
  "bin": {
16
16
  "evosynth": "./dist/cli/cli.js"
17
17
  },
18
+ "engines": {
19
+ "node": ">=22.0.0"
20
+ },
18
21
  "scripts": {
19
22
  "prepublishOnly": "npm run build",
20
23
  "build": "node ./tasks/clean.js && npx tsc && node ./tasks/dist.js"
package/readme.md CHANGED
@@ -3,7 +3,6 @@
3
3
  EvoSynth is an npm package providing reusable AWS CDK stacks for deploying static serverless websites. It targets S3 + CloudFront + Route53 + ACM + WAF + CodePipeline architectures.
4
4
 
5
5
  ## Prerequisites
6
- - [CDK v2.238.x](https://docs.aws.amazon.com/cdk/v2/guide/home.html)
7
6
  - Node version 22+
8
7
  - AWS Account ID, a configured profile, or other credentials
9
8
  - CodeConnection ARN or SSM Parameter Store path of a shared connection ARN
@@ -15,8 +14,153 @@ EvoSynth is an npm package providing reusable AWS CDK stacks for deploying stati
15
14
  - Copy the buildspec.yml on your Bitbucket Repo and the build configuration
16
15
  - Update/Configure the Stack example below
17
16
 
17
+ ## CLI - evosynth (preferred)
18
18
 
19
- ## Example App
19
+ This library includes a cli tool `evosynth` to support a more streamlined configuration approach than the version 1 process, although the version 1 process is still supported.
20
+
21
+ ### Instructions
22
+
23
+ In your project:
24
+
25
+ 1. **Install the library**
26
+ ```bash
27
+ > npm install @inizioevoke/evosynth
28
+ ```
29
+ 2. **Create the config file in your project root directory.** `[ENV]` should be your environment name *(e.g. `.evosynth.dev.ts`)*
30
+ ```bash
31
+ .evosynth.[ENV].(js|mjs|ts|mts)
32
+ ```
33
+ It is also possible to use 1 config file for multiple environments. Named exports should match your environment names.
34
+ ```bash
35
+ .evosynth.(js|mjs|ts|mts)
36
+ ```
37
+
38
+ 3. **Compile your config.** Add standard AWS flags like `--profile` if necessary.
39
+ ```bash
40
+ > npx evosynth synth [ENV]
41
+ ```
42
+ ```bash
43
+ > npx evosynth synth [ENV] --profile my-profile
44
+ ```
45
+ 4. **Deploy**
46
+ ```bash
47
+ > npx evosynth deploy [ENV]
48
+ ```
49
+ 5. **Destroy**
50
+ ```bash
51
+ > npx evosynth destroy [ENV]
52
+ ```
53
+
54
+ ### Example config file - single environment
55
+
56
+ ```typescript
57
+ // .evosynth.dev.ts
58
+ import type { WebStaticServerlessAppConfig } from '@inizioevoke/evosynth';
59
+
60
+ export default async function(): Promise<WebStaticServerlessAppConfig> {
61
+ return {
62
+ type: 'web-static-serverless',
63
+ envType: 'dev',
64
+ name: 'my-project',
65
+ description: 'My Project',
66
+ region: 'us-east-1',
67
+ tags: {
68
+ Account: 'Account Name',
69
+ Brand: 'Brand Name'
70
+ },
71
+ dns: {
72
+ record: 'my-project.dev.client',
73
+ zone: 'evodev.net'
74
+ },
75
+ security: {
76
+ basicAuthParam: '/evosynth/web/security/basicauth',
77
+ webAclParam: '/evosynth/web/security/webacl'
78
+ },
79
+ pipeline: {
80
+ source: {
81
+ codestarConnectionParam: '/evosynth/bitbucket/codeconnection',
82
+ owner: 'evokegroup',
83
+ repo: 'my-project',
84
+ branch: 'develop'
85
+ }
86
+ }
87
+ }
88
+ }
89
+ ```
90
+
91
+ ### Example config file - multiple environments
92
+
93
+ ```typescript
94
+ // .evosynth.dev.ts
95
+ import type { WebStaticServerlessAppConfig } from '@inizioevoke/evosynth';
96
+
97
+ const config: Omit<WebStaticServerlessAppConfig, 'dns'> = {
98
+ type: 'web-static-serverless',
99
+ name: 'my-project',
100
+ description: 'My Project',
101
+ region: 'us-east-1',
102
+ tags: {
103
+ Account: 'Account Name',
104
+ Brand: 'Brand Name'
105
+ },
106
+ security: {
107
+ basicAuthParam: '/evosynth/web/security/basicauth',
108
+ webAclParam: '/evosynth/web/security/webacl'
109
+ },
110
+ pipeline: {
111
+ source: {
112
+ codestarConnectionParam: '/evosynth/bitbucket/codeconnection',
113
+ owner: 'evokegroup',
114
+ repo: 'my-project',
115
+ branch: ''
116
+ }
117
+ }
118
+ };
119
+
120
+ // dev environment
121
+ export async function dev(): Promise<WebStaticServerlessAppConfig> {
122
+ return {
123
+ ...config,
124
+ envType: 'dev',
125
+ dns: {
126
+ record: 'my-project.dev.client',
127
+ zone: 'evodev.net'
128
+ },
129
+ pipeline: {
130
+ source: {
131
+ ...config.pipeline!.source,
132
+ branch: 'develop'
133
+ }
134
+ }
135
+ }
136
+ }
137
+
138
+ // uat environment
139
+ export async function uat(): Promise<WebStaticServerlessAppConfig> {
140
+ return {
141
+ ...config,
142
+ envType: 'uat',
143
+ dns: {
144
+ record: 'my-project.uat.client',
145
+ zone: 'evodev.net'
146
+ },
147
+ pipeline: {
148
+ source: {
149
+ ...config.pipeline!.source,
150
+ branch: 'uat'
151
+ }
152
+ }
153
+ }
154
+ }
155
+ ```
156
+
157
+ ## CDK App
158
+
159
+ Use evosynth in a traditional CDK app script by instantiating a stage or stack. Use individual constructs for custom apps.
160
+
161
+ *Requires [CDK v2.238.x](https://docs.aws.amazon.com/cdk/v2/guide/home.html) installed locally*
162
+
163
+ ### Example App
20
164
 
21
165
  ```typescript
22
166
  import * as cdk from 'aws-cdk-lib/core';
@@ -1,39 +1,76 @@
1
1
  import type { WebStaticServerlessAppConfig } from '@inizioevoke/evosynth';
2
2
 
3
+ const config: Omit<WebStaticServerlessAppConfig, 'dns'> = {
4
+ type: 'web-static-serverless',
5
+ name: 'my-project',
6
+ description: 'My Project',
7
+ region: 'us-east-1',
8
+ tags: {
9
+ Account: 'Account Name',
10
+ Brand: 'Brand Name'
11
+ },
12
+ cloudfront: {
13
+ redirects: {
14
+ paths: {
15
+ '/old': '/new/',
16
+ '/hello': ['/world/', 302]
17
+ }
18
+ },
19
+ cspHeaders: {
20
+ 'default-src': [
21
+ "'self'"
22
+ ],
23
+ 'script-src': [
24
+ "'self'"
25
+ ]
26
+ }
27
+ },
28
+ security: {
29
+ basicAuthParam: '/evosynth/web/security/basicauth',
30
+ webAclParam: '/evosynth/web/security/webacl'
31
+ },
32
+ pipeline: {
33
+ source: {
34
+ codestarConnectionParam: '/evosynth/bitbucket/codeconnection',
35
+ owner: 'evokegroup',
36
+ repo: 'my-project',
37
+ branch: ''
38
+ }
39
+ }
40
+ };
41
+
42
+ // dev environment
3
43
  export async function dev(): Promise<WebStaticServerlessAppConfig> {
4
44
  return {
5
- type: 'web-static-serverless',
45
+ ...config,
6
46
  envType: 'dev',
7
- name: 'myproject-v1',
8
- description: 'My Project',
9
- region: 'us-east-1',
10
- tags: {
11
- Account: 'Account Name',
12
- Brand: 'Brand Name'
13
- },
14
47
  dns: {
15
- record: 'livdelzi-hcp-iva-v2.gilead',
48
+ record: 'my-project.dev.client',
16
49
  zone: 'evodev.net'
17
50
  },
18
- security: {
19
- basicAuthParam: '/evosynth/web/security/basicauth',
20
- webAclParam: '/evosynth/web/security/webacl'
21
- },
22
- // cloudfront: {
23
- // redirects: {
24
- // paths: {
25
- // '/hello': '/world',
26
- // '/redirect': ['/here', 302]
27
- // }
28
- // }
29
- // },
30
51
  pipeline: {
31
52
  source: {
32
- codestarConnectionParam: '/evosynth/provider/codeconnection',
33
- owner: 'orgname',
34
- repo: 'myproject-v1',
53
+ ...config.pipeline!.source,
35
54
  branch: 'develop'
36
55
  }
37
56
  }
38
57
  }
39
58
  }
59
+
60
+ // uat environment
61
+ export async function uat(): Promise<WebStaticServerlessAppConfig> {
62
+ return {
63
+ ...config,
64
+ envType: 'uat',
65
+ dns: {
66
+ record: 'my-project.uat.client',
67
+ zone: 'evodev.net'
68
+ },
69
+ pipeline: {
70
+ source: {
71
+ ...config.pipeline!.source,
72
+ branch: 'uat'
73
+ }
74
+ }
75
+ }
76
+ }
package/samples/csp.ts CHANGED
@@ -3,6 +3,9 @@ import type { CspHeaders } from '@inizioevoke/evosynth/types';
3
3
  const cspHeaders: CspHeaders = {
4
4
  'default-src': [
5
5
  "'self'"
6
+ ],
7
+ 'script-src': [
8
+ "'self'"
6
9
  ]
7
10
  }
8
11
 
@@ -49,13 +49,20 @@ export async function evosynth(cmd: CdkCommand, env: string, props: EvosynthProp
49
49
  if (configIndex != -1) {
50
50
  const configFile = configFiles[configIndex];
51
51
  const tsxUnregister = /^\.m?ts$/.test(extname(configFile.name)) ? register() : undefined;
52
- const module = await import(pathToFileURL(join(configFile.dir, configFile.name)).toString());
53
- tsxUnregister && tsxUnregister();
52
+ let module: any;
53
+ try {
54
+ module = await import(pathToFileURL(join(configFile.dir, configFile.name)).toString());
55
+ } catch (err) {
56
+ console.error(`Failed to load config "${configFile.name}":`, (err as Error).message);
57
+ process.exit(1);
58
+ } finally {
59
+ tsxUnregister?.();
60
+ }
54
61
  let config: EvosynthAppConfig | undefined = undefined;
55
62
  if (configFile.env) {
56
- config = await module.default();
63
+ config = await module.default?.();
57
64
  } else {
58
- config = await module[env]?.();
65
+ config = await module[env.toLowerCase()]?.();
59
66
  }
60
67
 
61
68
  if (config) {
@@ -66,7 +73,14 @@ export async function evosynth(cmd: CdkCommand, env: string, props: EvosynthProp
66
73
  case 'web-static-serverless':
67
74
  await runWebStaticServerlessApp(cmd, config as WebStaticServerlessAppConfig);
68
75
  break;
76
+ default:
77
+ console.error(`Unsupported evosynth app type: "${config.type}"`);
78
+ process.exit(1);
79
+ break;
69
80
  }
81
+ } else {
82
+ console.error(`Config environment "${env}" not found`);
83
+ process.exit(1);
70
84
  }
71
85
 
72
86
  } else {
@@ -10,56 +10,65 @@ import type { CloudFrontFunctionEventType, CspHeaders, UUID, AWSManagedResponseH
10
10
  import { getEnv } from '../index.js';
11
11
  import { WebStaticServerlessStage, WebStaticServerlessStageProps } from '../stages/web-static-serverless-stage.js';
12
12
 
13
- const cdk = new Toolkit();
13
+ export interface AppConfigDnsProps {
14
+ record: string;
15
+ zone: string;
16
+ }
17
+
18
+ export interface AppConfigSecurityProps {
19
+ basicAuth?: string;
20
+ basicAuthParam?: string;
21
+ webAcl?: string | boolean;
22
+ webAclParam?: string | { path: string, version?: number };
23
+ }
24
+
25
+ export interface AppConfigCloudFrontProps {
26
+ responseHeaders?: AWSManagedResponseHeadersPolicy | UUID | false;
27
+ responseHeadersParam?: string;
28
+ responseHeadersPolicy?: ResponseHeadersPolicyProps;
29
+ cspHeaders?: CspHeaders;
30
+ redirects?: CloudFrontFunctionRedirects;
31
+ function?: string | {
32
+ code: string;
33
+ eventType: CloudFrontFunctionEventType[];
34
+ },
35
+ errorResponses?: CloudFrontErrorResponse[]
36
+ }
37
+
38
+ export interface AppConfigPipelineSourceProps {
39
+ codestarConnection?: string;
40
+ codestarConnectionParam?: string;
41
+ owner: 'evokegroup' | 'meltmedia' | (string & {});
42
+ repo: string;
43
+ branch: string;
44
+ fullClone?: boolean;
45
+ }
46
+
47
+ export interface AppConfigPipelineBuildProps {
48
+ buildSpec?: string | object;
49
+ buildImage?: IBuildImage;
50
+ buildImageEcr?: EcrBuildImage;
51
+ buildImageNodeJS?: CodeBuildNodeJs;
52
+ buildImageId?: CodeBuildImageId;
53
+ computeType?: CodeBuildComputeType;
54
+ environmentVariables?: EnvironmentVariables;
55
+ ssmParameters?: CodeBuildSsmParameter[]
56
+ }
14
57
 
15
58
  export interface WebStaticServerlessAppConfig extends EvosynthAppConfig {
16
59
  type: Extract<EvosynthAppType, 'web-static-serverless'>,
17
- description?: string;
18
- dns: {
19
- record: string;
20
- zone: string;
21
- },
22
- security?: {
23
- basicAuth?: string;
24
- basicAuthParam?: string;
25
- webAcl?: string | false;
26
- webAclParam?: string;
27
- },
28
- cloudfront?: {
29
- responseHeaders?: AWSManagedResponseHeadersPolicy | UUID | false;
30
- responseHeadersParam?: string;
31
- responseHeadersPolicy?: ResponseHeadersPolicyProps;
32
- cspHeaders?: CspHeaders;
33
- redirects?: CloudFrontFunctionRedirects;
34
- function?: string | {
35
- code: string;
36
- eventType: CloudFrontFunctionEventType[];
37
- },
38
- errors?: CloudFrontErrorResponse[]
39
- },
60
+ description: string;
61
+ dns: AppConfigDnsProps,
62
+ security?: AppConfigSecurityProps,
63
+ cloudfront?: AppConfigCloudFrontProps,
40
64
  pipeline?: {
41
- source: {
42
- codestarConnection?: string;
43
- codestarConnectionParam?: string;
44
- owner: 'evokegroup' | 'meltmedia' | (string & {});
45
- repo: string;
46
- branch: string;
47
- fullClone?: boolean;
48
- },
49
- build?: {
50
- buildSpec?: string | object;
51
- buildImage?: IBuildImage;
52
- buildImageEcr?: EcrBuildImage;
53
- buildImageNodeJS?: CodeBuildNodeJs;
54
- buildImageId?: CodeBuildImageId;
55
- computeType?: CodeBuildComputeType;
56
- environmentVariables?: EnvironmentVariables;
57
- ssmParameters?: CodeBuildSsmParameter[]
58
- }
65
+ source: AppConfigPipelineSourceProps,
66
+ build?: AppConfigPipelineBuildProps
59
67
  }
60
68
  }
61
69
 
62
70
  export async function runWebStaticServerlessApp(cmd: CdkCommand, config: WebStaticServerlessAppConfig) {
71
+ const cdk = new Toolkit();
63
72
  const cx = await cdk.fromAssemblyBuilder(async (props) => {
64
73
  const app = new core.App({
65
74
  outdir: join(process.cwd(), '.evosynth'),
@@ -74,7 +83,7 @@ export async function runWebStaticServerlessApp(cmd: CdkCommand, config: WebStat
74
83
  hostedZone: config.dns.zone,
75
84
  domainName: `${config.dns.record}.${config.dns.zone}`,
76
85
  basicAuth: config.security?.basicAuthParam ? { path: config.security?.basicAuthParam } : config.security?.basicAuth,
77
- webAcl: config.security?.webAclParam ? { path: config.security.webAclParam } : config.security?.webAcl,
86
+ webAcl: config.security?.webAclParam ? (config.security.webAclParam as any).path ? config.security.webAclParam : { path: config.security.webAclParam as string } : config.security?.webAcl,
78
87
  redirects: config.cloudfront?.redirects,
79
88
  responseCspHeaders: config.cloudfront?.cspHeaders,
80
89
  responseHeadersPolicy: config.cloudfront?.responseHeadersParam ? { path: config.cloudfront.responseHeadersParam } : config.cloudfront?.responseHeaders,
@@ -82,7 +91,8 @@ export async function runWebStaticServerlessApp(cmd: CdkCommand, config: WebStat
82
91
  cloudfrontFunction: config.cloudfront?.function && typeof config.cloudfront.function == 'string' ? {
83
92
  code: config.cloudfront.function,
84
93
  eventType: ['VIEWER_REQUEST','VIEWER_RESPONSE'],
85
- } : config.cloudfront?.function as any
94
+ } : config.cloudfront?.function as any,
95
+ errorResponses: config.cloudfront?.errorResponses
86
96
  }
87
97
  if (config.pipeline) {
88
98
  stageProps.pipeline = {
@@ -10,7 +10,7 @@ import type { ResourceProps } from '../types.d.ts';
10
10
 
11
11
  const __dirname = import.meta.dirname;
12
12
 
13
- export interface CloudFrontErrorResponse extends ErrorResponse {
13
+ export interface CloudFrontErrorResponse {
14
14
  httpStatus: 400 | 403 | 404 | 405 | 414 | 416 | 500 | 501 | 502 | 503 | 504;
15
15
  ttlSeconds?: number;
16
16
  responseStatus?: number;
@@ -145,12 +145,23 @@ export class CloudFrontFunction extends Construct {
145
145
  static createFunction(scope: Construct, id: string | null, props: ViewerEventFunctionProps) {
146
146
  const csvPath = props.redirects?.pathsCsvFile ?? props.redirectsCsvPath;
147
147
  const redirectPaths = csvPath ? parseCsvRedirects(csvPath) : (props.redirects?.paths ?? {});
148
- const hasRedirects = Object.keys(redirectPaths).length > 0;
148
+
149
+ const redirects: CloudFrontFunctionRedirectPaths = {};
150
+ const redirectsStartsWith: CloudFrontFunctionRedirectPaths = {};
151
+ const redirectKeys = Object.keys(redirectPaths);
152
+ for (const key of redirectKeys) {
153
+ if (key.endsWith('*')) {
154
+ redirectsStartsWith[key.substring(0, key.length - 1)] = redirectPaths[key];
155
+ } else {
156
+ redirects[key] = redirectPaths[key];
157
+ }
158
+ }
149
159
 
150
160
  props.code = props.code
151
161
  .replace('__DEFAULT_DOCUMENT__', props.defaultDocument ?? 'index.html')
152
162
  .replace('__CREDENTIALS__', props.credentials ?? 'Og==')
153
- .replace('__REDIRECTS__', hasRedirects ? JSON.stringify(redirectPaths) : 'null')
163
+ .replace('__REDIRECTS__', Object.keys(redirects).length > 0 ? JSON.stringify(redirects) : 'null')
164
+ .replace('__REDIRECTS_START_WITH__', Object.keys(redirectsStartsWith).length > 0 ? JSON.stringify(redirectsStartsWith) : 'null')
154
165
  .replace('__TRAILING_SLASH__', props.redirects?.trailingSlash?.toString() ?? 'null')
155
166
  .replace('__REDIR_DEF_DOC__', props.redirects?.redirectDefaultDocument?.toString() ?? 'false');
156
167
 
@@ -9,7 +9,13 @@ const BASIC_AUTH = ["Basic __CREDENTIALS__"];
9
9
  /** @type {Record<string, string | [string, 301|302|303|307|308]>} */
10
10
  const redirects = __REDIRECTS__;
11
11
 
12
+ /** @type {Record<string, string | [string, 301|302|303|307|308]>} */
13
+ const redirectsStartsWith = __REDIRECTS_START_WITH__;
14
+
15
+ /** @type {boolean | null} */
12
16
  const useTrailingSlash = __TRAILING_SLASH__;
17
+
18
+ /** @type {boolean | null} */
13
19
  const shouldRedirDefDoc = __REDIR_DEF_DOC__;
14
20
 
15
21
 
@@ -32,7 +38,19 @@ function handleRequest(event) {
32
38
  const request = event.request;
33
39
  const uri = request.uri;
34
40
 
35
- const redirect = redirects ? redirects[uri] : null;
41
+ let redirect = null;
42
+ if (redirects) {
43
+ redirect = redirects[uri];
44
+ }
45
+ if (!redirect && redirectsStartsWith) {
46
+ const keys = Object.keys(redirectsStartsWith);
47
+ for (let i=0; i<keys.length; i++) {
48
+ if (uri.startsWith(keys[i])) {
49
+ redirect = redirectsStartsWith[keys[i]];
50
+ break;
51
+ }
52
+ }
53
+ }
36
54
  if (redirect) {
37
55
  const redir = Array.isArray(redirect) ? redirect : [redirect, 301];
38
56
  return redirectResponse(event, redir[0], redir[1]);
@@ -8,7 +8,13 @@ const DEFAULT_DOCUMENT = "__DEFAULT_DOCUMENT__";
8
8
  /** @type {Record<string, string | [string, 301|302|303|307|308]>} */
9
9
  const redirects = __REDIRECTS__;
10
10
 
11
+ /** @type {Record<string, string | [string, 301|302|303|307|308]>} */
12
+ const redirectsStartsWith = __REDIRECTS_START_WITH__;
13
+
14
+ /** @type {boolean | null} */
11
15
  const useTrailingSlash = __TRAILING_SLASH__;
16
+
17
+ /** @type {boolean | null} */
12
18
  const shouldRedirDefDoc = __REDIR_DEF_DOC__;
13
19
 
14
20
 
@@ -30,7 +36,19 @@ function handleRequest(event) {
30
36
  const request = event.request;
31
37
  const uri = request.uri;
32
38
 
33
- const redirect = redirects ? redirects[uri] : null;
39
+ let redirect = null;
40
+ if (redirects) {
41
+ redirect = redirects[uri];
42
+ }
43
+ if (!redirect && redirectsStartsWith) {
44
+ const keys = Object.keys(redirectsStartsWith);
45
+ for (let i=0; i<keys.length; i++) {
46
+ if (uri.startsWith(keys[i])) {
47
+ redirect = redirectsStartsWith[keys[i]];
48
+ break;
49
+ }
50
+ }
51
+ }
34
52
  if (redirect) {
35
53
  const redir = Array.isArray(redirect) ? redirect : [redirect, 301];
36
54
  return redirectResponse(event, redir[0], redir[1]);