@forge/manifest 4.2.1-next.1 → 4.3.0-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @forge/manifest
2
2
 
3
+ ## 4.3.0-next.2
4
+
5
+ ### Minor Changes
6
+
7
+ - 0871a3b: Added validation for Confluence keyboard shortcuts to disallow multiple non-modifier keys and enforce that modifier keys precede the main key being modified.
8
+
3
9
  ## 4.2.1-next.1
4
10
 
5
11
  ### Patch Changes
@@ -44,8 +44,10 @@ export declare const errors: {
44
44
  emptyAccelerator: () => string;
45
45
  spaceAroundAccelerator: (accelerator: string) => string;
46
46
  invalidPlusSyntax: (accelerator: string) => string;
47
- invalidAcceleratorCombination: (accelerator: string) => string;
47
+ combinationKeysAreNotUnique: (accelerator: string) => string;
48
48
  invalidKey: (accelerator: string, key: string) => string;
49
+ moreThanOneNonModifierKey: (accelerator: string) => string;
50
+ modifierKeysShouldPrecedeNonModifierKey: (accelerator: string) => string;
49
51
  };
50
52
  };
51
53
  jiraWorkflowValidator: {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/text/errors.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM;8BACS,MAAM,KAAG,MAAM;2BACpB,MAAM;yBAEN,MAAM,GAAG,SAAS,QAAQ,MAAM,EAAE,UAAU,MAAM,GAAG,SAAS,KAAG,MAAM;;uBAO3E,MAAM,EAAE,EAAE,GAAG,SAAS,KAAG,MAAM;4BAI1B,MAAM,EAAE,KAAG,MAAM;mCACV,MAAM,SAAS,MAAM,0CAA4B,MAAM;mDAIvC,MAAM,KAAG,MAAM;;;qCAI7B,MAAM,SAAS,MAAM,KAAG,MAAM;4CAEvB,MAAM,SAAS,MAAM,KAAG,MAAM;wCAElC,MAAM,SAAS,MAAM,EAAE,KAAG,MAAM;;;uCAMjC,MAAM,KAAG,MAAM;oCACpB,MAAM;iCAEP,MAAM,KAAG,MAAM;4CACJ,MAAM,KAAG,MAAM;;;gCAG3B,MAAM,KAAG,MAAM;6BACpB,MAAM;+BACJ,MAAM;iCACF,MAAM,KAAG,MAAM;yCACP,MAAM,eAAe,MAAM,KAAG,MAAM;yCAEpC,MAAM,eAAe,MAAM,KAAG,MAAM;6CAEhC,MAAM,KAAG,MAAM;;yCAGrB,MAAM,KAAG,MAAM;iCAEvB,MAAM,KAAG,MAAM;4CACJ,MAAM,gBAAgB,MAAM,KAAG,MAAM;sCAE3C,MAAM,gBAAgB,MAAM,gBAAgB,MAAM,KAAG,MAAM;;;yCAIxD,MAAM,aAAa,MAAM,QAAQ,MAAM,EAAE,KAAG,MAAM;2CAIhD,MAAM,aAAa,MAAM,QAAQ,MAAM,EAAE,KAAG,MAAM;sDAEvC,MAAM,QAAQ,MAAM,EAAE,KAAG,MAAM;8DAEvB,MAAM,aAAa,MAAM,cAAc,MAAM,KAAG,MAAM;6EAEvC,MAAM,qBAAqB,MAAM,KAAG,MAAM;yEAE9C,MAAM,qBAAqB,MAAM,KAAG,MAAM;;wCAG/E,MAAM;sDACU,MAAM,KAAG,MAAM;iDAEpB,MAAM,KAAG,MAAM;6DAEH,MAAM,KAAG,MAAM;0CAElC,MAAM,OAAO,MAAM,KAAG,MAAM;;;;mCAKjC,MAAM,KAAG,MAAM;mCAEf,MAAM,KAAG,MAAM;;;qCAIb,MAAM,KAAG,MAAM;;;0CAIV,MAAM,KAAG,MAAM;;;mCAItB,MAAM,EAAE,KAAG,MAAM;;;qCAIf,MAAM,KAAG,MAAM;2CAET,MAAM,KAAG,MAAM;;;oCAGtB,MAAM,KAAG,MAAM;;oCAEjB,MAAM,SAAS,MAAM,KAAG,MAAM;qCAI7B,MAAM,YAAY,MAAM,KAAG,MAAM;;;;;mCAQ/B,MAAM,OAAO,MAAM,KAAG,MAAM;iCAE9B,MAAM,OAAO,MAAM,KAAG,MAAM;oCAEzB,MAAM,OAAO,MAAM,KAAG,MAAM;gDAEhB,MAAM,KAAG,MAAM;uCAExB,MAAM,KAAG,MAAM;;;;;;;;kCAQpB,MAAM,UAAU,MAAM,KAAG,MAAM;gCAEjC,MAAM,KAAG,MAAM;2CAEJ,MAAM,eAAe,MAAM,KAAG,MAAM;;;uCAI1C,MAAM;uCAEJ,MAAM,KAAG,MAAM;qCAEnB,MAAM;;CAGpC,CAAC;AAEF,oBAAY,UAAU;IACpB,eAAe,2BAA2B;IAC1C,eAAe,wBAAwB;IACvC,WAAW,4BAA4B;IACvC,WAAW,+BAA+B;IAC1C,aAAa,8BAA8B;IAC3C,OAAO,0BAA0B;IACjC,cAAc,kCAAkC;IAChD,mBAAmB,0BAA0B;IAC7C,SAAS,4BAA4B;IACrC,SAAS,4BAA4B;IACrC,UAAU,wBAAwB;IAClC,GAAG,8BAA8B;CAClC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/text/errors.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM;8BACS,MAAM,KAAG,MAAM;2BACpB,MAAM;yBAEN,MAAM,GAAG,SAAS,QAAQ,MAAM,EAAE,UAAU,MAAM,GAAG,SAAS,KAAG,MAAM;;uBAO3E,MAAM,EAAE,EAAE,GAAG,SAAS,KAAG,MAAM;4BAI1B,MAAM,EAAE,KAAG,MAAM;mCACV,MAAM,SAAS,MAAM,0CAA4B,MAAM;mDAIvC,MAAM,KAAG,MAAM;;;qCAI7B,MAAM,SAAS,MAAM,KAAG,MAAM;4CAEvB,MAAM,SAAS,MAAM,KAAG,MAAM;wCAElC,MAAM,SAAS,MAAM,EAAE,KAAG,MAAM;;;uCAMjC,MAAM,KAAG,MAAM;oCACpB,MAAM;iCAEP,MAAM,KAAG,MAAM;4CACJ,MAAM,KAAG,MAAM;;;gCAG3B,MAAM,KAAG,MAAM;6BACpB,MAAM;+BACJ,MAAM;iCACF,MAAM,KAAG,MAAM;yCACP,MAAM,eAAe,MAAM,KAAG,MAAM;yCAEpC,MAAM,eAAe,MAAM,KAAG,MAAM;6CAEhC,MAAM,KAAG,MAAM;;yCAGrB,MAAM,KAAG,MAAM;iCAEvB,MAAM,KAAG,MAAM;4CACJ,MAAM,gBAAgB,MAAM,KAAG,MAAM;sCAE3C,MAAM,gBAAgB,MAAM,gBAAgB,MAAM,KAAG,MAAM;;;yCAIxD,MAAM,aAAa,MAAM,QAAQ,MAAM,EAAE,KAAG,MAAM;2CAIhD,MAAM,aAAa,MAAM,QAAQ,MAAM,EAAE,KAAG,MAAM;sDAEvC,MAAM,QAAQ,MAAM,EAAE,KAAG,MAAM;8DAEvB,MAAM,aAAa,MAAM,cAAc,MAAM,KAAG,MAAM;6EAEvC,MAAM,qBAAqB,MAAM,KAAG,MAAM;yEAE9C,MAAM,qBAAqB,MAAM,KAAG,MAAM;;wCAG/E,MAAM;sDACU,MAAM,KAAG,MAAM;iDAEpB,MAAM,KAAG,MAAM;2DAEL,MAAM,KAAG,MAAM;0CAEhC,MAAM,OAAO,MAAM,KAAG,MAAM;yDAEb,MAAM,KAAG,MAAM;uEAED,MAAM,KAAG,MAAM;;;;mCAKjD,MAAM,KAAG,MAAM;mCAEf,MAAM,KAAG,MAAM;;;qCAIb,MAAM,KAAG,MAAM;;;0CAIV,MAAM,KAAG,MAAM;;;mCAItB,MAAM,EAAE,KAAG,MAAM;;;qCAIf,MAAM,KAAG,MAAM;2CAET,MAAM,KAAG,MAAM;;;oCAGtB,MAAM,KAAG,MAAM;;oCAEjB,MAAM,SAAS,MAAM,KAAG,MAAM;qCAI7B,MAAM,YAAY,MAAM,KAAG,MAAM;;;;;mCAQ/B,MAAM,OAAO,MAAM,KAAG,MAAM;iCAE9B,MAAM,OAAO,MAAM,KAAG,MAAM;oCAEzB,MAAM,OAAO,MAAM,KAAG,MAAM;gDAEhB,MAAM,KAAG,MAAM;uCAExB,MAAM,KAAG,MAAM;;;;;;;;kCAQpB,MAAM,UAAU,MAAM,KAAG,MAAM;gCAEjC,MAAM,KAAG,MAAM;2CAEJ,MAAM,eAAe,MAAM,KAAG,MAAM;;;uCAI1C,MAAM;uCAEJ,MAAM,KAAG,MAAM;qCAEnB,MAAM;;CAGpC,CAAC;AAEF,oBAAY,UAAU;IACpB,eAAe,2BAA2B;IAC1C,eAAe,wBAAwB;IACvC,WAAW,4BAA4B;IACvC,WAAW,+BAA+B;IAC1C,aAAa,8BAA8B;IAC3C,OAAO,0BAA0B;IACjC,cAAc,kCAAkC;IAChD,mBAAmB,0BAA0B;IAC7C,SAAS,4BAA4B;IACrC,SAAS,4BAA4B;IACrC,UAAU,wBAAwB;IAClC,GAAG,8BAA8B;CAClC"}
@@ -56,8 +56,10 @@ exports.errors = {
56
56
  emptyAccelerator: () => 'Keyboard shortcut accelerator must be defined and not be an empty string.',
57
57
  spaceAroundAccelerator: (accelerator) => `Keyboard shortcut accelerator must not have surrounding empty spaces. Accelerator issue found: [${accelerator}]`,
58
58
  invalidPlusSyntax: (accelerator) => `Keyboard shortcut accelerator must not be single "+" character or have empty spaces on left or right of "+" character. Accelerator issue found: [${accelerator}]`,
59
- invalidAcceleratorCombination: (accelerator) => `Keyboard shortcut accelerator combinations must have unique keys when joined with "+". Accelerator issue found: [${accelerator}]`,
60
- invalidKey: (accelerator, key) => `Keyboard shortcut accelerator key must be a valid named key, i.e. ctrl, command, or a single key. Accelerator issue found: [${accelerator}] with invalid key: [${key}]`
59
+ combinationKeysAreNotUnique: (accelerator) => `Keyboard shortcut accelerator combinations must have unique keys when joined with "+". Accelerator issue found: [${accelerator}]`,
60
+ invalidKey: (accelerator, key) => `Keyboard shortcut accelerator key must be a valid named key, i.e. ctrl, command, or a single key. Accelerator issue found: [${accelerator}] with invalid key: [${key}]`,
61
+ moreThanOneNonModifierKey: (accelerator) => `Keyboard shortcut accelerator combination is invalid. A valid accelerator combination should have a single key or a single key preceeded with one or more modifiers, i.e. ctrl, shift, command. Accelerator issue found: [${accelerator}]`,
62
+ modifierKeysShouldPrecedeNonModifierKey: (accelerator) => `Keyboard shortcut accelerator modifier keys should precede the key being modified. Instead of "a+ctrl", one should specify the accelerator as "ctrl+a". Accelerator issue found: [${accelerator}]`
61
63
  }
62
64
  },
63
65
  jiraWorkflowValidator: {
@@ -1 +1 @@
1
- {"version":3,"file":"validateKeyboardShortcuts.d.ts","sourceRoot":"","sources":["../../../../src/validators/modules-validators/confluence/validateKeyboardShortcuts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAwHnD,eAAO,MAAM,yBAAyB,eAAgB,OAAO,+CAAiC,eAAe,EAwB5G,CAAC"}
1
+ {"version":3,"file":"validateKeyboardShortcuts.d.ts","sourceRoot":"","sources":["../../../../src/validators/modules-validators/confluence/validateKeyboardShortcuts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAuJnD,eAAO,MAAM,yBAAyB,eAAgB,OAAO,+CAAiC,eAAe,EAwB5G,CAAC"}
@@ -5,7 +5,8 @@ const text_1 = require("../../../text");
5
5
  const utils_1 = require("../../../utils");
6
6
  const VALID_SINGLE_KEY = new RegExp(/^[^+ ]$/);
7
7
  const INVALID_COMBINATION_SYNTAX = new RegExp(/(^\+$| \+|\+ )/);
8
- const VALID_NAMED_KEYS = new Set([
8
+ const MODIFIER_KEYS = new Set(['shift', 'ctrl', 'alt', 'option', 'meta', 'command', 'mod']);
9
+ const SPECIAL_KEYS = new Set([
9
10
  'f1',
10
11
  'f2',
11
12
  'f3',
@@ -18,13 +19,6 @@ const VALID_NAMED_KEYS = new Set([
18
19
  'f10',
19
20
  'f11',
20
21
  'f12',
21
- 'shift',
22
- 'ctrl',
23
- 'alt',
24
- 'option',
25
- 'meta',
26
- 'command',
27
- 'mod',
28
22
  'backspace',
29
23
  'tab',
30
24
  'enter',
@@ -45,51 +39,68 @@ const VALID_NAMED_KEYS = new Set([
45
39
  'space',
46
40
  'plus'
47
41
  ]);
42
+ const VALID_NAMED_KEYS = new Set([...MODIFIER_KEYS, ...SPECIAL_KEYS]);
43
+ const errorMessages = text_1.errors.modules.confluence.keyboardShortcuts;
48
44
  const isValidKey = (key) => VALID_NAMED_KEYS.has(key) || !!key.match(VALID_SINGLE_KEY);
49
- const validateShortcut = (moduleKey, accelerator) => {
50
- const keyboardShortcutErrors = [];
45
+ const mapToKeyboardShortcutError = (validationErrors, moduleKey) => validationErrors.map((message) => ({ moduleKey, message }));
46
+ const validateWhitespaceAndSyntax = (accelerator) => {
47
+ const validationErrors = [];
51
48
  if (!accelerator || accelerator.trim() === '') {
52
- keyboardShortcutErrors.push({
53
- moduleKey,
54
- message: text_1.errors.modules.confluence.keyboardShortcuts.emptyAccelerator()
55
- });
56
- return keyboardShortcutErrors;
49
+ validationErrors.push(errorMessages.emptyAccelerator());
57
50
  }
58
51
  else if (accelerator.startsWith(' ') || accelerator.endsWith(' ')) {
59
- keyboardShortcutErrors.push({
60
- moduleKey,
61
- message: text_1.errors.modules.confluence.keyboardShortcuts.spaceAroundAccelerator(accelerator)
62
- });
63
- return keyboardShortcutErrors;
52
+ validationErrors.push(errorMessages.spaceAroundAccelerator(accelerator));
64
53
  }
65
54
  else if (accelerator.match(INVALID_COMBINATION_SYNTAX)) {
66
- keyboardShortcutErrors.push({
67
- moduleKey,
68
- message: text_1.errors.modules.confluence.keyboardShortcuts.invalidPlusSyntax(accelerator)
69
- });
70
- return keyboardShortcutErrors;
55
+ validationErrors.push(errorMessages.invalidPlusSyntax(accelerator));
56
+ }
57
+ return validationErrors;
58
+ };
59
+ const modifierKeysPrecedeNonModifierKey = (modifierKeys, nonModifierKeys, keys) => {
60
+ if (modifierKeys.length && nonModifierKeys.length) {
61
+ const indexOfNonModifierKey = keys.indexOf(nonModifierKeys[0]);
62
+ const indexOfLastKey = keys.length - 1;
63
+ return indexOfNonModifierKey === indexOfLastKey;
64
+ }
65
+ return true;
66
+ };
67
+ const validateModifierKeys = (accelerator, keys) => {
68
+ const validationErrors = [];
69
+ const nonModifierKeys = keys.filter((key) => !MODIFIER_KEYS.has(key));
70
+ if (nonModifierKeys.length > 1) {
71
+ validationErrors.push(errorMessages.moreThanOneNonModifierKey(accelerator));
71
72
  }
73
+ const modifierKeys = keys.filter((key) => MODIFIER_KEYS.has(key));
74
+ if (!modifierKeysPrecedeNonModifierKey(modifierKeys, nonModifierKeys, keys)) {
75
+ validationErrors.push(errorMessages.modifierKeysShouldPrecedeNonModifierKey(accelerator));
76
+ }
77
+ return validationErrors;
78
+ };
79
+ const validateKeyCombinationsAndSequences = (accelerator) => {
80
+ const validationErrors = [];
72
81
  const sequence = accelerator.split(' ');
73
82
  for (const combination of sequence) {
74
83
  const keys = combination.split('+');
75
84
  const uniqueKeys = new Set(keys);
76
85
  const allDifferent = keys.length === uniqueKeys.size;
77
86
  if (!allDifferent) {
78
- keyboardShortcutErrors.push({
79
- moduleKey,
80
- message: text_1.errors.modules.confluence.keyboardShortcuts.invalidAcceleratorCombination(accelerator)
81
- });
87
+ validationErrors.push(errorMessages.combinationKeysAreNotUnique(accelerator));
82
88
  }
89
+ validationErrors.push(...validateModifierKeys(accelerator, [...uniqueKeys]));
83
90
  for (const key of keys) {
84
91
  if (!isValidKey(key)) {
85
- keyboardShortcutErrors.push({
86
- moduleKey,
87
- message: text_1.errors.modules.confluence.keyboardShortcuts.invalidKey(accelerator, key)
88
- });
92
+ validationErrors.push(errorMessages.invalidKey(accelerator, key));
89
93
  }
90
94
  }
91
95
  }
92
- return keyboardShortcutErrors;
96
+ return validationErrors;
97
+ };
98
+ const validateShortcut = (moduleKey, accelerator) => {
99
+ const whitespaceAndSyntaxErrors = validateWhitespaceAndSyntax(accelerator);
100
+ if (whitespaceAndSyntaxErrors.length) {
101
+ return mapToKeyboardShortcutError(whitespaceAndSyntaxErrors, moduleKey);
102
+ }
103
+ return mapToKeyboardShortcutError(validateKeyCombinationsAndSequences(accelerator), moduleKey);
93
104
  };
94
105
  exports.validateKeyboardShortcuts = (allModules, yamlContentByLine) => {
95
106
  const validationErrors = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forge/manifest",
3
- "version": "4.2.1-next.1",
3
+ "version": "4.3.0-next.2",
4
4
  "description": "Definitions and validations of the Forge manifest",
5
5
  "main": "out/index.js",
6
6
  "scripts": {