UNPKG

@sketch-hq/sketch-assistant-utils

Version:

Utility functions and types for Sketch Assistants.

226 lines (225 loc) 10.7 kB
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 { resolve } from 'path'; import { runAssistant } from '..'; import { getImageMetadata } from '../../../get-image-metadata'; import { process } from '../../../process'; import { createAssistantConfig, createAssistantDefinition, createRule } from '../../../test-helpers'; const testRunAssistant = (config, rule, ignoreConfig = { pages: [], assistants: {} }, ruleTimeout = Infinity) => __awaiter(void 0, void 0, void 0, function* () { const op = { cancelled: false }; const file = yield fromFile(resolve(__dirname, './empty.sketch')); const processedFile = yield process(file, op); const assistant = createAssistantDefinition({ rules: rule ? [rule] : [], config }); const env = { locale: '', runtime: AssistantRuntime.Node }; return yield runAssistant(processedFile, assistant, env, op, getImageMetadata, ignoreConfig, ruleTimeout); }); describe('runAssistant', () => { test('skips unconfigured rules', () => __awaiter(void 0, void 0, void 0, function* () { expect.assertions(2); const { ruleErrors, violations } = yield testRunAssistant(createAssistantConfig(), createRule()); expect(violations).toHaveLength(0); expect(ruleErrors).toHaveLength(0); })); test('can produce violations', () => __awaiter(void 0, void 0, void 0, function* () { expect.assertions(2); const { ruleErrors, violations } = yield testRunAssistant(createAssistantConfig({ rules: { rule: { active: true }, }, }), createRule({ name: 'rule', rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () { ruleContext.utils.report('Something went wrong'); }), })); expect(violations).toHaveLength(1); expect(ruleErrors).toHaveLength(0); })); test('skips rules that dont match the current platform', () => __awaiter(void 0, void 0, void 0, function* () { expect.assertions(2); const { ruleErrors, violations } = yield testRunAssistant(createAssistantConfig({ rules: { rule: { active: true }, }, }), createRule({ name: 'rule', runtime: AssistantRuntime.Sketch, rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () { ruleContext.utils.report('Something went wrong'); }), })); expect(violations).toHaveLength(0); expect(ruleErrors).toHaveLength(0); })); test('includes metadata in the result', () => __awaiter(void 0, void 0, void 0, function* () { expect.assertions(3); const { ruleErrors, metadata } = yield testRunAssistant(createAssistantConfig({ rules: { rule: { active: true }, }, }), createRule({ name: 'rule' })); expect(metadata.assistant.name).toMatchInlineSnapshot(`"dummy-assistant"`); expect(Object.keys(metadata.rules)).toMatchInlineSnapshot(` Array [ "rule", ] `); expect(ruleErrors).toHaveLength(0); })); test('config values can be interpolated into rule metadata', () => __awaiter(void 0, void 0, void 0, function* () { expect.assertions(2); const { ruleErrors, metadata } = yield testRunAssistant(createAssistantConfig({ rules: { rule: { active: true, subspaceFrequency: 12 }, }, }), createRule({ name: 'rule', title: (ruleConfig) => `Subspace frequency should be ${ruleConfig.subspaceFrequency}Hz`, })); expect(ruleErrors).toHaveLength(0); expect(metadata.rules['rule'].title).toMatchInlineSnapshot(`"Subspace frequency should be 12Hz"`); })); test('configs can set a custom title', () => __awaiter(void 0, void 0, void 0, function* () { expect.assertions(2); const { ruleErrors, metadata } = yield testRunAssistant(createAssistantConfig({ rules: { rule: { active: true, ruleTitle: 'Warp speed should not exceed 9.9' }, }, }), createRule({ name: 'rule', })); expect(ruleErrors).toHaveLength(0); expect(metadata.rules['rule'].title).toMatchInlineSnapshot(`"Warp speed should not exceed 9.9"`); })); test('skips inactive rules', () => __awaiter(void 0, void 0, void 0, function* () { expect.assertions(2); const { ruleErrors, violations } = yield testRunAssistant(createAssistantConfig({ rules: { rule: { active: false }, }, }), createRule({ name: 'rule', rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () { ruleContext.utils.report('Something went wrong'); }), })); expect(violations).toHaveLength(0); expect(ruleErrors).toHaveLength(0); })); test('skips full ignored rules', () => __awaiter(void 0, void 0, void 0, function* () { const { ruleErrors, violations } = yield testRunAssistant(createAssistantConfig({ rules: { rule: { active: true }, }, }), createRule({ name: 'rule', rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () { ruleContext.utils.report('Something went wrong'); }), }), { pages: [], assistants: { 'dummy-assistant': { rules: { rule: { allObjects: true } } } } }); expect(violations).toHaveLength(0); expect(ruleErrors).toHaveLength(0); })); test('object and rule combinations can be ignored', () => __awaiter(void 0, void 0, void 0, function* () { const { ruleErrors, violations } = yield testRunAssistant(createAssistantConfig({ rules: { rule: { active: true }, }, }), createRule({ name: 'rule', rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () { for (const page of ruleContext.utils.objects.page) { ruleContext.utils.report('Something went wrong', page); } }), }), { pages: [], assistants: { 'dummy-assistant': { rules: { rule: { objects: ['9AD22B94-A05B-4F49-8EDD-A38D62BD6181'] } }, }, }, }); expect(violations).toHaveLength(0); expect(ruleErrors).toHaveLength(0); })); test('isObjectIgnoredForRule works', () => __awaiter(void 0, void 0, void 0, function* () { const { ruleErrors, violations } = yield testRunAssistant(createAssistantConfig({ rules: { rule: { active: true }, }, }), createRule({ name: 'rule', rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () { const page = ruleContext.file.original.contents.document.pages[0]; if (!ruleContext.utils.isObjectIgnored(page)) { ruleContext.utils.report('Something went wrong', page); } }), }), { pages: [], assistants: { 'dummy-assistant': { rules: { rule: { objects: ['9AD22B94-A05B-4F49-8EDD-A38D62BD6181'] } }, }, }, }); expect(violations).toHaveLength(0); expect(ruleErrors).toHaveLength(0); })); test('can produce rule errors', () => __awaiter(void 0, void 0, void 0, function* () { expect.assertions(2); const { ruleErrors, violations } = yield testRunAssistant(createAssistantConfig({ rules: { rule: { active: true } } }), createRule({ name: 'rule', rule: () => __awaiter(void 0, void 0, void 0, function* () { throw new Error('Bang!'); }), })); expect(violations).toHaveLength(0); expect(ruleErrors).toHaveLength(1); })); test('can produce rule errors during iteration', () => __awaiter(void 0, void 0, void 0, function* () { expect.assertions(2); const { ruleErrors, violations } = yield testRunAssistant(createAssistantConfig({ rules: { rule: { active: true } } }), createRule({ name: 'rule', rule: (context) => __awaiter(void 0, void 0, void 0, function* () { for (const page of context.utils.objects.page) { throw Error(`Page ${page.name} looks wonky`); } }), })); expect(violations).toHaveLength(0); expect(ruleErrors).toHaveLength(1); })); test('can produce rule errors for bad config', () => __awaiter(void 0, void 0, void 0, function* () { expect.assertions(2); const { ruleErrors, violations } = yield testRunAssistant(createAssistantConfig({ rules: { rule: { active: true } } }), createRule({ name: 'rule', rule: (ruleContext) => __awaiter(void 0, void 0, void 0, function* () { ruleContext.utils.getOption('warpFieldIntegrity'); }), })); expect(violations).toHaveLength(0); expect(ruleErrors).toHaveLength(1); })); test('can produce rule errors from rule timeouts', () => __awaiter(void 0, void 0, void 0, function* () { expect.assertions(2); const { ruleErrors, violations } = yield testRunAssistant(createAssistantConfig({ rules: { rule: { active: true } } }), createRule({ name: 'rule', rule: () => __awaiter(void 0, void 0, void 0, function* () { yield new Promise((resolve) => setTimeout(resolve, 10)); }), }), { pages: [], assistants: {} }, 0); expect(violations).toHaveLength(0); expect(ruleErrors[0]).toHaveProperty('code', 'timeout'); })); });