UNPKG

@sketch-hq/sketch-assistant-utils

Version:

Utility functions and types for Sketch Assistants.

66 lines (65 loc) 3.48 kB
import { getRuleDefinition } from '../../assistant/'; /** * Prune ignored pages that are no longer present in a SketchFile. */ export const prunePages = (ignore, file) => { const ids = file.contents.document.pages.map((page) => page.do_objectID); return Object.assign(Object.assign({}, ignore), { pages: ignore.pages.filter((id) => ids.includes(id)) }); }; /** * Prune ignore directives that relate to Assistants not present in an AssistantPackageMap. */ export const pruneAssistants = (ignore, assistants) => (Object.assign(Object.assign({}, ignore), { assistants: Object.keys(ignore.assistants) .filter((assistantName) => assistantName in assistants) .reduce((acc, assistantName) => (Object.assign(Object.assign({}, acc), { [assistantName]: ignore.assistants[assistantName] })), {}) })); /** * Prune ignored rules not present in an Assistant Definition. */ export const pruneRules = (ignore, assistant) => { if (!(assistant.name in ignore.assistants)) return ignore; return Object.assign(Object.assign({}, ignore), { assistants: Object.assign(Object.assign({}, ignore.assistants), { [assistant.name]: Object.assign(Object.assign({}, ignore.assistants[assistant.name]), { rules: Object.keys(ignore.assistants[assistant.name].rules) .filter((ruleName) => !!getRuleDefinition(assistant, ruleName)) .reduce((rules, ruleName) => (Object.assign(Object.assign({}, rules), { [ruleName]: ignore.assistants[assistant.name].rules[ruleName] })), {}) }) }) }); }; /** * Prune ignored objects not present in a ProcessedSketchFile. */ export const pruneObjects = (ignore, processedFile) => (Object.assign(Object.assign({}, ignore), { assistants: Object.keys(ignore.assistants).reduce((assistants, assistantName) => (Object.assign(Object.assign({}, assistants), { [assistantName]: Object.assign(Object.assign({}, ignore.assistants[assistantName]), { rules: Object.keys(ignore.assistants[assistantName].rules).reduce((rules, ruleName) => { const ruleIgnore = ignore.assistants[assistantName].rules[ruleName]; return Object.assign(Object.assign({}, rules), { [ruleName]: 'objects' in ruleIgnore ? Object.assign(Object.assign({}, ruleIgnore), { objects: ruleIgnore.objects.filter((id) => processedFile.objectIds.has(id)) }) : ruleIgnore }); }, {}) }) })), {}) })); /** * Determine whether a given rule is full ignored, according to a IgnoreConfig. Full ignored means * it both has an entry, and has been set to { allObjects: true }. */ export const isRuleFullIgnored = (ignore, assistantName, ruleName) => { if (!(assistantName in ignore.assistants)) return false; if (!(ruleName in ignore.assistants[assistantName].rules)) return false; const ruleIgnore = ignore.assistants[assistantName].rules[ruleName]; if ('allObjects' in ruleIgnore) { return !!ruleIgnore.allObjects; } else { return false; } }; /** * Return the set of ignored objects for a rule. */ export const getIgnoredObjectIdsForRule = (ignore, assistantName, ruleName) => { if (!(assistantName in ignore.assistants)) return []; if (!(ruleName in ignore.assistants[assistantName].rules)) return []; const ignoreState = ignore.assistants[assistantName].rules[ruleName]; if ('objects' in ignoreState) { return ignoreState.objects; } else { return []; } };