@flumens/utils 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/date.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.toISOTimezoneString=exports.isValidDate=exports.getRelativeDate=exports.timeFormat=exports.dateFormatISO=exports.dateFormatGB=exports.dateFormat=void 0,exports.dateFormat=new Intl.DateTimeFormat("en-GB",{day:"numeric",month:"numeric",year:"numeric"}),exports.dateFormatGB=exports.dateFormat,exports.dateFormatISO=new Intl.DateTimeFormat("lt-LT",{day:"numeric",month:"numeric",year:"numeric"}),exports.timeFormat=new Intl.DateTimeFormat("en-GB",{hour:"numeric",minute:"numeric"});exports.getRelativeDate=e=>{const t=new Date(e),r=exports.dateFormatGB.format(t),a=new Date;if(exports.dateFormatGB.format(a)===r)return"Today";const o=new Date;o.setDate(o.getDate()-1);return exports.dateFormatGB.format(o)===r?"Yesterday":r};exports.isValidDate=e=>{const t=new Date(e);return t instanceof Date&&!isNaN(t)};exports.toISOTimezoneString=e=>{const t=-e.getTimezoneOffset(),r=t>=0?"+":"-",a=function(e){return(e<10?"0":"")+e};return`${e.getFullYear()}-${a(e.getMonth()+1)}-${a(e.getDate())}T${a(e.getHours())}:${a(e.getMinutes())}:${a(e.getSeconds())}${r}${a(Math.floor(Math.abs(t)/60))}:${a(Math.abs(t)%60)}`};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.toISOTimezoneString=exports.isValidDate=exports.getRelativeDate=exports.timeFormat=exports.dateFormatISO=exports.dateFormatGB=exports.dateFormat=void 0,exports.dateFormat=new Intl.DateTimeFormat("en-GB",{day:"numeric",month:"numeric",year:"numeric"}),exports.dateFormatGB=exports.dateFormat,exports.dateFormatISO=new Intl.DateTimeFormat("lt-LT",{day:"numeric",month:"numeric",year:"numeric"}),exports.timeFormat=new Intl.DateTimeFormat("en-GB",{hour:"numeric",minute:"numeric"});exports.getRelativeDate=e=>{const t=new Date(e),r=exports.dateFormatGB.format(t),a=new Date;if(exports.dateFormatGB.format(a)===r)return"Today";const o=new Date;o.setDate(o.getDate()-1);return exports.dateFormatGB.format(o)===r?"Yesterday":r};exports.isValidDate=e=>{const t=new Date(e);return!Number.isNaN(t.getTime())};exports.toISOTimezoneString=e=>{const t=-e.getTimezoneOffset(),r=t>=0?"+":"-",a=function(e){return(e<10?"0":"")+e};return`${e.getFullYear()}-${a(e.getMonth()+1)}-${a(e.getDate())}T${a(e.getHours())}:${a(e.getMinutes())}:${a(e.getSeconds())}${r}${a(Math.floor(Math.abs(t)/60))}:${a(Math.abs(t)%60)}`};
@@ -3,10 +3,10 @@ export declare class Deferred<T> implements Promise<T> {
3
3
  private _rejectSelf;
4
4
  private promise;
5
5
  constructor();
6
- then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;
7
- catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
8
- finally<TResult = never>(onFinally?: (() => void) | undefined | null): Promise<T | TResult>;
6
+ then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;
7
+ catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
8
+ finally(onFinally?: (() => void) | undefined | null): Promise<T>;
9
9
  resolve(val: T): void;
10
- reject(reason: any): void;
11
- [Symbol.toStringTag]: 'Promise';
10
+ reject(reason?: unknown): void;
11
+ [Symbol.toStringTag]: string;
12
12
  }
package/dist/deferred.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Deferred=void 0;exports.Deferred=class{constructor(){this.promise=new Promise(((e,r)=>{this._resolveSelf=e,this._rejectSelf=r}))}then(e,r){return this.promise.then(e,r)}catch(e){return this.promise.catch(e)}finally(e){return this.promise.finally(e)}resolve(e){this._resolveSelf(e)}reject(e){this._rejectSelf(e)}};
1
+ "use strict";var e;Object.defineProperty(exports,"__esModule",{value:!0}),exports.Deferred=void 0;exports.Deferred=class{constructor(){this[e]="Promise",this.promise=new Promise(((e,r)=>{this._resolveSelf=e,this._rejectSelf=r}))}then(e,r){return this.promise.then(e,r)}catch(e){return this.promise.catch(e)}finally(e){return this.promise.finally(e)}resolve(e){this._resolveSelf(e)}reject(e){this._rejectSelf(e)}},e=Symbol.toStringTag;
package/dist/image.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.createImage=void 0,exports.getObjectURL=a,exports.saveFile=function(e,o){return t.__awaiter(this,void 0,void 0,(function*(){if(!r.Capacitor.isNativePlatform())return a(e);yield i.Filesystem.writeFile({path:o,data:e,directory:i.Directory.Data});const{uri:t}=yield i.Filesystem.stat({path:o,directory:i.Directory.Data});return t}))},exports.deleteFile=function(e){return t.__awaiter(this,void 0,void 0,(function*(){r.Capacitor.isNativePlatform()&&(yield i.Filesystem.deleteFile({path:e,directory:i.Directory.Data}))}))},exports.resizeImage=o,exports.cropImage=function(e,r){return t.__awaiter(this,arguments,void 0,(function*(t,e,r=0){const i=yield(0,exports.createImage)(t),a=document.createElement("canvas"),o=a.getContext("2d");if(!o)return"";const s=n(r),{width:c,height:l}=function(t,e,r){const i=n(r),a=Math.abs(Math.cos(i)*t)+Math.abs(Math.sin(i)*e),o=Math.abs(Math.sin(i)*t)+Math.abs(Math.cos(i)*e);return{width:a,height:o}}(i.width,i.height,r);a.width=c,a.height=l,o.translate(c/2,l/2),o.rotate(s),o.translate(-i.width/2,-i.height/2),o.drawImage(i,0,0);const u=document.createElement("canvas"),d=u.getContext("2d");return d?(u.width=e.width,u.height=e.height,d.drawImage(a,e.x,e.y,e.width,e.height,0,0,e.width,e.height),u.toDataURL()):""}))},exports.isDataURL=c,exports.dataURItoBlob=l,exports.getBlobFromURL=function(t,e){if(c(t)){const r=l(t,e);return Promise.resolve(r)}return new Promise((e=>{const r=new XMLHttpRequest;r.open("GET",t,!0),r.responseType="blob",r.onload=()=>{const t=r.response;e(t)},r.send()}))},exports.captureImage=function(){return t.__awaiter(this,arguments,void 0,(function*(r={}){const a=yield function(r){return t.__awaiter(this,void 0,void 0,(function*(){const{camera:i,multiple:a,getPhoto:o}=r,n=t.__rest(r,["camera","multiple","getPhoto"]);if(o){const t=yield o();return t?[t]:[]}if(a)try{const t=Object.assign({quality:40,correctOrientation:!0,limit:30},n);return(yield e.Camera.pickImages(t)).photos}catch(t){if(t.message.includes("User cancelled photos app")||t.message.includes("No images picked"))return[];throw t}try{const t=Object.assign({quality:40,allowEditing:!1,saveToGallery:!0,webUseInput:!0,correctOrientation:!0,resultType:e.CameraResultType.Uri,source:i?e.CameraSource.Camera:e.CameraSource.Photos},n);return[yield e.Camera.getPhoto(t)]}catch(t){if(t.message.includes("User cancelled photos app")||t.message.includes("No image picked"))return[];throw t}}))}(r),o=[];for(const t of a){const{path:e}=t;if(!e){t.webPath&&o.push(t.webPath);continue}const r=yield s(e);if(e.includes("/tmp/")||e.includes("/cache/"))try{yield i.Filesystem.deleteFile({path:e})}catch(t){}o.push(r)}return o}))};const t=require("tslib"),e=require("@capacitor/camera"),r=require("@capacitor/core"),i=require("@capacitor/filesystem");function a(t){const e=t.split(",")[0].split(":")[1].split(";")[0],r=window.atob(t.split(",")[1]),i=[];for(let t=0;t<r.length;t++)i.push(r.charCodeAt(t));const a=new Blob([new Uint8Array(i)],{type:e});return window.URL.createObjectURL(a)}function o({url:t,fileType:e="image/jpeg",MAX_WIDTH:r=2e3,MAX_HEIGHT:i=2e3}){return new Promise((a=>{const o=new window.Image;o.onload=()=>{var t;let{width:n}=o,{height:s}=o;let c=null;c=n>s?n/(r>n?n:r):s/(i>s?s:i),n/=c,s/=c;const l=document.createElement("canvas");l.width=n,l.height=s,null===(t=l.getContext("2d"))||void 0===t||t.drawImage(o,0,0,n,s),a([o,l.toDataURL(e)])},o.src=t}))}function n(t){return t*Math.PI/180}function s(e){return t.__awaiter(this,void 0,void 0,(function*(){const t=`${Date.now()}.jpeg`,[,a]=yield o({url:r.Capacitor.convertFileSrc(e)});yield i.Filesystem.writeFile({path:t,data:a,directory:i.Directory.Data});const{uri:n}=yield i.Filesystem.stat({path:t,directory:i.Directory.Data});return n}))}function c(t){if(!t)return!1;return!!t.toString().match(/^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i)}function l(t,e){const r=atob(t.split(",")[1]),i=[];for(let t=0;t<r.length;t++)i.push(r.charCodeAt(t));return new Blob([new Uint8Array(i)],{type:e})}exports.createImage=t=>new Promise(((e,r)=>{const i=new window.Image;i.onload=()=>e(i),i.onerror=t=>r(t),i.src=t}));
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.createImage=void 0,exports.getObjectURL=o,exports.saveFile=function(e,a){return t.__awaiter(this,void 0,void 0,(function*(){if(!r.Capacitor.isNativePlatform())return o(e);yield i.Filesystem.writeFile({path:a,data:e,directory:i.Directory.Data});const{uri:t}=yield i.Filesystem.stat({path:a,directory:i.Directory.Data});return t}))},exports.deleteFile=function(e){return t.__awaiter(this,void 0,void 0,(function*(){r.Capacitor.isNativePlatform()&&(yield i.Filesystem.deleteFile({path:e,directory:i.Directory.Data}))}))},exports.resizeImage=a,exports.cropImage=function(e,r){return t.__awaiter(this,arguments,void 0,(function*(t,e,r=0){const i=yield(0,exports.createImage)(t),o=document.createElement("canvas"),a=o.getContext("2d");if(!a)return"";const s=n(r),{width:c,height:l}=function(t,e,r){const i=n(r),o=Math.abs(Math.cos(i)*t)+Math.abs(Math.sin(i)*e),a=Math.abs(Math.sin(i)*t)+Math.abs(Math.cos(i)*e);return{width:o,height:a}}(i.width,i.height,r);o.width=c,o.height=l,a.translate(c/2,l/2),a.rotate(s),a.translate(-i.width/2,-i.height/2),a.drawImage(i,0,0);const u=document.createElement("canvas"),d=u.getContext("2d");return d?(u.width=e.width,u.height=e.height,d.drawImage(o,e.x,e.y,e.width,e.height,0,0,e.width,e.height),u.toDataURL()):""}))},exports.isDataURL=c,exports.dataURItoBlob=l,exports.getBlobFromURL=function(t,e){if(c(t)){const r=l(t,e);return Promise.resolve(r)}return new Promise((e=>{const r=new XMLHttpRequest;r.open("GET",t,!0),r.responseType="blob",r.onload=()=>{const t=r.response;e(t)},r.send()}))},exports.captureImage=function(){return t.__awaiter(this,arguments,void 0,(function*(r={}){const o=yield function(r){return t.__awaiter(this,void 0,void 0,(function*(){const{camera:i,multiple:o,getPhoto:a}=r,n=t.__rest(r,["camera","multiple","getPhoto"]);if(a){const t=yield a();return t?[t]:[]}if(o)try{const t=Object.assign({quality:40,correctOrientation:!0,limit:30},n);return(yield e.Camera.pickImages(t)).photos}catch(t){const e=t instanceof Error?t.message:String(t);if(e.includes("User cancelled photos app")||e.includes("No images picked"))return[];throw t}try{const t=Object.assign({quality:40,allowEditing:!1,saveToGallery:!0,webUseInput:!0,correctOrientation:!0,resultType:e.CameraResultType.Uri,source:i?e.CameraSource.Camera:e.CameraSource.Photos},n);return[yield e.Camera.getPhoto(t)]}catch(t){const e=t instanceof Error?t.message:String(t);if(e.includes("User cancelled photos app")||e.includes("No image picked"))return[];throw t}}))}(r),a=[];for(const t of o){const{path:e}=t;if(!e){t.webPath&&a.push(t.webPath);continue}const r=yield s(e);if(e.includes("/tmp/")||e.includes("/cache/"))try{yield i.Filesystem.deleteFile({path:e})}catch(t){}a.push(r)}return a}))};const t=require("tslib"),e=require("@capacitor/camera"),r=require("@capacitor/core"),i=require("@capacitor/filesystem");function o(t){const e=t.split(",")[0].split(":")[1].split(";")[0],r=window.atob(t.split(",")[1]),i=[];for(let t=0;t<r.length;t++)i.push(r.charCodeAt(t));const o=new Blob([new Uint8Array(i)],{type:e});return window.URL.createObjectURL(o)}function a({url:t,fileType:e="image/jpeg",MAX_WIDTH:r=2e3,MAX_HEIGHT:i=2e3}){return new Promise((o=>{const a=new window.Image;a.onload=()=>{var t;let{width:n}=a,{height:s}=a;let c=null;c=n>s?n/(r>n?n:r):s/(i>s?s:i),n/=c,s/=c;const l=document.createElement("canvas");l.width=n,l.height=s,null===(t=l.getContext("2d"))||void 0===t||t.drawImage(a,0,0,n,s),o([a,l.toDataURL(e)])},a.src=t}))}function n(t){return t*Math.PI/180}function s(e){return t.__awaiter(this,void 0,void 0,(function*(){const t=`${Date.now()}.jpeg`,[,o]=yield a({url:r.Capacitor.convertFileSrc(e)});yield i.Filesystem.writeFile({path:t,data:o,directory:i.Directory.Data});const{uri:n}=yield i.Filesystem.stat({path:t,directory:i.Directory.Data});return n}))}function c(t){if(!t)return!1;return!!t.toString().match(/^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i)}function l(t,e){const r=atob(t.split(",")[1]),i=[];for(let t=0;t<r.length;t++)i.push(r.charCodeAt(t));return new Blob([new Uint8Array(i)],{type:e})}exports.createImage=t=>new Promise(((e,r)=>{const i=new window.Image;i.onload=()=>e(i),i.onerror=t=>r(t),i.src=t}));
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { default as string } from './string.js';
1
+ export * from './string.js';
2
2
  export { default as device } from './device.js';
3
3
  export * from './cases.js';
4
4
  export * from './deferred.js';
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.device=exports.string=void 0;const e=require("tslib");var r=require("./string.js");Object.defineProperty(exports,"string",{enumerable:!0,get:function(){return e.__importDefault(r).default}});var t=require("./device.js");Object.defineProperty(exports,"device",{enumerable:!0,get:function(){return e.__importDefault(t).default}}),e.__exportStar(require("./cases.js"),exports),e.__exportStar(require("./deferred.js"),exports),e.__exportStar(require("./date.js"),exports),e.__exportStar(require("./image.js"),exports),e.__exportStar(require("./location.js"),exports),e.__exportStar(require("./type.js"),exports),e.__exportStar(require("./sentry.js"),exports),e.__exportStar(require("./errors.js"),exports),e.__exportStar(require("./platform.js"),exports),e.__exportStar(require("./uuid.js"),exports),e.__exportStar(require("./MigrationManager.js"),exports);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.device=void 0;const e=require("tslib");e.__exportStar(require("./string.js"),exports);var r=require("./device.js");Object.defineProperty(exports,"device",{enumerable:!0,get:function(){return e.__importDefault(r).default}}),e.__exportStar(require("./cases.js"),exports),e.__exportStar(require("./deferred.js"),exports),e.__exportStar(require("./date.js"),exports),e.__exportStar(require("./image.js"),exports),e.__exportStar(require("./location.js"),exports),e.__exportStar(require("./type.js"),exports),e.__exportStar(require("./sentry.js"),exports),e.__exportStar(require("./errors.js"),exports),e.__exportStar(require("./platform.js"),exports),e.__exportStar(require("./uuid.js"),exports),e.__exportStar(require("./MigrationManager.js"),exports);
@@ -1,9 +1,16 @@
1
1
  import { Polygon, LineString, MultiPolygon, Point } from 'geojson';
2
+ type GridCoords = {
3
+ x: number;
4
+ y: number;
5
+ country: string;
6
+ to_gridref: (precision: number) => string | null;
7
+ to_latLng: () => LatLng;
8
+ };
2
9
  export type Position = [number, number];
3
10
  export type Location = {
4
11
  latitude: number;
5
12
  longitude: number;
6
- gridref?: string;
13
+ gridref?: string | null;
7
14
  source?: string;
8
15
  accuracy?: number;
9
16
  altitude?: number;
@@ -13,11 +20,20 @@ export type Location = {
13
20
  center: Position;
14
21
  };
15
22
  };
16
- export declare const gridrefAccuracy: any;
23
+ export declare const gridrefAccuracy: {
24
+ readonly tetrad: {
25
+ readonly label: "Tetrad (2km square)";
26
+ readonly length: 5;
27
+ };
28
+ readonly monad: {
29
+ readonly label: "Monad (1km square)";
30
+ readonly length: 6;
31
+ };
32
+ };
17
33
  export declare function prettyPrintGridRef(gridRef: string): string;
18
- export declare function locationToGrid(location: Location): any;
19
- export declare function parseGrid(gridrefString: string): any;
20
- export declare function gridrefStringToLatLng(gridrefString: string): any;
34
+ export declare function locationToGrid(location: Location): string | null;
35
+ export declare function parseGrid(gridrefString: string): GridCoords | undefined;
36
+ export declare function gridrefStringToLatLng(gridrefString: string): LatLng | null;
21
37
  export declare function isValidGridRef(gridrefString: string): boolean;
22
38
  /**
23
39
  *
@@ -25,20 +41,39 @@ export declare function isValidGridRef(gridrefString: string): boolean;
25
41
  * @returns {Boolean}
26
42
  */
27
43
  export declare function isInGB(location: Location): boolean;
28
- export declare function updateModelLocation(model: any, location: Location, skipGridRef?: boolean): Promise<void>;
29
- export declare function prettyPrintLocation(location: any): string;
44
+ export type LocationModelLike = {
45
+ metadata?: {
46
+ deleted?: boolean;
47
+ };
48
+ data: {
49
+ location?: (Partial<Location> & Record<string, unknown>) | null;
50
+ };
51
+ } & ({
52
+ setGPSLocation: (location: Location) => unknown;
53
+ save?: () => unknown;
54
+ } | {
55
+ setGPSLocation?: never;
56
+ save: () => unknown;
57
+ });
58
+ export declare function updateModelLocation(model: LocationModelLike, location: Location, skipGridRef?: boolean): Promise<void>;
59
+ type GridLocation = Pick<Location, 'latitude'> & {
60
+ gridref: string;
61
+ };
62
+ export declare function prettyPrintLocation(location?: Location | GridLocation | null): string;
30
63
  /**
31
64
  * Checks if location gridref size matches the provided one.
32
65
  * @param location
33
66
  * @param gridRefSize
34
67
  * @returns {boolean}
35
68
  */
36
- export declare function checkGridType(location: any, gridRefSize: any): boolean;
69
+ export declare function checkGridType(location: Pick<Location, 'gridref'>, gridRefSize?: keyof typeof gridrefAccuracy | null): boolean;
37
70
  /**
38
71
  * Checks if the location fits in the calculated grid reference square.
39
72
  * @private
40
73
  */
41
- export declare function doesExceedGridRef(gridCoords: any, location: any, normAcc: any): boolean;
74
+ export declare function doesExceedGridRef(gridCoords: Pick<GridCoords, 'x' | 'y'>, location: {
75
+ accuracy: number;
76
+ }, normAcc: number): boolean;
42
77
  /**
43
78
  * Returns a normalized grid square that takes into account the accuracy
44
79
  * of the location.
@@ -59,8 +94,10 @@ export declare function doesExceedGridRef(gridCoords: any, location: any, normAc
59
94
  * @param normAcc
60
95
  * @returns {*}
61
96
  */
62
- export declare function normalizeGridRefAcc(gridCoords: any, location: any, normAcc: any): any;
63
- export declare function getGridSquareCenter(gridref: string): any;
97
+ export declare function normalizeGridRefAcc(gridCoords: Pick<GridCoords, 'x' | 'y' | 'to_gridref'>, location: {
98
+ accuracy: number;
99
+ }, normAcc: number): string | null;
100
+ export declare function getGridSquareCenter(gridref: string): LatLng | null;
64
101
  type LatLng = {
65
102
  lat: number;
66
103
  lng: number;
package/dist/location.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isValidLocation=exports.normalizeCoords=exports.gridrefAccuracy=void 0,exports.prettyPrintGridRef=n,exports.locationToGrid=i,exports.parseGrid=function(t){let e;const o=r.default.GridRefParser.factory(t);o&&(o.osRef.x+=o.length/2,o.osRef.y+=o.length/2,e=o.osRef);return e},exports.gridrefStringToLatLng=function(t){try{const e=r.default.GridRefParser.factory(t);return e?e.osRef.to_latLng():null}catch(t){console.error(t.message)}return null},exports.isValidGridRef=function(t){try{const e=r.default.GridRefParser.factory(t);return!(!e||!r.default.MappingUtils.is_gb_hectad(e.hectad))}catch(t){console.error(t.message)}return!1},exports.isInGB=function(t){if(t.latitude){const e=r.default.latlng_to_grid_coords(t.latitude,t.longitude);return!!e&&"GB"===e.country}return!1},exports.updateModelLocation=function(e,r){return t.__awaiter(this,arguments,void 0,(function*(t,e,r=!1){var o;if(null===(o=t.metadata)||void 0===o?void 0:o.deleted)return void console.warn("LocationUtils: skipping deleted model location set");const n=Object.assign({},e);n.latitude=parseFloat(parseFloat(`${n.latitude}`).toFixed(5)),n.longitude=parseFloat(parseFloat(`${n.longitude}`).toFixed(5)),(n.accuracy||Number.isFinite(n.accuracy))&&(n.accuracy=parseFloat(parseFloat(`${n.accuracy}`).toFixed(2))),(n.altitude||Number.isFinite(n.altitude))&&(n.altitude=parseFloat(parseFloat(`${n.altitude}`).toFixed(2))),(n.altitudeAccuracy||Number.isFinite(n.altitudeAccuracy))&&(n.altitudeAccuracy=parseFloat(parseFloat(`${n.altitudeAccuracy}`).toFixed(2))),n.source="gps",r||(n.gridref=i(n));const a=t.data.location,s=Object.assign(Object.assign({},a),n);t.setGPSLocation?yield t.setGPSLocation(s):(t.data.location=s,yield t.save())}))},exports.prettyPrintLocation=function(t){if(!t||!t.latitude)return"";if(t.gridref)return n(t.gridref);const e=i(t);if(e)return n(e);return`${parseFloat(t.latitude).toFixed(4)}, ${parseFloat(t.longitude).toFixed(4)}`},exports.checkGridType=function(t,e){if(!e)return!1;const r=t.gridref||"";let{length:o}=exports.gridrefAccuracy[e];/^.\d/.test(r)&&(o-=1);return r.length===o},exports.doesExceedGridRef=a,exports.normalizeGridRefAcc=function t(e,r,o){if(o>=1e4)return null;if(a(e,r,o))return t(e,r,10*o);return e.to_gridref(o)},exports.getGridSquareCenter=function(t){const e=r.default.GridRefParser.factory(t);if(!e)return null;const o=e.osRef;return new e.NationalRef(o.x+e.length/2,o.y+e.length/2).to_latLng()},exports.coordsToMeters=s,exports.metersToCoords=c,exports.getGeomMetersToLatLon=function(t){if("Point"===t.type)return Object.assign(Object.assign({},t),{coordinates:c(t.coordinates)});if("LineString"===t.type)return Object.assign(Object.assign({},t),{coordinates:t.coordinates.map((t=>c(t)))});if("Polygon"===t.type)return Object.assign(Object.assign({},t),{coordinates:t.coordinates.map((t=>t.map((t=>c(t)))))});return Object.assign(Object.assign({},t),{coordinates:t.coordinates.map((t=>t.map((t=>t.map((t=>c(t)))))))})},exports.getGeomWKT=function(t){const r=JSON.parse(JSON.stringify(t));"Polygon"===r.type?r.coordinates[0]=r.coordinates[0].map(s):r.coordinates=r.coordinates.map(s);return e.default.stringify(r)},exports.getGeomCenter=function(t){const e=JSON.parse(JSON.stringify(t));if("Polygon"===e.type)return[e.coordinates[0][0][0],e.coordinates[0][0][1]];return[e.coordinates[0][0],e.coordinates[0][1]]},exports.calculateLineLength=function(t){function e(t,e,r,o){const n=(r-t)*Math.PI/180;e=e*Math.PI/180,o=o*Math.PI/180;const i=n*Math.cos((e+o)/2),a=o-e;return 6371e3*Math.sqrt(i*i+a*a)}if(t.length<2)return 0;let r=0;for(let o=1;o<t.length;o++)r+=e(t[o-1][0],t[o-1][1],t[o][0],t[o][1]);return r};const t=require("tslib"),e=t.__importDefault(require("wellknown")),r=t.__importDefault(require("@flumens/bigu")),o=require("@mapbox/sphericalmercator");function n(t){const[,e]=t.match(/^([A-Z]*)\d/i),r=t.replace(e,""),o=r.length;if(o%2)return`${e} ${r}`;return`${e} ${r.slice(0,o/2)} ${r.slice(o/2)}`}function i(t){const e=r.default.latlng_to_grid_coords(t.latitude,t.longitude);if(!e||!Number.isFinite(t.accuracy))return null;const o=r.default.GridRefParser.get_normalized_precision(2*t.accuracy);return e.to_gridref(o)}function a(t,e,r){const{accuracy:o}=e,{x:n}=t,{y:i}=t;return n%r-o<0||(n%r+o>r||(i%r-o<0||i%r+o>r))}exports.gridrefAccuracy={tetrad:{label:"Tetrad (2km square)",length:5},monad:{label:"Monad (1km square)",length:6}};exports.normalizeCoords=({lat:t,lng:e})=>e>180?{lat:t,lng:e-180-180}:e<-180?{lat:t,lng:180+(e+180)}:{lat:t,lng:e};function s(t){const e=new o.SphericalMercator;return(([t,r])=>e.forward([t,r]))(t)}function c(t){const e=new o.SphericalMercator;return(([t,r])=>e.inverse([t,r]))(t)}exports.isValidLocation=t=>Number.isFinite(null==t?void 0:t.latitude)&&Number.isFinite(null==t?void 0:t.longitude);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isValidLocation=exports.normalizeCoords=exports.gridrefAccuracy=void 0,exports.prettyPrintGridRef=i,exports.locationToGrid=a,exports.parseGrid=function(t){let e;const r=n.GridRefParser.factory(t);r&&(r.osRef.x+=r.length/2,r.osRef.y+=r.length/2,e=r.osRef);return e},exports.gridrefStringToLatLng=function(t){try{const e=n.GridRefParser.factory(t);return e?e.osRef.to_latLng():null}catch(t){console.error(t)}return null},exports.isValidGridRef=function(t){try{const e=n.GridRefParser.factory(t);return!(!e||!n.MappingUtils.is_gb_hectad(e.hectad))}catch(t){console.error(t)}return!1},exports.isInGB=function(t){if(t.latitude){const e=n.latlng_to_grid_coords(t.latitude,t.longitude);return!!e&&"GB"===e.country}return!1},exports.updateModelLocation=function(e,r){return t.__awaiter(this,arguments,void 0,(function*(t,e,r=!1){var o;if(null===(o=t.metadata)||void 0===o?void 0:o.deleted)return void console.warn("LocationUtils: skipping deleted model location set");const n=Object.assign({},e);n.latitude=parseFloat(parseFloat(`${n.latitude}`).toFixed(5)),n.longitude=parseFloat(parseFloat(`${n.longitude}`).toFixed(5)),(n.accuracy||Number.isFinite(n.accuracy))&&(n.accuracy=parseFloat(parseFloat(`${n.accuracy}`).toFixed(2))),(n.altitude||Number.isFinite(n.altitude))&&(n.altitude=parseFloat(parseFloat(`${n.altitude}`).toFixed(2))),(n.altitudeAccuracy||Number.isFinite(n.altitudeAccuracy))&&(n.altitudeAccuracy=parseFloat(parseFloat(`${n.altitudeAccuracy}`).toFixed(2))),n.source="gps",r||(n.gridref=a(n));const i=t.data.location,c=Object.assign(Object.assign({},i),n);t.setGPSLocation?yield t.setGPSLocation(c):(t.data.location=c,yield t.save())}))},exports.prettyPrintLocation=function(t){if(!(null==t?void 0:t.latitude))return"";if(t.gridref)return i(t.gridref);const e=t,r=a(e);if(r)return i(r);return`${t.latitude.toFixed(4)}, ${e.longitude.toFixed(4)}`},exports.checkGridType=function(t,e){if(!e)return!1;const r=t.gridref||"";let{length:o}=exports.gridrefAccuracy[e];/^.\d/.test(r)&&(o-=1);return r.length===o},exports.doesExceedGridRef=c,exports.normalizeGridRefAcc=function t(e,r,o){if(o>=1e4)return null;if(c(e,r,o))return t(e,r,10*o);return e.to_gridref(o)},exports.getGridSquareCenter=function(t){const e=n.GridRefParser.factory(t);if(!e)return null;const r=e.osRef;return new e.NationalRef(r.x+e.length/2,r.y+e.length/2).to_latLng()},exports.coordsToMeters=s,exports.metersToCoords=u,exports.getGeomMetersToLatLon=function(t){if("Point"===t.type)return Object.assign(Object.assign({},t),{coordinates:u(t.coordinates)});if("LineString"===t.type)return Object.assign(Object.assign({},t),{coordinates:t.coordinates.map((t=>u(t)))});if("Polygon"===t.type)return Object.assign(Object.assign({},t),{coordinates:t.coordinates.map((t=>t.map((t=>u(t)))))});return Object.assign(Object.assign({},t),{coordinates:t.coordinates.map((t=>t.map((t=>t.map((t=>u(t)))))))})},exports.getGeomWKT=function(t){if("Polygon"===t.type)return e.default.stringify({type:t.type,coordinates:t.coordinates.map(((t,e)=>t.map((t=>e?t:s(t)))))});return e.default.stringify({type:t.type,coordinates:t.coordinates.map((t=>s(t)))})},exports.getGeomCenter=function(t){const e=JSON.parse(JSON.stringify(t));if("Polygon"===e.type)return[e.coordinates[0][0][0],e.coordinates[0][0][1]];return[e.coordinates[0][0],e.coordinates[0][1]]},exports.calculateLineLength=function(t){function e(t,e,r,o){const n=(r-t)*Math.PI/180;e=e*Math.PI/180,o=o*Math.PI/180;const i=n*Math.cos((e+o)/2),a=o-e;return 6371e3*Math.sqrt(i*i+a*a)}if(t.length<2)return 0;let r=0;for(let o=1;o<t.length;o++)r+=e(t[o-1][0],t[o-1][1],t[o][0],t[o][1]);return r};const t=require("tslib"),e=t.__importDefault(require("wellknown")),r=t.__importDefault(require("@flumens/bigu")),o=require("@mapbox/sphericalmercator"),n=r.default;function i(t){var e;const r=(null===(e=t.match(/^([A-Z]*)\d/i))||void 0===e?void 0:e[1])||"",o=t.replace(r,""),n=o.length;if(n%2)return`${r} ${o}`;return`${r} ${o.slice(0,n/2)} ${o.slice(n/2)}`}function a(t){const e=n.latlng_to_grid_coords(t.latitude,t.longitude);if(!e||!Number.isFinite(t.accuracy))return null;const r=n.GridRefParser.get_normalized_precision(2*t.accuracy);return e.to_gridref(r)}function c(t,e,r){const{accuracy:o}=e,{x:n}=t,{y:i}=t;return n%r-o<0||(n%r+o>r||(i%r-o<0||i%r+o>r))}exports.gridrefAccuracy={tetrad:{label:"Tetrad (2km square)",length:5},monad:{label:"Monad (1km square)",length:6}};exports.normalizeCoords=({lat:t,lng:e})=>e>180?{lat:t,lng:e-180-180}:e<-180?{lat:t,lng:180+(e+180)}:{lat:t,lng:e};function s(t){const e=new o.SphericalMercator;return(([t,r])=>e.forward([t,r]))(t)}function u(t){const e=new o.SphericalMercator;return(([t,r])=>e.inverse([t,r]))(t)}exports.isValidLocation=t=>Number.isFinite(null==t?void 0:t.latitude)&&Number.isFinite(null==t?void 0:t.longitude);
package/dist/platform.js CHANGED
@@ -1 +1 @@
1
- "use strict";var i;Object.defineProperty(exports,"__esModule",{value:!0}),exports.isPlatform=void 0;const o=!!(window||{}).cordova||!!(null===(i=(window||{}).Capacitor)||void 0===i?void 0:i.isNative);exports.isPlatform=i=>{if("undefined"==typeof window)return!1;const e=(i,o)=>o.test(i.navigator.userAgent);return"android"===i?(r=window,e(r,/android|sink/i)):"ios"===i?(i=>e(i,/iPhone|iPod/i)||(i=>!!e(i,/iPad/i)||!(!e(i,/Macintosh/i)||!(i=>((i,o)=>{var e;return null===(e=i.matchMedia)||void 0===e?void 0:e.call(i,o).matches})(i,"(any-pointer:coarse)"))(i)))(i))(window):"hybrid"===i&&o;var r};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isPlatform=void 0;exports.isPlatform=i=>{if("undefined"==typeof window)return!1;const o=(i,o)=>o.test(i.navigator.userAgent);return"android"===i?(e=window,o(e,/android|sink/i)):"ios"===i?(i=>o(i,/iPhone|iPod/i)||(i=>!!o(i,/iPad/i)||!(!o(i,/Macintosh/i)||!(i=>((i,o)=>{var e;return null===(e=i.matchMedia)||void 0===e?void 0:e.call(i,o).matches})(i,"(any-pointer:coarse)"))(i)))(i))(window):"hybrid"===i&&(i=>{const{cordova:o,Capacitor:e}=i;return Boolean(o||(null==e?void 0:e.isNative))})(window);var e};
package/dist/sentry.d.ts CHANGED
@@ -1 +1,2 @@
1
- export declare const options: any;
1
+ import * as Sentry from '@sentry/browser';
2
+ export declare const options: Sentry.BrowserOptions;
package/dist/sentry.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.options=void 0;const e=require("tslib").__importStar(require("@sentry/browser"));function t(e){return e.replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,"UUID")}const a=["timeout","network error","load failed","request aborted","request failed"],r=["re-login is required","incorrect password","refresh token is invalid"],o=["Unable to preventDefault inside passive event listener invocation.","AbortError: Fetch is aborted","Attempted to load an infinite number of tiles","No images picked","User cancelled photos app","No image picked","User denied access to camera","User denied access to photos","Failed to fetch"];exports.options={maxBreadcrumbs:400,ignoreErrors:o,beforeSend:(e,t)=>{var i,s,n,d;const l=(null===(s=null===(i=null==t?void 0:t.originalException)||void 0===i?void 0:i.message)||void 0===s?void 0:s.toLowerCase())||"";if("[object Object]"===e.message){const{message:t}=(null===(d=null===(n=e.extra)||void 0===n?void 0:n.arguments)||void 0===d?void 0:d[0])||{};if(!t||o.includes(t))return null;e.message=t}return a.find((e=>l.includes(e)))&&(e.tags||(e.tags={}),e.tags.type="network"),r.find((e=>l.includes(e)))&&(e.tags||(e.tags={}),e.tags.type="authentication"),e},beforeBreadcrumb:function(e,a){if("navigation"===e.category)return e.data={to:t(e.data.to),from:t(e.data.from)},e;if(e.category.startsWith("ui")){const{innerText:t,dataset:r}=a.event.target;t&&t.length<15&&(e.message=`[${t}] ${e.message}`),r.label&&(e.message=`[${r.label}] ${e.message}`)}if(["xhr","fetch"].includes(e.category)){if(e.data.url.startsWith("data:"))return null;if("GET"===e.data.method&&e.data.url.match(/api.mapbox.com/))return null;"GET"===e.data.method&&e.data.url.match(/jpeg$/i)&&(e.data.url=e.data.url.replace(/files\/\d+\.jpeg/i,"files/FILENAME.jpeg"))}return e},integrations:[e.captureConsoleIntegration({levels:["error"]}),e.dedupeIntegration()]};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.options=void 0;const e=require("tslib").__importStar(require("@sentry/browser"));function t(e){return e.replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,"UUID")}function r(e){return e instanceof Error||e&&"object"==typeof e&&"message"in e&&"string"==typeof e.message?e.message:""}const a=["timeout","network error","load failed","request aborted","request failed"],o=["re-login is required","incorrect password","refresh token is invalid"],n=["Unable to preventDefault inside passive event listener invocation.","AbortError: Fetch is aborted","Attempted to load an infinite number of tiles","No images picked","User cancelled photos app","No image picked","User denied access to camera","User denied access to photos","Failed to fetch"];exports.options={maxBreadcrumbs:400,ignoreErrors:n,beforeSend:(e,t)=>{var s;const i=r(t.originalException).toLowerCase();if("[object Object]"===e.message){const t=null===(s=e.extra)||void 0===s?void 0:s.arguments,a=Array.isArray(t)?r(t[0]):"";if(!a||n.includes(a))return null;e.message=a}return a.find((e=>i.includes(e)))&&(e.tags||(e.tags={}),e.tags.type="network"),o.find((e=>i.includes(e)))&&(e.tags||(e.tags={}),e.tags.type="authentication"),e},beforeBreadcrumb:function(e,r){var a;if("navigation"===e.category){const{to:r,from:a}=e.data||{};return e.data={to:"string"==typeof r?t(r):r,from:"string"==typeof a?t(a):a},e}if(null===(a=e.category)||void 0===a?void 0:a.startsWith("ui")){const t=null==r?void 0:r.event,a=t instanceof Event?t.target:null;if(a instanceof HTMLElement){const{innerText:t,dataset:r}=a;t&&t.length<15&&(e.message=`[${t}] ${e.message}`),r.label&&(e.message=`[${r.label}] ${e.message}`)}}if(e.category&&["xhr","fetch"].includes(e.category)){const{method:t,url:r}=e.data||{};if("string"!=typeof r)return e;if(r.startsWith("data:"))return null;if("GET"===t&&r.match(/api.mapbox.com/))return null;"GET"===t&&r.match(/jpeg$/i)&&e.data&&(e.data.url=r.replace(/files\/\d+\.jpeg/i,"files/FILENAME.jpeg"))}return e},integrations:[e.captureConsoleIntegration({levels:["error"]}),e.dedupeIntegration()]};
package/dist/string.d.ts CHANGED
@@ -1,5 +1,3 @@
1
- declare const _default: {
2
- limit(string: string, charNum?: number): string;
3
- escape(string: string): string;
4
- };
5
- export default _default;
1
+ export declare const limit: (string: string, charNum?: number) => string;
2
+ export declare const escape: (string: string) => string;
3
+ export declare const capitalize: (s?: string) => string;
package/dist/string.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default={limit(e,t=20){if(!e)return"";const r=e.toString(),n=r&&r.length>t?"...":"";return r?r.substring(0,t)+n:""},escape(e){const t=document.createElement("div");t.appendChild(document.createTextNode(e.toString()));return t.innerHTML.trim()}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.capitalize=exports.escape=exports.limit=void 0;exports.limit=(e,t=20)=>{if(!e)return"";const r=e.toString(),i=r&&r.length>t?"...":"";return r?r.substring(0,t)+i:""};exports.escape=e=>{const t=document.createElement("div");t.appendChild(document.createTextNode(e.toString()));return t.innerHTML.trim()};exports.capitalize=e=>"string"!=typeof e?"":e.charAt(0).toUpperCase()+e.slice(1);
package/dist/type.d.ts CHANGED
@@ -40,7 +40,7 @@ export type Optional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
40
40
  * {a; b?; c}
41
41
  */
42
42
  export type OptionalExcept<T, K extends keyof T> = Pick<T, K> & Partial<T>;
43
- type CamelCase<S extends string> = S extends `${infer P1}_${infer P2}${infer P3}` ? `${Lowercase<P1>}${Uppercase<P2>}${CamelCase<P3>}` : Lowercase<S>;
43
+ type CamelCase<S extends string> = S extends `${infer P1}_${infer P2}${infer P3}` ? `${Lowercase<P1>}${Uppercase<P2>}${CamelCase<P3>}` : S extends Uncapitalize<S> ? S : Lowercase<S>;
44
44
  /**
45
45
  * Transforms snake-case keys to camel-case.
46
46
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flumens/utils",
3
- "version": "0.12.0",
3
+ "version": "0.14.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {
@@ -38,7 +38,7 @@
38
38
  "@sentry/browser": "^7 || ^8 || ^9 || ^10",
39
39
  "axios": "^1",
40
40
  "geojson": "^0.5.0",
41
- "mobx": "^6",
41
+ "mobx": "^6 || ^7",
42
42
  "wellknown": "0.5.0"
43
43
  },
44
44
  "jest": {