UNPKG

@sketch-hq/sketch-assistant-utils

Version:

Utility functions and types for Sketch Assistants.

228 lines (227 loc) 11.3 kB
"use strict"; 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()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const sketch_assistant_types_1 = require("@sketch-hq/sketch-assistant-types"); const sketch_file_1 = require("@sketch-hq/sketch-file"); const path_1 = require("path"); const __1 = require(".."); const get_image_metadata_1 = require("../../../get-image-metadata"); const process_1 = require("../../../process"); const test_helpers_1 = require("../../../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 sketch_file_1.fromFile(path_1.resolve(__dirname, './empty.sketch')); const processedFile = yield process_1.process(file, op); const assistant = test_helpers_1.createAssistantDefinition({ rules: rule ? [rule] : [], config }); const env = { locale: '', runtime: sketch_assistant_types_1.AssistantRuntime.Node }; return yield __1.runAssistant(processedFile, assistant, env, op, get_image_metadata_1.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(test_helpers_1.createAssistantConfig(), test_helpers_1.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(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true }, }, }), test_helpers_1.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(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true }, }, }), test_helpers_1.createRule({ name: 'rule', runtime: sketch_assistant_types_1.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(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true }, }, }), test_helpers_1.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(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true, subspaceFrequency: 12 }, }, }), test_helpers_1.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(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true, ruleTitle: 'Warp speed should not exceed 9.9' }, }, }), test_helpers_1.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(test_helpers_1.createAssistantConfig({ rules: { rule: { active: false }, }, }), test_helpers_1.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(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true }, }, }), test_helpers_1.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(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true }, }, }), test_helpers_1.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(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true }, }, }), test_helpers_1.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(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true } } }), test_helpers_1.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(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true } } }), test_helpers_1.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(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true } } }), test_helpers_1.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(test_helpers_1.createAssistantConfig({ rules: { rule: { active: true } } }), test_helpers_1.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'); })); });