UNPKG

ness

Version:

✪ No-effort static sites deployed to your AWS account.

135 lines 16.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Destroy = void 0; const react_1 = __importStar(require("react")); const ink_1 = require("ink"); const Task_1 = require("./Task"); const context_1 = require("../context"); const aws_1 = require("../providers/aws"); const events = __importStar(require("../utils/events")); const csp_1 = require("../utils/csp"); const Destroy = () => { const context = (0, react_1.useContext)(context_1.NessContext); const { settings } = context; const { domain, dir, csp } = settings || {}; const [error, setError] = (0, react_1.useState)(); const track = async (event, detail = '') => { await events.emit({ event, command: 'destroy', detail, domain: domain || '', options: settings || {}, }); }; const handleError = async (stack, error) => { const reason = await (0, aws_1.getCloudFormationFailureReason)((0, context_1.getStackId)(stack)); setError(`${error}${reason ? `:\n\n${reason}` : ''}`); }; const destroy = async () => { track('started'); const webStack = (0, context_1.getStackId)('web'); const webStackOutputs = await (0, aws_1.getCloudFormationStackOutputs)(webStack); if (!webStackOutputs) { setError("Couldn't find site. Are you sure you've deployed (from this branch)?"); return Task_1.TaskState.Failure; } try { await (0, aws_1.clearS3Bucket)(webStackOutputs.BucketName); } catch (error) { if (error instanceof Error) { track('error', error.message); } } // We first have to deploy the web stack without the certificate so that it // removes the dependency on the alias stack. const stack = await (0, aws_1.getStack)('web', { DomainName: domain, RedirectSubDomainNameWithDot: (settings === null || settings === void 0 ? void 0 : settings.redirectWww) ? 'www.' : undefined, DefaultRootObject: settings === null || settings === void 0 ? void 0 : settings.indexDocument, DefaultErrorObject: (settings === null || settings === void 0 ? void 0 : settings.spa) ? settings === null || settings === void 0 ? void 0 : settings.indexDocument : settings === null || settings === void 0 ? void 0 : settings.errorDocument, DefaultErrorResponseCode: (settings === null || settings === void 0 ? void 0 : settings.spa) ? '200' : '404', IncludeCloudFrontAlias: 'false', ContentSecurityPolicy: csp && csp !== 'auto' ? csp : await (0, csp_1.generateCsp)(dir), }); await (0, aws_1.deployStack)({ stack }); try { await (0, aws_1.deleteCloudFormationStack)((0, context_1.getStackId)('alias')); } catch (error) { if (error instanceof Error) { track('error', error.message); } handleError('alias', 'Unable to delete site'); return Task_1.TaskState.Failure; } // We first have to delete so that it goes to DELETE_FAILED, then we can // specify the resources to retain (the edge lambdas) try { await (0, aws_1.deleteCloudFormationStack)(webStack); } catch (error) { if (error instanceof Error) { track('error', error.message); } } try { await (0, aws_1.deleteCloudFormationStack)(webStack, ['ViewerRequestFunction', 'OriginResponseFunction']); } catch (error) { if (error instanceof Error) { track('error', error.message); } handleError('web', 'Unable to delete site'); return Task_1.TaskState.Failure; } try { await (0, aws_1.deleteCloudFormationStack)((0, context_1.getStackId)('domain')); } catch (error) { if (error instanceof Error) { track('error', error.message); } handleError('domain', 'Unable to delete site'); return Task_1.TaskState.Failure; } try { await (0, aws_1.deleteCloudFormationStack)((0, context_1.getStackId)('support')); } catch (error) { if (error instanceof Error) { track('error', error.message); } handleError('support', 'Unable to delete site'); return Task_1.TaskState.Failure; } track('finished'); return Task_1.TaskState.Success; }; return (react_1.default.createElement(ink_1.Box, { flexDirection: 'column' }, react_1.default.createElement(Task_1.Task, { name: 'Destroying site', note: '\u2615 this could take a while', action: destroy }), error && (react_1.default.createElement(ink_1.Box, { paddingTop: 1 }, react_1.default.createElement(ink_1.Text, { color: 'red' }, error))))); }; exports.Destroy = Destroy; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVzdHJveS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL0Rlc3Ryb3kudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUQ7QUFDakQsNkJBQTZCO0FBQzdCLGlDQUFzQztBQUN0Qyx3Q0FBa0Q7QUFDbEQsMENBT3lCO0FBQ3pCLHdEQUF5QztBQUN6QyxzQ0FBd0M7QUFFakMsTUFBTSxPQUFPLEdBQTRCLEdBQUcsRUFBRTtJQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFBLGtCQUFVLEVBQUMscUJBQVcsQ0FBQyxDQUFBO0lBQ3ZDLE1BQU0sRUFBQyxRQUFRLEVBQUMsR0FBRyxPQUFPLENBQUE7SUFDMUIsTUFBTSxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFDLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQTtJQUV6QyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUEsZ0JBQVEsR0FBVSxDQUFBO0lBRTVDLE1BQU0sS0FBSyxHQUFHLEtBQUssRUFBRSxLQUFhLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxFQUFFO1FBQ2pELE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQztZQUNoQixLQUFLO1lBQ0wsT0FBTyxFQUFFLFNBQVM7WUFDbEIsTUFBTTtZQUNOLE1BQU0sRUFBRSxNQUFNLElBQUksRUFBRTtZQUNwQixPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUU7U0FDeEIsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFBO0lBRUQsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLEtBQWEsRUFBRSxLQUFhLEVBQUUsRUFBRTtRQUN6RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsb0NBQThCLEVBQUMsSUFBQSxvQkFBVSxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDdEUsUUFBUSxDQUFDLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFD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RUFBQyxNQUFNLEVBQUUsT0FBTyxHQUFJO1FBRWhGLEtBQUssSUFBSSxDQUNSLDhCQUFDLFNBQUcsSUFBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQiw4QkFBQyxVQUFJLElBQUMsS0FBSyxFQUFDLEtBQUssSUFBRSxLQUFLLENBQVEsQ0FDNUIsQ0FDUCxDQUNHLENBQ1AsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQXpIWSxRQUFBLE9BQU8sV0F5SG5CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7dXNlQ29udGV4dCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHtCb3gsIFRleHR9IGZyb20gJ2luaydcbmltcG9ydCB7VGFzaywgVGFza1N0YXRlfSBmcm9tICcuL1Rhc2snXG5pbXBvcnQge2dldFN0YWNrSWQsIE5lc3NDb250ZXh0fSBmcm9tICcuLi9jb250ZXh0J1xuaW1wb3J0IHtcbiAgY2xlYXJTM0J1Y2tldCxcbiAgZGVsZXRlQ2xvdWRGb3JtYXRpb25TdGFjayxcbiAgZGVwbG95U3RhY2ssXG4gIGdldENsb3VkRm9ybWF0aW9uRmFpbHVyZVJlYXNvbixcbiAgZ2V0Q2xvdWRGb3JtYXRpb25TdGFja091dHB1dHMsXG4gIGdldFN0YWNrLFxufSBmcm9tICcuLi9wcm92aWRlcnMvYXdzJ1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJy4uL3V0aWxzL2V2ZW50cydcbmltcG9ydCB7Z2VuZXJhdGVDc3B9IGZyb20gJy4uL3V0aWxzL2NzcCdcblxuZXhwb3J0IGNvbnN0IERlc3Ryb3k6IFJlYWN0LkZ1bmN0aW9uQ29tcG9uZW50ID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChOZXNzQ29udGV4dClcbiAgY29uc3Qge3NldHRpbmdzfSA9IGNvbnRleHRcbiAgY29uc3Qge2RvbWFpbiwgZGlyLCBjc3B9ID0gc2V0dGluZ3MgfHwge31cblxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZz4oKVxuXG4gIGNvbnN0IHRyYWNrID0gYXN5bmMgKGV2ZW50OiBzdHJpbmcsIGRldGFpbCA9ICcnKSA9PiB7XG4gICAgYXdhaXQgZXZlbnRzLmVtaXQoe1xuICAgICAgZXZlbnQsXG4gICAgICBjb21tYW5kOiAnZGVzdHJveScsXG4gICAgICBkZXRhaWwsXG4gICAgICBkb21haW46IGRvbWFpbiB8fCAnJyxcbiAgICAgIG9wdGlvbnM6IHNldHRpbmdzIHx8IHt9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBoYW5kbGVFcnJvciA9IGFzeW5jIChzdGFjazogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVhc29uID0gYXdhaXQgZ2V0Q2xvdWRGb3JtYXRpb25GYWlsdXJlUmVhc29uKGdldFN0YWNrSWQoc3RhY2spKVxuICAgIHNldEVycm9yKGAke2Vycm9yfSR7cmVhc29uID8gYDpcXG5cXG4ke3JlYXNvbn1gIDogJyd9YClcbiAgfVxuXG4gIGNvbnN0IGRlc3Ryb3k6ICgpID0+IFByb21pc2U8VGFza1N0YXRlPiA9IGFzeW5jICgpID0+IHtcbiAgICB0cmFjaygnc3RhcnRlZCcpXG5cbiAgICBjb25zdCB3ZWJTdGFjayA9IGdldFN0YWNrSWQoJ3dlYicpXG5cbiAgICBjb25zdCB3ZWJTdGFja091dHB1dHMgPSBhd2FpdCBnZXRDbG91ZEZvcm1hdGlvblN0YWNrT3V0cHV0cyh3ZWJTdGFjaylcbiAgICBpZiAoIXdlYlN0YWNrT3V0cHV0cykge1xuICAgICAgc2V0RXJyb3IoXCJDb3VsZG4ndCBmaW5kIHNpdGUuIEFyZSB5b3Ugc3VyZSB5b3UndmUgZGVwbG95ZWQgKGZyb20gdGhpcyBicmFuY2gpP1wiKVxuICAgICAgcmV0dXJuIFRhc2tTdGF0ZS5GYWlsdXJlXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsZWFyUzNCdWNrZXQod2ViU3RhY2tPdXRwdXRzIS5CdWNrZXROYW1lKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0cmFjaygnZXJyb3InLCBlcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIGZpcnN0IGhhdmUgdG8gZGVwbG95IHRoZSB3ZWIgc3RhY2sgd2l0aG91dCB0aGUgY2VydGlmaWNhdGUgc28gdGhhdCBpdFxuICAgIC8vIHJlbW92ZXMgdGhlIGRlcGVuZGVuY3kgb24gdGhlIGFsaWFzIHN0YWNrLlxuICAgIGNvbnN0IHN0YWNrID0gYXdhaXQgZ2V0U3RhY2soJ3dlYicsIHtcbiAgICAgIERvbWFpbk5hbWU6IGRvbWFpbixcbiAgICAgIFJlZGlyZWN0U3ViRG9tYWluTmFtZVdpdGhEb3Q6IHNldHRpbmdzPy5yZWRpcmVjdFd3dyA/ICd3d3cuJyA6IHVuZGVmaW5lZCxcbiAgICAgIERlZmF1bHRSb290T2JqZWN0OiBzZXR0aW5ncz8uaW5kZXhEb2N1bWVudCxcbiAgICAgIERlZmF1bHRFcnJvck9iamVjdDogc2V0dGluZ3M/LnNwYSA/IHNldHRpbmdzPy5pbmRleERvY3VtZW50IDogc2V0dGluZ3M/LmVycm9yRG9jdW1lbnQsXG4gICAgICBEZWZhdWx0RXJyb3JSZXNwb25zZUNvZGU6IHNldHRpbmdzPy5zcGEgPyAnMjAwJyA6ICc0MDQnLFxuICAgICAgSW5jbHVkZUNsb3VkRnJvbnRBbGlhczogJ2ZhbHNlJyxcbiAgICAgIENvbnRlbnRTZWN1cml0eVBvbGljeTogY3NwICYmIGNzcCAhPT0gJ2F1dG8nID8gY3NwIDogYXdhaXQgZ2VuZXJhdGVDc3AoZGlyISksXG4gICAgfSlcblxuICAgIGF3YWl0IGRlcGxveVN0YWNrKHtzdGFja30pXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGVsZXRlQ2xvdWRGb3JtYXRpb25TdGFjayhnZXRTdGFja0lkKCdhbGlhcycpKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0cmFjaygnZXJyb3InLCBlcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgICAgaGFuZGxlRXJyb3IoJ2FsaWFzJywgJ1VuYWJsZSB0byBkZWxldGUgc2l0ZScpXG4gICAgICByZXR1cm4gVGFza1N0YXRlLkZhaWx1cmVcbiAgICB9XG5cbiAgICAvLyBXZSBmaXJzdCBoYXZlIHRvIGRlbGV0ZSBzbyB0aGF0IGl0IGdvZXMgdG8gREVMRVRFX0ZBSUxFRCwgdGhlbiB3ZSBjYW5cbiAgICAvLyBzcGVjaWZ5IHRoZSByZXNvdXJjZXMgdG8gcmV0YWluICh0aGUgZWRnZSBsYW1iZGFzKVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkZWxldGVDbG91ZEZvcm1hdGlvblN0YWNrKHdlYlN0YWNrKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0cmFjaygnZXJyb3InLCBlcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkZWxldGVDbG91ZEZvcm1hdGlvblN0YWNrKHdlYlN0YWNrLCBbJ1ZpZXdlclJlcXVlc3RGdW5jdGlvbicsICdPcmlnaW5SZXNwb25zZUZ1bmN0aW9uJ10pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRyYWNrKCdlcnJvcicsIGVycm9yLm1lc3NhZ2UpXG4gICAgICB9XG4gICAgICBoYW5kbGVFcnJvcignd2ViJywgJ1VuYWJsZSB0byBkZWxldGUgc2l0ZScpXG4gICAgICByZXR1cm4gVGFza1N0YXRlLkZhaWx1cmVcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGVsZXRlQ2xvdWRGb3JtYXRpb25TdGFjayhnZXRTdGFja0lkKCdkb21haW4nKSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdHJhY2soJ2Vycm9yJywgZXJyb3IubWVzc2FnZSlcbiAgICAgIH1cbiAgICAgIGhhbmRsZUVycm9yKCdkb21haW4nLCAnVW5hYmxlIHRvIGRlbGV0ZSBzaXRlJylcbiAgICAgIHJldHVybiBUYXNrU3RhdGUuRmFpbHVyZVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkZWxldGVDbG91ZEZvcm1hdGlvblN0YWNrKGdldFN0YWNrSWQoJ3N1cHBvcnQnKSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdHJhY2soJ2Vycm9yJywgZXJyb3IubWVzc2FnZSlcbiAgICAgIH1cbiAgICAgIGhhbmRsZUVycm9yKCdzdXBwb3J0JywgJ1VuYWJsZSB0byBkZWxldGUgc2l0ZScpXG4gICAgICByZXR1cm4gVGFza1N0YXRlLkZhaWx1cmVcbiAgICB9XG5cbiAgICB0cmFjaygnZmluaXNoZWQnKVxuXG4gICAgcmV0dXJuIFRhc2tTdGF0ZS5TdWNjZXNzXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj0nY29sdW1uJz5cbiAgICAgIDxUYXNrIG5hbWU9J0Rlc3Ryb3lpbmcgc2l0ZScgbm90ZT0n4piVIHRoaXMgY291bGQgdGFrZSBhIHdoaWxlJyBhY3Rpb249e2Rlc3Ryb3l9IC8+XG5cbiAgICAgIHtlcnJvciAmJiAoXG4gICAgICAgIDxCb3ggcGFkZGluZ1RvcD17MX0+XG4gICAgICAgICAgPFRleHQgY29sb3I9J3JlZCc+e2Vycm9yfTwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuICAgIDwvQm94PlxuICApXG59XG4iXX0=