From 00fa38f93e285b2cb9ef59557a59868c1b67192e Mon Sep 17 00:00:00 2001 From: samturrell Date: Thu, 30 Nov 2023 13:43:37 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20netsells?= =?UTF-8?q?/code-standards@434fcdac0b3fb62a99dc61a83ea5efa2fe3e9671=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 404.html | 4 ++-- android/clean-architecture.html | 4 ++-- android/code-style.html | 4 ++-- android/coroutines.html | 4 ++-- android/dependency-injection.html | 4 ++-- android/error-handling.html | 4 ++-- android/index.html | 4 ++-- android/kotlin.html | 4 ++-- android/local-databases.html | 4 ++-- android/mvvm.html | 4 ++-- android/network-requests.html | 4 ++-- android/pull-request-labels.html | 4 ++-- android/testing.html | 4 ++-- ...bility.html-064b65c9.js => accessibility.html-8d50a5cd.js} | 2 +- assets/{apis.html-a614c65e.js => apis.html-81a6f02b.js} | 2 +- assets/{app-d4553ac8.js => app-23c5871f.js} | 2 +- ...tecture.html-87b93054.js => architecture.html-3ec492d5.js} | 2 +- ...tecture.html-1abacda9.js => architecture.html-4d591889.js} | 2 +- ....html-0722f0aa.js => automated-workflows.html-79aba81f.js} | 2 +- assets/{bundler.html-00735287.js => bundler.html-edf63831.js} | 2 +- assets/{c-sharp.html-85695a4a.js => c-sharp.html-be6d9062.js} | 2 +- ...at-sheet.html-2c47f519.js => cheat-sheet.html-a226773f.js} | 2 +- ...e.html-af2dac8e.js => clean-architecture.html-72d2ea41.js} | 2 +- ...ode-style.html-079c632b.js => code-style.html-a4cb7401.js} | 2 +- ...esigning.html-677594e3.js => codesigning.html-5d539206.js} | 2 +- ...esigning.html-5ca0dad3.js => codesigning.html-c4c0e97f.js} | 2 +- ....html-e318cb08.js => continuous-delivery.html-ef265d04.js} | 2 +- ...ml-f2aafeb6.js => continuous-integration.html-d3878c20.js} | 2 +- ...oroutines.html-45d71ecc.js => coroutines.html-ee941575.js} | 2 +- ...ting.html-853c88d2.js => crash-reporting.html-e6d469a3.js} | 2 +- assets/{css.html-14f461b3.js => css.html-0eb77985.js} | 2 +- ...html-6044399c.js => dependency-injection.html-3faa3c29.js} | 2 +- ...dling.html-52c4691f.js => error-handling.html-b8f2ddd5.js} | 2 +- ...s.html-3ca02d99.js => general-guidelines.html-93a42723.js} | 2 +- assets/{general.html-8e5b0068.js => general.html-43b84544.js} | 2 +- assets/{git.html-7f2e2d76.js => git.html-51c6b812.js} | 2 +- ...rors.html-f8ff1745.js => handling-errors.html-5c434ad2.js} | 2 +- assets/{hatchly.html-d4c33485.js => hatchly.html-2475eb56.js} | 2 +- assets/{html.html-95614c66.js => html.html-6a8f4b23.js} | 2 +- assets/{index.html-fec9b48d.js => index.html-04049003.js} | 2 +- assets/{index.html-be64a22a.js => index.html-158745f1.js} | 2 +- assets/{index.html-c3d1dd44.js => index.html-1f443265.js} | 2 +- assets/{index.html-2b2fe41c.js => index.html-2840a318.js} | 2 +- assets/{index.html-89a4900c.js => index.html-3eec43fe.js} | 2 +- assets/{index.html-43752c78.js => index.html-428a20d2.js} | 2 +- assets/{index.html-224cdf0c.js => index.html-43ce196b.js} | 2 +- assets/{index.html-062c9a1c.js => index.html-68717985.js} | 2 +- assets/{index.html-5b7be01f.js => index.html-8391caa5.js} | 2 +- assets/{index.html-20d4c2da.js => index.html-e03d0433.js} | 2 +- assets/{index.html-c6f49eb9.js => index.html-ea666941.js} | 2 +- ...avascript.html-0aa9bb4a.js => javascript.html-5fc80820.js} | 2 +- assets/{kotlin.html-a12c2f29.js => kotlin.html-16fbee87.js} | 2 +- assets/{laravel.html-aff55b5a.js => laravel.html-53a107a1.js} | 2 +- assets/{layouts.html-27062cb0.js => layouts.html-887133d8.js} | 2 +- ...-rules.html-42052239.js => linting-rules.html-1cd9f94b.js} | 2 +- assets/{linting.html-2580a3ab.js => linting.html-57d401c4.js} | 2 +- ...ases.html-8dd8f7c9.js => local-databases.html-4044e76d.js} | 2 +- ...ization.html-e59ebeaa.js => localization.html-bfd25141.js} | 2 +- assets/{monarch.html-b0982407.js => monarch.html-ad074d20.js} | 2 +- ...994.js => multiple-firebase-environments.html-f6fb1ed6.js} | 2 +- assets/{mvvm.html-e540b2fe.js => mvvm.html-0ef4e6a5.js} | 2 +- ...dgets.html-2e1bc7fe.js => naming-widgets.html-c3815153.js} | 2 +- ...sts.html-896fd671.js => network-requests.html-28650a7c.js} | 2 +- ...formance.html-7bb71c74.js => performance.html-ec54620c.js} | 2 +- assets/{php.html-7dbf0da1.js => php.html-e5bfdfb9.js} | 2 +- ...-setup.html-b49b9165.js => project-setup.html-5e45efdd.js} | 2 +- ....html-4fff40f3.js => pull-request-labels.html-a48d8a9d.js} | 2 +- ...quests.html-c16422b0.js => pull-requests.html-3f70dcaa.js} | 2 +- ...quests.html-4abe412f.js => pull-requests.html-8fa5eb50.js} | 2 +- ...html-43a279c8.js => recommended-packages.html-2caea997.js} | 2 +- ...html-f9a01a5c.js => recommended-packages.html-405842b8.js} | 2 +- ...html-dfed6c26.js => recommended-packages.html-48ccd635.js} | 2 +- ...html-e98888ec.js => recommended-packages.html-dac011b8.js} | 2 +- ...uired-qa.html-bce4cf28.js => required-qa.html-e9fc67f9.js} | 2 +- ...s.html-61a2873d.js => security-practices.html-7190f4e2.js} | 2 +- ...ent.html-36a1a234.js => state-management.html-289264c4.js} | 2 +- ...ent.html-c152da5d.js => state-management.html-ed5e74e6.js} | 2 +- ...{storybook.html-c2666d08.js => storybook.html-ee3c58bd.js} | 2 +- assets/{testing.html-f094c0cc.js => testing.html-1b162d10.js} | 2 +- assets/{testing.html-294cd61d.js => testing.html-61cb9e28.js} | 2 +- assets/{testing.html-01d11608.js => testing.html-8019f3c4.js} | 2 +- ...html-bb3802fc.js => third-party-packages.html-58a49699.js} | 2 +- ...testing.html-e898773c.js => unit-testing.html-c06fbfe4.js} | 2 +- ...b87200ab.js => visual-regression-testing.html-0422f0c7.js} | 2 +- assets/{vue.html-36d386ba.js => vue.html-9fba51c9.js} | 2 +- ...to-test.html-ead20dd3.js => what-to-test.html-62510e34.js} | 2 +- backend/apis.html | 4 ++-- backend/general.html | 4 ++-- backend/hatchly.html | 4 ++-- backend/index.html | 4 ++-- backend/laravel.html | 4 ++-- backend/php.html | 4 ++-- backend/recommended-packages.html | 4 ++-- dotNet/c-sharp.html | 4 ++-- dotNet/general-guidelines.html | 4 ++-- dotNet/index.html | 4 ++-- dotNet/recommended-packages.html | 4 ++-- flutter/codesigning.html | 4 ++-- flutter/continuous-delivery.html | 4 ++-- flutter/continuous-integration.html | 4 ++-- flutter/crash-reporting.html | 4 ++-- flutter/index.html | 4 ++-- flutter/legacy/architecture.html | 4 ++-- flutter/legacy/handling-errors.html | 4 ++-- flutter/legacy/index.html | 4 ++-- flutter/legacy/localization.html | 4 ++-- flutter/legacy/state-management.html | 4 ++-- flutter/linting-rules.html | 4 ++-- flutter/monarch.html | 4 ++-- flutter/multiple-firebase-environments.html | 4 ++-- flutter/naming-widgets.html | 4 ++-- flutter/project-setup.html | 4 ++-- flutter/recommended-packages.html | 4 ++-- flutter/security-practices.html | 4 ++-- flutter/state-management.html | 4 ++-- flutter/testing.html | 4 ++-- flutter/third-party-packages.html | 4 ++-- frontend/accessibility.html | 4 ++-- frontend/automated-workflows.html | 4 ++-- frontend/css.html | 4 ++-- frontend/html.html | 4 ++-- frontend/index.html | 4 ++-- frontend/javascript.html | 4 ++-- frontend/linting/eslint/arrow-parens.html | 4 ++-- frontend/linting/eslint/arrow-spacing.html | 4 ++-- frontend/linting/eslint/comma-dangle.html | 4 ++-- frontend/linting/eslint/curly.html | 4 ++-- frontend/linting/eslint/dot-location.html | 4 ++-- frontend/linting/eslint/dot-notation.html | 4 ++-- frontend/linting/eslint/eol-last.html | 4 ++-- frontend/linting/eslint/eqeqeq.html | 4 ++-- frontend/linting/eslint/import-extensions.html | 4 ++-- frontend/linting/eslint/indent.html | 4 ++-- frontend/linting/eslint/index.html | 4 ++-- frontend/linting/eslint/jsdoc-check-alignment.html | 4 ++-- frontend/linting/eslint/jsdoc-check-indentation.html | 4 ++-- frontend/linting/eslint/jsdoc-check-param-names.html | 4 ++-- frontend/linting/eslint/jsdoc-check-syntax.html | 4 ++-- frontend/linting/eslint/jsdoc-check-tag-names.html | 4 ++-- frontend/linting/eslint/jsdoc-check-types.html | 4 ++-- frontend/linting/eslint/jsdoc-implements-on-classes.html | 4 ++-- frontend/linting/eslint/jsdoc-match-description.html | 4 ++-- frontend/linting/eslint/jsdoc-no-undefined-types.html | 4 ++-- .../eslint/jsdoc-require-description-complete-sentence.html | 4 ++-- frontend/linting/eslint/jsdoc-require-description.html | 4 ++-- frontend/linting/eslint/jsdoc-require-param-name.html | 4 ++-- frontend/linting/eslint/jsdoc-require-param-type.html | 4 ++-- frontend/linting/eslint/jsdoc-require-param.html | 4 ++-- frontend/linting/eslint/jsdoc-require-returns-check.html | 4 ++-- frontend/linting/eslint/jsdoc-require-returns-type.html | 4 ++-- frontend/linting/eslint/jsdoc-require-returns.html | 4 ++-- frontend/linting/eslint/jsdoc-tag-lines.html | 4 ++-- frontend/linting/eslint/jsdoc-valid-types.html | 4 ++-- frontend/linting/eslint/key-spacing.html | 4 ++-- frontend/linting/eslint/netsells-component-file-names.html | 4 ++-- frontend/linting/eslint/netsells-no-dom-listeners.html | 4 ++-- frontend/linting/eslint/netsells-no-global-timeouts.html | 4 ++-- frontend/linting/eslint/no-alert.html | 4 ++-- frontend/linting/eslint/no-cond-assign.html | 4 ++-- frontend/linting/eslint/no-console.html | 4 ++-- frontend/linting/eslint/no-debugger.html | 4 ++-- frontend/linting/eslint/no-duplicate-imports.html | 4 ++-- frontend/linting/eslint/no-else-return.html | 4 ++-- frontend/linting/eslint/no-empty-function.html | 4 ++-- frontend/linting/eslint/no-empty.html | 4 ++-- frontend/linting/eslint/no-eval.html | 4 ++-- frontend/linting/eslint/no-floating-decimal.html | 4 ++-- frontend/linting/eslint/no-implicit-coercion.html | 4 ++-- frontend/linting/eslint/no-lonely-if.html | 4 ++-- frontend/linting/eslint/no-mixed-spaces-and-tabs.html | 4 ++-- frontend/linting/eslint/no-multiple-empty-lines.html | 4 ++-- frontend/linting/eslint/no-restricted-imports.html | 4 ++-- frontend/linting/eslint/no-sparse-arrays.html | 4 ++-- frontend/linting/eslint/no-template-curly-in-string.html | 4 ++-- frontend/linting/eslint/no-unneeded-ternary.html | 4 ++-- frontend/linting/eslint/no-unused-vars.html | 4 ++-- frontend/linting/eslint/no-use-before-define.html | 4 ++-- frontend/linting/eslint/no-useless-return.html | 4 ++-- frontend/linting/eslint/no-var.html | 4 ++-- frontend/linting/eslint/operator-linebreak.html | 4 ++-- frontend/linting/eslint/prefer-arrow-callback.html | 4 ++-- frontend/linting/eslint/prefer-const.html | 4 ++-- frontend/linting/eslint/prefer-template.html | 4 ++-- frontend/linting/eslint/quotes.html | 4 ++-- .../linting/eslint/require-jsdoc-except-require-jsdoc.html | 4 ++-- frontend/linting/eslint/semi.html | 4 ++-- frontend/linting/eslint/space-before-function-paren.html | 4 ++-- frontend/linting/eslint/template-curly-spacing.html | 4 ++-- frontend/linting/eslint/vue-attribute-hyphenation.html | 4 ++-- .../linting/eslint/vue-component-definition-name-casing.html | 4 ++-- .../linting/eslint/vue-component-name-in-template-casing.html | 4 ++-- frontend/linting/eslint/vue-eqeqeq.html | 4 ++-- frontend/linting/eslint/vue-html-closing-bracket-newline.html | 4 ++-- frontend/linting/eslint/vue-html-closing-bracket-spacing.html | 4 ++-- frontend/linting/eslint/vue-html-indent.html | 4 ++-- frontend/linting/eslint/vue-html-quotes.html | 4 ++-- frontend/linting/eslint/vue-key-spacing.html | 4 ++-- frontend/linting/eslint/vue-match-component-file-name.html | 4 ++-- frontend/linting/eslint/vue-max-attributes-per-line.html | 4 ++-- .../linting/eslint/vue-mustache-interpolation-spacing.html | 4 ++-- frontend/linting/eslint/vue-no-dupe-keys.html | 4 ++-- frontend/linting/eslint/vue-no-duplicate-attributes.html | 4 ++-- frontend/linting/eslint/vue-no-multi-spaces.html | 4 ++-- frontend/linting/eslint/vue-no-shared-component-data.html | 4 ++-- .../eslint/vue-no-side-effects-in-computed-properties.html | 4 ++-- frontend/linting/eslint/vue-no-textarea-mustache.html | 4 ++-- frontend/linting/eslint/vue-no-unused-vars.html | 4 ++-- frontend/linting/eslint/vue-no-v-html.html | 4 ++-- frontend/linting/eslint/vue-object-curly-spacing.html | 4 ++-- frontend/linting/eslint/vue-order-in-components.html | 4 ++-- frontend/linting/eslint/vue-require-default-prop.html | 4 ++-- frontend/linting/eslint/vue-require-prop-types.html | 4 ++-- frontend/linting/eslint/vue-return-in-computed-property.html | 4 ++-- frontend/linting/eslint/vue-script-indent.html | 4 ++-- frontend/linting/eslint/vue-this-in-template.html | 4 ++-- frontend/linting/eslint/vue-v-bind-style.html | 4 ++-- frontend/linting/eslint/vue-v-on-function-call.html | 4 ++-- frontend/linting/eslint/vue-v-on-style.html | 4 ++-- frontend/linting/eslint/vuejs-accessibility-alt-text.html | 4 ++-- .../eslint/vuejs-accessibility-anchor-has-content.html | 4 ++-- frontend/linting/eslint/vuejs-accessibility-aria-props.html | 4 ++-- frontend/linting/eslint/vuejs-accessibility-aria-role.html | 4 ++-- .../eslint/vuejs-accessibility-aria-unsupported-elements.html | 4 ++-- .../vuejs-accessibility-click-events-have-key-events.html | 4 ++-- .../eslint/vuejs-accessibility-form-control-has-label.html | 4 ++-- .../eslint/vuejs-accessibility-heading-has-content.html | 4 ++-- .../linting/eslint/vuejs-accessibility-iframe-has-title.html | 4 ++-- .../vuejs-accessibility-interactive-supports-focus.html | 4 ++-- .../vuejs-accessibility-mouse-events-have-key-events.html | 4 ++-- .../linting/eslint/vuejs-accessibility-no-access-key.html | 4 ++-- frontend/linting/eslint/vuejs-accessibility-no-autofocus.html | 4 ++-- .../eslint/vuejs-accessibility-no-distracting-elements.html | 4 ++-- frontend/linting/eslint/vuejs-accessibility-no-onchange.html | 4 ++-- .../eslint/vuejs-accessibility-no-redundant-roles.html | 4 ++-- .../vuejs-accessibility-role-has-required-aria-props.html | 4 ++-- .../eslint/vuejs-accessibility-tabindex-no-positive.html | 4 ++-- frontend/linting/eslint/yoda.html | 4 ++-- frontend/linting/index.html | 4 ++-- frontend/linting/stylelint/block-no-empty.html | 4 ++-- frontend/linting/stylelint/color-hex-length.html | 4 ++-- frontend/linting/stylelint/color-named.html | 4 ++-- frontend/linting/stylelint/color-no-invalid-hex.html | 4 ++-- .../stylelint/declaration-block-no-duplicate-properties.html | 4 ++-- .../declaration-block-no-shorthand-property-overrides.html | 4 ++-- frontend/linting/stylelint/declaration-no-important.html | 4 ++-- frontend/linting/stylelint/index.html | 4 ++-- frontend/linting/stylelint/length-zero-no-unit.html | 4 ++-- frontend/linting/stylelint/property-no-unknown.html | 4 ++-- .../stylelint/shorthand-property-no-redundant-values.html | 4 ++-- frontend/linting/stylelint/unit-no-unknown.html | 4 ++-- frontend/performance.html | 4 ++-- frontend/recommended-packages.html | 4 ++-- frontend/required-qa.html | 4 ++-- frontend/storybook.html | 4 ++-- frontend/testing/cheat-sheet.html | 4 ++-- frontend/testing/index.html | 4 ++-- frontend/testing/unit-testing.html | 4 ++-- frontend/testing/visual-regression-testing.html | 4 ++-- frontend/testing/what-to-test.html | 4 ++-- frontend/vue.html | 4 ++-- general/git.html | 4 ++-- general/index.html | 4 ++-- general/pull-requests.html | 4 ++-- index.html | 4 ++-- ios/architecture.html | 4 ++-- ios/bundler.html | 4 ++-- ios/codesigning.html | 4 ++-- ios/index.html | 4 ++-- ios/layouts.html | 4 ++-- ios/linting.html | 4 ++-- ios/testing.html | 4 ++-- mobile/pull-requests.html | 4 ++-- 272 files changed, 471 insertions(+), 471 deletions(-) rename assets/{accessibility.html-064b65c9.js => accessibility.html-8d50a5cd.js} (81%) rename assets/{apis.html-a614c65e.js => apis.html-81a6f02b.js} (93%) rename assets/{app-d4553ac8.js => app-23c5871f.js} (96%) rename assets/{architecture.html-87b93054.js => architecture.html-3ec492d5.js} (95%) rename assets/{architecture.html-1abacda9.js => architecture.html-4d591889.js} (93%) rename assets/{automated-workflows.html-0722f0aa.js => automated-workflows.html-79aba81f.js} (90%) rename assets/{bundler.html-00735287.js => bundler.html-edf63831.js} (88%) rename assets/{c-sharp.html-85695a4a.js => c-sharp.html-be6d9062.js} (91%) rename assets/{cheat-sheet.html-2c47f519.js => cheat-sheet.html-a226773f.js} (97%) rename assets/{clean-architecture.html-af2dac8e.js => clean-architecture.html-72d2ea41.js} (90%) rename assets/{code-style.html-079c632b.js => code-style.html-a4cb7401.js} (88%) rename assets/{codesigning.html-677594e3.js => codesigning.html-5d539206.js} (80%) rename assets/{codesigning.html-5ca0dad3.js => codesigning.html-c4c0e97f.js} (80%) rename assets/{continuous-delivery.html-e318cb08.js => continuous-delivery.html-ef265d04.js} (82%) rename assets/{continuous-integration.html-f2aafeb6.js => continuous-integration.html-d3878c20.js} (82%) rename assets/{coroutines.html-45d71ecc.js => coroutines.html-ee941575.js} (80%) rename assets/{crash-reporting.html-853c88d2.js => crash-reporting.html-e6d469a3.js} (81%) rename assets/{css.html-14f461b3.js => css.html-0eb77985.js} (94%) rename assets/{dependency-injection.html-6044399c.js => dependency-injection.html-3faa3c29.js} (82%) rename assets/{error-handling.html-52c4691f.js => error-handling.html-b8f2ddd5.js} (93%) rename assets/{general-guidelines.html-3ca02d99.js => general-guidelines.html-93a42723.js} (94%) rename assets/{general.html-8e5b0068.js => general.html-43b84544.js} (84%) rename assets/{git.html-7f2e2d76.js => git.html-51c6b812.js} (94%) rename assets/{handling-errors.html-f8ff1745.js => handling-errors.html-5c434ad2.js} (89%) rename assets/{hatchly.html-d4c33485.js => hatchly.html-2475eb56.js} (89%) rename assets/{html.html-95614c66.js => html.html-6a8f4b23.js} (84%) rename assets/{index.html-fec9b48d.js => index.html-04049003.js} (91%) rename assets/{index.html-be64a22a.js => index.html-158745f1.js} (79%) rename assets/{index.html-c3d1dd44.js => index.html-1f443265.js} (79%) rename assets/{index.html-2b2fe41c.js => index.html-2840a318.js} (85%) rename assets/{index.html-89a4900c.js => index.html-3eec43fe.js} (79%) rename assets/{index.html-43752c78.js => index.html-428a20d2.js} (80%) rename assets/{index.html-224cdf0c.js => index.html-43ce196b.js} (80%) rename assets/{index.html-062c9a1c.js => index.html-68717985.js} (94%) rename assets/{index.html-5b7be01f.js => index.html-8391caa5.js} (79%) rename assets/{index.html-20d4c2da.js => index.html-e03d0433.js} (93%) rename assets/{index.html-c6f49eb9.js => index.html-ea666941.js} (79%) rename assets/{javascript.html-0aa9bb4a.js => javascript.html-5fc80820.js} (92%) rename assets/{kotlin.html-a12c2f29.js => kotlin.html-16fbee87.js} (79%) rename assets/{laravel.html-aff55b5a.js => laravel.html-53a107a1.js} (92%) rename assets/{layouts.html-27062cb0.js => layouts.html-887133d8.js} (79%) rename assets/{linting-rules.html-42052239.js => linting-rules.html-1cd9f94b.js} (82%) rename assets/{linting.html-2580a3ab.js => linting.html-57d401c4.js} (89%) rename assets/{local-databases.html-8dd8f7c9.js => local-databases.html-4044e76d.js} (82%) rename assets/{localization.html-e59ebeaa.js => localization.html-bfd25141.js} (82%) rename assets/{monarch.html-b0982407.js => monarch.html-ad074d20.js} (80%) rename assets/{multiple-firebase-environments.html-c56e2994.js => multiple-firebase-environments.html-f6fb1ed6.js} (95%) rename assets/{mvvm.html-e540b2fe.js => mvvm.html-0ef4e6a5.js} (79%) rename assets/{naming-widgets.html-2e1bc7fe.js => naming-widgets.html-c3815153.js} (81%) rename assets/{network-requests.html-896fd671.js => network-requests.html-28650a7c.js} (81%) rename assets/{performance.html-7bb71c74.js => performance.html-ec54620c.js} (80%) rename assets/{php.html-7dbf0da1.js => php.html-e5bfdfb9.js} (79%) rename assets/{project-setup.html-b49b9165.js => project-setup.html-5e45efdd.js} (94%) rename assets/{pull-request-labels.html-4fff40f3.js => pull-request-labels.html-a48d8a9d.js} (82%) rename assets/{pull-requests.html-c16422b0.js => pull-requests.html-3f70dcaa.js} (94%) rename assets/{pull-requests.html-4abe412f.js => pull-requests.html-8fa5eb50.js} (91%) rename assets/{recommended-packages.html-43a279c8.js => recommended-packages.html-2caea997.js} (85%) rename assets/{recommended-packages.html-f9a01a5c.js => recommended-packages.html-405842b8.js} (82%) rename assets/{recommended-packages.html-dfed6c26.js => recommended-packages.html-48ccd635.js} (85%) rename assets/{recommended-packages.html-e98888ec.js => recommended-packages.html-dac011b8.js} (82%) rename assets/{required-qa.html-bce4cf28.js => required-qa.html-e9fc67f9.js} (89%) rename assets/{security-practices.html-61a2873d.js => security-practices.html-7190f4e2.js} (90%) rename assets/{state-management.html-36a1a234.js => state-management.html-289264c4.js} (92%) rename assets/{state-management.html-c152da5d.js => state-management.html-ed5e74e6.js} (92%) rename assets/{storybook.html-c2666d08.js => storybook.html-ee3c58bd.js} (94%) rename assets/{testing.html-f094c0cc.js => testing.html-1b162d10.js} (94%) rename assets/{testing.html-294cd61d.js => testing.html-61cb9e28.js} (94%) rename assets/{testing.html-01d11608.js => testing.html-8019f3c4.js} (92%) rename assets/{third-party-packages.html-bb3802fc.js => third-party-packages.html-58a49699.js} (91%) rename assets/{unit-testing.html-e898773c.js => unit-testing.html-c06fbfe4.js} (93%) rename assets/{visual-regression-testing.html-b87200ab.js => visual-regression-testing.html-0422f0c7.js} (95%) rename assets/{vue.html-36d386ba.js => vue.html-9fba51c9.js} (87%) rename assets/{what-to-test.html-ead20dd3.js => what-to-test.html-62510e34.js} (96%) diff --git a/404.html b/404.html index 3f89919768..5a25a794e6 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
- + diff --git a/android/clean-architecture.html b/android/clean-architecture.html index f4779ed066..4fc7f9fa72 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 613548ff5e..f0848b1686 100644 --- a/android/code-style.html +++ b/android/code-style.html @@ -24,10 +24,10 @@ Code Style | Netsells Code Standards - +
- + diff --git a/android/coroutines.html b/android/coroutines.html index 5b9d82b961..8233910e83 100644 --- a/android/coroutines.html +++ b/android/coroutines.html @@ -24,10 +24,10 @@ Coroutines | Netsells Code Standards - +
- + diff --git a/android/dependency-injection.html b/android/dependency-injection.html index 77cdf29bfe..ea6a7e1012 100644 --- a/android/dependency-injection.html +++ b/android/dependency-injection.html @@ -24,10 +24,10 @@ Dependency Injection | Netsells Code Standards - +
- + diff --git a/android/error-handling.html b/android/error-handling.html index 9ba610c006..56e69f84f6 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 3adccdcad4..1160300766 100644 --- a/android/index.html +++ b/android/index.html @@ -24,10 +24,10 @@ Android | Netsells Code Standards - +
- + diff --git a/android/kotlin.html b/android/kotlin.html index 9ab3e2e188..ae9557498d 100644 --- a/android/kotlin.html +++ b/android/kotlin.html @@ -24,10 +24,10 @@ Kotlin | Netsells Code Standards - +
- + diff --git a/android/local-databases.html b/android/local-databases.html index ccca13edb1..43b50495ad 100644 --- a/android/local-databases.html +++ b/android/local-databases.html @@ -24,10 +24,10 @@ Local Databases & Persistence | Netsells Code Standards - +
- + diff --git a/android/mvvm.html b/android/mvvm.html index 49535b8765..04511b0d28 100644 --- a/android/mvvm.html +++ b/android/mvvm.html @@ -24,10 +24,10 @@ MVVM | Netsells Code Standards - +
- + diff --git a/android/network-requests.html b/android/network-requests.html index 5a2e3df6c9..7759788cc2 100644 --- a/android/network-requests.html +++ b/android/network-requests.html @@ -24,10 +24,10 @@ Network Requests | Netsells Code Standards - +
- + diff --git a/android/pull-request-labels.html b/android/pull-request-labels.html index aca3446951..f4eb40407b 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 67e0265a8d..1a75027e26 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-064b65c9.js b/assets/accessibility.html-8d50a5cd.js similarity index 81% rename from assets/accessibility.html-064b65c9.js rename to assets/accessibility.html-8d50a5cd.js index 86b9bd1f62..e9ae96e60d 100644 --- a/assets/accessibility.html-064b65c9.js +++ b/assets/accessibility.html-8d50a5cd.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-e2885e62","path":"/frontend/accessibility.html","title":"Accessibility","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"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-a614c65e.js b/assets/apis.html-81a6f02b.js similarity index 93% rename from assets/apis.html-a614c65e.js rename to assets/apis.html-81a6f02b.js index a5aa497df8..ae97c50422 100644 --- a/assets/apis.html-a614c65e.js +++ b/assets/apis.html-81a6f02b.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":1701351753000,"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":1701351763000,"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-d4553ac8.js b/assets/app-23c5871f.js similarity index 96% rename from assets/app-d4553ac8.js rename to assets/app-23c5871f.js index c10736684f..a646b41009 100644 --- a/assets/app-d4553ac8.js +++ b/assets/app-23c5871f.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-062c9a1c.js"),[]).then(({data:e})=>e),"v-c1f0fcce":()=>t(()=>import("./index.html-c6f49eb9.js"),[]).then(({data:e})=>e),"v-466569ae":()=>t(()=>import("./clean-architecture.html-af2dac8e.js"),[]).then(({data:e})=>e),"v-0f9a8a22":()=>t(()=>import("./code-style.html-079c632b.js"),[]).then(({data:e})=>e),"v-16386b36":()=>t(()=>import("./coroutines.html-45d71ecc.js"),[]).then(({data:e})=>e),"v-529e84aa":()=>t(()=>import("./dependency-injection.html-6044399c.js"),[]).then(({data:e})=>e),"v-757f0c54":()=>t(()=>import("./error-handling.html-52c4691f.js"),[]).then(({data:e})=>e),"v-3e66553f":()=>t(()=>import("./kotlin.html-a12c2f29.js"),[]).then(({data:e})=>e),"v-631ebf3c":()=>t(()=>import("./local-databases.html-8dd8f7c9.js"),[]).then(({data:e})=>e),"v-7c84f940":()=>t(()=>import("./mvvm.html-e540b2fe.js"),[]).then(({data:e})=>e),"v-3798263d":()=>t(()=>import("./network-requests.html-896fd671.js"),[]).then(({data:e})=>e),"v-67bfbd0d":()=>t(()=>import("./pull-request-labels.html-4fff40f3.js"),[]).then(({data:e})=>e),"v-0e9bbce2":()=>t(()=>import("./testing.html-01d11608.js"),[]).then(({data:e})=>e),"v-551bb614":()=>t(()=>import("./index.html-c3d1dd44.js"),[]).then(({data:e})=>e),"v-c1772168":()=>t(()=>import("./apis.html-a614c65e.js"),[]).then(({data:e})=>e),"v-b97e7df6":()=>t(()=>import("./general.html-8e5b0068.js"),[]).then(({data:e})=>e),"v-35d72f40":()=>t(()=>import("./hatchly.html-d4c33485.js"),[]).then(({data:e})=>e),"v-6957d9d4":()=>t(()=>import("./laravel.html-aff55b5a.js"),[]).then(({data:e})=>e),"v-0f7bc716":()=>t(()=>import("./php.html-7dbf0da1.js"),[]).then(({data:e})=>e),"v-7d441486":()=>t(()=>import("./recommended-packages.html-dfed6c26.js"),[]).then(({data:e})=>e),"v-5033abfc":()=>t(()=>import("./index.html-89a4900c.js"),[]).then(({data:e})=>e),"v-565ee9db":()=>t(()=>import("./c-sharp.html-85695a4a.js"),[]).then(({data:e})=>e),"v-7428160f":()=>t(()=>import("./general-guidelines.html-3ca02d99.js"),[]).then(({data:e})=>e),"v-2a1c4858":()=>t(()=>import("./recommended-packages.html-43a279c8.js"),[]).then(({data:e})=>e),"v-59c1b58c":()=>t(()=>import("./index.html-43752c78.js"),[]).then(({data:e})=>e),"v-02d166ed":()=>t(()=>import("./codesigning.html-677594e3.js"),[]).then(({data:e})=>e),"v-3e9b8cb3":()=>t(()=>import("./continuous-delivery.html-e318cb08.js"),[]).then(({data:e})=>e),"v-1f335512":()=>t(()=>import("./continuous-integration.html-f2aafeb6.js"),[]).then(({data:e})=>e),"v-37a57446":()=>t(()=>import("./crash-reporting.html-853c88d2.js"),[]).then(({data:e})=>e),"v-66577348":()=>t(()=>import("./linting-rules.html-42052239.js"),[]).then(({data:e})=>e),"v-3a4b8043":()=>t(()=>import("./monarch.html-b0982407.js"),[]).then(({data:e})=>e),"v-664e86a4":()=>t(()=>import("./multiple-firebase-environments.html-c56e2994.js"),[]).then(({data:e})=>e),"v-539bafa3":()=>t(()=>import("./naming-widgets.html-2e1bc7fe.js"),[]).then(({data:e})=>e),"v-2d5b4388":()=>t(()=>import("./project-setup.html-b49b9165.js"),[]).then(({data:e})=>e),"v-382c27e4":()=>t(()=>import("./recommended-packages.html-e98888ec.js"),[]).then(({data:e})=>e),"v-50b19462":()=>t(()=>import("./security-practices.html-61a2873d.js"),[]).then(({data:e})=>e),"v-55f3772e":()=>t(()=>import("./state-management.html-36a1a234.js"),[]).then(({data:e})=>e),"v-03009c55":()=>t(()=>import("./testing.html-294cd61d.js"),[]).then(({data:e})=>e),"v-9c19581a":()=>t(()=>import("./third-party-packages.html-bb3802fc.js"),[]).then(({data:e})=>e),"v-06198984":()=>t(()=>import("./index.html-fec9b48d.js"),[]).then(({data:e})=>e),"v-e2885e62":()=>t(()=>import("./accessibility.html-064b65c9.js"),[]).then(({data:e})=>e),"v-14e18006":()=>t(()=>import("./automated-workflows.html-0722f0aa.js"),[]).then(({data:e})=>e),"v-b37d638c":()=>t(()=>import("./css.html-14f461b3.js"),[]).then(({data:e})=>e),"v-cf5f91ec":()=>t(()=>import("./html.html-95614c66.js"),[]).then(({data:e})=>e),"v-5aa1fcf0":()=>t(()=>import("./javascript.html-0aa9bb4a.js"),[]).then(({data:e})=>e),"v-e0725fa6":()=>t(()=>import("./performance.html-7bb71c74.js"),[]).then(({data:e})=>e),"v-3d0401d4":()=>t(()=>import("./recommended-packages.html-f9a01a5c.js"),[]).then(({data:e})=>e),"v-56ad03c2":()=>t(()=>import("./required-qa.html-bce4cf28.js"),[]).then(({data:e})=>e),"v-7c336682":()=>t(()=>import("./storybook.html-c2666d08.js"),[]).then(({data:e})=>e),"v-a43f7ed2":()=>t(()=>import("./vue.html-36d386ba.js"),[]).then(({data:e})=>e),"v-4290fe40":()=>t(()=>import("./index.html-be64a22a.js"),[]).then(({data:e})=>e),"v-1efcfaf2":()=>t(()=>import("./git.html-7f2e2d76.js"),[]).then(({data:e})=>e),"v-60154c4d":()=>t(()=>import("./pull-requests.html-c16422b0.js"),[]).then(({data:e})=>e),"v-7448383b":()=>t(()=>import("./index.html-20d4c2da.js"),[]).then(({data:e})=>e),"v-6312ceea":()=>t(()=>import("./architecture.html-1abacda9.js"),[]).then(({data:e})=>e),"v-41cdb664":()=>t(()=>import("./bundler.html-00735287.js"),[]).then(({data:e})=>e),"v-8f9aa8c8":()=>t(()=>import("./codesigning.html-5ca0dad3.js"),[]).then(({data:e})=>e),"v-e5d488aa":()=>t(()=>import("./layouts.html-27062cb0.js"),[]).then(({data:e})=>e),"v-69fbfaf5":()=>t(()=>import("./linting.html-2580a3ab.js"),[]).then(({data:e})=>e),"v-19659084":()=>t(()=>import("./testing.html-f094c0cc.js"),[]).then(({data:e})=>e),"v-07b78fc1":()=>t(()=>import("./pull-requests.html-4abe412f.js"),[]).then(({data:e})=>e),"v-6250ba7a":()=>t(()=>import("./index.html-5b7be01f.js"),[]).then(({data:e})=>e),"v-2628fc2c":()=>t(()=>import("./architecture.html-87b93054.js"),[]).then(({data:e})=>e),"v-e38a0e40":()=>t(()=>import("./handling-errors.html-f8ff1745.js"),[]).then(({data:e})=>e),"v-22e0faa6":()=>t(()=>import("./localization.html-e59ebeaa.js"),[]).then(({data:e})=>e),"v-97fb1a00":()=>t(()=>import("./state-management.html-c152da5d.js"),[]).then(({data:e})=>e),"v-37802094":()=>t(()=>import("./index.html-2b2fe41c.js"),[]).then(({data:e})=>e),"v-a90e54ba":()=>t(()=>import("./index.html-224cdf0c.js"),[]).then(({data:e})=>e),"v-2a442892":()=>t(()=>import("./cheat-sheet.html-2c47f519.js"),[]).then(({data:e})=>e),"v-57e37f2f":()=>t(()=>import("./unit-testing.html-e898773c.js"),[]).then(({data:e})=>e),"v-54eb29ab":()=>t(()=>import("./visual-regression-testing.html-b87200ab.js"),[]).then(({data:e})=>e),"v-64f437db":()=>t(()=>import("./what-to-test.html-ead20dd3.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-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;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-87b93054.js b/assets/architecture.html-3ec492d5.js similarity index 95% rename from assets/architecture.html-87b93054.js rename to assets/architecture.html-3ec492d5.js index 383ac1d4a7..1843f6d63b 100644 --- a/assets/architecture.html-87b93054.js +++ b/assets/architecture.html-3ec492d5.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":1701351753000,"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":1701351763000,"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-1abacda9.js b/assets/architecture.html-4d591889.js similarity index 93% rename from assets/architecture.html-1abacda9.js rename to assets/architecture.html-4d591889.js index db2a57f6db..c9017cc079 100644 --- a/assets/architecture.html-1abacda9.js +++ b/assets/architecture.html-4d591889.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":1701351753000,"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":1701351763000,"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-0722f0aa.js b/assets/automated-workflows.html-79aba81f.js similarity index 90% rename from assets/automated-workflows.html-0722f0aa.js rename to assets/automated-workflows.html-79aba81f.js index 243c99a796..b0fb75b492 100644 --- a/assets/automated-workflows.html-0722f0aa.js +++ b/assets/automated-workflows.html-79aba81f.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":1701351753000,"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":1701351763000,"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-00735287.js b/assets/bundler.html-edf63831.js similarity index 88% rename from assets/bundler.html-00735287.js rename to assets/bundler.html-edf63831.js index b0b004ae94..c4debd9b67 100644 --- a/assets/bundler.html-00735287.js +++ b/assets/bundler.html-edf63831.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":1701351753000,"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":1701351763000,"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-85695a4a.js b/assets/c-sharp.html-be6d9062.js similarity index 91% rename from assets/c-sharp.html-85695a4a.js rename to assets/c-sharp.html-be6d9062.js index 655c05d45a..8a765a7f88 100644 --- a/assets/c-sharp.html-85695a4a.js +++ b/assets/c-sharp.html-be6d9062.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":1701351753000,"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":1701351763000,"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-2c47f519.js b/assets/cheat-sheet.html-a226773f.js similarity index 97% rename from assets/cheat-sheet.html-2c47f519.js rename to assets/cheat-sheet.html-a226773f.js index dc28922d25..c326e6b457 100644 --- a/assets/cheat-sheet.html-2c47f519.js +++ b/assets/cheat-sheet.html-a226773f.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":1701351753000,"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":1701351763000,"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-af2dac8e.js b/assets/clean-architecture.html-72d2ea41.js similarity index 90% rename from assets/clean-architecture.html-af2dac8e.js rename to assets/clean-architecture.html-72d2ea41.js index 9bd83f7a79..f079444695 100644 --- a/assets/clean-architecture.html-af2dac8e.js +++ b/assets/clean-architecture.html-72d2ea41.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":1701351753000,"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":1701351763000,"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-079c632b.js b/assets/code-style.html-a4cb7401.js similarity index 88% rename from assets/code-style.html-079c632b.js rename to assets/code-style.html-a4cb7401.js index df74baf829..88f2c8dc3e 100644 --- a/assets/code-style.html-079c632b.js +++ b/assets/code-style.html-a4cb7401.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":1701351753000,"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":1701351763000,"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-677594e3.js b/assets/codesigning.html-5d539206.js similarity index 80% rename from assets/codesigning.html-677594e3.js rename to assets/codesigning.html-5d539206.js index 008662e1b4..1a209deba2 100644 --- a/assets/codesigning.html-677594e3.js +++ b/assets/codesigning.html-5d539206.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-02d166ed","path":"/flutter/codesigning.html","title":"Codesigning","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"flutter/codesigning.md"}');export{e as data}; diff --git a/assets/codesigning.html-5ca0dad3.js b/assets/codesigning.html-c4c0e97f.js similarity index 80% rename from assets/codesigning.html-5ca0dad3.js rename to assets/codesigning.html-c4c0e97f.js index dd4f9cc416..88af358e51 100644 --- a/assets/codesigning.html-5ca0dad3.js +++ b/assets/codesigning.html-c4c0e97f.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-8f9aa8c8","path":"/ios/codesigning.html","title":"Codesigning","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"ios/codesigning.md"}');export{e as data}; diff --git a/assets/continuous-delivery.html-e318cb08.js b/assets/continuous-delivery.html-ef265d04.js similarity index 82% rename from assets/continuous-delivery.html-e318cb08.js rename to assets/continuous-delivery.html-ef265d04.js index a45b2e53c3..1c8acedbd3 100644 --- a/assets/continuous-delivery.html-e318cb08.js +++ b/assets/continuous-delivery.html-ef265d04.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":1701351753000,"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":1701351763000,"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-f2aafeb6.js b/assets/continuous-integration.html-d3878c20.js similarity index 82% rename from assets/continuous-integration.html-f2aafeb6.js rename to assets/continuous-integration.html-d3878c20.js index c413cf2792..fc3b949a00 100644 --- a/assets/continuous-integration.html-f2aafeb6.js +++ b/assets/continuous-integration.html-d3878c20.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":1701351753000,"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":1701351763000,"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-45d71ecc.js b/assets/coroutines.html-ee941575.js similarity index 80% rename from assets/coroutines.html-45d71ecc.js rename to assets/coroutines.html-ee941575.js index 45c483a6da..a0376256cc 100644 --- a/assets/coroutines.html-45d71ecc.js +++ b/assets/coroutines.html-ee941575.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-16386b36","path":"/android/coroutines.html","title":"Coroutines","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"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-853c88d2.js b/assets/crash-reporting.html-e6d469a3.js similarity index 81% rename from assets/crash-reporting.html-853c88d2.js rename to assets/crash-reporting.html-e6d469a3.js index 1cb2eb9229..b0848a59e0 100644 --- a/assets/crash-reporting.html-853c88d2.js +++ b/assets/crash-reporting.html-e6d469a3.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":1701351753000,"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":1701351763000,"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-14f461b3.js b/assets/css.html-0eb77985.js similarity index 94% rename from assets/css.html-14f461b3.js rename to assets/css.html-0eb77985.js index 0895c043cd..958ac0e19f 100644 --- a/assets/css.html-14f461b3.js +++ b/assets/css.html-0eb77985.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":1701351753000,"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":1701351763000,"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-6044399c.js b/assets/dependency-injection.html-3faa3c29.js similarity index 82% rename from assets/dependency-injection.html-6044399c.js rename to assets/dependency-injection.html-3faa3c29.js index 28d5a2daad..b828bd5ec6 100644 --- a/assets/dependency-injection.html-6044399c.js +++ b/assets/dependency-injection.html-3faa3c29.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":1701351753000,"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":1701351763000,"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-52c4691f.js b/assets/error-handling.html-b8f2ddd5.js similarity index 93% rename from assets/error-handling.html-52c4691f.js rename to assets/error-handling.html-b8f2ddd5.js index 8d3f6e1e20..46df35730c 100644 --- a/assets/error-handling.html-52c4691f.js +++ b/assets/error-handling.html-b8f2ddd5.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":1701351753000,"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":1701351763000,"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-3ca02d99.js b/assets/general-guidelines.html-93a42723.js similarity index 94% rename from assets/general-guidelines.html-3ca02d99.js rename to assets/general-guidelines.html-93a42723.js index af210376dc..b561e7fa65 100644 --- a/assets/general-guidelines.html-3ca02d99.js +++ b/assets/general-guidelines.html-93a42723.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":1701351753000,"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":1701351763000,"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-8e5b0068.js b/assets/general.html-43b84544.js similarity index 84% rename from assets/general.html-8e5b0068.js rename to assets/general.html-43b84544.js index c3b5d751c4..d19da7afa9 100644 --- a/assets/general.html-8e5b0068.js +++ b/assets/general.html-43b84544.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":1701351753000,"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":1701351763000,"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-7f2e2d76.js b/assets/git.html-51c6b812.js similarity index 94% rename from assets/git.html-7f2e2d76.js rename to assets/git.html-51c6b812.js index 7394d7559d..8c876201b2 100644 --- a/assets/git.html-7f2e2d76.js +++ b/assets/git.html-51c6b812.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":1701351753000,"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":1701351763000,"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-f8ff1745.js b/assets/handling-errors.html-5c434ad2.js similarity index 89% rename from assets/handling-errors.html-f8ff1745.js rename to assets/handling-errors.html-5c434ad2.js index 6da05015ce..a6a827fdea 100644 --- a/assets/handling-errors.html-f8ff1745.js +++ b/assets/handling-errors.html-5c434ad2.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":1701351753000,"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":1701351763000,"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-d4c33485.js b/assets/hatchly.html-2475eb56.js similarity index 89% rename from assets/hatchly.html-d4c33485.js rename to assets/hatchly.html-2475eb56.js index 99806dde04..fdce7b0b4a 100644 --- a/assets/hatchly.html-d4c33485.js +++ b/assets/hatchly.html-2475eb56.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":1701351753000,"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":1701351763000,"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-95614c66.js b/assets/html.html-6a8f4b23.js similarity index 84% rename from assets/html.html-95614c66.js rename to assets/html.html-6a8f4b23.js index 75ab653d83..0297778af9 100644 --- a/assets/html.html-95614c66.js +++ b/assets/html.html-6a8f4b23.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":1701351753000,"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":1701351763000,"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-fec9b48d.js b/assets/index.html-04049003.js similarity index 91% rename from assets/index.html-fec9b48d.js rename to assets/index.html-04049003.js index 304348ebb3..853cee8679 100644 --- a/assets/index.html-fec9b48d.js +++ b/assets/index.html-04049003.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":1701351753000,"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":1701351763000,"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-be64a22a.js b/assets/index.html-158745f1.js similarity index 79% rename from assets/index.html-be64a22a.js rename to assets/index.html-158745f1.js index 405f56ce66..2e15704a32 100644 --- a/assets/index.html-be64a22a.js +++ b/assets/index.html-158745f1.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-4290fe40","path":"/general/","title":"General","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"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-c3d1dd44.js b/assets/index.html-1f443265.js similarity index 79% rename from assets/index.html-c3d1dd44.js rename to assets/index.html-1f443265.js index a599ba9b3f..db6e97219a 100644 --- a/assets/index.html-c3d1dd44.js +++ b/assets/index.html-1f443265.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-551bb614","path":"/backend/","title":"Backend","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"backend/README.md"}');export{e as data}; diff --git a/assets/index.html-2b2fe41c.js b/assets/index.html-2840a318.js similarity index 85% rename from assets/index.html-2b2fe41c.js rename to assets/index.html-2840a318.js index 257918e9fd..d09540e34e 100644 --- a/assets/index.html-2b2fe41c.js +++ b/assets/index.html-2840a318.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":1701351753000,"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":1701351763000,"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-89a4900c.js b/assets/index.html-3eec43fe.js similarity index 79% rename from assets/index.html-89a4900c.js rename to assets/index.html-3eec43fe.js index d7257d1c75..b1be4569ae 100644 --- a/assets/index.html-89a4900c.js +++ b/assets/index.html-3eec43fe.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-5033abfc","path":"/dotNet/","title":"DotNet","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"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-43752c78.js b/assets/index.html-428a20d2.js similarity index 80% rename from assets/index.html-43752c78.js rename to assets/index.html-428a20d2.js index 123720ba62..07e66a27af 100644 --- a/assets/index.html-43752c78.js +++ b/assets/index.html-428a20d2.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-59c1b58c","path":"/flutter/","title":"Legacy Flutter Projects","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"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-224cdf0c.js b/assets/index.html-43ce196b.js similarity index 80% rename from assets/index.html-224cdf0c.js rename to assets/index.html-43ce196b.js index 47e99751da..ce8b8fd57a 100644 --- a/assets/index.html-224cdf0c.js +++ b/assets/index.html-43ce196b.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-a90e54ba","path":"/frontend/testing/","title":"Testing","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"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-062c9a1c.js b/assets/index.html-68717985.js similarity index 94% rename from assets/index.html-062c9a1c.js rename to assets/index.html-68717985.js index 9722dcc62f..dd5f9d508f 100644 --- a/assets/index.html-062c9a1c.js +++ b/assets/index.html-68717985.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":1701351753000,"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":1701351763000,"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-5b7be01f.js b/assets/index.html-8391caa5.js similarity index 79% rename from assets/index.html-5b7be01f.js rename to assets/index.html-8391caa5.js index 78d27fe20a..15528ef5a0 100644 --- a/assets/index.html-5b7be01f.js +++ b/assets/index.html-8391caa5.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-6250ba7a","path":"/flutter/legacy/","title":"","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"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-20d4c2da.js b/assets/index.html-e03d0433.js similarity index 93% rename from assets/index.html-20d4c2da.js rename to assets/index.html-e03d0433.js index 4d0639251e..97900c5699 100644 --- a/assets/index.html-20d4c2da.js +++ b/assets/index.html-e03d0433.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":1701351753000,"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":1701351763000,"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-c6f49eb9.js b/assets/index.html-ea666941.js similarity index 79% rename from assets/index.html-c6f49eb9.js rename to assets/index.html-ea666941.js index 27a8421d07..576d5c0b8a 100644 --- a/assets/index.html-c6f49eb9.js +++ b/assets/index.html-ea666941.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-c1f0fcce","path":"/android/","title":"Android","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"contributors":[{"name":"Sam Turrell","email":"sam.turrell@netsells.co.uk","commits":1}]},"filePathRelative":"android/README.md"}');export{e as data}; diff --git a/assets/javascript.html-0aa9bb4a.js b/assets/javascript.html-5fc80820.js similarity index 92% rename from assets/javascript.html-0aa9bb4a.js rename to assets/javascript.html-5fc80820.js index 6408c943e9..29a2218a19 100644 --- a/assets/javascript.html-0aa9bb4a.js +++ b/assets/javascript.html-5fc80820.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":1701351753000,"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":1701351763000,"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-a12c2f29.js b/assets/kotlin.html-16fbee87.js similarity index 79% rename from assets/kotlin.html-a12c2f29.js rename to assets/kotlin.html-16fbee87.js index 51da143dd0..236808ff8f 100644 --- a/assets/kotlin.html-a12c2f29.js +++ b/assets/kotlin.html-16fbee87.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-3e66553f","path":"/android/kotlin.html","title":"Kotlin","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"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-aff55b5a.js b/assets/laravel.html-53a107a1.js similarity index 92% rename from assets/laravel.html-aff55b5a.js rename to assets/laravel.html-53a107a1.js index be8b579d6a..d2d3ddf5e4 100644 --- a/assets/laravel.html-aff55b5a.js +++ b/assets/laravel.html-53a107a1.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":1701351753000,"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":1701351763000,"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-27062cb0.js b/assets/layouts.html-887133d8.js similarity index 79% rename from assets/layouts.html-27062cb0.js rename to assets/layouts.html-887133d8.js index 3cdec0440a..d98fc77a11 100644 --- a/assets/layouts.html-27062cb0.js +++ b/assets/layouts.html-887133d8.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-e5d488aa","path":"/ios/layouts.html","title":"Layouts","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"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-42052239.js b/assets/linting-rules.html-1cd9f94b.js similarity index 82% rename from assets/linting-rules.html-42052239.js rename to assets/linting-rules.html-1cd9f94b.js index 6ca914cbad..58b431c134 100644 --- a/assets/linting-rules.html-42052239.js +++ b/assets/linting-rules.html-1cd9f94b.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":1701351753000,"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":1701351763000,"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-2580a3ab.js b/assets/linting.html-57d401c4.js similarity index 89% rename from assets/linting.html-2580a3ab.js rename to assets/linting.html-57d401c4.js index 0de65352e3..210042ab88 100644 --- a/assets/linting.html-2580a3ab.js +++ b/assets/linting.html-57d401c4.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":1701351753000,"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":1701351763000,"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-8dd8f7c9.js b/assets/local-databases.html-4044e76d.js similarity index 82% rename from assets/local-databases.html-8dd8f7c9.js rename to assets/local-databases.html-4044e76d.js index 96fb2f6f7d..05f222347a 100644 --- a/assets/local-databases.html-8dd8f7c9.js +++ b/assets/local-databases.html-4044e76d.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":1701351753000,"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":1701351763000,"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-e59ebeaa.js b/assets/localization.html-bfd25141.js similarity index 82% rename from assets/localization.html-e59ebeaa.js rename to assets/localization.html-bfd25141.js index 53863e7886..b5ef04f77c 100644 --- a/assets/localization.html-e59ebeaa.js +++ b/assets/localization.html-bfd25141.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":1701351753000,"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":1701351763000,"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-b0982407.js b/assets/monarch.html-ad074d20.js similarity index 80% rename from assets/monarch.html-b0982407.js rename to assets/monarch.html-ad074d20.js index 84f7cfd66c..2a96dcd086 100644 --- a/assets/monarch.html-b0982407.js +++ b/assets/monarch.html-ad074d20.js @@ -1 +1 @@ -const t=JSON.parse('{"key":"v-3a4b8043","path":"/flutter/monarch.html","title":"Monarch","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"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-c56e2994.js b/assets/multiple-firebase-environments.html-f6fb1ed6.js similarity index 95% rename from assets/multiple-firebase-environments.html-c56e2994.js rename to assets/multiple-firebase-environments.html-f6fb1ed6.js index 6cba29d3e3..b26304879a 100644 --- a/assets/multiple-firebase-environments.html-c56e2994.js +++ b/assets/multiple-firebase-environments.html-f6fb1ed6.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":1701351753000,"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":1701351763000,"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-e540b2fe.js b/assets/mvvm.html-0ef4e6a5.js similarity index 79% rename from assets/mvvm.html-e540b2fe.js rename to assets/mvvm.html-0ef4e6a5.js index 59fe18e5f3..72b3527848 100644 --- a/assets/mvvm.html-e540b2fe.js +++ b/assets/mvvm.html-0ef4e6a5.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-7c84f940","path":"/android/mvvm.html","title":"MVVM","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"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-2e1bc7fe.js b/assets/naming-widgets.html-c3815153.js similarity index 81% rename from assets/naming-widgets.html-2e1bc7fe.js rename to assets/naming-widgets.html-c3815153.js index 0fe455c59e..aec6010556 100644 --- a/assets/naming-widgets.html-2e1bc7fe.js +++ b/assets/naming-widgets.html-c3815153.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":1701351753000,"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":1701351763000,"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-896fd671.js b/assets/network-requests.html-28650a7c.js similarity index 81% rename from assets/network-requests.html-896fd671.js rename to assets/network-requests.html-28650a7c.js index fc444883b8..3643fae203 100644 --- a/assets/network-requests.html-896fd671.js +++ b/assets/network-requests.html-28650a7c.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":1701351753000,"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":1701351763000,"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-7bb71c74.js b/assets/performance.html-ec54620c.js similarity index 80% rename from assets/performance.html-7bb71c74.js rename to assets/performance.html-ec54620c.js index fa47a2f214..9d735d7d06 100644 --- a/assets/performance.html-7bb71c74.js +++ b/assets/performance.html-ec54620c.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-e0725fa6","path":"/frontend/performance.html","title":"Performance","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"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-7dbf0da1.js b/assets/php.html-e5bfdfb9.js similarity index 79% rename from assets/php.html-7dbf0da1.js rename to assets/php.html-e5bfdfb9.js index 4dbb5e0f41..f80d13af83 100644 --- a/assets/php.html-7dbf0da1.js +++ b/assets/php.html-e5bfdfb9.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-0f7bc716","path":"/backend/php.html","title":"PHP","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1701351753000,"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":1701351763000,"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-b49b9165.js b/assets/project-setup.html-5e45efdd.js similarity index 94% rename from assets/project-setup.html-b49b9165.js rename to assets/project-setup.html-5e45efdd.js index 76586dcb20..9917377612 100644 --- a/assets/project-setup.html-b49b9165.js +++ b/assets/project-setup.html-5e45efdd.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":1701351753000,"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":1701351763000,"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-4fff40f3.js b/assets/pull-request-labels.html-a48d8a9d.js similarity index 82% rename from assets/pull-request-labels.html-4fff40f3.js rename to assets/pull-request-labels.html-a48d8a9d.js index 52e41656ce..b66abaad56 100644 --- a/assets/pull-request-labels.html-4fff40f3.js +++ b/assets/pull-request-labels.html-a48d8a9d.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":1701351753000,"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":1701351763000,"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-c16422b0.js b/assets/pull-requests.html-3f70dcaa.js similarity index 94% rename from assets/pull-requests.html-c16422b0.js rename to assets/pull-requests.html-3f70dcaa.js index 57de1aa9ce..97022f86d7 100644 --- a/assets/pull-requests.html-c16422b0.js +++ b/assets/pull-requests.html-3f70dcaa.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":1701351753000,"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":1701351763000,"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-4abe412f.js b/assets/pull-requests.html-8fa5eb50.js similarity index 91% rename from assets/pull-requests.html-4abe412f.js rename to assets/pull-requests.html-8fa5eb50.js index ad3764d48f..e799bd0145 100644 --- a/assets/pull-requests.html-4abe412f.js +++ b/assets/pull-requests.html-8fa5eb50.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":1701351753000,"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":1701351763000,"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-43a279c8.js b/assets/recommended-packages.html-2caea997.js similarity index 85% rename from assets/recommended-packages.html-43a279c8.js rename to assets/recommended-packages.html-2caea997.js index fd87b288a8..4fd8ca3ff1 100644 --- a/assets/recommended-packages.html-43a279c8.js +++ b/assets/recommended-packages.html-2caea997.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":1701351753000,"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":1701351763000,"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/recommended-packages.html-f9a01a5c.js b/assets/recommended-packages.html-405842b8.js similarity index 82% rename from assets/recommended-packages.html-f9a01a5c.js rename to assets/recommended-packages.html-405842b8.js index 90eeb645fe..8595afb043 100644 --- a/assets/recommended-packages.html-f9a01a5c.js +++ b/assets/recommended-packages.html-405842b8.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":1701351753000,"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":1701351763000,"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-dfed6c26.js b/assets/recommended-packages.html-48ccd635.js similarity index 85% rename from assets/recommended-packages.html-dfed6c26.js rename to assets/recommended-packages.html-48ccd635.js index 26b2b379e2..51a2cf8011 100644 --- a/assets/recommended-packages.html-dfed6c26.js +++ b/assets/recommended-packages.html-48ccd635.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":1701351753000,"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":1701351763000,"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-e98888ec.js b/assets/recommended-packages.html-dac011b8.js similarity index 82% rename from assets/recommended-packages.html-e98888ec.js rename to assets/recommended-packages.html-dac011b8.js index 6022441570..bbc1c1e3fa 100644 --- a/assets/recommended-packages.html-e98888ec.js +++ b/assets/recommended-packages.html-dac011b8.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":1701351753000,"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":1701351763000,"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/required-qa.html-bce4cf28.js b/assets/required-qa.html-e9fc67f9.js similarity index 89% rename from assets/required-qa.html-bce4cf28.js rename to assets/required-qa.html-e9fc67f9.js index e84a5016dd..bce7b05f19 100644 --- a/assets/required-qa.html-bce4cf28.js +++ b/assets/required-qa.html-e9fc67f9.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":1701351753000,"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":1701351763000,"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-61a2873d.js b/assets/security-practices.html-7190f4e2.js similarity index 90% rename from assets/security-practices.html-61a2873d.js rename to assets/security-practices.html-7190f4e2.js index 346d801f84..3fd2ff9ba5 100644 --- a/assets/security-practices.html-61a2873d.js +++ b/assets/security-practices.html-7190f4e2.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":1701351753000,"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":1701351763000,"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-36a1a234.js b/assets/state-management.html-289264c4.js similarity index 92% rename from assets/state-management.html-36a1a234.js rename to assets/state-management.html-289264c4.js index addb4d539e..ec5a54c629 100644 --- a/assets/state-management.html-36a1a234.js +++ b/assets/state-management.html-289264c4.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":1701351753000,"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":1701351763000,"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-c152da5d.js b/assets/state-management.html-ed5e74e6.js similarity index 92% rename from assets/state-management.html-c152da5d.js rename to assets/state-management.html-ed5e74e6.js index bfd14d159d..78e192fad8 100644 --- a/assets/state-management.html-c152da5d.js +++ b/assets/state-management.html-ed5e74e6.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":1701351753000,"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":1701351763000,"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-c2666d08.js b/assets/storybook.html-ee3c58bd.js similarity index 94% rename from assets/storybook.html-c2666d08.js rename to assets/storybook.html-ee3c58bd.js index 0f21c50f5c..5d21326ade 100644 --- a/assets/storybook.html-c2666d08.js +++ b/assets/storybook.html-ee3c58bd.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":1701351753000,"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":1701351763000,"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-f094c0cc.js b/assets/testing.html-1b162d10.js similarity index 94% rename from assets/testing.html-f094c0cc.js rename to assets/testing.html-1b162d10.js index 0d3371437c..69da4e7e6a 100644 --- a/assets/testing.html-f094c0cc.js +++ b/assets/testing.html-1b162d10.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":1701351753000,"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":1701351763000,"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-294cd61d.js b/assets/testing.html-61cb9e28.js similarity index 94% rename from assets/testing.html-294cd61d.js rename to assets/testing.html-61cb9e28.js index 5bd86809bc..d4b9a1f723 100644 --- a/assets/testing.html-294cd61d.js +++ b/assets/testing.html-61cb9e28.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":1701351753000,"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":1701351763000,"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-01d11608.js b/assets/testing.html-8019f3c4.js similarity index 92% rename from assets/testing.html-01d11608.js rename to assets/testing.html-8019f3c4.js index d0e62d3673..5bb78b1be6 100644 --- a/assets/testing.html-01d11608.js +++ b/assets/testing.html-8019f3c4.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":1701351753000,"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":1701351763000,"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-bb3802fc.js b/assets/third-party-packages.html-58a49699.js similarity index 91% rename from assets/third-party-packages.html-bb3802fc.js rename to assets/third-party-packages.html-58a49699.js index c41bb442de..2ef4d20cc1 100644 --- a/assets/third-party-packages.html-bb3802fc.js +++ b/assets/third-party-packages.html-58a49699.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":1701351753000,"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":1701351763000,"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-e898773c.js b/assets/unit-testing.html-c06fbfe4.js similarity index 93% rename from assets/unit-testing.html-e898773c.js rename to assets/unit-testing.html-c06fbfe4.js index ee768ad784..b902d35edd 100644 --- a/assets/unit-testing.html-e898773c.js +++ b/assets/unit-testing.html-c06fbfe4.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":1701351753000,"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":1701351763000,"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-b87200ab.js b/assets/visual-regression-testing.html-0422f0c7.js similarity index 95% rename from assets/visual-regression-testing.html-b87200ab.js rename to assets/visual-regression-testing.html-0422f0c7.js index 0335fd21a3..f5de8380a3 100644 --- a/assets/visual-regression-testing.html-b87200ab.js +++ b/assets/visual-regression-testing.html-0422f0c7.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":1701351753000,"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":1701351763000,"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-36d386ba.js b/assets/vue.html-9fba51c9.js similarity index 87% rename from assets/vue.html-36d386ba.js rename to assets/vue.html-9fba51c9.js index 8ad291f336..f12095edac 100644 --- a/assets/vue.html-36d386ba.js +++ b/assets/vue.html-9fba51c9.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":1701351753000,"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":1701351763000,"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-ead20dd3.js b/assets/what-to-test.html-62510e34.js similarity index 96% rename from assets/what-to-test.html-ead20dd3.js rename to assets/what-to-test.html-62510e34.js index 2e708a2991..639a6794a8 100644 --- a/assets/what-to-test.html-ead20dd3.js +++ b/assets/what-to-test.html-62510e34.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":1701351753000,"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":1701351763000,"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 50fc1c4674..fbbf989220 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 5b345904db..51d4c5f0d5 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 3d2eb2797c..b8d4f46ec6 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 de9defac7e..4f2f0849cf 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 ff9546abca..c1c7832603 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 8eba9f9498..ae05efdcab 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 ed3e069f2e..511f6cc5a9 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 1189a697ee..34b812a048 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 1da4550a60..8dfc9bf0d8 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 e44aef9688..af710079dd 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 9c48445b0c..33893ebb9a 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 c01a101245..05104f4c5e 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 f357313fc2..c134443584 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 522b936570..6cadb49b66 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 d0b59c43b7..03fdbeca75 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 ceb06203c7..77021cddb5 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 cbabf23b95..8488fc8bed 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 6fb42d2fb2..c9677c06fb 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 f6ef39f5c5..3fd299a9ee 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 341d6443aa..1a5db3cdc4 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 00cbf47911..948338cabf 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 23f591eb68..b9569e39fa 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 99142e77ce..101862e45b 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 652ecf64fa..bedf37a4cd 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 a6f77cbf3f..c7bf94f9cb 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 788d4ebe7c..4875abe6cd 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 bc6dbeb2f5..6d23a8705e 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 ca9f0dcf02..f497ccb680 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 197479cc07..fff241411d 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 4ee6e13f11..8274639a37 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 fd5ca89061..ea0ad0374b 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 8d57959245..9eaea798c8 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 b4d439156d..1a4cef7c80 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 e78a4a37be..e235d57d37 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 b2893d770a..048eaf78dd 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 7f6f63c959..429e829cc4 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 2317831cf1..6815265dfd 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 89bdec9431..dc129d30bb 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 a7638acadc..ff305d4fba 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 984c9b56d0..aa2cb0c09b 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 24598b415b..db2d8b192b 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 4872ad91e0..c500f10a43 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 997d60bfe5..65af7357f4 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 5fed9ce860..2ae0653b72 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 b80d3e104b..e3c2f2c7df 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 ad66a5ebd4..d705709877 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 feab87cecb..22de41f400 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 27c67a1d74..8d6c59f1c8 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 46c1073382..477de98a6d 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 dce72fee82..5d136a8356 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 1e000acbc5..43224b1fb4 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 11bd629e58..5999d42c8d 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 ce85f83145..1d914478c9 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 089ee70820..511d4890ac 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 8158bb6333..c05a077b08 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 054d71b62e..36cb400b17 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 b806552d6a..584f01e889 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 ca2ea97330..71e31a7a68 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 4694bd8e3c..c6cfca24e5 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 716eda9cd3..5c578c347b 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 00a458d20b..5f6be1539c 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 0539d3bf63..d5f32be6f4 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 33061d6e68..b46ffb0a14 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 cc656e028d..2c7c162551 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 6de486f53c..dad697909b 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 f8ee8a12c1..5cef3393ba 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 3d38035e36..cd07d5f8ed 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 76171de338..bb623fa5db 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 ac54b7325a..2c1f591920 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 9dabc0364e..a2057d9e89 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 13770ea3d8..3a3cc09f08 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 f09cbfa0e6..477c047bee 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 6c1cd3d878..2b575e6a32 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 30743a523c..f9ce80a8e5 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 0957dafbca..f1dcaa40d9 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 49e3954dbd..c37384126b 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 0a7c6fc397..69cf899c20 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 d8025880ed..3982513c25 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 07e220c887..b28724129f 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 51c13cb0bc..67f30c8cad 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 b37eaca9fc..d8ff4af6e4 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 20545d3532..117a8c7cc8 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 bd9fb50baa..281ef4ab9d 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 42c3b4b5b2..79febc4130 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 727b661e9f..24fd10ae76 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 9b37287612..f3d8da23bd 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 197aed61cb..54fb399e72 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 da6e1ea6d6..36edf218fc 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 7418623f5e..0a74d6753e 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 214e17953f..b82bea23b7 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 3c0ec2d325..4c0f71dad8 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 6da583e732..47de068199 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 df03502e7c..6475d2a239 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 cf7a242369..4418135114 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 e2f9da036d..bebc2aecf8 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 6fcc82d686..abc0c0d30a 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 621e7863a6..92260a6f70 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 2bea3ff47a..1b5a8b37d6 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 4def718164..d5f890bf4f 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 de9da82714..ef1fa8a05d 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 12c8dbbed8..0fa7f61dea 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 11a04d4f6f..6a8738dc0f 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 596550a197..305c0e5098 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 8435c007bf..66ceadb4d8 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 bf09e643b3..326816d41c 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 dea2aac1aa..3c9658344e 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 812462da41..449f5ba2d7 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 cdf31ee73f..b9f250f00e 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 c1a8f32947..e514560450 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 bc033ecc0c..295aacb192 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 d7407357aa..4fdcf4e85f 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 7ca69783e2..431b4f76e2 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 061d01bcb8..9979394f46 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 6d9f856bf8..6438448560 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 4abea32bff..447e43de2a 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 8aa43d3682..a781d55228 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 f385d73879..6200f612ab 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 9d2c34b9d1..75fdc8acdb 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 eaab58af1b..e2fc091387 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 2571efc980..5a6cce4c42 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 3924dfb768..6530ae9c5c 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 4eba6f8bd7..ec80e3b11d 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 030dd739f9..e3dd3ca7f7 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 b9bd9a8a50..7393c00ef3 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 9a4c2aafbc..2968581270 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 45cff1c118..711da7a10a 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 36df2967b1..ea5e6adb31 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 3fce14f92b..d65773911a 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 73361440b8..964f447489 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 7dc0370fd5..100af6be20 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 057ca1cb79..17a3aae83f 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 aff365b182..9240322633 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 7ca971ea87..edfec68214 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 1c0a86c97a..3e5b1c9471 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 23aa56d47e..910846ea91 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 9d60dfe055..a79c999d21 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 d4d1e47eb1..e9bb7b7f82 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 572712aa60..5c619d5749 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 cf7c3b104f..3d098bf7ce 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 68cbd920d7..531abe4246 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 3b4eb030c5..aa223b5c10 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 3203ba6611..eef9909008 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 ff30617514..9cf23d5904 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 47d14a14b0..09ece8ab29 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 c07c56f57e..15fa419471 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 1b9dfe13c7..4240988c29 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 03e89f4659..710a418298 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 020244d656..0e67573abb 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 c6368a7fb9..633036526d 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 18f49088c4..ae8235f1ea 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 d584817b2d..f059923407 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 760bac440a..ee9fba4128 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 b49881c547..a869922939 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 654e4e751e..3326e4a04c 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 d9c8536fe0..54f9ca75d1 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 054883f984..8941a886db 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 6d22540f33..c0d446d5bc 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 b8f2daa1d4..f4aa0b5fcc 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 e4b58cce5c..ed10e92204 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 b3c46c9413..6924b28884 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 c1a4645575..82217b008f 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 b79713ce04..a78d78ee4f 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 3372bcf62e..497a5f2cff 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 a3491dc78c..e1a8486a3a 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 960551ab96..e551095241 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 bced57f1ab..27e1b1d596 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 5070641deb..b0be6ac27f 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 c103e03513..48bece36d2 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 d34328baf0..0e1b209228 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 0285e2ac09..2762b75e94 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 6915285c9b..9ffa02a3e2 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 190e9394b4..522289a9d4 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 509f0339f2..63f838ae52 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 b3d3326c39..cab5fb3c8e 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 ed179bd7e4..8d93d8bddd 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 ca765d0bac..694f2f40c2 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 1c4c67284a..38f4e5d7b1 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 f903a73c26..d80743cba0 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 a61e4d83e6..7a23e54734 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 cc79bfc0c4..254978392c 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 54aefb4dd7..2e9d86851d 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 664ebe7817..a7cca08555 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 a7d585c003..d87a00ef07 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 6ef0081d36..ab070c4f72 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 192082dee7..31ba579995 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 764c315d62..49f0b4fb71 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.

- +