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

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,17 @@
1
1
  # @forge/manifest
2
2
 
3
+ ## 4.3.0-next.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 47a47a4: Update manifest definitions
8
+
9
+ ## 4.3.0-next.2
10
+
11
+ ### Minor Changes
12
+
13
+ - 0871a3b: Added validation for Confluence keyboard shortcuts to disallow multiple non-modifier keys and enforce that modifier keys precede the main key being modified.
14
+
3
15
  ## 4.2.1-next.1
4
16
 
5
17
  ### Patch Changes
@@ -172,11 +172,6 @@
172
172
  "title": "function",
173
173
  "type": "string"
174
174
  },
175
- "predicate": {
176
- "$ref": "#/definitions/predicate",
177
- "title": "predicate",
178
- "description": "The predicate to match against the event payload. Follows the JSON Predicates spec: https://tools.ietf.org/html/draft-snell-json-test-07"
179
- },
180
175
  "key": {
181
176
  "$ref": "#/definitions/ModuleKeySchema"
182
177
  }
@@ -12560,96 +12555,6 @@
12560
12555
  "title": "Array",
12561
12556
  "type": "array"
12562
12557
  },
12563
- "ArrayPredicate": {
12564
- "additionalProperties": false,
12565
- "properties": {
12566
- "op": {
12567
- "enum": [
12568
- "in",
12569
- "in-"
12570
- ],
12571
- "title": "op",
12572
- "type": "string"
12573
- },
12574
- "path": {
12575
- "$ref": "#/definitions/Path",
12576
- "title": "path"
12577
- },
12578
- "pathType": {
12579
- "$ref": "#/definitions/PathType",
12580
- "title": "pathType"
12581
- },
12582
- "value": {
12583
- "$ref": "#/definitions/Array_1",
12584
- "title": "value"
12585
- }
12586
- },
12587
- "required": [
12588
- "op",
12589
- "path",
12590
- "value"
12591
- ],
12592
- "title": "ArrayPredicate",
12593
- "type": "object"
12594
- },
12595
- "Array_1": {
12596
- "items": {},
12597
- "title": "Array_1",
12598
- "type": "array"
12599
- },
12600
- "Array_2": {
12601
- "items": {
12602
- "anyOf": [
12603
- {
12604
- "$ref": "#/definitions/StringPredicate"
12605
- },
12606
- {
12607
- "$ref": "#/definitions/NumberPredicate"
12608
- },
12609
- {
12610
- "$ref": "#/definitions/ArrayPredicate"
12611
- },
12612
- {
12613
- "$ref": "#/definitions/DefinedPredicate"
12614
- },
12615
- {
12616
- "$ref": "#/definitions/TestPredicate"
12617
- },
12618
- {
12619
- "$ref": "#/definitions/SecondOrderPredicate"
12620
- }
12621
- ]
12622
- },
12623
- "title": "Array_2",
12624
- "type": "array"
12625
- },
12626
- "DefinedPredicate": {
12627
- "additionalProperties": false,
12628
- "properties": {
12629
- "op": {
12630
- "enum": [
12631
- "defined",
12632
- "undefined"
12633
- ],
12634
- "title": "op",
12635
- "type": "string"
12636
- },
12637
- "path": {
12638
- "$ref": "#/definitions/Path",
12639
- "title": "path"
12640
- },
12641
- "pathType": {
12642
- "$ref": "#/definitions/PathType",
12643
- "title": "pathType"
12644
- }
12645
- },
12646
- "required": [
12647
- "op",
12648
- "path"
12649
- ],
12650
- "title": "DefinedPredicate",
12651
- "type": "object"
12652
- },
12653
12558
  "ExtensionKey": {
12654
12559
  "description": "The key for an extension in CaaS. That means that this is a reference to another\nextension in your descriptor / manifest.\n\nThis key is defined in: https://bitbucket.org/atlassian/connect-service/src/cd7252b/service/cs-apps/api.raml#lines-1094",
12655
12560
  "maxLength": 255,
@@ -12658,397 +12563,6 @@
12658
12563
  "title": "ExtensionKey",
12659
12564
  "type": "string"
12660
12565
  },
12661
- "NumberPredicate": {
12662
- "additionalProperties": false,
12663
- "properties": {
12664
- "op": {
12665
- "enum": [
12666
- "less",
12667
- "more"
12668
- ],
12669
- "title": "op",
12670
- "type": "string"
12671
- },
12672
- "path": {
12673
- "$ref": "#/definitions/Path",
12674
- "title": "path"
12675
- },
12676
- "pathType": {
12677
- "$ref": "#/definitions/PathType",
12678
- "title": "pathType"
12679
- },
12680
- "value": {
12681
- "title": "value",
12682
- "type": "number"
12683
- }
12684
- },
12685
- "required": [
12686
- "op",
12687
- "path",
12688
- "value"
12689
- ],
12690
- "title": "NumberPredicate",
12691
- "type": "object"
12692
- },
12693
- "Path": {
12694
- "maxLength": 250,
12695
- "minLength": 1,
12696
- "title": "Path",
12697
- "type": "string"
12698
- },
12699
- "PathType": {
12700
- "default": "jsonPointer",
12701
- "enum": [
12702
- "jsonPath",
12703
- "jsonPointer"
12704
- ],
12705
- "title": "PathType",
12706
- "type": "string"
12707
- },
12708
- "Path_1": {
12709
- "maxLength": 250,
12710
- "minLength": 1,
12711
- "title": "Path_1",
12712
- "type": "string"
12713
- },
12714
- "Predicate": {
12715
- "anyOf": [
12716
- {
12717
- "$ref": "#/definitions/StringPredicate"
12718
- },
12719
- {
12720
- "$ref": "#/definitions/NumberPredicate"
12721
- },
12722
- {
12723
- "$ref": "#/definitions/ArrayPredicate"
12724
- },
12725
- {
12726
- "$ref": "#/definitions/DefinedPredicate"
12727
- },
12728
- {
12729
- "$ref": "#/definitions/TestPredicate"
12730
- },
12731
- {
12732
- "$ref": "#/definitions/SecondOrderPredicate"
12733
- }
12734
- ],
12735
- "title": "Predicate"
12736
- },
12737
- "SecondOrderPredicate": {
12738
- "additionalProperties": false,
12739
- "properties": {
12740
- "apply": {
12741
- "$ref": "#/definitions/Array_2",
12742
- "minItems": 1,
12743
- "title": "apply"
12744
- },
12745
- "op": {
12746
- "enum": [
12747
- "and",
12748
- "not",
12749
- "or"
12750
- ],
12751
- "title": "op",
12752
- "type": "string"
12753
- },
12754
- "path": {
12755
- "$ref": "#/definitions/Path_1",
12756
- "title": "path"
12757
- },
12758
- "pathType": {
12759
- "$ref": "#/definitions/PathType",
12760
- "title": "pathType"
12761
- }
12762
- },
12763
- "required": [
12764
- "apply",
12765
- "op"
12766
- ],
12767
- "title": "SecondOrderPredicate",
12768
- "type": "object"
12769
- },
12770
- "StringPredicate": {
12771
- "additionalProperties": false,
12772
- "properties": {
12773
- "op": {
12774
- "$ref": "#/definitions/StringPredicateOp",
12775
- "title": "op"
12776
- },
12777
- "path": {
12778
- "$ref": "#/definitions/Path",
12779
- "title": "path"
12780
- },
12781
- "pathType": {
12782
- "$ref": "#/definitions/PathType",
12783
- "title": "pathType"
12784
- },
12785
- "value": {
12786
- "title": "value",
12787
- "type": "string"
12788
- }
12789
- },
12790
- "required": [
12791
- "op",
12792
- "path",
12793
- "value"
12794
- ],
12795
- "title": "StringPredicate",
12796
- "type": "object"
12797
- },
12798
- "StringPredicateOp": {
12799
- "enum": [
12800
- "contains",
12801
- "contains-",
12802
- "ends",
12803
- "ends-",
12804
- "matches",
12805
- "matches-",
12806
- "starts",
12807
- "starts-"
12808
- ],
12809
- "title": "StringPredicateOp",
12810
- "type": "string"
12811
- },
12812
- "TestPredicate": {
12813
- "additionalProperties": false,
12814
- "properties": {
12815
- "op": {
12816
- "enum": [
12817
- "test",
12818
- "test-"
12819
- ],
12820
- "title": "op",
12821
- "type": "string"
12822
- },
12823
- "path": {
12824
- "$ref": "#/definitions/Path",
12825
- "title": "path"
12826
- },
12827
- "pathType": {
12828
- "$ref": "#/definitions/PathType",
12829
- "title": "pathType"
12830
- },
12831
- "value": {
12832
- "description": "This is the value that you are testing against. It can be anything, this is too permissive.",
12833
- "title": "value"
12834
- }
12835
- },
12836
- "required": [
12837
- "op",
12838
- "path",
12839
- "value"
12840
- ],
12841
- "title": "TestPredicate",
12842
- "type": "object"
12843
- },
12844
- "path": {
12845
- "type": "string",
12846
- "maxLength": 250,
12847
- "minLength": 1
12848
- },
12849
- "pathType": {
12850
- "enum": [
12851
- "jsonPointer",
12852
- "jsonPath"
12853
- ],
12854
- "default": "jsonPointer"
12855
- },
12856
- "predicate": {
12857
- "oneOf": [
12858
- {
12859
- "$ref": "#/definitions/firstOrderPredicate"
12860
- },
12861
- {
12862
- "$ref": "#/definitions/secondOrderPredicate"
12863
- }
12864
- ]
12865
- },
12866
- "testPredicate": {
12867
- "type": "object",
12868
- "title": "TestPredicate",
12869
- "required": [
12870
- "op",
12871
- "path",
12872
- "value"
12873
- ],
12874
- "properties": {
12875
- "op": {
12876
- "enum": [
12877
- "test",
12878
- "test-"
12879
- ]
12880
- },
12881
- "path": {
12882
- "$ref": "#/definitions/path"
12883
- },
12884
- "value": {},
12885
- "pathType": {
12886
- "$ref": "#/definitions/pathType"
12887
- }
12888
- },
12889
- "additionalProperties": false
12890
- },
12891
- "arrayPredicate": {
12892
- "type": "object",
12893
- "title": "ArrayPredicate",
12894
- "required": [
12895
- "op",
12896
- "path",
12897
- "value"
12898
- ],
12899
- "properties": {
12900
- "op": {
12901
- "enum": [
12902
- "in",
12903
- "in-"
12904
- ]
12905
- },
12906
- "path": {
12907
- "$ref": "#/definitions/path"
12908
- },
12909
- "value": {
12910
- "type": "array"
12911
- },
12912
- "pathType": {
12913
- "$ref": "#/definitions/pathType"
12914
- }
12915
- },
12916
- "additionalProperties": false
12917
- },
12918
- "numberPredicate": {
12919
- "type": "object",
12920
- "title": "NumberPredicate",
12921
- "required": [
12922
- "op",
12923
- "path",
12924
- "value"
12925
- ],
12926
- "properties": {
12927
- "op": {
12928
- "enum": [
12929
- "less",
12930
- "more"
12931
- ]
12932
- },
12933
- "path": {
12934
- "$ref": "#/definitions/path"
12935
- },
12936
- "value": {
12937
- "type": "number"
12938
- },
12939
- "pathType": {
12940
- "$ref": "#/definitions/pathType"
12941
- }
12942
- },
12943
- "additionalProperties": false
12944
- },
12945
- "stringPredicate": {
12946
- "type": "object",
12947
- "title": "StringPredicate",
12948
- "required": [
12949
- "op",
12950
- "path",
12951
- "value"
12952
- ],
12953
- "properties": {
12954
- "op": {
12955
- "enum": [
12956
- "contains",
12957
- "contains-",
12958
- "ends",
12959
- "ends-",
12960
- "matches",
12961
- "matches-",
12962
- "starts",
12963
- "starts-"
12964
- ]
12965
- },
12966
- "path": {
12967
- "$ref": "#/definitions/path"
12968
- },
12969
- "value": {
12970
- "type": "string"
12971
- },
12972
- "pathType": {
12973
- "$ref": "#/definitions/pathType"
12974
- }
12975
- },
12976
- "additionalProperties": false
12977
- },
12978
- "definedPredicate": {
12979
- "type": "object",
12980
- "title": "DefinedPredicate",
12981
- "required": [
12982
- "op",
12983
- "path"
12984
- ],
12985
- "properties": {
12986
- "op": {
12987
- "enum": [
12988
- "defined",
12989
- "undefined"
12990
- ]
12991
- },
12992
- "path": {
12993
- "$ref": "#/definitions/path"
12994
- },
12995
- "pathType": {
12996
- "$ref": "#/definitions/pathType"
12997
- }
12998
- },
12999
- "additionalProperties": false
13000
- },
13001
- "firstOrderPredicate": {
13002
- "oneOf": [
13003
- {
13004
- "$ref": "#/definitions/stringPredicate"
13005
- },
13006
- {
13007
- "$ref": "#/definitions/numberPredicate"
13008
- },
13009
- {
13010
- "$ref": "#/definitions/arrayPredicate"
13011
- },
13012
- {
13013
- "$ref": "#/definitions/definedPredicate"
13014
- },
13015
- {
13016
- "$ref": "#/definitions/testPredicate"
13017
- }
13018
- ],
13019
- "title": "FirstOrderPredicate"
13020
- },
13021
- "secondOrderPredicate": {
13022
- "type": "object",
13023
- "title": "SecondOrderPredicate",
13024
- "required": [
13025
- "op",
13026
- "apply"
13027
- ],
13028
- "properties": {
13029
- "op": {
13030
- "enum": [
13031
- "and",
13032
- "or",
13033
- "not"
13034
- ]
13035
- },
13036
- "path": {
13037
- "$ref": "#/definitions/path"
13038
- },
13039
- "apply": {
13040
- "type": "array",
13041
- "items": {
13042
- "$ref": "#/definitions/predicate"
13043
- },
13044
- "minItems": 1
13045
- },
13046
- "pathType": {
13047
- "$ref": "#/definitions/pathType"
13048
- }
13049
- },
13050
- "additionalProperties": false
13051
- },
13052
12566
  "ProductEvents": {
13053
12567
  "$ref": "#/definitions/Array",
13054
12568
  "title": "ProductEvents",
@@ -48,14 +48,6 @@ export type FilteredProductEvents = {
48
48
  * This key is defined in: https://bitbucket.org/atlassian/connect-service/src/cd7252b/service/cs-apps/api.raml#lines-1094
49
49
  */
50
50
  export type Function = string;
51
- /**
52
- * The predicate to match against the event payload. Follows the JSON Predicates spec: https://tools.ietf.org/html/draft-snell-json-test-07
53
- */
54
- export type Predicate1 = FirstOrderPredicate | SecondOrderPredicate;
55
- export type FirstOrderPredicate = StringPredicate | NumberPredicate | ArrayPredicate | DefinedPredicate | TestPredicate;
56
- export type Path = string;
57
- export type PathType = 'jsonPointer' | 'jsonPath';
58
- export type Predicate = FirstOrderPredicate | SecondOrderPredicate;
59
51
  /**
60
52
  * The key of the function that should be invoked for this webtrigger.
61
53
  */
@@ -188,13 +180,11 @@ export interface Modules {
188
180
  {
189
181
  events: Events;
190
182
  function: Function;
191
- predicate?: Predicate1;
192
183
  key: ModuleKeySchema;
193
184
  },
194
185
  ...{
195
186
  events: Events;
196
187
  function: Function;
197
- predicate?: Predicate1;
198
188
  key: ModuleKeySchema;
199
189
  }[]
200
190
  ];
@@ -5230,41 +5220,6 @@ export interface Filter {
5230
5220
  ignoreSelf: IgnoreSelf;
5231
5221
  [k: string]: unknown;
5232
5222
  }
5233
- export interface StringPredicate {
5234
- op: 'contains' | 'contains-' | 'ends' | 'ends-' | 'matches' | 'matches-' | 'starts' | 'starts-';
5235
- path: Path;
5236
- value: string;
5237
- pathType?: PathType;
5238
- }
5239
- export interface NumberPredicate {
5240
- op: 'less' | 'more';
5241
- path: Path;
5242
- value: number;
5243
- pathType?: PathType;
5244
- }
5245
- export interface ArrayPredicate {
5246
- op: 'in' | 'in-';
5247
- path: Path;
5248
- value: unknown[];
5249
- pathType?: PathType;
5250
- }
5251
- export interface DefinedPredicate {
5252
- op: 'defined' | 'undefined';
5253
- path: Path;
5254
- pathType?: PathType;
5255
- }
5256
- export interface TestPredicate {
5257
- op: 'test' | 'test-';
5258
- path: Path;
5259
- value: unknown;
5260
- pathType?: PathType;
5261
- }
5262
- export interface SecondOrderPredicate {
5263
- op: 'and' | 'or' | 'not';
5264
- path?: Path;
5265
- apply: [Predicate, ...Predicate[]];
5266
- pathType?: PathType;
5267
- }
5268
5223
  export interface DisplayConditions {
5269
5224
  componentTypes: ComponentTypes;
5270
5225
  }
@@ -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.3",
4
4
  "description": "Definitions and validations of the Forge manifest",
5
5
  "main": "out/index.js",
6
6
  "scripts": {