@sketch-hq/sketch-assistant-utils
Version:
Utility functions and types for Sketch Assistants.
119 lines (118 loc) • 5.55 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { AssistantRuntime, } from '@sketch-hq/sketch-assistant-types';
import { fromFile } from '@sketch-hq/sketch-file';
import { getRuleDefinition, prepare } from '../assistant';
import { getImageMetadata } from '../get-image-metadata';
import { process } from '../process';
import { runAssistant } from '../run/run-assistant';
/**
* Create a dummy rule definition.
*/
const createRule = ({ title, description, rule, getOptions, name, debug, runtime, } = {}) => ({
name: name !== null && name !== void 0 ? name : 'dummy-assistant/dummy-rule',
title: title !== null && title !== void 0 ? title : 'Dummy Rule',
description: description !== null && description !== void 0 ? description : 'Dummy rule created in a test helper',
rule: rule || (() => __awaiter(void 0, void 0, void 0, function* () { })),
getOptions,
debug,
runtime,
});
/**
* Create a dummy assistant configuration.
*/
const createAssistantConfig = ({ rules, defaultSeverity, } = {}) => (Object.assign(Object.assign({}, (typeof defaultSeverity === 'undefined' ? {} : { defaultSeverity })), { rules: rules || {} }));
/**
* Create a dummy assistant definition.
*/
const createAssistantDefinition = ({ name, config, rules, } = {}) => ({
name: name !== null && name !== void 0 ? name : 'dummy-assistant',
config: config || createAssistantConfig(),
rules: rules || [],
});
/**
* Create a dummy assistant function.
*/
const createAssistant = ({ title, description, name, config, rules, } = {}) => () => __awaiter(void 0, void 0, void 0, function* () { return createAssistantDefinition({ title, description, name, config, rules }); });
const createDummyRect = () => ({
_class: 'rect',
constrainProportions: false,
height: 10,
width: 10,
x: 0,
y: 0,
});
const createDummySwatch = (id = '1') => ({
_class: 'swatch',
do_objectID: id,
name: 'dummy-swatch',
value: {
_class: 'color',
alpha: 1,
red: 1,
blue: 1,
green: 1,
},
});
/**
* Test an Assistant.
*/
const testAssistant = (filepath, assistant, env = { locale: 'en', runtime: AssistantRuntime.Node }) => __awaiter(void 0, void 0, void 0, function* () {
const file = yield fromFile(filepath);
const op = { cancelled: false };
const processedFile = yield process(file, op);
const def = yield prepare(assistant, env);
const { violations, ruleErrors, grade } = yield runAssistant(processedFile, def, env, op, getImageMetadata, { pages: [], assistants: {} }, Infinity);
return { violations, ruleErrors, grade };
});
/**
* Test a rule by running it against a custom config within the context of a
* temporary Assistant.
*/
const testRule = (filepath, rule, ruleConfig = { active: true }, env = { locale: 'en', runtime: AssistantRuntime.Node }) => __awaiter(void 0, void 0, void 0, function* () {
const file = yield fromFile(filepath);
const op = { cancelled: false };
const processedFile = yield process(file, op);
const assistant = () => __awaiter(void 0, void 0, void 0, function* () {
return ({
name: 'test-assistant',
rules: [rule],
config: {
rules: {
[rule.name]: ruleConfig,
},
},
});
});
const def = yield prepare(assistant, env);
const { violations, ruleErrors, grade } = yield runAssistant(processedFile, def, env, op, getImageMetadata, { pages: [], assistants: {} }, Infinity);
return { violations, ruleErrors, grade };
});
/**
* Test a rule in isolation within the context of an Assistant. Only the rule under test is
* activated, so violations or rule errors from other rules are ignored. A custom rule config can
* be supplied, but if omitted the config currently configured in the Assistant is used.
*/
const testRuleInAssistant = (filepath, assistant, ruleName, ruleConfig, env = { locale: 'en', runtime: AssistantRuntime.Node }) => __awaiter(void 0, void 0, void 0, function* () {
const file = yield fromFile(filepath);
const op = { cancelled: false };
const processedFile = yield process(file, op);
const def = yield prepare(assistant, env);
def.rules = def.rules.filter((rule) => rule.name === ruleName);
if (!getRuleDefinition(def, ruleName)) {
throw new Error(`Rule "${ruleName}" not found on Assistant "${def.name}"`);
}
def.config.rules = {
[ruleName]: ruleConfig ? ruleConfig : def.config.rules[ruleName],
};
const { violations, ruleErrors, grade } = yield runAssistant(processedFile, def, env, op, getImageMetadata, { pages: [], assistants: {} }, Infinity);
return { violations, ruleErrors, grade };
});
export { createRule, createDummyRect, createDummySwatch, createAssistantConfig, createAssistant, createAssistantDefinition, testRule, testRuleInAssistant, testAssistant, };