@graphql-inspector/action
Version:
GraphQL Inspector functionality for GitHub Actions
40 lines (39 loc) • 1.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.considerUsage = void 0;
const tslib_1 = require("tslib");
const path_js_1 = require("../../utils/path.js");
const change_js_1 = require("./../changes/change.js");
const considerUsage = ({ changes, config }) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
if (!config) {
throw new Error(`considerUsage rule is missing config`);
}
const collectedBreakingField = [];
for (const change of changes) {
if (change.criticality.level === change_js_1.CriticalityLevel.Breaking && change.path) {
const [typeName, fieldName, argumentName] = (0, path_js_1.parsePath)(change.path);
collectedBreakingField.push({
type: typeName,
field: fieldName,
argument: argumentName,
});
}
}
// True if safe to break, false otherwise
const usageList = yield config.checkUsage(collectedBreakingField);
// turns an array of booleans into an array of `Type.Field` strings
// includes only those that are safe to break the api
const suppressedPaths = collectedBreakingField
.filter((_, i) => usageList[i] === true)
.map(({ type, field, argument }) => [type, field, argument].filter(Boolean).join('.'));
return changes.map(change => {
// Turns those "safe to break" changes into "dangerous"
if (change.criticality.level === change_js_1.CriticalityLevel.Breaking &&
change.path &&
suppressedPaths.some(p => change.path.startsWith(p))) {
return Object.assign(Object.assign({}, change), { criticality: Object.assign(Object.assign({}, change.criticality), { level: change_js_1.CriticalityLevel.Dangerous, isSafeBasedOnUsage: true }), message: `${change.message} (non-breaking based on usage)` });
}
return change;
});
});
exports.considerUsage = considerUsage;