@forge/manifest 0.0.0-experimental-e1cefc4 → 0.0.0-experimental-29a2cc1

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.
Files changed (52) hide show
  1. package/CHANGELOG.md +183 -2
  2. package/out/index.d.ts +1 -0
  3. package/out/index.d.ts.map +1 -1
  4. package/out/index.js +1 -0
  5. package/out/mapping/product-event-to-scope-mapping.json +110 -61
  6. package/out/processor/full-validation-processor.d.ts.map +1 -1
  7. package/out/processor/full-validation-processor.js +0 -2
  8. package/out/schema/manifest-schema.json +504 -3
  9. package/out/schema/manifest.d.ts +221 -1
  10. package/out/scopes/deprecated-shipyard-scopes.json +1 -24
  11. package/out/scopes/index.d.ts +7 -0
  12. package/out/scopes/index.d.ts.map +1 -0
  13. package/out/scopes/index.js +22 -0
  14. package/out/scopes/shipyard-scopes.json +22 -0
  15. package/out/text/errors.d.ts +12 -1
  16. package/out/text/errors.d.ts.map +1 -1
  17. package/out/text/errors.js +12 -1
  18. package/out/types/module-types.d.ts +7 -1
  19. package/out/types/module-types.d.ts.map +1 -1
  20. package/out/types/module-types.js +7 -1
  21. package/out/utils/get-all-modules.d.ts +3 -0
  22. package/out/utils/get-all-modules.d.ts.map +1 -0
  23. package/out/utils/get-all-modules.js +4 -0
  24. package/out/utils/index.d.ts +1 -0
  25. package/out/utils/index.d.ts.map +1 -1
  26. package/out/utils/index.js +1 -0
  27. package/out/validators/modules-validator.js +2 -2
  28. package/out/validators/modules-validators/confluence/index.d.ts.map +1 -1
  29. package/out/validators/modules-validators/confluence/index.js +6 -0
  30. package/out/validators/modules-validators/confluence/validateCrossModulePropertyUniqueness.d.ts +4 -0
  31. package/out/validators/modules-validators/confluence/validateCrossModulePropertyUniqueness.d.ts.map +1 -0
  32. package/out/validators/modules-validators/confluence/validateCrossModulePropertyUniqueness.js +19 -0
  33. package/out/validators/modules-validators/confluence/validateCustomContentHierarchy.d.ts +4 -0
  34. package/out/validators/modules-validators/confluence/validateCustomContentHierarchy.d.ts.map +1 -0
  35. package/out/validators/modules-validators/confluence/validateCustomContentHierarchy.js +43 -0
  36. package/out/validators/modules-validators/confluence/validateKeyboardShortcuts.d.ts +4 -0
  37. package/out/validators/modules-validators/confluence/validateKeyboardShortcuts.d.ts.map +1 -0
  38. package/out/validators/modules-validators/confluence/validateKeyboardShortcuts.js +102 -0
  39. package/out/validators/modules-validators/confluence/validatePropertyUniqueness.d.ts.map +1 -1
  40. package/out/validators/modules-validators/confluence/validatePropertyUniqueness.js +1 -1
  41. package/out/validators/modules-validators/confluence/validateSingleProperty.d.ts.map +1 -1
  42. package/out/validators/modules-validators/jira/{issue-adjustment.d.ts → ui-modifications.d.ts} +2 -2
  43. package/out/validators/modules-validators/jira/ui-modifications.d.ts.map +1 -0
  44. package/out/validators/modules-validators/jira/{issue-adjustment.js → ui-modifications.js} +4 -4
  45. package/out/validators/product-trigger-scopes-validator.d.ts +2 -4
  46. package/out/validators/product-trigger-scopes-validator.d.ts.map +1 -1
  47. package/out/validators/product-trigger-scopes-validator.js +7 -21
  48. package/package.json +2 -1
  49. package/out/validators/deprecated-permissions-validator.d.ts +0 -7
  50. package/out/validators/deprecated-permissions-validator.d.ts.map +0 -1
  51. package/out/validators/deprecated-permissions-validator.js +0 -31
  52. package/out/validators/modules-validators/jira/issue-adjustment.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateCrossModulePropertyUniqueness.d.ts","sourceRoot":"","sources":["../../../../src/validators/modules-validators/confluence/validateCrossModulePropertyUniqueness.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AASnD,eAAO,MAAM,qCAAqC,eACpC,OAAO,YACT,MAAM,+CAEf,eAAe,EAuBjB,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateCrossModulePropertyUniqueness = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const get_1 = tslib_1.__importDefault(require("lodash/get"));
6
+ const text_1 = require("../../../text");
7
+ const utils_1 = require("../../../utils");
8
+ exports.validateCrossModulePropertyUniqueness = (allModules, property, yamlContentByLine) => {
9
+ var _a;
10
+ const validationErrors = [];
11
+ const modules = utils_1.getAllModules(allModules) || [];
12
+ const allPropertyValues = modules.map((module) => get_1.default(module, property)).filter((propertyValue) => propertyValue);
13
+ const duplicatePropertyValues = allPropertyValues.filter((propertyValue, index, all) => all.indexOf(propertyValue) !== index);
14
+ if (duplicatePropertyValues.length > 0) {
15
+ const allModulesWithDuplicatedPropertyValues = modules.filter((module) => get_1.default(module, property) === duplicatePropertyValues[0]);
16
+ validationErrors.push(Object.assign({ message: text_1.errors.modules.confluence.crossModulePropertyUniqueness(property, duplicatePropertyValues), reference: text_1.References.Modules, level: 'error' }, utils_1.findPosition((_a = allModulesWithDuplicatedPropertyValues === null || allModulesWithDuplicatedPropertyValues === void 0 ? void 0 : allModulesWithDuplicatedPropertyValues[0]) === null || _a === void 0 ? void 0 : _a.key, yamlContentByLine)));
17
+ }
18
+ return validationErrors;
19
+ };
@@ -0,0 +1,4 @@
1
+ import { AllModuleTypes, ValidationError } from '../../../types';
2
+ import { Modules } from '../../../schema/manifest';
3
+ export declare const validateCustomContentHierarchy: (allModules: Modules, moduleType: AllModuleTypes, yamlContentByLine?: string[] | undefined) => ValidationError[];
4
+ //# sourceMappingURL=validateCustomContentHierarchy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateCustomContentHierarchy.d.ts","sourceRoot":"","sources":["../../../../src/validators/modules-validators/confluence/validateCustomContentHierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAInD,eAAO,MAAM,8BAA8B,eAC7B,OAAO,cACP,cAAc,+CAEzB,eAAe,EAyDjB,CAAC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateCustomContentHierarchy = void 0;
4
+ const text_1 = require("../../../text");
5
+ const utils_1 = require("../../../utils");
6
+ const INNER_TYPE_PREFIX = 'this:';
7
+ exports.validateCustomContentHierarchy = (allModules, moduleType, yamlContentByLine) => {
8
+ const validationErrors = [];
9
+ const modules = allModules[moduleType] || [];
10
+ modules.forEach((module) => {
11
+ const supportedContainerTypes = module.supportedContainerTypes || [];
12
+ const supportedChildTypes = module.supportedChildTypes || [];
13
+ [
14
+ {
15
+ propName: 'supportedContainerTypes',
16
+ propInnerValues: supportedContainerTypes.filter((supportedContainerType) => supportedContainerType.startsWith(INNER_TYPE_PREFIX)),
17
+ dependentPropName: 'supportedChildTypes',
18
+ dependentReferenceMissingMessage: text_1.errors.modules.confluence.validateCustomContentCrossReferenceMissingContainer
19
+ },
20
+ {
21
+ propName: 'supportedChildTypes',
22
+ propInnerValues: supportedChildTypes.filter((supportedChildType) => supportedChildType.startsWith(INNER_TYPE_PREFIX)),
23
+ dependentPropName: 'supportedContainerTypes',
24
+ dependentReferenceMissingMessage: text_1.errors.modules.confluence.validateCustomContentCrossReferenceMissingChild
25
+ }
26
+ ].forEach(({ propName, propInnerValues, dependentPropName, dependentReferenceMissingMessage }) => {
27
+ propInnerValues.forEach((value) => {
28
+ const referredModuleName = value.substring(INNER_TYPE_PREFIX.length);
29
+ const referredModule = modules.find((m) => m.key === referredModuleName);
30
+ if (!referredModule) {
31
+ validationErrors.push(Object.assign({ message: text_1.errors.modules.confluence.validateCustomContentHierarchyUnknown(propName, module.key, referredModuleName), reference: text_1.References.Modules, level: 'error' }, utils_1.findPosition(module.key, yamlContentByLine)));
32
+ }
33
+ else {
34
+ const referredModuleDependentPropValues = referredModule[dependentPropName] || [];
35
+ if (!referredModuleDependentPropValues.includes(`${INNER_TYPE_PREFIX}${module.key}`)) {
36
+ validationErrors.push(Object.assign({ message: dependentReferenceMissingMessage(module.key, referredModule.key), reference: text_1.References.Modules, level: 'error' }, utils_1.findPosition(module.key, yamlContentByLine)));
37
+ }
38
+ }
39
+ });
40
+ });
41
+ });
42
+ return validationErrors;
43
+ };
@@ -0,0 +1,4 @@
1
+ import { ValidationError } from '../../../types';
2
+ import { Modules } from '../../../schema/manifest';
3
+ export declare const validateKeyboardShortcuts: (allModules: Modules, yamlContentByLine?: string[] | undefined) => ValidationError[];
4
+ //# sourceMappingURL=validateKeyboardShortcuts.d.ts.map
@@ -0,0 +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;AAgHnD,eAAO,MAAM,yBAAyB,eAAgB,OAAO,+CAAiC,eAAe,EAsB5G,CAAC"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateKeyboardShortcuts = void 0;
4
+ const text_1 = require("../../../text");
5
+ const utils_1 = require("../../../utils");
6
+ const VALID_SINGLE_KEY = new RegExp(/^[^+ ]$/);
7
+ const INVALID_COMBINATION_SYNTAX = new RegExp(/(^\+$| \+|\+ )/);
8
+ const VALID_NAMED_KEYS = new Set([
9
+ 'f1',
10
+ 'f2',
11
+ 'f3',
12
+ 'f4',
13
+ 'f5',
14
+ 'f6',
15
+ 'f7',
16
+ 'f8',
17
+ 'f9',
18
+ 'f10',
19
+ 'f11',
20
+ 'f12',
21
+ 'shift',
22
+ 'ctrl',
23
+ 'alt',
24
+ 'option',
25
+ 'meta',
26
+ 'command',
27
+ 'mod',
28
+ 'backspace',
29
+ 'tab',
30
+ 'enter',
31
+ 'return',
32
+ 'capslock',
33
+ 'esc',
34
+ 'escape',
35
+ 'pageup',
36
+ 'pagedown',
37
+ 'end',
38
+ 'home',
39
+ 'left',
40
+ 'up',
41
+ 'right',
42
+ 'down',
43
+ 'ins',
44
+ 'del',
45
+ 'space',
46
+ 'plus'
47
+ ]);
48
+ const isValidKey = (key) => VALID_NAMED_KEYS.has(key) || !!key.match(VALID_SINGLE_KEY);
49
+ const validateShortcut = (moduleKey, accelerator) => {
50
+ const keyboardShortcutErrors = [];
51
+ if (!accelerator || accelerator.trim() === '') {
52
+ keyboardShortcutErrors.push({
53
+ moduleKey,
54
+ message: text_1.errors.modules.confluence.keyboardShortcuts.emptyAccelerator()
55
+ });
56
+ return keyboardShortcutErrors;
57
+ }
58
+ 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;
64
+ }
65
+ 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;
71
+ }
72
+ const sequence = accelerator.split(' ');
73
+ for (const combination of sequence) {
74
+ const keys = combination.split('+');
75
+ const uniqueKeys = new Set(keys);
76
+ const allDifferent = keys.length === uniqueKeys.size;
77
+ if (!allDifferent) {
78
+ keyboardShortcutErrors.push({
79
+ moduleKey,
80
+ message: text_1.errors.modules.confluence.keyboardShortcuts.invalidAcceleratorCombination(accelerator)
81
+ });
82
+ }
83
+ for (const key of keys) {
84
+ if (!isValidKey(key)) {
85
+ keyboardShortcutErrors.push({
86
+ moduleKey,
87
+ message: text_1.errors.modules.confluence.keyboardShortcuts.invalidKey(accelerator, key)
88
+ });
89
+ }
90
+ }
91
+ }
92
+ return keyboardShortcutErrors;
93
+ };
94
+ exports.validateKeyboardShortcuts = (allModules, yamlContentByLine) => {
95
+ const validationErrors = [];
96
+ const modules = utils_1.getAllModules(allModules) || [];
97
+ const modulesWithKeyboardShortcut = modules.filter((module) => { var _a; return (_a = module === null || module === void 0 ? void 0 : module.keyboardShortcut) === null || _a === void 0 ? void 0 : _a.accelerator; });
98
+ if (modulesWithKeyboardShortcut.length > 0) {
99
+ modulesWithKeyboardShortcut.forEach((m) => validationErrors.push(...validateShortcut(m.key, m.keyboardShortcut.accelerator).map((e) => (Object.assign({ message: e.message, reference: text_1.References.Modules, level: 'error' }, utils_1.findPosition(e.moduleKey, yamlContentByLine))))));
100
+ }
101
+ return validationErrors;
102
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"validatePropertyUniqueness.d.ts","sourceRoot":"","sources":["../../../../src/validators/modules-validators/confluence/validatePropertyUniqueness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,eAAO,MAAM,0BAA0B,eACzB,OAAO,cACP,cAAc,YAChB,MAAM,+CAEf,eAAe,EAqBjB,CAAC"}
1
+ {"version":3,"file":"validatePropertyUniqueness.d.ts","sourceRoot":"","sources":["../../../../src/validators/modules-validators/confluence/validatePropertyUniqueness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAUnD,eAAO,MAAM,0BAA0B,eACzB,OAAO,cACP,cAAc,YAChB,MAAM,+CAEf,eAAe,EAqBjB,CAAC"}
@@ -11,7 +11,7 @@ exports.validatePropertyUniqueness = (allModules, moduleType, property, yamlCont
11
11
  const duplicatePropertyValues = allPropertyValues.filter((property, index, all) => all.indexOf(property) !== index);
12
12
  if (duplicatePropertyValues.length > 0) {
13
13
  const allModulesWithDuplicatedPropertyValues = modules.filter((module) => module[property] === duplicatePropertyValues[0]);
14
- validationErrors.push(Object.assign({ message: text_1.errors.modules.confluence.propertyUniquenessValidator(property, moduleType, duplicatePropertyValues), reference: text_1.References.Modules, level: 'error' }, utils_1.findPosition((_a = allModulesWithDuplicatedPropertyValues === null || allModulesWithDuplicatedPropertyValues === void 0 ? void 0 : allModulesWithDuplicatedPropertyValues[0]) === null || _a === void 0 ? void 0 : _a.key, yamlContentByLine)));
14
+ validationErrors.push(Object.assign({ message: text_1.errors.modules.confluence.propertyUniqueness(property, moduleType, duplicatePropertyValues), reference: text_1.References.Modules, level: 'error' }, utils_1.findPosition((_a = allModulesWithDuplicatedPropertyValues === null || allModulesWithDuplicatedPropertyValues === void 0 ? void 0 : allModulesWithDuplicatedPropertyValues[0]) === null || _a === void 0 ? void 0 : _a.key, yamlContentByLine)));
15
15
  }
16
16
  return validationErrors;
17
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"validateSingleProperty.d.ts","sourceRoot":"","sources":["../../../../src/validators/modules-validators/confluence/validateSingleProperty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,eAAO,MAAM,sBAAsB,eACrB,OAAO,cACP,cAAc,YAChB,MAAM,+CAEf,eAAe,EAgBjB,CAAC"}
1
+ {"version":3,"file":"validateSingleProperty.d.ts","sourceRoot":"","sources":["../../../../src/validators/modules-validators/confluence/validateSingleProperty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AASnD,eAAO,MAAM,sBAAsB,eACrB,OAAO,cACP,cAAc,YAChB,MAAM,+CAEf,eAAe,EAgBjB,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import { ValidationError } from '../../../types';
2
2
  import { Modules } from '../../../schema/manifest';
3
- export declare function validateIssueAdjustmentModule(modules: Modules, yamlContentByLine?: string[]): ValidationError[];
4
- //# sourceMappingURL=issue-adjustment.d.ts.map
3
+ export declare function validateUiModificationsModule(modules: Modules, yamlContentByLine?: string[]): ValidationError[];
4
+ //# sourceMappingURL=ui-modifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-modifications.d.ts","sourceRoot":"","sources":["../../../../src/validators/modules-validators/jira/ui-modifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAe/G"}
@@ -1,16 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateIssueAdjustmentModule = void 0;
3
+ exports.validateUiModificationsModule = void 0;
4
4
  const types_1 = require("../../../types");
5
5
  const text_1 = require("../../../text");
6
6
  const utils_1 = require("../../../utils");
7
- function validateIssueAdjustmentModule(modules, yamlContentByLine) {
7
+ function validateUiModificationsModule(modules, yamlContentByLine) {
8
8
  const validationErrors = [];
9
- const moduleType = types_1.AllModuleTypes.JiraIssueAdjustment;
9
+ const moduleType = types_1.AllModuleTypes.JiraUiModifications;
10
10
  const moduleArray = modules[moduleType];
11
11
  if (moduleArray && moduleArray.length > 1) {
12
12
  validationErrors.push(Object.assign({ message: text_1.errors.modules.singleEntryOfTheModule(moduleType), reference: text_1.References.Modules, level: 'error' }, utils_1.findPosition(moduleArray[1].key, yamlContentByLine)));
13
13
  }
14
14
  return validationErrors;
15
15
  }
16
- exports.validateIssueAdjustmentModule = validateIssueAdjustmentModule;
16
+ exports.validateUiModificationsModule = validateUiModificationsModule;
@@ -1,12 +1,10 @@
1
1
  import { ManifestObject, ManifestValidationResult } from '../types';
2
2
  import { ValidatorInterface } from './validator-interface';
3
3
  import { ManifestSchema } from '../schema/manifest';
4
+ import { RequiredScopes } from '../scopes';
4
5
  export interface MappingEntry {
5
6
  productEvent: string;
6
- oAuthScopes: {
7
- current: string[];
8
- deprecated?: string[];
9
- };
7
+ oAuthScopes: RequiredScopes;
10
8
  }
11
9
  export interface MappingConfig {
12
10
  mapping: MappingEntry[];
@@ -1 +1 @@
1
- {"version":3,"file":"product-trigger-scopes-validator.d.ts","sourceRoot":"","sources":["../../src/validators/product-trigger-scopes-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAmB,MAAM,UAAU,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE;QACX,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,qBAAa,6BAA6B,CAAC,CAAC,CAC1C,YAAW,kBAAkB,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,SAAS,EAAE,cAAc,CAAC;IAC7E,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAElD,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG,SAAS,GAAG,wBAAwB,CAAC,cAAc,CAAC;CAsEzG"}
1
+ {"version":3,"file":"product-trigger-scopes-validator.d.ts","sourceRoot":"","sources":["../../src/validators/product-trigger-scopes-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAmB,MAAM,UAAU,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EAAoB,cAAc,EAAE,MAAM,WAAW,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,cAAc,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,qBAAa,6BAA6B,CAAC,CAAC,CAC1C,YAAW,kBAAkB,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,SAAS,EAAE,cAAc,CAAC;IAC7E,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAElD,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG,SAAS,GAAG,wBAAwB,CAAC,cAAc,CAAC;CAoDzG"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ProductTriggerScopesValidator = void 0;
4
4
  const text_1 = require("../text");
5
5
  const utils_1 = require("../utils");
6
+ const scopes_1 = require("../scopes");
6
7
  class ProductTriggerScopesValidator {
7
8
  constructor(config) {
8
9
  this.config = config;
@@ -16,9 +17,10 @@ class ProductTriggerScopesValidator {
16
17
  };
17
18
  }
18
19
  const validationErrors = [];
19
- const getRequiredScopes = (productEvent, status) => {
20
+ const getRequiredScopes = (productEvent) => {
20
21
  var _a;
21
- return (_a = this.config.mapping.find((value) => value.productEvent == productEvent)) === null || _a === void 0 ? void 0 : _a.oAuthScopes[status];
22
+ const emptyRequiredScopes = { current: [] };
23
+ return (((_a = this.config.mapping.find((value) => value.productEvent == productEvent)) === null || _a === void 0 ? void 0 : _a.oAuthScopes) || emptyRequiredScopes);
22
24
  };
23
25
  const addValidationError = (scope, event) => {
24
26
  validationErrors.push(Object.assign({ message: text_1.errors.permissions.missingPermissionFromScope(scope, event), reference: text_1.References.MissingScopes, level: 'error', metadata: {
@@ -34,25 +36,9 @@ class ProductTriggerScopesValidator {
34
36
  const manifestScopes = ((_a = manifest.typedContent.permissions) === null || _a === void 0 ? void 0 : _a.scopes) || [];
35
37
  manifest.typedContent.modules.trigger.forEach((element) => {
36
38
  for (const event of element.events) {
37
- const currentScopes = getRequiredScopes(event, 'current');
38
- if (!currentScopes)
39
- continue;
40
- const missingCurrentScopes = currentScopes.filter((scope) => !manifestScopes.includes(scope));
41
- if (missingCurrentScopes.length === 0)
42
- continue;
43
- const deprecatedScopes = getRequiredScopes(event, 'deprecated');
44
- const missingDeprecatedScopes = deprecatedScopes === null || deprecatedScopes === void 0 ? void 0 : deprecatedScopes.filter((scope) => !manifestScopes.includes(scope));
45
- if ((missingDeprecatedScopes === null || missingDeprecatedScopes === void 0 ? void 0 : missingDeprecatedScopes.length) === 0)
46
- continue;
47
- if (missingCurrentScopes.length < currentScopes.length) {
48
- missingCurrentScopes.forEach((scope) => addValidationError(scope, event));
49
- continue;
50
- }
51
- if (missingDeprecatedScopes && deprecatedScopes && missingDeprecatedScopes.length < deprecatedScopes.length) {
52
- missingDeprecatedScopes.forEach((scope) => addValidationError(scope, event));
53
- continue;
54
- }
55
- missingCurrentScopes.forEach((scope) => addValidationError(scope, event));
39
+ const requiredScopes = getRequiredScopes(event);
40
+ const missingScopes = scopes_1.getMissingScopes(manifestScopes, requiredScopes);
41
+ missingScopes.forEach((scope) => addValidationError(scope, event));
56
42
  }
57
43
  });
58
44
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forge/manifest",
3
- "version": "0.0.0-experimental-e1cefc4",
3
+ "version": "0.0.0-experimental-29a2cc1",
4
4
  "description": "Definitions and validations of the Forge manifest",
5
5
  "main": "out/index.js",
6
6
  "scripts": {
@@ -28,6 +28,7 @@
28
28
  "cheerio": "^0.22.0",
29
29
  "js-yaml": "^3.13.1",
30
30
  "json-schema-to-typescript": "^9.1.1",
31
+ "lodash": "^4.17.20",
31
32
  "node-fetch": "2.6.1",
32
33
  "typescript-json-schema": "^0.45.1"
33
34
  }
@@ -1,7 +0,0 @@
1
- import { ValidatorInterface } from './validator-interface';
2
- import { ManifestObject, ManifestValidationResult } from '../types';
3
- import { ManifestSchema } from '../schema/manifest';
4
- export declare class DeprecatedPermissionsValidator implements ValidatorInterface<ManifestObject<ManifestSchema> | undefined, ManifestSchema> {
5
- validate(manifest: ManifestObject<ManifestSchema> | undefined): ManifestValidationResult<ManifestSchema>;
6
- }
7
- //# sourceMappingURL=deprecated-permissions-validator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deprecated-permissions-validator.d.ts","sourceRoot":"","sources":["../../src/validators/deprecated-permissions-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAmB,wBAAwB,EAAE,MAAM,UAAU,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKpD,qBAAa,8BACX,YAAW,kBAAkB,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,SAAS,EAAE,cAAc,CAAC;IACzF,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG,SAAS,GAAG,wBAAwB,CAAC,cAAc,CAAC;CAoCzG"}
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DeprecatedPermissionsValidator = void 0;
4
- const tslib_1 = require("tslib");
5
- const deprecated_shipyard_scopes_json_1 = tslib_1.__importDefault(require("../scopes/deprecated-shipyard-scopes.json"));
6
- const text_1 = require("../text");
7
- const utils_1 = require("../utils");
8
- class DeprecatedPermissionsValidator {
9
- validate(manifest) {
10
- var _a, _b;
11
- if (!((_a = manifest === null || manifest === void 0 ? void 0 : manifest.typedContent) === null || _a === void 0 ? void 0 : _a.permissions)) {
12
- return {
13
- success: false,
14
- manifestObject: manifest
15
- };
16
- }
17
- const validationErrors = [];
18
- function addValidationError(element, value, schemaManifestObject) {
19
- validationErrors.push(Object.assign({ message: text_1.errors.permissions.deprecatedPermission(element, value), reference: text_1.References.Permissions, level: 'warning' }, utils_1.findPosition(value[0], schemaManifestObject.yamlContentByLine)));
20
- }
21
- const deprecatedScopes = (_b = manifest.typedContent.permissions.scopes) === null || _b === void 0 ? void 0 : _b.filter((key) => deprecated_shipyard_scopes_json_1.default.includes(key));
22
- if (deprecatedScopes && deprecatedScopes.length > 0) {
23
- addValidationError('scopes', deprecatedScopes, manifest);
24
- }
25
- return {
26
- success: validationErrors.length === 0,
27
- errors: validationErrors
28
- };
29
- }
30
- }
31
- exports.DeprecatedPermissionsValidator = DeprecatedPermissionsValidator;
@@ -1 +0,0 @@
1
- {"version":3,"file":"issue-adjustment.d.ts","sourceRoot":"","sources":["../../../../src/validators/modules-validators/jira/issue-adjustment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAe/G"}