npm package diff

Package: @forge/manifest

Versions: 9.1.0-next.3 - 9.1.0-next.4

Modified: package/out/text/errors.js

Index: package/out/text/errors.js
===================================================================
--- package/out/text/errors.js
+++ package/out/text/errors.js
@@ -48,8 +48,9 @@
         missingFunction: () => 'document must have at least 1 function',
         duplicateKeyFound: (key) => `found duplicate module key '${key}'`,
         wrongFunctionReference: (module, functionKey) => `${module} references undefined function module with key '${functionKey}'`,
         wrongEndpointReference: (module, endpointKey) => `${module} references undefined endpoint module with key '${endpointKey}'`,
+        wrongServiceReference: (module, serviceKey) => `${module} references undefined service with key '${serviceKey}'`,
         wrongResourceReference: (module, resourceKey) => `missing resource key '${resourceKey}' is being referenced by ${module} module`,
         wrongResourceType: (folder) => `Client Side UI Kit resource (${folder}) cannot be a directory`,
         singleEntryOfTheModule: (moduleType) => `Only a single entry of the ${moduleType} module can be defined in the manifest`,
         singleEntryOfModuleWithoutConfigureAndStartedParams: (moduleType) => `The ${moduleType} module can only have a single entry that doesn’t include either useAsConfig or useAsGetStarted properties.`,

Modified: package/out/utils/module-references.js

Index: package/out/utils/module-references.js
===================================================================
--- package/out/utils/module-references.js
+++ package/out/utils/module-references.js
@@ -1,20 +1,22 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.findInvalidEndpointReferences = exports.findInvalidResourceReferences = exports.findInvalidFunctionReferences = void 0;
-const findInvalidReferenceKeys = (property, module, functionsOrResources) => {
-    const invalidFunctions = [];
-    const _checkFunctionKey = (functionKey) => {
-        if (functionKey && !functionsOrResources?.find((func) => func.key === functionKey)) {
-            invalidFunctions.push(functionKey);
+exports.findInvalidServiceReferences = exports.findInvalidEndpointReferences = exports.findInvalidResourceReferences = exports.findInvalidFunctionReferences = void 0;
+const findInvalidReferenceKeys = (property, module, references) => {
+    const invalidEntries = [];
+    const _checkModuleEntryKey = (entryKey) => {
+        if (entryKey && !references?.find((func) => func.key === entryKey)) {
+            invalidEntries.push(entryKey);
         }
     };
-    _checkFunctionKey(module[property]);
-    Object.keys(module).forEach((key) => _checkFunctionKey(module[key][property]));
-    return invalidFunctions;
+    _checkModuleEntryKey(module[property]);
+    Object.keys(module).forEach((key) => _checkModuleEntryKey(module[key][property]));
+    return invalidEntries;
 };
 const findInvalidFunctionReferences = (module, functions) => findInvalidReferenceKeys('function', module, functions);
 exports.findInvalidFunctionReferences = findInvalidFunctionReferences;
 const findInvalidResourceReferences = (module, resources) => findInvalidReferenceKeys('resource', module, resources);
 exports.findInvalidResourceReferences = findInvalidResourceReferences;
 const findInvalidEndpointReferences = (module, resources) => findInvalidReferenceKeys('endpoint', module, resources);
 exports.findInvalidEndpointReferences = findInvalidEndpointReferences;
+const findInvalidServiceReferences = (module, services) => findInvalidReferenceKeys('service', module, services);
+exports.findInvalidServiceReferences = findInvalidServiceReferences;

Modified: package/out/validators/modules-validator.js

Index: package/out/validators/modules-validator.js
===================================================================
--- package/out/validators/modules-validator.js
+++ package/out/validators/modules-validator.js
@@ -30,10 +30,10 @@
             };
         }
         let validationErrors = [...this.connectModuleValidation(manifest)];
         if (manifest.typedContent.modules) {
-            const { typedContent: { modules, connectModules, remotes, permissions }, yamlContentByLine, filePath } = manifest;
-            validationErrors = validationErrors.concat(this.checkUnsupportedModules(manifest.typedContent.modules, yamlContentByLine), this.functionKeyLength(modules, yamlContentByLine), this.minimumModuleCountValidation(modules, yamlContentByLine), this.functionKeyDefinedValidation(modules, yamlContentByLine), this.endpointValidations(modules, yamlContentByLine, remotes, permissions?.scopes || []), this.duplicateModuleKeyValidation(modules, connectModules || {}, yamlContentByLine), this.functionHandlerValidation(modules, yamlContentByLine, filePath), (0, validate_workflow_1.validateJiraWorkflowValidator)(modules, yamlContentByLine), (0, validate_workflow_1.validateJiraWorkflowCondition)(modules, yamlContentByLine), (0, ui_modifications_1.validateUiModificationsModule)(modules, yamlContentByLine), (0, validate_full_admin_page_1.validateJiraFullAdminPage)(modules, yamlContentByLine), (0, validate_full_page_1.validateJiraFullPage)(modules, yamlContentByLine), (0, validate_custom_field_1.validateJiraCustomField)(modules, yamlContentByLine), (0, confluence_1.validateConfluenceModules)(modules, yamlContentByLine), (0, bitbucket_1.validateBitbucketModules)(modules, yamlContentByLine), (0, validate_trigger_1.validateJiraTriggers)(modules, yamlContentByLine), (0, remote_1.validateRemoteModules)(modules, yamlContentByLine), (0, dataResidency_1.validateMigrationDataResidencyModule)(modules, remotes, yamlContentByLine), (0, validateModuleScopes_1.validateModuleScopes)(modules, yamlContentByLine, permissions), (0, rovo_1.validateRovoModules)(modules, yamlContentByLine), (0, validate_timetrackingprovider_module_1.validateJiraTimeTrackingModule)(modules, yamlContentByLine), (0, validate_command_1.validateJiraCommandModule)(modules, yamlContentByLine));
+            const { typedContent: { modules, connectModules, remotes, permissions, services }, yamlContentByLine, filePath } = manifest;
+            validationErrors = validationErrors.concat(this.checkUnsupportedModules(manifest.typedContent.modules, yamlContentByLine), this.functionKeyLength(modules, yamlContentByLine), this.minimumModuleCountValidation(modules, yamlContentByLine), this.functionKeyDefinedValidation(modules, yamlContentByLine), this.endpointValidations(modules, yamlContentByLine, remotes, permissions?.scopes || [], services), this.duplicateModuleKeyValidation(modules, connectModules || {}, yamlContentByLine), this.functionHandlerValidation(modules, yamlContentByLine, filePath), (0, validate_workflow_1.validateJiraWorkflowValidator)(modules, yamlContentByLine), (0, validate_workflow_1.validateJiraWorkflowCondition)(modules, yamlContentByLine), (0, ui_modifications_1.validateUiModificationsModule)(modules, yamlContentByLine), (0, validate_full_admin_page_1.validateJiraFullAdminPage)(modules, yamlContentByLine), (0, validate_full_page_1.validateJiraFullPage)(modules, yamlContentByLine), (0, validate_custom_field_1.validateJiraCustomField)(modules, yamlContentByLine), (0, confluence_1.validateConfluenceModules)(modules, yamlContentByLine), (0, bitbucket_1.validateBitbucketModules)(modules, yamlContentByLine), (0, validate_trigger_1.validateJiraTriggers)(modules, yamlContentByLine), (0, remote_1.validateRemoteModules)(modules, yamlContentByLine), (0, dataResidency_1.validateMigrationDataResidencyModule)(modules, remotes, yamlContentByLine), (0, validateModuleScopes_1.validateModuleScopes)(modules, yamlContentByLine, permissions), (0, rovo_1.validateRovoModules)(modules, yamlContentByLine), (0, validate_timetrackingprovider_module_1.validateJiraTimeTrackingModule)(modules, yamlContentByLine), (0, validate_command_1.validateJiraCommandModule)(modules, yamlContentByLine));
         }
         else {
             const { typedContent: { connectModules }, yamlContentByLine } = manifest;
             validationErrors = validationErrors.concat(this.duplicateModuleKeyValidation({}, connectModules || {}, yamlContentByLine));
@@ -124,9 +124,9 @@
             });
         });
         return validationErrors;
     }
-    endpointValidations(modules, yamlContentByLine, remotes, scopes) {
+    endpointValidations(modules, yamlContentByLine, remotes, scopes, services) {
         const validationErrors = [];
         const _checkRemoteExists = (remoteKey) => {
             return remotes?.find((remote) => remote.key === remoteKey) !== undefined;
         };
@@ -155,42 +155,54 @@
         });
         function isRemoteType(obj) {
             return obj && typeof obj === 'object' && 'remote' in obj;
         }
+        function isServiceType(obj) {
+            return obj && typeof obj === 'object' && 'service' in obj;
+        }
         _endpoint?.forEach((endpoint) => {
-            if (!isRemoteType(endpoint)) {
-                return;
+            if (isRemoteType(endpoint)) {
+                if (!_checkRemoteExists(endpoint.remote)) {
+                    validationErrors.push({
+                        message: text_1.errors.modules.endpoint.remote.notExists(endpoint.remote),
+                        reference: text_1.References.Modules,
+                        level: 'error',
+                        ...(0, utils_1.findPosition)(endpoint.remote, yamlContentByLine)
+                    });
+                }
+                if (endpoint.auth?.appUserToken?.enabled && !scopes.includes(types_1.USER_TOKEN_SCOPE)) {
+                    validationErrors.push({
+                        message: text_1.errors.permissions.missingEndpointPermissionFromScope(types_1.USER_TOKEN_SCOPE, endpoint.key),
+                        reference: text_1.References.MissingScopes,
+                        level: 'error',
+                        metadata: {
+                            missingPermission: types_1.USER_TOKEN_SCOPE
+                        },
+                        ...(0, utils_1.findPosition)('scopes', yamlContentByLine)
+                    });
+                }
+                if (endpoint.auth?.appSystemToken?.enabled && !scopes.includes(types_1.SYSTEM_TOKEN_SCOPE)) {
+                    validationErrors.push({
+                        message: text_1.errors.permissions.missingEndpointPermissionFromScope(types_1.SYSTEM_TOKEN_SCOPE, endpoint.key),
+                        reference: text_1.References.MissingScopes,
+                        level: 'error',
+                        metadata: {
+                            missingPermission: types_1.SYSTEM_TOKEN_SCOPE
+                        },
+                        ...(0, utils_1.findPosition)('scopes', yamlContentByLine)
+                    });
+                }
             }
-            if (!_checkRemoteExists(endpoint.remote)) {
-                validationErrors.push({
-                    message: text_1.errors.modules.endpoint.remote.notExists(endpoint.remote),
-                    reference: text_1.References.Modules,
-                    level: 'error',
-                    ...(0, utils_1.findPosition)(endpoint.remote, yamlContentByLine)
+            else if (isServiceType(endpoint)) {
+                (0, utils_1.findInvalidServiceReferences)(endpoint, services).forEach((service) => {
+                    validationErrors.push({
+                        message: text_1.errors.modules.wrongServiceReference('endpoint', service),
+                        reference: text_1.References.Modules,
+                        level: 'error',
+                        ...(0, utils_1.findPosition)('endpoint', yamlContentByLine)
+                    });
                 });
             }
-            if (endpoint.auth?.appUserToken?.enabled && !scopes.includes(types_1.USER_TOKEN_SCOPE)) {
-                validationErrors.push({
-                    message: text_1.errors.permissions.missingEndpointPermissionFromScope(types_1.USER_TOKEN_SCOPE, endpoint.key),
-                    reference: text_1.References.MissingScopes,
-                    level: 'error',
-                    metadata: {
-                        missingPermission: types_1.USER_TOKEN_SCOPE
-                    },
-                    ...(0, utils_1.findPosition)('scopes', yamlContentByLine)
-                });
-            }
-            if (endpoint.auth?.appSystemToken?.enabled && !scopes.includes(types_1.SYSTEM_TOKEN_SCOPE)) {
-                validationErrors.push({
-                    message: text_1.errors.permissions.missingEndpointPermissionFromScope(types_1.SYSTEM_TOKEN_SCOPE, endpoint.key),
-                    reference: text_1.References.MissingScopes,
-                    level: 'error',
-                    metadata: {
-                        missingPermission: types_1.SYSTEM_TOKEN_SCOPE
-                    },
-                    ...(0, utils_1.findPosition)('scopes', yamlContentByLine)
-                });
-            }
         });
         remotes?.forEach((remote) => {
             if (remote.auth?.appUserToken?.enabled && !scopes.includes(types_1.USER_TOKEN_SCOPE)) {
                 validationErrors.push({

Modified: package/out/validators/permissions-validator.js

Index: package/out/validators/permissions-validator.js
===================================================================
--- package/out/validators/permissions-validator.js
+++ package/out/validators/permissions-validator.js
@@ -91,9 +91,9 @@
     }
     async validate(manifest) {
         if (!manifest || !manifest.typedContent || !manifest.typedContent.permissions) {
             return {
-                success: false,
+                success: true,
                 manifestObject: manifest
             };
         }
         const errors = [];

Modified: package/out/schema/manifest-schema.json

Large diffs are not rendered by default.

Modified: package/package.json

Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@forge/manifest",
-  "version": "9.1.0-next.3",
+  "version": "9.1.0-next.4",
   "description": "Definitions and validations of the Forge manifest",
   "main": "out/index.js",
   "scripts": {
     "build": "yarn run compile",

Modified: package/out/text/errors.d.ts.map

Index: package/out/text/errors.d.ts.map
===================================================================
--- package/out/text/errors.d.ts.map
+++ package/out/text/errors.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/text/errors.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/text/errors.ts"],"names":[],"mappings":"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"}
\ No newline at end of file

Modified: package/out/utils/module-references.d.ts.map

Index: package/out/utils/module-references.d.ts.map
===================================================================
--- package/out/utils/module-references.d.ts.map
+++ package/out/utils/module-references.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"module-references.d.ts","sourceRoot":"","sources":["../../src/utils/module-references.ts"],"names":[],"mappings":"AAAA,UAAU,kBAAkB;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAqBD,eAAO,MAAM,6BAA6B,WAAY,GAAG,cAAc,kBAAkB,EAAE,aAClC,CAAC;AAC1D,eAAO,MAAM,6BAA6B,WAAY,GAAG,cAAc,kBAAkB,EAAE,aAClC,CAAC;AAC1D,eAAO,MAAM,6BAA6B,WAAY,GAAG,cAAc,kBAAkB,EAAE,aAClC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"module-references.d.ts","sourceRoot":"","sources":["../../src/utils/module-references.ts"],"names":[],"mappings":"AAAA,UAAU,gBAAgB;IACxB,GAAG,EAAE,MAAM,CAAC;CACb;AAqBD,eAAO,MAAM,6BAA6B,WAAY,GAAG,cAAc,gBAAgB,EAAE,aAChC,CAAC;AAC1D,eAAO,MAAM,6BAA6B,WAAY,GAAG,cAAc,gBAAgB,EAAE,aAChC,CAAC;AAC1D,eAAO,MAAM,6BAA6B,WAAY,GAAG,cAAc,gBAAgB,EAAE,aAChC,CAAC;AAC1D,eAAO,MAAM,4BAA4B,WAAY,GAAG,aAAa,gBAAgB,EAAE,aAChC,CAAC"}
\ No newline at end of file

Modified: package/out/validators/modules-validator.d.ts.map

Index: package/out/validators/modules-validator.d.ts.map
===================================================================
--- package/out/validators/modules-validator.d.ts.map
+++ package/out/validators/modules-validator.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"modules-validator.d.ts","sourceRoot":"","sources":["../../src/validators/modules-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,wBAAwB,EAKzB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAkB,cAAc,EAAqC,MAAM,oBAAoB,CAAC;AACvG,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAqB3D,qBAAa,gBACX,YAAW,kBAAkB,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,SAAS,EAAE,cAAc,CAAC;IAGzF,OAAO,CAAC,oBAAoB,CAAsE;IAE5F,QAAQ,CACZ,QAAQ,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG,SAAS,GACnD,OAAO,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC;IA4DpD,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,4BAA4B;IAapC,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,4BAA4B;IA0BpC,OAAO,CAAC,mBAAmB;IAgH3B,OAAO,CAAC,4BAA4B;IA2BpC,OAAO,CAAC,yBAAyB;CAkClC"}
\ No newline at end of file
+{"version":3,"file":"modules-validator.d.ts","sourceRoot":"","sources":["../../src/validators/modules-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,wBAAwB,EAKzB,MAAM,UAAU,CAAC;AASlB,OAAO,EAAkB,cAAc,EAA+C,MAAM,oBAAoB,CAAC;AACjH,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAqB3D,qBAAa,gBACX,YAAW,kBAAkB,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,SAAS,EAAE,cAAc,CAAC;IAGzF,OAAO,CAAC,oBAAoB,CAAsE;IAE5F,QAAQ,CACZ,QAAQ,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG,SAAS,GACnD,OAAO,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC;IA4DpD,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,4BAA4B;IAapC,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,4BAA4B;IA0BpC,OAAO,CAAC,mBAAmB;IA6H3B,OAAO,CAAC,4BAA4B;IA2BpC,OAAO,CAAC,yBAAyB;CAkClC"}
\ No newline at end of file

Modified: package/CHANGELOG.md

Index: package/CHANGELOG.md
===================================================================
--- package/CHANGELOG.md
+++ package/CHANGELOG.md
@@ -1,6 +1,16 @@
 # @forge/manifest
 
+## 9.1.0-next.4
+
+### Minor Changes
+
+- 57700e7: Added linting for top level services and endpoints consuming services
+
+### Patch Changes
+
+- 683d423: Update manifest definitions
+
 ## 9.1.0-next.3
 
 ### Minor Changes

Modified: package/out/text/errors.d.ts

Index: package/out/text/errors.d.ts
===================================================================
--- package/out/text/errors.d.ts
+++ package/out/text/errors.d.ts
@@ -36,8 +36,9 @@
         missingFunction: () => string;
         duplicateKeyFound: (key: string) => string;
         wrongFunctionReference: (module: string, functionKey: string) => string;
         wrongEndpointReference: (module: string, endpointKey: string) => string;
+        wrongServiceReference: (module: string, serviceKey: string) => string;
         wrongResourceReference: (module: string, resourceKey: string) => string;
         wrongResourceType: (folder: string) => string;
         singleEntryOfTheModule: (moduleType: string) => string;
         singleEntryOfModuleWithoutConfigureAndStartedParams: (moduleType: string) => string;

Modified: package/out/schema/manifest.d.ts

Large diffs are not rendered by default.

Modified: package/out/utils/module-references.d.ts

Index: package/out/utils/module-references.d.ts
===================================================================
--- package/out/utils/module-references.d.ts
+++ package/out/utils/module-references.d.ts
@@ -1,8 +1,9 @@
-interface FunctionOrResource {
+interface KeyedModuleEntry {
     key: string;
 }
-export declare const findInvalidFunctionReferences: (module: any, functions?: FunctionOrResource[]) => string[];
-export declare const findInvalidResourceReferences: (module: any, resources?: FunctionOrResource[]) => string[];
-export declare const findInvalidEndpointReferences: (module: any, resources?: FunctionOrResource[]) => string[];
+export declare const findInvalidFunctionReferences: (module: any, functions?: KeyedModuleEntry[]) => string[];
+export declare const findInvalidResourceReferences: (module: any, resources?: KeyedModuleEntry[]) => string[];
+export declare const findInvalidEndpointReferences: (module: any, resources?: KeyedModuleEntry[]) => string[];
+export declare const findInvalidServiceReferences: (module: any, services?: KeyedModuleEntry[]) => string[];
 export {};
 //# sourceMappingURL=module-references.d.ts.map
\ No newline at end of file