diff --git a/.changeset/rare-lizards-exercise.md b/.changeset/rare-lizards-exercise.md
new file mode 100644
index 000000000..4f7b09382
--- /dev/null
+++ b/.changeset/rare-lizards-exercise.md
@@ -0,0 +1,5 @@
+---
+"@koopjs/featureserver": major
+---
+
+- Remove route module and refactor signatures of handlers; consumers can no longer use FeatureServer.route. If using this directly with Express, you need to define each route and bind to the correct FeatureServer handler.
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/README.md b/README.md
index a1a826211..8920e5a89 100644
--- a/README.md
+++ b/README.md
@@ -57,12 +57,12 @@ The Koop dependency graph is shown below.
![Screen Shot 2022-11-30 at 1 03 46 PM](https://user-images.githubusercontent.com/4369192/204908289-82659cfe-fcf3-404a-aa70-79baf540f1b8.png)
### Test Coverage
-Test coverages for each package are shown below. Coverage for some packages includes integration tests as opposed to true unit tests. Difference in coverage is shown below. Our goal is to have complete unit test coverage, and breakout integration/e2e tests separately.
+Test coverages for each package are shown below. Coverage for winnow package includes integration tests as opposed to true unit tests. Our goal is to have complete unit test coverage, and breakout integration/e2e tests separately.
| package | integration + unit | unit |
|---|---|---|
|cache-memory|N/A|![coverage](./packages/cache-memory/coverage.svg)|
-|featureserver|![coverage](./packages/featureserver/coverage.svg)|![coverage](./packages/featureserver/coverage-unit.svg)|
+|featureserver|![coverage](./packages/featureserver/coverage.svg)|
|koop-core|N/A|![coverage](./packages/core/coverage.svg)|
|logger|N/A|![coverage](./packages/logger/coverage.svg)|
|output-geoservices|N/A|![coverage](./packages/output-geoservices/coverage.svg)|
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/ci/run-coverage-on-branch-changes.js b/ci/run-coverage-on-branch-changes.js
index fb06ead3a..101270f1b 100644
--- a/ci/run-coverage-on-branch-changes.js
+++ b/ci/run-coverage-on-branch-changes.js
@@ -62,7 +62,7 @@ function getCovCmd(package, srcFiles) {
}
function getTestCmd(package) {
- if (package === 'featureserver' || package === 'winnow') {
+ if (package === 'winnow') {
return 'npm run test:unit > /dev/null';
}
diff --git a/ci/run-test-coverage-analysis.js b/ci/run-test-coverage-analysis.js
index 532515581..3097948ab 100644
--- a/ci/run-test-coverage-analysis.js
+++ b/ci/run-test-coverage-analysis.js
@@ -8,35 +8,35 @@ const context = argv.context || 'all';
workspaces.forEach((workspace) => {
process.chdir(workspace);
- const package = workspace.split(path.sep).pop();
- console.log(`Package "${package}":`);
+ const pkg = workspace.split(path.sep).pop();
+ console.log(`Package "${pkg}":`);
process.stdout.write(` - running ${context} test coverage...`);
- shell.exec(getCovCmd(package, context));
+ shell.exec(getCovCmd(pkg, context));
process.stdout.write('completed.\n');
process.stdout.write(` - generating ${context} test coverage badge...`);
- shell.exec(getBadgeCmd(package, context));
+ shell.exec(getBadgeCmd(pkg, context));
process.stdout.write('completed.\n\n');
process.chdir('../..');
});
-function getCovCmd(package, context) {
- if (package === 'output-geoservices') {
+function getCovCmd(pkg, context) {
+ if (pkg === 'output-geoservices') {
return 'npm test -- --coverage --coverageDirectory=.coverage/all --reporters --silent > /dev/null';
}
- return `npx cross-env SUPPRESS_NO_CONFIG_WARNING=true nyc -r=json-summary -r=json --report-dir=.coverage/all --temp-dir=.coverage/all/analysis ${getTestCmd(package, context)}`;
+ return `npx cross-env SUPPRESS_NO_CONFIG_WARNING=true nyc -r=json-summary -r=json --report-dir=.coverage/all --temp-dir=.coverage/all/analysis ${getTestCmd(pkg, context)}`;
}
-function getBadgeCmd(package, context) {
- if (context === 'unit' && (package === 'featureserver' || package === 'winnow')) {
+function getBadgeCmd(pkg, context) {
+ if (context === 'unit' && pkg === 'winnow') {
return 'npx coverage-badges-cli --source .coverage/all/coverage-summary.json --output ./coverage-unit.svg > /dev/null';
}
return 'npx coverage-badges-cli --source .coverage/all/coverage-summary.json --output ./coverage.svg > /dev/null';
}
-function getTestCmd(package, context) {
- if (context === 'unit' && (package === 'featureserver' || package === 'winnow')) {
+function getTestCmd(pkg, context) {
+ if (context === 'unit' && pkg === 'winnow') {
return 'npm run test:unit > /dev/null';
}
diff --git a/packages/featureserver/README.md b/packages/featureserver/README.md
index d4ba37ee1..c0fbd54da 100644
--- a/packages/featureserver/README.md
+++ b/packages/featureserver/README.md
@@ -14,26 +14,20 @@ const app = express() // set up a basic express server
const FeatureServer = require('@koopjs/featureserver')
const cache = require('cache')
-// We only need one handler because FeatureServer.route is going to do all the work
+
const handler = (req, res) => {
cache.get(/* some geojson */, (err, data) => {
if (err) res.status(500).json({error: err.message})
- else FeatureServer.route(req, res, data)
+ else FeatureServer.query(req, res, data)
})
}
-// Sets up all of the handled routes to support `GET` and `POST`
-const routes = ['/FeatureServer', '/FeatureServer/layers', '/FeatureServer/:layer', '/FeatureServer/:layer/:method']
-
-routes.forEach(route => {
- app.route(route)
+app.route('/FeatureServer/:layer/query')
.get(handler)
.post(handler)
-})
```
## API
-* [FeatureServer.route](#featureserver.route)
* [FeatureServer.query](#featureserver.query)
* [FeatureServer.restInfo](#featureserver.serverInfo)
* [FeatureServer.serverInfo](#featureserver.serverInfo)
@@ -43,83 +37,6 @@ routes.forEach(route => {
* [FeatureServer.queryRelatedRecords](#featureserver.queryRelatedRecords)
* [FeatureServer.setDefaults](#featureserver.setDefaults)
-### FeatureServer.route
-Pass in an `incoming request object`, an `outgoing response object`, a `geojson` object, and `options` and this function will route and return a geoservices compliant response
-
-- Supports: '/FeatureServer', '/FeatureServer/layers', '/FeatureServer/:layer', '/FeatureServer/:layer/:method'
- - _Note_: only `query`, `info`, and `generateRenderer` are supported methods at this time.
-
-```js
-FeatureServer.route(req, res, data, options)
-```
-
-- **data** is either a geojson object extended with some additional properties or an object with a layers property which an array of extended geojson objects. These properties are optional and can be used to provide more specific metadata or to shortcut the built in filtering mechanism.
-
-e.g.
-
-```js
-{
- type: 'FeatureCollection' // Static
- features: Array, // GeoJSON features
- statistics: Object, // pass statistics to an outStatistics request to or else they will be calculated from geojson features passed in
- metadata: {
- id: number, // The unique layer id. If supplied for one layer, you should supply for all layers to avoid multiple layers having the same id.
- name: String, // The name of the layer
- description: String, // The description of the layer
- copyrightText: String, // The copyright text (layer attribution text)
- extent: Array, // valid extent array e.g. [[180,90],[-180,-90]]
- displayField: String, // The display field to be used by a client
- geometryType: String // REQUIRED if no features are returned with this object Point || MultiPoint || LineString || MultiLineString || Polygon || MultiPolygon
- idField: String, // unique identifier field,
- maxRecordCount: Number, // the maximum number of features a provider can return at once
- limitExceeded: Boolean, // whether or not the server has limited the features returned
- timeInfo: Object, // describes the time extent and capabilities of the layer,
- transform: Object, // describes a quantization transformation
- renderer: Object, // provider can over-ride default symbology of FeatureServer output with a renderer object. See https://developers.arcgis.com/web-map-specification/objects/simpleRenderer, for object specification.
- defaultVisibility: boolean, // The default visibility of this layer
- minScale: number, // The minScale value for this layer
- maxScale: number, // The maxScale value for this layer
- fields: [
- { // Subkeys are optional
- name: String,
- type: String, // 'Date' || 'Double' || 'Integer' || 'String'
- alias: String, // how should clients display this field name,
- }
- ],
- supportedQueryFormats: String | Array // 'JSON,geojson' || ['JSON', 'geojson']
- },
- capabilities: {
- quantization: Boolean // True if the provider supports quantization
- },
- filtersApplied: {
- all: Boolean // true if all post processing should be skipped
- geometry: Boolean, // true if a geometric filter has already been applied to the data
- where: Boolean, // true if a sql-like where filter has already been applied to the data
- offset: Boolean // true if the result offset has already been applied to the data,
- limit: Boolean // true if the result count has already been limited,
- projection: Boolean // true if the result data has already been projected
- }
- count: Number // pass count if the number of features in a query has been pre-calculated
-}
-```
-
-or
-
-```js
-{
- layers: [
- {
- type: 'FeatureCollection'
- ...
- },
- {
- type: 'FeatureCollection'
- ...
- }
-]
-```
-- **options** is an object that dictates method actions. See `FeatureServer.query` and `FeatureServer.generateRenderer` for more details.
-
### FeatureServer.query
Pass in `geojson` and `options` (a valid [geoservices query object](https://geoservices.github.io/query.html)), and the function will perform the query and return a valid geoservices query object. The in addition to input `statistics: {}`, following is an example of _all_ query `options` that can be passed into the query route: '/FeatureServer/:layer/query'
diff --git a/packages/featureserver/coverage-unit.svg b/packages/featureserver/coverage-unit.svg
deleted file mode 100644
index bdcaf392d..000000000
--- a/packages/featureserver/coverage-unit.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
\ No newline at end of file
diff --git a/packages/featureserver/coverage.svg b/packages/featureserver/coverage.svg
index bc121038d..1b399e8ec 100644
--- a/packages/featureserver/coverage.svg
+++ b/packages/featureserver/coverage.svg
@@ -1,20 +1,20 @@
-