diff --git a/.eslintrc.json b/.eslintrc.json index c74631f02..fa4b11f53 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -19,19 +19,20 @@ ] } ], + "@angular-eslint/component-selector": ["warn"], + "@angular-eslint/component-class-suffix": ["warn"], + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-loss-of-precision": ["warn"], "@typescript-eslint/no-non-null-assertion": "warn", - "no-unused-vars": "off", "@typescript-eslint/no-unused-vars": ["warn"], "no-loss-of-precision": "off", - "@typescript-eslint/no-loss-of-precision": ["warn"], - "@angular-eslint/component-selector": ["warn"], - "@angular-eslint/component-class-suffix": ["warn"], - "no-prototype-builtins": "off" + "no-prototype-builtins": "off", + "no-unused-vars": "off" } }, { "files": ["*.ts", "*.tsx"], - "extends": ["plugin:@nrwl/nx/typescript"], + "extends": ["plugin:@nrwl/nx/typescript", "prettier"], "rules": {} }, { diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 65230f928..c459894c9 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -17,8 +17,7 @@ jobs: node-version: '18' cache: 'yarn' - run: yarn install --immutable - # TODO - Ensure lint and tests pass - # - run: yarn lint + - run: yarn lint # - run: yarn nx test # Ensure can also build - run: yarn nx build diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 000000000..31354ec13 --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 000000000..d24fdfc60 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx lint-staged diff --git a/.prettierrc b/.prettierrc index 544138be4..0981b7cc0 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,3 +1,4 @@ { - "singleQuote": true + "singleQuote": true, + "printWidth": 120 } diff --git a/.yarnrc.yml b/.yarnrc.yml index ed4b65421..291e29abf 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -1,3 +1,9 @@ +logFilters: + - code: YN0060 + level: discard + - code: YN0002 + level: discard + yarnPath: .yarn/releases/yarn-3.2.1.cjs nodeLinker: node-modules # Avoid throwing error installing enketo/leaflet-draw (will not match checksum) diff --git a/apps/picsa-apps/content-dashboard-e2e/.eslintrc.json b/apps/picsa-apps/content-dashboard-e2e/.eslintrc.json index 3947051c7..73b7aff80 100644 --- a/apps/picsa-apps/content-dashboard-e2e/.eslintrc.json +++ b/apps/picsa-apps/content-dashboard-e2e/.eslintrc.json @@ -4,7 +4,10 @@ "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} + "rules": { + "@angular-eslint/component-selector": ["off"], + "@angular-eslint/component-class-suffix": ["off"] + } } ] } diff --git a/apps/picsa-apps/content-dashboard/src/app/components/data-table/custom/data-table-station.ts b/apps/picsa-apps/content-dashboard/src/app/components/data-table/custom/data-table-station.ts index f84bc279e..62325692c 100644 --- a/apps/picsa-apps/content-dashboard/src/app/components/data-table/custom/data-table-station.ts +++ b/apps/picsa-apps/content-dashboard/src/app/components/data-table/custom/data-table-station.ts @@ -12,13 +12,9 @@ import { IChartSummary_V2 } from '@picsa/models'; /* custom table built on top of generic to specifically define fields */ +// eslint-disable-next-line @angular-eslint/component-class-suffix export class PicsaDataTableStation extends PicsaDataTable { - tableColumns: (keyof IChartSummary_V2)[] = [ - 'Year', - 'StartDate', - 'Length', - 'Rainfall', - ]; + tableColumns: (keyof IChartSummary_V2)[] = ['Year', 'StartDate', 'Length', 'Rainfall']; @Input() set data(data: IChartSummary_V2[]) { if (data && data.length > 0) { this.tableData.data = data; diff --git a/apps/picsa-apps/content-dashboard/src/app/components/data-table/data-table.ts b/apps/picsa-apps/content-dashboard/src/app/components/data-table/data-table.ts index 0ce43ef23..103647ef3 100644 --- a/apps/picsa-apps/content-dashboard/src/app/components/data-table/data-table.ts +++ b/apps/picsa-apps/content-dashboard/src/app/components/data-table/data-table.ts @@ -7,12 +7,13 @@ import { MatPaginator } from '@angular/material/paginator'; // Note - should add to libs as general component if needed elsewhere selector: 'picsa-data-table', templateUrl: './data-table.html', - styleUrls: ['./data-table.scss'] + styleUrls: ['./data-table.scss'], }) /* Render a table based on json array of data in a simple way (subset of mat-table) See https://material.angular.io/components/table/overview for full implementation */ +// eslint-disable-next-line @angular-eslint/component-class-suffix export class PicsaDataTable implements OnInit { tableData = new MatTableDataSource([]); tableColumns: string[] = []; diff --git a/apps/picsa-apps/content-dashboard/src/app/layout/header/header.ts b/apps/picsa-apps/content-dashboard/src/app/layout/header/header.ts index c11f1d49d..2b24cd80f 100644 --- a/apps/picsa-apps/content-dashboard/src/app/layout/header/header.ts +++ b/apps/picsa-apps/content-dashboard/src/app/layout/header/header.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; @Component({ selector: 'station-data-header', - templateUrl: './header.html' + templateUrl: './header.html', }) +// eslint-disable-next-line @angular-eslint/component-class-suffix export class StationDataHeader {} diff --git a/apps/picsa-apps/content-dashboard/src/app/layout/sidebar/sidebar.ts b/apps/picsa-apps/content-dashboard/src/app/layout/sidebar/sidebar.ts index 2262068f8..de8619f83 100644 --- a/apps/picsa-apps/content-dashboard/src/app/layout/sidebar/sidebar.ts +++ b/apps/picsa-apps/content-dashboard/src/app/layout/sidebar/sidebar.ts @@ -3,6 +3,7 @@ import { Component } from '@angular/core'; @Component({ selector: 'station-data-sidebar', templateUrl: './sidebar.html', - styleUrls: ['./sidebar.scss'] + styleUrls: ['./sidebar.scss'], }) +// eslint-disable-next-line @angular-eslint/component-class-suffix export class StationDataSidebar {} diff --git a/apps/picsa-apps/content-dashboard/src/app/pages/data-upload/data-upload.page.ts b/apps/picsa-apps/content-dashboard/src/app/pages/data-upload/data-upload.page.ts index 301a1f34e..ae26b4efb 100644 --- a/apps/picsa-apps/content-dashboard/src/app/pages/data-upload/data-upload.page.ts +++ b/apps/picsa-apps/content-dashboard/src/app/pages/data-upload/data-upload.page.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; import { transferArrayItem, CdkDragDrop } from '@angular/cdk/drag-drop'; import { NgxFileDropEntry, FileSystemFileEntry } from 'ngx-file-drop'; import { Papa, PapaParseConfig } from 'ngx-papaparse'; @@ -8,9 +8,10 @@ import { IChartSummary_V2 } from '@picsa/models'; @Component({ selector: 'dashboard-data-upload', templateUrl: './data-upload.page.html', - styleUrls: ['./data-upload.page.scss'] + styleUrls: ['./data-upload.page.scss'], }) -export class DataUpload implements OnInit { +// eslint-disable-next-line @angular-eslint/component-class-suffix +export class DataUpload { files: NgxFileDropEntry[]; csvFile: File; csvData: IParsedField[] = []; @@ -23,8 +24,6 @@ export class DataUpload implements OnInit { constructor(private papa: Papa, private http: HttpClient) {} - ngOnInit() {} - public fileDropped(files: NgxFileDropEntry[]) { console.log('files dropped', files); this.files = files; @@ -69,8 +68,8 @@ export class DataUpload implements OnInit { json: this.csvMappedData, keys: { x: 'Year', - value: ['Rainfall'] - } + value: ['Rainfall'], + }, }; } @@ -83,19 +82,9 @@ export class DataUpload implements OnInit { // move existing out (limit 1 per container) if (event.container.data.length > 0) { // empty container, transfer existing item out first - transferArrayItem( - event.container.data, - this.csvFields, - 0, - this.csvFields.length - 1 - ); + transferArrayItem(event.container.data, this.csvFields, 0, this.csvFields.length - 1); } - transferArrayItem( - event.previousContainer.data, - event.container.data, - event.previousIndex, - event.currentIndex - ); + transferArrayItem(event.previousContainer.data, event.container.data, event.previousIndex, event.currentIndex); // prepare data preview this.mapCSVData(); } @@ -110,20 +99,12 @@ export class DataUpload implements OnInit { private async generateDataMappings() { this.siteDataMapping.forEach((el, i) => { // do field mapping each time as original this.csvFields directly altered on match - const csvFields = this.csvFields.map(field => field.toLowerCase()); - const matchString = el.field - .toString() - .substr(0, 4) - .toLowerCase(); - const matchField = csvFields.find(f => f.includes(matchString)); + const csvFields = this.csvFields.map((field) => field.toLowerCase()); + const matchString = el.field.toString().substr(0, 4).toLowerCase(); + const matchField = csvFields.find((f) => f.includes(matchString)); // if match found remove from csvFields array and populate mapping array if (matchField) { - transferArrayItem( - this.csvFields, - this.siteDataMapping[i].mappedField, - csvFields.indexOf(matchField), - 0 - ); + transferArrayItem(this.csvFields, this.siteDataMapping[i].mappedField, csvFields.indexOf(matchField), 0); } }); console.log('site mapping', this.siteDataMapping); @@ -133,16 +114,16 @@ export class DataUpload implements OnInit { mapCSVData() { // get the names of fields that have been mapped const map: any = {}; - this.siteDataMapping.forEach(mapping => { + this.siteDataMapping.forEach((mapping) => { map[mapping.field] = mapping.mappedField[0]; }); // map data where exists - this.csvMappedData = this.csvData.map(el => { + this.csvMappedData = this.csvData.map((el) => { const summary: IChartSummary_V2 = { Year: map.Year ? Number(el[map.Year]) : null, StartDate: map.StartDate ? new Date(el[map.StartDate]) : null, Length: map.Length ? Number(el[map.Length]) : null, - Rainfall: map.Rainfall ? Number(el[map.Rainfall]) : null + Rainfall: map.Rainfall ? Number(el[map.Rainfall]) : null, }; // check for invalid dates if (isNaN(summary.StartDate.getDate())) { @@ -160,7 +141,7 @@ export class DataUpload implements OnInit { private async generateCSVData(csv: string | File, preview = false) { const data = await this.parseCSV(csv, { preview: preview ? 5 : 0, - header: true + header: true, }); this.csvFields = Object.keys(data[0]); this.csvData = data; @@ -168,17 +149,14 @@ export class DataUpload implements OnInit { // promise wrapper for papa.parse callback // also includes 'header' which formats as json array instead of data row array - private parseCSV( - csv: string | File, - config?: PapaParseConfig - ): Promise { + private parseCSV(csv: string | File, config?: PapaParseConfig): Promise { console.log('parsing csv'); return new Promise((resolve, reject) => { this.papa.parse(csv, { header: true, complete: (results, file) => resolve(results.data), - error: err => reject(err), - ...config + error: (err) => reject(err), + ...config, }); }); } @@ -208,28 +186,26 @@ const SITE_DATA_FIELDS: ISiteDataField[] = [ field: 'Year', description: 'The year in which the season started. If the season spans multiple years, e.g. "2009-2010", simply put "2009"', - dataType: 'number' + dataType: 'number', }, { field: 'Length', description: 'The total number of days the season lasted, e.g. 102', - dataType: 'number' + dataType: 'number', }, { field: 'Rainfall', - description: - 'The total amount of rain, in mm, that fell during the season, e.g. 890', - dataType: 'number' + description: 'The total amount of rain, in mm, that fell during the season, e.g. 890', + dataType: 'number', }, { field: 'StartDate', - description: - 'The date when the season started, e.g. "04-Mar-2010" or "25/8/11"', - dataType: 'date' - } + description: 'The date when the season started, e.g. "04-Mar-2010" or "25/8/11"', + dataType: 'date', + }, ]; -const SITE_DATA_MAPPINGS: ISiteDataMapping[] = SITE_DATA_FIELDS.map(field => ({ +const SITE_DATA_MAPPINGS: ISiteDataMapping[] = SITE_DATA_FIELDS.map((field) => ({ ...field, - mappedField: [] + mappedField: [], })); diff --git a/apps/picsa-apps/content-dashboard/src/app/pages/home/home.page.ts b/apps/picsa-apps/content-dashboard/src/app/pages/home/home.page.ts index f4e4c07af..9aed4120a 100644 --- a/apps/picsa-apps/content-dashboard/src/app/pages/home/home.page.ts +++ b/apps/picsa-apps/content-dashboard/src/app/pages/home/home.page.ts @@ -6,6 +6,7 @@ import { PicsaChartComponent } from '@picsa/shared/features/charts/chart'; templateUrl: './home.page.html', styleUrls: ['./home.page.scss'], }) +// eslint-disable-next-line @angular-eslint/component-class-suffix export class HomePage implements AfterViewInit { @ViewChild('chart', { static: true }) chart: PicsaChartComponent; sampleData = { diff --git a/apps/picsa-apps/content-dashboard/src/app/pages/map/map.page.ts b/apps/picsa-apps/content-dashboard/src/app/pages/map/map.page.ts index 907ef911b..c7d9173dc 100644 --- a/apps/picsa-apps/content-dashboard/src/app/pages/map/map.page.ts +++ b/apps/picsa-apps/content-dashboard/src/app/pages/map/map.page.ts @@ -1,12 +1,9 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'station-data-map', templateUrl: './map.page.html', - styleUrls: ['./map.page.scss'] + styleUrls: ['./map.page.scss'], }) -export class MapPage implements OnInit { - constructor() {} - - ngOnInit() {} -} +// eslint-disable-next-line @angular-eslint/component-class-suffix +export class MapPage {} diff --git a/apps/picsa-apps/extension-app-e2e/.eslintrc.json b/apps/picsa-apps/extension-app-e2e/.eslintrc.json index 3947051c7..73b7aff80 100644 --- a/apps/picsa-apps/extension-app-e2e/.eslintrc.json +++ b/apps/picsa-apps/extension-app-e2e/.eslintrc.json @@ -4,7 +4,10 @@ "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} + "rules": { + "@angular-eslint/component-selector": ["off"], + "@angular-eslint/component-class-suffix": ["off"] + } } ] } diff --git a/apps/picsa-apps/extension-app/src/app/components/whatsapp-group/whatsapp-group.ts b/apps/picsa-apps/extension-app/src/app/components/whatsapp-group/whatsapp-group.ts index c8d40d91c..c1b653483 100644 --- a/apps/picsa-apps/extension-app/src/app/components/whatsapp-group/whatsapp-group.ts +++ b/apps/picsa-apps/extension-app/src/app/components/whatsapp-group/whatsapp-group.ts @@ -3,12 +3,10 @@ import { Component, Input } from '@angular/core'; @Component({ selector: 'whatsapp-group', templateUrl: 'whatsapp-group.html', - styleUrls: ['./whatsapp-group.scss'] + styleUrls: ['./whatsapp-group.scss'], }) export class WhatsappGroupComponent { - @Input('group') group: IWhatsAppGroup; - - constructor() {} + @Input() group: IWhatsAppGroup; } export interface IWhatsAppGroup { diff --git a/apps/picsa-apps/extension-app/src/app/pages/discussions/discussions.page.ts b/apps/picsa-apps/extension-app/src/app/pages/discussions/discussions.page.ts index f01de0f46..efc8fc25e 100644 --- a/apps/picsa-apps/extension-app/src/app/pages/discussions/discussions.page.ts +++ b/apps/picsa-apps/extension-app/src/app/pages/discussions/discussions.page.ts @@ -4,15 +4,14 @@ import { IWhatsAppGroup } from '../../components/whatsapp-group/whatsapp-group'; @Component({ selector: 'app-discussions', templateUrl: './discussions.page.html', - styleUrls: ['./discussions.page.scss'] + styleUrls: ['./discussions.page.scss'], }) export class DiscussionsPage { groups: IWhatsAppGroup[] = [ { label: 'App Feedback', description: 'Give your suggestions or ask for help using the PICSA app', - link: 'https://chat.whatsapp.com/8wEc1tjLRqI7XyU4Lv5OLk' - } + link: 'https://chat.whatsapp.com/8wEc1tjLRqI7XyU4Lv5OLk', + }, ]; - constructor() {} } diff --git a/apps/picsa-apps/extension-app/src/app/pages/error/error.page.ts b/apps/picsa-apps/extension-app/src/app/pages/error/error.page.ts index 46aa9a2ad..c73853b82 100644 --- a/apps/picsa-apps/extension-app/src/app/pages/error/error.page.ts +++ b/apps/picsa-apps/extension-app/src/app/pages/error/error.page.ts @@ -1,20 +1,13 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-error', templateUrl: './error.page.html', - styleUrls: ['./error.page.scss'] + styleUrls: ['./error.page.scss'], }) -export class ErrorPage implements OnInit { +export class ErrorPage { reloading: boolean; errorMessage: string; - constructor() {} - - ngOnInit(): void { - //Called after the constructor, initializing input properties, and the first call to ngOnChanges. - //Add 'implements OnInit' to the class. - // this.errorMessage = this.ngRedux.getState().platform.error; - } reloadPage() { this.reloading = true; diff --git a/apps/picsa-apps/extension-app/src/app/pages/privacy/privacy.component.ts b/apps/picsa-apps/extension-app/src/app/pages/privacy/privacy.component.ts index a9bebc2c6..985f057f5 100644 --- a/apps/picsa-apps/extension-app/src/app/pages/privacy/privacy.component.ts +++ b/apps/picsa-apps/extension-app/src/app/pages/privacy/privacy.component.ts @@ -1,12 +1,8 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'picsa-privacy', templateUrl: './privacy.component.html', styleUrls: ['./privacy.component.scss'], }) -export class PrivacyComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} +export class PrivacyComponent {} diff --git a/apps/picsa-apps/farmer-app-e2e/.eslintrc.json b/apps/picsa-apps/farmer-app-e2e/.eslintrc.json index 3947051c7..73b7aff80 100644 --- a/apps/picsa-apps/farmer-app-e2e/.eslintrc.json +++ b/apps/picsa-apps/farmer-app-e2e/.eslintrc.json @@ -4,7 +4,10 @@ "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} + "rules": { + "@angular-eslint/component-selector": ["off"], + "@angular-eslint/component-class-suffix": ["off"] + } } ] } diff --git a/apps/picsa-apps/farmer-app/src/app/pages/home/home.component.ts b/apps/picsa-apps/farmer-app/src/app/pages/home/home.component.ts index 7d04dc3d0..63932fc6a 100644 --- a/apps/picsa-apps/farmer-app/src/app/pages/home/home.component.ts +++ b/apps/picsa-apps/farmer-app/src/app/pages/home/home.component.ts @@ -5,8 +5,4 @@ import { Component, OnInit } from '@angular/core'; templateUrl: './home.component.html', styleUrls: ['./home.component.scss'], }) -export class HomeComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} +export class HomeComponent implements OnInit {} diff --git a/apps/picsa-tools/budget-tool-e2e/.eslintrc.json b/apps/picsa-tools/budget-tool-e2e/.eslintrc.json index 3947051c7..73b7aff80 100644 --- a/apps/picsa-tools/budget-tool-e2e/.eslintrc.json +++ b/apps/picsa-tools/budget-tool-e2e/.eslintrc.json @@ -4,7 +4,10 @@ "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} + "rules": { + "@angular-eslint/component-selector": ["off"], + "@angular-eslint/component-class-suffix": ["off"] + } } ] } diff --git a/apps/picsa-tools/budget-tool/src/app/components/cell/variants/labour/labour.ts b/apps/picsa-tools/budget-tool/src/app/components/cell/variants/labour/labour.ts index 7937229c6..352a2c111 100644 --- a/apps/picsa-tools/budget-tool/src/app/components/cell/variants/labour/labour.ts +++ b/apps/picsa-tools/budget-tool/src/app/components/cell/variants/labour/labour.ts @@ -19,8 +19,6 @@ export class BudgetCellLabourComponent { _people: number; daysArray: number[][]; - constructor() {} - // given updates to people or days split the total into components of the large, medium, small and half values // map these values to directed arrays to populate images in the pictorial representation generateRepresentation() { diff --git a/apps/picsa-tools/budget-tool/src/app/models/legacy/v1.models.ts b/apps/picsa-tools/budget-tool/src/app/models/legacy/v1.models.ts index f89da7db8..394c080fa 100644 --- a/apps/picsa-tools/budget-tool/src/app/models/legacy/v1.models.ts +++ b/apps/picsa-tools/budget-tool/src/app/models/legacy/v1.models.ts @@ -1 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/no-empty-interface export interface V1Budget {} diff --git a/apps/picsa-tools/budget-tool/src/app/models/legacy/v2.models.ts b/apps/picsa-tools/budget-tool/src/app/models/legacy/v2.models.ts index f7ea97317..b8f95e2a2 100644 --- a/apps/picsa-tools/budget-tool/src/app/models/legacy/v2.models.ts +++ b/apps/picsa-tools/budget-tool/src/app/models/legacy/v2.models.ts @@ -1 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/no-empty-interface export interface IV2Budget {} diff --git a/apps/picsa-tools/budget-tool/src/app/models/legacy/v3.models.ts b/apps/picsa-tools/budget-tool/src/app/models/legacy/v3.models.ts index 0951cacd7..0836ca177 100644 --- a/apps/picsa-tools/budget-tool/src/app/models/legacy/v3.models.ts +++ b/apps/picsa-tools/budget-tool/src/app/models/legacy/v3.models.ts @@ -1 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/no-empty-interface export interface IV3Budget {} diff --git a/apps/picsa-tools/budget-tool/src/app/utils/budget.upgrade.ts b/apps/picsa-tools/budget-tool/src/app/utils/budget.upgrade.ts index a77396507..4dbaf5298 100644 --- a/apps/picsa-tools/budget-tool/src/app/utils/budget.upgrade.ts +++ b/apps/picsa-tools/budget-tool/src/app/utils/budget.upgrade.ts @@ -37,6 +37,7 @@ export const upgradeBudget = (budget: IBudget) => { // as budget type might have changed need to also type as any const v1Upgrade = (budget: IBudget | any) => { try { + // } catch (error) { budget.apiVersion = -1; } @@ -50,8 +51,7 @@ const v2Upgrade = (budget: IBudget | any) => { if (budget.periods && budget.periods.total) { budget.periods.total = Number(budget.periods.total); const lowerScale: string = budget.periods.scale; - const upperSacle: string = - lowerScale.charAt(0).toUpperCase() + lowerScale.substring(1); + const upperSacle: string = lowerScale.charAt(0).toUpperCase() + lowerScale.substring(1); budget.periods.scale = upperSacle; } budget.apiVersion = 3; @@ -64,6 +64,7 @@ const v2Upgrade = (budget: IBudget | any) => { const v3Upgrade = (budget: IV3Budget) => { try { + // } catch (error) { // TODO // log error and show error message (unable to upgrade or similar) diff --git a/apps/picsa-tools/climate-tool-e2e/.eslintrc.json b/apps/picsa-tools/climate-tool-e2e/.eslintrc.json index 3947051c7..73b7aff80 100644 --- a/apps/picsa-tools/climate-tool-e2e/.eslintrc.json +++ b/apps/picsa-tools/climate-tool-e2e/.eslintrc.json @@ -4,7 +4,10 @@ "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} + "rules": { + "@angular-eslint/component-selector": ["off"], + "@angular-eslint/component-class-suffix": ["off"] + } } ] } diff --git a/apps/picsa-tools/crop-probability-tool-e2e/.eslintrc.json b/apps/picsa-tools/crop-probability-tool-e2e/.eslintrc.json index 3947051c7..73b7aff80 100644 --- a/apps/picsa-tools/crop-probability-tool-e2e/.eslintrc.json +++ b/apps/picsa-tools/crop-probability-tool-e2e/.eslintrc.json @@ -4,7 +4,10 @@ "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} + "rules": { + "@angular-eslint/component-selector": ["off"], + "@angular-eslint/component-class-suffix": ["off"] + } } ] } diff --git a/apps/picsa-tools/monitoring-tool-e2e/.eslintrc.json b/apps/picsa-tools/monitoring-tool-e2e/.eslintrc.json index 3947051c7..73b7aff80 100644 --- a/apps/picsa-tools/monitoring-tool-e2e/.eslintrc.json +++ b/apps/picsa-tools/monitoring-tool-e2e/.eslintrc.json @@ -4,7 +4,10 @@ "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} + "rules": { + "@angular-eslint/component-selector": ["off"], + "@angular-eslint/component-class-suffix": ["off"] + } } ] } diff --git a/apps/picsa-tools/option-tool-e2e/.eslintrc.json b/apps/picsa-tools/option-tool-e2e/.eslintrc.json index 3947051c7..73b7aff80 100644 --- a/apps/picsa-tools/option-tool-e2e/.eslintrc.json +++ b/apps/picsa-tools/option-tool-e2e/.eslintrc.json @@ -4,7 +4,10 @@ "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} + "rules": { + "@angular-eslint/component-selector": ["off"], + "@angular-eslint/component-class-suffix": ["off"] + } } ] } diff --git a/apps/picsa-tools/resources-tool-e2e/.eslintrc.json b/apps/picsa-tools/resources-tool-e2e/.eslintrc.json index 3947051c7..73b7aff80 100644 --- a/apps/picsa-tools/resources-tool-e2e/.eslintrc.json +++ b/apps/picsa-tools/resources-tool-e2e/.eslintrc.json @@ -4,7 +4,10 @@ "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} + "rules": { + "@angular-eslint/component-selector": ["off"], + "@angular-eslint/component-class-suffix": ["off"] + } } ] } diff --git a/libs/components/src/components/configuration-select/configuration-select-dialog.ts b/libs/components/src/components/configuration-select/configuration-select-dialog.ts index 4955a732b..a87ed890f 100644 --- a/libs/components/src/components/configuration-select/configuration-select-dialog.ts +++ b/libs/components/src/components/configuration-select/configuration-select-dialog.ts @@ -6,6 +6,7 @@ import { ConfigurationService, IConfiguration } from '@picsa/configuration/src'; templateUrl: './configuration-select-dialog.html', styleUrls: ['./configuration-select-dialog.scss'], }) +// eslint-disable-next-line @angular-eslint/component-class-suffix export class ConfigurationSelectDialog { public options: IConfiguration.Localisation[]; public selected: IConfiguration.Localisation; @@ -28,14 +29,9 @@ export class ConfigurationSelectDialog { this.loadConfigurationOptions(); } - public setLanguage( - option: IConfiguration.Localisation['language']['selected'] - ) { + public setLanguage(option: IConfiguration.Localisation['language']['selected']) { this.selected.language.selected = option; - this.configurationService.updateUserConfiguration( - 'localisation', - this.selected - ); + this.configurationService.updateUserConfiguration('localisation', this.selected); // TODO - also update translations // this.store.updateUser({ lang: code }); // this.store.setLanguage(code); diff --git a/libs/configuration/src/provider.ts b/libs/configuration/src/provider.ts index a371500e9..e1204c15a 100644 --- a/libs/configuration/src/provider.ts +++ b/libs/configuration/src/provider.ts @@ -9,9 +9,7 @@ export class ConfigurationService { public activeConfiguration: IConfiguration.Settings; /** Change observer */ - public activeConfiguration$ = new BehaviorSubject( - null as any - ); + public activeConfiguration$ = new BehaviorSubject(null as any); public configurationOptions: IConfiguration.Settings[]; @@ -32,10 +30,7 @@ export class ConfigurationService { } } - public updateUserConfiguration( - setting: keyof IConfiguration.Settings, - value: any - ) { + public updateUserConfiguration(setting: keyof IConfiguration.Settings, value: any) { const extracted = extractSelectedOptions(value); if (extracted) { this.userConfigOverrides[setting] = extracted; @@ -52,13 +47,13 @@ export class ConfigurationService { private loadActiveConfig() { try { - const storedConfig = JSON.parse( - localStorage.getItem('picsa_userConfig') as any - ); + const storedConfig = JSON.parse(localStorage.getItem('picsa_userConfig') as any); if (storedConfig && storedConfig.id) { this.userConfigOverrides = storedConfig; } - } catch (error) {} + } catch (error) { + // + } const { selected, options } = populateSelectedOptions( { options: CONFIGURATIONS, selected: undefined }, @@ -95,9 +90,7 @@ function populateSelectedOptions( // Second pass - replace selected if (data.options) { data.selected = data.options![0]; - const foundOption = data.options!.find( - (option: any) => option.id === userData.id - ); + const foundOption = data.options!.find((option: any) => option.id === userData.id); if (foundOption !== undefined) { data.selected = foundOption; } diff --git a/libs/configuration/src/types.ts b/libs/configuration/src/types.ts index e455e85ca..52a32f62c 100644 --- a/libs/configuration/src/types.ts +++ b/libs/configuration/src/types.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line @typescript-eslint/no-namespace export namespace IConfiguration { /** When storing as a user option ensure id field used so user setting can save selected */ export interface UserOption { @@ -25,7 +26,7 @@ export namespace IConfiguration { climateTool: { stationFilter?: (station: any) => boolean; }; - resourcesTool?: {}; + resourcesTool?: any; localisation: IConfiguration.Localisation; theme: any; } diff --git a/libs/i18n/.eslintrc.json b/libs/i18n/.eslintrc.json index 3456be9b9..a8270f243 100644 --- a/libs/i18n/.eslintrc.json +++ b/libs/i18n/.eslintrc.json @@ -1,10 +1,13 @@ { - "extends": ["../../../.eslintrc.json"], + "extends": ["../../.eslintrc.json"], "ignorePatterns": ["!**/*"], "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} + "rules": { + "@angular-eslint/component-selector": ["off"], + "@angular-eslint/component-class-suffix": ["off"] + } }, { "files": ["*.ts", "*.tsx"], diff --git a/libs/i18n/src/hardcoded/budget.ts b/libs/i18n/src/hardcoded/budget.ts index 388f9b600..ce0143fb5 100644 --- a/libs/i18n/src/hardcoded/budget.ts +++ b/libs/i18n/src/hardcoded/budget.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries import { BUDGET_CARDS } from '@picsa/budget/src/app/data'; import type { ITranslationEntry } from '../types'; diff --git a/libs/i18n/src/hardcoded/climate.ts b/libs/i18n/src/hardcoded/climate.ts index 4a3988084..bfbd001cf 100644 --- a/libs/i18n/src/hardcoded/climate.ts +++ b/libs/i18n/src/hardcoded/climate.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries import { CHART_TYPES } from '@picsa/climate/src/app/data'; import type { ITranslationEntry } from '../types'; diff --git a/libs/shared/src/features/dialog/dialog.service.ts b/libs/shared/src/features/dialog/dialog.service.ts index fb7aa683b..156477c8b 100644 --- a/libs/shared/src/features/dialog/dialog.service.ts +++ b/libs/shared/src/features/dialog/dialog.service.ts @@ -4,7 +4,7 @@ import DIALOG_TEMPLATES, { ICustomTemplate } from './components/TEMPLATES'; import { IPicsaDialogData, IPicsaDialogConfig } from './dialog.models'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class PicsaDialogService { constructor(private dialog: MatDialog) {} @@ -23,10 +23,9 @@ export class PicsaDialogService { const config = { ...templateConfig, ...customConfig, - data: { ...templateConfig.data, ...customData } + data: { ...templateConfig.data, ...customData }, }; const dialogRef = this.dialog.open(config.component, config); - dialogRef.afterClosed().subscribe(v => {}); return dialogRef; } diff --git a/libs/shared/src/features/loading/loading.ts b/libs/shared/src/features/loading/loading.ts index d68061e1a..95e8f9a6d 100644 --- a/libs/shared/src/features/loading/loading.ts +++ b/libs/shared/src/features/loading/loading.ts @@ -1,13 +1,13 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, Input } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import SVGS from './svgs'; @Component({ selector: 'picsa-loading', templateUrl: './loading.html', - styleUrls: ['./loading.scss'] + styleUrls: ['./loading.scss'], }) -export class PicsaLoadingComponent implements OnInit { +export class PicsaLoadingComponent { @Input() set name(name: IPicsaLoaders) { // select svg by name (or use default bars) const svg = name && SVGS[name] ? SVGS[name] : SVGS.BARS; @@ -16,8 +16,6 @@ export class PicsaLoadingComponent implements OnInit { loaderHtml: SafeHtml; constructor(private sanitizer: DomSanitizer) {} - ngOnInit(): void {} - /********************************************************************** * Helper Methods ***********************************************************************/ @@ -31,7 +29,7 @@ export class PicsaLoadingComponent implements OnInit { // method taken from http://yoksel.github.io/url-encoder/ // applies selective replacement of uri characters private _encodeSVG(data: string): string { - const symbols = /[\r\n%#()<>?\[\\\]^`{|}]/g; + const symbols = /[\r\n%#()<>?[\\\]^`{|}]/g; data = data.replace(/"/g, "'"); data = data.replace(/>\s{1,}<'); data = data.replace(/\s{2,}/g, ' '); diff --git a/libs/shared/src/modules/translate/translate.service.ts b/libs/shared/src/modules/translate/translate.service.ts index 6467039f2..38782bdbb 100644 --- a/libs/shared/src/modules/translate/translate.service.ts +++ b/libs/shared/src/modules/translate/translate.service.ts @@ -8,7 +8,7 @@ import { Subject, takeUntil } from 'rxjs'; export class PicsaTranslateService implements OnDestroy { loader: HTMLIonLoadingElement; monthNames: string[] = MONTHS; - public language: string = 'en'; + public language = 'en'; private destroyed$ = new Subject(); constructor( public toastCtrl: ToastController, @@ -25,16 +25,14 @@ export class PicsaTranslateService implements OnDestroy { } private subscribeToConfigLanguageChanges() { - this.configurationService.activeConfiguration$ - .pipe(takeUntil(this.destroyed$)) - .subscribe((config) => { - const language = config.localisation.language.selected?.code; - if (language && language !== this.language) { - this.language = language; - this.prepareStaticTranslations(); - this.ngxTranslate.use(language); - } - }); + this.configurationService.activeConfiguration$.pipe(takeUntil(this.destroyed$)).subscribe((config) => { + const language = config.localisation.language.selected?.code; + if (language && language !== this.language) { + this.language = language; + this.prepareStaticTranslations(); + this.ngxTranslate.use(language); + } + }); } // use translate service to translate strings that will be displayed @@ -72,12 +70,4 @@ export const MONTHS = [ 'December', ]; -export const DAYS = [ - 'Monday', - 'Tuesday', - 'Wednesday', - 'Thursday', - 'Friday', - 'Saturday', - 'Sunday', -]; +export const DAYS = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; diff --git a/libs/shared/src/services/pwa/ngsw.service.ts b/libs/shared/src/services/pwa/ngsw.service.ts index a10ba457c..36bfda48a 100644 --- a/libs/shared/src/services/pwa/ngsw.service.ts +++ b/libs/shared/src/services/pwa/ngsw.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ToastController } from '@ionic/angular'; import { SwUpdate } from '@angular/service-worker'; -import { PicsaTranslateService } from '@picsa/shared/modules/translate'; +import { PicsaTranslateService } from '../../modules'; @Injectable({ providedIn: 'root', diff --git a/libs/theme/.eslintrc.json b/libs/theme/.eslintrc.json index 9d9c0db55..a8270f243 100644 --- a/libs/theme/.eslintrc.json +++ b/libs/theme/.eslintrc.json @@ -4,7 +4,10 @@ "overrides": [ { "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} + "rules": { + "@angular-eslint/component-selector": ["off"], + "@angular-eslint/component-class-suffix": ["off"] + } }, { "files": ["*.ts", "*.tsx"], diff --git a/libs/webcomponents/.eslintrc.json b/libs/webcomponents/.eslintrc.json new file mode 100644 index 000000000..4f79ab576 --- /dev/null +++ b/libs/webcomponents/.eslintrc.json @@ -0,0 +1,21 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.tsx"], + "extends": ["plugin:@nrwl/nx/angular", "plugin:@angular-eslint/template/process-inline-templates"], + "rules": { + "@angular-eslint/directive-selector": ["off"], + "@angular-eslint/component-selector": ["off"], + "@angular-eslint/no-inputs-metadata-property": "off", + "@angular-eslint/component-class-suffix": "off" + } + }, + { + "files": ["*.html"], + "extends": ["plugin:@nrwl/nx/angular-template"], + "rules": {} + } + ] +} diff --git a/libs/webcomponents/project.json b/libs/webcomponents/project.json index 4592ffc21..770f6b11d 100644 --- a/libs/webcomponents/project.json +++ b/libs/webcomponents/project.json @@ -61,7 +61,7 @@ "executor": "@nrwl/linter:eslint", "outputs": ["{options.outputFile}"], "options": { - "lintFilePatterns": "libs/webcomponents/**/*.{ts,tsx}" + "lintFilePatterns": ["libs/webcomponents/**/*.tsx"] } } } diff --git a/libs/webcomponents/src/components/enketo-webform/enketo-webform.tsx b/libs/webcomponents/src/components/enketo-webform/enketo-webform.tsx index 4693da0ae..64be8f44b 100644 --- a/libs/webcomponents/src/components/enketo-webform/enketo-webform.tsx +++ b/libs/webcomponents/src/components/enketo-webform/enketo-webform.tsx @@ -66,9 +66,7 @@ export class EnketoWebform { } // If desired, scroll to a specific question with any XPath location expression, // and aggregate any loadErrors. - loadErrors = loadErrors.concat( - this.enketoForm.goTo('//repeat[3]/node') - ); + loadErrors = loadErrors.concat(this.enketoForm.goTo('//repeat[3]/node')); } } } diff --git a/package.json b/package.json index 4cd072cfd..8403a1576 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "license": "See LICENSE", "scripts": { "ng": "nx", - "postinstall": "node ./decorate-angular-cli.js && ngcc --properties es2020 browser module main && jetifier", + "postinstall": "node ./decorate-angular-cli.js && ngcc --properties es2020 browser module main && jetifier && husky install", "start": "yarn build:webcomponents && nx serve", "start:server": "nx run picsa-server-docker:start", "start:budget": "nx run picsa-tools-budget-tool:serve", @@ -134,10 +134,12 @@ "eslint-plugin-cypress": "^2.10.3", "execa": "^5.1.1", "fs-extra": "^10.1.0", + "husky": "^8.0.0", "jest": "28.1.1", "jest-environment-jsdom": "28.1.1", "jest-preset-angular": "12.2.3", "jetifier": "^2.0.0", + "lint-staged": "^13.2.1", "ng-packagr": "15.1.1", "nx": "15.6.2", "postcss": "^8.4.5", @@ -154,5 +156,9 @@ "ts-node": "10.9.1", "typescript": "4.8.4" }, - "packageManager": "yarn@3.2.1" + "packageManager": "yarn@3.2.1", + "lint-staged": { + "*.js": "eslint --cache --fix", + "*.{js,css,md}": "prettier --write" + } } diff --git a/yarn.lock b/yarn.lock index b107cc72d..837f0ad84 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7911,7 +7911,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^6.1.0": +"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0": version: 6.2.1 resolution: "ansi-styles@npm:6.2.1" checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 @@ -8854,6 +8854,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:5.2.0": + version: 5.2.0 + resolution: "chalk@npm:5.2.0" + checksum: 03d8060277de6cf2fd567dc25fcf770593eb5bb85f460ce443e49255a30ff1242edd0c90a06a03803b0466ff0687a939b41db1757bec987113e83de89a003caa + languageName: node + linkType: hard + "chalk@npm:^2.0.0": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -9010,6 +9017,16 @@ __metadata: languageName: node linkType: hard +"cli-truncate@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-truncate@npm:3.1.0" + dependencies: + slice-ansi: ^5.0.0 + string-width: ^5.0.0 + checksum: c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a + languageName: node + linkType: hard + "cli-width@npm:^3.0.0": version: 3.0.0 resolution: "cli-width@npm:3.0.0" @@ -9146,6 +9163,13 @@ __metadata: languageName: node linkType: hard +"colorette@npm:^2.0.19": + version: 2.0.19 + resolution: "colorette@npm:2.0.19" + checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 + languageName: node + linkType: hard + "combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -9162,6 +9186,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^10.0.0": + version: 10.0.0 + resolution: "commander@npm:10.0.0" + checksum: 9f6495651f878213005ac744dd87a85fa3d9f2b8b90d1c19d0866d666bda7f735adfd7c2f10dfff345782e2f80ea258f98bb4efcef58e4e502f25f883940acfd + languageName: node + linkType: hard + "commander@npm:^5.1.0": version: 5.1.0 resolution: "commander@npm:5.1.0" @@ -11461,6 +11492,23 @@ __metadata: languageName: node linkType: hard +"execa@npm:^7.0.0": + version: 7.1.1 + resolution: "execa@npm:7.1.1" + dependencies: + cross-spawn: ^7.0.3 + get-stream: ^6.0.1 + human-signals: ^4.3.0 + is-stream: ^3.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^5.1.0 + onetime: ^6.0.0 + signal-exit: ^3.0.7 + strip-final-newline: ^3.0.0 + checksum: 21fa46fc69314ace4068cf820142bdde5b643a5d89831c2c9349479c1555bff137a291b8e749e7efca36535e4e0a8c772c11008ca2e84d2cbd6ca141a3c8f937 + languageName: node + linkType: hard + "executable@npm:^4.1.1": version: 4.1.1 resolution: "executable@npm:4.1.1" @@ -12119,7 +12167,7 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^6.0.0": +"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad @@ -12632,6 +12680,13 @@ __metadata: languageName: node linkType: hard +"human-signals@npm:^4.3.0": + version: 4.3.1 + resolution: "human-signals@npm:4.3.1" + checksum: 6f12958df3f21b6fdaf02d90896c271df00636a31e2bbea05bddf817a35c66b38a6fdac5863e2df85bd52f34958997f1f50350ff97249e1dff8452865d5235d1 + languageName: node + linkType: hard + "humanize-ms@npm:^1.2.1": version: 1.2.1 resolution: "humanize-ms@npm:1.2.1" @@ -12641,6 +12696,15 @@ __metadata: languageName: node linkType: hard +"husky@npm:^8.0.0": + version: 8.0.3 + resolution: "husky@npm:8.0.3" + bin: + husky: lib/bin.js + checksum: 837bc7e4413e58c1f2946d38fb050f5d7324c6f16b0fd66411ffce5703b294bd21429e8ba58711cd331951ee86ed529c5be4f76805959ff668a337dbfa82a1b0 + languageName: node + linkType: hard + "iconv-lite@npm:0.4, iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -13033,6 +13097,13 @@ __metadata: languageName: node linkType: hard +"is-fullwidth-code-point@npm:^4.0.0": + version: 4.0.0 + resolution: "is-fullwidth-code-point@npm:4.0.0" + checksum: 8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d + languageName: node + linkType: hard + "is-generator-fn@npm:^2.0.0": version: 2.1.0 resolution: "is-generator-fn@npm:2.1.0" @@ -13166,6 +13237,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "is-stream@npm:3.0.0" + checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 + languageName: node + linkType: hard + "is-string@npm:^1.0.5, is-string@npm:^1.0.7": version: 1.0.7 resolution: "is-string@npm:1.0.7" @@ -14242,7 +14320,7 @@ __metadata: "leaflet-draw@github:enketo/Leaflet.draw#ff73078, leaflet-draw@github:enketo/Leaflet.draw#ff730785db7fcccbf2485ffcf4dffe1238a7c617": version: 1.0.4 resolution: "leaflet-draw@https://github.com/enketo/Leaflet.draw.git#commit=ff730785db7fcccbf2485ffcf4dffe1238a7c617" - checksum: b2280f200f5ea410e33cc5feb500d67d86cb5f16b294eea1306da055614ffc906be7de6dbc9bbf4db6e6e5d27d0396e4701a3b6c4c920548d2aac94b8223879f + checksum: b08b88994769667f11f2b6a8937656c89cea34dafd4661abab0b48b4b97f3bddbdce7b23ddfdb8d7c6335e065530e32a70e281314afa34afa134bf68597945fc languageName: node linkType: hard @@ -14388,6 +14466,13 @@ __metadata: languageName: node linkType: hard +"lilconfig@npm:2.1.0": + version: 2.1.0 + resolution: "lilconfig@npm:2.1.0" + checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 + languageName: node + linkType: hard + "lilconfig@npm:^2.0.3, lilconfig@npm:^2.0.5": version: 2.0.5 resolution: "lilconfig@npm:2.0.5" @@ -14409,6 +14494,29 @@ __metadata: languageName: node linkType: hard +"lint-staged@npm:^13.2.1": + version: 13.2.1 + resolution: "lint-staged@npm:13.2.1" + dependencies: + chalk: 5.2.0 + cli-truncate: ^3.1.0 + commander: ^10.0.0 + debug: ^4.3.4 + execa: ^7.0.0 + lilconfig: 2.1.0 + listr2: ^5.0.7 + micromatch: ^4.0.5 + normalize-path: ^3.0.0 + object-inspect: ^1.12.3 + pidtree: ^0.6.0 + string-argv: ^0.3.1 + yaml: ^2.2.1 + bin: + lint-staged: bin/lint-staged.js + checksum: 5788d3fe38e69b7f7b7f700284d4e10738978a0916bc77d3f6253c43a030fc4f01f89c09da349fb658f929f3393d8b1e3eaabaac5b604416ebc33476640b51ce + languageName: node + linkType: hard + "listr2@npm:^3.8.3": version: 3.14.0 resolution: "listr2@npm:3.14.0" @@ -14430,6 +14538,27 @@ __metadata: languageName: node linkType: hard +"listr2@npm:^5.0.7": + version: 5.0.8 + resolution: "listr2@npm:5.0.8" + dependencies: + cli-truncate: ^2.1.0 + colorette: ^2.0.19 + log-update: ^4.0.0 + p-map: ^4.0.0 + rfdc: ^1.3.0 + rxjs: ^7.8.0 + through: ^2.3.8 + wrap-ansi: ^7.0.0 + peerDependencies: + enquirer: ">= 2.3.0 < 3" + peerDependenciesMeta: + enquirer: + optional: true + checksum: 8be9f5632627c4df0dc33f452c98d415a49e5f1614650d3cab1b103c33e95f2a7a0e9f3e1e5de00d51bf0b4179acd8ff11b25be77dbe097cf3773c05e728d46c + languageName: node + linkType: hard + "loader-runner@npm:^4.2.0": version: 4.3.0 resolution: "loader-runner@npm:4.3.0" @@ -14780,7 +14909,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": +"micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": version: 4.0.5 resolution: "micromatch@npm:4.0.5" dependencies: @@ -14831,6 +14960,13 @@ __metadata: languageName: node linkType: hard +"mimic-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-fn@npm:4.0.0" + checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 + languageName: node + linkType: hard + "mimic-response@npm:^3.1.0": version: 3.1.0 resolution: "mimic-response@npm:3.1.0" @@ -15559,6 +15695,15 @@ __metadata: languageName: node linkType: hard +"npm-run-path@npm:^5.1.0": + version: 5.1.0 + resolution: "npm-run-path@npm:5.1.0" + dependencies: + path-key: ^4.0.0 + checksum: dc184eb5ec239d6a2b990b43236845332ef12f4e0beaa9701de724aa797fe40b6bbd0157fb7639d24d3ab13f5d5cf22d223a19c6300846b8126f335f788bee66 + languageName: node + linkType: hard + "npmlog@npm:^6.0.0": version: 6.0.2 resolution: "npmlog@npm:6.0.2" @@ -15647,6 +15792,13 @@ __metadata: languageName: node linkType: hard +"object-inspect@npm:^1.12.3": + version: 1.12.3 + resolution: "object-inspect@npm:1.12.3" + checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db + languageName: node + linkType: hard + "object-inspect@npm:^1.9.0": version: 1.12.2 resolution: "object-inspect@npm:1.12.2" @@ -15736,6 +15888,15 @@ __metadata: languageName: node linkType: hard +"onetime@npm:^6.0.0": + version: 6.0.0 + resolution: "onetime@npm:6.0.0" + dependencies: + mimic-fn: ^4.0.0 + checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 + languageName: node + linkType: hard + "open@npm:8.4.0, open@npm:^8.0.9, open@npm:^8.4.0": version: 8.4.0 resolution: "open@npm:8.4.0" @@ -16044,6 +16205,13 @@ __metadata: languageName: node linkType: hard +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 + languageName: node + linkType: hard + "path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" @@ -16195,12 +16363,14 @@ __metadata: fs-extra: ^10.1.0 glob: ^8.1.0 html2canvas: ^1.4.1 + husky: ^8.0.0 jest: 28.1.1 jest-environment-jsdom: 28.1.1 jest-preset-angular: 12.2.3 jetifier: ^2.0.0 leaflet: ^1.9.3 leaflet-draw: "github:enketo/Leaflet.draw#ff730785db7fcccbf2485ffcf4dffe1238a7c617" + lint-staged: ^13.2.1 lottie-web: ^5.10.2 mobx: ^6.7.0 mobx-angular: ^4.7.1 @@ -16234,6 +16404,15 @@ __metadata: languageName: unknown linkType: soft +"pidtree@npm:^0.6.0": + version: 0.6.0 + resolution: "pidtree@npm:0.6.0" + bin: + pidtree: bin/pidtree.js + checksum: 8fbc073ede9209dd15e80d616e65eb674986c93be49f42d9ddde8dbbd141bb53d628a7ca4e58ab5c370bb00383f67d75df59a9a226dede8fa801267a7030c27a + languageName: node + linkType: hard + "pify@npm:^2.2.0, pify@npm:^2.3.0": version: 2.3.0 resolution: "pify@npm:2.3.0" @@ -17983,7 +18162,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.5.6, rxjs@npm:~7.8.0": +"rxjs@npm:^7.5.6, rxjs@npm:^7.8.0, rxjs@npm:~7.8.0": version: 7.8.0 resolution: "rxjs@npm:7.8.0" dependencies: @@ -18454,6 +18633,16 @@ __metadata: languageName: node linkType: hard +"slice-ansi@npm:^5.0.0": + version: 5.0.0 + resolution: "slice-ansi@npm:5.0.0" + dependencies: + ansi-styles: ^6.0.0 + is-fullwidth-code-point: ^4.0.0 + checksum: 7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -18802,6 +18991,13 @@ __metadata: languageName: node linkType: hard +"string-argv@npm:^0.3.1": + version: 0.3.1 + resolution: "string-argv@npm:0.3.1" + checksum: efbd0289b599bee808ce80820dfe49c9635610715429c6b7cc50750f0437e3c2f697c81e5c390208c13b5d5d12d904a1546172a88579f6ee5cbaaaa4dc9ec5cf + languageName: node + linkType: hard + "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -18823,7 +19019,7 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^5.0.1": +"string-width@npm:^5.0.0, string-width@npm:^5.0.1": version: 5.1.2 resolution: "string-width@npm:5.1.2" dependencies: @@ -18891,6 +19087,13 @@ __metadata: languageName: node linkType: hard +"strip-final-newline@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-final-newline@npm:3.0.0" + checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 + languageName: node + linkType: hard + "strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -20470,6 +20673,13 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.2.1": + version: 2.2.1 + resolution: "yaml@npm:2.2.1" + checksum: 84f68cbe462d5da4e7ded4a8bded949ffa912bc264472e5a684c3d45b22d8f73a3019963a32164023bdf3d83cfb6f5b58ff7b2b10ef5b717c630f40bd6369a23 + languageName: node + linkType: hard + "yargs-parser@npm:21.1.1, yargs-parser@npm:>=21.0.1, yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1"