apex-enterprise-patterns / fflib-apex-common-samplecode Goto Github PK
View Code? Open in Web Editor NEWSamples application illustrating the Apex Enterprise Patterns library
License: BSD 3-Clause "New" or "Revised" License
Samples application illustrating the Apex Enterprise Patterns library
License: BSD 3-Clause "New" or "Revised" License
should this be 'this.discountPercentage' instead of 'this, discountPercentage'?
Deploy to salesforce gave a bunch of errors. They all seem to be around Class InvoicingServiceImpl : Illegal assignment from fflib_IDomain to fflib_ISObjectDomain.
Can you please fix it so that I can deploy?
The fflib framework is installed, but when I try to install the sample app, I get the following error message:
Deployment Complete
Failures:
classes/Accounts.cls(53,5):Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/AccountsSelector.cls(53,5):Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/Application.cls(53,5):Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunitiesServiceTestIntegration.cls(53,5):Dependent class is invalid and needs recompilation:
Class OpportunitiesService : Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunitiesTest.cls(53,5):Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunitiesServiceTest.cls(53,5):Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunityApplyDiscountController.cls(53,5):Dependent class is invalid and needs recompilation:
Class OpportunitiesService : Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunityApplyDiscountControllerTest.cls(53,5):Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunityApplyDiscountControllerTestI.cls(53,5):Dependent class is invalid and needs recompilation:
Class OpportunityApplyDiscountController : Dependent class is invalid and needs recompilation:
Class OpportunitiesService : Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunityConsoleController.cls(53,5):Dependent class is invalid and needs recompilation:
Class OpportunitiesService : Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/InvoicingService.cls(53,5):Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/InvoicingServiceImpl.cls(53,5):Dependent class is invalid and needs recompilation:
Class InvoicingService : Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/InvoicingServiceTest.cls(53,5):Dependent class is invalid and needs recompilation:
Class InvoicingService : Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/Opportunities.cls(53,5):Dependent class is invalid and needs recompilation:
Class InvoicingService : Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunitiesResource.cls(53,5):Dependent class is invalid and needs recompilation:
Class OpportunitiesService : Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunitiesSelector.cls(53,5):Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunitiesService.cls(53,5):Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunitiesServiceImpl.cls(53,5):Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunityCreateInvoiceController.cls(53,5):Dependent class is invalid and needs recompilation:
Class OpportunitiesService : Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunityInvoicingController.cls(53,5):Dependent class is invalid and needs recompilation:
Class OpportunitiesService : Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunityLineItems.cls(53,5):Dependent class is invalid and needs recompilation:
Class Opportunities : Dependent class is invalid and needs recompilation:
Class InvoicingService : Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/OpportunityLineItemsSelector.cls(63,22):Method does not exist or incorrect signature: void getFieldListString() from the type OpportunityLineItemsSelector
classes/PricebookEntriesSelector.cls(53,5):Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/CreateInvoicesJob.cls(53,5):Dependent class is invalid and needs recompilation:
Class OpportunitiesService : Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
classes/DeveloperWorkItemsTest.cls(53,5):Dependent class is invalid and needs recompilation:
Class Application : Dependent class is invalid and needs recompilation:
Class OpportunitiesServiceImpl : Dependent class is invalid and needs recompilation:
Class OpportunitiesSelector : Dependent class is invalid and needs recompilation:
Class PricebookEntriesSelector : Method does not exist or incorrect signature: void getFieldListString() from the type PricebookEntriesSelector
triggers/OpportunitiesTrigger.trigger(31,37):Invalid type: Opportunities
triggers/OpportunityLineItemsTrigger.trigger(31,37):Invalid type: OpportunityLineItems
pages/opportunityapplydiscount.page(opportunityapplydiscount):Apex class 'OpportunityApplyDiscountController' does not exist
pages/opportunityapplydiscounts.page(opportunityapplydiscounts):Apex class 'OpportunityApplyDiscountController' does not exist
pages/opportunitycreateinvoice.page(opportunitycreateinvoice):Apex class 'OpportunityCreateInvoiceController' does not exist
pages/opportunitycreateinvoices.page(opportunitycreateinvoices):Apex class 'OpportunityCreateInvoiceController' does not exist
pages/opportunityinvoicing.page(opportunityinvoicing):Apex class 'OpportunityInvoicingController' does not exist
The linked YouTube video in readme.md is in private mode.
Also the other video is unavailable: http://dreamforce.vidyard.com/watch/7QtP2628KmtXfmiwI-7B1w%20
By way of example, I've excerpted from the samplecode Domain Opportunities.cls
.
Is this by design?
If onValidate()
places an error via opp.Type.addError(error(msg,opp,fieldToken))
on some record in the batch, say record 22, then when the onAfterInsert
comes along, the Accounts related to all opportunities in the batch including record 22, will go through the update via uow.commitWork()
.
This seems flawed, - if there is a onValidate()
handler error, the affected records should be excluded in the sample code from inclusion in accountIds
.
It would be nice if there were an easy way to communicate the erroneous records between handlers in the framework, but the errors(...)
method only saves the errors in a list, not a map keyed by the record.ID
.
I could, I guess, introduce my own error(...)
into a subclass of fflib_SObjectDomain
that in turn is extended by Opportunities.cls
. My version of error(..)
would capture the errorneous record id in a map for inspection by the onAfterInsert
and onAfterUpdate
handlers.
But I'm wondering if I'm missing something provided by the Domain layer that would obviate this seemingly basic feature.
public override void onValidate(Map<Id,SObject> existingRecords)
{
// Validate changes to Opportunities
for(Opportunity opp : (List<Opportunity>) Records)
{
Opportunity existingOpp = (Opportunity) existingRecords.get(opp.Id);
if(opp.Type != existingOpp.Type)
{
opp.Type.addError( error('You cannot change the Opportunity type once it has been created.', opp, Opportunity.Type) );
}
}
}
public override void onAfterInsert()
{
// Related Accounts
List<Id> accountIds = new List<Id>();
for(Opportunity opp : (List<Opportunity>) Records)
if(opp.AccountId!=null) // ?! what about excluding the opps that had their type changed ?
accountIds.add(opp.AccountId);
// Update last Opportunity activity on the related Accounts (via the Accounts domain class)
fflib_SObjectUnitOfWork uow = new fflib_SObjectUnitOfWork(new Schema.SObjectType[] { Account.SObjectType });
Accounts accounts = new Accounts([select Id, Name from Account where id in :accountIds]);
accounts.updateOpportunityActivity(uow);
uow.commitWork();
}
When the domain class was split into triggerHandler and domain classes, the PR #300 author @wimvelzeboer mentioned that domains could now be arbitrary ApexTypes
It would be nice to see this sample repo extended to show such an example. This would include:
Application.cls
As I understand it, such domains of arbitrary ApexTypes extend fflib_Objects
but I believe to implement factories and mocking support, some changes are needed in fflib_Application.cls
to support something other than SObjectTypes as keys to the constructor class.
I followed this example to write my tests and it is not working.
this is the Test I can't deploy
static void itShouldUpdateDocumentSigningRequestsStatusWhenGivenIds() {
List<DocumentSigningRequest__c> documentSigningRequests = new List<DocumentSigningRequest__c>
{
new DocumentSigningRequest__c(Status__c = 'New', Id = fflib_IDGenerator.generate(Schema.DocumentSigningRequest__c.SObjectType)),
new DocumentSigningRequest__c(Status__c = 'New', Id = fflib_IDGenerator.generate(Schema.DocumentSigningRequest__c.SObjectType)),
new DocumentSigningRequest__c(Status__c = 'New', Id = fflib_IDGenerator.generate(Schema.DocumentSigningRequest__c.SObjectType))
};
Set<Id> documentSigningRequestIds = new Map<Id, SObject>(documentSigningRequests).keySet();
fflib_ApexMocks mocks = new fflib_ApexMocks();
fflib_ISObjectUnitOfWork unitOfWorkMock = new fflib_SObjectMocks.SObjectUnitOfWork(mocks);
DSP_IDocumentSigningRequestsSelector selectorMock = (DSP_IDocumentSigningRequestsSelector) mocks.mock(DSP_DocumentSigningRequestsSelector.class);
DSP_IDocumentSigningRequests domainMock = (DSP_IDocumentSigningRequests) mocks.mock(DSP_DocumentSigningRequests.class);
mocks.startStubbing();
mocks.when(selectorMock.sObjectType()).thenReturn(Schema.Account.SObjectType);
mocks.when(selectorMock.selectSObjectsById(documentSigningRequestIds)).thenReturn(documentSigningRequests);
mocks.when(domainMock.sObjectType()).thenReturn(Schema.DocumentSigningRequest__c.SObjectType);
mocks.when(domainMock.getDocumentSigningRequests()).thenReturn(documentSigningRequests);
mocks.stopStubbing();
DSP_Application.UnitOfWork.setMock(unitOfWorkMock);
DSP_Application.Domain.setMock(domainMock);
DSP_Application.Selector.setMock(selectorMock);
Test.startTest();
new DSP_DocumentSigningRequestsServiceImpl().updateStatus(documentSigningRequestIds, 'Publish');
Test.stopTest();
((DSP_IDocumentSigningRequestsSelector) mocks.verify(selectorMock)).selectSObjectsById(documentSigningRequests);
((DSP_IDocumentSigningRequests) mocks.verify(domainMock)).setStatus();
((fflib_ISObjectUnitOfWork) mocks.verify(unitOfWorkMock)).registerDirty(documentSigningRequests);
((fflib_ISObjectUnitOfWork) mocks.verify(unitOfWorkMock)).commitWork();
}
This is DSP_IDocumentSigningRequests interface
public interface DSP_IDocumentSigningRequests extends fflib_ISObjectDomain {
void setBody(Map<Id, String> bodyMappedById);
void setStatus(String status);
Set<Id> getParentIds();
Set<Id> getRecordsIds();
List<DocumentSigningRequest__c> getDocumentSigningRequests();
Map<Id, DocumentSigningRequest__c> getRecordsMap();
}
This is DSP_IDocumentSigningRequestsSelector interface
public interface DSP_IDocumentSigningRequestsSelector extends fflib_ISObjectSelector {
List<DocumentSigningRequest__c> selectAllWithSignersById(Set<Id> ids);
Database.QueryLocator selectAllNewQueryLocator();
}
In your example, your IAccountSelector
interface does not have selectSObjectsById()
declared and yet it seems to work. How did you do it? My interface is also extending fflib_ISObjectSelector
and I can't deploy because of that error.
And I don't know what is happending for setStatus()
. It is declared in my interface, and I have mocked it. So what is wrong?
With message
System.AssertException: Assertion Failed: Expected: Last Opportunity Raised, Actual: null
Is it supposed to fail?
I noticed 7 months ago changes were made to separate the Domain into two entities, one to work as the trigger handler and the other to basically manipulate data. This is a breaking change because class and interface names were changed. So it would be nice to have a Doc showing before and after, when these type of changes happen before merging them. Also, it would be nice if you could tag at least these Major changes, so people are aware of them.
Because my project has an older version of FFLIB and the sample code is using the latest, when I wrote my app following the sample I got some errors while deploying. Because of these errors, I spent around an hour reading the sample code changes to understand what I should do to enable my app to work with the old fflib.
The IOpportunitiesSelector does not cover the following methods in OpportunitiesSelector:
The blog post at http://superdupercode.blogspot.com/2016/03/apex-mocks-matchers.html is a great way for consumers of Apex Mocks to learn about the new features of Matcher support (which is awesome btw!).
I think it makes sense to update sample code to demo the usage as well. Thoughts?
Mocks: line 18, column 31: Method does not exist or incorrect signature: [fflib_ApexMocks].mockNonVoidMethod(Mocks.OpportunitiesSelector, String, List)
Needs updating to the more recent version of the fflib_ApexMocks:
requiring following parameters:
public Object mockNonVoidMethod(Object mockInstance, String methodName, List<Type> methodArgTypes, List<Object> methodArgValues)
While only receiving the deprecated version:
public Object mockNonVoidMethod(Object mockInstance, String methodName, Object methodArg)
This is also causing the deployment of this repository to fail.
In these examples I see that thee are a number of different ways to create new instances for the several classes.
For domains there is a static method newInstance
on the implementation class Accounts
(e.g. static IAccounts newInstance(Set<Id> recordIdSet)
).
The service classes have their own separate class (e.g. OpportunitiesService
) with a static version of all the method signatures of its Interface.
There are also many developers I work with, who find this a bit cumbersome, a too big overhead and duplication of method signatures.
Would it be an idea to do something similar as we do with the domain?
How would you feel about calling service methods not via:
OpportunitiesService.applyDiscounts(ids, 10);
but via a lazy loading static property on the domain:
Opportunities.Service.applyDiscounts(ids, 10);
or exactly the same as the domain:
OpportunitiesService.newInstance().applyDiscounts(Ids, 10);
Have you had any discussions about this approach in the past?
It would be nice if we can avoid that class with statics..
Shouldn't it be Account list in public static IAccounts newInstance(List<Opportunity> sObjectList)
?
All Component Failures:
When creating an AccountsServiceTest (similar to the OpportunitiesServiceTest in the sample), I have the following error:
Ambiguous method signature: void setMock.
The test method:
@IsTest
private static void testSync(){
// Create mocks
fflib_ApexMocks mocks = new fflib_ApexMocks();
fflib_ISObjectUnitOfWork uowMock = (fflib_ISObjectUnitOfWork) mocks.mock(fflib_ISObjectUnitOfWork.class);
IAccounts domainMock = (IAccounts) mocks.mock(IAccounts.class);
IAccountsSelector selectorMock = (IAccountsSelector) mocks.mock(IAccountsSelector.class);
// Given
mocks.startStubbing();
List<Account> testAccsList = new List<Account> {
new Account(
Id = fflib_IDGenerator.generate(Account.SObjectType),
Name = 'Clinic Test',
RecordTypeId = Schema.SObjectType.Account.getRecordTypeInfosByDeveloperName().get(Label.RecordType_BusinessAccount).getRecordTypeId(),
Type = 'IVF Clinic',
Subsidiary__c = 'SPAIN',
Category__c = 'A',
BillingCountry = 'Spain',
SRMExternalId__c = '2222')};
Set<Id> testAccSet = new Map<Id, Account>(testAccsList).keySet();
mocks.when(domainMock.sObjectType()).thenReturn(Account.SObjectType);
mocks.when(selectorMock.sObjectType()).thenReturn(Account.SObjectType);
mocks.when(selectorMock.selectById(testAccSet)).thenReturn(testAccsList);
mocks.stopStubbing();
Application.UnitOfWork.setMock(uowMock);
Application.Domain.setMock(domainMock);
Application.Selector.setMock(selectorMock);
// When
AccountsService.sync(testAccSet);
// Then
((IAccounts)
mocks.verify(domainMock)).sync(uowMock);
((fflib_ISObjectUnitOfWork)
mocks.verify(uowMock, 1)).commitWork();
}
My IAccounts is like this:
public interface IAccounts extends fflib_ISObjectDomain { void sync(fflib_ISObjectUnitOfWork uow); }
In order to patch it, I added a new setMock function that receives an IAccounts as the parameter, but it is obviously a patch.
Can anyone please tell me why am I getting this error?
Thanks in advance.
Because records in a before insert/before update trigger should not be updated, it would be good to have an example of how to deal with them. The sample code only contains examples of on after trigger events that pair nicely with UoW and other domains.
When deploying the sample code to an org using the deploy tool, there is the following deployment error:
deploy/classes/OpportunitiesTest.cls(38,38):Invalid type: fflib_SObjectMocks.SObjectUnitOfWork
I believe this is because the fflib_SObjectMocks pattern has been replaced, and line 38 on the test class should be:
fflib_SObjectUnitOfWork uowMock =
(fflib_SObjectUnitOfWork) mocks.mock(fflib_SObjectUnitOfWork.class);
I am working on a project in which we need to test an APEX REST Service in such a way that no actual data is created in Salesforce during the testcases execution. I am new to APEX Development.
Searching on the web took me to fflib-apex-mocks library which seems to serve the purpose of avoiding the usage of actual test data inserted in the database for testcases execution. I have installed fflib-apex-mocks and fflib-apex-common in my sandbox environment.
So far, I am not able to find out a step-by-step guide as what I need to do if I want to test my existing Salesforce Objects at a unit level and how can I test my APEX Rest Service? From looking at the fflib-apex-common-samplecode it seems that I need to define classes for my Salesforce objects, I am not sure if I am getting this right.
At a higher-level, below are my questions at a higher-level:
Can someone please help me out in getting started?
Unfortunately, @afawcett's DreamForce 2013 session recording video has been marked as private on YouTube... ๐ข
I think it would be very beneficial to new developers if it could be made public again, or if a reupload could be linked to.
It is linked to in the README on this line.
The YouTube video is linked here.
I am trying to deploy the sample code to a brand new org (the deployment of mok and common went fine) and i have set the version to 37.0 Getting the following error
C:\apexsharp\AdvanceSalesForce\src\applications\standard__Content.app
Error:(1, 1) Property 'formFactors' not valid in version 37.0
C:\apexsharp\AdvanceSalesForce\src\applications\standard__Community.app
Error:(1, 1) Property 'formFactors' not valid in version 37.0
C:\apexsharp\AdvanceSalesForce\src\applications\standard__LightningSalesConsole.app
Error:(1, 1) Property 'formFactors' not valid in version 37.0
C:\apexsharp\AdvanceSalesForce\src\applications\standard__LightningService.app
Error:(1, 1) Property 'formFactors' not valid in version 37.0
C:\apexsharp\AdvanceSalesForce\src\applications\standard__Marketing.app
Error:(1, 1) Property 'formFactors' not valid in version 37.0
C:\apexsharp\AdvanceSalesForce\src\applications\standard__Service.app
Error:(1, 1) Property 'formFactors' not valid in version 37.0
C:\apexsharp\AdvanceSalesForce\src\applications\standard__ServiceConsole.app
Error:(1, 1) Property 'enableListViewHover' not valid in version 37.0
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.