diff --git a/404.html b/404.html index 5a25a794e6..f447aa93a6 100644 --- a/404.html +++ b/404.html @@ -24,10 +24,10 @@ Netsells Code Standards - + -

404

Looks like we've got some broken links.
Take me home
- +

404

How did we get here?
Take me home
+ diff --git a/android/clean-architecture.html b/android/clean-architecture.html index 4fc7f9fa72..1d65f7d97e 100644 --- a/android/clean-architecture.html +++ b/android/clean-architecture.html @@ -24,7 +24,7 @@ Clean Architecture | Netsells Code Standards - +

Clean Architecture

Android projects should use the Clean Architecture to ensure maintainability and testability. In other words, the project should be split into features with each feature containing a data layer, a domain layer, and a presentation layer. Additionally, a core directory at the root of the source code directory can hold project-wide code where appropriate.

+--- src
@@ -48,6 +48,6 @@
             +--- presentation
                 ** Activities, fragments, adapters, and views **
 

Consider splitting your project into an app module, containing the data and presentation layers, and a core module containing the domain layer.

Domain Layer

When writing a feature it's sensible to write the domain layer first.

Start with entities, which should be simple Kotlin data classes representing the data this feature is working with.

Then create repositories, which should be interfaces or abstract classes defining the data transactions supported by this feature.

Then create use cases, which are designed to be called by the presentation layer. These should call the repositories and return data as the presentation layer requires it. In other words, use cases are delegates for the presentation layer's business logic.

Data layer

The data layer implements the repositories defined in the domain layer. This is done by implementing data sources, which fetch data from remote locations like databases and APIs. This data is then passed to the repository implementatations in the form of models, which extend the entities defined in the domain layer.

Presentation layer

This layer contains all presentation-related code including activities, fragments, viewmodels, adapters etc. It should use usecases to interact with the domain layer.

The presentation layer should be built using MVVM.

- + diff --git a/android/code-style.html b/android/code-style.html index f0848b1686..25782b0c7e 100644 --- a/android/code-style.html +++ b/android/code-style.html @@ -24,10 +24,10 @@ Code Style | Netsells Code Standards - +

Code Style

Kotlin

Kotlin files should be styled according to the official code style guideopen in new window and Android Kotlin style guideopen in new window.

Java

Java should be styled according to the Google Java Style Guideopen in new window.

Enforcement

Code style should be enforced using spotlessopen in new window.

- + diff --git a/android/coroutines.html b/android/coroutines.html index 8233910e83..f00c19889e 100644 --- a/android/coroutines.html +++ b/android/coroutines.html @@ -24,10 +24,10 @@ Coroutines | Netsells Code Standards - +

Coroutines

Use of Kotlin coroutines is strongly recommended for asynchronous tasks like network requests.

When invoking async tasks from the presentation layer, rather than using callbacks consider returning a Job from your use cases. Then the presentation layer can react to the result using invokeOnCompletion.

- + diff --git a/android/dependency-injection.html b/android/dependency-injection.html index ea6a7e1012..34e61a8d04 100644 --- a/android/dependency-injection.html +++ b/android/dependency-injection.html @@ -24,10 +24,10 @@ Dependency Injection | Netsells Code Standards - +

Dependency Injection

Dependency injection should be done using Koinopen in new window for Kotlin projects. Legacy Java projects mostly use Daggeropen in new window.

- + diff --git a/android/error-handling.html b/android/error-handling.html index 56e69f84f6..ce4b9d7b5c 100644 --- a/android/error-handling.html +++ b/android/error-handling.html @@ -24,7 +24,7 @@ Error Handling | Netsells Code Standards - +

Error Handling

Often, error handling amounts to catching exceptions in the UI and displaying the message. This works, but has some important drawbacks:

  • Relies on the developer building the UI understanding which exceptions are possible, and which to handle.
  • Couples the implementation of a data source to the implementation of the UI, reducing the maintainability of the project.
  • Encourages developers to simply use catch (e: Exception), which is bad practice

Effective Error Handling

An effective error handling solution solves all of these problems by:

  • Catching relevant exceptions early and propagating them to the UI in a way that is not specific to the data source implementation
  • Not catching unexpected exceptions
    • While this seems counter-intuitive, unexpected exceptions indicate something has gone horribly wrong, and often the safest thing to do here is to just kill the process
  • Make it easier for developers to handle failures than to ignore them

To this end, when handling errors, we use two concepts: Either and Failure.

Failure

A Failure should represent an expected error. An example implementation of a Failure in Kotlin is:

/**
@@ -107,6 +107,6 @@
     }
 }
 
- + diff --git a/android/index.html b/android/index.html index 1160300766..1a6a27ae98 100644 --- a/android/index.html +++ b/android/index.html @@ -24,10 +24,10 @@ Android | Netsells Code Standards - +

Android

This section contains the standard best practices we follow on new Android projects.

- + diff --git a/android/kotlin.html b/android/kotlin.html index ae9557498d..7191cae6dc 100644 --- a/android/kotlin.html +++ b/android/kotlin.html @@ -24,10 +24,10 @@ Kotlin | Netsells Code Standards - +

Kotlin

Unless absolutely necessary, all new Android code should be written in Kotlin.

- + diff --git a/android/local-databases.html b/android/local-databases.html index 43b50495ad..49e4945c64 100644 --- a/android/local-databases.html +++ b/android/local-databases.html @@ -24,10 +24,10 @@ Local Databases & Persistence | Netsells Code Standards - +

Local Databases & Persistence

For local databases and persistence, use Roomopen in new window.

The main database object should be stored in the core/data/datasources package, with individual DAOs stored in their respective feature's data/datasources package.

- + diff --git a/android/mvvm.html b/android/mvvm.html index 04511b0d28..bb1733b153 100644 --- a/android/mvvm.html +++ b/android/mvvm.html @@ -24,10 +24,10 @@ MVVM | Netsells Code Standards - +

MVVM

Android projects should use the MVVM architecture, backed by Google's ViewModel architecture componentopen in new window.

Every fragment and activity should have an associated ViewModel, which calls use cases from the domain layer (see Clean Architecture).

- + diff --git a/android/network-requests.html b/android/network-requests.html index 7759788cc2..709d0934bc 100644 --- a/android/network-requests.html +++ b/android/network-requests.html @@ -24,10 +24,10 @@ Network Requests | Netsells Code Standards - +

Network Requests

You should use Retrofitopen in new window to interact with REST APIs, and Apolloopen in new window for GraphQL requests.

Rather than creating one huge ApiService interface, consider breaking this up based on features.

- + diff --git a/android/pull-request-labels.html b/android/pull-request-labels.html index f4eb40407b..ad16f2c223 100644 --- a/android/pull-request-labels.html +++ b/android/pull-request-labels.html @@ -24,10 +24,10 @@ Pull Request Labelling | Netsells Code Standards - +

Pull Request Labelling

When you open a Pull Request, two labels will be automatically applied for you:

  • A label indicating the size of the PR, based on lines changed
  • A label indicating the type of PR, based on the branch you're asking to merge from

In addition, you must add the following labels if appropriate:

  • critical if the PR must be addressed urgently
  • sanity-check if the code included in this PR has already been reviewed
    • e.g. An epic/* -> develop PR
  • deployment if this PR will upload a new production build
    • Should only be used on release/* -> master PRs

Additionally, if you have started to review a large PR, you can add an in-progress label to ensure someone else doesn't also start a review.

- + diff --git a/android/testing.html b/android/testing.html index 1a75027e26..a7c960d1dc 100644 --- a/android/testing.html +++ b/android/testing.html @@ -24,10 +24,10 @@ Testing | Netsells Code Standards - +

Testing

The Clean Architecture makes the project highly testable. Consider using a test-driven development workflow when implementing features.

You'll probably want to make use of AndroidX Testopen in new window, Robolectricopen in new window, and Mockitoopen in new window.

Types of Test

  • Local tests can be run on any machine with a JVM, including your computer and a continuous integration server

  • Instrumentation tests must be run on a real or emulated Android device

  • Unit tests test individual classes in isolation, using mocked versions of dependencies

  • Integration tests test the entire system as a whole using real dependencies

Requirements

When reviewing pull requests, please follow these requirements.

Pull Requests must not be merged with failing tests.

New Projects

  • MUST include local unit tests for everything in the data and domain layers, as well as state management components such as ViewModels.
  • SHOULD include local unit tests for Fragments and Activities, provided the tests aren't too time-consuming to write.
    • You MUST use Robolectric when writing these tests, so that emulators/devices are not required.
  • CONSIDER including local integration tests which test the entire feature against mocked external dependencies (e.g. a mocked web server).
    • Use your judgement to decide whether this is worth the time you might spend.
  • SHOULD NOT include instrumented tests. These have limited usefulness and take a very long time to write. PREFER manual integration testing.

Legacy Projects

  • CONSIDER include unit tests for new functionality as above, wherever possible
    • Make a judgement call here. If the codebase is super untestable, it may not be worth the hassle.

How do I know what to test?

As mentioned above, the Clean Architecture makes the project highly testable. It's pretty clear that you can test each component of the Clean Architecture, and what you should be testing.

If you're unsure, think about the concept of mutation testing. If you deliberately introduce a random bug, like removing a line of code or replacing a < with a >, will your test fail? If not, it's not doing the job it's designed for, so you should update the test to catch that bug. Remember, tests exist to catch mistakes made by developers, so make sure you account for every possible mistake.

- + diff --git a/assets/accessibility.html-8d50a5cd.js b/assets/accessibility.html-fb379aa3.js similarity index 81% rename from assets/accessibility.html-8d50a5cd.js rename to assets/accessibility.html-fb379aa3.js index e9ae96e60d..2089f6ac74 100644 --- a/assets/accessibility.html-8d50a5cd.js +++ b/assets/accessibility.html-fb379aa3.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-e2885e62","path":"/frontend/accessibility.html","title":"Accessibility","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/accessibility.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-e2885e62","path":"/frontend/accessibility.html","title":"Accessibility","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/accessibility.md"}');export{e as data}; diff --git a/assets/apis.html-81a6f02b.js b/assets/apis.html-e80ad727.js similarity index 87% rename from assets/apis.html-81a6f02b.js rename to assets/apis.html-e80ad727.js index ae97c50422..66338cb2b8 100644 --- a/assets/apis.html-81a6f02b.js +++ b/assets/apis.html-e80ad727.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-c1772168","path":"/backend/apis.html","title":"APIs","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Eloquent API Resources, Fractal or 🤔","slug":"eloquent-api-resources-fractal-or-🤔","link":"#eloquent-api-resources-fractal-or-🤔","children":[{"level":3,"title":"Eloquent - API Resources","slug":"eloquent-api-resources","link":"#eloquent-api-resources","children":[]},{"level":3,"title":"Fractal","slug":"fractal","link":"#fractal","children":[]},{"level":3,"title":"GraphQL","slug":"graphql","link":"#graphql","children":[]}]},{"level":2,"title":"Namespaced Data","slug":"namespaced-data","link":"#namespaced-data","children":[]},{"level":2,"title":"Naming of Properties","slug":"naming-of-properties","link":"#naming-of-properties","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/apis.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-c1772168","path":"/backend/apis.html","title":"APIs","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Eloquent API Resources, Fractal or 🤔","slug":"eloquent-api-resources-fractal-or-🤔","link":"#eloquent-api-resources-fractal-or-🤔","children":[{"level":3,"title":"Eloquent - API Resources","slug":"eloquent-api-resources","link":"#eloquent-api-resources","children":[]},{"level":3,"title":"Fractal","slug":"fractal","link":"#fractal","children":[]},{"level":3,"title":"GraphQL","slug":"graphql","link":"#graphql","children":[]}]},{"level":2,"title":"Namespaced Data","slug":"namespaced-data","link":"#namespaced-data","children":[]},{"level":2,"title":"Naming of Properties","slug":"naming-of-properties","link":"#naming-of-properties","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/apis.md"}');export{e as data}; diff --git a/assets/app-23c5871f.js b/assets/app-a69c24fa.js similarity index 96% rename from assets/app-23c5871f.js rename to assets/app-a69c24fa.js index a646b41009..9680d6b1a5 100644 --- a/assets/app-23c5871f.js +++ b/assets/app-a69c24fa.js @@ -1,4 +1,4 @@ -import{d as r,r as z,a as Dt,b as hn,c as k,i as ne,e as xe,f as gn,g as Rt,o as te,h as g,j as $,k as ae,l as Pe,m as Vt,u as ye,n as kt,T as We,p,q as b,s as j,t as be,v as F,w as ee,x as wt,_ as N,y as En,z as m,A as me,B as bn,C as Ue,D as yn,E as Ln,F as Tn,G as On,H as Ge,I as jt,J as Pn,K as Ke,L as fe,M as le,N as C,O as Z,P as ce,Q as M,R as V,S as Qe,U as W,V as G,W as lt,X as An,Y as In,Z as ke,$ as we,a0 as St,a1 as Dn,a2 as Rn,a3 as Vn,a4 as kn,a5 as wn,a6 as jn,a7 as Sn}from"./framework-9cabc8c6.js";const xn="modulepreload",$n=function(e){return"/code-standards/"+e},at={},t=function(n,i,o){if(!i||i.length===0)return n();const l=document.getElementsByTagName("link");return Promise.all(i.map(s=>{if(s=$n(s),s in at)return;at[s]=!0;const d=s.endsWith(".css"),a=d?'[rel="stylesheet"]':"";if(!!o)for(let _=l.length-1;_>=0;_--){const f=l[_];if(f.href===s&&(!d||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${s}"]${a}`))return;const v=document.createElement("link");if(v.rel=d?"stylesheet":xn,d||(v.as="script",v.crossOrigin=""),v.href=s,document.head.appendChild(v),d)return new Promise((_,f)=>{v.addEventListener("load",_),v.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${s}`)))})})).then(()=>n())},Cn={"v-8daa1a0e":()=>t(()=>import("./index.html-68717985.js"),[]).then(({data:e})=>e),"v-c1f0fcce":()=>t(()=>import("./index.html-ea666941.js"),[]).then(({data:e})=>e),"v-466569ae":()=>t(()=>import("./clean-architecture.html-72d2ea41.js"),[]).then(({data:e})=>e),"v-0f9a8a22":()=>t(()=>import("./code-style.html-a4cb7401.js"),[]).then(({data:e})=>e),"v-16386b36":()=>t(()=>import("./coroutines.html-ee941575.js"),[]).then(({data:e})=>e),"v-529e84aa":()=>t(()=>import("./dependency-injection.html-3faa3c29.js"),[]).then(({data:e})=>e),"v-757f0c54":()=>t(()=>import("./error-handling.html-b8f2ddd5.js"),[]).then(({data:e})=>e),"v-3e66553f":()=>t(()=>import("./kotlin.html-16fbee87.js"),[]).then(({data:e})=>e),"v-631ebf3c":()=>t(()=>import("./local-databases.html-4044e76d.js"),[]).then(({data:e})=>e),"v-7c84f940":()=>t(()=>import("./mvvm.html-0ef4e6a5.js"),[]).then(({data:e})=>e),"v-3798263d":()=>t(()=>import("./network-requests.html-28650a7c.js"),[]).then(({data:e})=>e),"v-67bfbd0d":()=>t(()=>import("./pull-request-labels.html-a48d8a9d.js"),[]).then(({data:e})=>e),"v-0e9bbce2":()=>t(()=>import("./testing.html-8019f3c4.js"),[]).then(({data:e})=>e),"v-551bb614":()=>t(()=>import("./index.html-1f443265.js"),[]).then(({data:e})=>e),"v-c1772168":()=>t(()=>import("./apis.html-81a6f02b.js"),[]).then(({data:e})=>e),"v-b97e7df6":()=>t(()=>import("./general.html-43b84544.js"),[]).then(({data:e})=>e),"v-35d72f40":()=>t(()=>import("./hatchly.html-2475eb56.js"),[]).then(({data:e})=>e),"v-6957d9d4":()=>t(()=>import("./laravel.html-53a107a1.js"),[]).then(({data:e})=>e),"v-0f7bc716":()=>t(()=>import("./php.html-e5bfdfb9.js"),[]).then(({data:e})=>e),"v-7d441486":()=>t(()=>import("./recommended-packages.html-48ccd635.js"),[]).then(({data:e})=>e),"v-5033abfc":()=>t(()=>import("./index.html-3eec43fe.js"),[]).then(({data:e})=>e),"v-565ee9db":()=>t(()=>import("./c-sharp.html-be6d9062.js"),[]).then(({data:e})=>e),"v-7428160f":()=>t(()=>import("./general-guidelines.html-93a42723.js"),[]).then(({data:e})=>e),"v-2a1c4858":()=>t(()=>import("./recommended-packages.html-2caea997.js"),[]).then(({data:e})=>e),"v-59c1b58c":()=>t(()=>import("./index.html-428a20d2.js"),[]).then(({data:e})=>e),"v-02d166ed":()=>t(()=>import("./codesigning.html-5d539206.js"),[]).then(({data:e})=>e),"v-3e9b8cb3":()=>t(()=>import("./continuous-delivery.html-ef265d04.js"),[]).then(({data:e})=>e),"v-1f335512":()=>t(()=>import("./continuous-integration.html-d3878c20.js"),[]).then(({data:e})=>e),"v-37a57446":()=>t(()=>import("./crash-reporting.html-e6d469a3.js"),[]).then(({data:e})=>e),"v-66577348":()=>t(()=>import("./linting-rules.html-1cd9f94b.js"),[]).then(({data:e})=>e),"v-3a4b8043":()=>t(()=>import("./monarch.html-ad074d20.js"),[]).then(({data:e})=>e),"v-664e86a4":()=>t(()=>import("./multiple-firebase-environments.html-f6fb1ed6.js"),[]).then(({data:e})=>e),"v-539bafa3":()=>t(()=>import("./naming-widgets.html-c3815153.js"),[]).then(({data:e})=>e),"v-2d5b4388":()=>t(()=>import("./project-setup.html-5e45efdd.js"),[]).then(({data:e})=>e),"v-382c27e4":()=>t(()=>import("./recommended-packages.html-dac011b8.js"),[]).then(({data:e})=>e),"v-50b19462":()=>t(()=>import("./security-practices.html-7190f4e2.js"),[]).then(({data:e})=>e),"v-55f3772e":()=>t(()=>import("./state-management.html-289264c4.js"),[]).then(({data:e})=>e),"v-03009c55":()=>t(()=>import("./testing.html-61cb9e28.js"),[]).then(({data:e})=>e),"v-9c19581a":()=>t(()=>import("./third-party-packages.html-58a49699.js"),[]).then(({data:e})=>e),"v-06198984":()=>t(()=>import("./index.html-04049003.js"),[]).then(({data:e})=>e),"v-e2885e62":()=>t(()=>import("./accessibility.html-8d50a5cd.js"),[]).then(({data:e})=>e),"v-14e18006":()=>t(()=>import("./automated-workflows.html-79aba81f.js"),[]).then(({data:e})=>e),"v-b37d638c":()=>t(()=>import("./css.html-0eb77985.js"),[]).then(({data:e})=>e),"v-cf5f91ec":()=>t(()=>import("./html.html-6a8f4b23.js"),[]).then(({data:e})=>e),"v-5aa1fcf0":()=>t(()=>import("./javascript.html-5fc80820.js"),[]).then(({data:e})=>e),"v-e0725fa6":()=>t(()=>import("./performance.html-ec54620c.js"),[]).then(({data:e})=>e),"v-3d0401d4":()=>t(()=>import("./recommended-packages.html-405842b8.js"),[]).then(({data:e})=>e),"v-56ad03c2":()=>t(()=>import("./required-qa.html-e9fc67f9.js"),[]).then(({data:e})=>e),"v-7c336682":()=>t(()=>import("./storybook.html-ee3c58bd.js"),[]).then(({data:e})=>e),"v-a43f7ed2":()=>t(()=>import("./vue.html-9fba51c9.js"),[]).then(({data:e})=>e),"v-4290fe40":()=>t(()=>import("./index.html-158745f1.js"),[]).then(({data:e})=>e),"v-1efcfaf2":()=>t(()=>import("./git.html-51c6b812.js"),[]).then(({data:e})=>e),"v-60154c4d":()=>t(()=>import("./pull-requests.html-3f70dcaa.js"),[]).then(({data:e})=>e),"v-7448383b":()=>t(()=>import("./index.html-e03d0433.js"),[]).then(({data:e})=>e),"v-6312ceea":()=>t(()=>import("./architecture.html-4d591889.js"),[]).then(({data:e})=>e),"v-41cdb664":()=>t(()=>import("./bundler.html-edf63831.js"),[]).then(({data:e})=>e),"v-8f9aa8c8":()=>t(()=>import("./codesigning.html-c4c0e97f.js"),[]).then(({data:e})=>e),"v-e5d488aa":()=>t(()=>import("./layouts.html-887133d8.js"),[]).then(({data:e})=>e),"v-69fbfaf5":()=>t(()=>import("./linting.html-57d401c4.js"),[]).then(({data:e})=>e),"v-19659084":()=>t(()=>import("./testing.html-1b162d10.js"),[]).then(({data:e})=>e),"v-07b78fc1":()=>t(()=>import("./pull-requests.html-8fa5eb50.js"),[]).then(({data:e})=>e),"v-6250ba7a":()=>t(()=>import("./index.html-8391caa5.js"),[]).then(({data:e})=>e),"v-2628fc2c":()=>t(()=>import("./architecture.html-3ec492d5.js"),[]).then(({data:e})=>e),"v-e38a0e40":()=>t(()=>import("./handling-errors.html-5c434ad2.js"),[]).then(({data:e})=>e),"v-22e0faa6":()=>t(()=>import("./localization.html-bfd25141.js"),[]).then(({data:e})=>e),"v-97fb1a00":()=>t(()=>import("./state-management.html-ed5e74e6.js"),[]).then(({data:e})=>e),"v-37802094":()=>t(()=>import("./index.html-2840a318.js"),[]).then(({data:e})=>e),"v-a90e54ba":()=>t(()=>import("./index.html-43ce196b.js"),[]).then(({data:e})=>e),"v-2a442892":()=>t(()=>import("./cheat-sheet.html-a226773f.js"),[]).then(({data:e})=>e),"v-57e37f2f":()=>t(()=>import("./unit-testing.html-c06fbfe4.js"),[]).then(({data:e})=>e),"v-54eb29ab":()=>t(()=>import("./visual-regression-testing.html-0422f0c7.js"),[]).then(({data:e})=>e),"v-64f437db":()=>t(()=>import("./what-to-test.html-62510e34.js"),[]).then(({data:e})=>e),"v-e9c8dde2":()=>t(()=>import("./index.html-a27be770.js"),[]).then(({data:e})=>e),"v-4b210889":()=>t(()=>import("./block-no-empty.html-e4d495b5.js"),[]).then(({data:e})=>e),"v-af607c30":()=>t(()=>import("./color-hex-length.html-fad23e9d.js"),[]).then(({data:e})=>e),"v-519968f9":()=>t(()=>import("./color-named.html-5f3f962c.js"),[]).then(({data:e})=>e),"v-397d0ca7":()=>t(()=>import("./color-no-invalid-hex.html-5c497ea8.js"),[]).then(({data:e})=>e),"v-bb23520c":()=>t(()=>import("./declaration-block-no-duplicate-properties.html-f491a79b.js"),[]).then(({data:e})=>e),"v-6c22cf5e":()=>t(()=>import("./declaration-block-no-shorthand-property-overrides.html-9a1fa8e7.js"),[]).then(({data:e})=>e),"v-7e06cb41":()=>t(()=>import("./declaration-no-important.html-dd521934.js"),[]).then(({data:e})=>e),"v-48eac4b6":()=>t(()=>import("./length-zero-no-unit.html-ef7483df.js"),[]).then(({data:e})=>e),"v-41cad91c":()=>t(()=>import("./property-no-unknown.html-63d9822e.js"),[]).then(({data:e})=>e),"v-531ca99c":()=>t(()=>import("./shorthand-property-no-redundant-values.html-e4d55522.js"),[]).then(({data:e})=>e),"v-f3429ebe":()=>t(()=>import("./unit-no-unknown.html-d4059eb0.js"),[]).then(({data:e})=>e),"v-357fd18a":()=>t(()=>import("./index.html-99883bf9.js"),[]).then(({data:e})=>e),"v-100a2dc2":()=>t(()=>import("./arrow-parens.html-abbce7f3.js"),[]).then(({data:e})=>e),"v-a313ce78":()=>t(()=>import("./arrow-spacing.html-fe101eee.js"),[]).then(({data:e})=>e),"v-0aa90808":()=>t(()=>import("./comma-dangle.html-aa7d699e.js"),[]).then(({data:e})=>e),"v-3c3f0636":()=>t(()=>import("./curly.html-d03ace04.js"),[]).then(({data:e})=>e),"v-12563f14":()=>t(()=>import("./dot-location.html-1f6fcc48.js"),[]).then(({data:e})=>e),"v-91ea676e":()=>t(()=>import("./dot-notation.html-9fe70716.js"),[]).then(({data:e})=>e),"v-6a6febae":()=>t(()=>import("./eol-last.html-fe90ce71.js"),[]).then(({data:e})=>e),"v-7153028b":()=>t(()=>import("./eqeqeq.html-f3e5cbeb.js"),[]).then(({data:e})=>e),"v-472c7927":()=>t(()=>import("./import-extensions.html-3c304518.js"),[]).then(({data:e})=>e),"v-566d8fe3":()=>t(()=>import("./indent.html-d1960e0a.js"),[]).then(({data:e})=>e),"v-276e9d03":()=>t(()=>import("./jsdoc-check-alignment.html-1d514864.js"),[]).then(({data:e})=>e),"v-3904919d":()=>t(()=>import("./jsdoc-check-indentation.html-7037c44e.js"),[]).then(({data:e})=>e),"v-1e8810be":()=>t(()=>import("./jsdoc-check-param-names.html-bbcb99c0.js"),[]).then(({data:e})=>e),"v-6a1179c9":()=>t(()=>import("./jsdoc-check-syntax.html-0c90340e.js"),[]).then(({data:e})=>e),"v-4e16c6d1":()=>t(()=>import("./jsdoc-check-tag-names.html-82b43fd3.js"),[]).then(({data:e})=>e),"v-f2ae9aa6":()=>t(()=>import("./jsdoc-check-types.html-5674a85c.js"),[]).then(({data:e})=>e),"v-e30b0768":()=>t(()=>import("./jsdoc-implements-on-classes.html-eeaa055b.js"),[]).then(({data:e})=>e),"v-3e7e482d":()=>t(()=>import("./jsdoc-match-description.html-12ee076c.js"),[]).then(({data:e})=>e),"v-7ae60b61":()=>t(()=>import("./jsdoc-no-undefined-types.html-69c1ee47.js"),[]).then(({data:e})=>e),"v-5eab67e3":()=>t(()=>import("./jsdoc-require-description-complete-sentence.html-e8aa28b8.js"),[]).then(({data:e})=>e),"v-395e7ae6":()=>t(()=>import("./jsdoc-require-description.html-b615aef2.js"),[]).then(({data:e})=>e),"v-5aed3484":()=>t(()=>import("./jsdoc-require-param-name.html-34e11784.js"),[]).then(({data:e})=>e),"v-b01a3322":()=>t(()=>import("./jsdoc-require-param-type.html-ad737444.js"),[]).then(({data:e})=>e),"v-ac1176c8":()=>t(()=>import("./jsdoc-require-param.html-a5c9db68.js"),[]).then(({data:e})=>e),"v-3fc487cb":()=>t(()=>import("./jsdoc-require-returns-check.html-b5668de8.js"),[]).then(({data:e})=>e),"v-fb0bd0b6":()=>t(()=>import("./jsdoc-require-returns-type.html-e97614c0.js"),[]).then(({data:e})=>e),"v-39f7a9a6":()=>t(()=>import("./jsdoc-require-returns.html-f5ab647b.js"),[]).then(({data:e})=>e),"v-6578a815":()=>t(()=>import("./jsdoc-tag-lines.html-4b6e27c8.js"),[]).then(({data:e})=>e),"v-5dc36739":()=>t(()=>import("./jsdoc-valid-types.html-a7680ec0.js"),[]).then(({data:e})=>e),"v-73a024ae":()=>t(()=>import("./key-spacing.html-116f3af2.js"),[]).then(({data:e})=>e),"v-6d2165da":()=>t(()=>import("./netsells-component-file-names.html-a2622bba.js"),[]).then(({data:e})=>e),"v-673c5452":()=>t(()=>import("./netsells-no-dom-listeners.html-b5d52766.js"),[]).then(({data:e})=>e),"v-5febc12c":()=>t(()=>import("./netsells-no-global-timeouts.html-4e7f7f2e.js"),[]).then(({data:e})=>e),"v-324c9b3f":()=>t(()=>import("./no-alert.html-328b269c.js"),[]).then(({data:e})=>e),"v-1a75683e":()=>t(()=>import("./no-cond-assign.html-4af7e4e4.js"),[]).then(({data:e})=>e),"v-ec4208b8":()=>t(()=>import("./no-console.html-81ee8816.js"),[]).then(({data:e})=>e),"v-08b70fd6":()=>t(()=>import("./no-debugger.html-227639cf.js"),[]).then(({data:e})=>e),"v-5bb8acef":()=>t(()=>import("./no-duplicate-imports.html-d9af1058.js"),[]).then(({data:e})=>e),"v-401183d7":()=>t(()=>import("./no-else-return.html-e3c11450.js"),[]).then(({data:e})=>e),"v-2112c102":()=>t(()=>import("./no-empty-function.html-146c9b33.js"),[]).then(({data:e})=>e),"v-fe8f2424":()=>t(()=>import("./no-empty.html-8192cd1a.js"),[]).then(({data:e})=>e),"v-6f62d73b":()=>t(()=>import("./no-eval.html-96465782.js"),[]).then(({data:e})=>e),"v-1d05670d":()=>t(()=>import("./no-floating-decimal.html-5f36347c.js"),[]).then(({data:e})=>e),"v-4fabda95":()=>t(()=>import("./no-implicit-coercion.html-81fc051d.js"),[]).then(({data:e})=>e),"v-757de0d8":()=>t(()=>import("./no-lonely-if.html-e5b72121.js"),[]).then(({data:e})=>e),"v-25f99a4e":()=>t(()=>import("./no-mixed-spaces-and-tabs.html-5b39c0ef.js"),[]).then(({data:e})=>e),"v-0a8fc955":()=>t(()=>import("./no-multiple-empty-lines.html-c0d85137.js"),[]).then(({data:e})=>e),"v-6df18d5b":()=>t(()=>import("./no-restricted-imports.html-63484304.js"),[]).then(({data:e})=>e),"v-e5052018":()=>t(()=>import("./no-sparse-arrays.html-ce5aa6aa.js"),[]).then(({data:e})=>e),"v-2e009a9e":()=>t(()=>import("./no-template-curly-in-string.html-94c0eeba.js"),[]).then(({data:e})=>e),"v-6968233b":()=>t(()=>import("./no-unneeded-ternary.html-32b9ddec.js"),[]).then(({data:e})=>e),"v-098f63b8":()=>t(()=>import("./no-unused-vars.html-417fe465.js"),[]).then(({data:e})=>e),"v-71e8bbf8":()=>t(()=>import("./no-use-before-define.html-31bffd4d.js"),[]).then(({data:e})=>e),"v-4b44aefa":()=>t(()=>import("./no-useless-return.html-12a69c82.js"),[]).then(({data:e})=>e),"v-e9582658":()=>t(()=>import("./no-var.html-182d3d3b.js"),[]).then(({data:e})=>e),"v-098e8ca6":()=>t(()=>import("./operator-linebreak.html-347374f3.js"),[]).then(({data:e})=>e),"v-651d76bd":()=>t(()=>import("./prefer-arrow-callback.html-dfea4341.js"),[]).then(({data:e})=>e),"v-7bc232e9":()=>t(()=>import("./prefer-const.html-e9fe7cc1.js"),[]).then(({data:e})=>e),"v-7197202c":()=>t(()=>import("./prefer-template.html-3b072722.js"),[]).then(({data:e})=>e),"v-42eab5f8":()=>t(()=>import("./quotes.html-32f10322.js"),[]).then(({data:e})=>e),"v-702dd356":()=>t(()=>import("./require-jsdoc-except-require-jsdoc.html-6ad12912.js"),[]).then(({data:e})=>e),"v-00d42fe1":()=>t(()=>import("./semi.html-b5ff2a67.js"),[]).then(({data:e})=>e),"v-104c62f2":()=>t(()=>import("./space-before-function-paren.html-42a97467.js"),[]).then(({data:e})=>e),"v-009b1cdf":()=>t(()=>import("./template-curly-spacing.html-1536714f.js"),[]).then(({data:e})=>e),"v-3fd2ad10":()=>t(()=>import("./vue-attribute-hyphenation.html-5ce3b293.js"),[]).then(({data:e})=>e),"v-8009c03a":()=>t(()=>import("./vue-component-definition-name-casing.html-ea5da332.js"),[]).then(({data:e})=>e),"v-e70076c0":()=>t(()=>import("./vue-component-name-in-template-casing.html-6a68e8f3.js"),[]).then(({data:e})=>e),"v-d9848c78":()=>t(()=>import("./vue-eqeqeq.html-ec1ad67a.js"),[]).then(({data:e})=>e),"v-fef2401a":()=>t(()=>import("./vue-html-closing-bracket-newline.html-9d8180e0.js"),[]).then(({data:e})=>e),"v-48f64ab8":()=>t(()=>import("./vue-html-closing-bracket-spacing.html-e21b400c.js"),[]).then(({data:e})=>e),"v-c62fa308":()=>t(()=>import("./vue-html-indent.html-a19e2bcb.js"),[]).then(({data:e})=>e),"v-ed3556de":()=>t(()=>import("./vue-html-quotes.html-aa1ba5d2.js"),[]).then(({data:e})=>e),"v-c7d7edd6":()=>t(()=>import("./vue-key-spacing.html-557bce16.js"),[]).then(({data:e})=>e),"v-418b9826":()=>t(()=>import("./vue-match-component-file-name.html-65991427.js"),[]).then(({data:e})=>e),"v-92ab210e":()=>t(()=>import("./vue-max-attributes-per-line.html-c2342911.js"),[]).then(({data:e})=>e),"v-0fd42d33":()=>t(()=>import("./vue-mustache-interpolation-spacing.html-71faeeca.js"),[]).then(({data:e})=>e),"v-51dd6b4e":()=>t(()=>import("./vue-no-dupe-keys.html-e1c8621a.js"),[]).then(({data:e})=>e),"v-26b7b885":()=>t(()=>import("./vue-no-duplicate-attributes.html-e0b8a982.js"),[]).then(({data:e})=>e),"v-58303e9d":()=>t(()=>import("./vue-no-multi-spaces.html-37a52dca.js"),[]).then(({data:e})=>e),"v-7d626b1c":()=>t(()=>import("./vue-no-shared-component-data.html-94ef8897.js"),[]).then(({data:e})=>e),"v-326d9ab0":()=>t(()=>import("./vue-no-side-effects-in-computed-properties.html-abbcd44d.js"),[]).then(({data:e})=>e),"v-e20f65ce":()=>t(()=>import("./vue-no-textarea-mustache.html-e05184da.js"),[]).then(({data:e})=>e),"v-dfe05c1e":()=>t(()=>import("./vue-no-unused-vars.html-a5bfc8c3.js"),[]).then(({data:e})=>e),"v-bc1f78c8":()=>t(()=>import("./vue-no-v-html.html-b76c72a6.js"),[]).then(({data:e})=>e),"v-733d32f3":()=>t(()=>import("./vue-object-curly-spacing.html-0978a325.js"),[]).then(({data:e})=>e),"v-69464eaa":()=>t(()=>import("./vue-order-in-components.html-e0e19810.js"),[]).then(({data:e})=>e),"v-55082d91":()=>t(()=>import("./vue-require-default-prop.html-a0009100.js"),[]).then(({data:e})=>e),"v-201b7d31":()=>t(()=>import("./vue-require-prop-types.html-4a40799f.js"),[]).then(({data:e})=>e),"v-2dd246c0":()=>t(()=>import("./vue-return-in-computed-property.html-27cb8e11.js"),[]).then(({data:e})=>e),"v-7470e148":()=>t(()=>import("./vue-script-indent.html-9e8e16b0.js"),[]).then(({data:e})=>e),"v-f3290416":()=>t(()=>import("./vue-this-in-template.html-86af24a8.js"),[]).then(({data:e})=>e),"v-1d166a30":()=>t(()=>import("./vue-v-bind-style.html-29cf8f6d.js"),[]).then(({data:e})=>e),"v-f09e31e8":()=>t(()=>import("./vue-v-on-function-call.html-b77a36ce.js"),[]).then(({data:e})=>e),"v-2859dd4e":()=>t(()=>import("./vue-v-on-style.html-a1d44a0d.js"),[]).then(({data:e})=>e),"v-5da202a1":()=>t(()=>import("./vuejs-accessibility-alt-text.html-1565c36f.js"),[]).then(({data:e})=>e),"v-deaa79b8":()=>t(()=>import("./vuejs-accessibility-anchor-has-content.html-f7d94e94.js"),[]).then(({data:e})=>e),"v-7dd0c466":()=>t(()=>import("./vuejs-accessibility-aria-props.html-9b05d47d.js"),[]).then(({data:e})=>e),"v-a9b540f4":()=>t(()=>import("./vuejs-accessibility-aria-role.html-94375eaa.js"),[]).then(({data:e})=>e),"v-c11397e6":()=>t(()=>import("./vuejs-accessibility-aria-unsupported-elements.html-90099148.js"),[]).then(({data:e})=>e),"v-b6cb7116":()=>t(()=>import("./vuejs-accessibility-click-events-have-key-events.html-78379a82.js"),[]).then(({data:e})=>e),"v-663e674a":()=>t(()=>import("./vuejs-accessibility-form-control-has-label.html-9863598c.js"),[]).then(({data:e})=>e),"v-3353c5b6":()=>t(()=>import("./vuejs-accessibility-heading-has-content.html-51dd1708.js"),[]).then(({data:e})=>e),"v-1f40a5d6":()=>t(()=>import("./vuejs-accessibility-iframe-has-title.html-47dcf2cd.js"),[]).then(({data:e})=>e),"v-2ea82790":()=>t(()=>import("./vuejs-accessibility-interactive-supports-focus.html-fd6f51d0.js"),[]).then(({data:e})=>e),"v-356d2112":()=>t(()=>import("./vuejs-accessibility-mouse-events-have-key-events.html-eb49ac52.js"),[]).then(({data:e})=>e),"v-658bedbe":()=>t(()=>import("./vuejs-accessibility-no-access-key.html-a000e347.js"),[]).then(({data:e})=>e),"v-37f858f5":()=>t(()=>import("./vuejs-accessibility-no-autofocus.html-c35a6590.js"),[]).then(({data:e})=>e),"v-9914faa8":()=>t(()=>import("./vuejs-accessibility-no-distracting-elements.html-1e4ddbfa.js"),[]).then(({data:e})=>e),"v-e775df76":()=>t(()=>import("./vuejs-accessibility-no-onchange.html-09742e89.js"),[]).then(({data:e})=>e),"v-3092d461":()=>t(()=>import("./vuejs-accessibility-no-redundant-roles.html-0107d6b1.js"),[]).then(({data:e})=>e),"v-3a9db3c2":()=>t(()=>import("./vuejs-accessibility-role-has-required-aria-props.html-896fc0d9.js"),[]).then(({data:e})=>e),"v-af372d46":()=>t(()=>import("./vuejs-accessibility-tabindex-no-positive.html-8954a5e9.js"),[]).then(({data:e})=>e),"v-c1089f48":()=>t(()=>import("./yoda.html-ebf32b48.js"),[]).then(({data:e})=>e),"v-3706649a":()=>t(()=>import("./404.html-60b35caa.js"),[]).then(({data:e})=>e)},qn=JSON.parse('{"base":"/code-standards/","lang":"en-US","title":"Netsells Code Standards","description":"","head":[],"locales":{}}'),xt={"v-8daa1a0e":r(()=>t(()=>import("./index.html-504ecac3.js"),["assets/index.html-504ecac3.js","assets/framework-9cabc8c6.js"])),"v-c1f0fcce":r(()=>t(()=>import("./index.html-4650db09.js"),["assets/index.html-4650db09.js","assets/framework-9cabc8c6.js"])),"v-466569ae":r(()=>t(()=>import("./clean-architecture.html-7b28dc63.js"),["assets/clean-architecture.html-7b28dc63.js","assets/framework-9cabc8c6.js"])),"v-0f9a8a22":r(()=>t(()=>import("./code-style.html-5d0fdffe.js"),["assets/code-style.html-5d0fdffe.js","assets/framework-9cabc8c6.js"])),"v-16386b36":r(()=>t(()=>import("./coroutines.html-99c7f21e.js"),["assets/coroutines.html-99c7f21e.js","assets/framework-9cabc8c6.js"])),"v-529e84aa":r(()=>t(()=>import("./dependency-injection.html-980555d0.js"),["assets/dependency-injection.html-980555d0.js","assets/framework-9cabc8c6.js"])),"v-757f0c54":r(()=>t(()=>import("./error-handling.html-e28d12d7.js"),["assets/error-handling.html-e28d12d7.js","assets/framework-9cabc8c6.js"])),"v-3e66553f":r(()=>t(()=>import("./kotlin.html-e11de88c.js"),["assets/kotlin.html-e11de88c.js","assets/framework-9cabc8c6.js"])),"v-631ebf3c":r(()=>t(()=>import("./local-databases.html-1d353418.js"),["assets/local-databases.html-1d353418.js","assets/framework-9cabc8c6.js"])),"v-7c84f940":r(()=>t(()=>import("./mvvm.html-24db3bf6.js"),["assets/mvvm.html-24db3bf6.js","assets/framework-9cabc8c6.js"])),"v-3798263d":r(()=>t(()=>import("./network-requests.html-01d2964c.js"),["assets/network-requests.html-01d2964c.js","assets/framework-9cabc8c6.js"])),"v-67bfbd0d":r(()=>t(()=>import("./pull-request-labels.html-ee66a12b.js"),["assets/pull-request-labels.html-ee66a12b.js","assets/framework-9cabc8c6.js"])),"v-0e9bbce2":r(()=>t(()=>import("./testing.html-5c6876c9.js"),["assets/testing.html-5c6876c9.js","assets/framework-9cabc8c6.js"])),"v-551bb614":r(()=>t(()=>import("./index.html-6b0e0546.js"),["assets/index.html-6b0e0546.js","assets/framework-9cabc8c6.js"])),"v-c1772168":r(()=>t(()=>import("./apis.html-e2b1d426.js"),["assets/apis.html-e2b1d426.js","assets/framework-9cabc8c6.js"])),"v-b97e7df6":r(()=>t(()=>import("./general.html-9d31a8a9.js"),["assets/general.html-9d31a8a9.js","assets/framework-9cabc8c6.js"])),"v-35d72f40":r(()=>t(()=>import("./hatchly.html-d0d4064f.js"),["assets/hatchly.html-d0d4064f.js","assets/framework-9cabc8c6.js"])),"v-6957d9d4":r(()=>t(()=>import("./laravel.html-12c5a8f4.js"),["assets/laravel.html-12c5a8f4.js","assets/framework-9cabc8c6.js"])),"v-0f7bc716":r(()=>t(()=>import("./php.html-0cb1cbd9.js"),["assets/php.html-0cb1cbd9.js","assets/framework-9cabc8c6.js"])),"v-7d441486":r(()=>t(()=>import("./recommended-packages.html-5d87ba68.js"),["assets/recommended-packages.html-5d87ba68.js","assets/framework-9cabc8c6.js"])),"v-5033abfc":r(()=>t(()=>import("./index.html-9c4d1d2c.js"),["assets/index.html-9c4d1d2c.js","assets/framework-9cabc8c6.js"])),"v-565ee9db":r(()=>t(()=>import("./c-sharp.html-7ca646a8.js"),["assets/c-sharp.html-7ca646a8.js","assets/framework-9cabc8c6.js"])),"v-7428160f":r(()=>t(()=>import("./general-guidelines.html-9edc35f8.js"),["assets/general-guidelines.html-9edc35f8.js","assets/framework-9cabc8c6.js"])),"v-2a1c4858":r(()=>t(()=>import("./recommended-packages.html-dd6ba9de.js"),["assets/recommended-packages.html-dd6ba9de.js","assets/framework-9cabc8c6.js"])),"v-59c1b58c":r(()=>t(()=>import("./index.html-228a1e6f.js"),["assets/index.html-228a1e6f.js","assets/framework-9cabc8c6.js"])),"v-02d166ed":r(()=>t(()=>import("./codesigning.html-562e13e6.js"),["assets/codesigning.html-562e13e6.js","assets/framework-9cabc8c6.js"])),"v-3e9b8cb3":r(()=>t(()=>import("./continuous-delivery.html-ef07c469.js"),["assets/continuous-delivery.html-ef07c469.js","assets/framework-9cabc8c6.js"])),"v-1f335512":r(()=>t(()=>import("./continuous-integration.html-c9505e8f.js"),["assets/continuous-integration.html-c9505e8f.js","assets/framework-9cabc8c6.js"])),"v-37a57446":r(()=>t(()=>import("./crash-reporting.html-13c1dba6.js"),["assets/crash-reporting.html-13c1dba6.js","assets/framework-9cabc8c6.js"])),"v-66577348":r(()=>t(()=>import("./linting-rules.html-8ee4f1e5.js"),["assets/linting-rules.html-8ee4f1e5.js","assets/framework-9cabc8c6.js"])),"v-3a4b8043":r(()=>t(()=>import("./monarch.html-efefb090.js"),["assets/monarch.html-efefb090.js","assets/framework-9cabc8c6.js"])),"v-664e86a4":r(()=>t(()=>import("./multiple-firebase-environments.html-e6968e42.js"),["assets/multiple-firebase-environments.html-e6968e42.js","assets/framework-9cabc8c6.js"])),"v-539bafa3":r(()=>t(()=>import("./naming-widgets.html-3f3439e6.js"),["assets/naming-widgets.html-3f3439e6.js","assets/framework-9cabc8c6.js"])),"v-2d5b4388":r(()=>t(()=>import("./project-setup.html-2e7077a6.js"),["assets/project-setup.html-2e7077a6.js","assets/framework-9cabc8c6.js"])),"v-382c27e4":r(()=>t(()=>import("./recommended-packages.html-a48d98a4.js"),["assets/recommended-packages.html-a48d98a4.js","assets/framework-9cabc8c6.js"])),"v-50b19462":r(()=>t(()=>import("./security-practices.html-ebf150e7.js"),["assets/security-practices.html-ebf150e7.js","assets/framework-9cabc8c6.js"])),"v-55f3772e":r(()=>t(()=>import("./state-management.html-383b9762.js"),["assets/state-management.html-383b9762.js","assets/framework-9cabc8c6.js"])),"v-03009c55":r(()=>t(()=>import("./testing.html-6d554a29.js"),["assets/testing.html-6d554a29.js","assets/framework-9cabc8c6.js"])),"v-9c19581a":r(()=>t(()=>import("./third-party-packages.html-edb7eb06.js"),["assets/third-party-packages.html-edb7eb06.js","assets/framework-9cabc8c6.js"])),"v-06198984":r(()=>t(()=>import("./index.html-a5d92d2a.js"),["assets/index.html-a5d92d2a.js","assets/framework-9cabc8c6.js"])),"v-e2885e62":r(()=>t(()=>import("./accessibility.html-f3b3321d.js"),["assets/accessibility.html-f3b3321d.js","assets/framework-9cabc8c6.js"])),"v-14e18006":r(()=>t(()=>import("./automated-workflows.html-e1bd6b30.js"),["assets/automated-workflows.html-e1bd6b30.js","assets/framework-9cabc8c6.js"])),"v-b37d638c":r(()=>t(()=>import("./css.html-d2b3a24f.js"),["assets/css.html-d2b3a24f.js","assets/framework-9cabc8c6.js"])),"v-cf5f91ec":r(()=>t(()=>import("./html.html-42bde551.js"),["assets/html.html-42bde551.js","assets/framework-9cabc8c6.js"])),"v-5aa1fcf0":r(()=>t(()=>import("./javascript.html-6707ae10.js"),["assets/javascript.html-6707ae10.js","assets/framework-9cabc8c6.js"])),"v-e0725fa6":r(()=>t(()=>import("./performance.html-dcd68db1.js"),["assets/performance.html-dcd68db1.js","assets/framework-9cabc8c6.js"])),"v-3d0401d4":r(()=>t(()=>import("./recommended-packages.html-f84df6fa.js"),["assets/recommended-packages.html-f84df6fa.js","assets/framework-9cabc8c6.js"])),"v-56ad03c2":r(()=>t(()=>import("./required-qa.html-62971206.js"),["assets/required-qa.html-62971206.js","assets/framework-9cabc8c6.js"])),"v-7c336682":r(()=>t(()=>import("./storybook.html-3abbd60d.js"),["assets/storybook.html-3abbd60d.js","assets/framework-9cabc8c6.js"])),"v-a43f7ed2":r(()=>t(()=>import("./vue.html-9de5b6ba.js"),["assets/vue.html-9de5b6ba.js","assets/framework-9cabc8c6.js"])),"v-4290fe40":r(()=>t(()=>import("./index.html-530db1be.js"),["assets/index.html-530db1be.js","assets/framework-9cabc8c6.js"])),"v-1efcfaf2":r(()=>t(()=>import("./git.html-efbf5794.js"),["assets/git.html-efbf5794.js","assets/framework-9cabc8c6.js"])),"v-60154c4d":r(()=>t(()=>import("./pull-requests.html-1b4ed270.js"),["assets/pull-requests.html-1b4ed270.js","assets/framework-9cabc8c6.js"])),"v-7448383b":r(()=>t(()=>import("./index.html-daa274f2.js"),["assets/index.html-daa274f2.js","assets/framework-9cabc8c6.js"])),"v-6312ceea":r(()=>t(()=>import("./architecture.html-5ff328b7.js"),["assets/architecture.html-5ff328b7.js","assets/framework-9cabc8c6.js"])),"v-41cdb664":r(()=>t(()=>import("./bundler.html-2846d238.js"),["assets/bundler.html-2846d238.js","assets/framework-9cabc8c6.js"])),"v-8f9aa8c8":r(()=>t(()=>import("./codesigning.html-d6ebabc0.js"),["assets/codesigning.html-d6ebabc0.js","assets/framework-9cabc8c6.js"])),"v-e5d488aa":r(()=>t(()=>import("./layouts.html-3b98ae6e.js"),["assets/layouts.html-3b98ae6e.js","assets/framework-9cabc8c6.js"])),"v-69fbfaf5":r(()=>t(()=>import("./linting.html-5452bcca.js"),["assets/linting.html-5452bcca.js","assets/framework-9cabc8c6.js"])),"v-19659084":r(()=>t(()=>import("./testing.html-c2c07642.js"),["assets/testing.html-c2c07642.js","assets/framework-9cabc8c6.js"])),"v-07b78fc1":r(()=>t(()=>import("./pull-requests.html-af19e387.js"),["assets/pull-requests.html-af19e387.js","assets/framework-9cabc8c6.js"])),"v-6250ba7a":r(()=>t(()=>import("./index.html-2e736592.js"),["assets/index.html-2e736592.js","assets/framework-9cabc8c6.js"])),"v-2628fc2c":r(()=>t(()=>import("./architecture.html-3da9179b.js"),["assets/architecture.html-3da9179b.js","assets/framework-9cabc8c6.js"])),"v-e38a0e40":r(()=>t(()=>import("./handling-errors.html-97d9fa9b.js"),["assets/handling-errors.html-97d9fa9b.js","assets/framework-9cabc8c6.js"])),"v-22e0faa6":r(()=>t(()=>import("./localization.html-2beae295.js"),["assets/localization.html-2beae295.js","assets/framework-9cabc8c6.js"])),"v-97fb1a00":r(()=>t(()=>import("./state-management.html-804d95e9.js"),["assets/state-management.html-804d95e9.js","assets/framework-9cabc8c6.js"])),"v-37802094":r(()=>t(()=>import("./index.html-90c6449b.js"),["assets/index.html-90c6449b.js","assets/framework-9cabc8c6.js"])),"v-a90e54ba":r(()=>t(()=>import("./index.html-4e52f169.js"),["assets/index.html-4e52f169.js","assets/framework-9cabc8c6.js"])),"v-2a442892":r(()=>t(()=>import("./cheat-sheet.html-d1b522dc.js"),["assets/cheat-sheet.html-d1b522dc.js","assets/framework-9cabc8c6.js"])),"v-57e37f2f":r(()=>t(()=>import("./unit-testing.html-c9d8aa15.js"),["assets/unit-testing.html-c9d8aa15.js","assets/framework-9cabc8c6.js"])),"v-54eb29ab":r(()=>t(()=>import("./visual-regression-testing.html-8ec6962e.js"),["assets/visual-regression-testing.html-8ec6962e.js","assets/framework-9cabc8c6.js"])),"v-64f437db":r(()=>t(()=>import("./what-to-test.html-7eabe764.js"),["assets/what-to-test.html-7eabe764.js","assets/framework-9cabc8c6.js"])),"v-e9c8dde2":r(()=>t(()=>import("./index.html-2e938f31.js"),["assets/index.html-2e938f31.js","assets/framework-9cabc8c6.js"])),"v-4b210889":r(()=>t(()=>import("./block-no-empty.html-39b5ba7d.js"),["assets/block-no-empty.html-39b5ba7d.js","assets/framework-9cabc8c6.js"])),"v-af607c30":r(()=>t(()=>import("./color-hex-length.html-9e67b2d8.js"),["assets/color-hex-length.html-9e67b2d8.js","assets/framework-9cabc8c6.js"])),"v-519968f9":r(()=>t(()=>import("./color-named.html-351ac353.js"),["assets/color-named.html-351ac353.js","assets/framework-9cabc8c6.js"])),"v-397d0ca7":r(()=>t(()=>import("./color-no-invalid-hex.html-823e82d4.js"),["assets/color-no-invalid-hex.html-823e82d4.js","assets/framework-9cabc8c6.js"])),"v-bb23520c":r(()=>t(()=>import("./declaration-block-no-duplicate-properties.html-ff16ea58.js"),["assets/declaration-block-no-duplicate-properties.html-ff16ea58.js","assets/framework-9cabc8c6.js"])),"v-6c22cf5e":r(()=>t(()=>import("./declaration-block-no-shorthand-property-overrides.html-b64e8842.js"),["assets/declaration-block-no-shorthand-property-overrides.html-b64e8842.js","assets/framework-9cabc8c6.js"])),"v-7e06cb41":r(()=>t(()=>import("./declaration-no-important.html-436aad8d.js"),["assets/declaration-no-important.html-436aad8d.js","assets/framework-9cabc8c6.js"])),"v-48eac4b6":r(()=>t(()=>import("./length-zero-no-unit.html-54874bad.js"),["assets/length-zero-no-unit.html-54874bad.js","assets/framework-9cabc8c6.js"])),"v-41cad91c":r(()=>t(()=>import("./property-no-unknown.html-16298fdc.js"),["assets/property-no-unknown.html-16298fdc.js","assets/framework-9cabc8c6.js"])),"v-531ca99c":r(()=>t(()=>import("./shorthand-property-no-redundant-values.html-24a07ac2.js"),["assets/shorthand-property-no-redundant-values.html-24a07ac2.js","assets/framework-9cabc8c6.js"])),"v-f3429ebe":r(()=>t(()=>import("./unit-no-unknown.html-89398c97.js"),["assets/unit-no-unknown.html-89398c97.js","assets/framework-9cabc8c6.js"])),"v-357fd18a":r(()=>t(()=>import("./index.html-5fe3786d.js"),["assets/index.html-5fe3786d.js","assets/framework-9cabc8c6.js"])),"v-100a2dc2":r(()=>t(()=>import("./arrow-parens.html-436c6e44.js"),["assets/arrow-parens.html-436c6e44.js","assets/framework-9cabc8c6.js"])),"v-a313ce78":r(()=>t(()=>import("./arrow-spacing.html-51a14507.js"),["assets/arrow-spacing.html-51a14507.js","assets/framework-9cabc8c6.js"])),"v-0aa90808":r(()=>t(()=>import("./comma-dangle.html-dc7005d6.js"),["assets/comma-dangle.html-dc7005d6.js","assets/framework-9cabc8c6.js"])),"v-3c3f0636":r(()=>t(()=>import("./curly.html-37632555.js"),["assets/curly.html-37632555.js","assets/framework-9cabc8c6.js"])),"v-12563f14":r(()=>t(()=>import("./dot-location.html-fd34afd4.js"),["assets/dot-location.html-fd34afd4.js","assets/framework-9cabc8c6.js"])),"v-91ea676e":r(()=>t(()=>import("./dot-notation.html-31e73a08.js"),["assets/dot-notation.html-31e73a08.js","assets/framework-9cabc8c6.js"])),"v-6a6febae":r(()=>t(()=>import("./eol-last.html-a08cc52f.js"),["assets/eol-last.html-a08cc52f.js","assets/framework-9cabc8c6.js"])),"v-7153028b":r(()=>t(()=>import("./eqeqeq.html-019791df.js"),["assets/eqeqeq.html-019791df.js","assets/framework-9cabc8c6.js"])),"v-472c7927":r(()=>t(()=>import("./import-extensions.html-425c7c33.js"),["assets/import-extensions.html-425c7c33.js","assets/framework-9cabc8c6.js"])),"v-566d8fe3":r(()=>t(()=>import("./indent.html-877d389e.js"),["assets/indent.html-877d389e.js","assets/framework-9cabc8c6.js"])),"v-276e9d03":r(()=>t(()=>import("./jsdoc-check-alignment.html-88cf7a19.js"),["assets/jsdoc-check-alignment.html-88cf7a19.js","assets/framework-9cabc8c6.js"])),"v-3904919d":r(()=>t(()=>import("./jsdoc-check-indentation.html-6c090bad.js"),["assets/jsdoc-check-indentation.html-6c090bad.js","assets/framework-9cabc8c6.js"])),"v-1e8810be":r(()=>t(()=>import("./jsdoc-check-param-names.html-ff527ec6.js"),["assets/jsdoc-check-param-names.html-ff527ec6.js","assets/framework-9cabc8c6.js"])),"v-6a1179c9":r(()=>t(()=>import("./jsdoc-check-syntax.html-23b54f92.js"),["assets/jsdoc-check-syntax.html-23b54f92.js","assets/framework-9cabc8c6.js"])),"v-4e16c6d1":r(()=>t(()=>import("./jsdoc-check-tag-names.html-bb5bfe35.js"),["assets/jsdoc-check-tag-names.html-bb5bfe35.js","assets/framework-9cabc8c6.js"])),"v-f2ae9aa6":r(()=>t(()=>import("./jsdoc-check-types.html-9d900b55.js"),["assets/jsdoc-check-types.html-9d900b55.js","assets/framework-9cabc8c6.js"])),"v-e30b0768":r(()=>t(()=>import("./jsdoc-implements-on-classes.html-0f1350f6.js"),["assets/jsdoc-implements-on-classes.html-0f1350f6.js","assets/framework-9cabc8c6.js"])),"v-3e7e482d":r(()=>t(()=>import("./jsdoc-match-description.html-c7d72a2a.js"),["assets/jsdoc-match-description.html-c7d72a2a.js","assets/framework-9cabc8c6.js"])),"v-7ae60b61":r(()=>t(()=>import("./jsdoc-no-undefined-types.html-256e5428.js"),["assets/jsdoc-no-undefined-types.html-256e5428.js","assets/framework-9cabc8c6.js"])),"v-5eab67e3":r(()=>t(()=>import("./jsdoc-require-description-complete-sentence.html-674e5504.js"),["assets/jsdoc-require-description-complete-sentence.html-674e5504.js","assets/framework-9cabc8c6.js"])),"v-395e7ae6":r(()=>t(()=>import("./jsdoc-require-description.html-91c523c1.js"),["assets/jsdoc-require-description.html-91c523c1.js","assets/framework-9cabc8c6.js"])),"v-5aed3484":r(()=>t(()=>import("./jsdoc-require-param-name.html-36780603.js"),["assets/jsdoc-require-param-name.html-36780603.js","assets/framework-9cabc8c6.js"])),"v-b01a3322":r(()=>t(()=>import("./jsdoc-require-param-type.html-2d854c16.js"),["assets/jsdoc-require-param-type.html-2d854c16.js","assets/framework-9cabc8c6.js"])),"v-ac1176c8":r(()=>t(()=>import("./jsdoc-require-param.html-d89e024f.js"),["assets/jsdoc-require-param.html-d89e024f.js","assets/framework-9cabc8c6.js"])),"v-3fc487cb":r(()=>t(()=>import("./jsdoc-require-returns-check.html-615d731d.js"),["assets/jsdoc-require-returns-check.html-615d731d.js","assets/framework-9cabc8c6.js"])),"v-fb0bd0b6":r(()=>t(()=>import("./jsdoc-require-returns-type.html-2c17d3c8.js"),["assets/jsdoc-require-returns-type.html-2c17d3c8.js","assets/framework-9cabc8c6.js"])),"v-39f7a9a6":r(()=>t(()=>import("./jsdoc-require-returns.html-e6ca8500.js"),["assets/jsdoc-require-returns.html-e6ca8500.js","assets/framework-9cabc8c6.js"])),"v-6578a815":r(()=>t(()=>import("./jsdoc-tag-lines.html-82fc75ee.js"),["assets/jsdoc-tag-lines.html-82fc75ee.js","assets/framework-9cabc8c6.js"])),"v-5dc36739":r(()=>t(()=>import("./jsdoc-valid-types.html-21ba530b.js"),["assets/jsdoc-valid-types.html-21ba530b.js","assets/framework-9cabc8c6.js"])),"v-73a024ae":r(()=>t(()=>import("./key-spacing.html-ca56887c.js"),["assets/key-spacing.html-ca56887c.js","assets/framework-9cabc8c6.js"])),"v-6d2165da":r(()=>t(()=>import("./netsells-component-file-names.html-48e1af82.js"),["assets/netsells-component-file-names.html-48e1af82.js","assets/framework-9cabc8c6.js"])),"v-673c5452":r(()=>t(()=>import("./netsells-no-dom-listeners.html-a384d820.js"),["assets/netsells-no-dom-listeners.html-a384d820.js","assets/framework-9cabc8c6.js"])),"v-5febc12c":r(()=>t(()=>import("./netsells-no-global-timeouts.html-996eb601.js"),["assets/netsells-no-global-timeouts.html-996eb601.js","assets/framework-9cabc8c6.js"])),"v-324c9b3f":r(()=>t(()=>import("./no-alert.html-350a354c.js"),["assets/no-alert.html-350a354c.js","assets/framework-9cabc8c6.js"])),"v-1a75683e":r(()=>t(()=>import("./no-cond-assign.html-049cad07.js"),["assets/no-cond-assign.html-049cad07.js","assets/framework-9cabc8c6.js"])),"v-ec4208b8":r(()=>t(()=>import("./no-console.html-3c714945.js"),["assets/no-console.html-3c714945.js","assets/framework-9cabc8c6.js"])),"v-08b70fd6":r(()=>t(()=>import("./no-debugger.html-f20083a8.js"),["assets/no-debugger.html-f20083a8.js","assets/framework-9cabc8c6.js"])),"v-5bb8acef":r(()=>t(()=>import("./no-duplicate-imports.html-0d621e23.js"),["assets/no-duplicate-imports.html-0d621e23.js","assets/framework-9cabc8c6.js"])),"v-401183d7":r(()=>t(()=>import("./no-else-return.html-6024e23b.js"),["assets/no-else-return.html-6024e23b.js","assets/framework-9cabc8c6.js"])),"v-2112c102":r(()=>t(()=>import("./no-empty-function.html-94ced74e.js"),["assets/no-empty-function.html-94ced74e.js","assets/framework-9cabc8c6.js"])),"v-fe8f2424":r(()=>t(()=>import("./no-empty.html-3ceafb99.js"),["assets/no-empty.html-3ceafb99.js","assets/framework-9cabc8c6.js"])),"v-6f62d73b":r(()=>t(()=>import("./no-eval.html-eee1a6a9.js"),["assets/no-eval.html-eee1a6a9.js","assets/framework-9cabc8c6.js"])),"v-1d05670d":r(()=>t(()=>import("./no-floating-decimal.html-1fb18670.js"),["assets/no-floating-decimal.html-1fb18670.js","assets/framework-9cabc8c6.js"])),"v-4fabda95":r(()=>t(()=>import("./no-implicit-coercion.html-c5186c47.js"),["assets/no-implicit-coercion.html-c5186c47.js","assets/framework-9cabc8c6.js"])),"v-757de0d8":r(()=>t(()=>import("./no-lonely-if.html-b721b703.js"),["assets/no-lonely-if.html-b721b703.js","assets/framework-9cabc8c6.js"])),"v-25f99a4e":r(()=>t(()=>import("./no-mixed-spaces-and-tabs.html-bd3bdbc9.js"),["assets/no-mixed-spaces-and-tabs.html-bd3bdbc9.js","assets/framework-9cabc8c6.js"])),"v-0a8fc955":r(()=>t(()=>import("./no-multiple-empty-lines.html-a15e30aa.js"),["assets/no-multiple-empty-lines.html-a15e30aa.js","assets/framework-9cabc8c6.js"])),"v-6df18d5b":r(()=>t(()=>import("./no-restricted-imports.html-98e18549.js"),["assets/no-restricted-imports.html-98e18549.js","assets/framework-9cabc8c6.js"])),"v-e5052018":r(()=>t(()=>import("./no-sparse-arrays.html-35796dd5.js"),["assets/no-sparse-arrays.html-35796dd5.js","assets/framework-9cabc8c6.js"])),"v-2e009a9e":r(()=>t(()=>import("./no-template-curly-in-string.html-4c93972a.js"),["assets/no-template-curly-in-string.html-4c93972a.js","assets/framework-9cabc8c6.js"])),"v-6968233b":r(()=>t(()=>import("./no-unneeded-ternary.html-432c102b.js"),["assets/no-unneeded-ternary.html-432c102b.js","assets/framework-9cabc8c6.js"])),"v-098f63b8":r(()=>t(()=>import("./no-unused-vars.html-6b47b45b.js"),["assets/no-unused-vars.html-6b47b45b.js","assets/framework-9cabc8c6.js"])),"v-71e8bbf8":r(()=>t(()=>import("./no-use-before-define.html-b3915122.js"),["assets/no-use-before-define.html-b3915122.js","assets/framework-9cabc8c6.js"])),"v-4b44aefa":r(()=>t(()=>import("./no-useless-return.html-7dedf8eb.js"),["assets/no-useless-return.html-7dedf8eb.js","assets/framework-9cabc8c6.js"])),"v-e9582658":r(()=>t(()=>import("./no-var.html-d701e912.js"),["assets/no-var.html-d701e912.js","assets/framework-9cabc8c6.js"])),"v-098e8ca6":r(()=>t(()=>import("./operator-linebreak.html-538a256c.js"),["assets/operator-linebreak.html-538a256c.js","assets/framework-9cabc8c6.js"])),"v-651d76bd":r(()=>t(()=>import("./prefer-arrow-callback.html-9367faac.js"),["assets/prefer-arrow-callback.html-9367faac.js","assets/framework-9cabc8c6.js"])),"v-7bc232e9":r(()=>t(()=>import("./prefer-const.html-1ce73853.js"),["assets/prefer-const.html-1ce73853.js","assets/framework-9cabc8c6.js"])),"v-7197202c":r(()=>t(()=>import("./prefer-template.html-5c2e9201.js"),["assets/prefer-template.html-5c2e9201.js","assets/framework-9cabc8c6.js"])),"v-42eab5f8":r(()=>t(()=>import("./quotes.html-be050878.js"),["assets/quotes.html-be050878.js","assets/framework-9cabc8c6.js"])),"v-702dd356":r(()=>t(()=>import("./require-jsdoc-except-require-jsdoc.html-7d0418a3.js"),["assets/require-jsdoc-except-require-jsdoc.html-7d0418a3.js","assets/framework-9cabc8c6.js"])),"v-00d42fe1":r(()=>t(()=>import("./semi.html-5d6f2ce9.js"),["assets/semi.html-5d6f2ce9.js","assets/framework-9cabc8c6.js"])),"v-104c62f2":r(()=>t(()=>import("./space-before-function-paren.html-51981ad5.js"),["assets/space-before-function-paren.html-51981ad5.js","assets/framework-9cabc8c6.js"])),"v-009b1cdf":r(()=>t(()=>import("./template-curly-spacing.html-89eaf1cd.js"),["assets/template-curly-spacing.html-89eaf1cd.js","assets/framework-9cabc8c6.js"])),"v-3fd2ad10":r(()=>t(()=>import("./vue-attribute-hyphenation.html-956f0656.js"),["assets/vue-attribute-hyphenation.html-956f0656.js","assets/framework-9cabc8c6.js"])),"v-8009c03a":r(()=>t(()=>import("./vue-component-definition-name-casing.html-5f65586e.js"),["assets/vue-component-definition-name-casing.html-5f65586e.js","assets/framework-9cabc8c6.js"])),"v-e70076c0":r(()=>t(()=>import("./vue-component-name-in-template-casing.html-21ca3b5d.js"),["assets/vue-component-name-in-template-casing.html-21ca3b5d.js","assets/framework-9cabc8c6.js"])),"v-d9848c78":r(()=>t(()=>import("./vue-eqeqeq.html-05066f54.js"),["assets/vue-eqeqeq.html-05066f54.js","assets/framework-9cabc8c6.js"])),"v-fef2401a":r(()=>t(()=>import("./vue-html-closing-bracket-newline.html-19c38d7a.js"),["assets/vue-html-closing-bracket-newline.html-19c38d7a.js","assets/framework-9cabc8c6.js"])),"v-48f64ab8":r(()=>t(()=>import("./vue-html-closing-bracket-spacing.html-c4ef5e0d.js"),["assets/vue-html-closing-bracket-spacing.html-c4ef5e0d.js","assets/framework-9cabc8c6.js"])),"v-c62fa308":r(()=>t(()=>import("./vue-html-indent.html-e71a4782.js"),["assets/vue-html-indent.html-e71a4782.js","assets/framework-9cabc8c6.js"])),"v-ed3556de":r(()=>t(()=>import("./vue-html-quotes.html-e201df85.js"),["assets/vue-html-quotes.html-e201df85.js","assets/framework-9cabc8c6.js"])),"v-c7d7edd6":r(()=>t(()=>import("./vue-key-spacing.html-c60b2978.js"),["assets/vue-key-spacing.html-c60b2978.js","assets/framework-9cabc8c6.js"])),"v-418b9826":r(()=>t(()=>import("./vue-match-component-file-name.html-4f1aac7a.js"),["assets/vue-match-component-file-name.html-4f1aac7a.js","assets/framework-9cabc8c6.js"])),"v-92ab210e":r(()=>t(()=>import("./vue-max-attributes-per-line.html-a175fe55.js"),["assets/vue-max-attributes-per-line.html-a175fe55.js","assets/framework-9cabc8c6.js"])),"v-0fd42d33":r(()=>t(()=>import("./vue-mustache-interpolation-spacing.html-7dddc67c.js"),["assets/vue-mustache-interpolation-spacing.html-7dddc67c.js","assets/framework-9cabc8c6.js"])),"v-51dd6b4e":r(()=>t(()=>import("./vue-no-dupe-keys.html-2cc654c0.js"),["assets/vue-no-dupe-keys.html-2cc654c0.js","assets/framework-9cabc8c6.js"])),"v-26b7b885":r(()=>t(()=>import("./vue-no-duplicate-attributes.html-029dcc5d.js"),["assets/vue-no-duplicate-attributes.html-029dcc5d.js","assets/framework-9cabc8c6.js"])),"v-58303e9d":r(()=>t(()=>import("./vue-no-multi-spaces.html-f2ed204a.js"),["assets/vue-no-multi-spaces.html-f2ed204a.js","assets/framework-9cabc8c6.js"])),"v-7d626b1c":r(()=>t(()=>import("./vue-no-shared-component-data.html-98fded4d.js"),["assets/vue-no-shared-component-data.html-98fded4d.js","assets/framework-9cabc8c6.js"])),"v-326d9ab0":r(()=>t(()=>import("./vue-no-side-effects-in-computed-properties.html-75f3884b.js"),["assets/vue-no-side-effects-in-computed-properties.html-75f3884b.js","assets/framework-9cabc8c6.js"])),"v-e20f65ce":r(()=>t(()=>import("./vue-no-textarea-mustache.html-ec234dfa.js"),["assets/vue-no-textarea-mustache.html-ec234dfa.js","assets/framework-9cabc8c6.js"])),"v-dfe05c1e":r(()=>t(()=>import("./vue-no-unused-vars.html-a3efe710.js"),["assets/vue-no-unused-vars.html-a3efe710.js","assets/framework-9cabc8c6.js"])),"v-bc1f78c8":r(()=>t(()=>import("./vue-no-v-html.html-426dd143.js"),["assets/vue-no-v-html.html-426dd143.js","assets/framework-9cabc8c6.js"])),"v-733d32f3":r(()=>t(()=>import("./vue-object-curly-spacing.html-67764225.js"),["assets/vue-object-curly-spacing.html-67764225.js","assets/framework-9cabc8c6.js"])),"v-69464eaa":r(()=>t(()=>import("./vue-order-in-components.html-3261ae9f.js"),["assets/vue-order-in-components.html-3261ae9f.js","assets/framework-9cabc8c6.js"])),"v-55082d91":r(()=>t(()=>import("./vue-require-default-prop.html-2a435fdb.js"),["assets/vue-require-default-prop.html-2a435fdb.js","assets/framework-9cabc8c6.js"])),"v-201b7d31":r(()=>t(()=>import("./vue-require-prop-types.html-eadfc619.js"),["assets/vue-require-prop-types.html-eadfc619.js","assets/framework-9cabc8c6.js"])),"v-2dd246c0":r(()=>t(()=>import("./vue-return-in-computed-property.html-f33242a9.js"),["assets/vue-return-in-computed-property.html-f33242a9.js","assets/framework-9cabc8c6.js"])),"v-7470e148":r(()=>t(()=>import("./vue-script-indent.html-493ce01a.js"),["assets/vue-script-indent.html-493ce01a.js","assets/framework-9cabc8c6.js"])),"v-f3290416":r(()=>t(()=>import("./vue-this-in-template.html-cb48c0c9.js"),["assets/vue-this-in-template.html-cb48c0c9.js","assets/framework-9cabc8c6.js"])),"v-1d166a30":r(()=>t(()=>import("./vue-v-bind-style.html-9bbfde3b.js"),["assets/vue-v-bind-style.html-9bbfde3b.js","assets/framework-9cabc8c6.js"])),"v-f09e31e8":r(()=>t(()=>import("./vue-v-on-function-call.html-140649ea.js"),["assets/vue-v-on-function-call.html-140649ea.js","assets/framework-9cabc8c6.js"])),"v-2859dd4e":r(()=>t(()=>import("./vue-v-on-style.html-990c47f1.js"),["assets/vue-v-on-style.html-990c47f1.js","assets/framework-9cabc8c6.js"])),"v-5da202a1":r(()=>t(()=>import("./vuejs-accessibility-alt-text.html-1b01666b.js"),["assets/vuejs-accessibility-alt-text.html-1b01666b.js","assets/framework-9cabc8c6.js"])),"v-deaa79b8":r(()=>t(()=>import("./vuejs-accessibility-anchor-has-content.html-296cac4c.js"),["assets/vuejs-accessibility-anchor-has-content.html-296cac4c.js","assets/framework-9cabc8c6.js"])),"v-7dd0c466":r(()=>t(()=>import("./vuejs-accessibility-aria-props.html-fe1e3b0f.js"),["assets/vuejs-accessibility-aria-props.html-fe1e3b0f.js","assets/framework-9cabc8c6.js"])),"v-a9b540f4":r(()=>t(()=>import("./vuejs-accessibility-aria-role.html-7aca7bd5.js"),["assets/vuejs-accessibility-aria-role.html-7aca7bd5.js","assets/framework-9cabc8c6.js"])),"v-c11397e6":r(()=>t(()=>import("./vuejs-accessibility-aria-unsupported-elements.html-1057b68d.js"),["assets/vuejs-accessibility-aria-unsupported-elements.html-1057b68d.js","assets/framework-9cabc8c6.js"])),"v-b6cb7116":r(()=>t(()=>import("./vuejs-accessibility-click-events-have-key-events.html-8f58ff22.js"),["assets/vuejs-accessibility-click-events-have-key-events.html-8f58ff22.js","assets/framework-9cabc8c6.js"])),"v-663e674a":r(()=>t(()=>import("./vuejs-accessibility-form-control-has-label.html-9a163497.js"),["assets/vuejs-accessibility-form-control-has-label.html-9a163497.js","assets/framework-9cabc8c6.js"])),"v-3353c5b6":r(()=>t(()=>import("./vuejs-accessibility-heading-has-content.html-c84ca3b9.js"),["assets/vuejs-accessibility-heading-has-content.html-c84ca3b9.js","assets/framework-9cabc8c6.js"])),"v-1f40a5d6":r(()=>t(()=>import("./vuejs-accessibility-iframe-has-title.html-cb3463e1.js"),["assets/vuejs-accessibility-iframe-has-title.html-cb3463e1.js","assets/framework-9cabc8c6.js"])),"v-2ea82790":r(()=>t(()=>import("./vuejs-accessibility-interactive-supports-focus.html-2172420f.js"),["assets/vuejs-accessibility-interactive-supports-focus.html-2172420f.js","assets/framework-9cabc8c6.js"])),"v-356d2112":r(()=>t(()=>import("./vuejs-accessibility-mouse-events-have-key-events.html-01dff7c3.js"),["assets/vuejs-accessibility-mouse-events-have-key-events.html-01dff7c3.js","assets/framework-9cabc8c6.js"])),"v-658bedbe":r(()=>t(()=>import("./vuejs-accessibility-no-access-key.html-b2fe0945.js"),["assets/vuejs-accessibility-no-access-key.html-b2fe0945.js","assets/framework-9cabc8c6.js"])),"v-37f858f5":r(()=>t(()=>import("./vuejs-accessibility-no-autofocus.html-d46917cc.js"),["assets/vuejs-accessibility-no-autofocus.html-d46917cc.js","assets/framework-9cabc8c6.js"])),"v-9914faa8":r(()=>t(()=>import("./vuejs-accessibility-no-distracting-elements.html-c5247a7d.js"),["assets/vuejs-accessibility-no-distracting-elements.html-c5247a7d.js","assets/framework-9cabc8c6.js"])),"v-e775df76":r(()=>t(()=>import("./vuejs-accessibility-no-onchange.html-0c445ede.js"),["assets/vuejs-accessibility-no-onchange.html-0c445ede.js","assets/framework-9cabc8c6.js"])),"v-3092d461":r(()=>t(()=>import("./vuejs-accessibility-no-redundant-roles.html-6e807f82.js"),["assets/vuejs-accessibility-no-redundant-roles.html-6e807f82.js","assets/framework-9cabc8c6.js"])),"v-3a9db3c2":r(()=>t(()=>import("./vuejs-accessibility-role-has-required-aria-props.html-78fcadca.js"),["assets/vuejs-accessibility-role-has-required-aria-props.html-78fcadca.js","assets/framework-9cabc8c6.js"])),"v-af372d46":r(()=>t(()=>import("./vuejs-accessibility-tabindex-no-positive.html-1d0ed763.js"),["assets/vuejs-accessibility-tabindex-no-positive.html-1d0ed763.js","assets/framework-9cabc8c6.js"])),"v-c1089f48":r(()=>t(()=>import("./yoda.html-52e4bd0d.js"),["assets/yoda.html-52e4bd0d.js","assets/framework-9cabc8c6.js"])),"v-3706649a":r(()=>t(()=>import("./404.html-5191af78.js"),["assets/404.html-5191af78.js","assets/framework-9cabc8c6.js"]))};var Nn=Symbol(""),zn=z(Cn),$t=Dt({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),de=z($t),ve=()=>de,Ct=Symbol(""),oe=()=>{const e=ae(Ct);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},qt=Symbol(""),Hn=()=>{const e=ae(qt);if(!e)throw new Error("usePageHead() is called without provider.");return e},Mn=Symbol(""),Nt=Symbol(""),Bn=()=>{const e=ae(Nt);if(!e)throw new Error("usePageLang() is called without provider.");return e},zt=Symbol(""),Fn=()=>{const e=ae(zt);if(!e)throw new Error("usePageLayout() is called without provider.");return e},Ye=Symbol(""),$e=()=>{const e=ae(Ye);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},Ee=z(qn),Wn=()=>Ee,Ht=Symbol(""),Je=()=>{const e=ae(Ht);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},Un=Symbol(""),Gn="Layout",Kn="NotFound",ie=hn({resolveLayouts:e=>e.reduce((n,i)=>({...n,...i.layouts}),{}),resolvePageData:async e=>{const n=zn.value[e];return await(n==null?void 0:n())??$t},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,n,i)=>{const o=ne(n.description)?n.description:i.description,l=[...xe(n.head)?n.head:[],...i.head,["title",{},e],["meta",{name:"description",content:o}]];return gn(l)},resolvePageHeadTitle:(e,n)=>[e.title,n.title].filter(i=>!!i).join(" | "),resolvePageLang:e=>e.lang||"en",resolvePageLayout:(e,n)=>{let i;if(e.path){const o=e.frontmatter.layout;ne(o)?i=o:i=Gn}else i=Kn;return n[i]},resolveRouteLocale:(e,n)=>Rt(e,n),resolveSiteLocaleData:(e,n)=>({...e,...e.locales[n]})}),Ze=k({name:"ClientOnly",setup(e,n){const i=z(!1);return te(()=>{i.value=!0}),()=>{var o,l;return i.value?(l=(o=n.slots).default)==null?void 0:l.call(o):null}}}),Qn=k({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const n=ve(),i=g(()=>xt[e.pageKey||n.value.key]);return()=>i.value?$(i.value):$("div","404 Not Found")}}),pe=(e={})=>e,Xe=e=>Pe(e)?e:`/code-standards/${Vt(e)}`;function Mt(e,n,i){var o,l,s;n===void 0&&(n=50),i===void 0&&(i={});var d=(o=i.isImmediate)!=null&&o,a=(l=i.callback)!=null&&l,c=i.maxWait,v=Date.now(),_=[];function f(){if(c!==void 0){var E=Date.now()-v;if(E+n>=c)return c-E}return n}var h=function(){var E=[].slice.call(arguments),y=this;return new Promise(function(A,L){var D=d&&s===void 0;if(s!==void 0&&clearTimeout(s),s=setTimeout(function(){if(s=void 0,v=Date.now(),!d){var x=e.apply(y,E);a&&a(x),_.forEach(function(Y){return(0,Y.resolve)(x)}),_=[]}},f()),D){var H=e.apply(y,E);return a&&a(H),A(H)}_.push({resolve:A,reject:L})})};return h.cancel=function(E){s!==void 0&&clearTimeout(s),_.forEach(function(y){return(0,y.reject)(E)}),_=[]},h}const Yn=({headerLinkSelector:e,headerAnchorSelector:n,delay:i,offset:o=5})=>{const l=ye(),d=Mt(()=>{var A,L;const a=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(a-0)h.some(H=>H.hash===D.hash));for(let D=0;D=(((A=H.parentElement)==null?void 0:A.offsetTop)??0)-o,J=!x||a<(((L=x.parentElement)==null?void 0:L.offsetTop)??0)-o;if(!(Y&&J))continue;const O=decodeURIComponent(l.currentRoute.value.hash),u=decodeURIComponent(H.hash);if(O===u)return;if(f){for(let S=D+1;S{window.addEventListener("scroll",d)}),kt(()=>{window.removeEventListener("scroll",d)})},st=async(e,n)=>{const{scrollBehavior:i}=e.options;e.options.scrollBehavior=void 0,await e.replace({query:e.currentRoute.value.query,hash:n,force:!0}).finally(()=>e.options.scrollBehavior=i)},Jn="a.sidebar-item",Zn=".header-anchor",Xn=300,ei=5,ti=pe({setup(){Yn({headerLinkSelector:Jn,headerAnchorSelector:Zn,delay:Xn,offset:ei})}}),dt=()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,ni=()=>window.scrollTo({top:0,behavior:"smooth"});const ii=k({name:"BackToTop",setup(){const e=z(0),n=g(()=>e.value>300),i=Mt(()=>{e.value=dt()},100);te(()=>{e.value=dt(),window.addEventListener("scroll",()=>i())});const o=$("div",{class:"back-to-top",onClick:ni});return()=>$(We,{name:"back-to-top"},()=>n.value?o:null)}}),oi=pe({rootComponents:[ii]});const ri=$("svg",{class:"external-link-icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},[$("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}),$("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"})]),li=k({name:"ExternalLinkIcon",props:{locales:{type:Object,required:!1,default:()=>({})}},setup(e){const n=$e(),i=g(()=>e.locales[n.value]??{openInNewWindow:"open in new window"});return()=>$("span",[ri,$("span",{class:"external-link-icon-sr-only"},i.value.openInNewWindow)])}}),ai={"/":{openInNewWindow:"open in new window"}},si=pe({enhance({app:e}){e.component("ExternalLinkIcon",$(li,{locales:ai}))}});/*! medium-zoom 1.0.8 | MIT License | https://github.com/francoischalifour/medium-zoom */var _e=Object.assign||function(e){for(var n=1;n{if(s=$n(s),s in at)return;at[s]=!0;const d=s.endsWith(".css"),a=d?'[rel="stylesheet"]':"";if(!!o)for(let _=l.length-1;_>=0;_--){const f=l[_];if(f.href===s&&(!d||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${s}"]${a}`))return;const v=document.createElement("link");if(v.rel=d?"stylesheet":xn,d||(v.as="script",v.crossOrigin=""),v.href=s,document.head.appendChild(v),d)return new Promise((_,f)=>{v.addEventListener("load",_),v.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${s}`)))})})).then(()=>n())},Cn={"v-8daa1a0e":()=>t(()=>import("./index.html-8af84718.js"),[]).then(({data:e})=>e),"v-c1f0fcce":()=>t(()=>import("./index.html-bd8c0e2b.js"),[]).then(({data:e})=>e),"v-466569ae":()=>t(()=>import("./clean-architecture.html-0a43515d.js"),[]).then(({data:e})=>e),"v-0f9a8a22":()=>t(()=>import("./code-style.html-ec60c8be.js"),[]).then(({data:e})=>e),"v-16386b36":()=>t(()=>import("./coroutines.html-c3b7adee.js"),[]).then(({data:e})=>e),"v-529e84aa":()=>t(()=>import("./dependency-injection.html-7ca22a45.js"),[]).then(({data:e})=>e),"v-757f0c54":()=>t(()=>import("./error-handling.html-4f085cea.js"),[]).then(({data:e})=>e),"v-3e66553f":()=>t(()=>import("./kotlin.html-55fb7682.js"),[]).then(({data:e})=>e),"v-631ebf3c":()=>t(()=>import("./local-databases.html-9795e7df.js"),[]).then(({data:e})=>e),"v-7c84f940":()=>t(()=>import("./mvvm.html-b1fc5aea.js"),[]).then(({data:e})=>e),"v-3798263d":()=>t(()=>import("./network-requests.html-ff3d9625.js"),[]).then(({data:e})=>e),"v-67bfbd0d":()=>t(()=>import("./pull-request-labels.html-51f8b020.js"),[]).then(({data:e})=>e),"v-0e9bbce2":()=>t(()=>import("./testing.html-d4b84a4a.js"),[]).then(({data:e})=>e),"v-551bb614":()=>t(()=>import("./index.html-fdbfa421.js"),[]).then(({data:e})=>e),"v-c1772168":()=>t(()=>import("./apis.html-e80ad727.js"),[]).then(({data:e})=>e),"v-b97e7df6":()=>t(()=>import("./general.html-f63233a0.js"),[]).then(({data:e})=>e),"v-35d72f40":()=>t(()=>import("./hatchly.html-3ec63991.js"),[]).then(({data:e})=>e),"v-6957d9d4":()=>t(()=>import("./laravel.html-fba4f317.js"),[]).then(({data:e})=>e),"v-0f7bc716":()=>t(()=>import("./php.html-d96eeb3c.js"),[]).then(({data:e})=>e),"v-7d441486":()=>t(()=>import("./recommended-packages.html-a3b1a5f4.js"),[]).then(({data:e})=>e),"v-5033abfc":()=>t(()=>import("./index.html-020e10a0.js"),[]).then(({data:e})=>e),"v-565ee9db":()=>t(()=>import("./c-sharp.html-017816ce.js"),[]).then(({data:e})=>e),"v-7428160f":()=>t(()=>import("./general-guidelines.html-c230c9d2.js"),[]).then(({data:e})=>e),"v-2a1c4858":()=>t(()=>import("./recommended-packages.html-fa6fddf8.js"),[]).then(({data:e})=>e),"v-59c1b58c":()=>t(()=>import("./index.html-d61d5321.js"),[]).then(({data:e})=>e),"v-02d166ed":()=>t(()=>import("./codesigning.html-f30b74fd.js"),[]).then(({data:e})=>e),"v-3e9b8cb3":()=>t(()=>import("./continuous-delivery.html-0b67867a.js"),[]).then(({data:e})=>e),"v-1f335512":()=>t(()=>import("./continuous-integration.html-74e9e5a8.js"),[]).then(({data:e})=>e),"v-37a57446":()=>t(()=>import("./crash-reporting.html-f4f228c3.js"),[]).then(({data:e})=>e),"v-66577348":()=>t(()=>import("./linting-rules.html-66185d96.js"),[]).then(({data:e})=>e),"v-3a4b8043":()=>t(()=>import("./monarch.html-30131cfd.js"),[]).then(({data:e})=>e),"v-664e86a4":()=>t(()=>import("./multiple-firebase-environments.html-97651951.js"),[]).then(({data:e})=>e),"v-539bafa3":()=>t(()=>import("./naming-widgets.html-364b6e53.js"),[]).then(({data:e})=>e),"v-2d5b4388":()=>t(()=>import("./project-setup.html-a947d575.js"),[]).then(({data:e})=>e),"v-382c27e4":()=>t(()=>import("./recommended-packages.html-1f705211.js"),[]).then(({data:e})=>e),"v-50b19462":()=>t(()=>import("./security-practices.html-41dae869.js"),[]).then(({data:e})=>e),"v-55f3772e":()=>t(()=>import("./state-management.html-510c5ce6.js"),[]).then(({data:e})=>e),"v-03009c55":()=>t(()=>import("./testing.html-52401cfa.js"),[]).then(({data:e})=>e),"v-9c19581a":()=>t(()=>import("./third-party-packages.html-6412f1ad.js"),[]).then(({data:e})=>e),"v-06198984":()=>t(()=>import("./index.html-ad670986.js"),[]).then(({data:e})=>e),"v-e2885e62":()=>t(()=>import("./accessibility.html-fb379aa3.js"),[]).then(({data:e})=>e),"v-14e18006":()=>t(()=>import("./automated-workflows.html-a45a4ff6.js"),[]).then(({data:e})=>e),"v-b37d638c":()=>t(()=>import("./css.html-9c076e95.js"),[]).then(({data:e})=>e),"v-cf5f91ec":()=>t(()=>import("./html.html-550320c3.js"),[]).then(({data:e})=>e),"v-5aa1fcf0":()=>t(()=>import("./javascript.html-2063a1de.js"),[]).then(({data:e})=>e),"v-e0725fa6":()=>t(()=>import("./performance.html-a0676d34.js"),[]).then(({data:e})=>e),"v-3d0401d4":()=>t(()=>import("./recommended-packages.html-31b5055f.js"),[]).then(({data:e})=>e),"v-56ad03c2":()=>t(()=>import("./required-qa.html-456d3003.js"),[]).then(({data:e})=>e),"v-7c336682":()=>t(()=>import("./storybook.html-b7fde644.js"),[]).then(({data:e})=>e),"v-a43f7ed2":()=>t(()=>import("./vue.html-8a020b09.js"),[]).then(({data:e})=>e),"v-4290fe40":()=>t(()=>import("./index.html-39b4afdb.js"),[]).then(({data:e})=>e),"v-1efcfaf2":()=>t(()=>import("./git.html-cf84f6ae.js"),[]).then(({data:e})=>e),"v-60154c4d":()=>t(()=>import("./pull-requests.html-64b7734c.js"),[]).then(({data:e})=>e),"v-7448383b":()=>t(()=>import("./index.html-b000ddd1.js"),[]).then(({data:e})=>e),"v-6312ceea":()=>t(()=>import("./architecture.html-41a12d9c.js"),[]).then(({data:e})=>e),"v-41cdb664":()=>t(()=>import("./bundler.html-ac28642f.js"),[]).then(({data:e})=>e),"v-8f9aa8c8":()=>t(()=>import("./codesigning.html-e1789a81.js"),[]).then(({data:e})=>e),"v-e5d488aa":()=>t(()=>import("./layouts.html-610ae674.js"),[]).then(({data:e})=>e),"v-69fbfaf5":()=>t(()=>import("./linting.html-39e82972.js"),[]).then(({data:e})=>e),"v-19659084":()=>t(()=>import("./testing.html-3526e38e.js"),[]).then(({data:e})=>e),"v-07b78fc1":()=>t(()=>import("./pull-requests.html-cacf8cde.js"),[]).then(({data:e})=>e),"v-6250ba7a":()=>t(()=>import("./index.html-c315df85.js"),[]).then(({data:e})=>e),"v-2628fc2c":()=>t(()=>import("./architecture.html-1cb869df.js"),[]).then(({data:e})=>e),"v-e38a0e40":()=>t(()=>import("./handling-errors.html-9508f429.js"),[]).then(({data:e})=>e),"v-22e0faa6":()=>t(()=>import("./localization.html-f8305782.js"),[]).then(({data:e})=>e),"v-97fb1a00":()=>t(()=>import("./state-management.html-e83bc206.js"),[]).then(({data:e})=>e),"v-37802094":()=>t(()=>import("./index.html-d090af1a.js"),[]).then(({data:e})=>e),"v-a90e54ba":()=>t(()=>import("./index.html-07727049.js"),[]).then(({data:e})=>e),"v-2a442892":()=>t(()=>import("./cheat-sheet.html-1b7cce3b.js"),[]).then(({data:e})=>e),"v-57e37f2f":()=>t(()=>import("./unit-testing.html-014818fa.js"),[]).then(({data:e})=>e),"v-54eb29ab":()=>t(()=>import("./visual-regression-testing.html-4faa458a.js"),[]).then(({data:e})=>e),"v-64f437db":()=>t(()=>import("./what-to-test.html-2442636c.js"),[]).then(({data:e})=>e),"v-e9c8dde2":()=>t(()=>import("./index.html-a27be770.js"),[]).then(({data:e})=>e),"v-4b210889":()=>t(()=>import("./block-no-empty.html-e4d495b5.js"),[]).then(({data:e})=>e),"v-af607c30":()=>t(()=>import("./color-hex-length.html-fad23e9d.js"),[]).then(({data:e})=>e),"v-519968f9":()=>t(()=>import("./color-named.html-5f3f962c.js"),[]).then(({data:e})=>e),"v-397d0ca7":()=>t(()=>import("./color-no-invalid-hex.html-5c497ea8.js"),[]).then(({data:e})=>e),"v-bb23520c":()=>t(()=>import("./declaration-block-no-duplicate-properties.html-f491a79b.js"),[]).then(({data:e})=>e),"v-6c22cf5e":()=>t(()=>import("./declaration-block-no-shorthand-property-overrides.html-9a1fa8e7.js"),[]).then(({data:e})=>e),"v-7e06cb41":()=>t(()=>import("./declaration-no-important.html-dd521934.js"),[]).then(({data:e})=>e),"v-48eac4b6":()=>t(()=>import("./length-zero-no-unit.html-ef7483df.js"),[]).then(({data:e})=>e),"v-41cad91c":()=>t(()=>import("./property-no-unknown.html-63d9822e.js"),[]).then(({data:e})=>e),"v-531ca99c":()=>t(()=>import("./shorthand-property-no-redundant-values.html-e4d55522.js"),[]).then(({data:e})=>e),"v-f3429ebe":()=>t(()=>import("./unit-no-unknown.html-d4059eb0.js"),[]).then(({data:e})=>e),"v-357fd18a":()=>t(()=>import("./index.html-99883bf9.js"),[]).then(({data:e})=>e),"v-100a2dc2":()=>t(()=>import("./arrow-parens.html-abbce7f3.js"),[]).then(({data:e})=>e),"v-a313ce78":()=>t(()=>import("./arrow-spacing.html-fe101eee.js"),[]).then(({data:e})=>e),"v-0aa90808":()=>t(()=>import("./comma-dangle.html-aa7d699e.js"),[]).then(({data:e})=>e),"v-3c3f0636":()=>t(()=>import("./curly.html-d03ace04.js"),[]).then(({data:e})=>e),"v-12563f14":()=>t(()=>import("./dot-location.html-1f6fcc48.js"),[]).then(({data:e})=>e),"v-91ea676e":()=>t(()=>import("./dot-notation.html-9fe70716.js"),[]).then(({data:e})=>e),"v-6a6febae":()=>t(()=>import("./eol-last.html-fe90ce71.js"),[]).then(({data:e})=>e),"v-7153028b":()=>t(()=>import("./eqeqeq.html-f3e5cbeb.js"),[]).then(({data:e})=>e),"v-472c7927":()=>t(()=>import("./import-extensions.html-3c304518.js"),[]).then(({data:e})=>e),"v-566d8fe3":()=>t(()=>import("./indent.html-d1960e0a.js"),[]).then(({data:e})=>e),"v-276e9d03":()=>t(()=>import("./jsdoc-check-alignment.html-1d514864.js"),[]).then(({data:e})=>e),"v-3904919d":()=>t(()=>import("./jsdoc-check-indentation.html-7037c44e.js"),[]).then(({data:e})=>e),"v-1e8810be":()=>t(()=>import("./jsdoc-check-param-names.html-bbcb99c0.js"),[]).then(({data:e})=>e),"v-6a1179c9":()=>t(()=>import("./jsdoc-check-syntax.html-0c90340e.js"),[]).then(({data:e})=>e),"v-4e16c6d1":()=>t(()=>import("./jsdoc-check-tag-names.html-82b43fd3.js"),[]).then(({data:e})=>e),"v-f2ae9aa6":()=>t(()=>import("./jsdoc-check-types.html-5674a85c.js"),[]).then(({data:e})=>e),"v-e30b0768":()=>t(()=>import("./jsdoc-implements-on-classes.html-eeaa055b.js"),[]).then(({data:e})=>e),"v-3e7e482d":()=>t(()=>import("./jsdoc-match-description.html-12ee076c.js"),[]).then(({data:e})=>e),"v-7ae60b61":()=>t(()=>import("./jsdoc-no-undefined-types.html-69c1ee47.js"),[]).then(({data:e})=>e),"v-5eab67e3":()=>t(()=>import("./jsdoc-require-description-complete-sentence.html-e8aa28b8.js"),[]).then(({data:e})=>e),"v-395e7ae6":()=>t(()=>import("./jsdoc-require-description.html-b615aef2.js"),[]).then(({data:e})=>e),"v-5aed3484":()=>t(()=>import("./jsdoc-require-param-name.html-34e11784.js"),[]).then(({data:e})=>e),"v-b01a3322":()=>t(()=>import("./jsdoc-require-param-type.html-ad737444.js"),[]).then(({data:e})=>e),"v-ac1176c8":()=>t(()=>import("./jsdoc-require-param.html-a5c9db68.js"),[]).then(({data:e})=>e),"v-3fc487cb":()=>t(()=>import("./jsdoc-require-returns-check.html-b5668de8.js"),[]).then(({data:e})=>e),"v-fb0bd0b6":()=>t(()=>import("./jsdoc-require-returns-type.html-e97614c0.js"),[]).then(({data:e})=>e),"v-39f7a9a6":()=>t(()=>import("./jsdoc-require-returns.html-f5ab647b.js"),[]).then(({data:e})=>e),"v-6578a815":()=>t(()=>import("./jsdoc-tag-lines.html-4b6e27c8.js"),[]).then(({data:e})=>e),"v-5dc36739":()=>t(()=>import("./jsdoc-valid-types.html-a7680ec0.js"),[]).then(({data:e})=>e),"v-73a024ae":()=>t(()=>import("./key-spacing.html-116f3af2.js"),[]).then(({data:e})=>e),"v-6d2165da":()=>t(()=>import("./netsells-component-file-names.html-a2622bba.js"),[]).then(({data:e})=>e),"v-673c5452":()=>t(()=>import("./netsells-no-dom-listeners.html-b5d52766.js"),[]).then(({data:e})=>e),"v-5febc12c":()=>t(()=>import("./netsells-no-global-timeouts.html-4e7f7f2e.js"),[]).then(({data:e})=>e),"v-324c9b3f":()=>t(()=>import("./no-alert.html-328b269c.js"),[]).then(({data:e})=>e),"v-1a75683e":()=>t(()=>import("./no-cond-assign.html-4af7e4e4.js"),[]).then(({data:e})=>e),"v-ec4208b8":()=>t(()=>import("./no-console.html-81ee8816.js"),[]).then(({data:e})=>e),"v-08b70fd6":()=>t(()=>import("./no-debugger.html-227639cf.js"),[]).then(({data:e})=>e),"v-5bb8acef":()=>t(()=>import("./no-duplicate-imports.html-d9af1058.js"),[]).then(({data:e})=>e),"v-401183d7":()=>t(()=>import("./no-else-return.html-e3c11450.js"),[]).then(({data:e})=>e),"v-2112c102":()=>t(()=>import("./no-empty-function.html-146c9b33.js"),[]).then(({data:e})=>e),"v-fe8f2424":()=>t(()=>import("./no-empty.html-8192cd1a.js"),[]).then(({data:e})=>e),"v-6f62d73b":()=>t(()=>import("./no-eval.html-96465782.js"),[]).then(({data:e})=>e),"v-1d05670d":()=>t(()=>import("./no-floating-decimal.html-5f36347c.js"),[]).then(({data:e})=>e),"v-4fabda95":()=>t(()=>import("./no-implicit-coercion.html-81fc051d.js"),[]).then(({data:e})=>e),"v-757de0d8":()=>t(()=>import("./no-lonely-if.html-e5b72121.js"),[]).then(({data:e})=>e),"v-25f99a4e":()=>t(()=>import("./no-mixed-spaces-and-tabs.html-5b39c0ef.js"),[]).then(({data:e})=>e),"v-0a8fc955":()=>t(()=>import("./no-multiple-empty-lines.html-c0d85137.js"),[]).then(({data:e})=>e),"v-6df18d5b":()=>t(()=>import("./no-restricted-imports.html-63484304.js"),[]).then(({data:e})=>e),"v-e5052018":()=>t(()=>import("./no-sparse-arrays.html-ce5aa6aa.js"),[]).then(({data:e})=>e),"v-2e009a9e":()=>t(()=>import("./no-template-curly-in-string.html-94c0eeba.js"),[]).then(({data:e})=>e),"v-6968233b":()=>t(()=>import("./no-unneeded-ternary.html-32b9ddec.js"),[]).then(({data:e})=>e),"v-098f63b8":()=>t(()=>import("./no-unused-vars.html-417fe465.js"),[]).then(({data:e})=>e),"v-71e8bbf8":()=>t(()=>import("./no-use-before-define.html-31bffd4d.js"),[]).then(({data:e})=>e),"v-4b44aefa":()=>t(()=>import("./no-useless-return.html-12a69c82.js"),[]).then(({data:e})=>e),"v-e9582658":()=>t(()=>import("./no-var.html-182d3d3b.js"),[]).then(({data:e})=>e),"v-098e8ca6":()=>t(()=>import("./operator-linebreak.html-347374f3.js"),[]).then(({data:e})=>e),"v-651d76bd":()=>t(()=>import("./prefer-arrow-callback.html-dfea4341.js"),[]).then(({data:e})=>e),"v-7bc232e9":()=>t(()=>import("./prefer-const.html-e9fe7cc1.js"),[]).then(({data:e})=>e),"v-7197202c":()=>t(()=>import("./prefer-template.html-3b072722.js"),[]).then(({data:e})=>e),"v-42eab5f8":()=>t(()=>import("./quotes.html-32f10322.js"),[]).then(({data:e})=>e),"v-702dd356":()=>t(()=>import("./require-jsdoc-except-require-jsdoc.html-6ad12912.js"),[]).then(({data:e})=>e),"v-00d42fe1":()=>t(()=>import("./semi.html-b5ff2a67.js"),[]).then(({data:e})=>e),"v-104c62f2":()=>t(()=>import("./space-before-function-paren.html-42a97467.js"),[]).then(({data:e})=>e),"v-009b1cdf":()=>t(()=>import("./template-curly-spacing.html-1536714f.js"),[]).then(({data:e})=>e),"v-3fd2ad10":()=>t(()=>import("./vue-attribute-hyphenation.html-5ce3b293.js"),[]).then(({data:e})=>e),"v-8009c03a":()=>t(()=>import("./vue-component-definition-name-casing.html-ea5da332.js"),[]).then(({data:e})=>e),"v-e70076c0":()=>t(()=>import("./vue-component-name-in-template-casing.html-6a68e8f3.js"),[]).then(({data:e})=>e),"v-d9848c78":()=>t(()=>import("./vue-eqeqeq.html-ec1ad67a.js"),[]).then(({data:e})=>e),"v-fef2401a":()=>t(()=>import("./vue-html-closing-bracket-newline.html-9d8180e0.js"),[]).then(({data:e})=>e),"v-48f64ab8":()=>t(()=>import("./vue-html-closing-bracket-spacing.html-e21b400c.js"),[]).then(({data:e})=>e),"v-c62fa308":()=>t(()=>import("./vue-html-indent.html-a19e2bcb.js"),[]).then(({data:e})=>e),"v-ed3556de":()=>t(()=>import("./vue-html-quotes.html-aa1ba5d2.js"),[]).then(({data:e})=>e),"v-c7d7edd6":()=>t(()=>import("./vue-key-spacing.html-557bce16.js"),[]).then(({data:e})=>e),"v-418b9826":()=>t(()=>import("./vue-match-component-file-name.html-65991427.js"),[]).then(({data:e})=>e),"v-92ab210e":()=>t(()=>import("./vue-max-attributes-per-line.html-c2342911.js"),[]).then(({data:e})=>e),"v-0fd42d33":()=>t(()=>import("./vue-mustache-interpolation-spacing.html-71faeeca.js"),[]).then(({data:e})=>e),"v-51dd6b4e":()=>t(()=>import("./vue-no-dupe-keys.html-e1c8621a.js"),[]).then(({data:e})=>e),"v-26b7b885":()=>t(()=>import("./vue-no-duplicate-attributes.html-e0b8a982.js"),[]).then(({data:e})=>e),"v-58303e9d":()=>t(()=>import("./vue-no-multi-spaces.html-37a52dca.js"),[]).then(({data:e})=>e),"v-7d626b1c":()=>t(()=>import("./vue-no-shared-component-data.html-94ef8897.js"),[]).then(({data:e})=>e),"v-326d9ab0":()=>t(()=>import("./vue-no-side-effects-in-computed-properties.html-abbcd44d.js"),[]).then(({data:e})=>e),"v-e20f65ce":()=>t(()=>import("./vue-no-textarea-mustache.html-e05184da.js"),[]).then(({data:e})=>e),"v-dfe05c1e":()=>t(()=>import("./vue-no-unused-vars.html-a5bfc8c3.js"),[]).then(({data:e})=>e),"v-bc1f78c8":()=>t(()=>import("./vue-no-v-html.html-b76c72a6.js"),[]).then(({data:e})=>e),"v-733d32f3":()=>t(()=>import("./vue-object-curly-spacing.html-0978a325.js"),[]).then(({data:e})=>e),"v-69464eaa":()=>t(()=>import("./vue-order-in-components.html-e0e19810.js"),[]).then(({data:e})=>e),"v-55082d91":()=>t(()=>import("./vue-require-default-prop.html-a0009100.js"),[]).then(({data:e})=>e),"v-201b7d31":()=>t(()=>import("./vue-require-prop-types.html-4a40799f.js"),[]).then(({data:e})=>e),"v-2dd246c0":()=>t(()=>import("./vue-return-in-computed-property.html-27cb8e11.js"),[]).then(({data:e})=>e),"v-7470e148":()=>t(()=>import("./vue-script-indent.html-9e8e16b0.js"),[]).then(({data:e})=>e),"v-f3290416":()=>t(()=>import("./vue-this-in-template.html-86af24a8.js"),[]).then(({data:e})=>e),"v-1d166a30":()=>t(()=>import("./vue-v-bind-style.html-29cf8f6d.js"),[]).then(({data:e})=>e),"v-f09e31e8":()=>t(()=>import("./vue-v-on-function-call.html-b77a36ce.js"),[]).then(({data:e})=>e),"v-2859dd4e":()=>t(()=>import("./vue-v-on-style.html-a1d44a0d.js"),[]).then(({data:e})=>e),"v-5da202a1":()=>t(()=>import("./vuejs-accessibility-alt-text.html-1565c36f.js"),[]).then(({data:e})=>e),"v-deaa79b8":()=>t(()=>import("./vuejs-accessibility-anchor-has-content.html-f7d94e94.js"),[]).then(({data:e})=>e),"v-7dd0c466":()=>t(()=>import("./vuejs-accessibility-aria-props.html-9b05d47d.js"),[]).then(({data:e})=>e),"v-a9b540f4":()=>t(()=>import("./vuejs-accessibility-aria-role.html-94375eaa.js"),[]).then(({data:e})=>e),"v-c11397e6":()=>t(()=>import("./vuejs-accessibility-aria-unsupported-elements.html-90099148.js"),[]).then(({data:e})=>e),"v-b6cb7116":()=>t(()=>import("./vuejs-accessibility-click-events-have-key-events.html-78379a82.js"),[]).then(({data:e})=>e),"v-663e674a":()=>t(()=>import("./vuejs-accessibility-form-control-has-label.html-9863598c.js"),[]).then(({data:e})=>e),"v-3353c5b6":()=>t(()=>import("./vuejs-accessibility-heading-has-content.html-51dd1708.js"),[]).then(({data:e})=>e),"v-1f40a5d6":()=>t(()=>import("./vuejs-accessibility-iframe-has-title.html-47dcf2cd.js"),[]).then(({data:e})=>e),"v-2ea82790":()=>t(()=>import("./vuejs-accessibility-interactive-supports-focus.html-fd6f51d0.js"),[]).then(({data:e})=>e),"v-356d2112":()=>t(()=>import("./vuejs-accessibility-mouse-events-have-key-events.html-eb49ac52.js"),[]).then(({data:e})=>e),"v-658bedbe":()=>t(()=>import("./vuejs-accessibility-no-access-key.html-a000e347.js"),[]).then(({data:e})=>e),"v-37f858f5":()=>t(()=>import("./vuejs-accessibility-no-autofocus.html-c35a6590.js"),[]).then(({data:e})=>e),"v-9914faa8":()=>t(()=>import("./vuejs-accessibility-no-distracting-elements.html-1e4ddbfa.js"),[]).then(({data:e})=>e),"v-e775df76":()=>t(()=>import("./vuejs-accessibility-no-onchange.html-09742e89.js"),[]).then(({data:e})=>e),"v-3092d461":()=>t(()=>import("./vuejs-accessibility-no-redundant-roles.html-0107d6b1.js"),[]).then(({data:e})=>e),"v-3a9db3c2":()=>t(()=>import("./vuejs-accessibility-role-has-required-aria-props.html-896fc0d9.js"),[]).then(({data:e})=>e),"v-af372d46":()=>t(()=>import("./vuejs-accessibility-tabindex-no-positive.html-8954a5e9.js"),[]).then(({data:e})=>e),"v-c1089f48":()=>t(()=>import("./yoda.html-ebf32b48.js"),[]).then(({data:e})=>e),"v-3706649a":()=>t(()=>import("./404.html-60b35caa.js"),[]).then(({data:e})=>e)},qn=JSON.parse('{"base":"/code-standards/","lang":"en-US","title":"Netsells Code Standards","description":"","head":[],"locales":{}}'),xt={"v-8daa1a0e":r(()=>t(()=>import("./index.html-504ecac3.js"),["assets/index.html-504ecac3.js","assets/framework-9cabc8c6.js"])),"v-c1f0fcce":r(()=>t(()=>import("./index.html-4650db09.js"),["assets/index.html-4650db09.js","assets/framework-9cabc8c6.js"])),"v-466569ae":r(()=>t(()=>import("./clean-architecture.html-7b28dc63.js"),["assets/clean-architecture.html-7b28dc63.js","assets/framework-9cabc8c6.js"])),"v-0f9a8a22":r(()=>t(()=>import("./code-style.html-5d0fdffe.js"),["assets/code-style.html-5d0fdffe.js","assets/framework-9cabc8c6.js"])),"v-16386b36":r(()=>t(()=>import("./coroutines.html-99c7f21e.js"),["assets/coroutines.html-99c7f21e.js","assets/framework-9cabc8c6.js"])),"v-529e84aa":r(()=>t(()=>import("./dependency-injection.html-980555d0.js"),["assets/dependency-injection.html-980555d0.js","assets/framework-9cabc8c6.js"])),"v-757f0c54":r(()=>t(()=>import("./error-handling.html-e28d12d7.js"),["assets/error-handling.html-e28d12d7.js","assets/framework-9cabc8c6.js"])),"v-3e66553f":r(()=>t(()=>import("./kotlin.html-e11de88c.js"),["assets/kotlin.html-e11de88c.js","assets/framework-9cabc8c6.js"])),"v-631ebf3c":r(()=>t(()=>import("./local-databases.html-1d353418.js"),["assets/local-databases.html-1d353418.js","assets/framework-9cabc8c6.js"])),"v-7c84f940":r(()=>t(()=>import("./mvvm.html-24db3bf6.js"),["assets/mvvm.html-24db3bf6.js","assets/framework-9cabc8c6.js"])),"v-3798263d":r(()=>t(()=>import("./network-requests.html-01d2964c.js"),["assets/network-requests.html-01d2964c.js","assets/framework-9cabc8c6.js"])),"v-67bfbd0d":r(()=>t(()=>import("./pull-request-labels.html-ee66a12b.js"),["assets/pull-request-labels.html-ee66a12b.js","assets/framework-9cabc8c6.js"])),"v-0e9bbce2":r(()=>t(()=>import("./testing.html-5c6876c9.js"),["assets/testing.html-5c6876c9.js","assets/framework-9cabc8c6.js"])),"v-551bb614":r(()=>t(()=>import("./index.html-6b0e0546.js"),["assets/index.html-6b0e0546.js","assets/framework-9cabc8c6.js"])),"v-c1772168":r(()=>t(()=>import("./apis.html-e2b1d426.js"),["assets/apis.html-e2b1d426.js","assets/framework-9cabc8c6.js"])),"v-b97e7df6":r(()=>t(()=>import("./general.html-9d31a8a9.js"),["assets/general.html-9d31a8a9.js","assets/framework-9cabc8c6.js"])),"v-35d72f40":r(()=>t(()=>import("./hatchly.html-d0d4064f.js"),["assets/hatchly.html-d0d4064f.js","assets/framework-9cabc8c6.js"])),"v-6957d9d4":r(()=>t(()=>import("./laravel.html-12c5a8f4.js"),["assets/laravel.html-12c5a8f4.js","assets/framework-9cabc8c6.js"])),"v-0f7bc716":r(()=>t(()=>import("./php.html-0cb1cbd9.js"),["assets/php.html-0cb1cbd9.js","assets/framework-9cabc8c6.js"])),"v-7d441486":r(()=>t(()=>import("./recommended-packages.html-5d87ba68.js"),["assets/recommended-packages.html-5d87ba68.js","assets/framework-9cabc8c6.js"])),"v-5033abfc":r(()=>t(()=>import("./index.html-9c4d1d2c.js"),["assets/index.html-9c4d1d2c.js","assets/framework-9cabc8c6.js"])),"v-565ee9db":r(()=>t(()=>import("./c-sharp.html-7ca646a8.js"),["assets/c-sharp.html-7ca646a8.js","assets/framework-9cabc8c6.js"])),"v-7428160f":r(()=>t(()=>import("./general-guidelines.html-9edc35f8.js"),["assets/general-guidelines.html-9edc35f8.js","assets/framework-9cabc8c6.js"])),"v-2a1c4858":r(()=>t(()=>import("./recommended-packages.html-dd6ba9de.js"),["assets/recommended-packages.html-dd6ba9de.js","assets/framework-9cabc8c6.js"])),"v-59c1b58c":r(()=>t(()=>import("./index.html-228a1e6f.js"),["assets/index.html-228a1e6f.js","assets/framework-9cabc8c6.js"])),"v-02d166ed":r(()=>t(()=>import("./codesigning.html-562e13e6.js"),["assets/codesigning.html-562e13e6.js","assets/framework-9cabc8c6.js"])),"v-3e9b8cb3":r(()=>t(()=>import("./continuous-delivery.html-ef07c469.js"),["assets/continuous-delivery.html-ef07c469.js","assets/framework-9cabc8c6.js"])),"v-1f335512":r(()=>t(()=>import("./continuous-integration.html-c9505e8f.js"),["assets/continuous-integration.html-c9505e8f.js","assets/framework-9cabc8c6.js"])),"v-37a57446":r(()=>t(()=>import("./crash-reporting.html-13c1dba6.js"),["assets/crash-reporting.html-13c1dba6.js","assets/framework-9cabc8c6.js"])),"v-66577348":r(()=>t(()=>import("./linting-rules.html-8ee4f1e5.js"),["assets/linting-rules.html-8ee4f1e5.js","assets/framework-9cabc8c6.js"])),"v-3a4b8043":r(()=>t(()=>import("./monarch.html-efefb090.js"),["assets/monarch.html-efefb090.js","assets/framework-9cabc8c6.js"])),"v-664e86a4":r(()=>t(()=>import("./multiple-firebase-environments.html-e6968e42.js"),["assets/multiple-firebase-environments.html-e6968e42.js","assets/framework-9cabc8c6.js"])),"v-539bafa3":r(()=>t(()=>import("./naming-widgets.html-3f3439e6.js"),["assets/naming-widgets.html-3f3439e6.js","assets/framework-9cabc8c6.js"])),"v-2d5b4388":r(()=>t(()=>import("./project-setup.html-2e7077a6.js"),["assets/project-setup.html-2e7077a6.js","assets/framework-9cabc8c6.js"])),"v-382c27e4":r(()=>t(()=>import("./recommended-packages.html-a48d98a4.js"),["assets/recommended-packages.html-a48d98a4.js","assets/framework-9cabc8c6.js"])),"v-50b19462":r(()=>t(()=>import("./security-practices.html-ebf150e7.js"),["assets/security-practices.html-ebf150e7.js","assets/framework-9cabc8c6.js"])),"v-55f3772e":r(()=>t(()=>import("./state-management.html-383b9762.js"),["assets/state-management.html-383b9762.js","assets/framework-9cabc8c6.js"])),"v-03009c55":r(()=>t(()=>import("./testing.html-6d554a29.js"),["assets/testing.html-6d554a29.js","assets/framework-9cabc8c6.js"])),"v-9c19581a":r(()=>t(()=>import("./third-party-packages.html-edb7eb06.js"),["assets/third-party-packages.html-edb7eb06.js","assets/framework-9cabc8c6.js"])),"v-06198984":r(()=>t(()=>import("./index.html-a5d92d2a.js"),["assets/index.html-a5d92d2a.js","assets/framework-9cabc8c6.js"])),"v-e2885e62":r(()=>t(()=>import("./accessibility.html-f3b3321d.js"),["assets/accessibility.html-f3b3321d.js","assets/framework-9cabc8c6.js"])),"v-14e18006":r(()=>t(()=>import("./automated-workflows.html-e1bd6b30.js"),["assets/automated-workflows.html-e1bd6b30.js","assets/framework-9cabc8c6.js"])),"v-b37d638c":r(()=>t(()=>import("./css.html-d2b3a24f.js"),["assets/css.html-d2b3a24f.js","assets/framework-9cabc8c6.js"])),"v-cf5f91ec":r(()=>t(()=>import("./html.html-42bde551.js"),["assets/html.html-42bde551.js","assets/framework-9cabc8c6.js"])),"v-5aa1fcf0":r(()=>t(()=>import("./javascript.html-6707ae10.js"),["assets/javascript.html-6707ae10.js","assets/framework-9cabc8c6.js"])),"v-e0725fa6":r(()=>t(()=>import("./performance.html-dcd68db1.js"),["assets/performance.html-dcd68db1.js","assets/framework-9cabc8c6.js"])),"v-3d0401d4":r(()=>t(()=>import("./recommended-packages.html-f84df6fa.js"),["assets/recommended-packages.html-f84df6fa.js","assets/framework-9cabc8c6.js"])),"v-56ad03c2":r(()=>t(()=>import("./required-qa.html-62971206.js"),["assets/required-qa.html-62971206.js","assets/framework-9cabc8c6.js"])),"v-7c336682":r(()=>t(()=>import("./storybook.html-3abbd60d.js"),["assets/storybook.html-3abbd60d.js","assets/framework-9cabc8c6.js"])),"v-a43f7ed2":r(()=>t(()=>import("./vue.html-9de5b6ba.js"),["assets/vue.html-9de5b6ba.js","assets/framework-9cabc8c6.js"])),"v-4290fe40":r(()=>t(()=>import("./index.html-530db1be.js"),["assets/index.html-530db1be.js","assets/framework-9cabc8c6.js"])),"v-1efcfaf2":r(()=>t(()=>import("./git.html-efbf5794.js"),["assets/git.html-efbf5794.js","assets/framework-9cabc8c6.js"])),"v-60154c4d":r(()=>t(()=>import("./pull-requests.html-1b4ed270.js"),["assets/pull-requests.html-1b4ed270.js","assets/framework-9cabc8c6.js"])),"v-7448383b":r(()=>t(()=>import("./index.html-daa274f2.js"),["assets/index.html-daa274f2.js","assets/framework-9cabc8c6.js"])),"v-6312ceea":r(()=>t(()=>import("./architecture.html-5ff328b7.js"),["assets/architecture.html-5ff328b7.js","assets/framework-9cabc8c6.js"])),"v-41cdb664":r(()=>t(()=>import("./bundler.html-2846d238.js"),["assets/bundler.html-2846d238.js","assets/framework-9cabc8c6.js"])),"v-8f9aa8c8":r(()=>t(()=>import("./codesigning.html-d6ebabc0.js"),["assets/codesigning.html-d6ebabc0.js","assets/framework-9cabc8c6.js"])),"v-e5d488aa":r(()=>t(()=>import("./layouts.html-3b98ae6e.js"),["assets/layouts.html-3b98ae6e.js","assets/framework-9cabc8c6.js"])),"v-69fbfaf5":r(()=>t(()=>import("./linting.html-5452bcca.js"),["assets/linting.html-5452bcca.js","assets/framework-9cabc8c6.js"])),"v-19659084":r(()=>t(()=>import("./testing.html-c2c07642.js"),["assets/testing.html-c2c07642.js","assets/framework-9cabc8c6.js"])),"v-07b78fc1":r(()=>t(()=>import("./pull-requests.html-af19e387.js"),["assets/pull-requests.html-af19e387.js","assets/framework-9cabc8c6.js"])),"v-6250ba7a":r(()=>t(()=>import("./index.html-2e736592.js"),["assets/index.html-2e736592.js","assets/framework-9cabc8c6.js"])),"v-2628fc2c":r(()=>t(()=>import("./architecture.html-3da9179b.js"),["assets/architecture.html-3da9179b.js","assets/framework-9cabc8c6.js"])),"v-e38a0e40":r(()=>t(()=>import("./handling-errors.html-97d9fa9b.js"),["assets/handling-errors.html-97d9fa9b.js","assets/framework-9cabc8c6.js"])),"v-22e0faa6":r(()=>t(()=>import("./localization.html-2beae295.js"),["assets/localization.html-2beae295.js","assets/framework-9cabc8c6.js"])),"v-97fb1a00":r(()=>t(()=>import("./state-management.html-804d95e9.js"),["assets/state-management.html-804d95e9.js","assets/framework-9cabc8c6.js"])),"v-37802094":r(()=>t(()=>import("./index.html-90c6449b.js"),["assets/index.html-90c6449b.js","assets/framework-9cabc8c6.js"])),"v-a90e54ba":r(()=>t(()=>import("./index.html-4e52f169.js"),["assets/index.html-4e52f169.js","assets/framework-9cabc8c6.js"])),"v-2a442892":r(()=>t(()=>import("./cheat-sheet.html-d1b522dc.js"),["assets/cheat-sheet.html-d1b522dc.js","assets/framework-9cabc8c6.js"])),"v-57e37f2f":r(()=>t(()=>import("./unit-testing.html-c9d8aa15.js"),["assets/unit-testing.html-c9d8aa15.js","assets/framework-9cabc8c6.js"])),"v-54eb29ab":r(()=>t(()=>import("./visual-regression-testing.html-8ec6962e.js"),["assets/visual-regression-testing.html-8ec6962e.js","assets/framework-9cabc8c6.js"])),"v-64f437db":r(()=>t(()=>import("./what-to-test.html-7eabe764.js"),["assets/what-to-test.html-7eabe764.js","assets/framework-9cabc8c6.js"])),"v-e9c8dde2":r(()=>t(()=>import("./index.html-2e938f31.js"),["assets/index.html-2e938f31.js","assets/framework-9cabc8c6.js"])),"v-4b210889":r(()=>t(()=>import("./block-no-empty.html-39b5ba7d.js"),["assets/block-no-empty.html-39b5ba7d.js","assets/framework-9cabc8c6.js"])),"v-af607c30":r(()=>t(()=>import("./color-hex-length.html-9e67b2d8.js"),["assets/color-hex-length.html-9e67b2d8.js","assets/framework-9cabc8c6.js"])),"v-519968f9":r(()=>t(()=>import("./color-named.html-351ac353.js"),["assets/color-named.html-351ac353.js","assets/framework-9cabc8c6.js"])),"v-397d0ca7":r(()=>t(()=>import("./color-no-invalid-hex.html-823e82d4.js"),["assets/color-no-invalid-hex.html-823e82d4.js","assets/framework-9cabc8c6.js"])),"v-bb23520c":r(()=>t(()=>import("./declaration-block-no-duplicate-properties.html-ff16ea58.js"),["assets/declaration-block-no-duplicate-properties.html-ff16ea58.js","assets/framework-9cabc8c6.js"])),"v-6c22cf5e":r(()=>t(()=>import("./declaration-block-no-shorthand-property-overrides.html-b64e8842.js"),["assets/declaration-block-no-shorthand-property-overrides.html-b64e8842.js","assets/framework-9cabc8c6.js"])),"v-7e06cb41":r(()=>t(()=>import("./declaration-no-important.html-436aad8d.js"),["assets/declaration-no-important.html-436aad8d.js","assets/framework-9cabc8c6.js"])),"v-48eac4b6":r(()=>t(()=>import("./length-zero-no-unit.html-54874bad.js"),["assets/length-zero-no-unit.html-54874bad.js","assets/framework-9cabc8c6.js"])),"v-41cad91c":r(()=>t(()=>import("./property-no-unknown.html-16298fdc.js"),["assets/property-no-unknown.html-16298fdc.js","assets/framework-9cabc8c6.js"])),"v-531ca99c":r(()=>t(()=>import("./shorthand-property-no-redundant-values.html-24a07ac2.js"),["assets/shorthand-property-no-redundant-values.html-24a07ac2.js","assets/framework-9cabc8c6.js"])),"v-f3429ebe":r(()=>t(()=>import("./unit-no-unknown.html-89398c97.js"),["assets/unit-no-unknown.html-89398c97.js","assets/framework-9cabc8c6.js"])),"v-357fd18a":r(()=>t(()=>import("./index.html-5fe3786d.js"),["assets/index.html-5fe3786d.js","assets/framework-9cabc8c6.js"])),"v-100a2dc2":r(()=>t(()=>import("./arrow-parens.html-436c6e44.js"),["assets/arrow-parens.html-436c6e44.js","assets/framework-9cabc8c6.js"])),"v-a313ce78":r(()=>t(()=>import("./arrow-spacing.html-51a14507.js"),["assets/arrow-spacing.html-51a14507.js","assets/framework-9cabc8c6.js"])),"v-0aa90808":r(()=>t(()=>import("./comma-dangle.html-dc7005d6.js"),["assets/comma-dangle.html-dc7005d6.js","assets/framework-9cabc8c6.js"])),"v-3c3f0636":r(()=>t(()=>import("./curly.html-37632555.js"),["assets/curly.html-37632555.js","assets/framework-9cabc8c6.js"])),"v-12563f14":r(()=>t(()=>import("./dot-location.html-fd34afd4.js"),["assets/dot-location.html-fd34afd4.js","assets/framework-9cabc8c6.js"])),"v-91ea676e":r(()=>t(()=>import("./dot-notation.html-31e73a08.js"),["assets/dot-notation.html-31e73a08.js","assets/framework-9cabc8c6.js"])),"v-6a6febae":r(()=>t(()=>import("./eol-last.html-a08cc52f.js"),["assets/eol-last.html-a08cc52f.js","assets/framework-9cabc8c6.js"])),"v-7153028b":r(()=>t(()=>import("./eqeqeq.html-019791df.js"),["assets/eqeqeq.html-019791df.js","assets/framework-9cabc8c6.js"])),"v-472c7927":r(()=>t(()=>import("./import-extensions.html-425c7c33.js"),["assets/import-extensions.html-425c7c33.js","assets/framework-9cabc8c6.js"])),"v-566d8fe3":r(()=>t(()=>import("./indent.html-877d389e.js"),["assets/indent.html-877d389e.js","assets/framework-9cabc8c6.js"])),"v-276e9d03":r(()=>t(()=>import("./jsdoc-check-alignment.html-88cf7a19.js"),["assets/jsdoc-check-alignment.html-88cf7a19.js","assets/framework-9cabc8c6.js"])),"v-3904919d":r(()=>t(()=>import("./jsdoc-check-indentation.html-6c090bad.js"),["assets/jsdoc-check-indentation.html-6c090bad.js","assets/framework-9cabc8c6.js"])),"v-1e8810be":r(()=>t(()=>import("./jsdoc-check-param-names.html-ff527ec6.js"),["assets/jsdoc-check-param-names.html-ff527ec6.js","assets/framework-9cabc8c6.js"])),"v-6a1179c9":r(()=>t(()=>import("./jsdoc-check-syntax.html-23b54f92.js"),["assets/jsdoc-check-syntax.html-23b54f92.js","assets/framework-9cabc8c6.js"])),"v-4e16c6d1":r(()=>t(()=>import("./jsdoc-check-tag-names.html-bb5bfe35.js"),["assets/jsdoc-check-tag-names.html-bb5bfe35.js","assets/framework-9cabc8c6.js"])),"v-f2ae9aa6":r(()=>t(()=>import("./jsdoc-check-types.html-9d900b55.js"),["assets/jsdoc-check-types.html-9d900b55.js","assets/framework-9cabc8c6.js"])),"v-e30b0768":r(()=>t(()=>import("./jsdoc-implements-on-classes.html-0f1350f6.js"),["assets/jsdoc-implements-on-classes.html-0f1350f6.js","assets/framework-9cabc8c6.js"])),"v-3e7e482d":r(()=>t(()=>import("./jsdoc-match-description.html-c7d72a2a.js"),["assets/jsdoc-match-description.html-c7d72a2a.js","assets/framework-9cabc8c6.js"])),"v-7ae60b61":r(()=>t(()=>import("./jsdoc-no-undefined-types.html-256e5428.js"),["assets/jsdoc-no-undefined-types.html-256e5428.js","assets/framework-9cabc8c6.js"])),"v-5eab67e3":r(()=>t(()=>import("./jsdoc-require-description-complete-sentence.html-674e5504.js"),["assets/jsdoc-require-description-complete-sentence.html-674e5504.js","assets/framework-9cabc8c6.js"])),"v-395e7ae6":r(()=>t(()=>import("./jsdoc-require-description.html-91c523c1.js"),["assets/jsdoc-require-description.html-91c523c1.js","assets/framework-9cabc8c6.js"])),"v-5aed3484":r(()=>t(()=>import("./jsdoc-require-param-name.html-36780603.js"),["assets/jsdoc-require-param-name.html-36780603.js","assets/framework-9cabc8c6.js"])),"v-b01a3322":r(()=>t(()=>import("./jsdoc-require-param-type.html-2d854c16.js"),["assets/jsdoc-require-param-type.html-2d854c16.js","assets/framework-9cabc8c6.js"])),"v-ac1176c8":r(()=>t(()=>import("./jsdoc-require-param.html-d89e024f.js"),["assets/jsdoc-require-param.html-d89e024f.js","assets/framework-9cabc8c6.js"])),"v-3fc487cb":r(()=>t(()=>import("./jsdoc-require-returns-check.html-615d731d.js"),["assets/jsdoc-require-returns-check.html-615d731d.js","assets/framework-9cabc8c6.js"])),"v-fb0bd0b6":r(()=>t(()=>import("./jsdoc-require-returns-type.html-2c17d3c8.js"),["assets/jsdoc-require-returns-type.html-2c17d3c8.js","assets/framework-9cabc8c6.js"])),"v-39f7a9a6":r(()=>t(()=>import("./jsdoc-require-returns.html-e6ca8500.js"),["assets/jsdoc-require-returns.html-e6ca8500.js","assets/framework-9cabc8c6.js"])),"v-6578a815":r(()=>t(()=>import("./jsdoc-tag-lines.html-82fc75ee.js"),["assets/jsdoc-tag-lines.html-82fc75ee.js","assets/framework-9cabc8c6.js"])),"v-5dc36739":r(()=>t(()=>import("./jsdoc-valid-types.html-21ba530b.js"),["assets/jsdoc-valid-types.html-21ba530b.js","assets/framework-9cabc8c6.js"])),"v-73a024ae":r(()=>t(()=>import("./key-spacing.html-ca56887c.js"),["assets/key-spacing.html-ca56887c.js","assets/framework-9cabc8c6.js"])),"v-6d2165da":r(()=>t(()=>import("./netsells-component-file-names.html-48e1af82.js"),["assets/netsells-component-file-names.html-48e1af82.js","assets/framework-9cabc8c6.js"])),"v-673c5452":r(()=>t(()=>import("./netsells-no-dom-listeners.html-a384d820.js"),["assets/netsells-no-dom-listeners.html-a384d820.js","assets/framework-9cabc8c6.js"])),"v-5febc12c":r(()=>t(()=>import("./netsells-no-global-timeouts.html-996eb601.js"),["assets/netsells-no-global-timeouts.html-996eb601.js","assets/framework-9cabc8c6.js"])),"v-324c9b3f":r(()=>t(()=>import("./no-alert.html-350a354c.js"),["assets/no-alert.html-350a354c.js","assets/framework-9cabc8c6.js"])),"v-1a75683e":r(()=>t(()=>import("./no-cond-assign.html-049cad07.js"),["assets/no-cond-assign.html-049cad07.js","assets/framework-9cabc8c6.js"])),"v-ec4208b8":r(()=>t(()=>import("./no-console.html-3c714945.js"),["assets/no-console.html-3c714945.js","assets/framework-9cabc8c6.js"])),"v-08b70fd6":r(()=>t(()=>import("./no-debugger.html-f20083a8.js"),["assets/no-debugger.html-f20083a8.js","assets/framework-9cabc8c6.js"])),"v-5bb8acef":r(()=>t(()=>import("./no-duplicate-imports.html-0d621e23.js"),["assets/no-duplicate-imports.html-0d621e23.js","assets/framework-9cabc8c6.js"])),"v-401183d7":r(()=>t(()=>import("./no-else-return.html-6024e23b.js"),["assets/no-else-return.html-6024e23b.js","assets/framework-9cabc8c6.js"])),"v-2112c102":r(()=>t(()=>import("./no-empty-function.html-94ced74e.js"),["assets/no-empty-function.html-94ced74e.js","assets/framework-9cabc8c6.js"])),"v-fe8f2424":r(()=>t(()=>import("./no-empty.html-3ceafb99.js"),["assets/no-empty.html-3ceafb99.js","assets/framework-9cabc8c6.js"])),"v-6f62d73b":r(()=>t(()=>import("./no-eval.html-eee1a6a9.js"),["assets/no-eval.html-eee1a6a9.js","assets/framework-9cabc8c6.js"])),"v-1d05670d":r(()=>t(()=>import("./no-floating-decimal.html-1fb18670.js"),["assets/no-floating-decimal.html-1fb18670.js","assets/framework-9cabc8c6.js"])),"v-4fabda95":r(()=>t(()=>import("./no-implicit-coercion.html-c5186c47.js"),["assets/no-implicit-coercion.html-c5186c47.js","assets/framework-9cabc8c6.js"])),"v-757de0d8":r(()=>t(()=>import("./no-lonely-if.html-b721b703.js"),["assets/no-lonely-if.html-b721b703.js","assets/framework-9cabc8c6.js"])),"v-25f99a4e":r(()=>t(()=>import("./no-mixed-spaces-and-tabs.html-bd3bdbc9.js"),["assets/no-mixed-spaces-and-tabs.html-bd3bdbc9.js","assets/framework-9cabc8c6.js"])),"v-0a8fc955":r(()=>t(()=>import("./no-multiple-empty-lines.html-a15e30aa.js"),["assets/no-multiple-empty-lines.html-a15e30aa.js","assets/framework-9cabc8c6.js"])),"v-6df18d5b":r(()=>t(()=>import("./no-restricted-imports.html-98e18549.js"),["assets/no-restricted-imports.html-98e18549.js","assets/framework-9cabc8c6.js"])),"v-e5052018":r(()=>t(()=>import("./no-sparse-arrays.html-35796dd5.js"),["assets/no-sparse-arrays.html-35796dd5.js","assets/framework-9cabc8c6.js"])),"v-2e009a9e":r(()=>t(()=>import("./no-template-curly-in-string.html-4c93972a.js"),["assets/no-template-curly-in-string.html-4c93972a.js","assets/framework-9cabc8c6.js"])),"v-6968233b":r(()=>t(()=>import("./no-unneeded-ternary.html-432c102b.js"),["assets/no-unneeded-ternary.html-432c102b.js","assets/framework-9cabc8c6.js"])),"v-098f63b8":r(()=>t(()=>import("./no-unused-vars.html-6b47b45b.js"),["assets/no-unused-vars.html-6b47b45b.js","assets/framework-9cabc8c6.js"])),"v-71e8bbf8":r(()=>t(()=>import("./no-use-before-define.html-b3915122.js"),["assets/no-use-before-define.html-b3915122.js","assets/framework-9cabc8c6.js"])),"v-4b44aefa":r(()=>t(()=>import("./no-useless-return.html-7dedf8eb.js"),["assets/no-useless-return.html-7dedf8eb.js","assets/framework-9cabc8c6.js"])),"v-e9582658":r(()=>t(()=>import("./no-var.html-d701e912.js"),["assets/no-var.html-d701e912.js","assets/framework-9cabc8c6.js"])),"v-098e8ca6":r(()=>t(()=>import("./operator-linebreak.html-538a256c.js"),["assets/operator-linebreak.html-538a256c.js","assets/framework-9cabc8c6.js"])),"v-651d76bd":r(()=>t(()=>import("./prefer-arrow-callback.html-9367faac.js"),["assets/prefer-arrow-callback.html-9367faac.js","assets/framework-9cabc8c6.js"])),"v-7bc232e9":r(()=>t(()=>import("./prefer-const.html-1ce73853.js"),["assets/prefer-const.html-1ce73853.js","assets/framework-9cabc8c6.js"])),"v-7197202c":r(()=>t(()=>import("./prefer-template.html-5c2e9201.js"),["assets/prefer-template.html-5c2e9201.js","assets/framework-9cabc8c6.js"])),"v-42eab5f8":r(()=>t(()=>import("./quotes.html-be050878.js"),["assets/quotes.html-be050878.js","assets/framework-9cabc8c6.js"])),"v-702dd356":r(()=>t(()=>import("./require-jsdoc-except-require-jsdoc.html-7d0418a3.js"),["assets/require-jsdoc-except-require-jsdoc.html-7d0418a3.js","assets/framework-9cabc8c6.js"])),"v-00d42fe1":r(()=>t(()=>import("./semi.html-5d6f2ce9.js"),["assets/semi.html-5d6f2ce9.js","assets/framework-9cabc8c6.js"])),"v-104c62f2":r(()=>t(()=>import("./space-before-function-paren.html-51981ad5.js"),["assets/space-before-function-paren.html-51981ad5.js","assets/framework-9cabc8c6.js"])),"v-009b1cdf":r(()=>t(()=>import("./template-curly-spacing.html-89eaf1cd.js"),["assets/template-curly-spacing.html-89eaf1cd.js","assets/framework-9cabc8c6.js"])),"v-3fd2ad10":r(()=>t(()=>import("./vue-attribute-hyphenation.html-956f0656.js"),["assets/vue-attribute-hyphenation.html-956f0656.js","assets/framework-9cabc8c6.js"])),"v-8009c03a":r(()=>t(()=>import("./vue-component-definition-name-casing.html-5f65586e.js"),["assets/vue-component-definition-name-casing.html-5f65586e.js","assets/framework-9cabc8c6.js"])),"v-e70076c0":r(()=>t(()=>import("./vue-component-name-in-template-casing.html-21ca3b5d.js"),["assets/vue-component-name-in-template-casing.html-21ca3b5d.js","assets/framework-9cabc8c6.js"])),"v-d9848c78":r(()=>t(()=>import("./vue-eqeqeq.html-05066f54.js"),["assets/vue-eqeqeq.html-05066f54.js","assets/framework-9cabc8c6.js"])),"v-fef2401a":r(()=>t(()=>import("./vue-html-closing-bracket-newline.html-19c38d7a.js"),["assets/vue-html-closing-bracket-newline.html-19c38d7a.js","assets/framework-9cabc8c6.js"])),"v-48f64ab8":r(()=>t(()=>import("./vue-html-closing-bracket-spacing.html-c4ef5e0d.js"),["assets/vue-html-closing-bracket-spacing.html-c4ef5e0d.js","assets/framework-9cabc8c6.js"])),"v-c62fa308":r(()=>t(()=>import("./vue-html-indent.html-e71a4782.js"),["assets/vue-html-indent.html-e71a4782.js","assets/framework-9cabc8c6.js"])),"v-ed3556de":r(()=>t(()=>import("./vue-html-quotes.html-e201df85.js"),["assets/vue-html-quotes.html-e201df85.js","assets/framework-9cabc8c6.js"])),"v-c7d7edd6":r(()=>t(()=>import("./vue-key-spacing.html-c60b2978.js"),["assets/vue-key-spacing.html-c60b2978.js","assets/framework-9cabc8c6.js"])),"v-418b9826":r(()=>t(()=>import("./vue-match-component-file-name.html-4f1aac7a.js"),["assets/vue-match-component-file-name.html-4f1aac7a.js","assets/framework-9cabc8c6.js"])),"v-92ab210e":r(()=>t(()=>import("./vue-max-attributes-per-line.html-a175fe55.js"),["assets/vue-max-attributes-per-line.html-a175fe55.js","assets/framework-9cabc8c6.js"])),"v-0fd42d33":r(()=>t(()=>import("./vue-mustache-interpolation-spacing.html-7dddc67c.js"),["assets/vue-mustache-interpolation-spacing.html-7dddc67c.js","assets/framework-9cabc8c6.js"])),"v-51dd6b4e":r(()=>t(()=>import("./vue-no-dupe-keys.html-2cc654c0.js"),["assets/vue-no-dupe-keys.html-2cc654c0.js","assets/framework-9cabc8c6.js"])),"v-26b7b885":r(()=>t(()=>import("./vue-no-duplicate-attributes.html-029dcc5d.js"),["assets/vue-no-duplicate-attributes.html-029dcc5d.js","assets/framework-9cabc8c6.js"])),"v-58303e9d":r(()=>t(()=>import("./vue-no-multi-spaces.html-f2ed204a.js"),["assets/vue-no-multi-spaces.html-f2ed204a.js","assets/framework-9cabc8c6.js"])),"v-7d626b1c":r(()=>t(()=>import("./vue-no-shared-component-data.html-98fded4d.js"),["assets/vue-no-shared-component-data.html-98fded4d.js","assets/framework-9cabc8c6.js"])),"v-326d9ab0":r(()=>t(()=>import("./vue-no-side-effects-in-computed-properties.html-75f3884b.js"),["assets/vue-no-side-effects-in-computed-properties.html-75f3884b.js","assets/framework-9cabc8c6.js"])),"v-e20f65ce":r(()=>t(()=>import("./vue-no-textarea-mustache.html-ec234dfa.js"),["assets/vue-no-textarea-mustache.html-ec234dfa.js","assets/framework-9cabc8c6.js"])),"v-dfe05c1e":r(()=>t(()=>import("./vue-no-unused-vars.html-a3efe710.js"),["assets/vue-no-unused-vars.html-a3efe710.js","assets/framework-9cabc8c6.js"])),"v-bc1f78c8":r(()=>t(()=>import("./vue-no-v-html.html-426dd143.js"),["assets/vue-no-v-html.html-426dd143.js","assets/framework-9cabc8c6.js"])),"v-733d32f3":r(()=>t(()=>import("./vue-object-curly-spacing.html-67764225.js"),["assets/vue-object-curly-spacing.html-67764225.js","assets/framework-9cabc8c6.js"])),"v-69464eaa":r(()=>t(()=>import("./vue-order-in-components.html-3261ae9f.js"),["assets/vue-order-in-components.html-3261ae9f.js","assets/framework-9cabc8c6.js"])),"v-55082d91":r(()=>t(()=>import("./vue-require-default-prop.html-2a435fdb.js"),["assets/vue-require-default-prop.html-2a435fdb.js","assets/framework-9cabc8c6.js"])),"v-201b7d31":r(()=>t(()=>import("./vue-require-prop-types.html-eadfc619.js"),["assets/vue-require-prop-types.html-eadfc619.js","assets/framework-9cabc8c6.js"])),"v-2dd246c0":r(()=>t(()=>import("./vue-return-in-computed-property.html-f33242a9.js"),["assets/vue-return-in-computed-property.html-f33242a9.js","assets/framework-9cabc8c6.js"])),"v-7470e148":r(()=>t(()=>import("./vue-script-indent.html-493ce01a.js"),["assets/vue-script-indent.html-493ce01a.js","assets/framework-9cabc8c6.js"])),"v-f3290416":r(()=>t(()=>import("./vue-this-in-template.html-cb48c0c9.js"),["assets/vue-this-in-template.html-cb48c0c9.js","assets/framework-9cabc8c6.js"])),"v-1d166a30":r(()=>t(()=>import("./vue-v-bind-style.html-9bbfde3b.js"),["assets/vue-v-bind-style.html-9bbfde3b.js","assets/framework-9cabc8c6.js"])),"v-f09e31e8":r(()=>t(()=>import("./vue-v-on-function-call.html-140649ea.js"),["assets/vue-v-on-function-call.html-140649ea.js","assets/framework-9cabc8c6.js"])),"v-2859dd4e":r(()=>t(()=>import("./vue-v-on-style.html-990c47f1.js"),["assets/vue-v-on-style.html-990c47f1.js","assets/framework-9cabc8c6.js"])),"v-5da202a1":r(()=>t(()=>import("./vuejs-accessibility-alt-text.html-1b01666b.js"),["assets/vuejs-accessibility-alt-text.html-1b01666b.js","assets/framework-9cabc8c6.js"])),"v-deaa79b8":r(()=>t(()=>import("./vuejs-accessibility-anchor-has-content.html-296cac4c.js"),["assets/vuejs-accessibility-anchor-has-content.html-296cac4c.js","assets/framework-9cabc8c6.js"])),"v-7dd0c466":r(()=>t(()=>import("./vuejs-accessibility-aria-props.html-fe1e3b0f.js"),["assets/vuejs-accessibility-aria-props.html-fe1e3b0f.js","assets/framework-9cabc8c6.js"])),"v-a9b540f4":r(()=>t(()=>import("./vuejs-accessibility-aria-role.html-7aca7bd5.js"),["assets/vuejs-accessibility-aria-role.html-7aca7bd5.js","assets/framework-9cabc8c6.js"])),"v-c11397e6":r(()=>t(()=>import("./vuejs-accessibility-aria-unsupported-elements.html-1057b68d.js"),["assets/vuejs-accessibility-aria-unsupported-elements.html-1057b68d.js","assets/framework-9cabc8c6.js"])),"v-b6cb7116":r(()=>t(()=>import("./vuejs-accessibility-click-events-have-key-events.html-8f58ff22.js"),["assets/vuejs-accessibility-click-events-have-key-events.html-8f58ff22.js","assets/framework-9cabc8c6.js"])),"v-663e674a":r(()=>t(()=>import("./vuejs-accessibility-form-control-has-label.html-9a163497.js"),["assets/vuejs-accessibility-form-control-has-label.html-9a163497.js","assets/framework-9cabc8c6.js"])),"v-3353c5b6":r(()=>t(()=>import("./vuejs-accessibility-heading-has-content.html-c84ca3b9.js"),["assets/vuejs-accessibility-heading-has-content.html-c84ca3b9.js","assets/framework-9cabc8c6.js"])),"v-1f40a5d6":r(()=>t(()=>import("./vuejs-accessibility-iframe-has-title.html-cb3463e1.js"),["assets/vuejs-accessibility-iframe-has-title.html-cb3463e1.js","assets/framework-9cabc8c6.js"])),"v-2ea82790":r(()=>t(()=>import("./vuejs-accessibility-interactive-supports-focus.html-2172420f.js"),["assets/vuejs-accessibility-interactive-supports-focus.html-2172420f.js","assets/framework-9cabc8c6.js"])),"v-356d2112":r(()=>t(()=>import("./vuejs-accessibility-mouse-events-have-key-events.html-01dff7c3.js"),["assets/vuejs-accessibility-mouse-events-have-key-events.html-01dff7c3.js","assets/framework-9cabc8c6.js"])),"v-658bedbe":r(()=>t(()=>import("./vuejs-accessibility-no-access-key.html-b2fe0945.js"),["assets/vuejs-accessibility-no-access-key.html-b2fe0945.js","assets/framework-9cabc8c6.js"])),"v-37f858f5":r(()=>t(()=>import("./vuejs-accessibility-no-autofocus.html-d46917cc.js"),["assets/vuejs-accessibility-no-autofocus.html-d46917cc.js","assets/framework-9cabc8c6.js"])),"v-9914faa8":r(()=>t(()=>import("./vuejs-accessibility-no-distracting-elements.html-c5247a7d.js"),["assets/vuejs-accessibility-no-distracting-elements.html-c5247a7d.js","assets/framework-9cabc8c6.js"])),"v-e775df76":r(()=>t(()=>import("./vuejs-accessibility-no-onchange.html-0c445ede.js"),["assets/vuejs-accessibility-no-onchange.html-0c445ede.js","assets/framework-9cabc8c6.js"])),"v-3092d461":r(()=>t(()=>import("./vuejs-accessibility-no-redundant-roles.html-6e807f82.js"),["assets/vuejs-accessibility-no-redundant-roles.html-6e807f82.js","assets/framework-9cabc8c6.js"])),"v-3a9db3c2":r(()=>t(()=>import("./vuejs-accessibility-role-has-required-aria-props.html-78fcadca.js"),["assets/vuejs-accessibility-role-has-required-aria-props.html-78fcadca.js","assets/framework-9cabc8c6.js"])),"v-af372d46":r(()=>t(()=>import("./vuejs-accessibility-tabindex-no-positive.html-1d0ed763.js"),["assets/vuejs-accessibility-tabindex-no-positive.html-1d0ed763.js","assets/framework-9cabc8c6.js"])),"v-c1089f48":r(()=>t(()=>import("./yoda.html-52e4bd0d.js"),["assets/yoda.html-52e4bd0d.js","assets/framework-9cabc8c6.js"])),"v-3706649a":r(()=>t(()=>import("./404.html-5191af78.js"),["assets/404.html-5191af78.js","assets/framework-9cabc8c6.js"]))};var Nn=Symbol(""),zn=z(Cn),$t=Dt({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),de=z($t),ve=()=>de,Ct=Symbol(""),oe=()=>{const e=ae(Ct);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},qt=Symbol(""),Hn=()=>{const e=ae(qt);if(!e)throw new Error("usePageHead() is called without provider.");return e},Mn=Symbol(""),Nt=Symbol(""),Bn=()=>{const e=ae(Nt);if(!e)throw new Error("usePageLang() is called without provider.");return e},zt=Symbol(""),Fn=()=>{const e=ae(zt);if(!e)throw new Error("usePageLayout() is called without provider.");return e},Ye=Symbol(""),$e=()=>{const e=ae(Ye);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},Ee=z(qn),Wn=()=>Ee,Ht=Symbol(""),Je=()=>{const e=ae(Ht);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},Un=Symbol(""),Gn="Layout",Kn="NotFound",ie=hn({resolveLayouts:e=>e.reduce((n,i)=>({...n,...i.layouts}),{}),resolvePageData:async e=>{const n=zn.value[e];return await(n==null?void 0:n())??$t},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,n,i)=>{const o=ne(n.description)?n.description:i.description,l=[...xe(n.head)?n.head:[],...i.head,["title",{},e],["meta",{name:"description",content:o}]];return gn(l)},resolvePageHeadTitle:(e,n)=>[e.title,n.title].filter(i=>!!i).join(" | "),resolvePageLang:e=>e.lang||"en",resolvePageLayout:(e,n)=>{let i;if(e.path){const o=e.frontmatter.layout;ne(o)?i=o:i=Gn}else i=Kn;return n[i]},resolveRouteLocale:(e,n)=>Rt(e,n),resolveSiteLocaleData:(e,n)=>({...e,...e.locales[n]})}),Ze=k({name:"ClientOnly",setup(e,n){const i=z(!1);return te(()=>{i.value=!0}),()=>{var o,l;return i.value?(l=(o=n.slots).default)==null?void 0:l.call(o):null}}}),Qn=k({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const n=ve(),i=g(()=>xt[e.pageKey||n.value.key]);return()=>i.value?$(i.value):$("div","404 Not Found")}}),pe=(e={})=>e,Xe=e=>Pe(e)?e:`/code-standards/${Vt(e)}`;function Mt(e,n,i){var o,l,s;n===void 0&&(n=50),i===void 0&&(i={});var d=(o=i.isImmediate)!=null&&o,a=(l=i.callback)!=null&&l,c=i.maxWait,v=Date.now(),_=[];function f(){if(c!==void 0){var E=Date.now()-v;if(E+n>=c)return c-E}return n}var h=function(){var E=[].slice.call(arguments),y=this;return new Promise(function(A,L){var D=d&&s===void 0;if(s!==void 0&&clearTimeout(s),s=setTimeout(function(){if(s=void 0,v=Date.now(),!d){var x=e.apply(y,E);a&&a(x),_.forEach(function(Y){return(0,Y.resolve)(x)}),_=[]}},f()),D){var H=e.apply(y,E);return a&&a(H),A(H)}_.push({resolve:A,reject:L})})};return h.cancel=function(E){s!==void 0&&clearTimeout(s),_.forEach(function(y){return(0,y.reject)(E)}),_=[]},h}const Yn=({headerLinkSelector:e,headerAnchorSelector:n,delay:i,offset:o=5})=>{const l=ye(),d=Mt(()=>{var A,L;const a=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(a-0)h.some(H=>H.hash===D.hash));for(let D=0;D=(((A=H.parentElement)==null?void 0:A.offsetTop)??0)-o,J=!x||a<(((L=x.parentElement)==null?void 0:L.offsetTop)??0)-o;if(!(Y&&J))continue;const O=decodeURIComponent(l.currentRoute.value.hash),u=decodeURIComponent(H.hash);if(O===u)return;if(f){for(let S=D+1;S{window.addEventListener("scroll",d)}),kt(()=>{window.removeEventListener("scroll",d)})},st=async(e,n)=>{const{scrollBehavior:i}=e.options;e.options.scrollBehavior=void 0,await e.replace({query:e.currentRoute.value.query,hash:n,force:!0}).finally(()=>e.options.scrollBehavior=i)},Jn="a.sidebar-item",Zn=".header-anchor",Xn=300,ei=5,ti=pe({setup(){Yn({headerLinkSelector:Jn,headerAnchorSelector:Zn,delay:Xn,offset:ei})}}),dt=()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,ni=()=>window.scrollTo({top:0,behavior:"smooth"});const ii=k({name:"BackToTop",setup(){const e=z(0),n=g(()=>e.value>300),i=Mt(()=>{e.value=dt()},100);te(()=>{e.value=dt(),window.addEventListener("scroll",()=>i())});const o=$("div",{class:"back-to-top",onClick:ni});return()=>$(We,{name:"back-to-top"},()=>n.value?o:null)}}),oi=pe({rootComponents:[ii]});const ri=$("svg",{class:"external-link-icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},[$("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}),$("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"})]),li=k({name:"ExternalLinkIcon",props:{locales:{type:Object,required:!1,default:()=>({})}},setup(e){const n=$e(),i=g(()=>e.locales[n.value]??{openInNewWindow:"open in new window"});return()=>$("span",[ri,$("span",{class:"external-link-icon-sr-only"},i.value.openInNewWindow)])}}),ai={"/":{openInNewWindow:"open in new window"}},si=pe({enhance({app:e}){e.component("ExternalLinkIcon",$(li,{locales:ai}))}});/*! medium-zoom 1.0.8 | MIT License | https://github.com/francoischalifour/medium-zoom */var _e=Object.assign||function(e){for(var n=1;n1&&arguments[1]!==void 0?arguments[1]:{},o=window.Promise||function(T){function P(){}T(P,P)},l=function(T){var P=T.target;if(P===S){y();return}x.indexOf(P)!==-1&&A({target:P})},s=function(){if(!(J||!u.original)){var T=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(ue-T)>O.scrollOffset&&setTimeout(y,150)}},d=function(T){var P=T.key||T.keyCode;(P==="Escape"||P==="Esc"||P===27)&&y()},a=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},P=T;if(T.background&&(S.style.background=T.background),T.container&&T.container instanceof Object&&(P.container=_e({},O.container,T.container)),T.template){var q=Ve(T.template)?T.template:document.querySelector(T.template);P.template=q}return O=_e({},O,P),x.forEach(function(B){B.dispatchEvent(ge("medium-zoom:update",{detail:{zoom:w}}))}),w},c=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return e(_e({},O,T))},v=function(){for(var T=arguments.length,P=Array(T),q=0;q0?P.reduce(function(I,K){return[].concat(I,ut(K))},[]):x;return B.forEach(function(I){I.classList.remove("medium-zoom-image"),I.dispatchEvent(ge("medium-zoom:detach",{detail:{zoom:w}}))}),x=x.filter(function(I){return B.indexOf(I)===-1}),w},f=function(T,P){var q=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return x.forEach(function(B){B.addEventListener("medium-zoom:"+T,P,q)}),Y.push({type:"medium-zoom:"+T,listener:P,options:q}),w},h=function(T,P){var q=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return x.forEach(function(B){B.removeEventListener("medium-zoom:"+T,P,q)}),Y=Y.filter(function(B){return!(B.type==="medium-zoom:"+T&&B.listener.toString()===P.toString())}),w},E=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},P=T.target,q=function(){var I={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},K=void 0,X=void 0;if(O.container)if(O.container instanceof Object)I=_e({},I,O.container),K=I.width-I.left-I.right-O.margin*2,X=I.height-I.top-I.bottom-O.margin*2;else{var he=Ve(O.container)?O.container:document.querySelector(O.container),se=he.getBoundingClientRect(),Ce=se.width,ln=se.height,an=se.left,sn=se.top;I=_e({},I,{width:Ce,height:ln,left:an,top:sn})}K=K||I.width-O.margin*2,X=X||I.height-O.margin*2;var Le=u.zoomedHd||u.original,dn=ct(Le)?K:Le.naturalWidth||K,cn=ct(Le)?X:Le.naturalHeight||X,Ae=Le.getBoundingClientRect(),un=Ae.top,_n=Ae.left,qe=Ae.width,Ne=Ae.height,vn=Math.min(Math.max(qe,dn),K)/qe,mn=Math.min(Math.max(Ne,cn),X)/Ne,ze=Math.min(vn,mn),fn=(-_n+(K-qe)/2+O.margin+I.left)/ze,pn=(-un+(X-Ne)/2+O.margin+I.top)/ze,rt="scale("+ze+") translate3d("+fn+"px, "+pn+"px, 0)";u.zoomed.style.transform=rt,u.zoomedHd&&(u.zoomedHd.style.transform=rt)};return new o(function(B){if(P&&x.indexOf(P)===-1){B(w);return}var I=function Ce(){J=!1,u.zoomed.removeEventListener("transitionend",Ce),u.original.dispatchEvent(ge("medium-zoom:opened",{detail:{zoom:w}})),B(w)};if(u.zoomed){B(w);return}if(P)u.original=P;else if(x.length>0){var K=x;u.original=K[0]}else{B(w);return}if(u.original.dispatchEvent(ge("medium-zoom:open",{detail:{zoom:w}})),ue=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,J=!0,u.zoomed=ui(u.original),document.body.appendChild(S),O.template){var X=Ve(O.template)?O.template:document.querySelector(O.template);u.template=document.createElement("div"),u.template.appendChild(X.content.cloneNode(!0)),document.body.appendChild(u.template)}if(u.original.parentElement&&u.original.parentElement.tagName==="PICTURE"&&u.original.currentSrc&&(u.zoomed.src=u.original.currentSrc),document.body.appendChild(u.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),u.original.classList.add("medium-zoom-image--hidden"),u.zoomed.classList.add("medium-zoom-image--opened"),u.zoomed.addEventListener("click",y),u.zoomed.addEventListener("transitionend",I),u.original.getAttribute("data-zoom-src")){u.zoomedHd=u.zoomed.cloneNode(),u.zoomedHd.removeAttribute("srcset"),u.zoomedHd.removeAttribute("sizes"),u.zoomedHd.removeAttribute("loading"),u.zoomedHd.src=u.zoomed.getAttribute("data-zoom-src"),u.zoomedHd.onerror=function(){clearInterval(he),console.warn("Unable to reach the zoom image target "+u.zoomedHd.src),u.zoomedHd=null,q()};var he=setInterval(function(){u.zoomedHd.complete&&(clearInterval(he),u.zoomedHd.classList.add("medium-zoom-image--opened"),u.zoomedHd.addEventListener("click",y),document.body.appendChild(u.zoomedHd),q())},10)}else if(u.original.hasAttribute("srcset")){u.zoomedHd=u.zoomed.cloneNode(),u.zoomedHd.removeAttribute("sizes"),u.zoomedHd.removeAttribute("loading");var se=u.zoomedHd.addEventListener("load",function(){u.zoomedHd.removeEventListener("load",se),u.zoomedHd.classList.add("medium-zoom-image--opened"),u.zoomedHd.addEventListener("click",y),document.body.appendChild(u.zoomedHd),q()})}else q()})},y=function(){return new o(function(T){if(J||!u.original){T(w);return}var P=function q(){u.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(u.zoomed),u.zoomedHd&&document.body.removeChild(u.zoomedHd),document.body.removeChild(S),u.zoomed.classList.remove("medium-zoom-image--opened"),u.template&&document.body.removeChild(u.template),J=!1,u.zoomed.removeEventListener("transitionend",q),u.original.dispatchEvent(ge("medium-zoom:closed",{detail:{zoom:w}})),u.original=null,u.zoomed=null,u.zoomedHd=null,u.template=null,T(w)};J=!0,document.body.classList.remove("medium-zoom--opened"),u.zoomed.style.transform="",u.zoomedHd&&(u.zoomedHd.style.transform=""),u.template&&(u.template.style.transition="opacity 150ms",u.template.style.opacity=0),u.original.dispatchEvent(ge("medium-zoom:close",{detail:{zoom:w}})),u.zoomed.addEventListener("transitionend",P)})},A=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},P=T.target;return u.original?y():E({target:P})},L=function(){return O},D=function(){return x},H=function(){return u.original},x=[],Y=[],J=!1,ue=0,O=i,u={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(n)==="[object Object]"?O=n:(n||typeof n=="string")&&v(n),O=_e({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},O);var S=ci(O.background);document.addEventListener("click",l),document.addEventListener("keyup",d),document.addEventListener("scroll",s),window.addEventListener("resize",y);var w={open:E,close:y,toggle:A,update:a,clone:c,attach:v,detach:_,on:f,off:h,getOptions:L,getImages:D,getZoomedImage:H};return w};function vi(e,n){n===void 0&&(n={});var i=n.insertAt;if(!(!e||typeof document>"u")){var o=document.head||document.getElementsByTagName("head")[0],l=document.createElement("style");l.type="text/css",i==="top"&&o.firstChild?o.insertBefore(l,o.firstChild):o.appendChild(l),l.styleSheet?l.styleSheet.cssText=e:l.appendChild(document.createTextNode(e))}}var mi=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";vi(mi);const fi=_i,pi=Symbol("mediumZoom");const hi=".theme-default-content > img, .theme-default-content :not(a) > img",gi={},Ei=300,bi=pe({enhance({app:e,router:n}){const i=fi(gi);i.refresh=(o=hi)=>{i.detach(),i.attach(o)},e.provide(pi,i),n.afterEach(()=>{setTimeout(()=>i.refresh(),Ei)})}});/** * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress diff --git a/assets/architecture.html-3ec492d5.js b/assets/architecture.html-1cb869df.js similarity index 90% rename from assets/architecture.html-3ec492d5.js rename to assets/architecture.html-1cb869df.js index 1843f6d63b..cc651d983c 100644 --- a/assets/architecture.html-3ec492d5.js +++ b/assets/architecture.html-1cb869df.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-2628fc2c","path":"/flutter/legacy/architecture.html","title":"Architecture Layers","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"🥞 Layer Definitions","slug":"🥞-layer-definitions","link":"#🥞-layer-definitions","children":[{"level":3,"title":"✨ Presentation Layer","slug":"✨-presentation-layer","link":"#✨-presentation-layer","children":[]},{"level":3,"title":"🤖 Application Layer","slug":"🤖-application-layer","link":"#🤖-application-layer","children":[]},{"level":3,"title":"💭 Domain Layer","slug":"💭-domain-layer","link":"#💭-domain-layer","children":[]},{"level":3,"title":"🗄 Infrastructure Layer","slug":"🗄-infrastructure-layer","link":"#🗄-infrastructure-layer","children":[]}]},{"level":2,"title":"💉 Dependency Injection","slug":"💉-dependency-injection","link":"#💉-dependency-injection","children":[]},{"level":2,"title":"📂 Directory Structure","slug":"📂-directory-structure","link":"#📂-directory-structure","children":[]},{"level":2,"title":"🏛 Architecture Best Practices","slug":"🏛-architecture-best-practices","link":"#🏛-architecture-best-practices","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/legacy/architecture.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-2628fc2c","path":"/flutter/legacy/architecture.html","title":"Architecture Layers","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"🥞 Layer Definitions","slug":"🥞-layer-definitions","link":"#🥞-layer-definitions","children":[{"level":3,"title":"✨ Presentation Layer","slug":"✨-presentation-layer","link":"#✨-presentation-layer","children":[]},{"level":3,"title":"🤖 Application Layer","slug":"🤖-application-layer","link":"#🤖-application-layer","children":[]},{"level":3,"title":"💭 Domain Layer","slug":"💭-domain-layer","link":"#💭-domain-layer","children":[]},{"level":3,"title":"🗄 Infrastructure Layer","slug":"🗄-infrastructure-layer","link":"#🗄-infrastructure-layer","children":[]}]},{"level":2,"title":"💉 Dependency Injection","slug":"💉-dependency-injection","link":"#💉-dependency-injection","children":[]},{"level":2,"title":"📂 Directory Structure","slug":"📂-directory-structure","link":"#📂-directory-structure","children":[]},{"level":2,"title":"🏛 Architecture Best Practices","slug":"🏛-architecture-best-practices","link":"#🏛-architecture-best-practices","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/legacy/architecture.md"}');export{e as data}; diff --git a/assets/architecture.html-4d591889.js b/assets/architecture.html-41a12d9c.js similarity index 93% rename from assets/architecture.html-4d591889.js rename to assets/architecture.html-41a12d9c.js index c9017cc079..16a201f031 100644 --- a/assets/architecture.html-4d591889.js +++ b/assets/architecture.html-41a12d9c.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-6312ceea","path":"/ios/architecture.html","title":"Architecture Layers","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Layer Definitions","slug":"layer-definitions","link":"#layer-definitions","children":[{"level":3,"title":"Data","slug":"data","link":"#data","children":[]},{"level":3,"title":"Domain","slug":"domain","link":"#domain","children":[]},{"level":3,"title":"Presentation","slug":"presentation","link":"#presentation","children":[]},{"level":3,"title":"Service","slug":"service","link":"#service","children":[]}]},{"level":2,"title":"Directory Structure","slug":"directory-structure","link":"#directory-structure","children":[]},{"level":2,"title":"Architecture Best Practices","slug":"architecture-best-practices","link":"#architecture-best-practices","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/architecture.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-6312ceea","path":"/ios/architecture.html","title":"Architecture Layers","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Layer Definitions","slug":"layer-definitions","link":"#layer-definitions","children":[{"level":3,"title":"Data","slug":"data","link":"#data","children":[]},{"level":3,"title":"Domain","slug":"domain","link":"#domain","children":[]},{"level":3,"title":"Presentation","slug":"presentation","link":"#presentation","children":[]},{"level":3,"title":"Service","slug":"service","link":"#service","children":[]}]},{"level":2,"title":"Directory Structure","slug":"directory-structure","link":"#directory-structure","children":[]},{"level":2,"title":"Architecture Best Practices","slug":"architecture-best-practices","link":"#architecture-best-practices","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/architecture.md"}');export{e as data}; diff --git a/assets/automated-workflows.html-79aba81f.js b/assets/automated-workflows.html-a45a4ff6.js similarity index 90% rename from assets/automated-workflows.html-79aba81f.js rename to assets/automated-workflows.html-a45a4ff6.js index b0fb75b492..caa8bb0dfe 100644 --- a/assets/automated-workflows.html-79aba81f.js +++ b/assets/automated-workflows.html-a45a4ff6.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-14e18006","path":"/frontend/automated-workflows.html","title":"Automated Workflows","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Linting","slug":"linting","link":"#linting","children":[]},{"level":2,"title":"Visual Regression Testing","slug":"visual-regression-testing","link":"#visual-regression-testing","children":[]},{"level":2,"title":"Tests","slug":"tests","link":"#tests","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/automated-workflows.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-14e18006","path":"/frontend/automated-workflows.html","title":"Automated Workflows","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Linting","slug":"linting","link":"#linting","children":[]},{"level":2,"title":"Visual Regression Testing","slug":"visual-regression-testing","link":"#visual-regression-testing","children":[]},{"level":2,"title":"Tests","slug":"tests","link":"#tests","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/automated-workflows.md"}');export{e as data}; diff --git a/assets/bundler.html-edf63831.js b/assets/bundler.html-ac28642f.js similarity index 88% rename from assets/bundler.html-edf63831.js rename to assets/bundler.html-ac28642f.js index c4debd9b67..4698110be2 100644 --- a/assets/bundler.html-edf63831.js +++ b/assets/bundler.html-ac28642f.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-41cdb664","path":"/ios/bundler.html","title":"Bundler","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Getting Started With Bundler","slug":"getting-started-with-bundler","link":"#getting-started-with-bundler","children":[]},{"level":2,"title":"Using Bundler","slug":"using-bundler","link":"#using-bundler","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/bundler.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-41cdb664","path":"/ios/bundler.html","title":"Bundler","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Getting Started With Bundler","slug":"getting-started-with-bundler","link":"#getting-started-with-bundler","children":[]},{"level":2,"title":"Using Bundler","slug":"using-bundler","link":"#using-bundler","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/bundler.md"}');export{e as data}; diff --git a/assets/c-sharp.html-be6d9062.js b/assets/c-sharp.html-017816ce.js similarity index 91% rename from assets/c-sharp.html-be6d9062.js rename to assets/c-sharp.html-017816ce.js index 8a765a7f88..f969dcc824 100644 --- a/assets/c-sharp.html-be6d9062.js +++ b/assets/c-sharp.html-017816ce.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-565ee9db","path":"/dotNet/c-sharp.html","title":"C#","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Naming Conventions","slug":"naming-conventions","link":"#naming-conventions","children":[]},{"level":2,"title":"Layout","slug":"layout","link":"#layout","children":[]},{"level":2,"title":"Naming","slug":"naming","link":"#naming","children":[]},{"level":2,"title":"Commenting","slug":"commenting","link":"#commenting","children":[]},{"level":2,"title":"Data Types","slug":"data-types","link":"#data-types","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"dotNet/c-sharp.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-565ee9db","path":"/dotNet/c-sharp.html","title":"C#","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Naming Conventions","slug":"naming-conventions","link":"#naming-conventions","children":[]},{"level":2,"title":"Layout","slug":"layout","link":"#layout","children":[]},{"level":2,"title":"Naming","slug":"naming","link":"#naming","children":[]},{"level":2,"title":"Commenting","slug":"commenting","link":"#commenting","children":[]},{"level":2,"title":"Data Types","slug":"data-types","link":"#data-types","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"dotNet/c-sharp.md"}');export{e as data}; diff --git a/assets/cheat-sheet.html-a226773f.js b/assets/cheat-sheet.html-1b7cce3b.js similarity index 97% rename from assets/cheat-sheet.html-a226773f.js rename to assets/cheat-sheet.html-1b7cce3b.js index c326e6b457..9430501fbe 100644 --- a/assets/cheat-sheet.html-a226773f.js +++ b/assets/cheat-sheet.html-1b7cce3b.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-2a442892","path":"/frontend/testing/cheat-sheet.html","title":"Cheatsheet","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Dynamic classes are applied correctly","slug":"dynamic-classes-are-applied-correctly","link":"#dynamic-classes-are-applied-correctly","children":[]},{"level":2,"title":"Test that a component renders","slug":"test-that-a-component-renders","link":"#test-that-a-component-renders","children":[{"level":3,"title":"A component renders by default","slug":"a-component-renders-by-default","link":"#a-component-renders-by-default","children":[]},{"level":3,"title":"A component renders when an action takes place","slug":"a-component-renders-when-an-action-takes-place","link":"#a-component-renders-when-an-action-takes-place","children":[]},{"level":3,"title":"Test that a component receives the correct props","slug":"test-that-a-component-receives-the-correct-props","link":"#test-that-a-component-receives-the-correct-props","children":[]}]},{"level":2,"title":"Testing component events","slug":"testing-component-events","link":"#testing-component-events","children":[{"level":3,"title":"When a component emits an event it is handled appropriately","slug":"when-a-component-emits-an-event-it-is-handled-appropriately","link":"#when-a-component-emits-an-event-it-is-handled-appropriately","children":[]}]},{"level":2,"title":"Testing store actions/mutations","slug":"testing-store-actions-mutations","link":"#testing-store-actions-mutations","children":[{"level":3,"title":"An action/mutation is called","slug":"an-action-mutation-is-called","link":"#an-action-mutation-is-called","children":[]},{"level":3,"title":"An action/mutation is called with the right data","slug":"an-action-mutation-is-called-with-the-right-data","link":"#an-action-mutation-is-called-with-the-right-data","children":[]},{"level":3,"title":"Mocking the response of an action/mutation","slug":"mocking-the-response-of-an-action-mutation","link":"#mocking-the-response-of-an-action-mutation","children":[]},{"level":3,"title":"Delaying the response of an action/mutation","slug":"delaying-the-response-of-an-action-mutation","link":"#delaying-the-response-of-an-action-mutation","children":[]},{"level":3,"title":"Mocking an error response of an action","slug":"mocking-an-error-response-of-an-action","link":"#mocking-an-error-response-of-an-action","children":[]}]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/testing/cheat-sheet.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-2a442892","path":"/frontend/testing/cheat-sheet.html","title":"Cheatsheet","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Dynamic classes are applied correctly","slug":"dynamic-classes-are-applied-correctly","link":"#dynamic-classes-are-applied-correctly","children":[]},{"level":2,"title":"Test that a component renders","slug":"test-that-a-component-renders","link":"#test-that-a-component-renders","children":[{"level":3,"title":"A component renders by default","slug":"a-component-renders-by-default","link":"#a-component-renders-by-default","children":[]},{"level":3,"title":"A component renders when an action takes place","slug":"a-component-renders-when-an-action-takes-place","link":"#a-component-renders-when-an-action-takes-place","children":[]},{"level":3,"title":"Test that a component receives the correct props","slug":"test-that-a-component-receives-the-correct-props","link":"#test-that-a-component-receives-the-correct-props","children":[]}]},{"level":2,"title":"Testing component events","slug":"testing-component-events","link":"#testing-component-events","children":[{"level":3,"title":"When a component emits an event it is handled appropriately","slug":"when-a-component-emits-an-event-it-is-handled-appropriately","link":"#when-a-component-emits-an-event-it-is-handled-appropriately","children":[]}]},{"level":2,"title":"Testing store actions/mutations","slug":"testing-store-actions-mutations","link":"#testing-store-actions-mutations","children":[{"level":3,"title":"An action/mutation is called","slug":"an-action-mutation-is-called","link":"#an-action-mutation-is-called","children":[]},{"level":3,"title":"An action/mutation is called with the right data","slug":"an-action-mutation-is-called-with-the-right-data","link":"#an-action-mutation-is-called-with-the-right-data","children":[]},{"level":3,"title":"Mocking the response of an action/mutation","slug":"mocking-the-response-of-an-action-mutation","link":"#mocking-the-response-of-an-action-mutation","children":[]},{"level":3,"title":"Delaying the response of an action/mutation","slug":"delaying-the-response-of-an-action-mutation","link":"#delaying-the-response-of-an-action-mutation","children":[]},{"level":3,"title":"Mocking an error response of an action","slug":"mocking-an-error-response-of-an-action","link":"#mocking-an-error-response-of-an-action","children":[]}]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/testing/cheat-sheet.md"}');export{e as data}; diff --git a/assets/clean-architecture.html-72d2ea41.js b/assets/clean-architecture.html-0a43515d.js similarity index 90% rename from assets/clean-architecture.html-72d2ea41.js rename to assets/clean-architecture.html-0a43515d.js index f079444695..a6fbeb205d 100644 --- a/assets/clean-architecture.html-72d2ea41.js +++ b/assets/clean-architecture.html-0a43515d.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-466569ae","path":"/android/clean-architecture.html","title":"Clean Architecture","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Domain Layer","slug":"domain-layer","link":"#domain-layer","children":[]},{"level":2,"title":"Data layer","slug":"data-layer","link":"#data-layer","children":[]},{"level":2,"title":"Presentation layer","slug":"presentation-layer","link":"#presentation-layer","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/clean-architecture.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-466569ae","path":"/android/clean-architecture.html","title":"Clean Architecture","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Domain Layer","slug":"domain-layer","link":"#domain-layer","children":[]},{"level":2,"title":"Data layer","slug":"data-layer","link":"#data-layer","children":[]},{"level":2,"title":"Presentation layer","slug":"presentation-layer","link":"#presentation-layer","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/clean-architecture.md"}');export{e as data}; diff --git a/assets/code-style.html-a4cb7401.js b/assets/code-style.html-ec60c8be.js similarity index 88% rename from assets/code-style.html-a4cb7401.js rename to assets/code-style.html-ec60c8be.js index 88f2c8dc3e..cf51cef120 100644 --- a/assets/code-style.html-a4cb7401.js +++ b/assets/code-style.html-ec60c8be.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-0f9a8a22","path":"/android/code-style.html","title":"Code Style","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Kotlin","slug":"kotlin","link":"#kotlin","children":[]},{"level":2,"title":"Java","slug":"java","link":"#java","children":[]},{"level":2,"title":"Enforcement","slug":"enforcement","link":"#enforcement","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/code-style.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-0f9a8a22","path":"/android/code-style.html","title":"Code Style","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Kotlin","slug":"kotlin","link":"#kotlin","children":[]},{"level":2,"title":"Java","slug":"java","link":"#java","children":[]},{"level":2,"title":"Enforcement","slug":"enforcement","link":"#enforcement","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/code-style.md"}');export{e as data}; diff --git a/assets/codesigning.html-c4c0e97f.js b/assets/codesigning.html-e1789a81.js similarity index 80% rename from assets/codesigning.html-c4c0e97f.js rename to assets/codesigning.html-e1789a81.js index 88af358e51..452339fe97 100644 --- a/assets/codesigning.html-c4c0e97f.js +++ b/assets/codesigning.html-e1789a81.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-8f9aa8c8","path":"/ios/codesigning.html","title":"Codesigning","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/codesigning.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-8f9aa8c8","path":"/ios/codesigning.html","title":"Codesigning","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/codesigning.md"}');export{e as data}; diff --git a/assets/codesigning.html-5d539206.js b/assets/codesigning.html-f30b74fd.js similarity index 80% rename from assets/codesigning.html-5d539206.js rename to assets/codesigning.html-f30b74fd.js index 1a209deba2..b81644e0c9 100644 --- a/assets/codesigning.html-5d539206.js +++ b/assets/codesigning.html-f30b74fd.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-02d166ed","path":"/flutter/codesigning.html","title":"Codesigning","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/codesigning.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-02d166ed","path":"/flutter/codesigning.html","title":"Codesigning","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/codesigning.md"}');export{e as data}; diff --git a/assets/continuous-delivery.html-ef265d04.js b/assets/continuous-delivery.html-0b67867a.js similarity index 82% rename from assets/continuous-delivery.html-ef265d04.js rename to assets/continuous-delivery.html-0b67867a.js index 1c8acedbd3..3a4de81897 100644 --- a/assets/continuous-delivery.html-ef265d04.js +++ b/assets/continuous-delivery.html-0b67867a.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-3e9b8cb3","path":"/flutter/continuous-delivery.html","title":"Continuous Delivery","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/continuous-delivery.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-3e9b8cb3","path":"/flutter/continuous-delivery.html","title":"Continuous Delivery","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/continuous-delivery.md"}');export{e as data}; diff --git a/assets/continuous-integration.html-d3878c20.js b/assets/continuous-integration.html-74e9e5a8.js similarity index 65% rename from assets/continuous-integration.html-d3878c20.js rename to assets/continuous-integration.html-74e9e5a8.js index fc3b949a00..251a6f6367 100644 --- a/assets/continuous-integration.html-d3878c20.js +++ b/assets/continuous-integration.html-74e9e5a8.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-1f335512","path":"/flutter/continuous-integration.html","title":"Continuous Integration","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/continuous-integration.md"}');export{t as data}; +const t=JSON.parse('{"key":"v-1f335512","path":"/flutter/continuous-integration.html","title":"Continuous Integration","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/continuous-integration.md"}');export{t as data}; diff --git a/assets/coroutines.html-ee941575.js b/assets/coroutines.html-c3b7adee.js similarity index 80% rename from assets/coroutines.html-ee941575.js rename to assets/coroutines.html-c3b7adee.js index a0376256cc..6bc1cc8ca6 100644 --- a/assets/coroutines.html-ee941575.js +++ b/assets/coroutines.html-c3b7adee.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-16386b36","path":"/android/coroutines.html","title":"Coroutines","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/coroutines.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-16386b36","path":"/android/coroutines.html","title":"Coroutines","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/coroutines.md"}');export{e as data}; diff --git a/assets/crash-reporting.html-e6d469a3.js b/assets/crash-reporting.html-f4f228c3.js similarity index 81% rename from assets/crash-reporting.html-e6d469a3.js rename to assets/crash-reporting.html-f4f228c3.js index b0848a59e0..a64bc132dd 100644 --- a/assets/crash-reporting.html-e6d469a3.js +++ b/assets/crash-reporting.html-f4f228c3.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-37a57446","path":"/flutter/crash-reporting.html","title":"Crash Reporting","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/crash-reporting.md"}');export{t as data}; +const t=JSON.parse('{"key":"v-37a57446","path":"/flutter/crash-reporting.html","title":"Crash Reporting","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/crash-reporting.md"}');export{t as data}; diff --git a/assets/css.html-0eb77985.js b/assets/css.html-9c076e95.js similarity index 94% rename from assets/css.html-0eb77985.js rename to assets/css.html-9c076e95.js index 958ac0e19f..9f85dc1a72 100644 --- a/assets/css.html-0eb77985.js +++ b/assets/css.html-9c076e95.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-b37d638c","path":"/frontend/css.html","title":"CSS","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Preprocessor","slug":"preprocessor","link":"#preprocessor","children":[]},{"level":2,"title":"CSS Framework","slug":"css-framework","link":"#css-framework","children":[]},{"level":2,"title":"Linting","slug":"linting","link":"#linting","children":[]},{"level":2,"title":"Class and ID casing","slug":"class-and-id-casing","link":"#class-and-id-casing","children":[]},{"level":2,"title":"CSS Methodology","slug":"css-methodology","link":"#css-methodology","children":[]},{"level":2,"title":"Nesting and Awareness of Specificity Levels","slug":"nesting-and-awareness-of-specificity-levels","link":"#nesting-and-awareness-of-specificity-levels","children":[]},{"level":2,"title":"Media Queries","slug":"media-queries","link":"#media-queries","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/css.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-b37d638c","path":"/frontend/css.html","title":"CSS","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Preprocessor","slug":"preprocessor","link":"#preprocessor","children":[]},{"level":2,"title":"CSS Framework","slug":"css-framework","link":"#css-framework","children":[]},{"level":2,"title":"Linting","slug":"linting","link":"#linting","children":[]},{"level":2,"title":"Class and ID casing","slug":"class-and-id-casing","link":"#class-and-id-casing","children":[]},{"level":2,"title":"CSS Methodology","slug":"css-methodology","link":"#css-methodology","children":[]},{"level":2,"title":"Nesting and Awareness of Specificity Levels","slug":"nesting-and-awareness-of-specificity-levels","link":"#nesting-and-awareness-of-specificity-levels","children":[]},{"level":2,"title":"Media Queries","slug":"media-queries","link":"#media-queries","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/css.md"}');export{e as data}; diff --git a/assets/dependency-injection.html-3faa3c29.js b/assets/dependency-injection.html-7ca22a45.js similarity index 82% rename from assets/dependency-injection.html-3faa3c29.js rename to assets/dependency-injection.html-7ca22a45.js index b828bd5ec6..781ddc2924 100644 --- a/assets/dependency-injection.html-3faa3c29.js +++ b/assets/dependency-injection.html-7ca22a45.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-529e84aa","path":"/android/dependency-injection.html","title":"Dependency Injection","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/dependency-injection.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-529e84aa","path":"/android/dependency-injection.html","title":"Dependency Injection","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/dependency-injection.md"}');export{e as data}; diff --git a/assets/error-handling.html-b8f2ddd5.js b/assets/error-handling.html-4f085cea.js similarity index 93% rename from assets/error-handling.html-b8f2ddd5.js rename to assets/error-handling.html-4f085cea.js index 46df35730c..b69c15f253 100644 --- a/assets/error-handling.html-b8f2ddd5.js +++ b/assets/error-handling.html-4f085cea.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-757f0c54","path":"/android/error-handling.html","title":"Error Handling","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Effective Error Handling","slug":"effective-error-handling","link":"#effective-error-handling","children":[{"level":3,"title":"Failure","slug":"failure","link":"#failure","children":[]},{"level":3,"title":"Either","slug":"either","link":"#either","children":[]},{"level":3,"title":"Bringing Failure and Either together to handle errors","slug":"bringing-failure-and-either-together-to-handle-errors","link":"#bringing-failure-and-either-together-to-handle-errors","children":[]}]},{"level":2,"title":"In a Clean Architecture Project","slug":"in-a-clean-architecture-project","link":"#in-a-clean-architecture-project","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/error-handling.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-757f0c54","path":"/android/error-handling.html","title":"Error Handling","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Effective Error Handling","slug":"effective-error-handling","link":"#effective-error-handling","children":[{"level":3,"title":"Failure","slug":"failure","link":"#failure","children":[]},{"level":3,"title":"Either","slug":"either","link":"#either","children":[]},{"level":3,"title":"Bringing Failure and Either together to handle errors","slug":"bringing-failure-and-either-together-to-handle-errors","link":"#bringing-failure-and-either-together-to-handle-errors","children":[]}]},{"level":2,"title":"In a Clean Architecture Project","slug":"in-a-clean-architecture-project","link":"#in-a-clean-architecture-project","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/error-handling.md"}');export{e as data}; diff --git a/assets/general-guidelines.html-93a42723.js b/assets/general-guidelines.html-c230c9d2.js similarity index 94% rename from assets/general-guidelines.html-93a42723.js rename to assets/general-guidelines.html-c230c9d2.js index b561e7fa65..bad7573202 100644 --- a/assets/general-guidelines.html-93a42723.js +++ b/assets/general-guidelines.html-c230c9d2.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-7428160f","path":"/dotNet/general-guidelines.html","title":"General Guidelines","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"EF and DB","slug":"ef-and-db","link":"#ef-and-db","children":[]},{"level":2,"title":"Automapper","slug":"automapper","link":"#automapper","children":[]},{"level":2,"title":"Controllers and services","slug":"controllers-and-services","link":"#controllers-and-services","children":[]},{"level":2,"title":"Async","slug":"async","link":"#async","children":[]},{"level":2,"title":"Request validation and exceptions","slug":"request-validation-and-exceptions","link":"#request-validation-and-exceptions","children":[]},{"level":2,"title":"Services and dependency Injection","slug":"services-and-dependency-injection","link":"#services-and-dependency-injection","children":[]},{"level":2,"title":"External interactions","slug":"external-interactions","link":"#external-interactions","children":[]},{"level":2,"title":"Unit Tests","slug":"unit-tests","link":"#unit-tests","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"dotNet/general-guidelines.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-7428160f","path":"/dotNet/general-guidelines.html","title":"General Guidelines","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"EF and DB","slug":"ef-and-db","link":"#ef-and-db","children":[]},{"level":2,"title":"Automapper","slug":"automapper","link":"#automapper","children":[]},{"level":2,"title":"Controllers and services","slug":"controllers-and-services","link":"#controllers-and-services","children":[]},{"level":2,"title":"Async","slug":"async","link":"#async","children":[]},{"level":2,"title":"Request validation and exceptions","slug":"request-validation-and-exceptions","link":"#request-validation-and-exceptions","children":[]},{"level":2,"title":"Services and dependency Injection","slug":"services-and-dependency-injection","link":"#services-and-dependency-injection","children":[]},{"level":2,"title":"External interactions","slug":"external-interactions","link":"#external-interactions","children":[]},{"level":2,"title":"Unit Tests","slug":"unit-tests","link":"#unit-tests","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"dotNet/general-guidelines.md"}');export{e as data}; diff --git a/assets/general.html-43b84544.js b/assets/general.html-f63233a0.js similarity index 84% rename from assets/general.html-43b84544.js rename to assets/general.html-f63233a0.js index d19da7afa9..fee575259f 100644 --- a/assets/general.html-43b84544.js +++ b/assets/general.html-f63233a0.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-b97e7df6","path":"/backend/general.html","title":"General","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Case Conventions","slug":"case-conventions","link":"#case-conventions","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/general.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-b97e7df6","path":"/backend/general.html","title":"General","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Case Conventions","slug":"case-conventions","link":"#case-conventions","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/general.md"}');export{e as data}; diff --git a/assets/git.html-51c6b812.js b/assets/git.html-cf84f6ae.js similarity index 94% rename from assets/git.html-51c6b812.js rename to assets/git.html-cf84f6ae.js index 8c876201b2..6595ea1f88 100644 --- a/assets/git.html-51c6b812.js +++ b/assets/git.html-cf84f6ae.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-1efcfaf2","path":"/general/git.html","title":"Git","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Branching","slug":"branching","link":"#branching","children":[{"level":3,"title":"Permissions","slug":"permissions","link":"#permissions","children":[]},{"level":3,"title":"Naming","slug":"naming","link":"#naming","children":[]}]},{"level":2,"title":"Commit Messages","slug":"commit-messages","link":"#commit-messages","children":[{"level":3,"title":"Formatting","slug":"formatting","link":"#formatting","children":[]},{"level":3,"title":"Tense","slug":"tense","link":"#tense","children":[]}]},{"level":2,"title":"Pull Requests","slug":"pull-requests","link":"#pull-requests","children":[{"level":3,"title":"PR Title","slug":"pr-title","link":"#pr-title","children":[]},{"level":3,"title":"PR Template","slug":"pr-template","link":"#pr-template","children":[]}]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"general/git.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-1efcfaf2","path":"/general/git.html","title":"Git","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Branching","slug":"branching","link":"#branching","children":[{"level":3,"title":"Permissions","slug":"permissions","link":"#permissions","children":[]},{"level":3,"title":"Naming","slug":"naming","link":"#naming","children":[]}]},{"level":2,"title":"Commit Messages","slug":"commit-messages","link":"#commit-messages","children":[{"level":3,"title":"Formatting","slug":"formatting","link":"#formatting","children":[]},{"level":3,"title":"Tense","slug":"tense","link":"#tense","children":[]}]},{"level":2,"title":"Pull Requests","slug":"pull-requests","link":"#pull-requests","children":[{"level":3,"title":"PR Title","slug":"pr-title","link":"#pr-title","children":[]},{"level":3,"title":"PR Template","slug":"pr-template","link":"#pr-template","children":[]}]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"general/git.md"}');export{e as data}; diff --git a/assets/handling-errors.html-5c434ad2.js b/assets/handling-errors.html-9508f429.js similarity index 89% rename from assets/handling-errors.html-5c434ad2.js rename to assets/handling-errors.html-9508f429.js index a6a827fdea..3c406fb1ec 100644 --- a/assets/handling-errors.html-5c434ad2.js +++ b/assets/handling-errors.html-9508f429.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-e38a0e40","path":"/flutter/legacy/handling-errors.html","title":"Handling Error","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Principles","slug":"principles","link":"#principles","children":[]},{"level":2,"title":"Implementing Error Handling","slug":"implementing-error-handling","link":"#implementing-error-handling","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/legacy/handling-errors.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-e38a0e40","path":"/flutter/legacy/handling-errors.html","title":"Handling Error","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Principles","slug":"principles","link":"#principles","children":[]},{"level":2,"title":"Implementing Error Handling","slug":"implementing-error-handling","link":"#implementing-error-handling","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/legacy/handling-errors.md"}');export{e as data}; diff --git a/assets/hatchly.html-2475eb56.js b/assets/hatchly.html-3ec63991.js similarity index 89% rename from assets/hatchly.html-2475eb56.js rename to assets/hatchly.html-3ec63991.js index fdce7b0b4a..6411c58f91 100644 --- a/assets/hatchly.html-2475eb56.js +++ b/assets/hatchly.html-3ec63991.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-35d72f40","path":"/backend/hatchly.html","title":"Hatchly","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Section and Attribute key casing","slug":"section-and-attribute-key-casing","link":"#section-and-attribute-key-casing","children":[]},{"level":2,"title":"Keeping Sections DRY","slug":"keeping-sections-dry","link":"#keeping-sections-dry","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/hatchly.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-35d72f40","path":"/backend/hatchly.html","title":"Hatchly","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Section and Attribute key casing","slug":"section-and-attribute-key-casing","link":"#section-and-attribute-key-casing","children":[]},{"level":2,"title":"Keeping Sections DRY","slug":"keeping-sections-dry","link":"#keeping-sections-dry","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/hatchly.md"}');export{e as data}; diff --git a/assets/html.html-6a8f4b23.js b/assets/html.html-550320c3.js similarity index 84% rename from assets/html.html-6a8f4b23.js rename to assets/html.html-550320c3.js index 0297778af9..b47365810d 100644 --- a/assets/html.html-6a8f4b23.js +++ b/assets/html.html-550320c3.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-cf5f91ec","path":"/frontend/html.html","title":"HTML","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Indentation","slug":"indentation","link":"#indentation","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/html.md"}');export{t as data}; +const t=JSON.parse('{"key":"v-cf5f91ec","path":"/frontend/html.html","title":"HTML","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Indentation","slug":"indentation","link":"#indentation","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/html.md"}');export{t as data}; diff --git a/assets/index.html-3eec43fe.js b/assets/index.html-020e10a0.js similarity index 79% rename from assets/index.html-3eec43fe.js rename to assets/index.html-020e10a0.js index b1be4569ae..72a9fa015e 100644 --- a/assets/index.html-3eec43fe.js +++ b/assets/index.html-020e10a0.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-5033abfc","path":"/dotNet/","title":"DotNet","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"dotNet/README.md"}');export{t as data}; +const t=JSON.parse('{"key":"v-5033abfc","path":"/dotNet/","title":"DotNet","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"dotNet/README.md"}');export{t as data}; diff --git a/assets/index.html-43ce196b.js b/assets/index.html-07727049.js similarity index 80% rename from assets/index.html-43ce196b.js rename to assets/index.html-07727049.js index ce8b8fd57a..e1ed0b23f3 100644 --- a/assets/index.html-43ce196b.js +++ b/assets/index.html-07727049.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-a90e54ba","path":"/frontend/testing/","title":"Testing","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/testing/README.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-a90e54ba","path":"/frontend/testing/","title":"Testing","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/testing/README.md"}');export{e as data}; diff --git a/assets/index.html-158745f1.js b/assets/index.html-39b4afdb.js similarity index 79% rename from assets/index.html-158745f1.js rename to assets/index.html-39b4afdb.js index 2e15704a32..c4d2d00236 100644 --- a/assets/index.html-158745f1.js +++ b/assets/index.html-39b4afdb.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-4290fe40","path":"/general/","title":"General","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"general/README.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-4290fe40","path":"/general/","title":"General","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"general/README.md"}');export{e as data}; diff --git a/assets/index.html-68717985.js b/assets/index.html-8af84718.js similarity index 94% rename from assets/index.html-68717985.js rename to assets/index.html-8af84718.js index dd5f9d508f..409173e053 100644 --- a/assets/index.html-68717985.js +++ b/assets/index.html-8af84718.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-8daa1a0e","path":"/","title":"","lang":"en-US","frontmatter":{"home":true,"heroImage":"/images/netsells-logo.png","heroText":"Code Standards","tagline":"How we write quality code","actions":[{"text":"Get Started →","link":"/general/","type":"primary"}],"features":[{"title":"Quality","details":"Netsells aims to keep up to date with emerging technologies and ensure that code is structured in a consistent, readable and maintainable way"},{"title":"Performance","details":"We aim to build highly performant products, utilising the best methods of tackling complex problems."},{"title":"Collaboration","details":"The set of standards provided herein exist to onboard new developers within the Netsells organisation, and assist in working with external companies on collaborative codebases."}]},"headers":[{"level":3,"title":"Contributing","slug":"contributing","link":"#contributing","children":[]},{"level":3,"title":"Like what you see?","slug":"like-what-you-see","link":"#like-what-you-see","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"README.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-8daa1a0e","path":"/","title":"","lang":"en-US","frontmatter":{"home":true,"heroImage":"/images/netsells-logo.png","heroText":"Code Standards","tagline":"How we write quality code","actions":[{"text":"Get Started →","link":"/general/","type":"primary"}],"features":[{"title":"Quality","details":"Netsells aims to keep up to date with emerging technologies and ensure that code is structured in a consistent, readable and maintainable way"},{"title":"Performance","details":"We aim to build highly performant products, utilising the best methods of tackling complex problems."},{"title":"Collaboration","details":"The set of standards provided herein exist to onboard new developers within the Netsells organisation, and assist in working with external companies on collaborative codebases."}]},"headers":[{"level":3,"title":"Contributing","slug":"contributing","link":"#contributing","children":[]},{"level":3,"title":"Like what you see?","slug":"like-what-you-see","link":"#like-what-you-see","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"README.md"}');export{e as data}; diff --git a/assets/index.html-04049003.js b/assets/index.html-ad670986.js similarity index 91% rename from assets/index.html-04049003.js rename to assets/index.html-ad670986.js index 853cee8679..0a2ce57883 100644 --- a/assets/index.html-04049003.js +++ b/assets/index.html-ad670986.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-06198984","path":"/frontend/","title":"Frontend","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Single Page Applications","slug":"single-page-applications","link":"#single-page-applications","children":[]},{"level":2,"title":"Browser support","slug":"browser-support","link":"#browser-support","children":[{"level":3,"title":"Base Support:","slug":"base-support","link":"#base-support","children":[]}]},{"level":2,"title":"Package Manager","slug":"package-manager","link":"#package-manager","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/README.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-06198984","path":"/frontend/","title":"Frontend","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Single Page Applications","slug":"single-page-applications","link":"#single-page-applications","children":[]},{"level":2,"title":"Browser support","slug":"browser-support","link":"#browser-support","children":[{"level":3,"title":"Base Support:","slug":"base-support","link":"#base-support","children":[]}]},{"level":2,"title":"Package Manager","slug":"package-manager","link":"#package-manager","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/README.md"}');export{e as data}; diff --git a/assets/index.html-e03d0433.js b/assets/index.html-b000ddd1.js similarity index 93% rename from assets/index.html-e03d0433.js rename to assets/index.html-b000ddd1.js index 97900c5699..bf11ab0dd1 100644 --- a/assets/index.html-e03d0433.js +++ b/assets/index.html-b000ddd1.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-7448383b","path":"/ios/","title":"iOS","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Intro","slug":"intro","link":"#intro","children":[]},{"level":2,"title":"Minimum Supported Version","slug":"minimum-supported-version","link":"#minimum-supported-version","children":[]},{"level":2,"title":"Third-Party Dependencies","slug":"third-party-dependencies","link":"#third-party-dependencies","children":[]},{"level":2,"title":"CI System","slug":"ci-system","link":"#ci-system","children":[]},{"level":2,"title":"Pull Requests","slug":"pull-requests","link":"#pull-requests","children":[]},{"level":2,"title":"Leaving Feedback","slug":"leaving-feedback","link":"#leaving-feedback","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/README.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-7448383b","path":"/ios/","title":"iOS","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Intro","slug":"intro","link":"#intro","children":[]},{"level":2,"title":"Minimum Supported Version","slug":"minimum-supported-version","link":"#minimum-supported-version","children":[]},{"level":2,"title":"Third-Party Dependencies","slug":"third-party-dependencies","link":"#third-party-dependencies","children":[]},{"level":2,"title":"CI System","slug":"ci-system","link":"#ci-system","children":[]},{"level":2,"title":"Pull Requests","slug":"pull-requests","link":"#pull-requests","children":[]},{"level":2,"title":"Leaving Feedback","slug":"leaving-feedback","link":"#leaving-feedback","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/README.md"}');export{e as data}; diff --git a/assets/index.html-ea666941.js b/assets/index.html-bd8c0e2b.js similarity index 79% rename from assets/index.html-ea666941.js rename to assets/index.html-bd8c0e2b.js index 576d5c0b8a..02fef3cb2c 100644 --- a/assets/index.html-ea666941.js +++ b/assets/index.html-bd8c0e2b.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-c1f0fcce","path":"/android/","title":"Android","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/README.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-c1f0fcce","path":"/android/","title":"Android","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/README.md"}');export{e as data}; diff --git a/assets/index.html-8391caa5.js b/assets/index.html-c315df85.js similarity index 79% rename from assets/index.html-8391caa5.js rename to assets/index.html-c315df85.js index 15528ef5a0..b18f401485 100644 --- a/assets/index.html-8391caa5.js +++ b/assets/index.html-c315df85.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-6250ba7a","path":"/flutter/legacy/","title":"","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/legacy/README.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-6250ba7a","path":"/flutter/legacy/","title":"","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/legacy/README.md"}');export{e as data}; diff --git a/assets/index.html-2840a318.js b/assets/index.html-d090af1a.js similarity index 85% rename from assets/index.html-2840a318.js rename to assets/index.html-d090af1a.js index d09540e34e..1dc37c72e3 100644 --- a/assets/index.html-2840a318.js +++ b/assets/index.html-d090af1a.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-37802094","path":"/frontend/linting/","title":"Linting","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Automated Enforcement","slug":"automated-enforcement","link":"#automated-enforcement","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/linting/README.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-37802094","path":"/frontend/linting/","title":"Linting","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Automated Enforcement","slug":"automated-enforcement","link":"#automated-enforcement","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/linting/README.md"}');export{e as data}; diff --git a/assets/index.html-428a20d2.js b/assets/index.html-d61d5321.js similarity index 80% rename from assets/index.html-428a20d2.js rename to assets/index.html-d61d5321.js index 07e66a27af..850da33d60 100644 --- a/assets/index.html-428a20d2.js +++ b/assets/index.html-d61d5321.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-59c1b58c","path":"/flutter/","title":"Legacy Flutter Projects","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/README.md"}');export{t as data}; +const t=JSON.parse('{"key":"v-59c1b58c","path":"/flutter/","title":"Legacy Flutter Projects","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/README.md"}');export{t as data}; diff --git a/assets/index.html-1f443265.js b/assets/index.html-fdbfa421.js similarity index 79% rename from assets/index.html-1f443265.js rename to assets/index.html-fdbfa421.js index db6e97219a..9997b4b962 100644 --- a/assets/index.html-1f443265.js +++ b/assets/index.html-fdbfa421.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-551bb614","path":"/backend/","title":"Backend","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/README.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-551bb614","path":"/backend/","title":"Backend","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/README.md"}');export{e as data}; diff --git a/assets/javascript.html-5fc80820.js b/assets/javascript.html-2063a1de.js similarity index 92% rename from assets/javascript.html-5fc80820.js rename to assets/javascript.html-2063a1de.js index 29a2218a19..307c4bd56e 100644 --- a/assets/javascript.html-5fc80820.js +++ b/assets/javascript.html-2063a1de.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-5aa1fcf0","path":"/frontend/javascript.html","title":"JavaScript","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Linting","slug":"linting","link":"#linting","children":[]},{"level":2,"title":"UI Framework","slug":"ui-framework","link":"#ui-framework","children":[]},{"level":2,"title":"Documentation","slug":"documentation","link":"#documentation","children":[{"level":3,"title":"Method and function names","slug":"method-and-function-names","link":"#method-and-function-names","children":[]},{"level":3,"title":"JSDoc","slug":"jsdoc","link":"#jsdoc","children":[]}]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/javascript.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-5aa1fcf0","path":"/frontend/javascript.html","title":"JavaScript","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Linting","slug":"linting","link":"#linting","children":[]},{"level":2,"title":"UI Framework","slug":"ui-framework","link":"#ui-framework","children":[]},{"level":2,"title":"Documentation","slug":"documentation","link":"#documentation","children":[{"level":3,"title":"Method and function names","slug":"method-and-function-names","link":"#method-and-function-names","children":[]},{"level":3,"title":"JSDoc","slug":"jsdoc","link":"#jsdoc","children":[]}]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/javascript.md"}');export{e as data}; diff --git a/assets/kotlin.html-16fbee87.js b/assets/kotlin.html-55fb7682.js similarity index 79% rename from assets/kotlin.html-16fbee87.js rename to assets/kotlin.html-55fb7682.js index 236808ff8f..ef35ad87c1 100644 --- a/assets/kotlin.html-16fbee87.js +++ b/assets/kotlin.html-55fb7682.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-3e66553f","path":"/android/kotlin.html","title":"Kotlin","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/kotlin.md"}');export{t as data}; +const t=JSON.parse('{"key":"v-3e66553f","path":"/android/kotlin.html","title":"Kotlin","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/kotlin.md"}');export{t as data}; diff --git a/assets/laravel.html-53a107a1.js b/assets/laravel.html-fba4f317.js similarity index 92% rename from assets/laravel.html-53a107a1.js rename to assets/laravel.html-fba4f317.js index d2d3ddf5e4..2dec35a9ef 100644 --- a/assets/laravel.html-53a107a1.js +++ b/assets/laravel.html-fba4f317.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-6957d9d4","path":"/backend/laravel.html","title":"Laravel","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Models","slug":"models","link":"#models","children":[{"level":3,"title":"Ordering","slug":"ordering","link":"#ordering","children":[]}]},{"level":2,"title":"Routing","slug":"routing","link":"#routing","children":[{"level":3,"title":"Method definitions","slug":"method-definitions","link":"#method-definitions","children":[]},{"level":3,"title":"Parameter definitions","slug":"parameter-definitions","link":"#parameter-definitions","children":[]}]},{"level":2,"title":"Validation","slug":"validation","link":"#validation","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/laravel.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-6957d9d4","path":"/backend/laravel.html","title":"Laravel","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Models","slug":"models","link":"#models","children":[{"level":3,"title":"Ordering","slug":"ordering","link":"#ordering","children":[]}]},{"level":2,"title":"Routing","slug":"routing","link":"#routing","children":[{"level":3,"title":"Method definitions","slug":"method-definitions","link":"#method-definitions","children":[]},{"level":3,"title":"Parameter definitions","slug":"parameter-definitions","link":"#parameter-definitions","children":[]}]},{"level":2,"title":"Validation","slug":"validation","link":"#validation","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/laravel.md"}');export{e as data}; diff --git a/assets/layouts.html-887133d8.js b/assets/layouts.html-610ae674.js similarity index 79% rename from assets/layouts.html-887133d8.js rename to assets/layouts.html-610ae674.js index d98fc77a11..5da288864c 100644 --- a/assets/layouts.html-887133d8.js +++ b/assets/layouts.html-610ae674.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-e5d488aa","path":"/ios/layouts.html","title":"Layouts","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/layouts.md"}');export{t as data}; +const t=JSON.parse('{"key":"v-e5d488aa","path":"/ios/layouts.html","title":"Layouts","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/layouts.md"}');export{t as data}; diff --git a/assets/linting-rules.html-1cd9f94b.js b/assets/linting-rules.html-66185d96.js similarity index 64% rename from assets/linting-rules.html-1cd9f94b.js rename to assets/linting-rules.html-66185d96.js index 58b431c134..34d261badb 100644 --- a/assets/linting-rules.html-1cd9f94b.js +++ b/assets/linting-rules.html-66185d96.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-66577348","path":"/flutter/linting-rules.html","title":"Linting & Static Analysis Rules","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/linting-rules.md"}');export{t as data}; +const t=JSON.parse('{"key":"v-66577348","path":"/flutter/linting-rules.html","title":"Linting & Static Analysis Rules","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/linting-rules.md"}');export{t as data}; diff --git a/assets/linting.html-57d401c4.js b/assets/linting.html-39e82972.js similarity index 89% rename from assets/linting.html-57d401c4.js rename to assets/linting.html-39e82972.js index 210042ab88..d218e656c2 100644 --- a/assets/linting.html-57d401c4.js +++ b/assets/linting.html-39e82972.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-69fbfaf5","path":"/ios/linting.html","title":"Linting Rules & Enforcement","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Intro","slug":"intro","link":"#intro","children":[]},{"level":2,"title":"Rules","slug":"rules","link":"#rules","children":[{"level":3,"title":"Control Statements","slug":"control-statements","link":"#control-statements","children":[]}]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/linting.md"}');export{t as data}; +const t=JSON.parse('{"key":"v-69fbfaf5","path":"/ios/linting.html","title":"Linting Rules & Enforcement","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Intro","slug":"intro","link":"#intro","children":[]},{"level":2,"title":"Rules","slug":"rules","link":"#rules","children":[{"level":3,"title":"Control Statements","slug":"control-statements","link":"#control-statements","children":[]}]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/linting.md"}');export{t as data}; diff --git a/assets/local-databases.html-4044e76d.js b/assets/local-databases.html-9795e7df.js similarity index 64% rename from assets/local-databases.html-4044e76d.js rename to assets/local-databases.html-9795e7df.js index 05f222347a..31f795ac2c 100644 --- a/assets/local-databases.html-4044e76d.js +++ b/assets/local-databases.html-9795e7df.js @@ -1 +1 @@ -const a=JSON.parse('{"key":"v-631ebf3c","path":"/android/local-databases.html","title":"Local Databases & Persistence","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/local-databases.md"}');export{a as data}; +const a=JSON.parse('{"key":"v-631ebf3c","path":"/android/local-databases.html","title":"Local Databases & Persistence","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/local-databases.md"}');export{a as data}; diff --git a/assets/localization.html-bfd25141.js b/assets/localization.html-f8305782.js similarity index 64% rename from assets/localization.html-bfd25141.js rename to assets/localization.html-f8305782.js index b5ef04f77c..431dcf9327 100644 --- a/assets/localization.html-bfd25141.js +++ b/assets/localization.html-f8305782.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-22e0faa6","path":"/flutter/legacy/localization.html","title":"Localizing Flutter Apps","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/legacy/localization.md"}');export{t as data}; +const t=JSON.parse('{"key":"v-22e0faa6","path":"/flutter/legacy/localization.html","title":"Localizing Flutter Apps","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/legacy/localization.md"}');export{t as data}; diff --git a/assets/monarch.html-ad074d20.js b/assets/monarch.html-30131cfd.js similarity index 80% rename from assets/monarch.html-ad074d20.js rename to assets/monarch.html-30131cfd.js index 2a96dcd086..c70fbef269 100644 --- a/assets/monarch.html-ad074d20.js +++ b/assets/monarch.html-30131cfd.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-3a4b8043","path":"/flutter/monarch.html","title":"Monarch","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/monarch.md"}');export{t as data}; +const t=JSON.parse('{"key":"v-3a4b8043","path":"/flutter/monarch.html","title":"Monarch","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/monarch.md"}');export{t as data}; diff --git a/assets/multiple-firebase-environments.html-f6fb1ed6.js b/assets/multiple-firebase-environments.html-97651951.js similarity index 95% rename from assets/multiple-firebase-environments.html-f6fb1ed6.js rename to assets/multiple-firebase-environments.html-97651951.js index b26304879a..6df55f036d 100644 --- a/assets/multiple-firebase-environments.html-f6fb1ed6.js +++ b/assets/multiple-firebase-environments.html-97651951.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-664e86a4","path":"/flutter/multiple-firebase-environments.html","title":"Multiple Firebase Environments","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Step 1: Create Firebase projects","slug":"step-1-create-firebase-projects","link":"#step-1-create-firebase-projects","children":[]},{"level":2,"title":"Step 2: Set up Firebase in your app","slug":"step-2-set-up-firebase-in-your-app","link":"#step-2-set-up-firebase-in-your-app","children":[]},{"level":2,"title":"Step 3: Android configuration setup","slug":"step-3-android-configuration-setup","link":"#step-3-android-configuration-setup","children":[]},{"level":2,"title":"Step 4: iOS Configuration Setup","slug":"step-4-ios-configuration-setup","link":"#step-4-ios-configuration-setup","children":[{"level":3,"title":"Add your PLIST files","slug":"add-your-plist-files","link":"#add-your-plist-files","children":[]},{"level":3,"title":"Create custom schemes","slug":"create-custom-schemes","link":"#create-custom-schemes","children":[]},{"level":3,"title":"Add a new Run Script build phase","slug":"add-a-new-run-script-build-phase","link":"#add-a-new-run-script-build-phase","children":[]}]},{"level":2,"title":"Step 5: Run or build using the correct flavor","slug":"step-5-run-or-build-using-the-correct-flavor","link":"#step-5-run-or-build-using-the-correct-flavor","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/multiple-firebase-environments.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-664e86a4","path":"/flutter/multiple-firebase-environments.html","title":"Multiple Firebase Environments","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Step 1: Create Firebase projects","slug":"step-1-create-firebase-projects","link":"#step-1-create-firebase-projects","children":[]},{"level":2,"title":"Step 2: Set up Firebase in your app","slug":"step-2-set-up-firebase-in-your-app","link":"#step-2-set-up-firebase-in-your-app","children":[]},{"level":2,"title":"Step 3: Android configuration setup","slug":"step-3-android-configuration-setup","link":"#step-3-android-configuration-setup","children":[]},{"level":2,"title":"Step 4: iOS Configuration Setup","slug":"step-4-ios-configuration-setup","link":"#step-4-ios-configuration-setup","children":[{"level":3,"title":"Add your PLIST files","slug":"add-your-plist-files","link":"#add-your-plist-files","children":[]},{"level":3,"title":"Create custom schemes","slug":"create-custom-schemes","link":"#create-custom-schemes","children":[]},{"level":3,"title":"Add a new Run Script build phase","slug":"add-a-new-run-script-build-phase","link":"#add-a-new-run-script-build-phase","children":[]}]},{"level":2,"title":"Step 5: Run or build using the correct flavor","slug":"step-5-run-or-build-using-the-correct-flavor","link":"#step-5-run-or-build-using-the-correct-flavor","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/multiple-firebase-environments.md"}');export{e as data}; diff --git a/assets/mvvm.html-0ef4e6a5.js b/assets/mvvm.html-b1fc5aea.js similarity index 79% rename from assets/mvvm.html-0ef4e6a5.js rename to assets/mvvm.html-b1fc5aea.js index 72b3527848..83aa66b1be 100644 --- a/assets/mvvm.html-0ef4e6a5.js +++ b/assets/mvvm.html-b1fc5aea.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-7c84f940","path":"/android/mvvm.html","title":"MVVM","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/mvvm.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-7c84f940","path":"/android/mvvm.html","title":"MVVM","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/mvvm.md"}');export{e as data}; diff --git a/assets/naming-widgets.html-c3815153.js b/assets/naming-widgets.html-364b6e53.js similarity index 81% rename from assets/naming-widgets.html-c3815153.js rename to assets/naming-widgets.html-364b6e53.js index aec6010556..da77b6afb9 100644 --- a/assets/naming-widgets.html-c3815153.js +++ b/assets/naming-widgets.html-364b6e53.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-539bafa3","path":"/flutter/naming-widgets.html","title":"Naming Widgets","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/naming-widgets.md"}');export{t as data}; +const t=JSON.parse('{"key":"v-539bafa3","path":"/flutter/naming-widgets.html","title":"Naming Widgets","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/naming-widgets.md"}');export{t as data}; diff --git a/assets/network-requests.html-28650a7c.js b/assets/network-requests.html-ff3d9625.js similarity index 81% rename from assets/network-requests.html-28650a7c.js rename to assets/network-requests.html-ff3d9625.js index 3643fae203..6606eabe33 100644 --- a/assets/network-requests.html-28650a7c.js +++ b/assets/network-requests.html-ff3d9625.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-3798263d","path":"/android/network-requests.html","title":"Network Requests","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/network-requests.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-3798263d","path":"/android/network-requests.html","title":"Network Requests","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/network-requests.md"}');export{e as data}; diff --git a/assets/performance.html-ec54620c.js b/assets/performance.html-a0676d34.js similarity index 80% rename from assets/performance.html-ec54620c.js rename to assets/performance.html-a0676d34.js index 9d735d7d06..8d797dab7e 100644 --- a/assets/performance.html-ec54620c.js +++ b/assets/performance.html-a0676d34.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-e0725fa6","path":"/frontend/performance.html","title":"Performance","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/performance.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-e0725fa6","path":"/frontend/performance.html","title":"Performance","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/performance.md"}');export{e as data}; diff --git a/assets/php.html-e5bfdfb9.js b/assets/php.html-d96eeb3c.js similarity index 79% rename from assets/php.html-e5bfdfb9.js rename to assets/php.html-d96eeb3c.js index f80d13af83..fe9664c37f 100644 --- a/assets/php.html-e5bfdfb9.js +++ b/assets/php.html-d96eeb3c.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-0f7bc716","path":"/backend/php.html","title":"PHP","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/php.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-0f7bc716","path":"/backend/php.html","title":"PHP","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/php.md"}');export{e as data}; diff --git a/assets/project-setup.html-5e45efdd.js b/assets/project-setup.html-a947d575.js similarity index 94% rename from assets/project-setup.html-5e45efdd.js rename to assets/project-setup.html-a947d575.js index 9917377612..8ea6765afe 100644 --- a/assets/project-setup.html-5e45efdd.js +++ b/assets/project-setup.html-a947d575.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-2d5b4388","path":"/flutter/project-setup.html","title":"Setting up a Flutter Project","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"1️⃣ Create a repository using the template","slug":"_1️⃣-create-a-repository-using-the-template","link":"#_1️⃣-create-a-repository-using-the-template","children":[]},{"level":2,"title":"2️⃣ Setup Firebase","slug":"_2️⃣-setup-firebase","link":"#_2️⃣-setup-firebase","children":[]},{"level":2,"title":"3️⃣ Set up Fastlane Match","slug":"_3️⃣-set-up-fastlane-match","link":"#_3️⃣-set-up-fastlane-match","children":[]},{"level":2,"title":"4️⃣ Set up Sentry","slug":"_4️⃣-set-up-sentry","link":"#_4️⃣-set-up-sentry","children":[]},{"level":2,"title":"5️⃣ Set up Mixpanel","slug":"_5️⃣-set-up-mixpanel","link":"#_5️⃣-set-up-mixpanel","children":[]},{"level":2,"title":"6️⃣ Set up Production Deployment","slug":"_6️⃣-set-up-production-deployment","link":"#_6️⃣-set-up-production-deployment","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/project-setup.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-2d5b4388","path":"/flutter/project-setup.html","title":"Setting up a Flutter Project","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"1️⃣ Create a repository using the template","slug":"_1️⃣-create-a-repository-using-the-template","link":"#_1️⃣-create-a-repository-using-the-template","children":[]},{"level":2,"title":"2️⃣ Setup Firebase","slug":"_2️⃣-setup-firebase","link":"#_2️⃣-setup-firebase","children":[]},{"level":2,"title":"3️⃣ Set up Fastlane Match","slug":"_3️⃣-set-up-fastlane-match","link":"#_3️⃣-set-up-fastlane-match","children":[]},{"level":2,"title":"4️⃣ Set up Sentry","slug":"_4️⃣-set-up-sentry","link":"#_4️⃣-set-up-sentry","children":[]},{"level":2,"title":"5️⃣ Set up Mixpanel","slug":"_5️⃣-set-up-mixpanel","link":"#_5️⃣-set-up-mixpanel","children":[]},{"level":2,"title":"6️⃣ Set up Production Deployment","slug":"_6️⃣-set-up-production-deployment","link":"#_6️⃣-set-up-production-deployment","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/project-setup.md"}');export{e as data}; diff --git a/assets/pull-request-labels.html-a48d8a9d.js b/assets/pull-request-labels.html-51f8b020.js similarity index 82% rename from assets/pull-request-labels.html-a48d8a9d.js rename to assets/pull-request-labels.html-51f8b020.js index b66abaad56..074896ff7b 100644 --- a/assets/pull-request-labels.html-a48d8a9d.js +++ b/assets/pull-request-labels.html-51f8b020.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-67bfbd0d","path":"/android/pull-request-labels.html","title":"Pull Request Labelling","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/pull-request-labels.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-67bfbd0d","path":"/android/pull-request-labels.html","title":"Pull Request Labelling","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/pull-request-labels.md"}');export{e as data}; diff --git a/assets/pull-requests.html-3f70dcaa.js b/assets/pull-requests.html-64b7734c.js similarity index 94% rename from assets/pull-requests.html-3f70dcaa.js rename to assets/pull-requests.html-64b7734c.js index 97022f86d7..076d2d92cd 100644 --- a/assets/pull-requests.html-3f70dcaa.js +++ b/assets/pull-requests.html-64b7734c.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-60154c4d","path":"/general/pull-requests.html","title":"Pull Requests","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Overview","slug":"overview","link":"#overview","children":[]},{"level":2,"title":"Making a Pull Request","slug":"making-a-pull-request","link":"#making-a-pull-request","children":[]},{"level":2,"title":"Linters and CI Tests","slug":"linters-and-ci-tests","link":"#linters-and-ci-tests","children":[]},{"level":2,"title":"Requesting a review","slug":"requesting-a-review","link":"#requesting-a-review","children":[]},{"level":2,"title":"Review Comments","slug":"review-comments","link":"#review-comments","children":[]},{"level":2,"title":"Comment Tips and Examples for Reviewers","slug":"comment-tips-and-examples-for-reviewers","link":"#comment-tips-and-examples-for-reviewers","children":[]},{"level":2,"title":"Back to QA?","slug":"back-to-qa","link":"#back-to-qa","children":[]},{"level":2,"title":"Merging","slug":"merging","link":"#merging","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"general/pull-requests.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-60154c4d","path":"/general/pull-requests.html","title":"Pull Requests","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Overview","slug":"overview","link":"#overview","children":[]},{"level":2,"title":"Making a Pull Request","slug":"making-a-pull-request","link":"#making-a-pull-request","children":[]},{"level":2,"title":"Linters and CI Tests","slug":"linters-and-ci-tests","link":"#linters-and-ci-tests","children":[]},{"level":2,"title":"Requesting a review","slug":"requesting-a-review","link":"#requesting-a-review","children":[]},{"level":2,"title":"Review Comments","slug":"review-comments","link":"#review-comments","children":[]},{"level":2,"title":"Comment Tips and Examples for Reviewers","slug":"comment-tips-and-examples-for-reviewers","link":"#comment-tips-and-examples-for-reviewers","children":[]},{"level":2,"title":"Back to QA?","slug":"back-to-qa","link":"#back-to-qa","children":[]},{"level":2,"title":"Merging","slug":"merging","link":"#merging","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"general/pull-requests.md"}');export{e as data}; diff --git a/assets/pull-requests.html-8fa5eb50.js b/assets/pull-requests.html-cacf8cde.js similarity index 91% rename from assets/pull-requests.html-8fa5eb50.js rename to assets/pull-requests.html-cacf8cde.js index e799bd0145..06256b91f2 100644 --- a/assets/pull-requests.html-8fa5eb50.js +++ b/assets/pull-requests.html-cacf8cde.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-07b78fc1","path":"/mobile/pull-requests.html","title":"Pull Request Workflow","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Screen recordings for visual changes","slug":"screen-recordings-for-visual-changes","link":"#screen-recordings-for-visual-changes","children":[]},{"level":2,"title":"Test Coverage","slug":"test-coverage","link":"#test-coverage","children":[]},{"level":2,"title":"Deprecating Codeowners","slug":"deprecating-codeowners","link":"#deprecating-codeowners","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"mobile/pull-requests.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-07b78fc1","path":"/mobile/pull-requests.html","title":"Pull Request Workflow","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Screen recordings for visual changes","slug":"screen-recordings-for-visual-changes","link":"#screen-recordings-for-visual-changes","children":[]},{"level":2,"title":"Test Coverage","slug":"test-coverage","link":"#test-coverage","children":[]},{"level":2,"title":"Deprecating Codeowners","slug":"deprecating-codeowners","link":"#deprecating-codeowners","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"mobile/pull-requests.md"}');export{e as data}; diff --git a/assets/recommended-packages.html-dac011b8.js b/assets/recommended-packages.html-1f705211.js similarity index 82% rename from assets/recommended-packages.html-dac011b8.js rename to assets/recommended-packages.html-1f705211.js index bbc1c1e3fa..3d4516c53f 100644 --- a/assets/recommended-packages.html-dac011b8.js +++ b/assets/recommended-packages.html-1f705211.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-382c27e4","path":"/flutter/recommended-packages.html","title":"Recommended Packages","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/recommended-packages.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-382c27e4","path":"/flutter/recommended-packages.html","title":"Recommended Packages","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/recommended-packages.md"}');export{e as data}; diff --git a/assets/recommended-packages.html-405842b8.js b/assets/recommended-packages.html-31b5055f.js similarity index 82% rename from assets/recommended-packages.html-405842b8.js rename to assets/recommended-packages.html-31b5055f.js index 8595afb043..51c6b8ddce 100644 --- a/assets/recommended-packages.html-405842b8.js +++ b/assets/recommended-packages.html-31b5055f.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-3d0401d4","path":"/frontend/recommended-packages.html","title":"Recommended Packages","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/recommended-packages.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-3d0401d4","path":"/frontend/recommended-packages.html","title":"Recommended Packages","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/recommended-packages.md"}');export{e as data}; diff --git a/assets/recommended-packages.html-48ccd635.js b/assets/recommended-packages.html-a3b1a5f4.js similarity index 85% rename from assets/recommended-packages.html-48ccd635.js rename to assets/recommended-packages.html-a3b1a5f4.js index 51a2cf8011..9d1a6e5f0d 100644 --- a/assets/recommended-packages.html-48ccd635.js +++ b/assets/recommended-packages.html-a3b1a5f4.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-7d441486","path":"/backend/recommended-packages.html","title":"Recommended Packages","lang":"en-US","frontmatter":{},"headers":[{"level":3,"title":"Example","slug":"example","link":"#example","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/recommended-packages.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-7d441486","path":"/backend/recommended-packages.html","title":"Recommended Packages","lang":"en-US","frontmatter":{},"headers":[{"level":3,"title":"Example","slug":"example","link":"#example","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/recommended-packages.md"}');export{e as data}; diff --git a/assets/recommended-packages.html-2caea997.js b/assets/recommended-packages.html-fa6fddf8.js similarity index 85% rename from assets/recommended-packages.html-2caea997.js rename to assets/recommended-packages.html-fa6fddf8.js index 4fd8ca3ff1..72eadf2dce 100644 --- a/assets/recommended-packages.html-2caea997.js +++ b/assets/recommended-packages.html-fa6fddf8.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-2a1c4858","path":"/dotNet/recommended-packages.html","title":"Recommended Packages","lang":"en-US","frontmatter":{},"headers":[{"level":3,"title":"Example","slug":"example","link":"#example","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"dotNet/recommended-packages.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-2a1c4858","path":"/dotNet/recommended-packages.html","title":"Recommended Packages","lang":"en-US","frontmatter":{},"headers":[{"level":3,"title":"Example","slug":"example","link":"#example","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"dotNet/recommended-packages.md"}');export{e as data}; diff --git a/assets/required-qa.html-e9fc67f9.js b/assets/required-qa.html-456d3003.js similarity index 89% rename from assets/required-qa.html-e9fc67f9.js rename to assets/required-qa.html-456d3003.js index bce7b05f19..9275b51205 100644 --- a/assets/required-qa.html-e9fc67f9.js +++ b/assets/required-qa.html-456d3003.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-56ad03c2","path":"/frontend/required-qa.html","title":"Required QA","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Eslint","slug":"eslint","link":"#eslint","children":[]},{"level":2,"title":"Stylelint","slug":"stylelint","link":"#stylelint","children":[]},{"level":2,"title":"Visual Regression Testing","slug":"visual-regression-testing","link":"#visual-regression-testing","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/required-qa.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-56ad03c2","path":"/frontend/required-qa.html","title":"Required QA","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Eslint","slug":"eslint","link":"#eslint","children":[]},{"level":2,"title":"Stylelint","slug":"stylelint","link":"#stylelint","children":[]},{"level":2,"title":"Visual Regression Testing","slug":"visual-regression-testing","link":"#visual-regression-testing","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/required-qa.md"}');export{e as data}; diff --git a/assets/security-practices.html-7190f4e2.js b/assets/security-practices.html-41dae869.js similarity index 90% rename from assets/security-practices.html-7190f4e2.js rename to assets/security-practices.html-41dae869.js index 3fd2ff9ba5..eb516e786c 100644 --- a/assets/security-practices.html-7190f4e2.js +++ b/assets/security-practices.html-41dae869.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-50b19462","path":"/flutter/security-practices.html","title":"Security Best Practices","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Detecting jailbroken/rooted devices","slug":"detecting-jailbroken-rooted-devices","link":"#detecting-jailbroken-rooted-devices","children":[]},{"level":2,"title":"Store authentication tokens securely","slug":"store-authentication-tokens-securely","link":"#store-authentication-tokens-securely","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/security-practices.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-50b19462","path":"/flutter/security-practices.html","title":"Security Best Practices","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Detecting jailbroken/rooted devices","slug":"detecting-jailbroken-rooted-devices","link":"#detecting-jailbroken-rooted-devices","children":[]},{"level":2,"title":"Store authentication tokens securely","slug":"store-authentication-tokens-securely","link":"#store-authentication-tokens-securely","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/security-practices.md"}');export{e as data}; diff --git a/assets/state-management.html-289264c4.js b/assets/state-management.html-510c5ce6.js similarity index 85% rename from assets/state-management.html-289264c4.js rename to assets/state-management.html-510c5ce6.js index ec5a54c629..c0f5753187 100644 --- a/assets/state-management.html-289264c4.js +++ b/assets/state-management.html-510c5ce6.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-55f3772e","path":"/flutter/state-management.html","title":"State Management and DI","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Prefer using watch over read","slug":"prefer-using-watch-over-read","link":"#prefer-using-watch-over-read","children":[]},{"level":2,"title":"Avoid injecting WidgetRefs into classes","slug":"avoid-injecting-widgetrefs-into-classes","link":"#avoid-injecting-widgetrefs-into-classes","children":[]},{"level":2,"title":"Providers requiring asynchronous initialisation","slug":"providers-requiring-asynchronous-initialisation","link":"#providers-requiring-asynchronous-initialisation","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/state-management.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-55f3772e","path":"/flutter/state-management.html","title":"State Management and DI","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Prefer using watch over read","slug":"prefer-using-watch-over-read","link":"#prefer-using-watch-over-read","children":[]},{"level":2,"title":"Avoid injecting WidgetRefs into classes","slug":"avoid-injecting-widgetrefs-into-classes","link":"#avoid-injecting-widgetrefs-into-classes","children":[]},{"level":2,"title":"Providers requiring asynchronous initialisation","slug":"providers-requiring-asynchronous-initialisation","link":"#providers-requiring-asynchronous-initialisation","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/state-management.md"}');export{e as data}; diff --git a/assets/state-management.html-ed5e74e6.js b/assets/state-management.html-e83bc206.js similarity index 92% rename from assets/state-management.html-ed5e74e6.js rename to assets/state-management.html-e83bc206.js index 78e192fad8..1d065e05ad 100644 --- a/assets/state-management.html-ed5e74e6.js +++ b/assets/state-management.html-e83bc206.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-97fb1a00","path":"/flutter/legacy/state-management.html","title":"State Management using Bloc","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Writing Blocs","slug":"writing-blocs","link":"#writing-blocs","children":[{"level":3,"title":"File Structure","slug":"file-structure","link":"#file-structure","children":[]},{"level":3,"title":"Events","slug":"events","link":"#events","children":[]},{"level":3,"title":"States","slug":"states","link":"#states","children":[]},{"level":3,"title":"Event Handlers","slug":"event-handlers","link":"#event-handlers","children":[]}]},{"level":2,"title":"Using Blocs","slug":"using-blocs","link":"#using-blocs","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/legacy/state-management.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-97fb1a00","path":"/flutter/legacy/state-management.html","title":"State Management using Bloc","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Writing Blocs","slug":"writing-blocs","link":"#writing-blocs","children":[{"level":3,"title":"File Structure","slug":"file-structure","link":"#file-structure","children":[]},{"level":3,"title":"Events","slug":"events","link":"#events","children":[]},{"level":3,"title":"States","slug":"states","link":"#states","children":[]},{"level":3,"title":"Event Handlers","slug":"event-handlers","link":"#event-handlers","children":[]}]},{"level":2,"title":"Using Blocs","slug":"using-blocs","link":"#using-blocs","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/legacy/state-management.md"}');export{e as data}; diff --git a/assets/storybook.html-ee3c58bd.js b/assets/storybook.html-b7fde644.js similarity index 94% rename from assets/storybook.html-ee3c58bd.js rename to assets/storybook.html-b7fde644.js index 5d21326ade..5e73ff79b0 100644 --- a/assets/storybook.html-ee3c58bd.js +++ b/assets/storybook.html-b7fde644.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-7c336682","path":"/frontend/storybook.html","title":"Storybook","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Structure","slug":"structure","link":"#structure","children":[]},{"level":2,"title":"Addons","slug":"addons","link":"#addons","children":[{"level":3,"title":"Knobs","slug":"knobs","link":"#knobs","children":[]},{"level":3,"title":"A11y","slug":"a11y","link":"#a11y","children":[]},{"level":3,"title":"Viewport","slug":"viewport","link":"#viewport","children":[]}]},{"level":2,"title":"Stories","slug":"stories","link":"#stories","children":[{"level":3,"title":"File structure","slug":"file-structure","link":"#file-structure","children":[]},{"level":3,"title":"Setting up a story live template on JetBrains IDEs","slug":"setting-up-a-story-live-template-on-jetbrains-ides","link":"#setting-up-a-story-live-template-on-jetbrains-ides","children":[]}]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/storybook.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-7c336682","path":"/frontend/storybook.html","title":"Storybook","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Structure","slug":"structure","link":"#structure","children":[]},{"level":2,"title":"Addons","slug":"addons","link":"#addons","children":[{"level":3,"title":"Knobs","slug":"knobs","link":"#knobs","children":[]},{"level":3,"title":"A11y","slug":"a11y","link":"#a11y","children":[]},{"level":3,"title":"Viewport","slug":"viewport","link":"#viewport","children":[]}]},{"level":2,"title":"Stories","slug":"stories","link":"#stories","children":[{"level":3,"title":"File structure","slug":"file-structure","link":"#file-structure","children":[]},{"level":3,"title":"Setting up a story live template on JetBrains IDEs","slug":"setting-up-a-story-live-template-on-jetbrains-ides","link":"#setting-up-a-story-live-template-on-jetbrains-ides","children":[]}]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/storybook.md"}');export{e as data}; diff --git a/assets/testing.html-1b162d10.js b/assets/testing.html-3526e38e.js similarity index 89% rename from assets/testing.html-1b162d10.js rename to assets/testing.html-3526e38e.js index 69da4e7e6a..0f8adbbd65 100644 --- a/assets/testing.html-1b162d10.js +++ b/assets/testing.html-3526e38e.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-19659084","path":"/ios/testing.html","title":"Testing","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Summary","slug":"summary","link":"#summary","children":[]},{"level":2,"title":"🧑‍Formula for a good test","slug":"🧑‍formula-for-a-good-test","link":"#🧑‍formula-for-a-good-test","children":[]},{"level":2,"title":"Matching the acceptance criteria","slug":"matching-the-acceptance-criteria","link":"#matching-the-acceptance-criteria","children":[]},{"level":2,"title":"🍞 Bake tests into your development workflow","slug":"🍞-bake-tests-into-your-development-workflow","link":"#🍞-bake-tests-into-your-development-workflow","children":[]},{"level":2,"title":"Review tests in PRs carefully","slug":"review-tests-in-prs-carefully","link":"#review-tests-in-prs-carefully","children":[]},{"level":2,"title":"Don’t skip tests to save time","slug":"don-t-skip-tests-to-save-time","link":"#don-t-skip-tests-to-save-time","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/testing.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-19659084","path":"/ios/testing.html","title":"Testing","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Summary","slug":"summary","link":"#summary","children":[]},{"level":2,"title":"🧑‍Formula for a good test","slug":"🧑‍formula-for-a-good-test","link":"#🧑‍formula-for-a-good-test","children":[]},{"level":2,"title":"Matching the acceptance criteria","slug":"matching-the-acceptance-criteria","link":"#matching-the-acceptance-criteria","children":[]},{"level":2,"title":"🍞 Bake tests into your development workflow","slug":"🍞-bake-tests-into-your-development-workflow","link":"#🍞-bake-tests-into-your-development-workflow","children":[]},{"level":2,"title":"Review tests in PRs carefully","slug":"review-tests-in-prs-carefully","link":"#review-tests-in-prs-carefully","children":[]},{"level":2,"title":"Don’t skip tests to save time","slug":"don-t-skip-tests-to-save-time","link":"#don-t-skip-tests-to-save-time","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/testing.md"}');export{e as data}; diff --git a/assets/testing.html-61cb9e28.js b/assets/testing.html-52401cfa.js similarity index 94% rename from assets/testing.html-61cb9e28.js rename to assets/testing.html-52401cfa.js index d4b9a1f723..d6cd738196 100644 --- a/assets/testing.html-61cb9e28.js +++ b/assets/testing.html-52401cfa.js @@ -1 +1 @@ -const e=JSON.parse(`{"key":"v-03009c55","path":"/flutter/testing.html","title":"Testing Flutter Apps","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"🧪 Formula for a good test","slug":"🧪-formula-for-a-good-test","link":"#🧪-formula-for-a-good-test","children":[]},{"level":2,"title":"💯 Aim for 100% test coverage","slug":"💯-aim-for-100-test-coverage","link":"#💯-aim-for-100-test-coverage","children":[]},{"level":2,"title":"🧁 Bake testing into your development workflow","slug":"🧁-bake-testing-into-your-development-workflow","link":"#🧁-bake-testing-into-your-development-workflow","children":[]},{"level":2,"title":"🔬 Review tests in PRs carefully","slug":"🔬-review-tests-in-prs-carefully","link":"#🔬-review-tests-in-prs-carefully","children":[]},{"level":2,"title":"👎 Don't skip tests to save time","slug":"👎-don-t-skip-tests-to-save-time","link":"#👎-don-t-skip-tests-to-save-time","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/testing.md"}`);export{e as data}; +const e=JSON.parse(`{"key":"v-03009c55","path":"/flutter/testing.html","title":"Testing Flutter Apps","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"🧪 Formula for a good test","slug":"🧪-formula-for-a-good-test","link":"#🧪-formula-for-a-good-test","children":[]},{"level":2,"title":"💯 Aim for 100% test coverage","slug":"💯-aim-for-100-test-coverage","link":"#💯-aim-for-100-test-coverage","children":[]},{"level":2,"title":"🧁 Bake testing into your development workflow","slug":"🧁-bake-testing-into-your-development-workflow","link":"#🧁-bake-testing-into-your-development-workflow","children":[]},{"level":2,"title":"🔬 Review tests in PRs carefully","slug":"🔬-review-tests-in-prs-carefully","link":"#🔬-review-tests-in-prs-carefully","children":[]},{"level":2,"title":"👎 Don't skip tests to save time","slug":"👎-don-t-skip-tests-to-save-time","link":"#👎-don-t-skip-tests-to-save-time","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/testing.md"}`);export{e as data}; diff --git a/assets/testing.html-8019f3c4.js b/assets/testing.html-d4b84a4a.js similarity index 92% rename from assets/testing.html-8019f3c4.js rename to assets/testing.html-d4b84a4a.js index 5bb78b1be6..4a86aae85a 100644 --- a/assets/testing.html-8019f3c4.js +++ b/assets/testing.html-d4b84a4a.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-0e9bbce2","path":"/android/testing.html","title":"Testing","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Types of Test","slug":"types-of-test","link":"#types-of-test","children":[]},{"level":2,"title":"Requirements","slug":"requirements","link":"#requirements","children":[{"level":3,"title":"New Projects","slug":"new-projects","link":"#new-projects","children":[]},{"level":3,"title":"Legacy Projects","slug":"legacy-projects","link":"#legacy-projects","children":[]}]},{"level":2,"title":"How do I know what to test?","slug":"how-do-i-know-what-to-test","link":"#how-do-i-know-what-to-test","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/testing.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-0e9bbce2","path":"/android/testing.html","title":"Testing","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Types of Test","slug":"types-of-test","link":"#types-of-test","children":[]},{"level":2,"title":"Requirements","slug":"requirements","link":"#requirements","children":[{"level":3,"title":"New Projects","slug":"new-projects","link":"#new-projects","children":[]},{"level":3,"title":"Legacy Projects","slug":"legacy-projects","link":"#legacy-projects","children":[]}]},{"level":2,"title":"How do I know what to test?","slug":"how-do-i-know-what-to-test","link":"#how-do-i-know-what-to-test","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/testing.md"}');export{e as data}; diff --git a/assets/third-party-packages.html-58a49699.js b/assets/third-party-packages.html-6412f1ad.js similarity index 91% rename from assets/third-party-packages.html-58a49699.js rename to assets/third-party-packages.html-6412f1ad.js index 2ef4d20cc1..941d5625ab 100644 --- a/assets/third-party-packages.html-58a49699.js +++ b/assets/third-party-packages.html-6412f1ad.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-9c19581a","path":"/flutter/third-party-packages.html","title":"Using Third-party Packages","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Pub score, popularity, and activity","slug":"pub-score-popularity-and-activity","link":"#pub-score-popularity-and-activity","children":[]},{"level":2,"title":"Null-safety","slug":"null-safety","link":"#null-safety","children":[]},{"level":2,"title":"Review new packages in PRs","slug":"review-new-packages-in-prs","link":"#review-new-packages-in-prs","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/third-party-packages.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-9c19581a","path":"/flutter/third-party-packages.html","title":"Using Third-party Packages","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Pub score, popularity, and activity","slug":"pub-score-popularity-and-activity","link":"#pub-score-popularity-and-activity","children":[]},{"level":2,"title":"Null-safety","slug":"null-safety","link":"#null-safety","children":[]},{"level":2,"title":"Review new packages in PRs","slug":"review-new-packages-in-prs","link":"#review-new-packages-in-prs","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/third-party-packages.md"}');export{e as data}; diff --git a/assets/unit-testing.html-c06fbfe4.js b/assets/unit-testing.html-014818fa.js similarity index 93% rename from assets/unit-testing.html-c06fbfe4.js rename to assets/unit-testing.html-014818fa.js index b902d35edd..88aba4b1ed 100644 --- a/assets/unit-testing.html-c06fbfe4.js +++ b/assets/unit-testing.html-014818fa.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-57e37f2f","path":"/frontend/testing/unit-testing.html","title":"Unit Testing","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Packages","slug":"packages","link":"#packages","children":[{"level":3,"title":"Vue Storybook Test Utils","slug":"vue-storybook-test-utils","link":"#vue-storybook-test-utils","children":[]}]},{"level":2,"title":"Format","slug":"format","link":"#format","children":[{"level":3,"title":"File Convention","slug":"file-convention","link":"#file-convention","children":[]},{"level":3,"title":"Test Structure","slug":"test-structure","link":"#test-structure","children":[]},{"level":3,"title":"Fixtures","slug":"fixtures","link":"#fixtures","children":[]}]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/testing/unit-testing.md"}');export{t as data}; +const t=JSON.parse('{"key":"v-57e37f2f","path":"/frontend/testing/unit-testing.html","title":"Unit Testing","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Packages","slug":"packages","link":"#packages","children":[{"level":3,"title":"Vue Storybook Test Utils","slug":"vue-storybook-test-utils","link":"#vue-storybook-test-utils","children":[]}]},{"level":2,"title":"Format","slug":"format","link":"#format","children":[{"level":3,"title":"File Convention","slug":"file-convention","link":"#file-convention","children":[]},{"level":3,"title":"Test Structure","slug":"test-structure","link":"#test-structure","children":[]},{"level":3,"title":"Fixtures","slug":"fixtures","link":"#fixtures","children":[]}]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/testing/unit-testing.md"}');export{t as data}; diff --git a/assets/visual-regression-testing.html-0422f0c7.js b/assets/visual-regression-testing.html-4faa458a.js similarity index 95% rename from assets/visual-regression-testing.html-0422f0c7.js rename to assets/visual-regression-testing.html-4faa458a.js index f5de8380a3..66ae76628a 100644 --- a/assets/visual-regression-testing.html-0422f0c7.js +++ b/assets/visual-regression-testing.html-4faa458a.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-54eb29ab","path":"/frontend/testing/visual-regression-testing.html","title":"Visual regression testing","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"What is Visual Regression Testing?","slug":"what-is-visual-regression-testing","link":"#what-is-visual-regression-testing","children":[]},{"level":2,"title":"How we use it","slug":"how-we-use-it","link":"#how-we-use-it","children":[]},{"level":2,"title":"Guidelines","slug":"guidelines","link":"#guidelines","children":[{"level":3,"title":"Test your states","slug":"test-your-states","link":"#test-your-states","children":[]},{"level":3,"title":"Test your viewports","slug":"test-your-viewports","link":"#test-your-viewports","children":[]},{"level":3,"title":"Test only the viewports you need","slug":"test-only-the-viewports-you-need","link":"#test-only-the-viewports-you-need","children":[]},{"level":3,"title":"Take the component out of its original context","slug":"take-the-component-out-of-its-original-context","link":"#take-the-component-out-of-its-original-context","children":[]}]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/testing/visual-regression-testing.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-54eb29ab","path":"/frontend/testing/visual-regression-testing.html","title":"Visual regression testing","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"What is Visual Regression Testing?","slug":"what-is-visual-regression-testing","link":"#what-is-visual-regression-testing","children":[]},{"level":2,"title":"How we use it","slug":"how-we-use-it","link":"#how-we-use-it","children":[]},{"level":2,"title":"Guidelines","slug":"guidelines","link":"#guidelines","children":[{"level":3,"title":"Test your states","slug":"test-your-states","link":"#test-your-states","children":[]},{"level":3,"title":"Test your viewports","slug":"test-your-viewports","link":"#test-your-viewports","children":[]},{"level":3,"title":"Test only the viewports you need","slug":"test-only-the-viewports-you-need","link":"#test-only-the-viewports-you-need","children":[]},{"level":3,"title":"Take the component out of its original context","slug":"take-the-component-out-of-its-original-context","link":"#take-the-component-out-of-its-original-context","children":[]}]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/testing/visual-regression-testing.md"}');export{e as data}; diff --git a/assets/vue.html-9fba51c9.js b/assets/vue.html-8a020b09.js similarity index 87% rename from assets/vue.html-9fba51c9.js rename to assets/vue.html-8a020b09.js index f12095edac..e74b9ed5d9 100644 --- a/assets/vue.html-9fba51c9.js +++ b/assets/vue.html-8a020b09.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-a43f7ed2","path":"/frontend/vue.html","title":"Vue","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Linting","slug":"linting","link":"#linting","children":[]},{"level":2,"title":"Spacing between SFC tags","slug":"spacing-between-sfc-tags","link":"#spacing-between-sfc-tags","children":[]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/vue.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-a43f7ed2","path":"/frontend/vue.html","title":"Vue","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Linting","slug":"linting","link":"#linting","children":[]},{"level":2,"title":"Spacing between SFC tags","slug":"spacing-between-sfc-tags","link":"#spacing-between-sfc-tags","children":[]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/vue.md"}');export{e as data}; diff --git a/assets/what-to-test.html-62510e34.js b/assets/what-to-test.html-2442636c.js similarity index 96% rename from assets/what-to-test.html-62510e34.js rename to assets/what-to-test.html-2442636c.js index 639a6794a8..92aa30ceb6 100644 --- a/assets/what-to-test.html-62510e34.js +++ b/assets/what-to-test.html-2442636c.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-64f437db","path":"/frontend/testing/what-to-test.html","title":"","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"What to test?","slug":"what-to-test","link":"#what-to-test","children":[{"level":3,"title":"Key components render","slug":"key-components-render","link":"#key-components-render","children":[]},{"level":3,"title":"Dynamic classes are applied","slug":"dynamic-classes-are-applied","link":"#dynamic-classes-are-applied","children":[]},{"level":3,"title":"Actions/api endpoints are called (with the correct data)","slug":"actions-api-endpoints-are-called-with-the-correct-data","link":"#actions-api-endpoints-are-called-with-the-correct-data","children":[]},{"level":3,"title":"Errors are handled correctly","slug":"errors-are-handled-correctly","link":"#errors-are-handled-correctly","children":[]},{"level":3,"title":"asyncData","slug":"asyncdata","link":"#asyncdata","children":[]}]},{"level":2,"title":"What not to test","slug":"what-not-to-test","link":"#what-not-to-test","children":[{"level":3,"title":"Component methods are called","slug":"component-methods-are-called","link":"#component-methods-are-called","children":[]},{"level":3,"title":"Third party package code","slug":"third-party-package-code","link":"#third-party-package-code","children":[]},{"level":3,"title":"Static data","slug":"static-data","link":"#static-data","children":[]},{"level":3,"title":"Static props","slug":"static-props","link":"#static-props","children":[]}]},{"level":2,"title":"How to test","slug":"how-to-test","link":"#how-to-test","children":[{"level":3,"title":"Keep assertions fixed where possible","slug":"keep-assertions-fixed-where-possible","link":"#keep-assertions-fixed-where-possible","children":[]}]}],"git":{"updatedTime":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/testing/what-to-test.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-64f437db","path":"/frontend/testing/what-to-test.html","title":"","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"What to test?","slug":"what-to-test","link":"#what-to-test","children":[{"level":3,"title":"Key components render","slug":"key-components-render","link":"#key-components-render","children":[]},{"level":3,"title":"Dynamic classes are applied","slug":"dynamic-classes-are-applied","link":"#dynamic-classes-are-applied","children":[]},{"level":3,"title":"Actions/api endpoints are called (with the correct data)","slug":"actions-api-endpoints-are-called-with-the-correct-data","link":"#actions-api-endpoints-are-called-with-the-correct-data","children":[]},{"level":3,"title":"Errors are handled correctly","slug":"errors-are-handled-correctly","link":"#errors-are-handled-correctly","children":[]},{"level":3,"title":"asyncData","slug":"asyncdata","link":"#asyncdata","children":[]}]},{"level":2,"title":"What not to test","slug":"what-not-to-test","link":"#what-not-to-test","children":[{"level":3,"title":"Component methods are called","slug":"component-methods-are-called","link":"#component-methods-are-called","children":[]},{"level":3,"title":"Third party package code","slug":"third-party-package-code","link":"#third-party-package-code","children":[]},{"level":3,"title":"Static data","slug":"static-data","link":"#static-data","children":[]},{"level":3,"title":"Static props","slug":"static-props","link":"#static-props","children":[]}]},{"level":2,"title":"How to test","slug":"how-to-test","link":"#how-to-test","children":[{"level":3,"title":"Keep assertions fixed where possible","slug":"keep-assertions-fixed-where-possible","link":"#keep-assertions-fixed-where-possible","children":[]}]}],"git":{"updatedTime":1701428970000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"frontend/testing/what-to-test.md"}');export{e as data}; diff --git a/backend/apis.html b/backend/apis.html index fbbf989220..8c3f49ec40 100644 --- a/backend/apis.html +++ b/backend/apis.html @@ -24,7 +24,7 @@ APIs | Netsells Code Standards - +

APIs

The majority of APIs we build (and interact with) are in the JSON format.

Responses

Eloquent API Resources, Fractal or 🤔

There are various ways and packages which enable you to use a layer to transform/format your data before it is returned via your api - Transformers if you will...

Eloquent - API Resources

Built directly into the core of Laravel, so no external packages are required. Can be used for both simple and complex APIs, does lack some more complex functionality such including nested data.

Documentation – Eloquent: API Resourcesopen in new window

Fractal

An external package maintained by The PHP League. Suitable for complex APIs - overkill for small APIs. Does require additional code to be added for instantiation (spatie/laravel-fractalopen in new window adds this).

Documentation - Fractalopen in new window

GraphQL

🤯

Namespaced Data

Data in responses should be namespaced under a data key. This allows for additional metadata, such as pagination to be returned alongside the response data.

❌  Incorrect

[
@@ -47,6 +47,6 @@
 	"meta": {}
 }
 

Naming of Properties

Properties in responses must be named using snake_case.

- + diff --git a/backend/general.html b/backend/general.html index 51d4c5f0d5..d4a6c51636 100644 --- a/backend/general.html +++ b/backend/general.html @@ -24,10 +24,10 @@ General | Netsells Code Standards - +

General

This section contains general guidelines that should be adhered to despite the technology used by the backend developer.

Case Conventions

ItemConventionExample
JSON Responsesnake_case"first_name": "Geoff",
Database names, tables and columnssnake_caseyour_parking_space
URL Parameterssnake_case/show?include_extra_info=true
GitHub Repositoriesslug-caseyour-parking-space
Laravel Configuration (Values)snake_caseconfig.services.aws.access_key
Laravel Config (Filenames)slug-caseyour-parking-space.php
Laravel Routes (Name)slug-caseprofile.your-account
Laravel Routes (URI)slug-caseprofile/your-account
- + diff --git a/backend/hatchly.html b/backend/hatchly.html index b8d4f46ec6..614c719dfb 100644 --- a/backend/hatchly.html +++ b/backend/hatchly.html @@ -24,10 +24,10 @@ Hatchly | Netsells Code Standards - +

Hatchly

This section of documentation relates to the use of features within the Hatchly CMS platform developed by Netsells.

Section and Attribute key casing

Section and attribute keys should always be lowercase and should follow the snake_case pattern. This makes it consistent with other object values, and allows consistent behaviour with when accessed from the page model ($page->attribute), via the hatchly-pages-api endpoint and when passing directly into javascript.

Keeping Sections DRY

If your templates share common template sections, it's important to remember to keep the code DRY and extract this code to a commonly accessible location. To do so you can simply create a class which extends the Hatchly\Pages\Attributes\Section class. For example:

This should then be used within the template file as you would a normal section class.

- + diff --git a/backend/index.html b/backend/index.html index 4f2f0849cf..99b74bab19 100644 --- a/backend/index.html +++ b/backend/index.html @@ -24,10 +24,10 @@ Backend | Netsells Code Standards - + - + diff --git a/backend/laravel.html b/backend/laravel.html index c1c7832603..6e31041f57 100644 --- a/backend/laravel.html +++ b/backend/laravel.html @@ -24,7 +24,7 @@ Laravel | Netsells Code Standards - +

Laravel

Models

Ordering

Our preferred ordering of items within a Laravel Model class is as follows:

  • Traits
  • Constants
  • Laravel specific fields ($table, $guarded, $fillable etc)
  • Public fields
  • Private fields
  • Relations
  • Scopes
  • Other Methods

Routing

The following guidelines are applicable to Laravel's Routingopen in new window.

Method definitions

Laravel provides a few differing ways to define routing within your application. When defining routes, explicit is the way to go - using Laravel magic 🧙‍♂️ like resources can make code difficult to understand.

❌  Incorrect

Route::post(...);
@@ -46,6 +46,6 @@
     'as' => 'profile',
 ]);
 

Validation

Validation for request should be implemented by adding the validation rules to the rules() method on Request classes where possible - these help encapsulate validation and authorisation for the request. We discourage using Validator::make() unless it is absolutely necessary and Request classes can not be utilised.

- + diff --git a/backend/php.html b/backend/php.html index ae05efdcab..81bf87ffd9 100644 --- a/backend/php.html +++ b/backend/php.html @@ -24,10 +24,10 @@ PHP | Netsells Code Standards - + - + diff --git a/backend/recommended-packages.html b/backend/recommended-packages.html index 511f6cc5a9..8dff2864b0 100644 --- a/backend/recommended-packages.html +++ b/backend/recommended-packages.html @@ -24,10 +24,10 @@ Recommended Packages | Netsells Code Standards - +

Recommended Packages

During development we use a lot of 3rd party packages within our code. To ensure we are using trusted packages which follow all of our policies, we have documented any tried and tested packages below. We recommend you utilise these packages in your project, or add to this list any alternatives that may serve your specialist purpose, while also ensuring they meet our policies.

Example

Package Name: Example Package


Link: GitHub Link


Description: A description of the package


Features

  • A list of key packages features which are useful

Proof of Concept / Projects used on


If a proof of concept has been produced and is available on GitHub then link it here. If there is no PoC then provide a list of projects where the package has been actively been used as a point of reference.

- + diff --git a/dotNet/c-sharp.html b/dotNet/c-sharp.html index 34b812a048..57f1582e0d 100644 --- a/dotNet/c-sharp.html +++ b/dotNet/c-sharp.html @@ -24,7 +24,7 @@ C# | Netsells Code Standards - +

C#

Naming Conventions

Object NameNotation
Class namePascalCase
Constructor namePascaCase
Method NamePascalCase
Method argumentscamelCase
Local varablescamelCase
Constants namePascalCase
Private field name_camelCasePrefixedWithUnderscore
Property namePascalCase
Enum type namePascalCase

Layout

Write only one statement per line.

Write only one declaration per line.

Continuation lines should be indented at least one tab stop, in a way that expresses the structure of the statement.

Add at least one blank line between method definitions and property definitions.

Use blank lines to separate code into logical groups

Use parentheses to make clauses in an expression apparent:

if ((val1 > val2) && (val1 > val3))
@@ -226,6 +226,6 @@
 	return (value == null || value.Length == 0);
 }
 

Commenting

Place the comment on a separate line, not at the end of a line of code.

Begin comment text with an uppercase letter.

End comment text with a period.

Data Types

In general, use int rather than unsigned types. The use of int is common throughout C#, and it is easier to interact with other libraries when you use int.

- + diff --git a/dotNet/general-guidelines.html b/dotNet/general-guidelines.html index 8dfc9bf0d8..cbf7a94178 100644 --- a/dotNet/general-guidelines.html +++ b/dotNet/general-guidelines.html @@ -24,7 +24,7 @@ General Guidelines | Netsells Code Standards - +

General Guidelines

All points here here are general guidelines only - break them if you have a good reason (but only if you have a good reason).

EF and DB

DB interaction should be through entity framework - only use custom sql / stored procedure etc. when absolutely necessary.

Use of automapper projections is strongly encouraged.

Db interaction should be contained in repository classes

Primary db interactions should be via ICommonRepository or equivalent.

Filtering should be done primarily through IEntityFilter implementations. Avoid complex filters - use IMultiPartFilter when possible.

Ordering should be done primarily through IEntity order implementations.

Avoid EF includes where possible - nothing outside the repository method which is accessing the db and the service directly cosuming it should assume any navigation properties are populated.

Automapper

Automapper should be used for simple type mappings.

Mappings from db entities to model should take care to only use simple mappings so they can be executed in SQL by EF.

Do not put complex logic in automapper profiles - if you need a custom resolver or any services injected then use an explicit mapping service.

Controllers and services

Business logic should be kept out of controllers. Controllers should only contain logic for interfacing between request and service actions.

Entity classes should not be used as request / result models - add a model with a mapping.

Async

Where possible, all interactions with external services / dbs / filesystems etc. should be async.

Avoid using Task.Result or equivalents - use async / await.

Request validation and exceptions

Where possible requests should be validated.

Use Fluent Validation.

Where practical validation should be separated from action logic and performed before any other actions.

Any caught exceptions should be logged. Don't swallow exceptions.

Don't add try catch blocks which then throw a generic exception e.g.:

try
@@ -37,6 +37,6 @@
 	throw new SomethingWentWrongException()
 }
 

Services and dependency Injection

Code should be logically divided into services, connected via interfaces using dependency injection.

All services should have a single purpose.

Services should usually only have a few external methods - services with lost of methods generally have too many responsibilities.

Each logical code area should have its own service registration extension.

Services should generally be registered as either scoped or transient. Be extremely careful registering anything as static scope.

External interactions

Interaction with external API or other resources should be implemented behind a facade service. It's usually impractical to unit test these facade services.

Unit Tests

Where practical, all code should be unit tested.

Unit test should be in their own project.

Each service should have a folder for its unit tests, named after the class e.g. MyClassTests.

Each public method in a service should have it's own test file named for the method e.g. GetTheDataTests.

Services with multiple public methods should have a test base class dealing with initialisation etc.

Unit test for filters and orders do not need a folder - they can have a single file named for the filter e.g. MyFilterTests.

Use Moq and FluentAssertions.

- + diff --git a/dotNet/index.html b/dotNet/index.html index af710079dd..7b34ca56ca 100644 --- a/dotNet/index.html +++ b/dotNet/index.html @@ -24,10 +24,10 @@ DotNet | Netsells Code Standards - + - + diff --git a/dotNet/recommended-packages.html b/dotNet/recommended-packages.html index 33893ebb9a..99ddc5f514 100644 --- a/dotNet/recommended-packages.html +++ b/dotNet/recommended-packages.html @@ -24,10 +24,10 @@ Recommended Packages | Netsells Code Standards - +

Recommended Packages

During development we use a lot of 3rd party packages within our code. To ensure we are using trusted packages which follow all of our policies, we have documented any tried and tested packages below. We recommend you utilise these packages in your project, or add to this list any alternatives that may serve your specialist purpose, while also ensuring they meet our policies.

Example

Package Name: Example Package


Link: GitHub Link


Description: A description of the package


Features

  • A list of key packages features which are useful

Proof of Concept / Projects used on


If a proof of concept has been produced and is available on GitHub then link it here. If there is no PoC then provide a list of projects where the package has been actively been used as a point of reference.

- + diff --git a/flutter/codesigning.html b/flutter/codesigning.html index 05104f4c5e..416f0dac4c 100644 --- a/flutter/codesigning.html +++ b/flutter/codesigning.html @@ -24,7 +24,7 @@ Codesigning | Netsells Code Standards - +

Codesigning

For the iOS part of Flutter apps, we use Fastlane Matchopen in new window to manage signing certificates and provisioning profiles.

For each project we should create a new certificates repo that matches the main code repo naming conventions. e.g my-project-certificates

This means that should the project ever need to be transferred or outsource engineers added to the repo, we don't have to expose all other projects certificates and profiles.

git_url("{ URL of the certificates repo }")
@@ -39,6 +39,6 @@
 $ bundle exec fastlane match adhoc -u example.user@netsells.co.uk
 $ bundle exec fastlane match appstore -u example.user@netsells.co.uk
 
- + diff --git a/flutter/continuous-delivery.html b/flutter/continuous-delivery.html index c134443584..a2e153f60e 100644 --- a/flutter/continuous-delivery.html +++ b/flutter/continuous-delivery.html @@ -24,10 +24,10 @@ Continuous Delivery | Netsells Code Standards - +

Continuous Delivery

We use GitHub Actions to run our CD pipelines. These workflows enable us to automatically publish versions of the app to Firebase App Distribution for internal testing, and to the App Store/Play Store for public release.

Most projects are setup with 2 workflows:

  • qa, which compiles staging versions of the app and deploys them to Firebase App Distributionopen in new window
  • production, which compiles production versions of the app and delivers them to App Store Connect and Google Play
    • Note that this workflow does not automatically publish the new version; this should be done manually

Workflows can be triggered manually at any time using the GitHub Actions UI.

- + diff --git a/flutter/continuous-integration.html b/flutter/continuous-integration.html index 6cadb49b66..ec13690176 100644 --- a/flutter/continuous-integration.html +++ b/flutter/continuous-integration.html @@ -24,10 +24,10 @@ Continuous Integration | Netsells Code Standards - + - + diff --git a/flutter/crash-reporting.html b/flutter/crash-reporting.html index 03fdbeca75..0e4f6f8c43 100644 --- a/flutter/crash-reporting.html +++ b/flutter/crash-reporting.html @@ -24,7 +24,7 @@ Crash Reporting | Netsells Code Standards - + - + diff --git a/flutter/index.html b/flutter/index.html index 77021cddb5..ed84b69896 100644 --- a/flutter/index.html +++ b/flutter/index.html @@ -24,10 +24,10 @@ Legacy Flutter Projects | Netsells Code Standards - + - + diff --git a/flutter/legacy/architecture.html b/flutter/legacy/architecture.html index 8488fc8bed..d3594a05c6 100644 --- a/flutter/legacy/architecture.html +++ b/flutter/legacy/architecture.html @@ -24,7 +24,7 @@ Architecture Layers | Netsells Code Standards - +

Architecture Layers

Architecture

Flutter projects should contain 4 distinct layers: presentation, application, domain, and infrastructure.

🥞 Layer Definitions

✨ Presentation Layer

The presentation layer should only contain Widgets. Use this layer to implement your user interface.

As much as possible, Widget classes should be free of business logic. Form validation is a reasonable exception to this rule.

Classes in the presentation layer should depend on classes from the application and domain layers.

🤖 Application Layer

This is the main business logic layer of the application, and should contain BLoCs, Cubits, and use-cases.

These classes should depend on entity/value-object classes and repository interfaces from the domain layer.

💭 Domain Layer

Defines the core business domain, including entities, value-objects, and repository interfaces.

These classes should be pure Dart (no Flutter imports) and should not depend on any other layers.

🗄 Infrastructure Layer

This layer contains implementations of the repository interfaces from the domain layer. Repository implementations may depend on other classes like data sources or REST API services.

It's a good idea to use Data Transfer Objects (DTOs) which represent the structure of the data returned from external services. These can then be converted to and from your entity classes. This ensures the entities are not dependent on the data structure of objects returned from external services.

💉 Dependency Injection

get_it + injectable is a fantastic way of implementing dependency injection.

BLoCs and Cubits should be injected into the widget tree using BlocProvider. This allows the BLoC/Cubit to be accessible to all children via BlocProvider.of(context). It also allows BlocListener, BlocBuilder, and BlocConsumer to find instances automatically, and ensures the closure of underlying Streams are handled automatically.

BlocProvider(
@@ -43,6 +43,6 @@
 |- main_production.dart
 |- main_staging.dart
 
  • app/ contains anything to do with the top-level App widget, which may include theming, routing/navigation, and other app-wide functionality.
  • core/ can contain anything which can be used throughout the application, like common widgets, models/entities, or services.
    • The core directory should be split into sub-directories based on the architecture layers e.g. domain, presentation etc.
  • di/ contains dependency injection code, such as environment definitions and modules
  • features/ is where we put our feature-specific code. Each feature should have its own sub-directory, within which we have further sub-directories for architecture layers.
  • l10n/ contains internationalization code, as per the Flutter Internationalization guide.
  • Any entry-points for the application (e.g. main_staging.dart) should sit at the top-level rather than within any directories.

🏛 Architecture Best Practices

  • Stateful Widgets should only be used when absolutely necessary (e.g. when building a form). Most of the time, it's better to use a BLoC with a Stateless Widget.
  • As much as possible, classes should depend on interfaces (implemented as abstract classes in Dart), not implementations.
- + diff --git a/flutter/legacy/handling-errors.html b/flutter/legacy/handling-errors.html index c9677c06fb..b5eb70bf81 100644 --- a/flutter/legacy/handling-errors.html +++ b/flutter/legacy/handling-errors.html @@ -24,7 +24,7 @@ Handling Error | Netsells Code Standards - +

Handling Error

Principles

  • There is a difference between errors and exceptions.
    • Errors are things that could happen, but are not considered exceptional e.g. a network error.
    • Exceptions are things that are exceptional e.g. a StackOverflowError. If these happen, a developer has made a mistake.
  • When errors occur, we should fail elegantly in a way that informs the user of the error and suggests a solution.
  • When exceptions occur, we treat them as bugs which should be fixed.
  • When a method could return an error, we should communicate this explicitly in the return type. This encourages developers to handle error cases.

Implementing Error Handling

Our preferred method of error handling is to use the Either<T, U> type, provided by the dartzopen in new window package. T is the type of the error, and U is the type of the successful result.

Error types may, minimally, be simple Strings or ints, but ideally should be Failure classes which encapsulate the details of the error.

Remember that we should only be handling errors we expect to happen, like 4xx responses from network requests.

Here's an example a method which could return a Failure or a String:

Either<Failure, String> nthItem(List<String> items, int n) {
@@ -35,6 +35,6 @@
     }
 }
 
- + diff --git a/flutter/legacy/index.html b/flutter/legacy/index.html index 3fd299a9ee..cf306d5200 100644 --- a/flutter/legacy/index.html +++ b/flutter/legacy/index.html @@ -24,10 +24,10 @@ Netsells Code Standards - + - + diff --git a/flutter/legacy/localization.html b/flutter/legacy/localization.html index 1a5db3cdc4..1d6d51b6a5 100644 --- a/flutter/legacy/localization.html +++ b/flutter/legacy/localization.html @@ -24,10 +24,10 @@ Localizing Flutter Apps | Netsells Code Standards - + - + diff --git a/flutter/legacy/state-management.html b/flutter/legacy/state-management.html index 948338cabf..57df9f0023 100644 --- a/flutter/legacy/state-management.html +++ b/flutter/legacy/state-management.html @@ -24,7 +24,7 @@ State Management using Bloc | Netsells Code Standards - +

State Management using Bloc

There are a number of patterns and packages available to handle state management. Our preferred pattern is Blocopen in new window.

Writing Blocs

File Structure

Each Bloc should be composed of 3 files with the following naming convention:

  • subject_bloc.dart - Contains the Bloc class itself
  • subject_state.dart - Contains the state definition(s)
  • subject_event.dart - Contains the event definition(s)

They should be linked using Dart's part syntax:

// subject_bloc.dart
@@ -74,6 +74,6 @@
     }
 }
 

Using Blocs

Always use BlocProvider to inject your Blocs into the widget tree. BlocProvider has a couple of important advantages:

  • Automatically handles Bloc creation and closure
  • Makes the Bloc available to all children below the Provider in the tree

BlocProvider allows us to very easily manage the scope of each Bloc in our project. Some Blocs apply to individual screens, where as some Blocs are useful throughout the application (e.g. blocs handling authentication state). Use this fact to your advantage, and don't be afraid to wrap the whole MaterialApp in a BlocProvider!. It's a great way to maintain a single source of truth for the state of your app.

Tip: Use MultiBlocProvider to provide multiple Blocs without having to nest loads of individual BlocProviders.

- + diff --git a/flutter/linting-rules.html b/flutter/linting-rules.html index b9569e39fa..0a207067ab 100644 --- a/flutter/linting-rules.html +++ b/flutter/linting-rules.html @@ -24,10 +24,10 @@ Linting & Static Analysis Rules | Netsells Code Standards - + - + diff --git a/flutter/monarch.html b/flutter/monarch.html index 101862e45b..653845261a 100644 --- a/flutter/monarch.html +++ b/flutter/monarch.html @@ -24,10 +24,10 @@ Monarch | Netsells Code Standards - +

Monarch

Monarchopen in new window is our preferred tool for previewing widgets in isolation. It includes a desktop app which allows you to create and view 'stories' without having to worry about dependencies.

Monarch allows you to either have stories within the lib/ directory, or within their own top-level stories/ directory. We strongly prefer organising stories into a top-level stories/ directory, with the directory structure mirroring that of the lib/ directory.

We don't require that stories be written for every single widget; we simply provide Monarch as an option to make life easier during development.

Please refer to the Monarch documentationopen in new window for more information on setup, usage, and troubleshooting.

- + diff --git a/flutter/multiple-firebase-environments.html b/flutter/multiple-firebase-environments.html index bedf37a4cd..d3aab9f043 100644 --- a/flutter/multiple-firebase-environments.html +++ b/flutter/multiple-firebase-environments.html @@ -24,7 +24,7 @@ Multiple Firebase Environments | Netsells Code Standards - +

Multiple Firebase Environments

If you're using Firebase for your Flutter app, you must set up multiple environments for staging and production versions of the app. This ensures that any data is kept separate, and access can be tailored to suit the environment.

This guide will take you through the process of configuring a Flutter app to work with multiple Firebase projects.

Step 1: Create Firebase projects

You'll need to create 2 Firebase projects in the usual way for your app. Our naming convention is [App Name] - [Environment].

For example, for Flexed, our projects are:

  • Flexed - Staging
  • Flexed - Production

Within each project, create iOS and Android apps. Ignore the setup steps for now, but download the relevant configuration files (the google-services.json and GoogleService-Info.plist files).

The bundle IDs should be the same except that the staging IDs should have the .stg suffix:

  • Staging: uk.co.flexed.stg
  • Production: uk.co.flexed

Finally, set up any Firebase products you may need (App Distribution, Analytics etc).

Step 2: Set up Firebase in your app

Follow the setup steps linked hereopen in new window to integrate Firebase into your app, including the platform-specific installation guides for iOS and Android. However, don't add the configuration files yet.

Step 3: Android configuration setup

We first need to create product flavors for the staging and production environments. In the android/app/build.gradle file, in the android section, add the following:

flavorDimensions "env"
@@ -51,6 +51,6 @@
 fi
 
 

This script will copy the relevant PLIST file into the final app binary.

Step 5: Run or build using the correct flavor

Now, whenever you build or run the app, simply add --flavor staging or --flavor production to the command to specify which flavour you need.

- + diff --git a/flutter/naming-widgets.html b/flutter/naming-widgets.html index c7bf94f9cb..d4b45283bb 100644 --- a/flutter/naming-widgets.html +++ b/flutter/naming-widgets.html @@ -24,12 +24,12 @@ Naming Widgets | Netsells Code Standards - + - + diff --git a/flutter/project-setup.html b/flutter/project-setup.html index 4875abe6cd..9dd8f0ff21 100644 --- a/flutter/project-setup.html +++ b/flutter/project-setup.html @@ -24,11 +24,11 @@ Setting up a Flutter Project | Netsells Code Standards - +

Setting up a Flutter Project

An example of this setup can be found at https://github.com/netsells/example-flutteropen in new window

1️⃣ Create a repository using the template

  1. Go to the template repositoryopen in new window and click Use this template, then Create a new repository.
  2. Fill in the repository details and click Create repository from template. Wait for the repository to generate.
  3. Once the repository is generated, clone it to your machine:
git clone git@github.com:netsells/flutter-example
 
  1. Follow the instructions in README.md to make sure the bundle identifier/package name, and app name are all set correctly.

2️⃣ Setup Firebase

  1. Use the instructions on the Firebase websiteopen in new window to set up a Firebase project for your app.

Please note that we no longer create multiple Firebase projects for our apps; both staging and production environments live in one Firebase project to simplify configuration.

Don't forget to add the staging app IDs to Firebase, as well as the production ones.

  1. Add FIREBASE_IOS_APP_ID and FIREBASE_ANDROID_APP_ID secrets to your GitHub repository, under SettingsSecrets and variablesActions. Remember to use the staging app IDs here.

3️⃣ Set up Fastlane Match

  1. Ensure you have registered your app identifiers in the client's Apple Developer Accountopen in new window. Again, remember to include the staging version (the same as the normal version, but with .stg suffixed.
  2. Ensure you have at least one iOS device registered in the Apple Developer account
  3. Create a GitHub repository for your certificates e.g. netsells/example-flutter-certificates
  4. Generate a password to use for Match storage, and save it in 1Password
  5. Find your Apple Team ID and add it to ios/fastlane/Matchfile
  6. Using your terminal, move to the ios directory and run bundle install
  7. Then run the following commands:
    • bundle exec fastlane match development
    • bundle exec fastlane match adhoc
    • bundle exec fastlane match appstore
  8. Open the iOS project in Xcode, switch off Automatic Signing, and configure the various build configurations to use the appropriate provisioning profiles
  9. Commit and push your changes

4️⃣ Set up Sentry

  1. Go to the Project Creation screenopen in new window in Sentry and create a new project
  2. Copy the DSN into the credentials.dart file
  3. Commit and push your changes

5️⃣ Set up Mixpanel

This can be done a bit later if it's not possible at the start of the project.

  1. Once the client has provided you with Mixpanel access, copy the token into credentials.dart
  2. Commit and push your changes

6️⃣ Set up Production Deployment

This can be done a bit later if it's not possible at the start of the project.

  1. Collect a service account JSON file from the client, and add its contents as an Actions Secret in your project's repository settings, with the following key: SERVICE_ACCOUNT_JSON
  2. Set up your Apple App Store listing and copy the app's Apple ID into the Fastfile where indicated
  3. Commit and push your changes
- + diff --git a/flutter/recommended-packages.html b/flutter/recommended-packages.html index 6d23a8705e..a33197875e 100644 --- a/flutter/recommended-packages.html +++ b/flutter/recommended-packages.html @@ -24,10 +24,10 @@ Recommended Packages | Netsells Code Standards - +

Recommended Packages

PackagePurposeUsed inLatest Version
animationsopen in new windowBeautiful pre-built Material animations/transitionsHandheld Healthopen in new windowPub Version
dioopen in new windowHTTP RequestsEverythingPub Version
oauth_interceptoropen in new windowOven-ready OAuth 2 for Dio and RiverpodHGVTopen in new windowPub Version
http_mock_adapteropen in new windowEasily mock HTTP requests in testsHGVTopen in new windowPub Version
retrofitopen in new windowAuto-generate HTTP request code for Dio.EverythingPub Version
freezedopen in new windowData classes and sealed unionsEverythingPub Version
flutter_riverpodopen in new windowPreferred dependency injection and state management packageHGVTopen in new windowPub Version
flutter_secure_storageopen in new windowSave encrypted key-value pairsEverythingPub Version
clockopen in new windowMake DateTime testable!EverythingPub Version
jiffyopen in new windowPowerful DateTime utilitiesEverythingPub Version
dartzopen in new windowFunctional programming in DartHandheld Healthopen in new windowPub Version
modal_bottom_sheetopen in new windowPlatform-adaptive modal bottom sheetsPub Version
netsells_flutter_analysisopen in new windowNetsells lint rulesEverythingPub Version
go_routeropen in new windowPreferred navigation and routing packageHGVTopen in new windowPub Version
- + diff --git a/flutter/security-practices.html b/flutter/security-practices.html index f497ccb680..a248a39fa6 100644 --- a/flutter/security-practices.html +++ b/flutter/security-practices.html @@ -24,7 +24,7 @@ Security Best Practices | Netsells Code Standards - +

Security Best Practices

Detecting jailbroken/rooted devices

Apps should be prevented from running on unsafe devices. A device is deemed to be unsafe if it is:

  • Jailbroken
  • Rooted
  • An emulator
  • Using mock location
  • Running on external storage (Android only)

This can be achieved using the safe_deviceopen in new window package:

import 'package:safe_device/safe_device.dart';
@@ -35,6 +35,6 @@
   }
 }
 

Important: To enable development on a simulator/emulator, you should first check if your app is running in debug mode. If so, we can ignore the safety check.

Store authentication tokens securely

Any data stored on the user's device, particularly secure data such as authentication tokens, must be stored using encryption. This is easily achievable using the flutter_secure_storageopen in new window package.

Ideally, all data stored on the user's device should be encrypted. Database/persistence packages such as hiveopen in new window support encrypted storage out-of-the-box.

- + diff --git a/flutter/state-management.html b/flutter/state-management.html index fff241411d..647d87fc56 100644 --- a/flutter/state-management.html +++ b/flutter/state-management.html @@ -24,7 +24,7 @@ State Management and DI | Netsells Code Standards - +

State Management and DI

Our preferred package for state management and dependency injection is Riverpodopen in new window.

Prefer using watch over read

In general, use ref.watch rather than ref.read. This ensures that provider values stay up-to-date.

An important exception is when writing callbacks (e.g. onTap listeners); in these cases you should always use ref.read.

Avoid injecting WidgetRefs into classes

This ensures that classes are decoupled from Riverpod.

❌  Incorrect

// Riverpod-coupled Repository
@@ -67,6 +67,6 @@
     );
 }
 
- + diff --git a/flutter/testing.html b/flutter/testing.html index 8274639a37..abd62a4367 100644 --- a/flutter/testing.html +++ b/flutter/testing.html @@ -24,10 +24,10 @@ Testing Flutter Apps | Netsells Code Standards - +

Testing Flutter Apps

Comprehensive automated tests are a crucial component of a healthy codebase. Not only do they allow behaviour to be continuously verified as changes are made to a project; they also encourage good development habits, boost productivity, and serve as living documentation for the intended functionality of your code.

Thankfully, Flutter's testing APIs make it easy to write a comprehensive test suite.

Summary

  • Use a "given-when-then" structure for tests
  • Aim for 100% test coverage
  • Bake testing into your development workflow
  • Review tests in PRs carefully
  • Don't skip tests to save time

🧪 Formula for a good test

A good test has 3 steps:

  1. Set up
  2. Act
  3. Assert

This can also be thought of as a "given-when-then" structure. For example:

Given the Home screen is displayed, when I tap the Floating Action Button, then the Add Todo widget should be displayed.

Here are some signs you might be writing a bad test:

  • The goal of the test is unclear
  • The test has multiple reasons to fail
  • The test contains artificial delays
  • The test has hidden or internal dependencies
  • There are no assertions, expectations, of verifications
  • The order in which a test is executed affects its result

💯 Aim for 100% test coverage

Test coverage is a fairly blunt measure of how effective your tests are, but it's the best one we have. Increasing test coverage can never be a bad thing, and the higher the coverage, the more confident we can be in our code.

Tips for higher test coverage coverage

  • If you're struggling, bring in another developer to help
  • Don't test individual classes! This is a common trap developers fall into. Test at the widget-level using real internal dependencies.
  • Only mock external dependecies. Mocking internal dependencies couples your test to the implementation and means that making changes down-the-line is much harder. If you find yourself needing a mock for an internal dependency, consider whether you're testing at the right level.
  • Practice Test-Driven Development, particularly when making changes to existing functionality or fixing bugs. It's a great way of ensuring tests continue to pass and that edge-cases are covered as they are discovered.
  • For code which genuinely cannot be tested (e.g. packages which use top-level or static methods, or platform channels), make use of the // coverage:ignore-* rules. This excludes the file from being included in coverage measurements. Watch out for abuses of this functionality when reviewing PRs!
    • // coverage:ignore-file
    • // coverage:ignore-start and // coverage:ignore-end
    • // coverage:ignore-line

🧁 Bake testing into your development workflow

Tests are easiest to write when the functionality under test is already in your mind. It's much more taxing to go back and write tests for a bunch of functionality you wrote a few days or weeks ago.

To that end, bake testing into your development workflow. You could use a framework like Test-driven Development (TDD), or simply write tests for each class immediately after you've written the production code. Do whatever works for you.

🔬 Review tests in PRs carefully

Even with 100% line coverage, it's extremely important that tests are reviewed manually during the code review process. When reviewing tests, look out for these red flags:

  • Tests with no assertions, expectations, or verifications
  • Tests which have obviously been written just to satisfy the coverage requirement
  • Not all logical branches are tested (e.g. only the right-hand-side of a ternary operator)
  • Only testing the "happy path"
  • Abuses of the // coverage:ignore-* rules

👎 Don't skip tests to save time

Skipping tests saves you time today, but this time saving doesn't come for free. You exchange this time for technical debt.

Fundamentally, an untested codebase cannot scale efficiently, and will become more and more difficult to work with over time. The time you save now by not writing a test will need to be paid back - with significant interest - later down the line.

Be firm on this principle when working with non-technical staff. Project timelines should and must include sufficient time for developers to write high-quality, well-tested code, and any estimates you give must include time for adding/updating tests. There is no such thing as "pushing to get this over the line"; writing good code takes as long as it needs to.

- + diff --git a/flutter/third-party-packages.html b/flutter/third-party-packages.html index ea0ad0374b..a70fea8bb9 100644 --- a/flutter/third-party-packages.html +++ b/flutter/third-party-packages.html @@ -24,10 +24,10 @@ Using Third-party Packages | Netsells Code Standards - +

Using Third-party Packages

Third-party packages and plugins are a great way to speed up development. Instead of implementing something from scratch, you can pull in a package which provides a ready-made implementation.

We encourage the use of third-party packages in our projects, with a few important considerations.

Pub score, popularity, and activity

On pub.devopen in new window, packages are given a scoreopen in new window based on their quality. Their popularity is also measured as a percentage.

It's important to check these metrics before you decide to use a package. They are generally good indicators of the state of the package.

It may also be a good idea to look at the package's GitHub repository and check:

  • How long ago the latest commit was
  • How many stars it has

If the package hasn't been updated for a number of months, it's possible that the package has become abandoned. It's extremely inadvisable to depend on abandoned or poorly maintained packages in your project.

Null-safety

Our Flutter projects use sound null-safety. It's therefore crucial that any packages also use sound null-safety.

On pub.dev, you can filter search results to show only null-safe packages:

Pub null-safety filter

Review new packages in PRs

If you're reviewing a pull request and notice that a new dependency has been added, take a minute to look it up on pub.dev to verify it's safe to use in the project. Feel free to ask the submitter to justify their dependency on the package. Depending on a poorly maintained or abandoned package will cause problems for the whole team in future, so it's important to get a second pair of eyes on any new dependencies.

- + diff --git a/frontend/accessibility.html b/frontend/accessibility.html index 9eaea798c8..8f13af0847 100644 --- a/frontend/accessibility.html +++ b/frontend/accessibility.html @@ -24,10 +24,10 @@ Accessibility | Netsells Code Standards - + - + diff --git a/frontend/automated-workflows.html b/frontend/automated-workflows.html index 1a4cef7c80..3cda493767 100644 --- a/frontend/automated-workflows.html +++ b/frontend/automated-workflows.html @@ -24,10 +24,10 @@ Automated Workflows | Netsells Code Standards - +

Automated Workflows

We utilise automated workflows to ensure the code we're producing meets the standards defined by our automated linting tooling, and quality guidelines from our coding standards and visual accuracy. These actions are triggered as part of our pull request process via GitHub actions.

Linting

To enforce our linting rules we have a defined composite action for each linting package:

See it in action here:

Visual Regression Testing

As part of our Visual Regression Testing guidelines, we have a workflow for generating and approving the changes to ensure they are accurate to design, and do not introduce any visual regressions in other areas of the app.

When a PR is created, the workflow will run and generate a couple of things:

  • Summary of changes introduced in this PR, broken down by modified, created and deleted
  • A link to the Visual Regression Testing results

The composite action responsible for this workflow can be seen hereopen in new window.

See it in action here:

Tests

Tests are an important part of our workflow, and ensure that our code is rigid and free from errors as much as possible. To ensure that new code does not break any existing tests, we have a workflow set up to automatically run the test suite of the codebase.

The composite action for this workflow can be seen hereopen in new window.

See it in action here:

- + diff --git a/frontend/css.html b/frontend/css.html index e235d57d37..aa5c988acf 100644 --- a/frontend/css.html +++ b/frontend/css.html @@ -24,10 +24,10 @@ CSS | Netsells Code Standards - +

CSS

Preprocessor

We use the SASS preprocessor to structure our CSS, specifically using the more familiar SCSS syntax.

CSS Framework

We make use of the latest version of the bootstrap framework to structure our web applications. We utilise this at the source level and compile it ourselves with our own project-specific variables. This means we overwrite less of the bootstrap defaults in additional code, and means we can only import what our application needs to cut down the size of our compiled stylesheet. We make use of framework provided mixins to minimise DOM bloat by combining multiple mixins into a single semantic class name.

Linting

We make use of an automated approach of enforcing CSS code standards. These standards are constantly evolving to ensure we are making use of the best methods, and in order to catch more edge cases ensuring our code is consistent across the board.

See Stylelint.

Class and ID casing

Classes and IDs should always be hyphenated, as opposed to camelCase, snake_case or any mixture of the two.

CSS Methodology

We don't clutter our CSS with any specific methodologies. When writing CSS in Vue components, they are namespaced or "scoped" by default to the elements in the current component. This means that it's highly unlikely that there will be style clashes.

Doing this allows us to concentrate on readable and meaningful class names without cluttering up the DOM or our source with manually namespaced selectors.

Nesting and Awareness of Specificity Levels

When using Pre-processors such as SCSS, it's easy to get carried away with nesting selectors. This quickly adds up, and you end up with CSS rules which are almost impossible to override from external sources without bloating the selector with a higher specificity.

As a rule, selectors should not be nested unless they need to be. If styling within a scoped style block of a Vue component it's highly unlike that you will need to nested as the scope is contained to the elements in your components. It's often more beneficial to differentiate the conflicting elements by adding class names to the elements. If the above isn't possible, nesting is acceptable.

Nesting is always acceptable for pseudo classes, adjacent selectors and media queries.

Media Queries

Media queries should always go "up" by default, as defined by the mobile-first methodology. This enforces the flow of responsiveness to always be in the same direction.

Placement of media queries should be within the element being modified, rather than all being grouped under a single media query definition at the bottom of the file. This keeps all styling logic for each element together and reduces the odds of missing an existing rule for the element.

- + diff --git a/frontend/html.html b/frontend/html.html index 048eaf78dd..f4cd5fa542 100644 --- a/frontend/html.html +++ b/frontend/html.html @@ -24,10 +24,10 @@ HTML | Netsells Code Standards - + - + diff --git a/frontend/index.html b/frontend/index.html index 429e829cc4..527630fbfe 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -24,10 +24,10 @@ Frontend | Netsells Code Standards - +

Frontend

This section contains the standard best practices we follow on new projects for all frontend-specific languages.

Single Page Applications

Every new project is built as a Single Page Application, using Nuxt. Nuxt provides us with a performant framework to quickly scaffold universal applications with server-side rendering out of the box.

Browser support

It's impossible to support every single browser, so depending on market share the browsers we do support will be limited. Browser market share can be monitored hereopen in new window.

Base Support:

The following browsers and versions should be supported at a minimum and should be accounted for during the development and QA stages. Evergreen browsers (always up-to-date due to self-updating) are listed as latest due to it being almost impossible to test on older versions due to the frequency of updates to these browsers and the fact that users are prompted to update when new versions are updated which often fixes the bugs that they are experiencing.

  • Internet Explorer: >=11
  • Edge: latest
  • Chrome: latest
  • Firefox: latest
  • Safari: latest

Package Manager

We use npm to manage all the dependencies for the frontend of our projects.

We use yarn as our cli for managing these dependencies due to the more reliable lockfile functionality.

- + diff --git a/frontend/javascript.html b/frontend/javascript.html index 6815265dfd..8d020c7f05 100644 --- a/frontend/javascript.html +++ b/frontend/javascript.html @@ -24,10 +24,10 @@ JavaScript | Netsells Code Standards - +

JavaScript

We use the latest specification of ECMAScript on greenfield projects with a build pipeline (gulp/webpack), making for concise code that compiles for compatibility in older browsers.

Linting

We make use of an automated approach of enforcing JavaScript code standards. These standards are constantly evolving to ensure we are making use of the best methods, and in order to catch more edge cases ensuring our code is consistent across the board.

See Eslint.

UI Framework

Our JavaScript framework of choice is Vue.jsopen in new window. Vue (pronounced /vjuː/, like view) is a progressive framework for building user interfaces. Unlike other monolithic frameworks, Vue is designed from the ground up to be incrementally adoptable. The core library is focused on the view layer only, and is easy to pick up and integrate with other libraries or existing projects. On the other hand, Vue is also perfectly capable of powering sophisticated Single-Page Applications when used in combination with modern tooling and supporting libraries.

For Vue standards, check the Vue Section.

Documentation

We use several methods of maintaining documentation during the development process.

Method and function names

Class methods and static functions have meaningful names that describe the action or output of the logic therein.

JSDoc

All methods and functions must have a JSDoc block associated with it. This provides additional intellisense and autocompletion to IDEs and code editors by defining what the function does and the input and output values. This also gives us the ability to automatically generate code API documentation via the JSDoc CLI tool.

- + diff --git a/frontend/linting/eslint/arrow-parens.html b/frontend/linting/eslint/arrow-parens.html index dc129d30bb..e31e6902da 100644 --- a/frontend/linting/eslint/arrow-parens.html +++ b/frontend/linting/eslint/arrow-parens.html @@ -24,7 +24,7 @@ arrow-parens | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/arrow-spacing.html b/frontend/linting/eslint/arrow-spacing.html index ff305d4fba..6857bff469 100644 --- a/frontend/linting/eslint/arrow-spacing.html +++ b/frontend/linting/eslint/arrow-spacing.html @@ -24,7 +24,7 @@ arrow-spacing | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/comma-dangle.html b/frontend/linting/eslint/comma-dangle.html index aa2cb0c09b..892f873d43 100644 --- a/frontend/linting/eslint/comma-dangle.html +++ b/frontend/linting/eslint/comma-dangle.html @@ -24,7 +24,7 @@ comma-dangle | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/curly.html b/frontend/linting/eslint/curly.html index db2d8b192b..ab472e14b2 100644 --- a/frontend/linting/eslint/curly.html +++ b/frontend/linting/eslint/curly.html @@ -24,7 +24,7 @@ curly | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/dot-location.html b/frontend/linting/eslint/dot-location.html index c500f10a43..2804b3527d 100644 --- a/frontend/linting/eslint/dot-location.html +++ b/frontend/linting/eslint/dot-location.html @@ -24,7 +24,7 @@ dot-location | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/dot-notation.html b/frontend/linting/eslint/dot-notation.html index 65af7357f4..1921d76fca 100644 --- a/frontend/linting/eslint/dot-notation.html +++ b/frontend/linting/eslint/dot-notation.html @@ -24,7 +24,7 @@ dot-notation | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/eol-last.html b/frontend/linting/eslint/eol-last.html index 2ae0653b72..8065de303f 100644 --- a/frontend/linting/eslint/eol-last.html +++ b/frontend/linting/eslint/eol-last.html @@ -24,12 +24,12 @@ eol-last | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/eqeqeq.html b/frontend/linting/eslint/eqeqeq.html index e3c2f2c7df..8ad1c8ea87 100644 --- a/frontend/linting/eslint/eqeqeq.html +++ b/frontend/linting/eslint/eqeqeq.html @@ -24,7 +24,7 @@ eqeqeq | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/import-extensions.html b/frontend/linting/eslint/import-extensions.html index d705709877..40f536951c 100644 --- a/frontend/linting/eslint/import-extensions.html +++ b/frontend/linting/eslint/import-extensions.html @@ -24,7 +24,7 @@ import/extensions | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/indent.html b/frontend/linting/eslint/indent.html index 22de41f400..d31541595b 100644 --- a/frontend/linting/eslint/indent.html +++ b/frontend/linting/eslint/indent.html @@ -24,7 +24,7 @@ indent | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/index.html b/frontend/linting/eslint/index.html index 8d6c59f1c8..69297036a6 100644 --- a/frontend/linting/eslint/index.html +++ b/frontend/linting/eslint/index.html @@ -24,10 +24,10 @@ Eslint | Netsells Code Standards - +

Eslint

We make use of an automated approach of enforcing JavaScript code standards. These standards are constantly evolving to ensure we are making use of the best methods, and in order to catch more edge cases ensuring our code is consistent across the board.

Documentationopen in new window

Rules

The following rules are currently configured.

RuleDescriptionLink
vuejs-accessibility/tabindex-no-positive
warn
Avoid positive tabindex property values to synchronize the flow of the page with keyboard tab orderLinkopen in new window
vuejs-accessibility/role-has-required-aria-props
warn
Elements with ARIA roles must have all required attributes for that roleLinkopen in new window
vuejs-accessibility/no-redundant-roles
warn
Do not add ARIA roles when the HTML element has native semantics that are already implemented by the browserLinkopen in new window
vuejs-accessibility/no-onchange
warn
Enforce usage of @blur over/in parallel with @change on select menu elements for accessibilityLinkopen in new window
vuejs-accessibility/no-distracting-elements
warn
Enforces that no distracting elements are usedLinkopen in new window
vuejs-accessibility/no-autofocus
warn
Enforce that autofocus prop is not used on elementsLinkopen in new window
vuejs-accessibility/no-access-key
warn
Enforce no accesskey prop on elementLinkopen in new window
vuejs-accessibility/mouse-events-have-key-events
warn
Enforce @mouseenter/@mouseover/@mouseout/@mouseleave/@hover are accompanied by @focus/@blurLinkopen in new window
vuejs-accessibility/interactive-supports-focus
warn
Elements with an interactive role and interaction handlers (mouse or key press) must be focusableLinkopen in new window
vuejs-accessibility/iframe-has-title
warn
<iframe> elements must have a unique title property to indicate its content to the userLinkopen in new window
vuejs-accessibility/heading-has-content
warn
Enforce that heading elements (h1, h2, etc.) have content and that the content is accessible to screen readersLinkopen in new window
vuejs-accessibility/form-control-has-label
warn
Each form element must have a programmatically associated label elementLinkopen in new window
vuejs-accessibility/click-events-have-key-events
warn
Enforce @click on non-interactive elements is accompanied by at least one of the following: @keyup, @keydown, @keypress.Linkopen in new window
vuejs-accessibility/aria-unsupported-elements
warn
Enforces that certain reserved DOM elements do not support ARIA roles, states, and properties do not contain the role and/or aria-* propsLinkopen in new window
vuejs-accessibility/aria-role
warn
Elements with ARIA roles must use a valid, non-abstract ARIA roleLinkopen in new window
vuejs-accessibility/aria-props
warn
Elements cannot use an invalid ARIA attributeLinkopen in new window
vuejs-accessibility/anchor-has-content
warn
Enforce that anchors have content and that the content is accessible to screen readersLinkopen in new window
vuejs-accessibility/alt-text
warn
Enforce that all elements that require alternative text have meaningful information to relay back to the end userLinkopen in new window
vue/v-on-style
warn
Enforce the shorthand v-on: syntax (@)Linkopen in new window
vue/v-on-function-call
warn
Enforce or forbid parentheses after method calls without arguments in v-on directivesLinkopen in new window
vue/v-bind-style
warn
Enforce the shorthand v-bind: syntax (😃Linkopen in new window
vue/this-in-template
warn
Disallow using "this" in template formLinkopen in new window
vue/script-indent
warn
Enforce consistent indentation in <script>Linkopen in new window
vue/return-in-computed-property
warn
Enforce that a return statement is present in computed propertyLinkopen in new window
vue/require-prop-types
warn
In committed code, prop definitions should always be as detailed as possible, specifying at least type(s).Linkopen in new window
vue/require-default-prop
warn
This rule requires default value to be set for each props that are not marked as required.Linkopen in new window
vue/order-in-components
warn
Enforce order in Vue component dataLinkopen in new window
vue/object-curly-spacing
warn
Enforce consistent spacing inside bracesLinkopen in new window
vue/no-v-html
ignore
This rule reports all uses of v-html directive in order to reduce the risk of injecting potentially unsafe / unescaped html into the browser leading to Cross-Site Scripting (XSS) attacks.Linkopen in new window
vue/no-unused-vars
warn
Disallow unused variable definitions of v-for directives or scope attributesLinkopen in new window
vue/no-textarea-mustache
warn
Disallows the use of mustaches within textareasLinkopen in new window
vue/no-side-effects-in-computed-properties
warn
It is considered a very bad practice to introduce side effects inside computed properties. It makes the code unpredictable and hard to understand.Linkopen in new window
vue/no-shared-component-data
warn
When using the data property on a component (i.e. anywhere except on new Vue), the value must be a function that returns an object.Linkopen in new window
vue/no-multi-spaces
warn
Remove multiple spaces in a row between attributes which are not used for indentationLinkopen in new window
vue/no-duplicate-attributes
warn
When duplicate arguments exist, only the last one is validLinkopen in new window
vue/no-dupe-keys
warn
Disallow duplicate key names to avoid overwritingLinkopen in new window
vue/mustache-interpolation-spacing
warn
Expect one space between expression and curly brackets.Linkopen in new window
vue/max-attributes-per-line
warn
Limits the maximum number of attributes/properties per line to improve readability.Linkopen in new window
vue/match-component-file-name
warn
Require component name property to match its file nameLinkopen in new window
vue/key-spacing
warn
Enforce consistent spacing between keys and values in object literal propertiesLinkopen in new window
vue/html-quotes
warn
Force double quote style in html syntaxLinkopen in new window
vue/html-indent
warn
Enforce 4 space continuous indentationLinkopen in new window
vue/html-closing-bracket-spacing
warn
This rule aims to enforce consistent spacing style before closing brackets > of tags.Linkopen in new window
vue/html-closing-bracket-newline
warn
Require or disallow a line break before tag's closing bracketsLinkopen in new window
vue/eqeqeq
warn
Require the use of === and !==Linkopen in new window
vue/component-name-in-template-casing
warn
Enforce specific casing for the component naming style in templateLinkopen in new window
vue/component-definition-name-casing
warn
Force kebab-case component namesLinkopen in new window
vue/attribute-hyphenation
warn
Force attributes to be hyphenated rather than camelCaseLinkopen in new window
require-jsdoc-except/require-jsdoc
warn
Exclude certain methods from requiring JSDoc definitions.Linkopen in new window
netsells/no-global-timeouts
warn
Prevent setTimeout and related functions being used in Vue componentsLinkopen in new window
netsells/no-dom-listeners
warn
Prevent DOM listeners being manually added/removed using addEventListener/removeEventListenerLinkopen in new window
netsells/component-file-names
warn
Force Vue file names to be PascalCaseLinkopen in new window
jsdoc/valid-types
warn
Requires all types to be valid JSDoc or Closure compiler types without syntax errors.Linkopen in new window
jsdoc/tag-lines
warn
Enforces a consistent padding of the block description.Linkopen in new window
jsdoc/require-returns-type
warn
Requires that @returns tag has type value.Linkopen in new window
jsdoc/require-returns-check
warn
Requires a return statement in function body if a @returns tag is specified in jsdoc comment. Will also report if multiple @returns tags are present.Linkopen in new window
jsdoc/require-returns
warn
Requires returns are documented. Will also report if multiple @returns tags are present.Linkopen in new window
jsdoc/require-param-type
warn
Requires that each @param tag has a type value.Linkopen in new window
jsdoc/require-param-name
warn
Requires that all function parameters have names.Linkopen in new window
jsdoc/require-param
warn
Requires that all function parameters are documented.Linkopen in new window
jsdoc/require-description-complete-sentence
warn
Requires that block description, explicit @description, and @param/@returns tag descriptions are written in complete sentences, i.e., - Description must start with an uppercase alphabetical character. - Paragraphs must start with an uppercase alphabetical character. - Sentences must end with a period. - Every line in a paragraph (except the first) which starts with an uppercase character must be preceded by a line ending with a period. - A colon or semi-colon followed by two line breaks is still part of the containing paragraph (unlike normal dual line breaks). - Text within inline tags {...} are not checked for sentence divisions. - Periods after items within the abbreviations option array are not treated as sentence endings.Linkopen in new window
jsdoc/require-description
warn
Requires that all functions have a description.Linkopen in new window
jsdoc/no-undefined-types
warn
Checks that types in jsdoc comments are defined. This can be used to check unimported types.Linkopen in new window
jsdoc/match-description
warn
Enforces a regular expression pattern on descriptions to match English sentences.Linkopen in new window
jsdoc/implements-on-classes
warn
Reports an issue with any non-constructor function using @implements. Constructor functions, whether marked with @class, @constructs, or being an ES6 class constructor, will not be flagged. To indicate that a function follows another function's signature, one might instead use @type to indicate the @function or @callback to which the function is adhering.Linkopen in new window
jsdoc/check-types
warn
Reports invalid types. By default, ensures that the casing of native types is the same as in this list: - undefined - null - boolean - number - bigint - string - symbol - object - Array - Function - Date - RegExpLinkopen in new window
jsdoc/check-tag-names
warn
Reports invalid block tag names. Valid block tags are available hereopen in new window.Linkopen in new window
jsdoc/check-syntax
warn
Reports against Google Closure Compiler syntax.Linkopen in new window
jsdoc/check-param-names
warn
Ensures that parameter names in JSDoc match those in the function declaration.Linkopen in new window
jsdoc/check-indentation
warn
Reports invalid padding inside JSDoc blocks. Ignores parts enclosed in Markdown "code block"'s. For example, the following description is not reported: js /** * Some description: * html *
* test *
* */
Linkopen in new window
jsdoc/check-alignment
warn
Reports invalid alignment of JSDoc block asterisks.Linkopen in new window
import/extensions
warn
Enforces consistency across file imports, and ensures extensions are never added.Linkopen in new window
yoda
warn
Discourage code typed like yoda would speakLinkopen in new window
template-curly-spacing
warn
Throw a warning when a regular string contains a text which looks like a template literal placeholderLinkopen in new window
space-before-function-paren
warn
Require a space before function parenthesisLinkopen in new window
semi
warn
Require a semi-colon at the end of every lineLinkopen in new window
quotes
warn
Enforce the use of single quotes when using JavaScriptLinkopen in new window
prefer-template
warn
Encourage using template literals instead of '+' operator on stringsLinkopen in new window
prefer-const
warn
Flags variables that are defined using 'let' but then never reassignedLinkopen in new window
prefer-arrow-callback
warn
Forces use of ES6 arrow function expressionsLinkopen in new window
operator-linebreak
warn
Enforce consistent linebreak style for operatorsLinkopen in new window
no-var
warn
Discourage using 'var' for creating variables - require using let/const insteadLinkopen in new window
no-useless-return
warn
Reports the use of redundant return statementsLinkopen in new window
no-use-before-define
warn
Prevents use of an identifier that has not yet been declaredLinkopen in new window
no-unused-vars
warn
Prevents leaving unused imports & vars in codeLinkopen in new window
no-unneeded-ternary
warn
Disallows ternary operators when simpler alternatives existLinkopen in new window
no-template-curly-in-string
warn
Throw a warning when a regular string contains a text which looks like a template literal placeholderLinkopen in new window
no-sparse-arrays
warn
Disallows array literals with empty slotsLinkopen in new window
no-restricted-imports
error
Disallows importing specific libraries. We disallow lodash as a whole in favour of specific importsLinkopen in new window
no-multiple-empty-lines
warn
Restricts the number of allowed empty linesLinkopen in new window
no-mixed-spaces-and-tabs
warn
Disallow mixed spaces and tabs for indentationLinkopen in new window
no-lonely-if
warn
Discourage if statements as the only statement in else blocksLinkopen in new window
no-implicit-coercion
warn
Discourage using confusing and sometimes unreadable JS tricks to do simple functions.Linkopen in new window
no-floating-decimal
warn
Disallow floating decimals.Linkopen in new window
no-eval
error
Disallow the use of the eval() functionLinkopen in new window
no-empty-function
warn
Disallow empty functionsLinkopen in new window
no-empty
warn
Disallow empty block statementsLinkopen in new window
no-else-return
warn
Disallow else blocks after return statements in if statementsLinkopen in new window
no-duplicate-imports
warn
Disallow duplicate importsLinkopen in new window
no-debugger
warn
Disallows debugger statementsLinkopen in new window
no-console
warn
Disallow using the consoleLinkopen in new window
no-cond-assign
warn
Discourage conditional assignment of variablesLinkopen in new window
no-alert
warn
Disallow alert() functionLinkopen in new window
key-spacing
warn
Enforces spacing around the colon in object literal propertiesLinkopen in new window
indent
warn
This rule enforces a consistent indentation style. It is turned off for *.vue files as the indentation for these is governed by vue/script-indent.Linkopen in new window
eqeqeq
warn
Forces equality operators to be type-safeLinkopen in new window
eol-last
warn
Force new lines at end of filesLinkopen in new window
dot-notation
warn
Forces using dot notation exclusively for getting object properties.Linkopen in new window
dot-location
warn
Discourage placing the dot on the property rather than the propertyLinkopen in new window
curly
warn
Forces formatting of curly brace conventionsLinkopen in new window
comma-dangle
warn
Requires trailing commas when the last element or property is in a different line than the closing ] or } and disallows trailing commas when the last element or property is on the same line as the closing ] or }Linkopen in new window
arrow-spacing
warn
Requires spacing before and after arrow functions arrowLinkopen in new window
arrow-parens
warn
Requires parenthesis around all arrow function arguments.Linkopen in new window
- + diff --git a/frontend/linting/eslint/jsdoc-check-alignment.html b/frontend/linting/eslint/jsdoc-check-alignment.html index 477de98a6d..6cad50aea6 100644 --- a/frontend/linting/eslint/jsdoc-check-alignment.html +++ b/frontend/linting/eslint/jsdoc-check-alignment.html @@ -24,7 +24,7 @@ jsdoc/check-alignment | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-check-indentation.html b/frontend/linting/eslint/jsdoc-check-indentation.html index 5d136a8356..1faf90290e 100644 --- a/frontend/linting/eslint/jsdoc-check-indentation.html +++ b/frontend/linting/eslint/jsdoc-check-indentation.html @@ -24,7 +24,7 @@ jsdoc/check-indentation | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-check-param-names.html b/frontend/linting/eslint/jsdoc-check-param-names.html index 43224b1fb4..90693fc178 100644 --- a/frontend/linting/eslint/jsdoc-check-param-names.html +++ b/frontend/linting/eslint/jsdoc-check-param-names.html @@ -24,7 +24,7 @@ jsdoc/check-param-names | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-check-syntax.html b/frontend/linting/eslint/jsdoc-check-syntax.html index 5999d42c8d..087bb4f306 100644 --- a/frontend/linting/eslint/jsdoc-check-syntax.html +++ b/frontend/linting/eslint/jsdoc-check-syntax.html @@ -24,7 +24,7 @@ jsdoc/check-syntax | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-check-tag-names.html b/frontend/linting/eslint/jsdoc-check-tag-names.html index 1d914478c9..f9ee351820 100644 --- a/frontend/linting/eslint/jsdoc-check-tag-names.html +++ b/frontend/linting/eslint/jsdoc-check-tag-names.html @@ -24,7 +24,7 @@ jsdoc/check-tag-names | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-check-types.html b/frontend/linting/eslint/jsdoc-check-types.html index 511d4890ac..6db0bee495 100644 --- a/frontend/linting/eslint/jsdoc-check-types.html +++ b/frontend/linting/eslint/jsdoc-check-types.html @@ -24,7 +24,7 @@ jsdoc/check-types | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-implements-on-classes.html b/frontend/linting/eslint/jsdoc-implements-on-classes.html index c05a077b08..6283034b16 100644 --- a/frontend/linting/eslint/jsdoc-implements-on-classes.html +++ b/frontend/linting/eslint/jsdoc-implements-on-classes.html @@ -24,7 +24,7 @@ jsdoc/implements-on-classes | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-match-description.html b/frontend/linting/eslint/jsdoc-match-description.html index 36cb400b17..f8285a9f05 100644 --- a/frontend/linting/eslint/jsdoc-match-description.html +++ b/frontend/linting/eslint/jsdoc-match-description.html @@ -24,7 +24,7 @@ jsdoc/match-description | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-no-undefined-types.html b/frontend/linting/eslint/jsdoc-no-undefined-types.html index 584f01e889..f81e901681 100644 --- a/frontend/linting/eslint/jsdoc-no-undefined-types.html +++ b/frontend/linting/eslint/jsdoc-no-undefined-types.html @@ -24,7 +24,7 @@ jsdoc/no-undefined-types | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-require-description-complete-sentence.html b/frontend/linting/eslint/jsdoc-require-description-complete-sentence.html index 71e31a7a68..20af1811f1 100644 --- a/frontend/linting/eslint/jsdoc-require-description-complete-sentence.html +++ b/frontend/linting/eslint/jsdoc-require-description-complete-sentence.html @@ -24,7 +24,7 @@ jsdoc/require-description-complete-sentence | Netsells Code Standards - +

← Back

jsdoc/require-description-complete-sentence warning

Requires that block description, explicit @description, and @param/@returns tag descriptions are written in complete sentences, i.e.,

  • Description must start with an uppercase alphabetical character.
  • Paragraphs must start with an uppercase alphabetical character.
  • Sentences must end with a period.
  • Every line in a paragraph (except the first) which starts with an uppercase character must be preceded by a line ending with a period.
  • A colon or semi-colon followed by two line breaks is still part of the containing paragraph (unlike normal dual line breaks).
  • Text within inline tags {...} are not checked for sentence divisions.
  • Periods after items within the abbreviations option array are not treated as sentence endings.

Examples

❌  Incorrect

/**
@@ -251,6 +251,6 @@
 
 }
 
- + diff --git a/frontend/linting/eslint/jsdoc-require-description.html b/frontend/linting/eslint/jsdoc-require-description.html index c6cfca24e5..038c084e84 100644 --- a/frontend/linting/eslint/jsdoc-require-description.html +++ b/frontend/linting/eslint/jsdoc-require-description.html @@ -24,7 +24,7 @@ jsdoc/require-description | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-require-param-name.html b/frontend/linting/eslint/jsdoc-require-param-name.html index 5c578c347b..d94d85b4c2 100644 --- a/frontend/linting/eslint/jsdoc-require-param-name.html +++ b/frontend/linting/eslint/jsdoc-require-param-name.html @@ -24,7 +24,7 @@ jsdoc/require-param-name | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-require-param-type.html b/frontend/linting/eslint/jsdoc-require-param-type.html index 5f6be1539c..081aabfd58 100644 --- a/frontend/linting/eslint/jsdoc-require-param-type.html +++ b/frontend/linting/eslint/jsdoc-require-param-type.html @@ -24,7 +24,7 @@ jsdoc/require-param-type | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-require-param.html b/frontend/linting/eslint/jsdoc-require-param.html index d5f32be6f4..590727df22 100644 --- a/frontend/linting/eslint/jsdoc-require-param.html +++ b/frontend/linting/eslint/jsdoc-require-param.html @@ -24,7 +24,7 @@ jsdoc/require-param | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-require-returns-check.html b/frontend/linting/eslint/jsdoc-require-returns-check.html index b46ffb0a14..c3827cfd5a 100644 --- a/frontend/linting/eslint/jsdoc-require-returns-check.html +++ b/frontend/linting/eslint/jsdoc-require-returns-check.html @@ -24,7 +24,7 @@ jsdoc/require-returns-check | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-require-returns-type.html b/frontend/linting/eslint/jsdoc-require-returns-type.html index 2c7c162551..d5d9761b91 100644 --- a/frontend/linting/eslint/jsdoc-require-returns-type.html +++ b/frontend/linting/eslint/jsdoc-require-returns-type.html @@ -24,7 +24,7 @@ jsdoc/require-returns-type | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-require-returns.html b/frontend/linting/eslint/jsdoc-require-returns.html index dad697909b..cc14e10dda 100644 --- a/frontend/linting/eslint/jsdoc-require-returns.html +++ b/frontend/linting/eslint/jsdoc-require-returns.html @@ -24,7 +24,7 @@ jsdoc/require-returns | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-tag-lines.html b/frontend/linting/eslint/jsdoc-tag-lines.html index 5cef3393ba..48063ee79f 100644 --- a/frontend/linting/eslint/jsdoc-tag-lines.html +++ b/frontend/linting/eslint/jsdoc-tag-lines.html @@ -24,7 +24,7 @@ jsdoc/tag-lines | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/jsdoc-valid-types.html b/frontend/linting/eslint/jsdoc-valid-types.html index cd07d5f8ed..6c73c71b16 100644 --- a/frontend/linting/eslint/jsdoc-valid-types.html +++ b/frontend/linting/eslint/jsdoc-valid-types.html @@ -24,7 +24,7 @@ jsdoc/valid-types | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/key-spacing.html b/frontend/linting/eslint/key-spacing.html index bb623fa5db..632e2c01e9 100644 --- a/frontend/linting/eslint/key-spacing.html +++ b/frontend/linting/eslint/key-spacing.html @@ -24,7 +24,7 @@ key-spacing | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/netsells-component-file-names.html b/frontend/linting/eslint/netsells-component-file-names.html index 2c1f591920..44c01486af 100644 --- a/frontend/linting/eslint/netsells-component-file-names.html +++ b/frontend/linting/eslint/netsells-component-file-names.html @@ -24,10 +24,10 @@ netsells/component-file-names | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/netsells-no-dom-listeners.html b/frontend/linting/eslint/netsells-no-dom-listeners.html index a2057d9e89..cff9ada590 100644 --- a/frontend/linting/eslint/netsells-no-dom-listeners.html +++ b/frontend/linting/eslint/netsells-no-dom-listeners.html @@ -24,7 +24,7 @@ netsells/no-dom-listeners | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/netsells-no-global-timeouts.html b/frontend/linting/eslint/netsells-no-global-timeouts.html index 3a3cc09f08..340a66f2fa 100644 --- a/frontend/linting/eslint/netsells-no-global-timeouts.html +++ b/frontend/linting/eslint/netsells-no-global-timeouts.html @@ -24,7 +24,7 @@ netsells/no-global-timeouts | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-alert.html b/frontend/linting/eslint/no-alert.html index 477c047bee..1820f5364f 100644 --- a/frontend/linting/eslint/no-alert.html +++ b/frontend/linting/eslint/no-alert.html @@ -24,13 +24,13 @@ no-alert | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-cond-assign.html b/frontend/linting/eslint/no-cond-assign.html index 2b575e6a32..cfbd9fa0df 100644 --- a/frontend/linting/eslint/no-cond-assign.html +++ b/frontend/linting/eslint/no-cond-assign.html @@ -24,7 +24,7 @@ no-cond-assign | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-console.html b/frontend/linting/eslint/no-console.html index f9ce80a8e5..ae99704169 100644 --- a/frontend/linting/eslint/no-console.html +++ b/frontend/linting/eslint/no-console.html @@ -24,13 +24,13 @@ no-console | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-debugger.html b/frontend/linting/eslint/no-debugger.html index f1dcaa40d9..919bd221ab 100644 --- a/frontend/linting/eslint/no-debugger.html +++ b/frontend/linting/eslint/no-debugger.html @@ -24,7 +24,7 @@ no-debugger | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-duplicate-imports.html b/frontend/linting/eslint/no-duplicate-imports.html index c37384126b..d064bdb29e 100644 --- a/frontend/linting/eslint/no-duplicate-imports.html +++ b/frontend/linting/eslint/no-duplicate-imports.html @@ -24,7 +24,7 @@ no-duplicate-imports | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-else-return.html b/frontend/linting/eslint/no-else-return.html index 69cf899c20..f406850dcf 100644 --- a/frontend/linting/eslint/no-else-return.html +++ b/frontend/linting/eslint/no-else-return.html @@ -24,7 +24,7 @@ no-else-return | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-empty-function.html b/frontend/linting/eslint/no-empty-function.html index 3982513c25..bc42a73713 100644 --- a/frontend/linting/eslint/no-empty-function.html +++ b/frontend/linting/eslint/no-empty-function.html @@ -24,7 +24,7 @@ no-empty-function | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-empty.html b/frontend/linting/eslint/no-empty.html index b28724129f..f9e90222a2 100644 --- a/frontend/linting/eslint/no-empty.html +++ b/frontend/linting/eslint/no-empty.html @@ -24,7 +24,7 @@ no-empty | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-eval.html b/frontend/linting/eslint/no-eval.html index 67f30c8cad..b459548732 100644 --- a/frontend/linting/eslint/no-eval.html +++ b/frontend/linting/eslint/no-eval.html @@ -24,7 +24,7 @@ no-eval | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-floating-decimal.html b/frontend/linting/eslint/no-floating-decimal.html index d8ff4af6e4..bb4ffc5431 100644 --- a/frontend/linting/eslint/no-floating-decimal.html +++ b/frontend/linting/eslint/no-floating-decimal.html @@ -24,7 +24,7 @@ no-floating-decimal | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-implicit-coercion.html b/frontend/linting/eslint/no-implicit-coercion.html index 117a8c7cc8..98bb241d75 100644 --- a/frontend/linting/eslint/no-implicit-coercion.html +++ b/frontend/linting/eslint/no-implicit-coercion.html @@ -24,7 +24,7 @@ no-implicit-coercion | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-lonely-if.html b/frontend/linting/eslint/no-lonely-if.html index 281ef4ab9d..aa0234969d 100644 --- a/frontend/linting/eslint/no-lonely-if.html +++ b/frontend/linting/eslint/no-lonely-if.html @@ -24,7 +24,7 @@ no-lonely-if | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-mixed-spaces-and-tabs.html b/frontend/linting/eslint/no-mixed-spaces-and-tabs.html index 79febc4130..d25a55e643 100644 --- a/frontend/linting/eslint/no-mixed-spaces-and-tabs.html +++ b/frontend/linting/eslint/no-mixed-spaces-and-tabs.html @@ -24,7 +24,7 @@ no-mixed-spaces-and-tabs | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-multiple-empty-lines.html b/frontend/linting/eslint/no-multiple-empty-lines.html index 24fd10ae76..3aadf33f6c 100644 --- a/frontend/linting/eslint/no-multiple-empty-lines.html +++ b/frontend/linting/eslint/no-multiple-empty-lines.html @@ -24,7 +24,7 @@ no-multiple-empty-lines | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-restricted-imports.html b/frontend/linting/eslint/no-restricted-imports.html index f3d8da23bd..f29b330db5 100644 --- a/frontend/linting/eslint/no-restricted-imports.html +++ b/frontend/linting/eslint/no-restricted-imports.html @@ -24,12 +24,12 @@ no-restricted-imports | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-sparse-arrays.html b/frontend/linting/eslint/no-sparse-arrays.html index 54fb399e72..6d0fa8777c 100644 --- a/frontend/linting/eslint/no-sparse-arrays.html +++ b/frontend/linting/eslint/no-sparse-arrays.html @@ -24,7 +24,7 @@ no-sparse-arrays | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-template-curly-in-string.html b/frontend/linting/eslint/no-template-curly-in-string.html index 36edf218fc..77118cef05 100644 --- a/frontend/linting/eslint/no-template-curly-in-string.html +++ b/frontend/linting/eslint/no-template-curly-in-string.html @@ -24,12 +24,12 @@ no-template-curly-in-string | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-unneeded-ternary.html b/frontend/linting/eslint/no-unneeded-ternary.html index 0a74d6753e..ec9f0193de 100644 --- a/frontend/linting/eslint/no-unneeded-ternary.html +++ b/frontend/linting/eslint/no-unneeded-ternary.html @@ -24,7 +24,7 @@ no-unneeded-ternary | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-unused-vars.html b/frontend/linting/eslint/no-unused-vars.html index b82bea23b7..c1d27831d4 100644 --- a/frontend/linting/eslint/no-unused-vars.html +++ b/frontend/linting/eslint/no-unused-vars.html @@ -24,7 +24,7 @@ no-unused-vars | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-use-before-define.html b/frontend/linting/eslint/no-use-before-define.html index 4c0f71dad8..faf74578f6 100644 --- a/frontend/linting/eslint/no-use-before-define.html +++ b/frontend/linting/eslint/no-use-before-define.html @@ -24,7 +24,7 @@ no-use-before-define | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-useless-return.html b/frontend/linting/eslint/no-useless-return.html index 47de068199..c5d4471f09 100644 --- a/frontend/linting/eslint/no-useless-return.html +++ b/frontend/linting/eslint/no-useless-return.html @@ -24,7 +24,7 @@ no-useless-return | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/no-var.html b/frontend/linting/eslint/no-var.html index 6475d2a239..16212d4721 100644 --- a/frontend/linting/eslint/no-var.html +++ b/frontend/linting/eslint/no-var.html @@ -24,7 +24,7 @@ no-var | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/operator-linebreak.html b/frontend/linting/eslint/operator-linebreak.html index 4418135114..706293cc4f 100644 --- a/frontend/linting/eslint/operator-linebreak.html +++ b/frontend/linting/eslint/operator-linebreak.html @@ -24,7 +24,7 @@ operator-linebreak | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/prefer-arrow-callback.html b/frontend/linting/eslint/prefer-arrow-callback.html index bebc2aecf8..372d9c1361 100644 --- a/frontend/linting/eslint/prefer-arrow-callback.html +++ b/frontend/linting/eslint/prefer-arrow-callback.html @@ -24,7 +24,7 @@ prefer-arrow-callback | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/prefer-const.html b/frontend/linting/eslint/prefer-const.html index abc0c0d30a..38db2f0033 100644 --- a/frontend/linting/eslint/prefer-const.html +++ b/frontend/linting/eslint/prefer-const.html @@ -24,7 +24,7 @@ prefer-const | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/prefer-template.html b/frontend/linting/eslint/prefer-template.html index 92260a6f70..413e40ca35 100644 --- a/frontend/linting/eslint/prefer-template.html +++ b/frontend/linting/eslint/prefer-template.html @@ -24,12 +24,12 @@ prefer-template | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/quotes.html b/frontend/linting/eslint/quotes.html index 1b5a8b37d6..18237a2773 100644 --- a/frontend/linting/eslint/quotes.html +++ b/frontend/linting/eslint/quotes.html @@ -24,7 +24,7 @@ quotes | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/require-jsdoc-except-require-jsdoc.html b/frontend/linting/eslint/require-jsdoc-except-require-jsdoc.html index d5f890bf4f..21711612b7 100644 --- a/frontend/linting/eslint/require-jsdoc-except-require-jsdoc.html +++ b/frontend/linting/eslint/require-jsdoc-except-require-jsdoc.html @@ -24,7 +24,7 @@ require-jsdoc-except/require-jsdoc | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/semi.html b/frontend/linting/eslint/semi.html index ef1fa8a05d..bb1b8746da 100644 --- a/frontend/linting/eslint/semi.html +++ b/frontend/linting/eslint/semi.html @@ -24,12 +24,12 @@ semi | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/space-before-function-paren.html b/frontend/linting/eslint/space-before-function-paren.html index 0fa7f61dea..1ea624791c 100644 --- a/frontend/linting/eslint/space-before-function-paren.html +++ b/frontend/linting/eslint/space-before-function-paren.html @@ -24,7 +24,7 @@ space-before-function-paren | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/template-curly-spacing.html b/frontend/linting/eslint/template-curly-spacing.html index 6a8738dc0f..414154a413 100644 --- a/frontend/linting/eslint/template-curly-spacing.html +++ b/frontend/linting/eslint/template-curly-spacing.html @@ -24,7 +24,7 @@ template-curly-spacing | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-attribute-hyphenation.html b/frontend/linting/eslint/vue-attribute-hyphenation.html index 305c0e5098..78a8cead6e 100644 --- a/frontend/linting/eslint/vue-attribute-hyphenation.html +++ b/frontend/linting/eslint/vue-attribute-hyphenation.html @@ -24,7 +24,7 @@ vue/attribute-hyphenation | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-component-definition-name-casing.html b/frontend/linting/eslint/vue-component-definition-name-casing.html index 66ceadb4d8..922a9c49c7 100644 --- a/frontend/linting/eslint/vue-component-definition-name-casing.html +++ b/frontend/linting/eslint/vue-component-definition-name-casing.html @@ -24,7 +24,7 @@ vue/component-definition-name-casing | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-component-name-in-template-casing.html b/frontend/linting/eslint/vue-component-name-in-template-casing.html index 326816d41c..861f777564 100644 --- a/frontend/linting/eslint/vue-component-name-in-template-casing.html +++ b/frontend/linting/eslint/vue-component-name-in-template-casing.html @@ -24,7 +24,7 @@ vue/component-name-in-template-casing | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-eqeqeq.html b/frontend/linting/eslint/vue-eqeqeq.html index 3c9658344e..de63a743a6 100644 --- a/frontend/linting/eslint/vue-eqeqeq.html +++ b/frontend/linting/eslint/vue-eqeqeq.html @@ -24,7 +24,7 @@ vue/eqeqeq | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-html-closing-bracket-newline.html b/frontend/linting/eslint/vue-html-closing-bracket-newline.html index 449f5ba2d7..4d91ef26ff 100644 --- a/frontend/linting/eslint/vue-html-closing-bracket-newline.html +++ b/frontend/linting/eslint/vue-html-closing-bracket-newline.html @@ -24,7 +24,7 @@ vue/html-closing-bracket-newline | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-html-closing-bracket-spacing.html b/frontend/linting/eslint/vue-html-closing-bracket-spacing.html index b9f250f00e..7507ac95de 100644 --- a/frontend/linting/eslint/vue-html-closing-bracket-spacing.html +++ b/frontend/linting/eslint/vue-html-closing-bracket-spacing.html @@ -24,7 +24,7 @@ vue/html-closing-bracket-spacing | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-html-indent.html b/frontend/linting/eslint/vue-html-indent.html index e514560450..b53b2bea47 100644 --- a/frontend/linting/eslint/vue-html-indent.html +++ b/frontend/linting/eslint/vue-html-indent.html @@ -24,7 +24,7 @@ vue/html-indent | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-html-quotes.html b/frontend/linting/eslint/vue-html-quotes.html index 295aacb192..5c081a68ea 100644 --- a/frontend/linting/eslint/vue-html-quotes.html +++ b/frontend/linting/eslint/vue-html-quotes.html @@ -24,7 +24,7 @@ vue/html-quotes | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-key-spacing.html b/frontend/linting/eslint/vue-key-spacing.html index 4fdcf4e85f..79198ac49f 100644 --- a/frontend/linting/eslint/vue-key-spacing.html +++ b/frontend/linting/eslint/vue-key-spacing.html @@ -24,7 +24,7 @@ vue/key-spacing | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-match-component-file-name.html b/frontend/linting/eslint/vue-match-component-file-name.html index 431b4f76e2..127f6bfd92 100644 --- a/frontend/linting/eslint/vue-match-component-file-name.html +++ b/frontend/linting/eslint/vue-match-component-file-name.html @@ -24,7 +24,7 @@ vue/match-component-file-name | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-max-attributes-per-line.html b/frontend/linting/eslint/vue-max-attributes-per-line.html index 9979394f46..4cb5bff9fe 100644 --- a/frontend/linting/eslint/vue-max-attributes-per-line.html +++ b/frontend/linting/eslint/vue-max-attributes-per-line.html @@ -24,7 +24,7 @@ vue/max-attributes-per-line | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-mustache-interpolation-spacing.html b/frontend/linting/eslint/vue-mustache-interpolation-spacing.html index 6438448560..c594550690 100644 --- a/frontend/linting/eslint/vue-mustache-interpolation-spacing.html +++ b/frontend/linting/eslint/vue-mustache-interpolation-spacing.html @@ -24,7 +24,7 @@ vue/mustache-interpolation-spacing | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-no-dupe-keys.html b/frontend/linting/eslint/vue-no-dupe-keys.html index 447e43de2a..3a83231bf3 100644 --- a/frontend/linting/eslint/vue-no-dupe-keys.html +++ b/frontend/linting/eslint/vue-no-dupe-keys.html @@ -24,7 +24,7 @@ vue/no-dupe-keys | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-no-duplicate-attributes.html b/frontend/linting/eslint/vue-no-duplicate-attributes.html index a781d55228..13b6f61c2c 100644 --- a/frontend/linting/eslint/vue-no-duplicate-attributes.html +++ b/frontend/linting/eslint/vue-no-duplicate-attributes.html @@ -24,7 +24,7 @@ vue/no-duplicate-attributes | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-no-multi-spaces.html b/frontend/linting/eslint/vue-no-multi-spaces.html index 6200f612ab..cc387f3a76 100644 --- a/frontend/linting/eslint/vue-no-multi-spaces.html +++ b/frontend/linting/eslint/vue-no-multi-spaces.html @@ -24,7 +24,7 @@ vue/no-multi-spaces | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-no-shared-component-data.html b/frontend/linting/eslint/vue-no-shared-component-data.html index 75fdc8acdb..df2743e9b5 100644 --- a/frontend/linting/eslint/vue-no-shared-component-data.html +++ b/frontend/linting/eslint/vue-no-shared-component-data.html @@ -24,7 +24,7 @@ vue/no-shared-component-data | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-no-side-effects-in-computed-properties.html b/frontend/linting/eslint/vue-no-side-effects-in-computed-properties.html index e2fc091387..9c3d804eca 100644 --- a/frontend/linting/eslint/vue-no-side-effects-in-computed-properties.html +++ b/frontend/linting/eslint/vue-no-side-effects-in-computed-properties.html @@ -24,7 +24,7 @@ vue/no-side-effects-in-computed-properties | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-no-textarea-mustache.html b/frontend/linting/eslint/vue-no-textarea-mustache.html index 5a6cce4c42..3fa0af11ef 100644 --- a/frontend/linting/eslint/vue-no-textarea-mustache.html +++ b/frontend/linting/eslint/vue-no-textarea-mustache.html @@ -24,7 +24,7 @@ vue/no-textarea-mustache | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-no-unused-vars.html b/frontend/linting/eslint/vue-no-unused-vars.html index 6530ae9c5c..c06a945300 100644 --- a/frontend/linting/eslint/vue-no-unused-vars.html +++ b/frontend/linting/eslint/vue-no-unused-vars.html @@ -24,7 +24,7 @@ vue/no-unused-vars | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-no-v-html.html b/frontend/linting/eslint/vue-no-v-html.html index ec80e3b11d..382e32977a 100644 --- a/frontend/linting/eslint/vue-no-v-html.html +++ b/frontend/linting/eslint/vue-no-v-html.html @@ -24,13 +24,13 @@ vue/no-v-html | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-object-curly-spacing.html b/frontend/linting/eslint/vue-object-curly-spacing.html index e3dd3ca7f7..3f89d5110f 100644 --- a/frontend/linting/eslint/vue-object-curly-spacing.html +++ b/frontend/linting/eslint/vue-object-curly-spacing.html @@ -24,7 +24,7 @@ vue/object-curly-spacing | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-order-in-components.html b/frontend/linting/eslint/vue-order-in-components.html index 7393c00ef3..6c62cc2d52 100644 --- a/frontend/linting/eslint/vue-order-in-components.html +++ b/frontend/linting/eslint/vue-order-in-components.html @@ -24,7 +24,7 @@ vue/order-in-components | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-require-default-prop.html b/frontend/linting/eslint/vue-require-default-prop.html index 2968581270..b6cd7958ed 100644 --- a/frontend/linting/eslint/vue-require-default-prop.html +++ b/frontend/linting/eslint/vue-require-default-prop.html @@ -24,7 +24,7 @@ vue/require-default-prop | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-require-prop-types.html b/frontend/linting/eslint/vue-require-prop-types.html index 711da7a10a..a1c190434d 100644 --- a/frontend/linting/eslint/vue-require-prop-types.html +++ b/frontend/linting/eslint/vue-require-prop-types.html @@ -24,7 +24,7 @@ vue/require-prop-types | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-return-in-computed-property.html b/frontend/linting/eslint/vue-return-in-computed-property.html index ea5e6adb31..8cd5594977 100644 --- a/frontend/linting/eslint/vue-return-in-computed-property.html +++ b/frontend/linting/eslint/vue-return-in-computed-property.html @@ -24,7 +24,7 @@ vue/return-in-computed-property | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-script-indent.html b/frontend/linting/eslint/vue-script-indent.html index d65773911a..209776e77f 100644 --- a/frontend/linting/eslint/vue-script-indent.html +++ b/frontend/linting/eslint/vue-script-indent.html @@ -24,7 +24,7 @@ vue/script-indent | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-this-in-template.html b/frontend/linting/eslint/vue-this-in-template.html index 964f447489..ff58533406 100644 --- a/frontend/linting/eslint/vue-this-in-template.html +++ b/frontend/linting/eslint/vue-this-in-template.html @@ -24,7 +24,7 @@ vue/this-in-template | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-v-bind-style.html b/frontend/linting/eslint/vue-v-bind-style.html index 100af6be20..2d435faa21 100644 --- a/frontend/linting/eslint/vue-v-bind-style.html +++ b/frontend/linting/eslint/vue-v-bind-style.html @@ -24,7 +24,7 @@ vue/v-bind-style | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-v-on-function-call.html b/frontend/linting/eslint/vue-v-on-function-call.html index 17a3aae83f..21f548ebcd 100644 --- a/frontend/linting/eslint/vue-v-on-function-call.html +++ b/frontend/linting/eslint/vue-v-on-function-call.html @@ -24,7 +24,7 @@ vue/v-on-function-call | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vue-v-on-style.html b/frontend/linting/eslint/vue-v-on-style.html index 9240322633..c2903dc1f4 100644 --- a/frontend/linting/eslint/vue-v-on-style.html +++ b/frontend/linting/eslint/vue-v-on-style.html @@ -24,7 +24,7 @@ vue/v-on-style | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-alt-text.html b/frontend/linting/eslint/vuejs-accessibility-alt-text.html index edfec68214..d4b73ad011 100644 --- a/frontend/linting/eslint/vuejs-accessibility-alt-text.html +++ b/frontend/linting/eslint/vuejs-accessibility-alt-text.html @@ -24,10 +24,10 @@ vuejs-accessibility/alt-text | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-anchor-has-content.html b/frontend/linting/eslint/vuejs-accessibility-anchor-has-content.html index 3e5b1c9471..cdc79fe504 100644 --- a/frontend/linting/eslint/vuejs-accessibility-anchor-has-content.html +++ b/frontend/linting/eslint/vuejs-accessibility-anchor-has-content.html @@ -24,10 +24,10 @@ vuejs-accessibility/anchor-has-content | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-aria-props.html b/frontend/linting/eslint/vuejs-accessibility-aria-props.html index 910846ea91..0fb76478b5 100644 --- a/frontend/linting/eslint/vuejs-accessibility-aria-props.html +++ b/frontend/linting/eslint/vuejs-accessibility-aria-props.html @@ -24,10 +24,10 @@ vuejs-accessibility/aria-props | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-aria-role.html b/frontend/linting/eslint/vuejs-accessibility-aria-role.html index a79c999d21..5eb21e01cd 100644 --- a/frontend/linting/eslint/vuejs-accessibility-aria-role.html +++ b/frontend/linting/eslint/vuejs-accessibility-aria-role.html @@ -24,10 +24,10 @@ vuejs-accessibility/aria-role | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-aria-unsupported-elements.html b/frontend/linting/eslint/vuejs-accessibility-aria-unsupported-elements.html index e9bb7b7f82..dcb36e823d 100644 --- a/frontend/linting/eslint/vuejs-accessibility-aria-unsupported-elements.html +++ b/frontend/linting/eslint/vuejs-accessibility-aria-unsupported-elements.html @@ -24,10 +24,10 @@ vuejs-accessibility/aria-unsupported-elements | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-click-events-have-key-events.html b/frontend/linting/eslint/vuejs-accessibility-click-events-have-key-events.html index 5c619d5749..08ddc5df02 100644 --- a/frontend/linting/eslint/vuejs-accessibility-click-events-have-key-events.html +++ b/frontend/linting/eslint/vuejs-accessibility-click-events-have-key-events.html @@ -24,10 +24,10 @@ vuejs-accessibility/click-events-have-key-events | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-form-control-has-label.html b/frontend/linting/eslint/vuejs-accessibility-form-control-has-label.html index 3d098bf7ce..d27a32f25c 100644 --- a/frontend/linting/eslint/vuejs-accessibility-form-control-has-label.html +++ b/frontend/linting/eslint/vuejs-accessibility-form-control-has-label.html @@ -24,10 +24,10 @@ vuejs-accessibility/form-control-has-label | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-heading-has-content.html b/frontend/linting/eslint/vuejs-accessibility-heading-has-content.html index 531abe4246..0abe048ed5 100644 --- a/frontend/linting/eslint/vuejs-accessibility-heading-has-content.html +++ b/frontend/linting/eslint/vuejs-accessibility-heading-has-content.html @@ -24,10 +24,10 @@ vuejs-accessibility/heading-has-content | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-iframe-has-title.html b/frontend/linting/eslint/vuejs-accessibility-iframe-has-title.html index aa223b5c10..1413cd9244 100644 --- a/frontend/linting/eslint/vuejs-accessibility-iframe-has-title.html +++ b/frontend/linting/eslint/vuejs-accessibility-iframe-has-title.html @@ -24,10 +24,10 @@ vuejs-accessibility/iframe-has-title | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-interactive-supports-focus.html b/frontend/linting/eslint/vuejs-accessibility-interactive-supports-focus.html index eef9909008..f90d24ba59 100644 --- a/frontend/linting/eslint/vuejs-accessibility-interactive-supports-focus.html +++ b/frontend/linting/eslint/vuejs-accessibility-interactive-supports-focus.html @@ -24,10 +24,10 @@ vuejs-accessibility/interactive-supports-focus | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-mouse-events-have-key-events.html b/frontend/linting/eslint/vuejs-accessibility-mouse-events-have-key-events.html index 9cf23d5904..7e62175fcf 100644 --- a/frontend/linting/eslint/vuejs-accessibility-mouse-events-have-key-events.html +++ b/frontend/linting/eslint/vuejs-accessibility-mouse-events-have-key-events.html @@ -24,10 +24,10 @@ vuejs-accessibility/mouse-events-have-key-events | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-no-access-key.html b/frontend/linting/eslint/vuejs-accessibility-no-access-key.html index 09ece8ab29..f497313917 100644 --- a/frontend/linting/eslint/vuejs-accessibility-no-access-key.html +++ b/frontend/linting/eslint/vuejs-accessibility-no-access-key.html @@ -24,10 +24,10 @@ vuejs-accessibility/no-access-key | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-no-autofocus.html b/frontend/linting/eslint/vuejs-accessibility-no-autofocus.html index 15fa419471..cb6a2ab098 100644 --- a/frontend/linting/eslint/vuejs-accessibility-no-autofocus.html +++ b/frontend/linting/eslint/vuejs-accessibility-no-autofocus.html @@ -24,10 +24,10 @@ vuejs-accessibility/no-autofocus | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-no-distracting-elements.html b/frontend/linting/eslint/vuejs-accessibility-no-distracting-elements.html index 4240988c29..1f3e069f4e 100644 --- a/frontend/linting/eslint/vuejs-accessibility-no-distracting-elements.html +++ b/frontend/linting/eslint/vuejs-accessibility-no-distracting-elements.html @@ -24,10 +24,10 @@ vuejs-accessibility/no-distracting-elements | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-no-onchange.html b/frontend/linting/eslint/vuejs-accessibility-no-onchange.html index 710a418298..b2b39673d3 100644 --- a/frontend/linting/eslint/vuejs-accessibility-no-onchange.html +++ b/frontend/linting/eslint/vuejs-accessibility-no-onchange.html @@ -24,10 +24,10 @@ vuejs-accessibility/no-onchange | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-no-redundant-roles.html b/frontend/linting/eslint/vuejs-accessibility-no-redundant-roles.html index 0e67573abb..f9e2b7b3ff 100644 --- a/frontend/linting/eslint/vuejs-accessibility-no-redundant-roles.html +++ b/frontend/linting/eslint/vuejs-accessibility-no-redundant-roles.html @@ -24,10 +24,10 @@ vuejs-accessibility/no-redundant-roles | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-role-has-required-aria-props.html b/frontend/linting/eslint/vuejs-accessibility-role-has-required-aria-props.html index 633036526d..5962bb0156 100644 --- a/frontend/linting/eslint/vuejs-accessibility-role-has-required-aria-props.html +++ b/frontend/linting/eslint/vuejs-accessibility-role-has-required-aria-props.html @@ -24,10 +24,10 @@ vuejs-accessibility/role-has-required-aria-props | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/vuejs-accessibility-tabindex-no-positive.html b/frontend/linting/eslint/vuejs-accessibility-tabindex-no-positive.html index ae8235f1ea..34bd700855 100644 --- a/frontend/linting/eslint/vuejs-accessibility-tabindex-no-positive.html +++ b/frontend/linting/eslint/vuejs-accessibility-tabindex-no-positive.html @@ -24,10 +24,10 @@ vuejs-accessibility/tabindex-no-positive | Netsells Code Standards - + - + diff --git a/frontend/linting/eslint/yoda.html b/frontend/linting/eslint/yoda.html index f059923407..b168d992b0 100644 --- a/frontend/linting/eslint/yoda.html +++ b/frontend/linting/eslint/yoda.html @@ -24,7 +24,7 @@ yoda | Netsells Code Standards - + - + diff --git a/frontend/linting/index.html b/frontend/linting/index.html index ee9fba4128..ef9cb94ac8 100644 --- a/frontend/linting/index.html +++ b/frontend/linting/index.html @@ -24,10 +24,10 @@ Linting | Netsells Code Standards - + - + diff --git a/frontend/linting/stylelint/block-no-empty.html b/frontend/linting/stylelint/block-no-empty.html index a869922939..2b73b2f432 100644 --- a/frontend/linting/stylelint/block-no-empty.html +++ b/frontend/linting/stylelint/block-no-empty.html @@ -24,7 +24,7 @@ block-no-empty | Netsells Code Standards - + - + diff --git a/frontend/linting/stylelint/color-hex-length.html b/frontend/linting/stylelint/color-hex-length.html index 3326e4a04c..2226f183d4 100644 --- a/frontend/linting/stylelint/color-hex-length.html +++ b/frontend/linting/stylelint/color-hex-length.html @@ -24,7 +24,7 @@ color-hex-length | Netsells Code Standards - + - + diff --git a/frontend/linting/stylelint/color-named.html b/frontend/linting/stylelint/color-named.html index 54f9ca75d1..5f538d9953 100644 --- a/frontend/linting/stylelint/color-named.html +++ b/frontend/linting/stylelint/color-named.html @@ -24,7 +24,7 @@ color-named | Netsells Code Standards - + - + diff --git a/frontend/linting/stylelint/color-no-invalid-hex.html b/frontend/linting/stylelint/color-no-invalid-hex.html index 8941a886db..f416d3834a 100644 --- a/frontend/linting/stylelint/color-no-invalid-hex.html +++ b/frontend/linting/stylelint/color-no-invalid-hex.html @@ -24,7 +24,7 @@ color-no-invalid-hex | Netsells Code Standards - + - + diff --git a/frontend/linting/stylelint/declaration-block-no-duplicate-properties.html b/frontend/linting/stylelint/declaration-block-no-duplicate-properties.html index c0d446d5bc..b7b982a71d 100644 --- a/frontend/linting/stylelint/declaration-block-no-duplicate-properties.html +++ b/frontend/linting/stylelint/declaration-block-no-duplicate-properties.html @@ -24,7 +24,7 @@ declaration-block-no-duplicate-properties | Netsells Code Standards - + - + diff --git a/frontend/linting/stylelint/declaration-block-no-shorthand-property-overrides.html b/frontend/linting/stylelint/declaration-block-no-shorthand-property-overrides.html index f4aa0b5fcc..5059a4c5ff 100644 --- a/frontend/linting/stylelint/declaration-block-no-shorthand-property-overrides.html +++ b/frontend/linting/stylelint/declaration-block-no-shorthand-property-overrides.html @@ -24,7 +24,7 @@ declaration-block-no-shorthand-property-overrides | Netsells Code Standards - + - + diff --git a/frontend/linting/stylelint/declaration-no-important.html b/frontend/linting/stylelint/declaration-no-important.html index ed10e92204..32bf21a593 100644 --- a/frontend/linting/stylelint/declaration-no-important.html +++ b/frontend/linting/stylelint/declaration-no-important.html @@ -24,7 +24,7 @@ declaration-no-important | Netsells Code Standards - + - + diff --git a/frontend/linting/stylelint/index.html b/frontend/linting/stylelint/index.html index 6924b28884..e38be49c3d 100644 --- a/frontend/linting/stylelint/index.html +++ b/frontend/linting/stylelint/index.html @@ -24,10 +24,10 @@ Stylelint | Netsells Code Standards - +

Stylelint

We make use of an automated approach of enforcing CSS code standards. These standards are constantly evolving to ensure we are making use of the best methods, and in order to catch more edge cases ensuring our code is consistent across the board.

Documentationopen in new window

Rules

The following rules are currently configured.

RuleDescriptionLink
unit-no-unknown
warn
Prevents unknown units being used.Linkopen in new window
shorthand-property-no-redundant-values
warn
Disallow redundant values in shorthand properties.Linkopen in new window
property-no-unknown
warn
Prevents unknown properties being used.Linkopen in new window
length-zero-no-unit
warn
Zero lengths should not have units.Linkopen in new window
declaration-no-important
warn
Disallow !important within declarations.Linkopen in new window
declaration-block-no-shorthand-property-overrides
warn
Prevents shorthand properties overriding longhand ones.Linkopen in new window
declaration-block-no-duplicate-properties
warn
Disallow duplicate properties within declaration blocks. This rule ignores variables ($sass, @less, --custom-property).Linkopen in new window
color-no-invalid-hex
warn
Disallow invalid hex colors.Linkopen in new window
color-named
warn
Colors must never be named.Linkopen in new window
color-hex-length
warn
Forces the length of hex codes used in styles to be long notation rather than short.Linkopen in new window
block-no-empty
warn
Disallow empty blocks.Linkopen in new window
- + diff --git a/frontend/linting/stylelint/length-zero-no-unit.html b/frontend/linting/stylelint/length-zero-no-unit.html index 82217b008f..394efdd4c0 100644 --- a/frontend/linting/stylelint/length-zero-no-unit.html +++ b/frontend/linting/stylelint/length-zero-no-unit.html @@ -24,7 +24,7 @@ length-zero-no-unit | Netsells Code Standards - + - + diff --git a/frontend/linting/stylelint/property-no-unknown.html b/frontend/linting/stylelint/property-no-unknown.html index a78d78ee4f..5144ab4c0e 100644 --- a/frontend/linting/stylelint/property-no-unknown.html +++ b/frontend/linting/stylelint/property-no-unknown.html @@ -24,7 +24,7 @@ property-no-unknown | Netsells Code Standards - + - + diff --git a/frontend/linting/stylelint/shorthand-property-no-redundant-values.html b/frontend/linting/stylelint/shorthand-property-no-redundant-values.html index 497a5f2cff..ec73fa8cce 100644 --- a/frontend/linting/stylelint/shorthand-property-no-redundant-values.html +++ b/frontend/linting/stylelint/shorthand-property-no-redundant-values.html @@ -24,7 +24,7 @@ shorthand-property-no-redundant-values | Netsells Code Standards - + - + diff --git a/frontend/linting/stylelint/unit-no-unknown.html b/frontend/linting/stylelint/unit-no-unknown.html index e1a8486a3a..15b41c755d 100644 --- a/frontend/linting/stylelint/unit-no-unknown.html +++ b/frontend/linting/stylelint/unit-no-unknown.html @@ -24,7 +24,7 @@ unit-no-unknown | Netsells Code Standards - + - + diff --git a/frontend/performance.html b/frontend/performance.html index e551095241..af9fe7c0a9 100644 --- a/frontend/performance.html +++ b/frontend/performance.html @@ -24,10 +24,10 @@ Performance | Netsells Code Standards - + - + diff --git a/frontend/recommended-packages.html b/frontend/recommended-packages.html index 27e1b1d596..c1d48117ac 100644 --- a/frontend/recommended-packages.html +++ b/frontend/recommended-packages.html @@ -24,10 +24,10 @@ Recommended Packages | Netsells Code Standards - +

Recommended Packages

During development we use a lot of 3rd party packages within our code. To ensure we are using trusted packages which follow all of our policies, we have documented any tried and tested packages below. We recommend you utilise these packages in your project, or add to this list any alternatives that may serve your specialist purpose, while also ensuring they meet our policies.

PackagePurposeUsed inLatest Version
cookie-universal-nuxtopen in new window

Maintenance


Set, get and remove cookies in both client and server side nuxt apps
itsuopen in new windownpm version
nuxt-graphql-requestopen in new window

Maintenance


Easy Minimal GraphQL client integration with Nuxt.js.
itsuopen in new windownpm version
dayjsopen in new window

Maintenance


A minimalist JavaScript library that parses, validates, manipulates, and displays dates and times for modern browsers with a largely Moment.js-compatible API
itsuopen in new windownpm version
@googlemaps/js-api-loaderopen in new window

Maintenance


Load the Google Maps JavaScript API script dynamically. Allows to lazy load the apis you need rather than loading up front and slowing pages down.
itsuopen in new windownpm version
pixijsopen in new window

Maintenance


A fast lightweight 2D library that works across all devices. The PixiJS renderer allows everyone to enjoy the power of hardware acceleration without prior knowledge of WebGL.
Own The Pitchopen in new windownpm version
hooperopen in new window

Maintenance


Vue.js carousel component, optimized to work with Vue.
Add Victoropen in new windownpm version
swiperopen in new window

Maintenance


The free and most modern mobile touch slider with hardware accelerated transitions and amazing native behavior.
itsuopen in new windownpm version
vue-stripe-elements-plusopen in new window

Maintenance


Flexible and powerful Vue components for Stripe. It's a glue between Stripe.js and Vue component lifecycle.
Moonlight Cinemaopen in new windownpm version
vue-stripeopen in new window

Maintenance


Stripe Checkout & Elements for Vue.js
-npm version
vue-markdown-renderopen in new window

Maintenance


A simple and lightweight wrapper for markdown-it with full TypeScript support.
itsuopen in new windownpm version
vue-social-sharingopen in new window

Maintenance


A renderless components for sharing links on major social networks
itsuopen in new windownpm version
- + diff --git a/frontend/required-qa.html b/frontend/required-qa.html index b0be6ac27f..18e4752446 100644 --- a/frontend/required-qa.html +++ b/frontend/required-qa.html @@ -24,10 +24,10 @@ Required QA | Netsells Code Standards - + - + diff --git a/frontend/storybook.html b/frontend/storybook.html index 48bece36d2..bf3cfd4160 100644 --- a/frontend/storybook.html +++ b/frontend/storybook.html @@ -24,7 +24,7 @@ Storybook | Netsells Code Standards - +

Storybook

We follow a Component-Driven Development principle, in which we built all projects bottom-up. This involves breaking down areas of the site into smaller components to make them much more reusable. To do this, we use Storybook.js as a development tool for providing a sandbox environment for developing components in isolation, outside of the context of our main application frame. This allows us to concentrate on building standalone components rather than building styling + functionality for each location it appears in.

WARNING

This section may change over time as our experience with Storybook evolves

Structure

Your file structure and generated Storybook "stories" should be formatted with the following named top-level categories at a minimum:

├─ stories
@@ -98,6 +98,6 @@
 };
 
 
  1. Next click on "Edit Variables" on the right hand side of the template block and fill in the table as follows:
NameExpressionDefault valueSkip if defined
componentcapitalize(camelCase(substringBefore(fileNameWithoutExtension(),".")))
componentDirectory"Component Directory""directory/"
containerDecorator"Container Decorator""import ContainerDecorator from '../decorators/ContainerDecorator';"
componentNamecamelCase(substringBefore(fileNameWithoutExtension(),"."))
templatelowercaseAndDash(substringBefore(fileNameWithoutExtension(),"."))
prop"Prop""prop"
propDefault"Prop Default""'Lorem ipsum'"
storyName"Story Name""default"
decorator"Decorator""ContainerDecorator"
  1. Finally click on "Define" at the bottom of the modal and select ☐ Javascript and Typescript.

You are now able to use this template while creating stories. simply create a file e.g. ExampleComponent.stories.js and type story then press tab. You can now fill in each of the variables we just set in the table above by typing then pressing tab to progress to the next one.

- + diff --git a/frontend/testing/cheat-sheet.html b/frontend/testing/cheat-sheet.html index 0e1b209228..84ec31677e 100644 --- a/frontend/testing/cheat-sheet.html +++ b/frontend/testing/cheat-sheet.html @@ -24,7 +24,7 @@ Cheatsheet | Netsells Code Standards - + - + diff --git a/frontend/testing/index.html b/frontend/testing/index.html index 2762b75e94..108b8386e8 100644 --- a/frontend/testing/index.html +++ b/frontend/testing/index.html @@ -24,10 +24,10 @@ Testing | Netsells Code Standards - + - + diff --git a/frontend/testing/unit-testing.html b/frontend/testing/unit-testing.html index 9ffa02a3e2..21cf2d7a07 100644 --- a/frontend/testing/unit-testing.html +++ b/frontend/testing/unit-testing.html @@ -24,7 +24,7 @@ Unit Testing | Netsells Code Standards - +

Unit Testing

Our unit test suites are primarily built on top of our storybook stories, as a lot of the setup leg work has already been done within this process, e.g. a default story, a story with a prop set, etc.

Tests should be written using jestopen in new window .

Any non-component tests should follow the same format as below, but interact with jestopen in new window directly.

Packages

Vue Storybook Test Utils

Link: @netsells/vue-storybook-test-utilsopen in new window

Most of your test composition and variants (e.g. props, slots) is already setup as part of storybook for use in component-first development and Visual Regression Testing process. It makes little sense to do this setup twice. This module allows you to pass your stories directly to the @vue/test-utilsopen in new window package and have the wrappers automatically generated with your provided props and story markup.

For further details and usage check out the module README.

Format

File Convention

Test files should be suffixed with .spec.js and should match the name of the file being tested. They should be placed alongside the source file in your application. For example, if we were to have a TextInput.vue component, our file structure would look something like so:

├─ TextInput/
@@ -39,6 +39,6 @@
     });
 });
 

The idea behind this format is to avoid cases where you might have a test named updates data appropriately. What does “appropriately” mean? If a new developer were to modify this component and update the test in future would they know what the individual requirements of the component are?

Eventually you will end up with a complete, living UAT document within the codebase.

Fixtures

When testing against data, rather than hardcoding your data within your test, it's better to move this data to a fixture. A fixture is an immutable dataset that your tests are based on to mimic real data. For instance if you have a component which takes data from an endpoint and populates a users table, you might have a users.json fixture with your static data. You would then pull this into your test instead.

Fixtures should be placed in <root>/tests/fixtures/.

WARNING

It's important that your fixture remains immutable as to not introduce any essence of unpredictability into your tests

- + diff --git a/frontend/testing/visual-regression-testing.html b/frontend/testing/visual-regression-testing.html index 522289a9d4..19442cb62f 100644 --- a/frontend/testing/visual-regression-testing.html +++ b/frontend/testing/visual-regression-testing.html @@ -24,10 +24,10 @@ Visual regression testing | Netsells Code Standards - +

Visual regression testing

What is Visual Regression Testing?

Regression testing, in general, is validating that the changes we introduce to our source code do not have an unexpected impact on our system. With visual regression tests we are aiming for the same goal, but we are more concerned about the interface that is being presented to our final user rather than how functional our system is.

At the end of the day, what is important is what our user is seeing and what it is interacting with. Essentially, Visual Regression Tests (or VRT for short) allows us to understand the changes that will be perceived by our users through /screenshots/and content comparison between those images.

Using automation we're able to see what changed and where, BEFORE the code reaches production.

Having these tests alongside our Unit Tests give us confidence that any change to our codebase won’t have any unintended consequences in either our logic or our design.

How we use it

Developing in a component first manner using storybook.js as our base, we are able to build up a library of “stories” that define our various application states at the component level. Having this as a base level allows us to utilise automated processes of generating our Visual Regression Tests.

The automation happens as part of the various workflows in our Github Actions pipeline. Using this we can generate our screens, run the comparison and output this into the Pull Requests themselves as part of our Peer Review process, allowing us to sign off both the code and visual aspects of the change.

Guidelines

Test your states

If the component can take various props and slots which change the visual display of your component, each of these states and combinations should be reasonably documented as stories.

By “reasonably” we mean if for example you have a prop that can change the border colour, you wouldn't need to test every combination of other props with each border colour selected.

Test your viewports

We develop responsively, so our components should also be responsive. By default, we have our projects set up based on the bootstrap container sizes which should cover most instances, but if you have components that is used at different sizes it may be worth also accounting for these.

Test only the viewports you need

If you have a mobile menu for example, this doesn't need to be tested at each viewport as it's not visible on desktop screens, so you may only want to visually test it at mobile portrait and mobile landscape sizes.

Take the component out of its original context

It’s important to build your components as standalone items. This means not making any assumptions around usage and placement in your app. For example, a component shouldn’t have any margins or positioning styles on the top-level element for it to be spaced appropriately in your page. Your page should instead apply the css rules to enable this spacing.

Doing so will mean that your component, by default, will be even more reusable.

- + diff --git a/frontend/testing/what-to-test.html b/frontend/testing/what-to-test.html index 63f838ae52..368ee01426 100644 --- a/frontend/testing/what-to-test.html +++ b/frontend/testing/what-to-test.html @@ -24,10 +24,10 @@ Netsells Code Standards - + - + diff --git a/frontend/vue.html b/frontend/vue.html index cab5fb3c8e..2d90965bff 100644 --- a/frontend/vue.html +++ b/frontend/vue.html @@ -24,10 +24,10 @@ Vue | Netsells Code Standards - + - + diff --git a/general/git.html b/general/git.html index 8d93d8bddd..34e8aa29bb 100644 --- a/general/git.html +++ b/general/git.html @@ -24,10 +24,10 @@ Git | Netsells Code Standards - +

Git

Branching

The points below detail how branches should be structured in order to make reviews and releases more manageable.

master restricted

All projects should have a ‘master’ branch - this is the branch that will mirror what is currently live on Production. Merging into this branch should always be restricted to senior developers.

develop restricted

All projects will then have a ‘develop’ branch - develop should contain anything that is completed and ready to go live, but has not yet been deployed to production. This is often the "stable" branch used to show progress to clients. Merging into this branch should always be restricted to senior developers.

feature/* web only

If a section of work contains multiple epics it might be wise to branch away from develop with a feature/* branch.

Feature branches can be used to group a selection of epics together. They should be created at the start of development and branched from when creating epic/*, task/* and bug/* branches relating to the feature. Once a feature is complete and ready for deployment it can be PRd into develop. e.g. feature/frontend-rebuild feature/sprint-2

epic/*

For each epic you should then create an Epic branch from the develop or feature/* branch, e.g. epic/PROJCD-1234-an-epic

task/*

For each task in an epic you should create a branch for each task you actively work on, e.g. task/PROJCD-5678-a-task

If a task is not contained within an epic you should branch from develop or feature/* and still use the above naming convention.

release/* mobile only

Once develop is feature complete for a release, you branch from develop and create a release branch. Here you can perform any final tweaks or bugfixes on bug/* branches while work for future versions continues on develop. Once completed, you can merge into master and develop. e.g. release/1.2.0

bug/*

When the QA team are testing a release they will create jira bugs. These should be completed by branching from and PRing back in to the branch being tested. , e.g. bug/PROJCD-5678-a-bug

hotfix/*

These are the only branches that are branched from and merged in to master. Once complete a PR should be created into both master and develop.

Permissions

Master and develop should be locked down and developers should not be able to commit directly to these branches without a pull request being reviewed and merged.

Naming

Branch names for tasks and epics should follow the prefix convention shown above for visibility and clarity on what a branch is.

The task/epic ID from JIRA should follow directly after the "type" prefix. This identifier is used by JIRA to track branches and commits against an individual task, and provides an easy way to lookup what the branch is. e.g. task/PROJCD-5678

Optionally, but highly recommended, is a branch description to further improve the clarity around the contents of the branch. e.g. task/PROJCD-5678-dashboard-styling

See below for an example of this structure:


Commit Messages

Formatting

Commits must be prefixed with the JIRA task ID, and formatted as follows:

YPS-123 - Add additional validation to booking endpoints

Tense

Commit messages should be written in present tense.

You may find it helpful when you're writing commit messages to prefix it with a silent "This commit will" (So don't include it in the actual commit messages)

This commit will Change registration validation

Pull Requests

Once you have completed work for the task, a PR should be created to merge the work back into your epic branch. If you are working on an especially large task, which hasn’t been broken down much, use your initiative at this point to do regular PRs back into the epic branch so that we can keep on top of the process.

Once all work is completed for the task or epic you should then create a PR to merge the epic branch back into it's base branch (develop or feature/*) - at this point, because the code has already been reviewed it should be a relatively quick process to merge.

When ready, and confirmed that it’s good to go for launch we can then create a final PR to merge develop into master - again, because the code has already been reviewed whilst these PRs will be large, it will be more of a cursory check to ensure we haven’t missed anything obvious.

PR Title

Pull requests must be titled correct and using the following format: <task> <description>. For example: PROJCD-123 Implement new homepage

PR Template

In addition to the above, pull requests must make use of the latest PR Template, completed with accurate information for deployment/merge.

The latest template can be found here.

https://netsells.atlassian.net/wiki/spaces/NO/pages/1024327708/Github+Templatesopen in new window

- + diff --git a/general/index.html b/general/index.html index 694f2f40c2..f579ec4bec 100644 --- a/general/index.html +++ b/general/index.html @@ -24,10 +24,10 @@ General | Netsells Code Standards - + - + diff --git a/general/pull-requests.html b/general/pull-requests.html index 38f4e5d7b1..4a4ff4ae9d 100644 --- a/general/pull-requests.html +++ b/general/pull-requests.html @@ -24,7 +24,7 @@ Pull Requests | Netsells Code Standards - +

Pull Requests

Overview

This document details what is expected of you and what you can expect during the PR review process. This guide is not definitive or exhaustive but it does cover many of the common obstacles that we all come across. Remember that the intention of a review is to ensure the code quality is as high as possible and discussion is always welcome.

We run all of our code through pull requests for a variety of reasons. These include:

  • Sanity checking of logic
  • Code style checks
  • Mentoring opportunities

PRs are the responsibility of all engineers and it’s important that everyone plays a part in this.

Making a Pull Request

When creating a pull request, there are a few things to watch out for. Firstly, ensure the base branch is set correctly. The majority of our repos have a master and develop branch and in this case, your work should be merged into develop unless it’s a release from develop to master.

Once your branches are set, Github will populate the description with a pull request skeleton. New projects use the template detailed hereopen in new window. Most of our legacy projects use a simplified version of this template. You should fill this template in with as much detail as possible to ensure reviewers fully understand the purpose of your PR. Images are welcome here to aid the PR process.

The title of your PR should be <taskId> - <description> as specified by our Probot checkeropen in new window. See the Git pages for more detailed information.

Finally, you should ensure there are no merge conflicts. Again, Probot will send you a message if conflicts exist. The easiest way to resolve conflicts is to merge the target branch into your branch and resolve the conflicts on your branch. You can then push the resolved commit to your branch.

Linters and CI Tests

The majority of projects have automated test suites and linters which are run by our continuous integration tools Travis and Github Actions. These are set up to ensure that your changes to the codebase don’t break existing functionality or violate the code standards for your language. If your changes fail the CI tests, they will mark it as failed on the repository. It is your responsibility to resolve these issues at this point, preferably before requesting a review.

Requesting a review

To request a review, select the people that you want from the dropdown panel. You should add a reviewer for each discipline that your PR changes, for example if you build a tool for Nova admin panel you will need both a frontend and backend reviewer. For large or complicated changes, several reviewers are recommended to ensure multiple sets of eyes see them. You should aim to bring in a more senior developer to review your code and junior developers can be added if you believe reviewing the code would be of benefit to them.

If there are multiple developers within your discipline on the project you are submitting a pull request for, please assign them as reviewers in the first instance. If you are the only developer within your discipline on the project you are submitting a pull request for, please assign any other developer from within your discipline as reviewers. It would be sensible to assign a number of potential reviewers, for example if you are the only frontend developer on a project, you could assign pull requests to other frontend developers, even if they are not working on that project.

As a general rule of thumb we suggest a minimum of two developers per pull request and maximum of three. The minimum accounts for one of your reviewers potentially being unable to review imminently, and the maximum prevents an overkill situation where all developers are getting notified for every pull request.

Review Comments

When leaving a review, we use two types of pull request comments: MUST and SHOULD. These keywords will indicate the requirement level of a comment. If a reviewer leaves a MUST comment, the pull request will be rejected pending changes. It is up to the reviewers discretion to decide whether a PR is rejected due to SHOULD comments. Comments can also be left without this syntax which could be a general question asking you for more information or a piece of information that you may not know.

Comments should be critical, informative and descriptive enough for you to implement the suggestion. Comments such as “this is wrong” or “this doesn’t work” are not acceptable and should be replaced with an explanation of the problem and suggestions for the solution, including code snippets where appropriate.

Examples of appropriate comments;

MUST: It looks like you've missed an import for the DB facade, make sure you prefix with a \ to avoid exceptions!

SHOULD: we typically split arrays onto multiple lines for better gif diffs (with a trailing comma)
@@ -34,6 +34,6 @@
     'last_name',
 ],
 

Comment Tips and Examples for Reviewers

  • Try to give clear instructions on what you want changing and do not refer to in-person discussions. Pull requests are often looked back on to understand why decisions were made; "as we spoke about on Tuesday" does not help anyone 5 months later!
  • If an in-person discussion is needed (ie it'll be a lengthy comment thread) - make sure you post back with the summary so it's known to others
  • Provide clear examples whenever possible to help mentor and avoid excessive back and forth with clarifications.
  • As a reviewer please keep your feedback constructive and try to ensure your first review is thorough to avoid sending the pull request back multiple times for changes that could have been requested within the first review.
  • Read every line of code
  • Don't hold author hostage - We have enough power to block a PR, lets not use this for evil by requesting changes outside the scope of the PR. e.g fixing old code
  • Add links to comments where appropriate. External docs and discussions around topics are extremely valuable learning resources.
  • Please log the time you’ve spent on a pull request against the task the pull request is for, which should be detailed in both the pull request title and the description. Please ensure that when you add your time log you have checked the option labelled ‘Reviewing PR’.
  • To avoid multiple people reviewing the same pull request, please add yourself as an assignee as you start to review it. This way everyone else assigned can see you are already reviewing the pull request and can move onto the next one on their list.
  • Developers should need no more than around 30 minutes a day for reviewing PRs. We suggest everyone blocks out 30 minutes of their morning to look through any pull requests they have been assigned to.
  • There is a GitHub slack integration which we suggest everyone sets up, which will notify you whenever you are assigned to a pull request. This will ensure that no pull request gets missed and will give people a clearer picture of what they’re assigned to. You can set up reminders here https://github.com/settings/reminders/.

Back to QA?

Depending on the size and scope of the changes requested to your PR it may be necessary to send the code back through QA. If you’re unsure whether the changes need to go back through QA, your reviewer will be able to give you guidance.

Merging

Once you have received an approving review, the code will be merged and the branch can be deleted. You can then move the task to “Ready to Deploy” on Jira, you have successfully completed your task!

- + diff --git a/index.html b/index.html index d80743cba0..415c2bb511 100644 --- a/index.html +++ b/index.html @@ -24,12 +24,12 @@ Netsells Code Standards - +
Code Standards

Code Standards

How we write quality code

Get Started →

Quality

Netsells aims to keep up to date with emerging technologies and ensure that code is structured in a consistent, readable and maintainable way

Performance

We aim to build highly performant products, utilising the best methods of tackling complex problems.

Collaboration

The set of standards provided herein exist to onboard new developers within the Netsells organisation, and assist in working with external companies on collaborative codebases.



Contributing

If this document is inaccurate, or you spot mistakes, please submit an issue or pull request on the GitHub repositoryopen in new window.

Development

This site is built using Vuepress, to learn more check out the Official Documentationopen in new window.

git clone git@github.com:netsells/code-standards.git
 yarn dev
 

Like what you see?

Whether you're a developer looking for a new role, or you're looking for somebody to build your next big idea, get in touch with us on our website: http://netsells.co.uk/open in new window

- + diff --git a/ios/architecture.html b/ios/architecture.html index 7a23e54734..d6a84e6fd5 100644 --- a/ios/architecture.html +++ b/ios/architecture.html @@ -24,10 +24,10 @@ Architecture Layers | Netsells Code Standards - +

Architecture Layers

Layer Definitions

Data

  • The data layer contains the concrete implementations of the repository protocols from the domain layer
  • Repository implementations may depend on other classes such as data sources or services
  • It is a good idea (not a requirement) to use a Codable model as a DTO (Data Transfer Object) which represents the structure of the data returned from external services. These can then be converted to and from your entity struct. This means that your entities are not dependent on the data structure of the objects returned from external sources.

Domain

  • The domain layer defines the core business domain. It includes:
    • Entities
    • Usecases
    • Repository Protocols
  • The domain layer should not depend on any third-party dependencies or any other layer.

Presentation

  • The presentation layer should only contain your views and your view models.
  • As much as possible, views should be free of business logic.
  • Business logic should be placed in the view model
  • View Models should conform to a protocol to enable easy mocking in tests & dependency injection

Service

  • The service layer contains feature agnostic services which can be used in repositories and data sources
  • Service class implementations should conform to a protocol to enable easy mocking, service switching and dependency injection.

Directory Structure

  • The top-level directory structure is split into a core folder and a features folder.
  • The core folder should contain reusable, feature agnostic classes. It is organised into the four architecture layers we use.
  • The features folder should contain one folder for each feature. Think of this as a module without actually splitting the feature out. Everything to do with just that feature should be placed in here.

This is an example of the directory structure we follow:

  • Core
    • Entities
      • User.swift
    • Services
      • UserLocationService.swift
    • Usecases
      • FetchCurrentUser.swift
  • Features
    • Feature 1
      • Data
        • Data Sources
          • BookingDataSource.swift
          • DefaultBookingDataSource.swift
        • Repositories
          • DefaultBookingRepository.swift
      • Domain
        • Entities
          • Booking.swift
        • Use Cases
          • FetchActiveBookings.swift
          • FetchUpcomingBookings.swift
        • Repositories
          • BookingRepository.swift
      • Presentation
        • Pages
          • My Bookings Page
            • MyBookingsPage.swift
            • MyBookingsPageViewModel.swift
          • View Booking Page
            • ViewBookingPage.swift
            • ViewBookingPageViewModel.swift

Architecture Best Practices

  • A view’s state (@State) should only be used when absolutely necessary (e.g when building a form). Most of the time, it is far better to use the view model to hold and control all state.
  • As much as possible, classes should depend on a protocol, not implementations.
- + diff --git a/ios/bundler.html b/ios/bundler.html index 254978392c..a814200fb5 100644 --- a/ios/bundler.html +++ b/ios/bundler.html @@ -24,7 +24,7 @@ Bundler | Netsells Code Standards - +

Bundler

Getting Started With Bundler

We use bundler to ensure consistency with versions of tooling used by different developers.

To get started using bundler you should add a Gemfile to your project.

Below is an example Gemfile

source "https://rubygems.org"
@@ -35,6 +35,6 @@
 plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
 eval_gemfile(plugins_path) if File.exist?(plugins_path)
 

Once you have created and populated the file in your project's directory. You can simply run bundle install

Using Bundler

Ensure you have run bundle install successfully

If you want to use Cocoapods or Fastlane, you simply need to prefix their commands with bundle exec

pod install becomes bundle exec pod install

- + diff --git a/ios/codesigning.html b/ios/codesigning.html index 2e9d86851d..1474110c8d 100644 --- a/ios/codesigning.html +++ b/ios/codesigning.html @@ -24,7 +24,7 @@ Codesigning | Netsells Code Standards - +

Codesigning

For iOS apps, we use Fastlane Matchopen in new window to manage signing certificates and provisioning profiles.

For each project we should create a new certificates repo that matches the main code repo naming conventions. e.g my-project-certificates

This means that should the project ever need to be transferred or outsource engineers added to the repo, we don't have to expose all other projects certificates and profiles.

git_url("{ URL of the certificates repo }")
@@ -39,6 +39,6 @@
 $ bundle exec fastlane match adhoc -u example.user@netsells.co.uk
 $ bundle exec fastlane match appstore -u example.user@netsells.co.uk
 
- + diff --git a/ios/index.html b/ios/index.html index a7cca08555..ae46505b7c 100644 --- a/ios/index.html +++ b/ios/index.html @@ -24,10 +24,10 @@ iOS | Netsells Code Standards - +

iOS

Intro

This is a living document that aims to document the agreed set of code standards for the iOS team. Please discuss any changes with the wider team before updating this document.

Minimum Supported Version

We currently aim to support “current minus 2”. E.g If the current iOS version is iOS 15, then we aim to support iOS 13+. Any increases to this have to be a business lead decision.

Third-Party Dependencies

We try to utilise as few dependencies as possible. In some cases that is unavoidable. Where a dependency is used, it must be discussed with the team before adding it to the project. Where possible we use Swift Package Manager for this and fall back to Cocoapods if not.

CI System

We use Bitrise for our CI system with the following automations for branching conventions: release/* - Pushes/merges to these branches will trigger a beta build pointing at staging that uploads to Firebase App Distribution develop - Pushes/merges to this branch will trigger a build that runs the automated tests master - Pushes/merges to this branch will trigger a build pointing at production that uploads to App Store Connect Opening a PR - Opening a PR will trigger a build that runs the automated tests and code quality tools then reports back to GitHub

Pull Requests

When creating a pull request, there are a few things to watch out for. Firstly, ensure that the base branch is set correctly. Once the branches are set, GitHub will populate the description with a pull request template. You should fill this template in with as much detail as possible for the reviewer. The title of the pull request should be {JIRA_ID} - {Description} e.g IOS-101 Adding feature x Finally, you should ensure there are no merge conflicts and that you have added somebody as a reviewer.

Leaving Feedback

We generally stick to using two types of comments/reviews on pull requests MUST - This is a task or action you want the engineer to take before you will approve and merge the pull request SHOULD - This is a task or action that you would like the engineer to take or at least discuss before approval and merging. But it shouldn’t hold up a time-sensitive or business-critical release.

- + diff --git a/ios/layouts.html b/ios/layouts.html index d87a00ef07..9299d0a89d 100644 --- a/ios/layouts.html +++ b/ios/layouts.html @@ -24,10 +24,10 @@ Layouts | Netsells Code Standards - + - + diff --git a/ios/linting.html b/ios/linting.html index ab070c4f72..5e3c629027 100644 --- a/ios/linting.html +++ b/ios/linting.html @@ -24,7 +24,7 @@ Linting Rules & Enforcement | Netsells Code Standards - +

Linting Rules & Enforcement

Intro

We use SwiftLint to analyse our code and enforce the standards below. We discuss all standard changes or additions in the #team-mobile slack channel. Once a rule has been decided, it will be added here and added to the standard .swiftlint.yml file on confluence. You will need to add this to any projects you want to update

Rules

Control Statements

Link to Swiftlint docopen in new window

Control statements shouldn’t unnecessarily wrap their conditionals or arguments in parentheses.

Non-Triggering Example

if condition {
@@ -34,6 +34,6 @@
     doSomething()
 }
 
- + diff --git a/ios/testing.html b/ios/testing.html index 31ba579995..a296e13c51 100644 --- a/ios/testing.html +++ b/ios/testing.html @@ -24,10 +24,10 @@ Testing | Netsells Code Standards - +

Testing

Comprehensive automated tests are a crucial component of a healthy codebase. Not only do they allow behaviours to be continuously verified as changes are made to a project; they also encourage good development habits, boost productivity and serve as living documentation for the intended functionality of your code.

Summary

  • Use a “given, when, then” structure for tests
  • Try to match the “given, when, then” tests to the acceptance crtieria in the ticket you are working on
  • Bake tests into your development workflow
  • Always review tests in PRs carefully
  • Don’t skip tests to save time

🧑‍Formula for a good test

A good test has 3 steps:

  • Setup
  • Act
  • Assert

This can also be thought of as a “given, when, then” structure. Similar to how we define our acceptance criteria.

Some signs of a bad test are:

  • The goal of the test in unclear
  • The test has multiple reasons to fail
  • More than one thing is been tested
  • The test contains artificial delays
  • The test has hidden or internal dependencies
  • There are no assertions, expectations or verifications
  • The order in which a test is executed affects its results

Matching the acceptance criteria

We spend a lot of time in refinement sessions breaking down each ticket and writing the acceptance criteria for all functionality. Try to write your tests to match and verify the acceptance criteria for the ticket you are working on.

🍞 Bake tests into your development workflow

Tests are easiest to write when the functionality under test is already in your mind. It is much more taxing and easy to miss something vital when you go back and write tests for functionality you wrote a few days or weeks ago.

You could use a framework like Test-driven development (TDD), or simply write tests for each class immediately after you’ve written the production code. Doing whatever works best for you will lead to the best productivity and efficiency.

When it's time to open up a pull request, you should ensure you’re meeting the requirement that all tests are passing and new functionality is covered by tests.

Review tests in PRs carefully

Its important that tests are reviewed carefully during the PR stage. When reviewing tests, look out for these red flags:

  • Tests with no assertions, expectations or verifications
  • Tests which have obviously been written to just satisfy the requirement for tests to be added
  • Not all logical branches are tested e.g only the happy path is tested

Don’t skip tests to save time

Skipping tests today might save you time, but you are exchanging the saved time for technical debt. An untested codebase can’t scale efficiently, and will become more and more difficult to work on over time. The time you might save by not writing a test will need to be paid back - with significant interest later down the line. It's okay to be firm on this principle when communicating with non-technical staff. Ticket estimates should and must include sufficient allowance for engineers to write high-quality, well-tested code.

- + diff --git a/mobile/pull-requests.html b/mobile/pull-requests.html index 49f0b4fb71..02894ac87e 100644 --- a/mobile/pull-requests.html +++ b/mobile/pull-requests.html @@ -24,10 +24,10 @@ Pull Request Workflow | Netsells Code Standards - +

Pull Request Workflow

In addition to the general PR guidance, there are some specific guidelines for the mobile team.

Screen recordings for visual changes

You should always aim to include images and/or videos showing any visual changes you have made in your PR. This gives additional context for your reviewer, and lets them see the UI without having to checkout the branch and run the app on their own machine.

You can record videos on MacOS using RecordItopen in new window, or CleanShot Xopen in new window. In addition, use ⌘+R in Simulator to take a screen recording.

Test Coverage

Projects with tests should have their coverage measured by Coveralls, which will add a comment to your Pull Request with details of how the changes affect the overall coverage of the project. As a general rule, always aim not to decrease coverage with your changes.

In practical terms, this usually means ensuring any new code you write is covered with tests.

Code coverage is not necessarily a measure of the quality of your tests though; reviewers should always review tests to ensure edge cases are being considered, and should reject any tests which are clearly written just to satisfy coverage requirements.

Deprecating Codeowners

Our previous workflow involved the use of CODEOWNERS files, which automatically requested reviews from all members of the relevant team(s). We should no longer be using this workflow, as inviting multiple people to review PRs can often lead to them going stale, thanks to "someone else will deal with it" syndrome.

If you're working on a project which is still using a CODEOWNERS file, please delete it as quickly as possible and move to manually requesting reviews according to the guidelines in the main Pull Request Workflow page.

- +