diff --git a/.coverage_json/coverage-summary.json b/.coverage_json/coverage-summary.json index c39538b47..c12e4694c 100644 --- a/.coverage_json/coverage-summary.json +++ b/.coverage_json/coverage-summary.json @@ -1 +1,872 @@ -{"total":{"lines":{"total":2792,"covered":2696,"skipped":0,"pct":96.56},"statements":{"total":2886,"covered":2778,"skipped":0,"pct":96.25},"functions":{"total":518,"covered":507,"skipped":0,"pct":97.87},"branches":{"total":1679,"covered":1541,"skipped":0,"pct":91.78},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/cache-memory/src/index.js":{"lines":{"total":23,"covered":23,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":23,"covered":23,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}},"packages/core/src/index.js":{"lines":{"total":56,"covered":56,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":56,"covered":56,"skipped":0,"pct":100},"branches":{"total":22,"covered":22,"skipped":0,"pct":100}},"packages/core/src/data-provider/extend-controller.js":{"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":11,"covered":11,"skipped":0,"pct":100},"branches":{"total":5,"covered":5,"skipped":0,"pct":100}},"packages/core/src/data-provider/extend-model.js":{"lines":{"total":115,"covered":115,"skipped":0,"pct":100},"functions":{"total":13,"covered":13,"skipped":0,"pct":100},"statements":{"total":115,"covered":115,"skipped":0,"pct":100},"branches":{"total":77,"covered":77,"skipped":0,"pct":100}},"packages/core/src/data-provider/index.js":{"lines":{"total":57,"covered":57,"skipped":0,"pct":100},"functions":{"total":10,"covered":10,"skipped":0,"pct":100},"statements":{"total":57,"covered":57,"skipped":0,"pct":100},"branches":{"total":22,"covered":22,"skipped":0,"pct":100}},"packages/core/src/data-provider/provider-route.js":{"lines":{"total":17,"covered":17,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":17,"covered":17,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}},"packages/core/src/data-provider/helpers/compose-route-path.js":{"lines":{"total":19,"covered":19,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":19,"covered":19,"skipped":0,"pct":100},"branches":{"total":18,"covered":18,"skipped":0,"pct":100}},"packages/core/src/data-provider/helpers/index.js":{"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/core/src/data-provider/helpers/route-joiner.js":{"lines":{"total":6,"covered":6,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":7,"covered":7,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}},"packages/featureserver/src/index.js":{"lines":{"total":3,"covered":3,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":3,"covered":3,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/featureserver/src/layer-metadata.js":{"lines":{"total":5,"covered":5,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":5,"covered":5,"skipped":0,"pct":100},"branches":{"total":4,"covered":2,"skipped":0,"pct":50}},"packages/featureserver/src/layers-metadata.js":{"lines":{"total":8,"covered":8,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":1,"covered":1,"skipped":0,"pct":100}},"packages/featureserver/src/log-manager.js":{"lines":{"total":12,"covered":5,"skipped":0,"pct":41.66},"functions":{"total":2,"covered":1,"skipped":0,"pct":50},"statements":{"total":12,"covered":5,"skipped":0,"pct":41.66},"branches":{"total":4,"covered":0,"skipped":0,"pct":0}},"packages/featureserver/src/metadata-defaults.js":{"lines":{"total":29,"covered":29,"skipped":0,"pct":100},"functions":{"total":8,"covered":8,"skipped":0,"pct":100},"statements":{"total":29,"covered":29,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}},"packages/featureserver/src/queryRelatedRecords.js":{"lines":{"total":26,"covered":4,"skipped":0,"pct":15.38},"functions":{"total":4,"covered":0,"skipped":0,"pct":0},"statements":{"total":27,"covered":4,"skipped":0,"pct":14.81},"branches":{"total":16,"covered":0,"skipped":0,"pct":0}},"packages/featureserver/src/rest-info-route-handler.js":{"lines":{"total":7,"covered":7,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":7,"covered":7,"skipped":0,"pct":100},"branches":{"total":1,"covered":1,"skipped":0,"pct":100}},"packages/featureserver/src/route.js":{"lines":{"total":56,"covered":48,"skipped":0,"pct":85.71},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":56,"covered":48,"skipped":0,"pct":85.71},"branches":{"total":34,"covered":26,"skipped":0,"pct":76.47}},"packages/featureserver/src/server-info-route-handler.js":{"lines":{"total":54,"covered":53,"skipped":0,"pct":98.14},"functions":{"total":13,"covered":13,"skipped":0,"pct":100},"statements":{"total":54,"covered":53,"skipped":0,"pct":98.14},"branches":{"total":46,"covered":46,"skipped":0,"pct":100}},"packages/featureserver/src/generate-renderer/color-ramp.js":{"lines":{"total":23,"covered":23,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":23,"covered":23,"skipped":0,"pct":100},"branches":{"total":21,"covered":21,"skipped":0,"pct":100}},"packages/featureserver/src/generate-renderer/create-symbol.js":{"lines":{"total":14,"covered":14,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":14,"covered":14,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}},"packages/featureserver/src/generate-renderer/index.js":{"lines":{"total":42,"covered":42,"skipped":0,"pct":100},"functions":{"total":13,"covered":13,"skipped":0,"pct":100},"statements":{"total":43,"covered":43,"skipped":0,"pct":100},"branches":{"total":17,"covered":17,"skipped":0,"pct":100}},"packages/featureserver/src/generate-renderer/validate-classification-definition.js":{"lines":{"total":31,"covered":31,"skipped":0,"pct":100},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":32,"covered":32,"skipped":0,"pct":100},"branches":{"total":18,"covered":18,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/data-type-utils.js":{"lines":{"total":13,"covered":13,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":16,"covered":16,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/errors.js":{"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/esri-units-lookup.js":{"lines":{"total":13,"covered":12,"skipped":0,"pct":92.3},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":13,"covered":12,"skipped":0,"pct":92.3},"branches":{"total":16,"covered":15,"skipped":0,"pct":93.75}},"packages/featureserver/src/helpers/feature-layer-metadata.js":{"lines":{"total":49,"covered":46,"skipped":0,"pct":93.87},"functions":{"total":8,"covered":8,"skipped":0,"pct":100},"statements":{"total":49,"covered":46,"skipped":0,"pct":93.87},"branches":{"total":19,"covered":14,"skipped":0,"pct":73.68}},"packages/featureserver/src/helpers/get-collection-crs.js":{"lines":{"total":14,"covered":14,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":15,"covered":15,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/get-geometry-type-from-geojson.js":{"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/get-spatial-reference.js":{"lines":{"total":11,"covered":10,"skipped":0,"pct":90.9},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":13,"covered":11,"skipped":0,"pct":84.61},"branches":{"total":14,"covered":11,"skipped":0,"pct":78.57}},"packages/featureserver/src/helpers/index.js":{"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/is-geojson-table.js":{"lines":{"total":10,"covered":9,"skipped":0,"pct":90},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":11,"covered":10,"skipped":0,"pct":90.9},"branches":{"total":12,"covered":7,"skipped":0,"pct":58.33}},"packages/featureserver/src/helpers/normalize-extent.js":{"lines":{"total":21,"covered":21,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":23,"covered":23,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/normalize-input-data.js":{"lines":{"total":5,"covered":5,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":5,"covered":5,"skipped":0,"pct":100},"branches":{"total":13,"covered":13,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/normalize-request-params.js":{"lines":{"total":16,"covered":16,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":16,"covered":16,"skipped":0,"pct":100},"branches":{"total":9,"covered":9,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/normalize-spatial-reference.js":{"lines":{"total":43,"covered":43,"skipped":0,"pct":100},"functions":{"total":8,"covered":8,"skipped":0,"pct":100},"statements":{"total":46,"covered":45,"skipped":0,"pct":97.82},"branches":{"total":34,"covered":31,"skipped":0,"pct":91.17}},"packages/featureserver/src/helpers/renderers.js":{"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/server-metadata.js":{"lines":{"total":25,"covered":25,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":25,"covered":25,"skipped":0,"pct":100},"branches":{"total":14,"covered":14,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/table-layer-metadata.js":{"lines":{"total":76,"covered":75,"skipped":0,"pct":98.68},"functions":{"total":17,"covered":17,"skipped":0,"pct":100},"statements":{"total":77,"covered":76,"skipped":0,"pct":98.7},"branches":{"total":49,"covered":44,"skipped":0,"pct":89.79}},"packages/featureserver/src/helpers/validate-inputs.js":{"lines":{"total":24,"covered":24,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":24,"covered":24,"skipped":0,"pct":100},"branches":{"total":9,"covered":8,"skipped":0,"pct":88.88}},"packages/featureserver/src/helpers/fields/constants.js":{"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/fields/esri-type-utils.js":{"lines":{"total":18,"covered":18,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":18,"covered":18,"skipped":0,"pct":100},"branches":{"total":14,"covered":14,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/fields/field-classes.js":{"lines":{"total":51,"covered":50,"skipped":0,"pct":98.03},"functions":{"total":9,"covered":9,"skipped":0,"pct":100},"statements":{"total":51,"covered":50,"skipped":0,"pct":98.03},"branches":{"total":20,"covered":17,"skipped":0,"pct":85}},"packages/featureserver/src/helpers/fields/fields.js":{"lines":{"total":33,"covered":32,"skipped":0,"pct":96.96},"functions":{"total":13,"covered":13,"skipped":0,"pct":100},"statements":{"total":35,"covered":34,"skipped":0,"pct":97.14},"branches":{"total":24,"covered":22,"skipped":0,"pct":91.66}},"packages/featureserver/src/helpers/fields/index.js":{"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/fields/layer-fields.js":{"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":11,"covered":11,"skipped":0,"pct":100},"branches":{"total":5,"covered":5,"skipped":0,"pct":100}},"packages/featureserver/src/helpers/fields/query-fields.js":{"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":6,"covered":4,"skipped":0,"pct":66.66}},"packages/featureserver/src/helpers/fields/statistics-fields.js":{"lines":{"total":35,"covered":34,"skipped":0,"pct":97.14},"functions":{"total":14,"covered":14,"skipped":0,"pct":100},"statements":{"total":37,"covered":36,"skipped":0,"pct":97.29},"branches":{"total":25,"covered":20,"skipped":0,"pct":80}},"packages/featureserver/src/query/filter-and-transform.js":{"lines":{"total":40,"covered":40,"skipped":0,"pct":100},"functions":{"total":9,"covered":9,"skipped":0,"pct":100},"statements":{"total":40,"covered":40,"skipped":0,"pct":100},"branches":{"total":28,"covered":28,"skipped":0,"pct":100}},"packages/featureserver/src/query/index.js":{"lines":{"total":44,"covered":44,"skipped":0,"pct":100},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":44,"covered":44,"skipped":0,"pct":100},"branches":{"total":35,"covered":33,"skipped":0,"pct":94.28}},"packages/featureserver/src/query/log-provider-data-warnings.js":{"lines":{"total":36,"covered":35,"skipped":0,"pct":97.22},"functions":{"total":11,"covered":11,"skipped":0,"pct":100},"statements":{"total":36,"covered":35,"skipped":0,"pct":97.22},"branches":{"total":47,"covered":46,"skipped":0,"pct":97.87}},"packages/featureserver/src/query/render-count-and-extent.js":{"lines":{"total":19,"covered":19,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":19,"covered":19,"skipped":0,"pct":100},"branches":{"total":14,"covered":14,"skipped":0,"pct":100}},"packages/featureserver/src/query/render-features.js":{"lines":{"total":21,"covered":21,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":21,"covered":21,"skipped":0,"pct":100},"branches":{"total":24,"covered":24,"skipped":0,"pct":100}},"packages/featureserver/src/query/render-precalculated-statistics.js":{"lines":{"total":14,"covered":14,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":14,"covered":14,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}},"packages/featureserver/src/query/render-statistics.js":{"lines":{"total":8,"covered":8,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":4,"covered":2,"skipped":0,"pct":50}},"packages/featureserver/src/query/validate-query-request-parameters.js":{"lines":{"total":13,"covered":13,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}},"packages/featureserver/src/response-handlers/general-response-handler.js":{"lines":{"total":8,"covered":8,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}},"packages/featureserver/src/response-handlers/index.js":{"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/featureserver/src/response-handlers/query-response-handler.js":{"lines":{"total":10,"covered":10,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":10,"covered":10,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}},"packages/featureserver/src/response-handlers/helpers/index.js":{"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/featureserver/src/response-handlers/helpers/send-callback.js":{"lines":{"total":5,"covered":5,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":5,"covered":5,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/featureserver/src/response-handlers/helpers/send-pretty-json.js":{"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/featureserver/src/response-handlers/helpers/send-pbf/get-geometry-transform.js":{"lines":{"total":25,"covered":25,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":25,"covered":25,"skipped":0,"pct":100},"branches":{"total":19,"covered":19,"skipped":0,"pct":100}},"packages/featureserver/src/response-handlers/helpers/send-pbf/index.js":{"lines":{"total":29,"covered":29,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":29,"covered":29,"skipped":0,"pct":100},"branches":{"total":8,"covered":8,"skipped":0,"pct":100}},"packages/featureserver/src/response-handlers/helpers/send-pbf/transform-features-for-pbf.js":{"lines":{"total":18,"covered":18,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":18,"covered":18,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}},"packages/featureserver/src/response-handlers/helpers/send-pbf/transform-to-pbf-attributes.js":{"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":11,"covered":11,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}},"packages/featureserver/src/response-handlers/helpers/send-pbf/transform-to-pbf-geometry.js":{"lines":{"total":63,"covered":63,"skipped":0,"pct":100},"functions":{"total":18,"covered":18,"skipped":0,"pct":100},"statements":{"total":66,"covered":66,"skipped":0,"pct":100},"branches":{"total":22,"covered":22,"skipped":0,"pct":100}},"packages/logger/src/index.js":{"lines":{"total":30,"covered":12,"skipped":0,"pct":40},"functions":{"total":5,"covered":2,"skipped":0,"pct":40},"statements":{"total":32,"covered":12,"skipped":0,"pct":37.5},"branches":{"total":22,"covered":7,"skipped":0,"pct":31.81}},"packages/output-geoservices/src/index.js":{"lines":{"total":250,"covered":250,"skipped":0,"pct":100},"functions":{"total":15,"covered":15,"skipped":0,"pct":100},"statements":{"total":250,"covered":250,"skipped":0,"pct":100},"branches":{"total":52,"covered":51,"skipped":0,"pct":98.07}},"packages/winnow/src/errors.js":{"lines":{"total":8,"covered":8,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":2,"covered":1,"skipped":0,"pct":50}},"packages/winnow/src/index.js":{"lines":{"total":4,"covered":0,"skipped":0,"pct":0},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":4,"covered":0,"skipped":0,"pct":0},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/log-manager.js":{"lines":{"total":10,"covered":4,"skipped":0,"pct":40},"functions":{"total":2,"covered":1,"skipped":0,"pct":50},"statements":{"total":10,"covered":4,"skipped":0,"pct":40},"branches":{"total":4,"covered":0,"skipped":0,"pct":0}},"packages/winnow/src/calculate-class-breaks/calculate-std-dev-intervals.js":{"lines":{"total":16,"covered":16,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":17,"covered":17,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/calculate-class-breaks/filter-and-validate-classification-features.js":{"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":11,"covered":11,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}},"packages/winnow/src/calculate-class-breaks/index.js":{"lines":{"total":28,"covered":26,"skipped":0,"pct":92.85},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":31,"covered":28,"skipped":0,"pct":90.32},"branches":{"total":20,"covered":16,"skipped":0,"pct":80}},"packages/winnow/src/calculate-class-breaks/normalize-classification-values.js":{"lines":{"total":49,"covered":49,"skipped":0,"pct":100},"functions":{"total":11,"covered":11,"skipped":0,"pct":100},"statements":{"total":49,"covered":49,"skipped":0,"pct":100},"branches":{"total":36,"covered":34,"skipped":0,"pct":94.44}},"packages/winnow/src/calculate-class-breaks/transform-class-breaks-to-ranges.js":{"lines":{"total":28,"covered":28,"skipped":0,"pct":100},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":30,"covered":29,"skipped":0,"pct":96.66},"branches":{"total":13,"covered":12,"skipped":0,"pct":92.3}},"packages/winnow/src/filter-and-transform/filter-and-transform.js":{"lines":{"total":18,"covered":18,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":18,"covered":18,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/index.js":{"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/prepare-filter-and-transform.js":{"lines":{"total":15,"covered":15,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":19,"covered":18,"skipped":0,"pct":94.73},"branches":{"total":18,"covered":17,"skipped":0,"pct":94.44}},"packages/winnow/src/filter-and-transform/filters/contains.js":{"lines":{"total":7,"covered":7,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":9,"covered":9,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/filters/envelope-intersects.js":{"lines":{"total":17,"covered":17,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":20,"covered":19,"skipped":0,"pct":95},"branches":{"total":17,"covered":15,"skipped":0,"pct":88.23}},"packages/winnow/src/filter-and-transform/filters/hashed-objectid-comparator.js":{"lines":{"total":21,"covered":21,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":21,"covered":21,"skipped":0,"pct":100},"branches":{"total":26,"covered":26,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/filters/index.js":{"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/filters/intersects.js":{"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":14,"covered":14,"skipped":0,"pct":100},"branches":{"total":16,"covered":16,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/filters/within.js":{"lines":{"total":7,"covered":7,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":9,"covered":9,"skipped":0,"pct":100},"branches":{"total":9,"covered":9,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/helpers/create-integer-hash.js":{"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/helpers/hash-fixture.js":{"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/helpers/hash-function.js":{"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":12,"covered":12,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/helpers/index.js":{"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/transforms/index.js":{"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/transforms/project.js":{"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":13,"covered":12,"skipped":0,"pct":92.3},"branches":{"total":8,"covered":7,"skipped":0,"pct":87.5}},"packages/winnow/src/filter-and-transform/transforms/reduce-precision.js":{"lines":{"total":9,"covered":9,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":11,"covered":11,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/transforms/select-fields-to-esri-attributes.js":{"lines":{"total":6,"covered":3,"skipped":0,"pct":50},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":6,"covered":3,"skipped":0,"pct":50},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/transforms/select-fields.js":{"lines":{"total":4,"covered":2,"skipped":0,"pct":50},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":4,"covered":2,"skipped":0,"pct":50},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/transforms/to-esri-attributes.js":{"lines":{"total":26,"covered":26,"skipped":0,"pct":100},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":26,"covered":26,"skipped":0,"pct":100},"branches":{"total":25,"covered":25,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/transforms/to-esri-geometry.js":{"lines":{"total":7,"covered":7,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":9,"covered":9,"skipped":0,"pct":100},"branches":{"total":7,"covered":7,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/transforms/to-geohash.js":{"lines":{"total":9,"covered":9,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":10,"covered":10,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}},"packages/winnow/src/filter-and-transform/transforms/to-hash.js":{"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":5,"covered":5,"skipped":0,"pct":100},"branches":{"total":3,"covered":3,"skipped":0,"pct":100}},"packages/winnow/src/helpers/project-coordinates.js":{"lines":{"total":10,"covered":9,"skipped":0,"pct":90},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":11,"covered":10,"skipped":0,"pct":90.9},"branches":{"total":9,"covered":8,"skipped":0,"pct":88.88}},"packages/winnow/src/helpers/transform-coordinates.js":{"lines":{"total":5,"covered":5,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":5,"covered":5,"skipped":0,"pct":100},"branches":{"total":3,"covered":2,"skipped":0,"pct":66.66}},"packages/winnow/src/normalize-query-options/aggregates.js":{"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":12,"covered":12,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/classification.js":{"lines":{"total":23,"covered":21,"skipped":0,"pct":91.3},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":24,"covered":22,"skipped":0,"pct":91.66},"branches":{"total":21,"covered":17,"skipped":0,"pct":80.95}},"packages/winnow/src/normalize-query-options/collection.js":{"lines":{"total":14,"covered":14,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":16,"covered":15,"skipped":0,"pct":93.75},"branches":{"total":11,"covered":9,"skipped":0,"pct":81.81}},"packages/winnow/src/normalize-query-options/date-fields.js":{"lines":{"total":6,"covered":6,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":7,"covered":7,"skipped":0,"pct":100},"branches":{"total":5,"covered":5,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/fields.js":{"lines":{"total":10,"covered":10,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/geometry-filter-spatial-reference.js":{"lines":{"total":16,"covered":16,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":19,"covered":19,"skipped":0,"pct":100},"branches":{"total":19,"covered":19,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/geometry-filter.js":{"lines":{"total":32,"covered":31,"skipped":0,"pct":96.87},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":33,"covered":32,"skipped":0,"pct":96.96},"branches":{"total":26,"covered":22,"skipped":0,"pct":84.61}},"packages/winnow/src/normalize-query-options/group-by.js":{"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/id-field.js":{"lines":{"total":20,"covered":20,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":20,"covered":20,"skipped":0,"pct":100},"branches":{"total":21,"covered":20,"skipped":0,"pct":95.23}},"packages/winnow/src/normalize-query-options/index.js":{"lines":{"total":23,"covered":23,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":23,"covered":23,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/limit.js":{"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":15,"covered":15,"skipped":0,"pct":100},"branches":{"total":14,"covered":14,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/object-ids.js":{"lines":{"total":13,"covered":13,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/offset.js":{"lines":{"total":2,"covered":2,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":2,"covered":2,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/order.js":{"lines":{"total":5,"covered":5,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":6,"covered":6,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/output-data-spatial-reference.js":{"lines":{"total":10,"covered":10,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":10,"covered":10,"skipped":0,"pct":100},"branches":{"total":14,"covered":14,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/source-data-spatial-reference.js":{"lines":{"total":10,"covered":9,"skipped":0,"pct":90},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":11,"covered":10,"skipped":0,"pct":90.9},"branches":{"total":10,"covered":8,"skipped":0,"pct":80}},"packages/winnow/src/normalize-query-options/spatial-predicate.js":{"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":5,"covered":5,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/spatial-reference.js":{"lines":{"total":47,"covered":47,"skipped":0,"pct":100},"functions":{"total":9,"covered":9,"skipped":0,"pct":100},"statements":{"total":52,"covered":51,"skipped":0,"pct":98.07},"branches":{"total":34,"covered":32,"skipped":0,"pct":94.11}},"packages/winnow/src/normalize-query-options/where.js":{"lines":{"total":16,"covered":16,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":16,"covered":16,"skipped":0,"pct":100},"branches":{"total":9,"covered":9,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/helpers/detect-esri-field-type.js":{"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":11,"covered":11,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/helpers/get-collection-crs.js":{"lines":{"total":15,"covered":15,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":15,"covered":15,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/helpers/index.js":{"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/normalize-query-options/helpers/normalize-array.js":{"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":6,"covered":6,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}},"packages/winnow/src/query/classification-query.js":{"lines":{"total":18,"covered":16,"skipped":0,"pct":88.88},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":19,"covered":17,"skipped":0,"pct":89.47},"branches":{"total":10,"covered":8,"skipped":0,"pct":80}},"packages/winnow/src/query/index.js":{"lines":{"total":1,"covered":0,"skipped":0,"pct":0},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":0,"skipped":0,"pct":0},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/query/normalize-query-input.js":{"lines":{"total":19,"covered":19,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":23,"covered":23,"skipped":0,"pct":100},"branches":{"total":19,"covered":19,"skipped":0,"pct":100}},"packages/winnow/src/query/package-features.js":{"lines":{"total":13,"covered":11,"skipped":0,"pct":84.61},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":13,"covered":11,"skipped":0,"pct":84.61},"branches":{"total":18,"covered":12,"skipped":0,"pct":66.66}},"packages/winnow/src/query/prepare-query.js":{"lines":{"total":24,"covered":24,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":24,"covered":24,"skipped":0,"pct":100},"branches":{"total":4,"covered":2,"skipped":0,"pct":50}},"packages/winnow/src/query/query.js":{"lines":{"total":18,"covered":18,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":19,"covered":19,"skipped":0,"pct":100},"branches":{"total":5,"covered":4,"skipped":0,"pct":80}},"packages/winnow/src/query/standard-query.js":{"lines":{"total":15,"covered":15,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":15,"covered":15,"skipped":0,"pct":100},"branches":{"total":8,"covered":8,"skipped":0,"pct":100}},"packages/winnow/src/query/unique-value-query.js":{"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":5,"covered":4,"skipped":0,"pct":80}},"packages/winnow/src/sql-query-builder/create-sql-params.js":{"lines":{"total":13,"covered":13,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":16,"covered":13,"skipped":0,"pct":81.25}},"packages/winnow/src/sql-query-builder/create-sql-string.js":{"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":12,"covered":12,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}},"packages/winnow/src/sql-query-builder/group-by.js":{"lines":{"total":6,"covered":6,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":7,"covered":7,"skipped":0,"pct":100},"branches":{"total":5,"covered":5,"skipped":0,"pct":100}},"packages/winnow/src/sql-query-builder/index.js":{"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}},"packages/winnow/src/sql-query-builder/is-different-crs.js":{"lines":{"total":2,"covered":2,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":2,"covered":2,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}},"packages/winnow/src/sql-query-builder/order-by.js":{"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}},"packages/winnow/src/sql-query-builder/select/aggregation-select.js":{"lines":{"total":12,"covered":10,"skipped":0,"pct":83.33},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":13,"covered":11,"skipped":0,"pct":84.61},"branches":{"total":6,"covered":3,"skipped":0,"pct":50}},"packages/winnow/src/sql-query-builder/select/fields-select-fragment.js":{"lines":{"total":16,"covered":16,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":17,"covered":17,"skipped":0,"pct":100},"branches":{"total":14,"covered":13,"skipped":0,"pct":92.85}},"packages/winnow/src/sql-query-builder/select/geometry-select-fragment.js":{"lines":{"total":16,"covered":16,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":16,"covered":16,"skipped":0,"pct":100},"branches":{"total":11,"covered":11,"skipped":0,"pct":100}},"packages/winnow/src/sql-query-builder/select/index.js":{"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":12,"covered":12,"skipped":0,"pct":100},"branches":{"total":7,"covered":7,"skipped":0,"pct":100}},"packages/winnow/src/sql-query-builder/where-builder/index.js":{"lines":{"total":78,"covered":78,"skipped":0,"pct":100},"functions":{"total":17,"covered":17,"skipped":0,"pct":100},"statements":{"total":78,"covered":78,"skipped":0,"pct":100},"branches":{"total":50,"covered":50,"skipped":0,"pct":100}},"packages/winnow/src/sql-query-builder/where-builder/to-json-where.js":{"lines":{"total":51,"covered":51,"skipped":0,"pct":100},"functions":{"total":15,"covered":15,"skipped":0,"pct":100},"statements":{"total":55,"covered":55,"skipped":0,"pct":100},"branches":{"total":30,"covered":30,"skipped":0,"pct":100}}} \ No newline at end of file +{ + "total": { + "lines": { "total": 2812, "covered": 2713, "skipped": 0, "pct": 96.47 }, + "statements": { + "total": 2889, + "covered": 2781, + "skipped": 0, + "pct": 96.26 + }, + "functions": { "total": 518, "covered": 507, "skipped": 0, "pct": 97.87 }, + "branches": { "total": 1676, "covered": 1539, "skipped": 0, "pct": 91.82 }, + "branchesTrue": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/cache-memory/src/index.js": { + "lines": { "total": 23, "covered": 23, "skipped": 0, "pct": 100 }, + "functions": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "statements": { "total": 23, "covered": 23, "skipped": 0, "pct": 100 }, + "branches": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 } + }, + "packages/core/src/index.js": { + "lines": { "total": 56, "covered": 56, "skipped": 0, "pct": 100 }, + "functions": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "statements": { "total": 56, "covered": 56, "skipped": 0, "pct": 100 }, + "branches": { "total": 22, "covered": 22, "skipped": 0, "pct": 100 } + }, + "packages/core/src/data-provider/extend-controller.js": { + "lines": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "functions": { "total": 3, "covered": 3, "skipped": 0, "pct": 100 }, + "statements": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "branches": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 } + }, + "packages/core/src/data-provider/extend-model.js": { + "lines": { "total": 115, "covered": 115, "skipped": 0, "pct": 100 }, + "functions": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "statements": { "total": 115, "covered": 115, "skipped": 0, "pct": 100 }, + "branches": { "total": 75, "covered": 75, "skipped": 0, "pct": 100 } + }, + "packages/core/src/data-provider/index.js": { + "lines": { "total": 57, "covered": 57, "skipped": 0, "pct": 100 }, + "functions": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 }, + "statements": { "total": 57, "covered": 57, "skipped": 0, "pct": 100 }, + "branches": { "total": 22, "covered": 22, "skipped": 0, "pct": 100 } + }, + "packages/core/src/data-provider/provider-route.js": { + "lines": { "total": 17, "covered": 17, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 17, "covered": 17, "skipped": 0, "pct": 100 }, + "branches": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 } + }, + "packages/core/src/data-provider/helpers/compose-route-path.js": { + "lines": { "total": 19, "covered": 19, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 19, "covered": 19, "skipped": 0, "pct": 100 }, + "branches": { "total": 18, "covered": 18, "skipped": 0, "pct": 100 } + }, + "packages/core/src/data-provider/helpers/index.js": { + "lines": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/core/src/data-provider/helpers/route-joiner.js": { + "lines": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 7, "covered": 7, "skipped": 0, "pct": 100 }, + "branches": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/index.js": { + "lines": { "total": 3, "covered": 3, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 3, "covered": 3, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/layer-metadata.js": { + "lines": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "branches": { "total": 4, "covered": 2, "skipped": 0, "pct": 50 } + }, + "packages/featureserver/src/layers-metadata.js": { + "lines": { "total": 8, "covered": 8, "skipped": 0, "pct": 100 }, + "functions": { "total": 3, "covered": 3, "skipped": 0, "pct": 100 }, + "statements": { "total": 8, "covered": 8, "skipped": 0, "pct": 100 }, + "branches": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/log-manager.js": { + "lines": { "total": 12, "covered": 5, "skipped": 0, "pct": 41.66 }, + "functions": { "total": 2, "covered": 1, "skipped": 0, "pct": 50 }, + "statements": { "total": 12, "covered": 5, "skipped": 0, "pct": 41.66 }, + "branches": { "total": 4, "covered": 0, "skipped": 0, "pct": 0 } + }, + "packages/featureserver/src/metadata-defaults.js": { + "lines": { "total": 29, "covered": 29, "skipped": 0, "pct": 100 }, + "functions": { "total": 8, "covered": 8, "skipped": 0, "pct": 100 }, + "statements": { "total": 29, "covered": 29, "skipped": 0, "pct": 100 }, + "branches": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/queryRelatedRecords.js": { + "lines": { "total": 27, "covered": 4, "skipped": 0, "pct": 14.81 }, + "functions": { "total": 4, "covered": 0, "skipped": 0, "pct": 0 }, + "statements": { "total": 27, "covered": 4, "skipped": 0, "pct": 14.81 }, + "branches": { "total": 16, "covered": 0, "skipped": 0, "pct": 0 } + }, + "packages/featureserver/src/rest-info-route-handler.js": { + "lines": { "total": 7, "covered": 7, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 7, "covered": 7, "skipped": 0, "pct": 100 }, + "branches": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/route.js": { + "lines": { "total": 56, "covered": 48, "skipped": 0, "pct": 85.71 }, + "functions": { "total": 7, "covered": 7, "skipped": 0, "pct": 100 }, + "statements": { "total": 56, "covered": 48, "skipped": 0, "pct": 85.71 }, + "branches": { "total": 34, "covered": 26, "skipped": 0, "pct": 76.47 } + }, + "packages/featureserver/src/server-info-route-handler.js": { + "lines": { "total": 54, "covered": 53, "skipped": 0, "pct": 98.14 }, + "functions": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "statements": { "total": 54, "covered": 53, "skipped": 0, "pct": 98.14 }, + "branches": { "total": 46, "covered": 46, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/generate-renderer/color-ramp.js": { + "lines": { "total": 23, "covered": 23, "skipped": 0, "pct": 100 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 23, "covered": 23, "skipped": 0, "pct": 100 }, + "branches": { "total": 21, "covered": 21, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/generate-renderer/create-symbol.js": { + "lines": { "total": 14, "covered": 14, "skipped": 0, "pct": 100 }, + "functions": { "total": 3, "covered": 3, "skipped": 0, "pct": 100 }, + "statements": { "total": 14, "covered": 14, "skipped": 0, "pct": 100 }, + "branches": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/generate-renderer/index.js": { + "lines": { "total": 42, "covered": 42, "skipped": 0, "pct": 100 }, + "functions": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "statements": { "total": 43, "covered": 43, "skipped": 0, "pct": 100 }, + "branches": { "total": 17, "covered": 17, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/generate-renderer/validate-classification-definition.js": { + "lines": { "total": 32, "covered": 32, "skipped": 0, "pct": 100 }, + "functions": { "total": 7, "covered": 7, "skipped": 0, "pct": 100 }, + "statements": { "total": 32, "covered": 32, "skipped": 0, "pct": 100 }, + "branches": { "total": 18, "covered": 18, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/data-type-utils.js": { + "lines": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "branches": { "total": 16, "covered": 16, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/errors.js": { + "lines": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "branches": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/esri-units-lookup.js": { + "lines": { "total": 13, "covered": 12, "skipped": 0, "pct": 92.3 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 12, "skipped": 0, "pct": 92.3 }, + "branches": { "total": 16, "covered": 15, "skipped": 0, "pct": 93.75 } + }, + "packages/featureserver/src/helpers/feature-layer-metadata.js": { + "lines": { "total": 49, "covered": 46, "skipped": 0, "pct": 93.87 }, + "functions": { "total": 8, "covered": 8, "skipped": 0, "pct": 100 }, + "statements": { "total": 49, "covered": 46, "skipped": 0, "pct": 93.87 }, + "branches": { "total": 19, "covered": 14, "skipped": 0, "pct": 73.68 } + }, + "packages/featureserver/src/helpers/get-collection-crs.js": { + "lines": { "total": 14, "covered": 14, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 15, "covered": 15, "skipped": 0, "pct": 100 }, + "branches": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/get-geometry-type-from-geojson.js": { + "lines": { "total": 12, "covered": 12, "skipped": 0, "pct": 100 }, + "functions": { "total": 3, "covered": 3, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "branches": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/get-spatial-reference.js": { + "lines": { "total": 11, "covered": 10, "skipped": 0, "pct": 90.9 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 11, "skipped": 0, "pct": 84.61 }, + "branches": { "total": 14, "covered": 11, "skipped": 0, "pct": 78.57 } + }, + "packages/featureserver/src/helpers/index.js": { + "lines": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/is-geojson-table.js": { + "lines": { "total": 10, "covered": 9, "skipped": 0, "pct": 90 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 11, "covered": 10, "skipped": 0, "pct": 90.9 }, + "branches": { "total": 12, "covered": 7, "skipped": 0, "pct": 58.33 } + }, + "packages/featureserver/src/helpers/normalize-extent.js": { + "lines": { "total": 21, "covered": 21, "skipped": 0, "pct": 100 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 23, "covered": 23, "skipped": 0, "pct": 100 }, + "branches": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/normalize-input-data.js": { + "lines": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "branches": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/normalize-request-params.js": { + "lines": { "total": 16, "covered": 16, "skipped": 0, "pct": 100 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 16, "covered": 16, "skipped": 0, "pct": 100 }, + "branches": { "total": 9, "covered": 9, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/normalize-spatial-reference.js": { + "lines": { "total": 44, "covered": 44, "skipped": 0, "pct": 100 }, + "functions": { "total": 8, "covered": 8, "skipped": 0, "pct": 100 }, + "statements": { "total": 46, "covered": 45, "skipped": 0, "pct": 97.82 }, + "branches": { "total": 34, "covered": 31, "skipped": 0, "pct": 91.17 } + }, + "packages/featureserver/src/helpers/renderers.js": { + "lines": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "functions": { "total": 3, "covered": 3, "skipped": 0, "pct": 100 }, + "statements": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/server-metadata.js": { + "lines": { "total": 25, "covered": 25, "skipped": 0, "pct": 100 }, + "functions": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "statements": { "total": 25, "covered": 25, "skipped": 0, "pct": 100 }, + "branches": { "total": 14, "covered": 14, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/table-layer-metadata.js": { + "lines": { "total": 77, "covered": 76, "skipped": 0, "pct": 98.7 }, + "functions": { "total": 17, "covered": 17, "skipped": 0, "pct": 100 }, + "statements": { "total": 77, "covered": 76, "skipped": 0, "pct": 98.7 }, + "branches": { "total": 49, "covered": 44, "skipped": 0, "pct": 89.79 } + }, + "packages/featureserver/src/helpers/validate-inputs.js": { + "lines": { "total": 24, "covered": 24, "skipped": 0, "pct": 100 }, + "functions": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "statements": { "total": 24, "covered": 24, "skipped": 0, "pct": 100 }, + "branches": { "total": 9, "covered": 8, "skipped": 0, "pct": 88.88 } + }, + "packages/featureserver/src/helpers/fields/constants.js": { + "lines": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/fields/esri-type-utils.js": { + "lines": { "total": 18, "covered": 18, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 18, "covered": 18, "skipped": 0, "pct": 100 }, + "branches": { "total": 14, "covered": 14, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/fields/field-classes.js": { + "lines": { "total": 51, "covered": 50, "skipped": 0, "pct": 98.03 }, + "functions": { "total": 9, "covered": 9, "skipped": 0, "pct": 100 }, + "statements": { "total": 51, "covered": 50, "skipped": 0, "pct": 98.03 }, + "branches": { "total": 20, "covered": 17, "skipped": 0, "pct": 85 } + }, + "packages/featureserver/src/helpers/fields/fields.js": { + "lines": { "total": 33, "covered": 32, "skipped": 0, "pct": 96.96 }, + "functions": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "statements": { "total": 35, "covered": 34, "skipped": 0, "pct": 97.14 }, + "branches": { "total": 24, "covered": 22, "skipped": 0, "pct": 91.66 } + }, + "packages/featureserver/src/helpers/fields/index.js": { + "lines": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/fields/layer-fields.js": { + "lines": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "functions": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "statements": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "branches": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/helpers/fields/query-fields.js": { + "lines": { "total": 12, "covered": 12, "skipped": 0, "pct": 100 }, + "functions": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "branches": { "total": 6, "covered": 4, "skipped": 0, "pct": 66.66 } + }, + "packages/featureserver/src/helpers/fields/statistics-fields.js": { + "lines": { "total": 36, "covered": 35, "skipped": 0, "pct": 97.22 }, + "functions": { "total": 14, "covered": 14, "skipped": 0, "pct": 100 }, + "statements": { "total": 37, "covered": 36, "skipped": 0, "pct": 97.29 }, + "branches": { "total": 25, "covered": 20, "skipped": 0, "pct": 80 } + }, + "packages/featureserver/src/query/filter-and-transform.js": { + "lines": { "total": 40, "covered": 40, "skipped": 0, "pct": 100 }, + "functions": { "total": 9, "covered": 9, "skipped": 0, "pct": 100 }, + "statements": { "total": 40, "covered": 40, "skipped": 0, "pct": 100 }, + "branches": { "total": 28, "covered": 28, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/query/index.js": { + "lines": { "total": 44, "covered": 44, "skipped": 0, "pct": 100 }, + "functions": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 }, + "statements": { "total": 44, "covered": 44, "skipped": 0, "pct": 100 }, + "branches": { "total": 35, "covered": 33, "skipped": 0, "pct": 94.28 } + }, + "packages/featureserver/src/query/log-provider-data-warnings.js": { + "lines": { "total": 36, "covered": 35, "skipped": 0, "pct": 97.22 }, + "functions": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "statements": { "total": 36, "covered": 35, "skipped": 0, "pct": 97.22 }, + "branches": { "total": 47, "covered": 46, "skipped": 0, "pct": 97.87 } + }, + "packages/featureserver/src/query/render-count-and-extent.js": { + "lines": { "total": 19, "covered": 19, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 19, "covered": 19, "skipped": 0, "pct": 100 }, + "branches": { "total": 14, "covered": 14, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/query/render-features.js": { + "lines": { "total": 21, "covered": 21, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 21, "covered": 21, "skipped": 0, "pct": 100 }, + "branches": { "total": 24, "covered": 24, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/query/render-precalculated-statistics.js": { + "lines": { "total": 14, "covered": 14, "skipped": 0, "pct": 100 }, + "functions": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "statements": { "total": 14, "covered": 14, "skipped": 0, "pct": 100 }, + "branches": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/query/render-statistics.js": { + "lines": { "total": 8, "covered": 8, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 8, "covered": 8, "skipped": 0, "pct": 100 }, + "branches": { "total": 4, "covered": 2, "skipped": 0, "pct": 50 } + }, + "packages/featureserver/src/query/validate-query-request-parameters.js": { + "lines": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "branches": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/response-handlers/general-response-handler.js": { + "lines": { "total": 8, "covered": 8, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 8, "covered": 8, "skipped": 0, "pct": 100 }, + "branches": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/response-handlers/index.js": { + "lines": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/response-handlers/query-response-handler.js": { + "lines": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 }, + "branches": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/response-handlers/helpers/index.js": { + "lines": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/response-handlers/helpers/send-callback.js": { + "lines": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/response-handlers/helpers/send-pretty-json.js": { + "lines": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/response-handlers/helpers/send-pbf/get-geometry-transform.js": { + "lines": { "total": 25, "covered": 25, "skipped": 0, "pct": 100 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 25, "covered": 25, "skipped": 0, "pct": 100 }, + "branches": { "total": 19, "covered": 19, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/response-handlers/helpers/send-pbf/index.js": { + "lines": { "total": 29, "covered": 29, "skipped": 0, "pct": 100 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 29, "covered": 29, "skipped": 0, "pct": 100 }, + "branches": { "total": 8, "covered": 8, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/response-handlers/helpers/send-pbf/transform-features-for-pbf.js": { + "lines": { "total": 18, "covered": 18, "skipped": 0, "pct": 100 }, + "functions": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "statements": { "total": 18, "covered": 18, "skipped": 0, "pct": 100 }, + "branches": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/response-handlers/helpers/send-pbf/transform-to-pbf-attributes.js": { + "lines": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "branches": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 } + }, + "packages/featureserver/src/response-handlers/helpers/send-pbf/transform-to-pbf-geometry.js": { + "lines": { "total": 63, "covered": 63, "skipped": 0, "pct": 100 }, + "functions": { "total": 18, "covered": 18, "skipped": 0, "pct": 100 }, + "statements": { "total": 66, "covered": 66, "skipped": 0, "pct": 100 }, + "branches": { "total": 22, "covered": 22, "skipped": 0, "pct": 100 } + }, + "packages/logger/src/index.js": { + "lines": { "total": 31, "covered": 12, "skipped": 0, "pct": 38.7 }, + "functions": { "total": 5, "covered": 2, "skipped": 0, "pct": 40 }, + "statements": { "total": 32, "covered": 12, "skipped": 0, "pct": 37.5 }, + "branches": { "total": 22, "covered": 7, "skipped": 0, "pct": 31.81 } + }, + "packages/output-geoservices/src/index.js": { + "lines": { "total": 253, "covered": 253, "skipped": 0, "pct": 100 }, + "functions": { "total": 15, "covered": 15, "skipped": 0, "pct": 100 }, + "statements": { "total": 253, "covered": 253, "skipped": 0, "pct": 100 }, + "branches": { "total": 51, "covered": 51, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/errors.js": { + "lines": { "total": 8, "covered": 8, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 8, "covered": 8, "skipped": 0, "pct": 100 }, + "branches": { "total": 2, "covered": 1, "skipped": 0, "pct": 50 } + }, + "packages/winnow/src/index.js": { + "lines": { "total": 4, "covered": 0, "skipped": 0, "pct": 0 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 4, "covered": 0, "skipped": 0, "pct": 0 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/log-manager.js": { + "lines": { "total": 10, "covered": 4, "skipped": 0, "pct": 40 }, + "functions": { "total": 2, "covered": 1, "skipped": 0, "pct": 50 }, + "statements": { "total": 10, "covered": 4, "skipped": 0, "pct": 40 }, + "branches": { "total": 4, "covered": 0, "skipped": 0, "pct": 0 } + }, + "packages/winnow/src/calculate-class-breaks/calculate-std-dev-intervals.js": { + "lines": { "total": 16, "covered": 16, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 17, "covered": 17, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/calculate-class-breaks/filter-and-validate-classification-features.js": { + "lines": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "functions": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "statements": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "branches": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/calculate-class-breaks/index.js": { + "lines": { "total": 31, "covered": 28, "skipped": 0, "pct": 90.32 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 31, "covered": 28, "skipped": 0, "pct": 90.32 }, + "branches": { "total": 20, "covered": 16, "skipped": 0, "pct": 80 } + }, + "packages/winnow/src/calculate-class-breaks/normalize-classification-values.js": { + "lines": { "total": 49, "covered": 49, "skipped": 0, "pct": 100 }, + "functions": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "statements": { "total": 49, "covered": 49, "skipped": 0, "pct": 100 }, + "branches": { "total": 36, "covered": 34, "skipped": 0, "pct": 94.44 } + }, + "packages/winnow/src/calculate-class-breaks/transform-class-breaks-to-ranges.js": { + "lines": { "total": 28, "covered": 28, "skipped": 0, "pct": 100 }, + "functions": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 }, + "statements": { "total": 30, "covered": 29, "skipped": 0, "pct": 96.66 }, + "branches": { "total": 13, "covered": 12, "skipped": 0, "pct": 92.3 } + }, + "packages/winnow/src/filter-and-transform/filter-and-transform.js": { + "lines": { "total": 18, "covered": 18, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 18, "covered": 18, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/index.js": { + "lines": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/prepare-filter-and-transform.js": { + "lines": { "total": 16, "covered": 16, "skipped": 0, "pct": 100 }, + "functions": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "statements": { "total": 19, "covered": 18, "skipped": 0, "pct": 94.73 }, + "branches": { "total": 18, "covered": 17, "skipped": 0, "pct": 94.44 } + }, + "packages/winnow/src/filter-and-transform/filters/contains.js": { + "lines": { "total": 7, "covered": 7, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 9, "covered": 9, "skipped": 0, "pct": 100 }, + "branches": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/filters/envelope-intersects.js": { + "lines": { "total": 18, "covered": 18, "skipped": 0, "pct": 100 }, + "functions": { "total": 3, "covered": 3, "skipped": 0, "pct": 100 }, + "statements": { "total": 20, "covered": 19, "skipped": 0, "pct": 95 }, + "branches": { "total": 17, "covered": 15, "skipped": 0, "pct": 88.23 } + }, + "packages/winnow/src/filter-and-transform/filters/hashed-objectid-comparator.js": { + "lines": { "total": 21, "covered": 21, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 21, "covered": 21, "skipped": 0, "pct": 100 }, + "branches": { "total": 26, "covered": 26, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/filters/index.js": { + "lines": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/filters/intersects.js": { + "lines": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 14, "covered": 14, "skipped": 0, "pct": 100 }, + "branches": { "total": 16, "covered": 16, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/filters/within.js": { + "lines": { "total": 7, "covered": 7, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 9, "covered": 9, "skipped": 0, "pct": 100 }, + "branches": { "total": 9, "covered": 9, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/helpers/create-integer-hash.js": { + "lines": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/helpers/hash-fixture.js": { + "lines": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/helpers/hash-function.js": { + "lines": { "total": 12, "covered": 12, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 12, "covered": 12, "skipped": 0, "pct": 100 }, + "branches": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/helpers/index.js": { + "lines": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/transforms/index.js": { + "lines": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/transforms/project.js": { + "lines": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 12, "skipped": 0, "pct": 92.3 }, + "branches": { "total": 8, "covered": 7, "skipped": 0, "pct": 87.5 } + }, + "packages/winnow/src/filter-and-transform/transforms/reduce-precision.js": { + "lines": { "total": 9, "covered": 9, "skipped": 0, "pct": 100 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "branches": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/transforms/select-fields-to-esri-attributes.js": { + "lines": { "total": 6, "covered": 3, "skipped": 0, "pct": 50 }, + "functions": { "total": 1, "covered": 0, "skipped": 0, "pct": 0 }, + "statements": { "total": 6, "covered": 3, "skipped": 0, "pct": 50 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/transforms/select-fields.js": { + "lines": { "total": 4, "covered": 2, "skipped": 0, "pct": 50 }, + "functions": { "total": 1, "covered": 0, "skipped": 0, "pct": 0 }, + "statements": { "total": 4, "covered": 2, "skipped": 0, "pct": 50 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/transforms/to-esri-attributes.js": { + "lines": { "total": 26, "covered": 26, "skipped": 0, "pct": 100 }, + "functions": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 }, + "statements": { "total": 26, "covered": 26, "skipped": 0, "pct": 100 }, + "branches": { "total": 25, "covered": 25, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/transforms/to-esri-geometry.js": { + "lines": { "total": 7, "covered": 7, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 9, "covered": 9, "skipped": 0, "pct": 100 }, + "branches": { "total": 7, "covered": 7, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/transforms/to-geohash.js": { + "lines": { "total": 9, "covered": 9, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 }, + "branches": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/filter-and-transform/transforms/to-hash.js": { + "lines": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "branches": { "total": 3, "covered": 3, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/helpers/project-coordinates.js": { + "lines": { "total": 10, "covered": 9, "skipped": 0, "pct": 90 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 11, "covered": 10, "skipped": 0, "pct": 90.9 }, + "branches": { "total": 9, "covered": 8, "skipped": 0, "pct": 88.88 } + }, + "packages/winnow/src/helpers/transform-coordinates.js": { + "lines": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "branches": { "total": 3, "covered": 2, "skipped": 0, "pct": 66.66 } + }, + "packages/winnow/src/normalize-query-options/aggregates.js": { + "lines": { "total": 12, "covered": 12, "skipped": 0, "pct": 100 }, + "functions": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "statements": { "total": 12, "covered": 12, "skipped": 0, "pct": 100 }, + "branches": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/classification.js": { + "lines": { "total": 24, "covered": 22, "skipped": 0, "pct": 91.66 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 24, "covered": 22, "skipped": 0, "pct": 91.66 }, + "branches": { "total": 21, "covered": 17, "skipped": 0, "pct": 80.95 } + }, + "packages/winnow/src/normalize-query-options/collection.js": { + "lines": { "total": 14, "covered": 14, "skipped": 0, "pct": 100 }, + "functions": { "total": 3, "covered": 3, "skipped": 0, "pct": 100 }, + "statements": { "total": 16, "covered": 15, "skipped": 0, "pct": 93.75 }, + "branches": { "total": 11, "covered": 9, "skipped": 0, "pct": 81.81 } + }, + "packages/winnow/src/normalize-query-options/date-fields.js": { + "lines": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 }, + "functions": { "total": 3, "covered": 3, "skipped": 0, "pct": 100 }, + "statements": { "total": 7, "covered": 7, "skipped": 0, "pct": 100 }, + "branches": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/fields.js": { + "lines": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "branches": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/geometry-filter-spatial-reference.js": { + "lines": { "total": 16, "covered": 16, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 19, "covered": 19, "skipped": 0, "pct": 100 }, + "branches": { "total": 19, "covered": 19, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/geometry-filter.js": { + "lines": { "total": 32, "covered": 31, "skipped": 0, "pct": 96.87 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 33, "covered": 32, "skipped": 0, "pct": 96.96 }, + "branches": { "total": 26, "covered": 22, "skipped": 0, "pct": 84.61 } + }, + "packages/winnow/src/normalize-query-options/group-by.js": { + "lines": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "branches": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/id-field.js": { + "lines": { "total": 20, "covered": 20, "skipped": 0, "pct": 100 }, + "functions": { "total": 3, "covered": 3, "skipped": 0, "pct": 100 }, + "statements": { "total": 20, "covered": 20, "skipped": 0, "pct": 100 }, + "branches": { "total": 21, "covered": 20, "skipped": 0, "pct": 95.23 } + }, + "packages/winnow/src/normalize-query-options/index.js": { + "lines": { "total": 23, "covered": 23, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 23, "covered": 23, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/limit.js": { + "lines": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 15, "covered": 15, "skipped": 0, "pct": 100 }, + "branches": { "total": 14, "covered": 14, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/object-ids.js": { + "lines": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "branches": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/offset.js": { + "lines": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "branches": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/order.js": { + "lines": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 }, + "branches": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/output-data-spatial-reference.js": { + "lines": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 }, + "branches": { "total": 14, "covered": 14, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/source-data-spatial-reference.js": { + "lines": { "total": 10, "covered": 9, "skipped": 0, "pct": 90 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 11, "covered": 10, "skipped": 0, "pct": 90.9 }, + "branches": { "total": 10, "covered": 8, "skipped": 0, "pct": 80 } + }, + "packages/winnow/src/normalize-query-options/spatial-predicate.js": { + "lines": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "branches": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/spatial-reference.js": { + "lines": { "total": 47, "covered": 47, "skipped": 0, "pct": 100 }, + "functions": { "total": 9, "covered": 9, "skipped": 0, "pct": 100 }, + "statements": { "total": 52, "covered": 51, "skipped": 0, "pct": 98.07 }, + "branches": { "total": 34, "covered": 32, "skipped": 0, "pct": 94.11 } + }, + "packages/winnow/src/normalize-query-options/where.js": { + "lines": { "total": 16, "covered": 16, "skipped": 0, "pct": 100 }, + "functions": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "statements": { "total": 16, "covered": 16, "skipped": 0, "pct": 100 }, + "branches": { "total": 9, "covered": 9, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/helpers/detect-esri-field-type.js": { + "lines": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 }, + "branches": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/helpers/get-collection-crs.js": { + "lines": { "total": 15, "covered": 15, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 15, "covered": 15, "skipped": 0, "pct": 100 }, + "branches": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/helpers/index.js": { + "lines": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/normalize-query-options/helpers/normalize-array.js": { + "lines": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 }, + "branches": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/query/classification-query.js": { + "lines": { "total": 19, "covered": 17, "skipped": 0, "pct": 89.47 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 19, "covered": 17, "skipped": 0, "pct": 89.47 }, + "branches": { "total": 10, "covered": 8, "skipped": 0, "pct": 80 } + }, + "packages/winnow/src/query/index.js": { + "lines": { "total": 1, "covered": 0, "skipped": 0, "pct": 0 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 1, "covered": 0, "skipped": 0, "pct": 0 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/query/normalize-query-input.js": { + "lines": { "total": 19, "covered": 19, "skipped": 0, "pct": 100 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 23, "covered": 23, "skipped": 0, "pct": 100 }, + "branches": { "total": 19, "covered": 19, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/query/package-features.js": { + "lines": { "total": 13, "covered": 11, "skipped": 0, "pct": 84.61 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 11, "skipped": 0, "pct": 84.61 }, + "branches": { "total": 18, "covered": 12, "skipped": 0, "pct": 66.66 } + }, + "packages/winnow/src/query/prepare-query.js": { + "lines": { "total": 24, "covered": 24, "skipped": 0, "pct": 100 }, + "functions": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 }, + "statements": { "total": 24, "covered": 24, "skipped": 0, "pct": 100 }, + "branches": { "total": 4, "covered": 2, "skipped": 0, "pct": 50 } + }, + "packages/winnow/src/query/query.js": { + "lines": { "total": 19, "covered": 19, "skipped": 0, "pct": 100 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 19, "covered": 19, "skipped": 0, "pct": 100 }, + "branches": { "total": 5, "covered": 4, "skipped": 0, "pct": 80 } + }, + "packages/winnow/src/query/standard-query.js": { + "lines": { "total": 15, "covered": 15, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 15, "covered": 15, "skipped": 0, "pct": 100 }, + "branches": { "total": 8, "covered": 8, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/query/unique-value-query.js": { + "lines": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "branches": { "total": 5, "covered": 4, "skipped": 0, "pct": 80 } + }, + "packages/winnow/src/sql-query-builder/create-sql-params.js": { + "lines": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "functions": { "total": 3, "covered": 3, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "branches": { "total": 16, "covered": 13, "skipped": 0, "pct": 81.25 } + }, + "packages/winnow/src/sql-query-builder/create-sql-string.js": { + "lines": { "total": 12, "covered": 12, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 12, "covered": 12, "skipped": 0, "pct": 100 }, + "branches": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/sql-query-builder/group-by.js": { + "lines": { "total": 6, "covered": 6, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 7, "covered": 7, "skipped": 0, "pct": 100 }, + "branches": { "total": 5, "covered": 5, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/sql-query-builder/index.js": { + "lines": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 }, + "statements": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/sql-query-builder/is-different-crs.js": { + "lines": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "functions": { "total": 1, "covered": 1, "skipped": 0, "pct": 100 }, + "statements": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "branches": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/sql-query-builder/order-by.js": { + "lines": { "total": 12, "covered": 12, "skipped": 0, "pct": 100 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 13, "skipped": 0, "pct": 100 }, + "branches": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/sql-query-builder/select/aggregation-select.js": { + "lines": { "total": 12, "covered": 10, "skipped": 0, "pct": 83.33 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 13, "covered": 11, "skipped": 0, "pct": 84.61 }, + "branches": { "total": 6, "covered": 3, "skipped": 0, "pct": 50 } + }, + "packages/winnow/src/sql-query-builder/select/fields-select-fragment.js": { + "lines": { "total": 16, "covered": 16, "skipped": 0, "pct": 100 }, + "functions": { "total": 4, "covered": 4, "skipped": 0, "pct": 100 }, + "statements": { "total": 17, "covered": 17, "skipped": 0, "pct": 100 }, + "branches": { "total": 14, "covered": 13, "skipped": 0, "pct": 92.85 } + }, + "packages/winnow/src/sql-query-builder/select/geometry-select-fragment.js": { + "lines": { "total": 16, "covered": 16, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 16, "covered": 16, "skipped": 0, "pct": 100 }, + "branches": { "total": 11, "covered": 11, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/sql-query-builder/select/index.js": { + "lines": { "total": 12, "covered": 12, "skipped": 0, "pct": 100 }, + "functions": { "total": 2, "covered": 2, "skipped": 0, "pct": 100 }, + "statements": { "total": 12, "covered": 12, "skipped": 0, "pct": 100 }, + "branches": { "total": 7, "covered": 7, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/sql-query-builder/where-builder/index.js": { + "lines": { "total": 78, "covered": 78, "skipped": 0, "pct": 100 }, + "functions": { "total": 17, "covered": 17, "skipped": 0, "pct": 100 }, + "statements": { "total": 78, "covered": 78, "skipped": 0, "pct": 100 }, + "branches": { "total": 50, "covered": 50, "skipped": 0, "pct": 100 } + }, + "packages/winnow/src/sql-query-builder/where-builder/to-json-where.js": { + "lines": { "total": 52, "covered": 52, "skipped": 0, "pct": 100 }, + "functions": { "total": 15, "covered": 15, "skipped": 0, "pct": 100 }, + "statements": { "total": 55, "covered": 55, "skipped": 0, "pct": 100 }, + "branches": { "total": 30, "covered": 30, "skipped": 0, "pct": 100 } + } +} diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml index 9053bc03d..cb9ece463 100644 --- a/.github/workflows/pr-tests.yml +++ b/.github/workflows/pr-tests.yml @@ -5,11 +5,13 @@ on: branches: - master - beta + - next paths: - "./.github/**.yml" - "**/packages/**.js" - "**/packages/**/package.json" - "test/**/*.js" + - "ci/**/*.js" jobs: pr-tests: diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100755 index 000000000..4bfa57440 --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,3 @@ +#!/usr/bin/env sh +echo "\nRunning code linting...\n" +npm run lint \ No newline at end of file diff --git a/ci/format-branch-coverage-changes.js b/ci/format-branch-coverage-changes.js index dfa9ee7a5..867c8a6e2 100644 --- a/ci/format-branch-coverage-changes.js +++ b/ci/format-branch-coverage-changes.js @@ -1,7 +1,6 @@ const { writeFileSync, existsSync } = require('fs'); const json2md = require('json2md'); const coverageSummary = require('../.coverage_json/coverage-summary.json'); - const markdownFilePath = '.branch-coverage-changes.md'; if (!existsSync('.coverage_changes_json/coverage-summary.json')) { @@ -16,6 +15,7 @@ if (!existsSync('.coverage_changes_json/coverage-summary.json')) { } const coverageChangesSummary = require('../.coverage_changes_json/coverage-summary.json'); + const rows = Object.entries(coverageChangesSummary) .filter(([filePath]) => { return filePath !== 'total'; @@ -23,22 +23,35 @@ const rows = Object.entries(coverageChangesSummary) .map(([filePath, changesCoverage]) => { const packageFilePath = `packages${filePath.split('packages')[1]}`; const masterCoverage = coverageSummary[packageFilePath]; + return [ packageFilePath, - formatCovComparison(changesCoverage.statements.pct, masterCoverage?.statements?.pct || 0), - formatCovComparison(changesCoverage.branches.pct, masterCoverage?.branches?.pct || 0), - formatCovComparison(changesCoverage.functions.pct, masterCoverage?.functions?.pct || 0), - formatCovComparison(changesCoverage.lines.pct, masterCoverage?.lines?.pct || 0), + formatCovComparison( + changesCoverage.statements.pct, + masterCoverage?.statements?.pct || null, + ), + formatCovComparison( + changesCoverage.branches.pct, + masterCoverage?.branches?.pct || null, + ), + formatCovComparison( + changesCoverage.functions.pct, + masterCoverage?.functions?.pct || null, + ), + formatCovComparison( + changesCoverage.lines.pct, + masterCoverage?.lines?.pct || null, + ), ]; }); -const headers = ['File Path', 'Statements', 'Branches', 'Functions', 'Lines']; +const headers = ['File Path', 'Statements', 'Branches', 'Functions', ' Lines ']; const table = json2md([{ h2: 'Coverage Report (change vs master)' }, { table: { headers, rows } }]); const alignedTable = table.replace( - '| --------- | ---------- | -------- | --------- | ----- |', - '| :--------- | ----------: | --------: | ---------: | -----: |', + '| --------- | --------- | -------- | --------- | --------- |', + '| :--------- | ---------: | --------: | ---------: | ---------: |', ); const markdown = `[g-img]: https://github.com/koopjs/koop/assets/4369192/fd82d4b7-7f6e-448c-a56c-82ac6781a629 @@ -52,25 +65,29 @@ ${alignedTable}`; writeFileSync(markdownFilePath, markdown, 'utf8'); function formatCovComparison(changePct, mainPct) { - return `${formatCovPct(changePct)} vs ${formatCovPct(mainPct)}`; + return `${formatCovPct(changePct)}
vs
${formatCovPct(mainPct)}`; } function formatCovPct(pct) { + if (!pct) { + return '(NA)'; + } + if (pct === 100) { - return `${pct} ![green][g-img]`; + return `${pct.toFixed(1)} ![green][g-img]`; } if (pct > 90) { - return `${pct} ![yellowGreen][yg-img]`; + return `${pct.toFixed(1)} ![yellowGreen][yg-img]`; } if (pct > 80) { - return `${pct} ![yellow][y-img]`; + return `${pct.toFixed(1)} ![yellow][y-img]`; } if (pct > 70) { - return `${pct} ![orange][o-img]`; + return `${pct.toFixed(1)} ![orange][o-img]`; } - return `${pct} ![red][r-img]`; + return `${pct.toFixed(1)} ![red][r-img]`; } diff --git a/packages/featureserver/coverage-unit.svg b/packages/featureserver/coverage-unit.svg index bdcaf392d..ae751e733 100644 --- a/packages/featureserver/coverage-unit.svg +++ b/packages/featureserver/coverage-unit.svg @@ -1,5 +1,5 @@ - - coverage: 95.69% + + coverage: 95.75% @@ -13,8 +13,8 @@ \ No newline at end of file diff --git a/packages/featureserver/src/helpers/combine-body-query-params.js b/packages/featureserver/src/helpers/combine-body-query-params.js new file mode 100644 index 000000000..7cc27094b --- /dev/null +++ b/packages/featureserver/src/helpers/combine-body-query-params.js @@ -0,0 +1,17 @@ +const _ = require('lodash'); + +function combineBodyQueryParameters(body, query) { + const definedQueryParams = _.pickBy(query, isNotEmptyString); + const definedBodyParams = _.pickBy(body, isNotEmptyString); + + return { + ...definedBodyParams, + ...definedQueryParams, + }; +} + +function isNotEmptyString(str) { + return !_.isString(str) || !_.isEmpty(str); +} + +module.exports = { combineBodyQueryParameters }; diff --git a/packages/featureserver/src/helpers/combine-body-query-params.spec.js b/packages/featureserver/src/helpers/combine-body-query-params.spec.js new file mode 100644 index 000000000..1d1f3b3b7 --- /dev/null +++ b/packages/featureserver/src/helpers/combine-body-query-params.spec.js @@ -0,0 +1,25 @@ +const should = require('should'); // eslint-disable-line +const { combineBodyQueryParameters } = require('./combine-body-query-params'); + +describe('combineBodyQueryParameters', () => { + it('should merge objects with deference to query', () => { + combineBodyQueryParameters( + { foo: 'bar', hello: 'body-param' }, + { foo: 'baz', test: 'query-param' }, + ).should.deepEqual({ + foo: 'baz', + test: 'query-param', + hello: 'body-param', + }); + }); + + it('should merge objects with deference to query, strip empty strings', () => { + combineBodyQueryParameters( + { foo: 'bar', hello: '' }, + { foo: 'baz', test: 'query-param' }, + ).should.deepEqual({ + foo: 'baz', + test: 'query-param', + }); + }); +}); diff --git a/packages/featureserver/src/helpers/index.js b/packages/featureserver/src/helpers/index.js index 49b675830..10b11f18d 100644 --- a/packages/featureserver/src/helpers/index.js +++ b/packages/featureserver/src/helpers/index.js @@ -12,4 +12,5 @@ module.exports = { ...require('./renderers'), ...require('./validate-inputs'), ...require('./normalize-request-params'), + ...require('./combine-body-query-params'), }; diff --git a/packages/featureserver/src/helpers/normalize-request-params.js b/packages/featureserver/src/helpers/normalize-request-params.js index 928ee680d..62b423729 100644 --- a/packages/featureserver/src/helpers/normalize-request-params.js +++ b/packages/featureserver/src/helpers/normalize-request-params.js @@ -1,18 +1,18 @@ const _ = require('lodash'); const defaults = require('../metadata-defaults'); +const { combineBodyQueryParameters } = require('./combine-body-query-params'); -function normalizeRequestParameters(query, body, maxRecordCount = defaults.maxRecordCount()) { - const definedQueryParams = _.chain(query) - .pickBy(isNotEmptyString) - .mapValues(coerceStrings) - .value(); +function normalizeRequestParameters( + query, + body, + maxRecordCount = defaults.maxRecordCount(), +) { + const requestParams = combineBodyQueryParameters(body, query); - const definedBodyParams = _.chain(body).pickBy(isNotEmptyString).mapValues(coerceStrings).value(); - - const { resultRecordCount, ...params } = { - ...definedQueryParams, - ...definedBodyParams, - }; + const { resultRecordCount, ...params } = _.mapValues( + requestParams, + coerceStrings, + ); return { ...params, @@ -20,10 +20,6 @@ function normalizeRequestParameters(query, body, maxRecordCount = defaults.maxRe }; } -function isNotEmptyString(str) { - return !_.isString(str) || !_.isEmpty(str); -} - function coerceStrings(val) { if (val === 'false') { return false; diff --git a/packages/featureserver/src/rest-info-route-handler.js b/packages/featureserver/src/rest-info-route-handler.js index b4d422462..ca99f5fd5 100644 --- a/packages/featureserver/src/rest-info-route-handler.js +++ b/packages/featureserver/src/rest-info-route-handler.js @@ -1,27 +1,60 @@ const _ = require('lodash'); -const defaults = require('./metadata-defaults'); +const joi = require('joi'); +const metadataDefaults = require('./metadata-defaults'); +const { generalResponseHandler } = require('./response-handlers'); +const { combineBodyQueryParameters } = require('./helpers'); -function restInfo(data = {}, req) { - const versionDefaults = defaults.restInfoDefaults(); +const parameterSchema = joi + .object({ + f: joi.string().valid('json', 'pjson').default('json'), + }) + .unknown(); + +function restInfo(req, res, data = {}) { + const { currentVersion, fullVersion } = getVersions(req.app.locals); + + const requestParams = combineBodyQueryParameters(req.body, req.query); + + validate(requestParams); + + return generalResponseHandler( + res, + { + currentVersion, + fullVersion, + owningSystemUrl: data.owningSystemUrl, + authInfo: { + ...data.authInfo, + }, + }, + requestParams, + ); +} + +function getVersions(locals) { + const versionDefaults = metadataDefaults.restInfoDefaults(); const currentVersion = _.get( - req, - 'app.locals.config.featureServer.currentVersion', + locals, + 'config.featureServer.currentVersion', versionDefaults.currentVersion, ); + const fullVersion = _.get( - req, - 'app.locals.config.featureServer.fullVersion', + locals, + 'config.featureServer.fullVersion', versionDefaults.fullVersion, ); + return { currentVersion, fullVersion }; +} - return { - currentVersion, - fullVersion, - owningSystemUrl: data.owningSystemUrl, - authInfo: { - ...data.authInfo, - }, - }; +function validate(parameters) { + const { error } = parameterSchema.validate(parameters); + + if (error) { + const err = new Error('Invalid format'); + err.code = 400; + throw err; + } } module.exports = restInfo; diff --git a/packages/featureserver/src/rest-info-route-handler.spec.js b/packages/featureserver/src/rest-info-route-handler.spec.js index e7a5109c3..150435648 100644 --- a/packages/featureserver/src/rest-info-route-handler.spec.js +++ b/packages/featureserver/src/rest-info-route-handler.spec.js @@ -1,22 +1,59 @@ const should = require('should'); // eslint-disable-line -const restInfo = require('./rest-info-route-handler'); +const proxyquire = require('proxyquire'); +const sinon = require('sinon'); const CURRENT_VERSION = 11.2; const FULL_VERSION = '11.2.0'; describe('rest/info handler', () => { + const handlerSpy = sinon.spy(); + const restInfo = proxyquire('./rest-info-route-handler', { + './response-handlers': { + generalResponseHandler: handlerSpy, + }, + }); + + afterEach(() => { + handlerSpy.resetHistory(); + }); + it('should return default info', () => { const req = { app: { locals: {}, }, + query: {}, + body: {}, }; - const result = restInfo(undefined, req); - result.should.deepEqual({ - currentVersion: CURRENT_VERSION, - fullVersion: FULL_VERSION, - authInfo: {}, - owningSystemUrl: undefined, - }); + + restInfo(req, {}); + handlerSpy.callCount.should.equal(1); + handlerSpy.firstCall.args.should.deepEqual([ + {}, + { + currentVersion: CURRENT_VERSION, + fullVersion: FULL_VERSION, + authInfo: {}, + owningSystemUrl: undefined, + }, + {}, + ]); + }); + + it('should throw error on invalid format', () => { + const req = { + app: { + locals: {}, + }, + query: { f: 'baz' }, + body: {}, + }; + + try { + restInfo(req, {}); + } catch (error) { + error.message.should.equal('Invalid format'); + error.code.should.equal(400); + } }); it('should return default plus supplied info', () => { @@ -29,13 +66,18 @@ describe('rest/info handler', () => { locals: {}, }, }; - const result = restInfo(data, req); - result.should.deepEqual({ - currentVersion: CURRENT_VERSION, - fullVersion: FULL_VERSION, - authInfo: { foo: 'bar' }, - owningSystemUrl: 'helloworld', - }); + restInfo(req, {}, data); + handlerSpy.callCount.should.equal(1); + handlerSpy.firstCall.args.should.deepEqual([ + {}, + { + currentVersion: CURRENT_VERSION, + fullVersion: FULL_VERSION, + authInfo: { foo: 'bar' }, + owningSystemUrl: 'helloworld', + }, + {}, + ]); }); it('should return versions from app.locals', () => { @@ -51,14 +93,22 @@ describe('rest/info handler', () => { }, }, }; - const result = restInfo({ authInfo: { foo: 'bar' }, owningSystemUrl: 'helloworld' }, req); - result.should.deepEqual({ - currentVersion: 10.81, - fullVersion: '10.8.1', - authInfo: { - foo: 'bar', + + restInfo( + req, + {}, + { authInfo: { foo: 'bar' }, owningSystemUrl: 'helloworld' }, + ); + handlerSpy.callCount.should.equal(1); + handlerSpy.firstCall.args.should.deepEqual([ + {}, + { + currentVersion: 10.81, + fullVersion: '10.8.1', + authInfo: { foo: 'bar' }, + owningSystemUrl: 'helloworld', }, - owningSystemUrl: 'helloworld', - }); + {}, + ]); }); }); diff --git a/packages/featureserver/src/route.js b/packages/featureserver/src/route.js index d3ee27c28..0855f99f1 100644 --- a/packages/featureserver/src/route.js +++ b/packages/featureserver/src/route.js @@ -33,8 +33,7 @@ module.exports = function route(req, res, geojson = {}) { geojson.metadata = geojson.metadata || { maxRecordCount: 2000 }; if (isRestInfoRequest(route)) { - const result = restInfo(geojson, req); - return generalResponseHandler(res, result, req.query); + return restInfo(req, res, geojson); } if (isServerMetadataRequest(route)) { diff --git a/packages/featureserver/src/route.spec.js b/packages/featureserver/src/route.spec.js index 6db6187ef..b182564c1 100644 --- a/packages/featureserver/src/route.spec.js +++ b/packages/featureserver/src/route.spec.js @@ -111,21 +111,15 @@ describe('Route module unit tests', () => { ); restInfoSpy.calledOnce.should.equal(true); restInfoSpy.firstCall.args.should.deepEqual([ - { - metadata: { maxRecordCount: 2000 }, - }, { params: {}, query: { resultRecordCount: 2000 }, url: '/rest/info', }, - ]); - - responseHandlerSpy.calledOnce.should.equal(true); - responseHandlerSpy.firstCall.args.should.deepEqual([ {}, - { restInfo: true }, - { resultRecordCount: 2000 }, + { + metadata: { maxRecordCount: 2000 }, + }, ]); }); @@ -149,14 +143,15 @@ describe('Route module unit tests', () => { ); restInfoSpy.calledOnce.should.equal(true); restInfoSpy.firstCall.args.should.deepEqual([ - { - metadata: { maxRecordCount: 2000 }, - }, { params: {}, query: { resultRecordCount: 2000 }, url: '/rest/info', }, + {}, + { + metadata: { maxRecordCount: 2000 }, + }, ]); responseHandlerSpy.calledOnce.should.equal(true); diff --git a/packages/featureserver/test/integration/info.spec.js b/packages/featureserver/test/integration/info.spec.js index a3959c197..f7780cc72 100644 --- a/packages/featureserver/test/integration/info.spec.js +++ b/packages/featureserver/test/integration/info.spec.js @@ -6,28 +6,6 @@ const _ = require('lodash'); const CURRENT_VERSION = 11.2; describe('Info operations', () => { - describe('rest info', () => { - it('should conform to the prescribed schema', () => { - const req = { - app: { - locals: {}, - }, - }; - - const supplementalRestInfo = { - authInfo: { - isTokenBasedSecurity: true, - tokenServicesUrl: 'http://localhost/provider/generateToken', - }, - }; - const restInfo = FeatureServer.restInfo(supplementalRestInfo, req); - restInfo.should.have.property('currentVersion', CURRENT_VERSION); - restInfo.should.have.property('authInfo'); - restInfo.authInfo.should.have.property('isTokenBasedSecurity', true); - restInfo.authInfo.should.have.property('tokenServicesUrl').be.type('string'); - }); - }); - describe('server info', () => { it('should conform to the prescribed schema', () => { const result = FeatureServer.serverInfo(data); diff --git a/packages/output-geoservices/src/index.js b/packages/output-geoservices/src/index.js index fae58ef3b..5878612ff 100644 --- a/packages/output-geoservices/src/index.js +++ b/packages/output-geoservices/src/index.js @@ -1,4 +1,11 @@ const FeatureServer = require('@koopjs/featureserver'); +const { + restInfo, + // serverInfo, + // layerInfo, + // layersInfo, + // query, +} = require('@koopjs/featureserver'); const Logger = require('@koopjs/logger'); let logger = new Logger(); const ARCGIS_UNAUTHORIZED_MESSAGE = 'Item does not exist or is inaccessible.'; @@ -180,12 +187,20 @@ class GeoServices { } const data = { authInfo }; - if (this.#includeOwningSystemUrl) { data.owningSystemUrl = this.#buildOwningSystemUrl(req.headers.host, req.baseUrl); } - - FeatureServer.route(req, res, data); + /* + const result = restInfo(geojson, req); + return generalResponseHandler(res, result, req.query); + */ + restInfo(req, res, { + owningSystemUrl: this.#buildOwningSystemUrl( + req.headers.host, + req.baseUrl, + ), + authInfo, + }); } #buildTokensUrl(host, baseUrl) { diff --git a/packages/output-geoservices/src/index.spec.js b/packages/output-geoservices/src/index.spec.js index 84850de8d..b562dca12 100644 --- a/packages/output-geoservices/src/index.spec.js +++ b/packages/output-geoservices/src/index.spec.js @@ -5,6 +5,7 @@ jest.mock('@koopjs/featureserver', () => ({ setLogger: jest.fn(), route: jest.fn(), setDefaults: jest.fn(), + restInfo: jest.fn(), })); const loggerMock = { @@ -256,8 +257,8 @@ describe('Output Geoservices', () => { authInfo: { food: 'baz' }, }); await output.restInfoHandler(reqMock, resMock); - expect(FeatureServer.route.mock.calls.length).toBe(1); - expect(FeatureServer.route.mock.calls[0]).toEqual([ + expect(FeatureServer.restInfo.mock.calls.length).toBe(1); + expect(FeatureServer.restInfo.mock.calls[0]).toEqual([ reqMock, resMock, { @@ -273,8 +274,8 @@ describe('Output Geoservices', () => { }; const output = new OutputGeoServices(modelMock); await output.restInfoHandler(reqMock, resMock); - expect(FeatureServer.route.mock.calls.length).toBe(1); - expect(FeatureServer.route.mock.calls[0]).toEqual([ + expect(FeatureServer.restInfo.mock.calls.length).toBe(1); + expect(FeatureServer.restInfo.mock.calls[0]).toEqual([ reqMock, resMock, { @@ -295,8 +296,8 @@ describe('Output Geoservices', () => { useHttpForTokenUrl: true, }); await output.restInfoHandler(reqMock, resMock); - expect(FeatureServer.route.mock.calls.length).toBe(1); - expect(FeatureServer.route.mock.calls[0]).toEqual([ + expect(FeatureServer.restInfo.mock.calls.length).toBe(1); + expect(FeatureServer.restInfo.mock.calls[0]).toEqual([ reqMock, resMock, { @@ -317,8 +318,8 @@ describe('Output Geoservices', () => { process.env.GEOSERVICES_HTTP = 'true'; const output = new OutputGeoServices(modelMock); await output.restInfoHandler(reqMock, resMock); - expect(FeatureServer.route.mock.calls.length).toBe(1); - expect(FeatureServer.route.mock.calls[0]).toEqual([ + expect(FeatureServer.restInfo.mock.calls.length).toBe(1); + expect(FeatureServer.restInfo.mock.calls[0]).toEqual([ reqMock, resMock, { @@ -344,8 +345,8 @@ describe('Output Geoservices', () => { process.env.KOOP_AUTH_HTTP = 'true'; const output = new OutputGeoServices(modelMock); await output.restInfoHandler(reqMock, resMock); - expect(FeatureServer.route.mock.calls.length).toBe(1); - expect(FeatureServer.route.mock.calls[0]).toEqual([ + expect(FeatureServer.restInfo.mock.calls.length).toBe(1); + expect(FeatureServer.restInfo.mock.calls[0]).toEqual([ reqMock, resMock, { @@ -373,8 +374,8 @@ describe('Output Geoservices', () => { const output = new OutputGeoServices(modelMock); await output.restInfoHandler(reqMock, resMock); - expect(FeatureServer.route.mock.calls.length).toBe(1); - expect(FeatureServer.route.mock.calls[0]).toEqual([ + expect(FeatureServer.restInfo.mock.calls.length).toBe(1); + expect(FeatureServer.restInfo.mock.calls[0]).toEqual([ reqMock, resMock, { diff --git a/test/geoservice-rest-info.spec.js b/test/geoservice-rest-info.spec.js new file mode 100644 index 000000000..aa8ced527 --- /dev/null +++ b/test/geoservice-rest-info.spec.js @@ -0,0 +1,41 @@ +const Koop = require('@koopjs/koop-core'); +const provider = require('@koopjs/provider-file-geojson'); +const request = require('supertest'); +const mockLogger = { + debug: () => {}, + info: () => {}, + silly: () => {}, + warn: () => {}, + error: () => {}, +}; + +describe('Feature Server Output - rest/info', () => { + const koop = new Koop({ logLevel: 'error', logger: mockLogger }); + koop.register(provider, { dataDir: './test/provider-data' }); + + test('return expected result', async () => { + try { + const response = await request(koop.server).get( + '/file-geojson/rest/info', + ); + expect(response.status).toBe(200); + const { + body: { + authInfo: { isTokenBasedSecurity, tokenServicesUrl }, + currentVersion, + fullVersion, + owningSystemUrl, + }, + } = response; + + expect(isTokenBasedSecurity).toBe(true); + expect(tokenServicesUrl).toMatch(/file-geojson\/rest\/generateToken$/); + expect(currentVersion).toBe(11.2); + expect(fullVersion).toBe('11.2.0'); + expect(owningSystemUrl).toMatch(/file-geojson$/); + } catch (error) { + console.error(error); + throw error; + } + }); +});