AppSourceCop Analyzer Rules

AppSourceCop is an analyzer that enforces rules that must be respected by extensions meant to be published to Microsoft AppSource.

Rules

Id Title Category Default Severity
AS0001 Tables and table extensions that have been published must not be deleted. Upgrade Error
AS0002 Fields must not be deleted. Upgrade Error
AS0003 The previous version of the extension could not be found. Upgrade Error
AS0004 Fields must not change type, since dependent extensions may break Upgrade Error
AS0005 Fields must not change name Upgrade Error
AS0006 Tables that have been published must not change name. Upgrade Error
AS0009 Key fields must not be changed Upgrade Error
AS0010 Keys must not be deleted Upgrade Error
AS0011 An affix is required Extensibility Error
AS0013 The field identifier must be within the allowed range Extensibility Error
AS0014 The project manifest must contain the allocated identifier range Extensibility Error
AS0015 TranslationFile must be enabled. Extensibility Error
AS0016 Fields of field class 'Normal' must use the DataClassification property and its value should be different from ToBeClassified Extensibility Error
AS0018 A procedure belonging to the public API cannot be removed Upgrade Error
AS0019 Event attributes cannot be removed Upgrade Error
AS0020 The type of events cannot be changed. Upgrade Error
AS0021 An argument in an event attribute cannot be changed to false. Upgrade Error
AS0022 An external scope cannot be removed Upgrade Error
AS0023 A return type cannot be modified in external procedures Upgrade Error
AS0024 Parameters cannot be removed or added in external procedures Upgrade Error
AS0025 Parameters cannot be modified, renamed, or removed from events. Upgrade Error
AS0026 The type and subtype of parameters cannot be modified in events and external procedures Upgrade Error
AS0027 Modifying the array size of a parameter in events and external procedures is not allowed Upgrade Error
AS0028 Reducing the array size of a parameter in events and external procedures is not allowed Upgrade Error
AS0029 Pages and PageExtensions that have been published must not be deleted, since dependent extensions may break Upgrade Error
AS0030 Pages that have been published must not be renamed. Upgrade Error
AS0031 Actions that have been published must not be deleted. Upgrade Error
AS0032 Controls that have been published must not be deleted/ Upgrade Error
AS0033 Views that have been published must not be deleted. Upgrade Error
AS0034 Unsupported table property change Upgrade Error
AS0036 Unsupported table field property change Upgrade Error
AS0038 Unsupported table key property change Upgrade Error
AS0039 Removing properties that cause destructive changes is not allowed Upgrade Error
AS0041 Table field property changes that cause destructive changes must not be removed Upgrade Error
AS0042 Table key property changes that cause destructive changes must not be removed Upgrade Error
AS0043 The clustered key must not be deleted Upgrade Error
AS0044 Property changes that cause destructive changes are not allowed Upgrade Error
AS0047 The extension name is too long. Extensibility Error
AS0048 The publisher name is too long. Extensibility Error
AS0049 The access modifier of an application object cannot be changed to a value that provides less access. Extensibility Error
AS0050 The extensibility of an application object cannot be removed Extensibility Error
AS0051 Manifest property is required for AppSource submission Extensibility Error
AS0052 The property 'url' must be set to a valid URL Extensibility Error
AS0053 The compilation target of an application must be a value that is allowed in a multi-tenant SaaS environment Extensibility Error
AS0054 The AppSourceCop configuration must specify the set of affixes used by the application Configuration Error
AS0055 The AppSourceCop configuration must specify the list of countries/regions targeted by the application Configuration Hidden
AS0056 The country/region codes specified in the 'supportedCountries' property must be valid ISO 3166-1 alpha-2 codes Configuration Warning
AS0057 Translations must be provided for all the locales in which the application will be available Extensibility Hidden
AS0058 Only use AssertError in Test Codeunits Extensibility Error
AS0059 Reserved database tables are read-only in a multi-tenant environment Extensibility Error
AS0060 Unsafe methods cannot be invoked in an AppSource application Extensibility Error
AS0061 Procedures must not subscribe to CompanyOpen events Extensibility Error
AS0062 Page controls and actions must use the ApplicationArea property Extensibility Error
AS0063 Removing a var modifier in events is not allowed Upgrade Error
AS0064 Interface implementations that have been published must not be deleted. Upgrade Error
AS0065 Interfaces that have been published must not be deleted. Upgrade Error
AS0066 A new method to an interface that has been published must not be added. Upgrade Error
AS0067 Adding an interface to an enum that has been published must have a default implementation. Upgrade Error
AS0068 Changing a table extension's target is not allowed. Upgrade Error
AS0069 An enum field replacing an option field should have at least the same number of members. Upgrade Error
AS0070 An enum field replacing an option field should preserve the member names. Upgrade Error
AS0071 An enum field replacing an option field should preserve the member ordinal values. Upgrade Error
AS0072 The ObsoleteTag property and the Tag in the Obsolete attribute must be set to the next release version. Design Hidden
AS0073 Obsolete Tag must be set. Design Hidden
AS0074 The Obsolete Tag must be the same across branches. Design Hidden
AS0075 Obsolete Reason must be set. Design Warning
AS0076 Obsolete Tag format. Design Hidden
AS0077 Adding a var modifier in events is not allowed Upgrade Warning
AS0078 Adding or removing a var modifier in external procedures is not allowed Upgrade Warning
AS0079 An affix is required for procedures defined in extension objects. Extensibility Warning
AS0080 Fields must not decrease in length Upgrade Error
AS0081 InternalsVisibleTo should not be used as a security feature. Extensibility Warning
AS0082 It is not allowed to rename an enum value. Upgrade Error
AS0083 It is not allowed to delete a value from an enum. Upgrade Error
AS0084 The ID range assigned to the extension must be within the allowed range Extensibility Error
AS0085 The 'application' property must be used instead of explicit dependencies Extensibility Warning
AS0086 Fields must not increase in length Upgrade Warning
AS0087 Translations of enum value captions must not contain commas Extensibility Warning
AS0088 Objects with an ID that can be referenced and which have been published must not be deleted. Upgrade Error
AS0089 Objects that can be referenced and which have been published must not be deleted. Upgrade Error
AS0090 Objects that can be referenced and which have been published must not be renamed. Upgrade Error
AS0091 One or more dependencies of the previous version of the extension could not be found. Upgrade Error
AS0092 The app.json file must specify an Azure Application Insights resource. Configuration Warning
AS0093 Entitlements cannot be defined in an extension. Configuration Error
AS0094 Permission Sets should not be defined in XML files. Configuration Warning
AS0095 The access modifier of a table field cannot be changed to a value that provides less access. Configuration Error
AS0096 The name of an extension cannot be changed. Configuration Error
AS0097 The publisher name of an extension cannot be changed. Configuration Error
AS0098 An affix is needed. Extensibility Warning
AS0099 The member ID should be within the allowed range Extensibility Info

Note

Several rules enforced by the AppSourceCop analyzer are incompatible with rules enforced by the PerTenantExtensionCop. Make sure to enable only one of these at a time.

Note

Failing to comply with the rules whose default severity is set to Error will fail the submission of your extension to the AppSource marketplace. It is recommended, but not mandatory to comply with the rules whose severity is marked as Warning or Info.

Configuration

The AppSourceCop analyzer can be further configured by adding a file named AppSourceCop.json in the project's root folder. The AL Language extension will offer IntelliSense for this file.

The following table describes the settings in the AppSourceCop.json file:

Setting Mandatory Value
name No The name of a previous version of this package with which you want to compare the current package for breaking changes.
publisher No The publisher of a previous version of this package with which you want to compare the current package for breaking changes.
version Yes The version of a previous version of this package with which you want to compare the current package for breaking changes.
mandatoryAffixes No Affixes that must be prepended or appended to the name of all new application objects, extension objects, and fields.
supportedCountries No The set of country codes, in the alpha-2 ISO 3166 format, in which the application will be available.
targetVersion No Specifies the next Major.Minor version of the extension in the current branch in order to validate the ObsoleteTag values with AS0072. This is only relevant when the default obsoleteTagPattern '(\d+)\.(\d+)' is used. This property is being deprecated in favor of obsoleteTagVersion.
obsoleteTagVersion No Specifies the next Major.Minor version of the extension in the current branch in order to validate the ObsoleteTag values with AS0072. This is only relevant when the default obsoleteTagPattern '(\d+)\.(\d+)' is used.
obsoleteTagPattern No The Obsolete tag pattern used by AS0076. This should be a valid regular expression. By default, the pattern '(\d+)\.(\d+)' is used.
obsoleteTagPatternDescription No A human-readable description for the ObsoleteTagPattern regular expression. This is used in diagnostics reported by AS0076. By default, 'Major.Minor' is used.
baselinePackageCachePath No The path to the folder containing the baseline and its dependencies with which you want to compare the current package for breaking changes. By default, the package cache path for the current project is used (see 'al.packageCachePath' setting).

The name, publisher, version properties are used for specifying a previous version of the current package. This package must be located in the baseline package cache folder of your extension. This cache can be specified using the baselinePackageCachePath property. If this property is not specified, the dependency package cache path of the extension will be used instead. The al.packageCachePath setting allows you to specify the path to the folder that will act as the cache for the dependencies symbol files used by your project. AppSourceCop will compare the previous version of your extension with its current version and will report any breaking changes introduced by the current package.

The mandatoryAffixes property specifies strings that must be prepended or appended to the names of all new objects, extension objects and fields. By using these affixes, you can prevent clashes between objects added by your extension and objects added by other extensions.

The supportedCountries property specifies the codes that correspond to the countries for which the product allows AppSource submissions. For more information, see Availability and supported Countries/Regions and Translations

The properties obsoleteTagVersion, obsoleteTagPattern, and obsoleteTagPatternDescription can be used to enable additional validation on object obsoletion. These are not required for AppSource submissions.

Example

In the following example, we will configure AppSourceCop to validate that all new elements have a name that contains one of the specified affixes.

Note

Make sure that code analysis is enabled and ${AppSourceCop} is specified in the list of enabled code analyzers. For more information see AL Language Extension Configuration.

We start by creating the default "Hello world" extension.

pageextension 50100 CustomerListExt extends "Customer List"
{
    trigger OnOpenPage();
    begin
        begin
            Message('App published: Hello world');
        end;
    end;
}

We continue by adding the configuration file AppSourceCop.json in the project's root folder and setting its content to the following.

{
    "mandatoryAffixes": [ "Foo", "Bar" ]
}

Important

If you are running a multi-root workspace environment, you must have one AppSourceCop.json file in the root folder of each of the projects. For more information, see Working with multiple AL project folders within one workspace.

You are immediately greeted by the following error message:

AS0011: The identifier 'CustomerListExt' must have at least one of the mandatory affixes 'Foo, Bar'.

Prepending Foo to the name of the page extension object will fix this error and prevent clashes between this page extension and page extensions added by other developers.

Note

It is still possible to use the mandatoryPrefix and mandatorySuffix properties in the AppSourceCop.json. For more information see AS0011.

See Also

Using the Code Analysis Tool
Ruleset for the Code Analysis Tool
Using the Code Analysis Tools with the Ruleset