UNPKG

@netlify/content-engine

Version:
234 lines 8.3 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.setLogs = exports.activityTick = exports.setActivityTotal = exports.setActivityStatusText = exports.setActivityErrored = exports.updateActivity = exports.endActivity = exports.startActivity = exports.createPendingActivity = exports.createLog = exports.setStatus = void 0; const core_utils_1 = require("../../core-utils"); // import { trackCli } from "gatsby-telemetry" const signal_exit_1 = __importDefault(require("signal-exit")); const _1 = require("."); const constants_1 = require("../constants"); const utils_1 = require("./utils"); const ActivityStatusToLogLevel = { [constants_1.ActivityStatuses.Interrupted]: constants_1.ActivityLogLevels.Interrupted, [constants_1.ActivityStatuses.Failed]: constants_1.ActivityLogLevels.Failed, [constants_1.ActivityStatuses.Success]: constants_1.ActivityLogLevels.Success, }; let weShouldExit = false; (0, signal_exit_1.default)(() => { weShouldExit = true; }); let cancelDelayedSetStatus; let pendingStatus = ``; // We debounce "done" statuses because activities don't always overlap // and there is timing window after one activity ends and before next one starts // where technically we are "done" (all activities are done). // We don't want to emit multiple SET_STATUS events that would toggle between // IN_PROGRESS and SUCCESS/FAILED in short succession in those cases. const setStatus = (status, force = false) => (dispatch) => { const currentStatus = (0, _1.getStore)().getState().logs.status; if (cancelDelayedSetStatus) { cancelDelayedSetStatus(); cancelDelayedSetStatus = null; } if (status !== currentStatus && (status === constants_1.ActivityStatuses.InProgress || force || weShouldExit)) { dispatch({ type: constants_1.Actions.SetStatus, payload: status, }); pendingStatus = ``; } else { // use pending status if truthy, fallback to current status if we don't have pending status const pendingOrCurrentStatus = pendingStatus || currentStatus; if (status !== pendingOrCurrentStatus) { pendingStatus = status; cancelDelayedSetStatus = (0, utils_1.delayedCall)(() => { (0, exports.setStatus)(status, true)(dispatch); }, 1000); } } }; exports.setStatus = setStatus; const createLog = ({ level, text, statusText, duration, group, code, type, category, filePath, location, docsUrl, context, activity_current, activity_total, activity_type, activity_uuid, stack, pluginName, }) => { return { type: constants_1.Actions.Log, payload: { level, text: !text ? `\u2800` : text, statusText, duration, group, code, type, category, filePath, location, docsUrl, context, activity_current, activity_total, activity_type, activity_uuid, timestamp: new Date().toJSON(), stack, pluginName, }, }; }; exports.createLog = createLog; const createPendingActivity = ({ id, status = constants_1.ActivityStatuses.NotStarted, }) => { const globalStatus = (0, utils_1.getGlobalStatus)(id, status); return [ (0, exports.setStatus)(globalStatus), { type: constants_1.Actions.PendingActivity, payload: { id, type: constants_1.ActivityTypes.Pending, startTime: process.hrtime(), status, }, }, ]; }; exports.createPendingActivity = createPendingActivity; const startActivity = ({ id, text, type, status = constants_1.ActivityStatuses.InProgress, current, total, }) => { const globalStatus = (0, utils_1.getGlobalStatus)(id, status); return [ (0, exports.setStatus)(globalStatus), { type: constants_1.Actions.StartActivity, payload: { id, uuid: core_utils_1.uuid.v4(), text, type, status, startTime: process.hrtime(), statusText: ``, current, total, }, }, ]; }; exports.startActivity = startActivity; const endActivity = ({ id, status, }) => { const activity = (0, utils_1.getActivity)(id); if (!activity) { return null; } const actionsToEmit = []; const durationMS = (0, utils_1.getElapsedTimeMS)(activity); const durationS = durationMS / 1000; if (activity.type === constants_1.ActivityTypes.Pending) { actionsToEmit.push({ type: constants_1.Actions.CancelActivity, payload: { id, status: constants_1.ActivityStatuses.Cancelled, type: activity.type, duration: durationS, }, }); } else if (activity.status === constants_1.ActivityStatuses.InProgress) { // trackCli(`ACTIVITY_DURATION`, { // name: activity.text, // duration: Math.round(durationMS), // }) if (activity.errored) { status = constants_1.ActivityStatuses.Failed; } actionsToEmit.push({ type: constants_1.Actions.EndActivity, payload: { uuid: activity.uuid, id, status, duration: durationS, type: activity.type, }, }); if (activity.type !== constants_1.ActivityTypes.Hidden) { actionsToEmit.push((0, exports.createLog)({ text: activity.text, level: ActivityStatusToLogLevel[status], duration: durationS, statusText: activity.statusText || (status === constants_1.ActivityStatuses.Success && activity.type === constants_1.ActivityTypes.Progress ? `${activity.current}/${activity.total} ${((activity.total || 0) / durationS).toFixed(2)}/s` : undefined), activity_uuid: activity.uuid, activity_current: activity.current, activity_total: activity.total, activity_type: activity.type, })); } } const globalStatus = (0, utils_1.getGlobalStatus)(id, status); actionsToEmit.push((0, exports.setStatus)(globalStatus)); return actionsToEmit; }; exports.endActivity = endActivity; const updateActivity = ({ id = ``, ...rest }) => { const activity = (0, utils_1.getActivity)(id); if (!activity) { return null; } return { type: constants_1.Actions.UpdateActivity, payload: { uuid: activity.uuid, id, ...rest, }, }; }; exports.updateActivity = updateActivity; const setActivityErrored = ({ id, }) => { const activity = (0, utils_1.getActivity)(id); if (!activity) { return null; } return { type: constants_1.Actions.ActivityErrored, payload: { id, }, }; }; exports.setActivityErrored = setActivityErrored; const setActivityStatusText = ({ id, statusText, }) => (0, exports.updateActivity)({ id, statusText, }); exports.setActivityStatusText = setActivityStatusText; const setActivityTotal = ({ id, total, }) => (0, exports.updateActivity)({ id, total, }); exports.setActivityTotal = setActivityTotal; const activityTick = ({ id, increment = 1, }) => { const activity = (0, utils_1.getActivity)(id); if (!activity) { return null; } return (0, exports.updateActivity)({ id, current: (activity.current || 0) + increment, }); }; exports.activityTick = activityTick; const setLogs = (logs) => { return { type: constants_1.Actions.SetLogs, payload: logs, }; }; exports.setLogs = setLogs; //# sourceMappingURL=internal-actions.js.map