@fscharter/flowmap-data 8.0.2-fsc.1

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.
Files changed (59) hide show
  1. package/dist/FlowmapAggregateAccessors.d.ts +16 -0
  2. package/dist/FlowmapAggregateAccessors.d.ts.map +1 -0
  3. package/dist/FlowmapAggregateAccessors.js +53 -0
  4. package/dist/FlowmapSelectors.d.ts +143 -0
  5. package/dist/FlowmapSelectors.d.ts.map +1 -0
  6. package/dist/FlowmapSelectors.js +881 -0
  7. package/dist/FlowmapState.d.ts +31 -0
  8. package/dist/FlowmapState.d.ts.map +1 -0
  9. package/dist/FlowmapState.js +7 -0
  10. package/dist/cluster/ClusterIndex.d.ts +42 -0
  11. package/dist/cluster/ClusterIndex.d.ts.map +1 -0
  12. package/dist/cluster/ClusterIndex.js +166 -0
  13. package/dist/cluster/cluster.d.ts +51 -0
  14. package/dist/cluster/cluster.d.ts.map +1 -0
  15. package/dist/cluster/cluster.js +267 -0
  16. package/dist/colors.d.ts +103 -0
  17. package/dist/colors.d.ts.map +1 -0
  18. package/dist/colors.js +487 -0
  19. package/dist/getViewStateForLocations.d.ts +23 -0
  20. package/dist/getViewStateForLocations.d.ts.map +1 -0
  21. package/dist/getViewStateForLocations.js +54 -0
  22. package/dist/index.d.ts +14 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +18 -0
  25. package/dist/provider/FlowmapDataProvider.d.ts +21 -0
  26. package/dist/provider/FlowmapDataProvider.d.ts.map +1 -0
  27. package/dist/provider/FlowmapDataProvider.js +22 -0
  28. package/dist/provider/LocalFlowmapDataProvider.d.ts +31 -0
  29. package/dist/provider/LocalFlowmapDataProvider.d.ts.map +1 -0
  30. package/dist/provider/LocalFlowmapDataProvider.js +115 -0
  31. package/dist/selector-functions.d.ts +10 -0
  32. package/dist/selector-functions.d.ts.map +1 -0
  33. package/dist/selector-functions.js +65 -0
  34. package/dist/time.d.ts +24 -0
  35. package/dist/time.d.ts.map +1 -0
  36. package/dist/time.js +131 -0
  37. package/dist/types.d.ts +120 -0
  38. package/dist/types.d.ts.map +1 -0
  39. package/dist/types.js +28 -0
  40. package/dist/util.d.ts +5 -0
  41. package/dist/util.d.ts.map +1 -0
  42. package/dist/util.js +16 -0
  43. package/package.json +48 -0
  44. package/src/FlowmapAggregateAccessors.ts +76 -0
  45. package/src/FlowmapSelectors.ts +1539 -0
  46. package/src/FlowmapState.ts +40 -0
  47. package/src/cluster/ClusterIndex.ts +261 -0
  48. package/src/cluster/cluster.ts +394 -0
  49. package/src/colors.ts +771 -0
  50. package/src/getViewStateForLocations.ts +86 -0
  51. package/src/index.ts +19 -0
  52. package/src/provider/FlowmapDataProvider.ts +81 -0
  53. package/src/provider/LocalFlowmapDataProvider.ts +185 -0
  54. package/src/selector-functions.ts +93 -0
  55. package/src/time.ts +166 -0
  56. package/src/types.ts +172 -0
  57. package/src/util.ts +17 -0
  58. package/tsconfig.json +11 -0
  59. package/typings.d.ts +1 -0
@@ -0,0 +1,14 @@
1
+ export * from './types';
2
+ export * from './colors';
3
+ export * from './FlowmapState';
4
+ export * from './FlowmapSelectors';
5
+ export * from './selector-functions';
6
+ export * from './time';
7
+ export * from './getViewStateForLocations';
8
+ export * from './provider/FlowmapDataProvider';
9
+ export * from './cluster/cluster';
10
+ export * from './cluster/ClusterIndex';
11
+ export { default as FlowmapAggregateAccessors } from './FlowmapAggregateAccessors';
12
+ export type { default as FlowmapDataProvider } from './provider/FlowmapDataProvider';
13
+ export { default as LocalFlowmapDataProvider } from './provider/LocalFlowmapDataProvider';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,QAAQ,CAAC;AACvB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAC,OAAO,IAAI,yBAAyB,EAAC,MAAM,6BAA6B,CAAC;AACjF,YAAY,EAAC,OAAO,IAAI,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAC,OAAO,IAAI,wBAAwB,EAAC,MAAM,qCAAqC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ /*
2
+ * Copyright (c) Flowmap.gl contributors
3
+ * Copyright (c) 2018-2020 Teralytics
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export * from './types';
7
+ export * from './colors';
8
+ export * from './FlowmapState';
9
+ export * from './FlowmapSelectors';
10
+ export * from './selector-functions';
11
+ export * from './time';
12
+ export * from './getViewStateForLocations';
13
+ export * from './provider/FlowmapDataProvider';
14
+ export * from './cluster/cluster';
15
+ export * from './cluster/ClusterIndex';
16
+ export { default as FlowmapAggregateAccessors } from './FlowmapAggregateAccessors';
17
+ export { default as LocalFlowmapDataProvider } from './provider/LocalFlowmapDataProvider';
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsUUFBUSxDQUFDO0FBQ3ZCLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsT0FBTyxFQUFDLE9BQU8sSUFBSSx5QkFBeUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRWpGLE9BQU8sRUFBQyxPQUFPLElBQUksd0JBQXdCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIEZsb3dtYXAuZ2wgY29udHJpYnV0b3JzXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMCBUZXJhbHl0aWNzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb2xvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9GbG93bWFwU3RhdGUnO1xuZXhwb3J0ICogZnJvbSAnLi9GbG93bWFwU2VsZWN0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vc2VsZWN0b3ItZnVuY3Rpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vdGltZSc7XG5leHBvcnQgKiBmcm9tICcuL2dldFZpZXdTdGF0ZUZvckxvY2F0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL3Byb3ZpZGVyL0Zsb3dtYXBEYXRhUHJvdmlkZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jbHVzdGVyL2NsdXN0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jbHVzdGVyL0NsdXN0ZXJJbmRleCc7XG5leHBvcnQge2RlZmF1bHQgYXMgRmxvd21hcEFnZ3JlZ2F0ZUFjY2Vzc29yc30gZnJvbSAnLi9GbG93bWFwQWdncmVnYXRlQWNjZXNzb3JzJztcbmV4cG9ydCB0eXBlIHtkZWZhdWx0IGFzIEZsb3dtYXBEYXRhUHJvdmlkZXJ9IGZyb20gJy4vcHJvdmlkZXIvRmxvd21hcERhdGFQcm92aWRlcic7XG5leHBvcnQge2RlZmF1bHQgYXMgTG9jYWxGbG93bWFwRGF0YVByb3ZpZGVyfSBmcm9tICcuL3Byb3ZpZGVyL0xvY2FsRmxvd21hcERhdGFQcm92aWRlcic7XG4iXX0=
@@ -0,0 +1,21 @@
1
+ import { AggregateFlow, Cluster, LocationTotals } from '..';
2
+ import { FlowmapState } from '../FlowmapState';
3
+ import { ClusterNode, FlowmapData, FlowmapDataAccessors, LayersData, ViewportProps } from '../types';
4
+ export default interface FlowmapDataProvider<L, F> {
5
+ setAccessors(accessors: FlowmapDataAccessors<L, F>): void;
6
+ setFlowmapState(flowmapState: FlowmapState): Promise<void>;
7
+ getViewportForLocations(dims: [number, number]): Promise<ViewportProps | undefined>;
8
+ getFlowByIndex(index: number): Promise<F | AggregateFlow | undefined>;
9
+ getLocationById(id: string | number): Promise<L | Cluster | undefined>;
10
+ getLocationByIndex(idx: number): Promise<L | ClusterNode | undefined>;
11
+ getTotalsForLocation(id: string | number): Promise<LocationTotals | undefined>;
12
+ getLayersData(): Promise<LayersData | undefined>;
13
+ /**
14
+ * This is to give the data provider control over when/how often layersData
15
+ * is updated which leads to the flowmap being redrawn.
16
+ */
17
+ updateLayersData(setLayersData: (layersData: LayersData | undefined) => void, changeFlags: Record<string, boolean>): Promise<void>;
18
+ }
19
+ export declare function isFlowmapData<L, F>(data: Record<string, any>): data is FlowmapData<L, F>;
20
+ export declare function isFlowmapDataProvider<L, F>(dataProvider: Record<string, any>): dataProvider is FlowmapDataProvider<L, F>;
21
+ //# sourceMappingURL=FlowmapDataProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlowmapDataProvider.d.ts","sourceRoot":"","sources":["../../src/provider/FlowmapDataProvider.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,aAAa,EAAE,OAAO,EAAqB,cAAc,EAAC,MAAM,IAAI,CAAC;AAC7E,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,UAAU,EACV,aAAa,EACd,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,OAAO,WAAW,mBAAmB,CAAC,CAAC,EAAE,CAAC;IAC/C,YAAY,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAE1D,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAI3D,uBAAuB,CACrB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GACrB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IAItC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,aAAa,GAAG,SAAS,CAAC,CAAC;IAEtE,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IAEvE,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,WAAW,GAAG,SAAS,CAAC,CAAC;IAEtE,oBAAoB,CAClB,EAAE,EAAE,MAAM,GAAG,MAAM,GAClB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAQvC,aAAa,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAEjD;;;OAGG;IACH,gBAAgB,CACd,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,KAAK,IAAI,EAC3D,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,IAAI,IAAI,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAO3B;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EACxC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAChC,YAAY,IAAI,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAU3C"}
@@ -0,0 +1,22 @@
1
+ /*
2
+ * Copyright (c) Flowmap.gl contributors
3
+ * Copyright (c) 2018-2020 Teralytics
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export function isFlowmapData(data) {
7
+ return (data && data.locations && data.flows
8
+ // TODO: test that they are iterable
9
+ // Array.isArray(data.locations) &&
10
+ // Array.isArray(data.flows)
11
+ );
12
+ }
13
+ export function isFlowmapDataProvider(dataProvider) {
14
+ return (dataProvider &&
15
+ typeof dataProvider.setFlowmapState === 'function' &&
16
+ typeof dataProvider.getViewportForLocations === 'function' &&
17
+ typeof dataProvider.getFlowByIndex === 'function' &&
18
+ typeof dataProvider.getLocationById === 'function' &&
19
+ typeof dataProvider.getLocationByIndex === 'function' &&
20
+ typeof dataProvider.getLayersData === 'function');
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd21hcERhdGFQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm92aWRlci9GbG93bWFwRGF0YVByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFxREgsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsSUFBeUI7SUFFekIsT0FBTyxDQUNMLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLO0lBQ3BDLG9DQUFvQztJQUNwQyxtQ0FBbUM7SUFDbkMsNEJBQTRCO0tBQzdCLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxZQUFpQztJQUVqQyxPQUFPLENBQ0wsWUFBWTtRQUNaLE9BQU8sWUFBWSxDQUFDLGVBQWUsS0FBSyxVQUFVO1FBQ2xELE9BQU8sWUFBWSxDQUFDLHVCQUF1QixLQUFLLFVBQVU7UUFDMUQsT0FBTyxZQUFZLENBQUMsY0FBYyxLQUFLLFVBQVU7UUFDakQsT0FBTyxZQUFZLENBQUMsZUFBZSxLQUFLLFVBQVU7UUFDbEQsT0FBTyxZQUFZLENBQUMsa0JBQWtCLEtBQUssVUFBVTtRQUNyRCxPQUFPLFlBQVksQ0FBQyxhQUFhLEtBQUssVUFBVSxDQUNqRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIEZsb3dtYXAuZ2wgY29udHJpYnV0b3JzXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMCBUZXJhbHl0aWNzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7QWdncmVnYXRlRmxvdywgQ2x1c3RlciwgTG9jYXRpb25BY2Nlc3NvcnMsIExvY2F0aW9uVG90YWxzfSBmcm9tICcuLic7XG5pbXBvcnQge0Zsb3dtYXBTdGF0ZX0gZnJvbSAnLi4vRmxvd21hcFN0YXRlJztcbmltcG9ydCB7XG4gIENsdXN0ZXJOb2RlLFxuICBGbG93bWFwRGF0YSxcbiAgRmxvd21hcERhdGFBY2Nlc3NvcnMsXG4gIExheWVyc0RhdGEsXG4gIFZpZXdwb3J0UHJvcHMsXG59IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIEZsb3dtYXBEYXRhUHJvdmlkZXI8TCwgRj4ge1xuICBzZXRBY2Nlc3NvcnMoYWNjZXNzb3JzOiBGbG93bWFwRGF0YUFjY2Vzc29yczxMLCBGPik6IHZvaWQ7XG5cbiAgc2V0Rmxvd21hcFN0YXRlKGZsb3dtYXBTdGF0ZTogRmxvd21hcFN0YXRlKTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyBjbGVhckRhdGEoKTogdm9pZDtcblxuICBnZXRWaWV3cG9ydEZvckxvY2F0aW9ucyhcbiAgICBkaW1zOiBbbnVtYmVyLCBudW1iZXJdLFxuICApOiBQcm9taXNlPFZpZXdwb3J0UHJvcHMgfCB1bmRlZmluZWQ+O1xuXG4gIC8vIGdldEZsb3dUb3RhbHMoKTogUHJvbWlzZTxGbG93VG90YWxzPjtcblxuICBnZXRGbG93QnlJbmRleChpbmRleDogbnVtYmVyKTogUHJvbWlzZTxGIHwgQWdncmVnYXRlRmxvdyB8IHVuZGVmaW5lZD47XG5cbiAgZ2V0TG9jYXRpb25CeUlkKGlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPEwgfCBDbHVzdGVyIHwgdW5kZWZpbmVkPjtcblxuICBnZXRMb2NhdGlvbkJ5SW5kZXgoaWR4OiBudW1iZXIpOiBQcm9taXNlPEwgfCBDbHVzdGVyTm9kZSB8IHVuZGVmaW5lZD47XG5cbiAgZ2V0VG90YWxzRm9yTG9jYXRpb24oXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgKTogUHJvbWlzZTxMb2NhdGlvblRvdGFscyB8IHVuZGVmaW5lZD47XG5cbiAgLy8gZ2V0TG9jYXRpb25zSW5CYm94KFxuICAvLyAgIGJib3g6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAvLyApOiBQcm9taXNlPEFycmF5PEZsb3dMb2NhdGlvbiB8IENsdXN0ZXJOb2RlPiB8IHVuZGVmaW5lZD47XG5cbiAgLy8gZ2V0TG9jYXRpb25zRm9yU2VhcmNoQm94KCk6IFByb21pc2U8KEZsb3dMb2NhdGlvbiB8IENsdXN0ZXJOb2RlKVtdIHwgdW5kZWZpbmVkPjtcblxuICBnZXRMYXllcnNEYXRhKCk6IFByb21pc2U8TGF5ZXJzRGF0YSB8IHVuZGVmaW5lZD47XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgdG8gZ2l2ZSB0aGUgZGF0YSBwcm92aWRlciBjb250cm9sIG92ZXIgd2hlbi9ob3cgb2Z0ZW4gbGF5ZXJzRGF0YVxuICAgKiBpcyB1cGRhdGVkIHdoaWNoIGxlYWRzIHRvIHRoZSBmbG93bWFwIGJlaW5nIHJlZHJhd24uXG4gICAqL1xuICB1cGRhdGVMYXllcnNEYXRhKFxuICAgIHNldExheWVyc0RhdGE6IChsYXllcnNEYXRhOiBMYXllcnNEYXRhIHwgdW5kZWZpbmVkKSA9PiB2b2lkLFxuICAgIGNoYW5nZUZsYWdzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPixcbiAgKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmxvd21hcERhdGE8TCwgRj4oXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4pOiBkYXRhIGlzIEZsb3dtYXBEYXRhPEwsIEY+IHtcbiAgcmV0dXJuIChcbiAgICBkYXRhICYmIGRhdGEubG9jYXRpb25zICYmIGRhdGEuZmxvd3NcbiAgICAvLyBUT0RPOiB0ZXN0IHRoYXQgdGhleSBhcmUgaXRlcmFibGVcbiAgICAvLyBBcnJheS5pc0FycmF5KGRhdGEubG9jYXRpb25zKSAmJlxuICAgIC8vIEFycmF5LmlzQXJyYXkoZGF0YS5mbG93cylcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmxvd21hcERhdGFQcm92aWRlcjxMLCBGPihcbiAgZGF0YVByb3ZpZGVyOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuKTogZGF0YVByb3ZpZGVyIGlzIEZsb3dtYXBEYXRhUHJvdmlkZXI8TCwgRj4ge1xuICByZXR1cm4gKFxuICAgIGRhdGFQcm92aWRlciAmJlxuICAgIHR5cGVvZiBkYXRhUHJvdmlkZXIuc2V0Rmxvd21hcFN0YXRlID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGFQcm92aWRlci5nZXRWaWV3cG9ydEZvckxvY2F0aW9ucyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhUHJvdmlkZXIuZ2V0Rmxvd0J5SW5kZXggPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YVByb3ZpZGVyLmdldExvY2F0aW9uQnlJZCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhUHJvdmlkZXIuZ2V0TG9jYXRpb25CeUluZGV4ID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGFQcm92aWRlci5nZXRMYXllcnNEYXRhID09PSAnZnVuY3Rpb24nXG4gICk7XG59XG4iXX0=
@@ -0,0 +1,31 @@
1
+ import type FlowmapDataProvider from './FlowmapDataProvider';
2
+ import type { Cluster, ClusterNode, FlowmapData, FlowmapDataAccessors, LayersData, LocationTotals, ViewportProps, AggregateFlow } from '../types';
3
+ import { FlowmapState } from '../FlowmapState';
4
+ import FlowmapSelectors from '../FlowmapSelectors';
5
+ import { GetViewStateOptions } from '../getViewStateForLocations';
6
+ import { ClusterIndex } from '../cluster/ClusterIndex';
7
+ export default class LocalFlowmapDataProvider<L extends Record<string, any>, F extends Record<string, any>> implements FlowmapDataProvider<L, F> {
8
+ private selectors;
9
+ private flowmapData;
10
+ private flowmapState;
11
+ constructor(accessors: FlowmapDataAccessors<L, F>);
12
+ setAccessors(accessors: FlowmapDataAccessors<L, F>): void;
13
+ setFlowmapData(flowmapData: FlowmapData<L, F>): void;
14
+ getSelectors(): FlowmapSelectors<L, F>;
15
+ getFlowmapData(): FlowmapData<L, F> | undefined;
16
+ setFlowmapState(flowmapState: FlowmapState): Promise<void>;
17
+ getFlowmapState(): FlowmapState | undefined;
18
+ getFlowByIndex(idx: number): Promise<F | AggregateFlow | undefined>;
19
+ getLocationByIndex(idx: number): Promise<L | ClusterNode | undefined>;
20
+ getLayersData(): Promise<LayersData | undefined>;
21
+ getLocationById(id: string | number): Promise<L | Cluster | undefined>;
22
+ getTotalsForLocation(id: string | number): Promise<LocationTotals | undefined>;
23
+ getViewportForLocations(dims: [number, number], opts?: GetViewStateOptions): Promise<ViewportProps | undefined>;
24
+ updateLayersData(setLayersData: (layersData: LayersData | undefined) => void): Promise<void>;
25
+ getClusterZoom(): number | undefined;
26
+ getClusterIndex(): ClusterIndex<F> | undefined;
27
+ getLocationsById(): Map<string | number, L> | undefined;
28
+ getLocationTotals(): Map<string | number, LocationTotals> | undefined;
29
+ getFlowsForFlowmapLayer(): Array<F | AggregateFlow> | undefined;
30
+ }
31
+ //# sourceMappingURL=LocalFlowmapDataProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalFlowmapDataProvider.d.ts","sourceRoot":"","sources":["../../src/provider/LocalFlowmapDataProvider.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,mBAAmB,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,OAAO,EACP,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,UAAU,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACd,MAAM,UAAU,CAAC;AAClB,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,gBAAgB,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,mBAAmB,EAEpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAC,YAAY,EAAC,MAAM,yBAAyB,CAAC;AAErD,MAAM,CAAC,OAAO,OAAO,wBAAwB,CAC3C,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAC7B,YAAW,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC;IAEpC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,YAAY,CAA2B;gBAEnC,SAAS,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC;IAOjD,YAAY,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC;IAIlD,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;IAIpD,YAAY,IAAI,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;IAItC,cAAc,IAAI,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS;IAIzC,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,eAAe,IAAI,YAAY,GAAG,SAAS;IAIrC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,aAAa,GAAG,SAAS,CAAC;IAYnE,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,WAAW,GAAG,SAAS,CAAC;IAWrE,aAAa,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAOhD,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,GAAG,SAAS,CAAC;IAqBtE,oBAAoB,CACxB,EAAE,EAAE,MAAM,GAAG,MAAM,GAClB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAShC,uBAAuB,CAC3B,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EACtB,IAAI,CAAC,EAAE,mBAAmB,GACzB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAgB/B,gBAAgB,CACpB,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,KAAK,IAAI;IAK7D,cAAc,IAAI,MAAM,GAAG,SAAS;IAMpC,eAAe,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS;IAM9C,gBAAgB,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS;IAMvD,iBAAiB,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,CAAC,GAAG,SAAS;IAMrE,uBAAuB,IAAI,KAAK,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,SAAS;CAQhE"}
@@ -0,0 +1,115 @@
1
+ /*
2
+ * Copyright (c) Flowmap.gl contributors
3
+ * Copyright (c) 2018-2020 Teralytics
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import FlowmapSelectors from '../FlowmapSelectors';
7
+ import { getViewStateForLocations, } from '../getViewStateForLocations';
8
+ export default class LocalFlowmapDataProvider {
9
+ constructor(accessors) {
10
+ // scope selectors to the concrete instance of FlowmapDataProvider
11
+ this.selectors = new FlowmapSelectors(accessors);
12
+ this.flowmapData = undefined;
13
+ this.flowmapState = undefined;
14
+ }
15
+ setAccessors(accessors) {
16
+ this.selectors.setAccessors(accessors);
17
+ }
18
+ setFlowmapData(flowmapData) {
19
+ this.flowmapData = flowmapData;
20
+ }
21
+ getSelectors() {
22
+ return this.selectors;
23
+ }
24
+ getFlowmapData() {
25
+ return this.flowmapData;
26
+ }
27
+ async setFlowmapState(flowmapState) {
28
+ this.flowmapState = flowmapState;
29
+ }
30
+ getFlowmapState() {
31
+ return this.flowmapState;
32
+ }
33
+ async getFlowByIndex(idx) {
34
+ if (!this.flowmapState || !this.flowmapData) {
35
+ return undefined;
36
+ }
37
+ const flows = this.selectors.getFlowsForFlowmapLayer(this.flowmapState, this.flowmapData);
38
+ return flows?.[idx];
39
+ }
40
+ // TODO: this is unreliable, should replace by unqiue ID
41
+ async getLocationByIndex(idx) {
42
+ if (!this.flowmapState || !this.flowmapData) {
43
+ return undefined;
44
+ }
45
+ const locations = this.selectors.getLocationsForFlowmapLayer(this.flowmapState, this.flowmapData);
46
+ return locations?.[idx];
47
+ }
48
+ async getLayersData() {
49
+ if (!this.flowmapState || !this.flowmapData) {
50
+ return undefined;
51
+ }
52
+ return this.selectors.getLayersData(this.flowmapState, this.flowmapData);
53
+ }
54
+ async getLocationById(id) {
55
+ if (!this.flowmapState || !this.flowmapData) {
56
+ return undefined;
57
+ }
58
+ const clusterIndex = this.selectors.getClusterIndex(this.flowmapState, this.flowmapData);
59
+ if (clusterIndex) {
60
+ const cluster = clusterIndex.getClusterById(id);
61
+ if (cluster) {
62
+ return cluster;
63
+ }
64
+ }
65
+ const locationsById = this.selectors.getLocationsById(this.flowmapState, this.flowmapData);
66
+ return locationsById?.get(id);
67
+ }
68
+ async getTotalsForLocation(id) {
69
+ if (!this.flowmapState || !this.flowmapData) {
70
+ return undefined;
71
+ }
72
+ return this.selectors
73
+ .getLocationTotals(this.flowmapState, this.flowmapData)
74
+ ?.get(id);
75
+ }
76
+ async getViewportForLocations(dims, opts) {
77
+ if (!this.flowmapData?.locations) {
78
+ return undefined;
79
+ }
80
+ // @ts-ignore
81
+ return getViewStateForLocations(this.flowmapData.locations, (loc) => [
82
+ this.selectors.accessors.getLocationLon(loc),
83
+ this.selectors.accessors.getLocationLat(loc),
84
+ ], dims, opts);
85
+ }
86
+ async updateLayersData(setLayersData) {
87
+ setLayersData(await this.getLayersData());
88
+ }
89
+ getClusterZoom() {
90
+ return this.flowmapState && this.flowmapData
91
+ ? this.selectors.getClusterZoom(this.flowmapState, this.flowmapData)
92
+ : undefined;
93
+ }
94
+ getClusterIndex() {
95
+ return this.flowmapState && this.flowmapData
96
+ ? this.selectors.getClusterIndex(this.flowmapState, this.flowmapData)
97
+ : undefined;
98
+ }
99
+ getLocationsById() {
100
+ return this.flowmapState && this.flowmapData
101
+ ? this.selectors.getLocationsById(this.flowmapState, this.flowmapData)
102
+ : undefined;
103
+ }
104
+ getLocationTotals() {
105
+ return this.flowmapState && this.flowmapData
106
+ ? this.selectors.getLocationTotals(this.flowmapState, this.flowmapData)
107
+ : undefined;
108
+ }
109
+ getFlowsForFlowmapLayer() {
110
+ return this.flowmapState && this.flowmapData
111
+ ? this.selectors.getFlowsForFlowmapLayer(this.flowmapState, this.flowmapData)
112
+ : undefined;
113
+ }
114
+ }
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9jYWxGbG93bWFwRGF0YVByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3ZpZGVyL0xvY2FsRmxvd21hcERhdGFQcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBY0gsT0FBTyxnQkFBZ0IsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBRUwsd0JBQXdCLEdBQ3pCLE1BQU0sNkJBQTZCLENBQUM7QUFHckMsTUFBTSxDQUFDLE9BQU8sT0FBTyx3QkFBd0I7SUFTM0MsWUFBWSxTQUFxQztRQUMvQyxrRUFBa0U7UUFDbEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGdCQUFnQixDQUFPLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxZQUFZLENBQUMsU0FBcUM7UUFDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELGNBQWMsQ0FBQyxXQUE4QjtRQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxZQUEwQjtRQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFXO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMs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SUFFRCx1QkFBdUI7UUFDckIsT0FBTyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQzFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUNwQyxJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsV0FBVyxDQUNqQjtZQUNILENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgRmxvd21hcC5nbCBjb250cmlidXRvcnNcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIwIFRlcmFseXRpY3NcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHR5cGUgRmxvd21hcERhdGFQcm92aWRlciBmcm9tICcuL0Zsb3dtYXBEYXRhUHJvdmlkZXInO1xuaW1wb3J0IHR5cGUge1xuICBDbHVzdGVyLFxuICBDbHVzdGVyTm9kZSxcbiAgRmxvd21hcERhdGEsXG4gIEZsb3dtYXBEYXRhQWNjZXNzb3JzLFxuICBMYXllcnNEYXRhLFxuICBMb2NhdGlvblRvdGFscyxcbiAgVmlld3BvcnRQcm9wcyxcbiAgQWdncmVnYXRlRmxvdyxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtGbG93bWFwU3RhdGV9IGZyb20gJy4uL0Zsb3dtYXBTdGF0ZSc7XG5pbXBvcnQgRmxvd21hcFNlbGVjdG9ycyBmcm9tICcuLi9GbG93bWFwU2VsZWN0b3JzJztcbmltcG9ydCB7XG4gIEdldFZpZXdTdGF0ZU9wdGlvbnMsXG4gIGdldFZpZXdTdGF0ZUZvckxvY2F0aW9ucyxcbn0gZnJvbSAnLi4vZ2V0Vmlld1N0YXRlRm9yTG9jYXRpb25zJztcbmltcG9ydCB7Q2x1c3RlckluZGV4fSBmcm9tICcuLi9jbHVzdGVyL0NsdXN0ZXJJbmRleCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvY2FsRmxvd21hcERhdGFQcm92aWRlcjxcbiAgTCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIEYgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPiBpbXBsZW1lbnRzIEZsb3dtYXBEYXRhUHJvdmlkZXI8TCwgRj5cbntcbiAgcHJpdmF0ZSBzZWxlY3RvcnM6IEZsb3dtYXBTZWxlY3RvcnM8TCwgRj47XG4gIHByaXZhdGUgZmxvd21hcERhdGE6IEZsb3dtYXBEYXRhPEwsIEY+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGZsb3dtYXBTdGF0ZTogRmxvd21hcFN0YXRlIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGFjY2Vzc29yczogRmxvd21hcERhdGFBY2Nlc3NvcnM8TCwgRj4pIHtcbiAgICAvLyBzY29wZSBzZWxlY3RvcnMgdG8gdGhlIGNvbmNyZXRlIGluc3RhbmNlIG9mIEZsb3dtYXBEYXRhUHJvdmlkZXJcbiAgICB0aGlzLnNlbGVjdG9ycyA9IG5ldyBGbG93bWFwU2VsZWN0b3JzPEwsIEY+KGFjY2Vzc29ycyk7XG4gICAgdGhpcy5mbG93bWFwRGF0YSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmZsb3dtYXBTdGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHNldEFjY2Vzc29ycyhhY2Nlc3NvcnM6IEZsb3dtYXBEYXRhQWNjZXNzb3JzPEwsIEY+KSB7XG4gICAgdGhpcy5zZWxlY3RvcnMuc2V0QWNjZXNzb3JzKGFjY2Vzc29ycyk7XG4gIH1cblxuICBzZXRGbG93bWFwRGF0YShmbG93bWFwRGF0YTogRmxvd21hcERhdGE8TCwgRj4pOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dtYXBEYXRhID0gZmxvd21hcERhdGE7XG4gIH1cblxuICBnZXRTZWxlY3RvcnMoKTogRmxvd21hcFNlbGVjdG9yczxMLCBGPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0b3JzO1xuICB9XG5cbiAgZ2V0Rmxvd21hcERhdGEoKTogRmxvd21hcERhdGE8TCwgRj4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZsb3dtYXBEYXRhO1xuICB9XG5cbiAgYXN5bmMgc2V0Rmxvd21hcFN0YXRlKGZsb3dtYXBTdGF0ZTogRmxvd21hcFN0YXRlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5mbG93bWFwU3RhdGUgPSBmbG93bWFwU3RhdGU7XG4gIH1cblxuICBnZXRGbG93bWFwU3RhdGUoKTogRmxvd21hcFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93bWFwU3RhdGU7XG4gIH1cblxuICBhc3luYyBnZXRGbG93QnlJbmRleChpZHg6IG51bWJlcik6IFByb21pc2U8RiB8IEFnZ3JlZ2F0ZUZsb3cgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMuZmxvd21hcFN0YXRlIHx8ICF0aGlzLmZsb3dtYXBEYXRhKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBmbG93cyA9IHRoaXMuc2VsZWN0b3JzLmdldEZsb3dzRm9yRmxvd21hcExheWVyKFxuICAgICAgdGhpcy5mbG93bWFwU3RhdGUsXG4gICAgICB0aGlzLmZsb3dtYXBEYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZsb3dzPy5baWR4XTtcbiAgfVxuXG4gIC8vIFRPRE86IHRoaXMgaXMgdW5yZWxpYWJsZSwgc2hvdWxkIHJlcGxhY2UgYnkgdW5xaXVlIElEXG4gIGFzeW5jIGdldExvY2F0aW9uQnlJbmRleChpZHg6IG51bWJlcik6IFByb21pc2U8TCB8IENsdXN0ZXJOb2RlIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLmZsb3dtYXBTdGF0ZSB8fCAhdGhpcy5mbG93bWFwRGF0YSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbG9jYXRpb25zID0gdGhpcy5zZWxlY3RvcnMuZ2V0TG9jYXRpb25zRm9yRmxvd21hcExheWVyKFxuICAgICAgdGhpcy5mbG93bWFwU3RhdGUsXG4gICAgICB0aGlzLmZsb3dtYXBEYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGxvY2F0aW9ucz8uW2lkeF07XG4gIH1cblxuICBhc3luYyBnZXRMYXllcnNEYXRhKCk6IFByb21pc2U8TGF5ZXJzRGF0YSB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5mbG93bWFwU3RhdGUgfHwgIXRoaXMuZmxvd21hcERhdGEpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbGVjdG9ycy5nZXRMYXllcnNEYXRhKHRoaXMuZmxvd21hcFN0YXRlLCB0aGlzLmZsb3dtYXBEYXRhKTtcbiAgfVxuXG4gIGFzeW5jIGdldExvY2F0aW9uQnlJZChpZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTxMIHwgQ2x1c3RlciB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5mbG93bWFwU3RhdGUgfHwgIXRoaXMuZmxvd21hcERhdGEpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNsdXN0ZXJJbmRleCA9IHRoaXMuc2VsZWN0b3JzLmdldENsdXN0ZXJJbmRleChcbiAgICAgIHRoaXMuZmxvd21hcFN0YXRlLFxuICAgICAgdGhpcy5mbG93bWFwRGF0YSxcbiAgICApO1xuICAgIGlmIChjbHVzdGVySW5kZXgpIHtcbiAgICAgIGNvbnN0IGNsdXN0ZXIgPSBjbHVzdGVySW5kZXguZ2V0Q2x1c3RlckJ5SWQoaWQpO1xuICAgICAgaWYgKGNsdXN0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGNsdXN0ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGxvY2F0aW9uc0J5SWQgPSB0aGlzLnNlbGVjdG9ycy5nZXRMb2NhdGlvbnNCeUlkKFxuICAgICAgdGhpcy5mbG93bWFwU3RhdGUsXG4gICAgICB0aGlzLmZsb3dtYXBEYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGxvY2F0aW9uc0J5SWQ/LmdldChpZCk7XG4gIH1cblxuICBhc3luYyBnZXRUb3RhbHNGb3JMb2NhdGlvbihcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICApOiBQcm9taXNlPExvY2F0aW9uVG90YWxzIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLmZsb3dtYXBTdGF0ZSB8fCAhdGhpcy5mbG93bWFwRGF0YSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0b3JzXG4gICAgICAuZ2V0TG9jYXRpb25Ub3RhbHModGhpcy5mbG93bWFwU3RhdGUsIHRoaXMuZmxvd21hcERhdGEpXG4gICAgICA/LmdldChpZCk7XG4gIH1cblxuICBhc3luYyBnZXRWaWV3cG9ydEZvckxvY2F0aW9ucyhcbiAgICBkaW1zOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIG9wdHM/OiBHZXRWaWV3U3RhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPFZpZXdwb3J0UHJvcHMgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMuZmxvd21hcERhdGE/LmxvY2F0aW9ucykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBnZXRWaWV3U3RhdGVGb3JMb2NhdGlvbnMoXG4gICAgICB0aGlzLmZsb3dtYXBEYXRhLmxvY2F0aW9ucyxcbiAgICAgIChsb2MpID0+IFtcbiAgICAgICAgdGhpcy5zZWxlY3RvcnMuYWNjZXNzb3JzLmdldExvY2F0aW9uTG9uKGxvYyksXG4gICAgICAgIHRoaXMuc2VsZWN0b3JzLmFjY2Vzc29ycy5nZXRMb2NhdGlvbkxhdChsb2MpLFxuICAgICAgXSxcbiAgICAgIGRpbXMsXG4gICAgICBvcHRzLFxuICAgICk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVMYXllcnNEYXRhKFxuICAgIHNldExheWVyc0RhdGE6IChsYXllcnNEYXRhOiBMYXllcnNEYXRhIHwgdW5kZWZpbmVkKSA9PiB2b2lkLFxuICApIHtcbiAgICBzZXRMYXllcnNEYXRhKGF3YWl0IHRoaXMuZ2V0TGF5ZXJzRGF0YSgpKTtcbiAgfVxuXG4gIGdldENsdXN0ZXJab29tKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmxvd21hcFN0YXRlICYmIHRoaXMuZmxvd21hcERhdGFcbiAgICAgID8gdGhpcy5zZWxlY3RvcnMuZ2V0Q2x1c3Rlclpvb20odGhpcy5mbG93bWFwU3RhdGUsIHRoaXMuZmxvd21hcERhdGEpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldENsdXN0ZXJJbmRleCgpOiBDbHVzdGVySW5kZXg8Rj4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZsb3dtYXBTdGF0ZSAmJiB0aGlzLmZsb3dtYXBEYXRhXG4gICAgICA/IHRoaXMuc2VsZWN0b3JzLmdldENsdXN0ZXJJbmRleCh0aGlzLmZsb3dtYXBTdGF0ZSwgdGhpcy5mbG93bWFwRGF0YSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0TG9jYXRpb25zQnlJZCgpOiBNYXA8c3RyaW5nIHwgbnVtYmVyLCBMPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmxvd21hcFN0YXRlICYmIHRoaXMuZmxvd21hcERhdGFcbiAgICAgID8gdGhpcy5zZWxlY3RvcnMuZ2V0TG9jYXRpb25zQnlJZCh0aGlzLmZsb3dtYXBTdGF0ZSwgdGhpcy5mbG93bWFwRGF0YSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0TG9jYXRpb25Ub3RhbHMoKTogTWFwPHN0cmluZyB8IG51bWJlciwgTG9jYXRpb25Ub3RhbHM+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93bWFwU3RhdGUgJiYgdGhpcy5mbG93bWFwRGF0YVxuICAgICAgPyB0aGlzLnNlbGVjdG9ycy5nZXRMb2NhdGlvblRvdGFscyh0aGlzLmZsb3dtYXBTdGF0ZSwgdGhpcy5mbG93bWFwRGF0YSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0Rmxvd3NGb3JGbG93bWFwTGF5ZXIoKTogQXJyYXk8RiB8IEFnZ3JlZ2F0ZUZsb3c+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93bWFwU3RhdGUgJiYgdGhpcy5mbG93bWFwRGF0YVxuICAgICAgPyB0aGlzLnNlbGVjdG9ycy5nZXRGbG93c0ZvckZsb3dtYXBMYXllcihcbiAgICAgICAgICB0aGlzLmZsb3dtYXBTdGF0ZSxcbiAgICAgICAgICB0aGlzLmZsb3dtYXBEYXRhLFxuICAgICAgICApXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
@@ -0,0 +1,10 @@
1
+ import { ClusterLevel, LocationAccessors, ViewportProps } from './types';
2
+ import { ClusterIndex, LocationWeightGetter } from './cluster/ClusterIndex';
3
+ export declare const getViewportBoundingBox: (viewport: ViewportProps, maxLocationCircleSize?: number) => [number, number, number, number];
4
+ export declare const getFlowThicknessScale: (magnitudeExtent: [number, number] | undefined) => import("d3-scale").ScaleLinear<number, number, never> | undefined;
5
+ /**
6
+ * Adding meaningful cluster names.
7
+ * NOTE: this will mutate the nodes in clusterIndex
8
+ */
9
+ export declare function addClusterNames<L, F>(clusterIndex: ClusterIndex<F>, clusterLevels: ClusterLevel[], locationsById: Map<string | number, L>, locationAccessors: LocationAccessors<L>, getLocationWeight: LocationWeightGetter): void;
10
+ //# sourceMappingURL=selector-functions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector-functions.d.ts","sourceRoot":"","sources":["../src/selector-functions.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,YAAY,EAEZ,iBAAiB,EACjB,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAC,YAAY,EAAE,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAK1E,eAAO,MAAM,sBAAsB,GACjC,UAAU,aAAa,EACvB,8BAAyB,KACxB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAQjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,sEAa9C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,CAAC,EAClC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAC7B,aAAa,EAAE,YAAY,EAAE,EAC7B,aAAa,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,EACtC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,EACvC,iBAAiB,EAAE,oBAAoB,GACtC,IAAI,CAkCN"}
@@ -0,0 +1,65 @@
1
+ /*
2
+ * Copyright (c) Flowmap.gl contributors
3
+ * Copyright (c) 2018-2020 Teralytics
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { WebMercatorViewport } from '@math.gl/web-mercator';
7
+ import { isCluster, } from './types';
8
+ import { scaleLinear } from 'd3-scale';
9
+ import { descending } from 'd3-array';
10
+ // TODO: use re-reselect
11
+ export const getViewportBoundingBox = (viewport, maxLocationCircleSize = 0) => {
12
+ const pad = maxLocationCircleSize;
13
+ const bounds = new WebMercatorViewport({
14
+ ...viewport,
15
+ width: viewport.width + pad * 2,
16
+ height: viewport.height + pad * 2,
17
+ }).getBounds();
18
+ return [bounds[0][0], bounds[0][1], bounds[1][0], bounds[1][1]];
19
+ };
20
+ export const getFlowThicknessScale = (magnitudeExtent) => {
21
+ if (!magnitudeExtent)
22
+ return undefined;
23
+ return scaleLinear()
24
+ .range([0.025, 0.5])
25
+ .domain([
26
+ 0,
27
+ // should support diff mode too
28
+ Math.max.apply(null, magnitudeExtent.map((x) => Math.abs(x || 0))),
29
+ ]);
30
+ };
31
+ /**
32
+ * Adding meaningful cluster names.
33
+ * NOTE: this will mutate the nodes in clusterIndex
34
+ */
35
+ export function addClusterNames(clusterIndex, clusterLevels, locationsById, locationAccessors, getLocationWeight) {
36
+ const { getLocationId, getLocationName, getLocationClusterName } = locationAccessors;
37
+ const getName = (id) => {
38
+ const loc = locationsById.get(id);
39
+ if (loc) {
40
+ return getLocationName ? getLocationName(loc) : getLocationId(loc) || id;
41
+ }
42
+ return `"${id}"`;
43
+ };
44
+ for (const level of clusterLevels) {
45
+ for (const node of level.nodes) {
46
+ // Here mutating the nodes (adding names)
47
+ if (isCluster(node)) {
48
+ const leaves = clusterIndex.expandCluster(node);
49
+ leaves.sort((a, b) => descending(getLocationWeight(a), getLocationWeight(b)));
50
+ if (getLocationClusterName) {
51
+ node.name = getLocationClusterName(leaves);
52
+ }
53
+ else {
54
+ const topId = leaves[0];
55
+ const otherId = leaves.length === 2 ? leaves[1] : undefined;
56
+ node.name = `"${getName(topId)}" and ${otherId ? `"${getName(otherId)}"` : `${leaves.length - 1} others`}`;
57
+ }
58
+ }
59
+ else {
60
+ node.name = getName(node.id);
61
+ }
62
+ }
63
+ }
64
+ }
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3ItZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NlbGVjdG9yLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUVMLFNBQVMsR0FHVixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRXJDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFcEMsd0JBQXdCO0FBRXhCLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQ3BDLFFBQXVCLEVBQ3ZCLHFCQUFxQixHQUFHLENBQUMsRUFDUyxFQUFFO0lBQ3BDLE1BQU0sR0FBRyxHQUFHLHFCQUFxQixDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksbUJBQW1CLENBQUM7UUFDckMsR0FBRyxRQUFRO1FBQ1gsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDL0IsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUM7S0FDbEMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQ25DLGVBQTZDLEVBQzdDLEVBQUU7SUFDRixJQUFJLENBQUMsZUFBZTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3ZDLE9BQU8sV0FBVyxFQUFFO1NBQ2pCLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNuQixNQUFNLENBQUM7UUFDTixDQUFDO1FBQ0QsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLElBQUksRUFDSixlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBcUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDakU7S0FDRixDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixZQUE2QixFQUM3QixhQUE2QixFQUM3QixhQUFzQyxFQUN0QyxpQkFBdUMsRUFDdkMsaUJBQXVDO0lBRXZDLE1BQU0sRUFBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFDLEdBQzVELGlCQUFpQixDQUFDO0lBQ3BCLE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBbUIsRUFBRSxFQUFFO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLE9BQU8sZUFBZSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUNELE9BQU8sSUFBSSxFQUFFLEdBQUcsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFDRixLQUFLLE1BQU0sS0FBSyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9CLHlDQUF5QztZQUN6QyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNwQixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUVoRCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ25CLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUN2RCxDQUFDO2dCQUVGLElBQUksc0JBQXNCLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLElBQUksR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0MsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDeEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO29CQUM1RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUM1QixPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLFNBQzFELEVBQUUsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNMLElBQVksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgRmxvd21hcC5nbCBjb250cmlidXRvcnNcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIwIFRlcmFseXRpY3NcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHtXZWJNZXJjYXRvclZpZXdwb3J0fSBmcm9tICdAbWF0aC5nbC93ZWItbWVyY2F0b3InO1xuaW1wb3J0IHtcbiAgQ2x1c3RlckxldmVsLFxuICBpc0NsdXN0ZXIsXG4gIExvY2F0aW9uQWNjZXNzb3JzLFxuICBWaWV3cG9ydFByb3BzLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7c2NhbGVMaW5lYXJ9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7Q2x1c3RlckluZGV4LCBMb2NhdGlvbldlaWdodEdldHRlcn0gZnJvbSAnLi9jbHVzdGVyL0NsdXN0ZXJJbmRleCc7XG5pbXBvcnQge2Rlc2NlbmRpbmd9IGZyb20gJ2QzLWFycmF5JztcblxuLy8gVE9ETzogdXNlIHJlLXJlc2VsZWN0XG5cbmV4cG9ydCBjb25zdCBnZXRWaWV3cG9ydEJvdW5kaW5nQm94ID0gKFxuICB2aWV3cG9ydDogVmlld3BvcnRQcm9wcyxcbiAgbWF4TG9jYXRpb25DaXJjbGVTaXplID0gMCxcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgcGFkID0gbWF4TG9jYXRpb25DaXJjbGVTaXplO1xuICBjb25zdCBib3VuZHMgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydCh7XG4gICAgLi4udmlld3BvcnQsXG4gICAgd2lkdGg6IHZpZXdwb3J0LndpZHRoICsgcGFkICogMixcbiAgICBoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCArIHBhZCAqIDIsXG4gIH0pLmdldEJvdW5kcygpO1xuICByZXR1cm4gW2JvdW5kc1swXVswXSwgYm91bmRzWzBdWzFdLCBib3VuZHNbMV1bMF0sIGJvdW5kc1sxXVsxXV07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Rmxvd1RoaWNrbmVzc1NjYWxlID0gKFxuICBtYWduaXR1ZGVFeHRlbnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKCFtYWduaXR1ZGVFeHRlbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBzY2FsZUxpbmVhcigpXG4gICAgLnJhbmdlKFswLjAyNSwgMC41XSlcbiAgICAuZG9tYWluKFtcbiAgICAgIDAsXG4gICAgICAvLyBzaG91bGQgc3VwcG9ydCBkaWZmIG1vZGUgdG9vXG4gICAgICBNYXRoLm1heC5hcHBseShcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbWFnbml0dWRlRXh0ZW50Lm1hcCgoeDogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiBNYXRoLmFicyh4IHx8IDApKSxcbiAgICAgICksXG4gICAgXSk7XG59O1xuXG4vKipcbiAqIEFkZGluZyBtZWFuaW5nZnVsIGNsdXN0ZXIgbmFtZXMuXG4gKiBOT1RFOiB0aGlzIHdpbGwgbXV0YXRlIHRoZSBub2RlcyBpbiBjbHVzdGVySW5kZXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZENsdXN0ZXJOYW1lczxMLCBGPihcbiAgY2x1c3RlckluZGV4OiBDbHVzdGVySW5kZXg8Rj4sXG4gIGNsdXN0ZXJMZXZlbHM6IENsdXN0ZXJMZXZlbFtdLFxuICBsb2NhdGlvbnNCeUlkOiBNYXA8c3RyaW5nIHwgbnVtYmVyLCBMPixcbiAgbG9jYXRpb25BY2Nlc3NvcnM6IExvY2F0aW9uQWNjZXNzb3JzPEw+LFxuICBnZXRMb2NhdGlvbldlaWdodDogTG9jYXRpb25XZWlnaHRHZXR0ZXIsXG4pOiB2b2lkIHtcbiAgY29uc3Qge2dldExvY2F0aW9uSWQsIGdldExvY2F0aW9uTmFtZSwgZ2V0TG9jYXRpb25DbHVzdGVyTmFtZX0gPVxuICAgIGxvY2F0aW9uQWNjZXNzb3JzO1xuICBjb25zdCBnZXROYW1lID0gKGlkOiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgICBjb25zdCBsb2MgPSBsb2NhdGlvbnNCeUlkLmdldChpZCk7XG4gICAgaWYgKGxvYykge1xuICAgICAgcmV0dXJuIGdldExvY2F0aW9uTmFtZSA/IGdldExvY2F0aW9uTmFtZShsb2MpIDogZ2V0TG9jYXRpb25JZChsb2MpIHx8IGlkO1xuICAgIH1cbiAgICByZXR1cm4gYFwiJHtpZH1cImA7XG4gIH07XG4gIGZvciAoY29uc3QgbGV2ZWwgb2YgY2x1c3RlckxldmVscykge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBsZXZlbC5ub2Rlcykge1xuICAgICAgLy8gSGVyZSBtdXRhdGluZyB0aGUgbm9kZXMgKGFkZGluZyBuYW1lcylcbiAgICAgIGlmIChpc0NsdXN0ZXIobm9kZSkpIHtcbiAgICAgICAgY29uc3QgbGVhdmVzID0gY2x1c3RlckluZGV4LmV4cGFuZENsdXN0ZXIobm9kZSk7XG5cbiAgICAgICAgbGVhdmVzLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgZGVzY2VuZGluZyhnZXRMb2NhdGlvbldlaWdodChhKSwgZ2V0TG9jYXRpb25XZWlnaHQoYikpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChnZXRMb2NhdGlvbkNsdXN0ZXJOYW1lKSB7XG4gICAgICAgICAgbm9kZS5uYW1lID0gZ2V0TG9jYXRpb25DbHVzdGVyTmFtZShsZWF2ZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRvcElkID0gbGVhdmVzWzBdO1xuICAgICAgICAgIGNvbnN0IG90aGVySWQgPSBsZWF2ZXMubGVuZ3RoID09PSAyID8gbGVhdmVzWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgIG5vZGUubmFtZSA9IGBcIiR7Z2V0TmFtZSh0b3BJZCl9XCIgYW5kICR7XG4gICAgICAgICAgICBvdGhlcklkID8gYFwiJHtnZXROYW1lKG90aGVySWQpfVwiYCA6IGAke2xlYXZlcy5sZW5ndGggLSAxfSBvdGhlcnNgXG4gICAgICAgICAgfWA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIChub2RlIGFzIGFueSkubmFtZSA9IGdldE5hbWUobm9kZS5pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
package/dist/time.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ import { TimeInterval } from 'd3-time';
2
+ export declare function parseTime(input: string | Date | undefined): Date | undefined;
3
+ export declare enum TimeGranularityKey {
4
+ SECOND = "SECOND",
5
+ MINUTE = "MINUTE",
6
+ HOUR = "HOUR",
7
+ DAY = "DAY",
8
+ MONTH = "MONTH",
9
+ YEAR = "YEAR"
10
+ }
11
+ export interface TimeGranularity {
12
+ key: TimeGranularityKey;
13
+ order: number;
14
+ interval: TimeInterval;
15
+ format: (date: Date) => string;
16
+ formatFull: (date: Date) => string;
17
+ }
18
+ export declare function tickMultiFormat(date: Date): string;
19
+ export declare const TIME_GRANULARITIES: TimeGranularity[];
20
+ export declare function getTimeGranularityByKey(key: TimeGranularityKey): TimeGranularity | undefined;
21
+ export declare function getTimeGranularityByOrder(order: number): TimeGranularity | undefined;
22
+ export declare function getTimeGranularityForDate(date: Date): TimeGranularity;
23
+ export declare function areRangesEqual(a: [Date, Date] | undefined, b: [Date, Date] | undefined): boolean;
24
+ //# sourceMappingURL=time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,YAAY,EAMb,MAAM,SAAS,CAAC;AAUjB,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAa5E;AAED,oBAAY,kBAAkB;IAC5B,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,KAAK,UAAU;IACf,IAAI,SAAS;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,kBAAkB,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IAC/B,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;CACpC;AAcD,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,UAkBzC;AAED,eAAO,MAAM,kBAAkB,EAAE,eAAe,EA4C/C,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,kBAAkB,+BAE9D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,+BAEtD;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,eAAe,CAYrE;AAED,wBAAgB,cAAc,CAC5B,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,EAC3B,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,GAC1B,OAAO,CAIT"}
package/dist/time.js ADDED
@@ -0,0 +1,131 @@
1
+ /*
2
+ * Copyright (c) Flowmap.gl contributors
3
+ * Copyright (c) 2018-2020 Teralytics
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { timeFormat, timeParse } from 'd3-time-format';
7
+ import { timeDay, timeHour, timeMinute, timeMonth, timeSecond, timeWeek, timeYear, } from 'd3-time';
8
+ const dateParsers = [
9
+ timeParse('%Y-%m-%d'),
10
+ timeParse('%Y-%m-%d %H:%M'),
11
+ timeParse('%Y-%m-%d %H:%M:%S'),
12
+ timeParse('%Y'),
13
+ timeParse('%Y-%m'),
14
+ ];
15
+ export function parseTime(input) {
16
+ if (input != null) {
17
+ if (input instanceof Date) {
18
+ return input;
19
+ }
20
+ for (const parse of dateParsers) {
21
+ const date = parse(input);
22
+ if (date) {
23
+ return date;
24
+ }
25
+ }
26
+ }
27
+ return undefined;
28
+ }
29
+ export var TimeGranularityKey;
30
+ (function (TimeGranularityKey) {
31
+ TimeGranularityKey["SECOND"] = "SECOND";
32
+ TimeGranularityKey["MINUTE"] = "MINUTE";
33
+ TimeGranularityKey["HOUR"] = "HOUR";
34
+ TimeGranularityKey["DAY"] = "DAY";
35
+ TimeGranularityKey["MONTH"] = "MONTH";
36
+ TimeGranularityKey["YEAR"] = "YEAR";
37
+ })(TimeGranularityKey || (TimeGranularityKey = {}));
38
+ // const preferredLocale = navigator.languages ? navigator.languages[0] : 'en';
39
+ const formatMillisecond = timeFormat('.%L'), formatSecond = timeFormat(':%S'), formatMinute = timeFormat('%I:%M'),
40
+ // formatHour = (d: Date) => d.toLocaleString(preferredLocale, { hour: 'numeric' }),
41
+ formatHour = timeFormat('%I %p'), formatDay = timeFormat('%a %d'), formatWeek = timeFormat('%b %d'), formatMonth = timeFormat('%b'), formatYear = timeFormat('%Y');
42
+ export function tickMultiFormat(date) {
43
+ return (timeSecond(date) < date
44
+ ? formatMillisecond
45
+ : timeMinute(date) < date
46
+ ? formatSecond
47
+ : timeHour(date) < date
48
+ ? formatMinute
49
+ : timeDay(date) < date
50
+ ? formatHour
51
+ : timeMonth(date) < date
52
+ ? timeWeek(date) < date
53
+ ? formatDay
54
+ : formatWeek
55
+ : timeYear(date) < date
56
+ ? formatMonth
57
+ : formatYear)(date);
58
+ }
59
+ export const TIME_GRANULARITIES = [
60
+ {
61
+ order: 0,
62
+ key: TimeGranularityKey.SECOND,
63
+ interval: timeSecond,
64
+ format: formatSecond,
65
+ formatFull: timeFormat('%Y-%m-%d %H:%M:%S'),
66
+ },
67
+ {
68
+ order: 1,
69
+ key: TimeGranularityKey.MINUTE,
70
+ interval: timeMinute,
71
+ format: formatMinute,
72
+ formatFull: timeFormat('%Y-%m-%d %H:%M'),
73
+ },
74
+ {
75
+ order: 2,
76
+ key: TimeGranularityKey.HOUR,
77
+ interval: timeHour,
78
+ // format: (d: Date) => d.toLocaleString(preferredLocale, { hour: 'numeric', minute: '2-digit' }),
79
+ format: formatHour,
80
+ formatFull: timeFormat('%a %d %b %Y, %I %p'),
81
+ },
82
+ {
83
+ order: 3,
84
+ key: TimeGranularityKey.DAY,
85
+ interval: timeDay,
86
+ format: formatDay,
87
+ formatFull: timeFormat('%a %d %b %Y'),
88
+ },
89
+ {
90
+ order: 4,
91
+ key: TimeGranularityKey.MONTH,
92
+ interval: timeMonth,
93
+ format: formatMonth,
94
+ formatFull: timeFormat('%b %Y'),
95
+ },
96
+ {
97
+ order: 5,
98
+ key: TimeGranularityKey.YEAR,
99
+ interval: timeYear,
100
+ format: formatYear,
101
+ formatFull: timeFormat('%Y'),
102
+ },
103
+ ];
104
+ export function getTimeGranularityByKey(key) {
105
+ return TIME_GRANULARITIES.find((s) => s.key === key);
106
+ }
107
+ export function getTimeGranularityByOrder(order) {
108
+ return TIME_GRANULARITIES.find((s) => s.order === order);
109
+ }
110
+ export function getTimeGranularityForDate(date) {
111
+ let prev = undefined;
112
+ for (const current of TIME_GRANULARITIES) {
113
+ const { interval } = current;
114
+ const floored = interval(date);
115
+ if (floored < date) {
116
+ if (!prev)
117
+ return current;
118
+ return prev;
119
+ }
120
+ prev = current;
121
+ }
122
+ return TIME_GRANULARITIES[TIME_GRANULARITIES.length - 1];
123
+ }
124
+ export function areRangesEqual(a, b) {
125
+ if (!a && !b)
126
+ return true;
127
+ if (!a || !b)
128
+ return false;
129
+ return a[0] === b[0] && a[1] === b[1];
130
+ }
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxPQUFPLEVBQ1AsUUFBUSxFQUVSLFVBQVUsRUFDVixTQUFTLEVBQ1QsVUFBVSxFQUNWLFFBQVEsRUFDUixRQUFRLEdBQ1QsTUFBTSxTQUFTLENBQUM7QUFFakIsTUFBTSxXQUFXLEdBQUc7SUFDbEIsU0FBUyxDQUFDLFVBQVUsQ0FBQztJQUNyQixTQUFTLENBQUMsZ0JBQWdCLENBQUM7SUFDM0IsU0FBUyxDQUFDLG1CQUFtQixDQUFDO0lBQzlCLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDZixTQUFTLENBQUMsT0FBTyxDQUFDO0NBQ25CLENBQUM7QUFFRixNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQWdDO0lBQ3hELElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2xCLElBQUksS0FBSyxZQUFZLElBQUksRUFBRSxDQUFDO1lBQzFCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELEtBQUssTUFBTSxLQUFLLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsTUFBTSxDQUFOLElBQVksa0JBT1g7QUFQRCxXQUFZLGtCQUFrQjtJQUM1Qix1Q0FBaUIsQ0FBQTtJQUNqQix1Q0FBaUIsQ0FBQTtJQUNqQixtQ0FBYSxDQUFBO0lBQ2IsaUNBQVcsQ0FBQTtJQUNYLHFDQUFlLENBQUE7SUFDZixtQ0FBYSxDQUFB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LENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgRmxvd21hcC5nbCBjb250cmlidXRvcnNcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIwIFRlcmFseXRpY3NcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHt0aW1lRm9ybWF0LCB0aW1lUGFyc2V9IGZyb20gJ2QzLXRpbWUtZm9ybWF0JztcbmltcG9ydCB7XG4gIHRpbWVEYXksXG4gIHRpbWVIb3VyLFxuICBUaW1lSW50ZXJ2YWwsXG4gIHRpbWVNaW51dGUsXG4gIHRpbWVNb250aCxcbiAgdGltZVNlY29uZCxcbiAgdGltZVdlZWssXG4gIHRpbWVZZWFyLFxufSBmcm9tICdkMy10aW1lJztcblxuY29uc3QgZGF0ZVBhcnNlcnMgPSBbXG4gIHRpbWVQYXJzZSgnJVktJW0tJWQnKSxcbiAgdGltZVBhcnNlKCclWS0lbS0lZCAlSDolTScpLFxuICB0aW1lUGFyc2UoJyVZLSVtLSVkICVIOiVNOiVTJyksXG4gIHRpbWVQYXJzZSgnJVknKSxcbiAgdGltZVBhcnNlKCclWS0lbScpLFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGltZShpbnB1dDogc3RyaW5nIHwgRGF0ZSB8IHVuZGVmaW5lZCk6IERhdGUgfCB1bmRlZmluZWQge1xuICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwYXJzZSBvZiBkYXRlUGFyc2Vycykge1xuICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlKGlucHV0KTtcbiAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZW51bSBUaW1lR3JhbnVsYXJpdHlLZXkge1xuICBTRUNPTkQgPSAnU0VDT05EJyxcbiAgTUlOVVRFID0gJ01JTlVURScsXG4gIEhPVVIgPSAnSE9VUicsXG4gIERBWSA9ICdEQVknLFxuICBNT05USCA9ICdNT05USCcsXG4gIFlFQVIgPSAnWUVBUicsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZUdyYW51bGFyaXR5IHtcbiAga2V5OiBUaW1lR3JhbnVsYXJpdHlLZXk7XG4gIG9yZGVyOiBudW1iZXI7XG4gIGludGVydmFsOiBUaW1lSW50ZXJ2YWw7XG4gIGZvcm1hdDogKGRhdGU6IERhdGUpID0+IHN0cmluZztcbiAgZm9ybWF0RnVsbDogKGRhdGU6IERhdGUpID0+IHN0cmluZztcbn1cblxuLy8gY29uc3QgcHJlZmVycmVkTG9jYWxlID0gbmF2aWdhdG9yLmxhbmd1YWdlcyA/IG5hdmlnYXRvci5sYW5ndWFnZXNbMF0gOiAnZW4nO1xuXG5jb25zdCBmb3JtYXRNaWxsaXNlY29uZCA9IHRpbWVGb3JtYXQoJy4lTCcpLFxuICBmb3JtYXRTZWNvbmQgPSB0aW1lRm9ybWF0KCc6JVMnKSxcbiAgZm9ybWF0TWludXRlID0gdGltZUZvcm1hdCgnJUk6JU0nKSxcbiAgLy8gZm9ybWF0SG91ciA9IChkOiBEYXRlKSA9PiBkLnRvTG9jYWxlU3RyaW5nKHByZWZlcnJlZExvY2FsZSwgeyBob3VyOiAnbnVtZXJpYycgfSksXG4gIGZvcm1hdEhvdXIgPSB0aW1lRm9ybWF0KCclSSAlcCcpLFxuICBmb3JtYXREYXkgPSB0aW1lRm9ybWF0KCclYSAlZCcpLFxuICBmb3JtYXRXZWVrID0gdGltZUZvcm1hdCgnJWIgJWQnKSxcbiAgZm9ybWF0TW9udGggPSB0aW1lRm9ybWF0KCclYicpLFxuICBmb3JtYXRZZWFyID0gdGltZUZvcm1hdCgnJVknKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpY2tNdWx0aUZvcm1hdChkYXRlOiBEYXRlKSB7XG4gIHJldHVybiAoXG4gICAgdGltZVNlY29uZChkYXRlKSA8IGRhdGVcbiAgICAgID8gZm9ybWF0TWlsbGlzZWNvbmRcbiAgICAgIDogdGltZU1pbnV0ZShkYXRlKSA8IGRhdGVcbiAgICAgID8gZm9ybWF0U2Vjb25kXG4gICAgICA6IHRpbWVIb3VyKGRhdGUpIDwgZGF0ZVxuICAgICAgPyBmb3JtYXRNaW51dGVcbiAgICAgIDogdGltZURheShkYXRlKSA8IGRhdGVcbiAgICAgID8gZm9ybWF0SG91clxuICAgICAgOiB0aW1lTW9udGgoZGF0ZSkgPCBkYXRlXG4gICAgICA/IHRpbWVXZWVrKGRhdGUpIDwgZGF0ZVxuICAgICAgICA/IGZvcm1hdERheVxuICAgICAgICA6IGZvcm1hdFdlZWtcbiAgICAgIDogdGltZVllYXIoZGF0ZSkgPCBkYXRlXG4gICAgICA/IGZvcm1hdE1vbnRoXG4gICAgICA6IGZvcm1hdFllYXJcbiAgKShkYXRlKTtcbn1cblxuZXhwb3J0IGNvbnN0IFRJTUVfR1JBTlVMQVJJVElFUzogVGltZUdyYW51bGFyaXR5W10gPSBbXG4gIHtcbiAgICBvcmRlcjogMCxcbiAgICBrZXk6IFRpbWVHcmFudWxhcml0eUtleS5TRUNPTkQsXG4gICAgaW50ZXJ2YWw6IHRpbWVTZWNvbmQsXG4gICAgZm9ybWF0OiBmb3JtYXRTZWNvbmQsXG4gICAgZm9ybWF0RnVsbDogdGltZUZvcm1hdCgnJVktJW0tJWQgJUg6JU06JVMnKSxcbiAgfSxcbiAge1xuICAgIG9yZGVyOiAxLFxuICAgIGtleTogVGltZUdyYW51bGFyaXR5S2V5Lk1JTlVURSxcbiAgICBpbnRlcnZhbDogdGltZU1pbnV0ZSxcbiAgICBmb3JtYXQ6IGZvcm1hdE1pbnV0ZSxcbiAgICBmb3JtYXRGdWxsOiB0aW1lRm9ybWF0KCclWS0lbS0lZCAlSDolTScpLFxuICB9LFxuICB7XG4gICAgb3JkZXI6IDIsXG4gICAga2V5OiBUaW1lR3JhbnVsYXJpdHlLZXkuSE9VUixcbiAgICBpbnRlcnZhbDogdGltZUhvdXIsXG4gICAgLy8gZm9ybWF0OiAoZDogRGF0ZSkgPT4gZC50b0xvY2FsZVN0cmluZyhwcmVmZXJyZWRMb2NhbGUsIHsgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KSxcbiAgICBmb3JtYXQ6IGZvcm1hdEhvdXIsXG4gICAgZm9ybWF0RnVsbDogdGltZUZvcm1hdCgnJWEgJWQgJWIgJVksICVJICVwJyksXG4gIH0sXG4gIHtcbiAgICBvcmRlcjogMyxcbiAgICBrZXk6IFRpbWVHcmFudWxhcml0eUtleS5EQVksXG4gICAgaW50ZXJ2YWw6IHRpbWVEYXksXG4gICAgZm9ybWF0OiBmb3JtYXREYXksXG4gICAgZm9ybWF0RnVsbDogdGltZUZvcm1hdCgnJWEgJWQgJWIgJVknKSxcbiAgfSxcbiAge1xuICAgIG9yZGVyOiA0LFxuICAgIGtleTogVGltZUdyYW51bGFyaXR5S2V5Lk1PTlRILFxuICAgIGludGVydmFsOiB0aW1lTW9udGgsXG4gICAgZm9ybWF0OiBmb3JtYXRNb250aCxcbiAgICBmb3JtYXRGdWxsOiB0aW1lRm9ybWF0KCclYiAlWScpLFxuICB9LFxuICB7XG4gICAgb3JkZXI6IDUsXG4gICAga2V5OiBUaW1lR3JhbnVsYXJpdHlLZXkuWUVBUixcbiAgICBpbnRlcnZhbDogdGltZVllYXIsXG4gICAgZm9ybWF0OiBmb3JtYXRZZWFyLFxuICAgIGZvcm1hdEZ1bGw6IHRpbWVGb3JtYXQoJyVZJyksXG4gIH0sXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZUdyYW51bGFyaXR5QnlLZXkoa2V5OiBUaW1lR3JhbnVsYXJpdHlLZXkpIHtcbiAgcmV0dXJuIFRJTUVfR1JBTlVMQVJJVElFUy5maW5kKChzKSA9PiBzLmtleSA9PT0ga2V5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVHcmFudWxhcml0eUJ5T3JkZXIob3JkZXI6IG51bWJlcikge1xuICByZXR1cm4gVElNRV9HUkFOVUxBUklUSUVTLmZpbmQoKHMpID0+IHMub3JkZXIgPT09IG9yZGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVHcmFudWxhcml0eUZvckRhdGUoZGF0ZTogRGF0ZSk6IFRpbWVHcmFudWxhcml0eSB7XG4gIGxldCBwcmV2ID0gdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGN1cnJlbnQgb2YgVElNRV9HUkFOVUxBUklUSUVTKSB7XG4gICAgY29uc3Qge2ludGVydmFsfSA9IGN1cnJlbnQ7XG4gICAgY29uc3QgZmxvb3JlZCA9IGludGVydmFsKGRhdGUpO1xuICAgIGlmIChmbG9vcmVkIDwgZGF0ZSkge1xuICAgICAgaWYgKCFwcmV2KSByZXR1cm4gY3VycmVudDtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH1cbiAgICBwcmV2ID0gY3VycmVudDtcbiAgfVxuICByZXR1cm4gVElNRV9HUkFOVUxBUklUSUVTW1RJTUVfR1JBTlVMQVJJVElFUy5sZW5ndGggLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZVJhbmdlc0VxdWFsKFxuICBhOiBbRGF0ZSwgRGF0ZV0gfCB1bmRlZmluZWQsXG4gIGI6IFtEYXRlLCBEYXRlXSB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWEgJiYgIWIpIHJldHVybiB0cnVlO1xuICBpZiAoIWEgfHwgIWIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXTtcbn1cbiJdfQ==