diff --git a/.coverage_json/coverage-summary.json b/.coverage_json/coverage-summary.json new file mode 100644 index 000000000..bd96d8ab5 --- /dev/null +++ b/.coverage_json/coverage-summary.json @@ -0,0 +1,145 @@ +{"total": {"lines":{"total":2755,"covered":2399,"skipped":0,"pct":87.07},"statements":{"total":2846,"covered":2460,"skipped":0,"pct":86.43},"functions":{"total":514,"covered":440,"skipped":0,"pct":85.6},"branches":{"total":1648,"covered":1263,"skipped":0,"pct":76.63},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/core/src/data-provider/extend-model.js": {"lines":{"total":113,"covered":113,"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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/core/src/data-provider/helpers/route-joiner.js": {"lines":{"total":7,"covered":7,"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}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/index.js": {"lines":{"total":3,"covered":0,"skipped":0,"pct":0},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":3,"covered":0,"skipped":0,"pct":0},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/metadata-defaults.js": {"lines":{"total":29,"covered":28,"skipped":0,"pct":96.55},"functions":{"total":9,"covered":8,"skipped":0,"pct":88.88},"statements":{"total":29,"covered":28,"skipped":0,"pct":96.55},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/is-geojson-table.js": {"lines":{"total":9,"covered":8,"skipped":0,"pct":88.88},"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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/table-layer-metadata.js": {"lines":{"total":58,"covered":57,"skipped":0,"pct":98.27},"functions":{"total":15,"covered":15,"skipped":0,"pct":100},"statements":{"total":58,"covered":57,"skipped":0,"pct":98.27},"branches":{"total":44,"covered":35,"skipped":0,"pct":79.54}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/fields/query-fields.js": {"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":12,"covered":12,"skipped":0,"pct":100},"branches":{"total":6,"covered":4,"skipped":0,"pct":66.66}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/query/filter-and-transform.js": {"lines":{"total":30,"covered":30,"skipped":0,"pct":100},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":30,"covered":30,"skipped":0,"pct":100},"branches":{"total":17,"covered":16,"skipped":0,"pct":94.11}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/query/render-features.js": {"lines":{"total":21,"covered":17,"skipped":0,"pct":80.95},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":21,"covered":17,"skipped":0,"pct":80.95},"branches":{"total":25,"covered":17,"skipped":0,"pct":68}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/helpers/send-pbf/index.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":6,"covered":6,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/helpers/send-pbf/transform-features-for-pbf.js": {"lines":{"total":17,"covered":17,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":17,"covered":17,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/helpers/send-pbf/transform-to-pbf-attributes.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":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/helpers/send-pbf/transform-to-pbf-geometry.js": {"lines":{"total":66,"covered":66,"skipped":0,"pct":100},"functions":{"total":22,"covered":22,"skipped":0,"pct":100},"statements":{"total":69,"covered":69,"skipped":0,"pct":100},"branches":{"total":22,"covered":22,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/output-geoservices/src/index.js": {"lines":{"total":252,"covered":249,"skipped":0,"pct":98.8},"functions":{"total":16,"covered":15,"skipped":0,"pct":93.75},"statements":{"total":252,"covered":249,"skipped":0,"pct":98.8},"branches":{"total":51,"covered":51,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/filters/contains.js": {"lines":{"total":7,"covered":3,"skipped":0,"pct":42.85},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":9,"covered":3,"skipped":0,"pct":33.33},"branches":{"total":10,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/filters/envelope-intersects.js": {"lines":{"total":17,"covered":5,"skipped":0,"pct":29.41},"functions":{"total":3,"covered":0,"skipped":0,"pct":0},"statements":{"total":20,"covered":5,"skipped":0,"pct":25},"branches":{"total":17,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/filters/hashed-objectid-comparator.js": {"lines":{"total":21,"covered":3,"skipped":0,"pct":14.28},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":21,"covered":3,"skipped":0,"pct":14.28},"branches":{"total":26,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/filters/intersects.js": {"lines":{"total":11,"covered":4,"skipped":0,"pct":36.36},"functions":{"total":2,"covered":0,"skipped":0,"pct":0},"statements":{"total":14,"covered":4,"skipped":0,"pct":28.57},"branches":{"total":16,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/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":8,"skipped":0,"pct":88.88}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/helpers/create-integer-hash.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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/helpers/hash-function.js": {"lines":{"total":10,"covered":9,"skipped":0,"pct":90},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":11,"covered":9,"skipped":0,"pct":81.81},"branches":{"total":2,"covered":1,"skipped":0,"pct":50}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/project.js": {"lines":{"total":11,"covered":3,"skipped":0,"pct":27.27},"functions":{"total":2,"covered":0,"skipped":0,"pct":0},"statements":{"total":13,"covered":3,"skipped":0,"pct":23.07},"branches":{"total":8,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/reduce-precision.js": {"lines":{"total":9,"covered":2,"skipped":0,"pct":22.22},"functions":{"total":4,"covered":0,"skipped":0,"pct":0},"statements":{"total":11,"covered":2,"skipped":0,"pct":18.18},"branches":{"total":4,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/to-esri-attributes.js": {"lines":{"total":23,"covered":4,"skipped":0,"pct":17.39},"functions":{"total":5,"covered":0,"skipped":0,"pct":0},"statements":{"total":23,"covered":4,"skipped":0,"pct":17.39},"branches":{"total":19,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/to-esri-geometry.js": {"lines":{"total":7,"covered":3,"skipped":0,"pct":42.85},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":9,"covered":3,"skipped":0,"pct":33.33},"branches":{"total":7,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/to-geohash.js": {"lines":{"total":9,"covered":3,"skipped":0,"pct":33.33},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":10,"covered":3,"skipped":0,"pct":30},"branches":{"total":10,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/to-hash.js": {"lines":{"total":4,"covered":1,"skipped":0,"pct":25},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":5,"covered":1,"skipped":0,"pct":20},"branches":{"total":3,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/helpers/detect-esri-field-type.js": {"lines":{"total":11,"covered":8,"skipped":0,"pct":72.72},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":11,"covered":8,"skipped":0,"pct":72.72},"branches":{"total":6,"covered":3,"skipped":0,"pct":50}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/helpers/get-collection-crs.js": {"lines":{"total":15,"covered":14,"skipped":0,"pct":93.33},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":15,"covered":14,"skipped":0,"pct":93.33},"branches":{"total":6,"covered":5,"skipped":0,"pct":83.33}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/helpers/normalize-array.js": {"lines":{"total":3,"covered":3,"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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/winnow/src/query/standard-query.js": {"lines":{"total":17,"covered":16,"skipped":0,"pct":94.11},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":18,"covered":17,"skipped":0,"pct":94.44},"branches":{"total":9,"covered":7,"skipped":0,"pct":77.77}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/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}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/select/fields-select-fragment.js": {"lines":{"total":16,"covered":1,"skipped":0,"pct":6.25},"functions":{"total":4,"covered":0,"skipped":0,"pct":0},"statements":{"total":17,"covered":1,"skipped":0,"pct":5.88},"branches":{"total":14,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/select/geometry-select-fragment.js": {"lines":{"total":16,"covered":2,"skipped":0,"pct":12.5},"functions":{"total":2,"covered":0,"skipped":0,"pct":0},"statements":{"total":16,"covered":2,"skipped":0,"pct":12.5},"branches":{"total":11,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/select/index.js": {"lines":{"total":12,"covered":6,"skipped":0,"pct":50},"functions":{"total":2,"covered":1,"skipped":0,"pct":50},"statements":{"total":12,"covered":6,"skipped":0,"pct":50},"branches":{"total":7,"covered":1,"skipped":0,"pct":14.28}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/where-builder/index.js": {"lines":{"total":78,"covered":10,"skipped":0,"pct":12.82},"functions":{"total":17,"covered":0,"skipped":0,"pct":0},"statements":{"total":78,"covered":10,"skipped":0,"pct":12.82},"branches":{"total":50,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/where-builder/to-json-where.js": {"lines":{"total":51,"covered":3,"skipped":0,"pct":5.88},"functions":{"total":15,"covered":0,"skipped":0,"pct":0},"statements":{"total":55,"covered":3,"skipped":0,"pct":5.45},"branches":{"total":30,"covered":0,"skipped":0,"pct":0}} +} diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index f28849d12..d9bfc08a9 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -1,17 +1,8 @@ -name: CI tests +name: Master CI Tests on: push: branches: [ master ] - pull_request: - branches: - - master - - beta - paths: - - "./.github/**.yml" - - "**/packages/**.js" - - "**/packages/**/package.json" - - "test/**/*.js" jobs: pr-tests: @@ -24,7 +15,14 @@ jobs: # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - - uses: actions/checkout@v3 + - name: Checkout actions + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - run: | + git checkout -b master origin/master + git checkout - + - uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml new file mode 100644 index 000000000..8ca89e071 --- /dev/null +++ b/.github/workflows/pr-tests.yml @@ -0,0 +1,72 @@ +name: PR CI + +on: + pull_request: + branches: + - master + - beta + paths: + - "./.github/**.yml" + - "**/packages/**.js" + - "**/packages/**/package.json" + - "test/**/*.js" + +jobs: + pr-tests: + name: Install, lint, test + runs-on: ${{ matrix.os }} + strategy: + matrix: + node-version: [18.x] + os: [ubuntu-latest, windows-latest] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - name: Checkout actions + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - run: | + git checkout -b master origin/master + git checkout - + + - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + + - name: Install npm 7 + run: npm i -g npm@7 --registry=https://registry.npmjs.org + + - name: Install + run: npm ci + + - name: Lint + run: npm run lint:ci + + - name: Unit tests + run: npm test + + - name: E2E tests + run: npm run test:e2e + + - name: Run Coverage + if: ${{ matrix.os == 'ubuntu-latest' }} + run: npm run cov:changes:json && npm run cov:changes:2:md + + - name: Find previous coverage comment + if: ${{ matrix.os == 'ubuntu-latest' }} + uses: peter-evans/find-comment@v1 + id: findcomment + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: 'github-actions[bot]' + body-includes: Coverage Report + + - name: Create or update comment + if: ${{ matrix.os == 'ubuntu-latest' }} + uses: peter-evans/create-or-update-comment@v4 + with: + comment-id: ${{ steps.findcomment.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body-path: .branch-coverage-changes.md + edit-mode: replace diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4c6888a84..988b198ad 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -44,6 +44,9 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Update coverage badges and report + run: npm run cov:unit:json + - name: Commit version and changelog updates run: "git add --all && git commit -m 'chore: version and changelog' --no-verify" diff --git a/.gitignore b/.gitignore index 034b0b011..81ba244aa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,9 @@ node_modules -coverage -coverage_unit -.nyc_output -.nyc_output_unit +.coverage_html +.coverage_changes_json +.coverage .vscode **/.DS_Store .env -.npmrc \ No newline at end of file +.npmrc +.branch-coverage-changes.md \ No newline at end of file diff --git a/ci/clean-coverage.js b/ci/clean-coverage.js new file mode 100644 index 000000000..a0d2c6129 --- /dev/null +++ b/ci/clean-coverage.js @@ -0,0 +1,5 @@ +const shell = require('shelljs'); + +shell.rm('-rf', './**/.coverage'); +shell.rm('-rf', '.coverage'); +shell.rm('.branch-coverage-changes.md'); \ No newline at end of file diff --git a/ci/format-branch-coverage-changes.js b/ci/format-branch-coverage-changes.js new file mode 100644 index 000000000..b7ba423ec --- /dev/null +++ b/ci/format-branch-coverage-changes.js @@ -0,0 +1,74 @@ +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')) { + writeFileSync(markdownFilePath, `## Coverage Report (change vs master) + No changes. + `, 'utf8'); + return; +} + +const coverageChangesSummary = require('../.coverage_changes_json/coverage-summary.json'); +const rows = Object.entries(coverageChangesSummary) + .filter(([filePath]) => { + return filePath !== 'total'; + }) + .map(([filePath, changesCoverage]) => { + const masterCoverage = coverageSummary[filePath]; + const packagePath = filePath.split('packages')[1]; + return [ + `packages${packagePath}`, + formatCovComparison(changesCoverage.statements.pct, masterCoverage.statements.pct), + formatCovComparison(changesCoverage.branches.pct, masterCoverage.branches.pct), + formatCovComparison(changesCoverage.functions.pct, masterCoverage.functions.pct), + formatCovComparison(changesCoverage.lines.pct, masterCoverage.lines.pct) + ]; + }); + +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 +[yg-img]: https://github.com/koopjs/koop/assets/4369192/683b2df8-7379-4e4f-bb36-f5e20b2631d6 +[y-img]: https://github.com/koopjs/koop/assets/4369192/d5214a5c-c5a9-4449-82ca-8a4e922ef9ef +[o-img]: https://github.com/koopjs/koop/assets/4369192/8651f10c-e986-491d-8b51-bc559aac88a2 +[r-img]: https://github.com/koopjs/koop/assets/4369192/a37a56ac-228d-40d9-8ebc-804dbbf08355 + +${alignedTable}`; + +writeFileSync(markdownFilePath, markdown, 'utf8'); + +function formatCovComparison(changePct, mainPct) { + return `${formatCovPct(changePct)} vs ${formatCovPct(mainPct)}`; +} + +function formatCovPct(pct) { + if (pct === 100) { + return `${pct} ![green][g-img]`; + } + + if (pct > 90) { + return `${pct} ![yellowGreen][yg-img]`; + } + + if (pct > 80) { + return `${pct} ![yellow][y-img]`; + } + + if (pct > 70) { + return `${pct} ![orange][o-img]`; + } + + return `${pct} ![red][r-img]`; +} diff --git a/ci/merge-coverage-changes.js b/ci/merge-coverage-changes.js new file mode 100644 index 000000000..ae7f10544 --- /dev/null +++ b/ci/merge-coverage-changes.js @@ -0,0 +1,35 @@ +const { workspaces } = require('../package.json'); +const shell = require('shelljs'); +const fs = require('fs'); +const path = require('path'); +const yargs = require('yargs/yargs'); +const { hideBin } = require('yargs/helpers'); +const argv = yargs(hideBin(process.argv)).argv; +const context = argv.context || 'all'; + +workspaces.forEach((workspace) => { + process.chdir(workspace); + const package = workspace.split(path.sep).pop(); + + const coverageDir = path.join('.coverage', context); + + if (!fs.existsSync(coverageDir)) { + process.chdir('../..'); + return; + } + + console.log(`Package "${package}":`); + process.stdout.write(` - merging ${context} test coverage results...`); + shell.exec(getCmd(package, coverageDir)); + process.stdout.write('completed.\n\n'); + process.chdir('../..'); +}); + +function getCmd(package, coverageDir) { + const destination = path.join('..', '..', coverageDir); + if(package === 'output-geoservices') { + return `cp ${coverageDir}/coverage-final.json ${destination}/output-geoservices.json > /dev/null`; + } + + return `npx nyc merge ${coverageDir}/analysis ${destination}/${package}.json > /dev/null`; +} \ No newline at end of file diff --git a/ci/run-coverage-on-branch-changes.js b/ci/run-coverage-on-branch-changes.js new file mode 100644 index 000000000..b0f77ff4e --- /dev/null +++ b/ci/run-coverage-on-branch-changes.js @@ -0,0 +1,56 @@ +const shell = require('shelljs'); +const git = require('simple-git'); +const path = require('path'); + +const { workspaces } = require('../package.json'); + +async function execute () { + for (let i = 0; i < workspaces.length; i++) { + const workspace = workspaces[i]; + process.chdir(workspace); + const package = workspace.split(path.sep).pop(); + + const {files} = await git().diffSummary(['--name-only', '--relative', 'origin/master']); + + const srcFiles = files.filter(({ file }) => { + return file.endsWith('.js') && !file.endsWith('spec.js'); + }).map(({ file }) => { + return `-n ${file}`; + }); + + if (srcFiles.length === 0) { + process.chdir('../..'); + continue; + } + + console.log(`Package "${package}":`); + process.stdout.write(' - running branch-changes test coverage...'); + shell.exec(getCovCmd(package, srcFiles)); + process.stdout.write('completed.\n\n'); + process.chdir('../..'); + } +} + +execute().then(() => { + process.exit(); +}).catch(error => { + console.error(error); + process.exit(1); +}); + + +function getCovCmd(package, srcFiles) { + if (package === 'output-geoservices') { + return 'npm test -- --coverage --changedSince=master --coverageDirectory=.coverage/changes --reporters --silent > /dev/null'; + } + + return `npx nyc -r=json --report-dir=.coverage/changes --temp-dir=.coverage/changes/analysis ${srcFiles.join(' ')} ${getTestCmd(package)}`; +} + +function getTestCmd(package) { + if (package === 'featureserver' || package === 'winnow') { + return 'npm run test:unit > /dev/null'; + } + + return 'npm run test > /dev/null'; +} \ No newline at end of file diff --git a/ci/run-report-on-branch-changes.js b/ci/run-report-on-branch-changes.js new file mode 100644 index 000000000..0c7c4bb1f --- /dev/null +++ b/ci/run-report-on-branch-changes.js @@ -0,0 +1,9 @@ +const shell = require('shelljs'); +const fs = require('fs'); + +if (!fs.existsSync('.coverage/changes')) { + console.log('No changes to report!'); + return; +} + +shell.exec('nyc report --temp-dir=.coverage/changes --reporter=json-summary --report-dir=.coverage_changes_json'); diff --git a/ci/run-test-coverage-analysis.js b/ci/run-test-coverage-analysis.js new file mode 100644 index 000000000..e72923e5b --- /dev/null +++ b/ci/run-test-coverage-analysis.js @@ -0,0 +1,45 @@ + +const { workspaces } = require('../package.json'); +const shell = require('shelljs'); +const path = require('path'); +const yargs = require('yargs/yargs'); +const { hideBin } = require('yargs/helpers'); +const argv = yargs(hideBin(process.argv)).argv; +const context = argv.context || 'all'; + +workspaces.forEach((workspace) => { + process.chdir(workspace); + const package = workspace.split(path.sep).pop(); + console.log(`Package "${package}":`); + process.stdout.write(` - running ${context} test coverage...`); + shell.exec(getCovCmd(package, context)); + process.stdout.write('completed.\n'); + process.stdout.write(` - generating ${context} test coverage badge...`); + shell.exec(getBadgeCmd(package, context)); + process.stdout.write('completed.\n\n'); + process.chdir('../..'); +}); + +function getCovCmd(package, context) { + if (package === '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)}`; +} + +function getBadgeCmd(package, context) { + if (context === 'unit' && (package === 'featureserver' || package === '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')) { + return 'npm run test:unit > /dev/null'; + } + + return 'npm run test > /dev/null'; +} \ No newline at end of file diff --git a/jest.config.js b/jest.config.js index 4b9b1ef70..e3267a8f7 100644 --- a/jest.config.js +++ b/jest.config.js @@ -107,7 +107,7 @@ const config = { // projects: undefined, // Use this configuration option to add custom reporters to Jest - // reporters: undefined, + //reporters: [], // Automatically reset mock state before every test // resetMocks: false, diff --git a/package-lock.json b/package-lock.json index 3fb2119ae..41cd8aad0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,13 +36,17 @@ "husky": "^8.0.3", "jest": "^29.7.0", "jest-coverage-badges-ng": "^1.0.1", + "json2md": "^2.0.1", "lerna": "^8.1.2", "lerna-changelog": "^2.2.0", "lint-staged": "^15.2.2", "nyc": "^15.1.0", "prettier": "^3.2.5", + "shelljs": "^0.8.5", + "simple-git": "^3.22.0", "snyk": "^1.1280.0", - "supertest": "^6.3.4" + "supertest": "^6.3.4", + "yargs": "^17.7.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -2996,6 +3000,21 @@ "resolved": "packages/winnow", "link": true }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, "node_modules/@lerna/create": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.1.2.tgz", @@ -9976,6 +9995,12 @@ "node": ">=8" } }, + "node_modules/indento": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/indento/-/indento-1.1.13.tgz", + "integrity": "sha512-YZWk3mreBEM7sBPddsiQnW9Z8SGg/gNpFfscJq00HCDS7pxcQWWWMSVKJU7YkTRyDu1Zv2s8zaK8gQWKmCXHlg==", + "dev": true + }, "node_modules/infer-owner": { "version": "1.0.4", "dev": true, @@ -10173,6 +10198,15 @@ "node": ">= 0.4" } }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/ip": { "version": "2.0.0", "dev": true, @@ -10828,9 +10862,10 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -12618,6 +12653,15 @@ "dev": true, "license": "ISC" }, + "node_modules/json2md": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/json2md/-/json2md-2.0.1.tgz", + "integrity": "sha512-VbwmZ83qmUfKBS2pUOHlzNKEZFPBeJSbzEok3trMYyboZUgdHNn1XZfc1uT8UZs1GHCrmRUBXCfqw4YmmQuOhw==", + "dev": true, + "dependencies": { + "indento": "^1.1.13" + } + }, "node_modules/json5": { "version": "2.2.3", "license": "MIT", @@ -18424,6 +18468,18 @@ "node": ">=8.10.0" } }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/redent": { "version": "3.0.0", "dev": true, @@ -18928,6 +18984,23 @@ "node": ">=8" } }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/should": { "version": "13.2.3", "dev": true, @@ -19182,6 +19255,21 @@ "simple-concat": "^1.0.0" } }, + "node_modules/simple-git": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", + "integrity": "sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==", + "dev": true, + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, "node_modules/simple-statistics": { "version": "7.8.3", "license": "ISC", @@ -23994,6 +24082,21 @@ "wkt-parser": "^1.3.3" } }, + "@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "requires": { + "debug": "^4.1.1" + } + }, + "@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, "@lerna/create": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.1.2.tgz", @@ -28910,6 +29013,12 @@ "version": "4.0.0", "dev": true }, + "indento": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/indento/-/indento-1.1.13.tgz", + "integrity": "sha512-YZWk3mreBEM7sBPddsiQnW9Z8SGg/gNpFfscJq00HCDS7pxcQWWWMSVKJU7YkTRyDu1Zv2s8zaK8gQWKmCXHlg==", + "dev": true + }, "infer-owner": { "version": "1.0.4", "dev": true @@ -29056,6 +29165,12 @@ "side-channel": "^1.0.4" } }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, "ip": { "version": "2.0.0", "dev": true @@ -29461,7 +29576,9 @@ } }, "istanbul-reports": { - "version": "3.1.5", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -30750,6 +30867,15 @@ "version": "5.0.1", "dev": true }, + "json2md": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/json2md/-/json2md-2.0.1.tgz", + "integrity": "sha512-VbwmZ83qmUfKBS2pUOHlzNKEZFPBeJSbzEok3trMYyboZUgdHNn1XZfc1uT8UZs1GHCrmRUBXCfqw4YmmQuOhw==", + "dev": true, + "requires": { + "indento": "^1.1.13" + } + }, "json5": { "version": "2.2.3" }, @@ -34790,6 +34916,15 @@ "picomatch": "^2.2.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, "redent": { "version": "3.0.0", "dev": true, @@ -35121,6 +35256,17 @@ "version": "3.0.0", "dev": true }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "should": { "version": "13.2.3", "dev": true, @@ -35302,6 +35448,17 @@ "simple-concat": "^1.0.0" } }, + "simple-git": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", + "integrity": "sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==", + "dev": true, + "requires": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + } + }, "simple-statistics": { "version": "7.8.3" }, diff --git a/package.json b/package.json index 88bdd7b8c..8e8670c3b 100644 --- a/package.json +++ b/package.json @@ -11,13 +11,13 @@ "commit": "cz", "precommit": "lint-staged && npm test --workspaces", "test": "npm test --workspaces", - "test:cov": "npm run test:cov --workspaces && npm run cov:compile && npm run cov:report", - "test:cov:unit": "npm run test:cov:unit --workspaces && npm run cov:compile:unit && npm run cov:report:unit", - "cov:compile": "nyc merge packages/cache-memory/.nyc_output .nyc_output/cache-memory.json && nyc merge packages/featureserver/.nyc_output .nyc_output/featureserver.json && nyc merge packages/core/.nyc_output .nyc_output/core.json && nyc merge packages/logger/.nyc_output .nyc_output/logger.json && cp packages/output-geoservices/coverage/coverage-final.json .nyc_output/output-geoservices.json && nyc merge packages/winnow/.nyc_output .nyc_output/winnow.json", - "cov:compile:unit": "nyc merge packages/cache-memory/.nyc_output .nyc_output_unit/cache-memory.json && nyc merge packages/featureserver/.nyc_output_unit .nyc_output_unit/featureserver.json && nyc merge packages/core/.nyc_output .nyc_output_unit/core.json && nyc merge packages/logger/.nyc_output .nyc_output_unit/logger.json && cp packages/output-geoservices/coverage/coverage-final.json .nyc_output_unit/output-geoservices.json && nyc merge packages/winnow/.nyc_output_unit .nyc_output_unit/winnow.json", - "cov:report": "nyc report --reporter=html", - "cov:report:unit": "nyc report --temp-dir=.nyc_output_unit --report-dir=coverage_unit --reporter=html", "test:e2e": "cross-env SUPPRESS_NO_CONFIG_WARNING=true DATA_DIR=./test/provider-data jest", + "cov:all:html": "node ci/run-test-coverage-analysis && node ci/merge-coverage-changes && nyc report --temp-dir=.coverage/all --reporter=html --report-dir=.coverage_html", + "cov:unit:html": "node ci/run-test-coverage-analysis --context=unit && node ci/merge-coverage-changes --context=unit && nyc report --temp-dir=.coverage/all --reporter=html --report-dir=.coverage_html", + "cov:unit:json": "node ci/run-test-coverage-analysis --context=unit && node ci/merge-coverage-changes && nyc report --temp-dir=.coverage/all --reporter=json-summary --report-dir=.coverage_json", + "cov:changes:json": "npm run cov:clean && node ci/run-coverage-on-branch-changes.js && node ci/merge-coverage-changes --context=changes && node ci/run-report-on-branch-changes", + "cov:clean": "node ci/clean-coverage", + "cov:changes:2:md": "node ci/format-branch-coverage-changes.js", "version": "changeset version", "release:npm": "changeset publish", "release:github": "node gh-release.js", @@ -62,13 +62,17 @@ "husky": "^8.0.3", "jest": "^29.7.0", "jest-coverage-badges-ng": "^1.0.1", + "json2md": "^2.0.1", "lerna": "^8.1.2", "lerna-changelog": "^2.2.0", "lint-staged": "^15.2.2", "nyc": "^15.1.0", "prettier": "^3.2.5", + "shelljs": "^0.8.5", + "simple-git": "^3.22.0", "snyk": "^1.1280.0", - "supertest": "^6.3.4" + "supertest": "^6.3.4", + "yargs": "^17.7.2" }, "config": { "commitizen": { diff --git a/packages/cache-memory/package.json b/packages/cache-memory/package.json index 109f7181b..a009b165d 100644 --- a/packages/cache-memory/package.json +++ b/packages/cache-memory/package.json @@ -4,10 +4,7 @@ "description": "An in-memory cache for KOop", "main": "src/index.js", "scripts": { - "test": "tape src/**/*.spec.js | tap-spec", - "test:cov:unit": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "test:cov": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "cov:badge": "coverage-badges-cli --output ./coverage.svg" + "test": "tape src/**/*.spec.js | tap-spec" }, "repository": { "type": "git", diff --git a/packages/core/package.json b/packages/core/package.json index ca1443fa8..0a2813320 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -67,9 +67,6 @@ "url": "git://github.com/koopjs/koop.git" }, "scripts": { - "test": "mocha '**/*.spec.js' ", - "test:cov:unit": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge", - "test:cov": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge", - "cov:badge": "coverage-badges-cli --output ./coverage.svg" + "test": "mocha '**/*.spec.js' " } } diff --git a/packages/featureserver/package.json b/packages/featureserver/package.json index 24abce5a7..9b01c04e1 100644 --- a/packages/featureserver/package.json +++ b/packages/featureserver/package.json @@ -8,11 +8,7 @@ }, "scripts": { "test": "mocha '**/*.spec.js' --recursive -t 5000", - "test:cov": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge && npm run test:cov:unit", - "test:cov:unit": "nyc -r=json-summary --report-dir=coverage_unit --temp-dir=.nyc_output_unit mocha 'src/**/*.spec.js' && npm run cov:badge:unit", - "test:cov:unit:loc": "nyc -r=html --report-dir=coverage_unit --temp-dir=.nyc_output_unit mocha 'src/**/*.spec.js' && npm run cov:badge:unit", - "cov:badge": "coverage-badges-cli --output ./coverage.svg", - "cov:badge:unit": "coverage-badges-cli --source coverage_unit/coverage-summary.json --output ./coverage-unit.svg" + "test:unit": "mocha 'src/**/*.spec.js' --recursive -t 5000" }, "contributors": [ { diff --git a/packages/logger/package.json b/packages/logger/package.json index 1a27be24d..e3c7d6505 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -4,10 +4,7 @@ "description": "A shared logger for Koop", "main": "src/index.js", "scripts": { - "test": "tape src/**/*.spec.js | tap-spec", - "test:cov": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "test:cov:unit": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "cov:badge": "coverage-badges-cli --output ./coverage.svg" + "test": "tape src/**/*.spec.js | tap-spec" }, "repository": { "type": "git", diff --git a/packages/output-geoservices/package.json b/packages/output-geoservices/package.json index 1f8c2dd6b..2568caa9e 100644 --- a/packages/output-geoservices/package.json +++ b/packages/output-geoservices/package.json @@ -4,10 +4,7 @@ "description": "Wraps FeatureServer as a Koop output plugin", "main": "src/index.js", "scripts": { - "test": "jest", - "test:cov:unit": "jest --coverage && npm run cov:badge", - "test:cov": "jest --coverage && npm run cov:badge", - "cov:badge": "coverage-badges --output ./coverage.svg" + "test": "jest" }, "repository": { "type": "git", @@ -36,11 +33,16 @@ "@koopjs/logger": "5.0.0" }, "jest": { + "coverageProvider": "v8", + + "coverageDirectory": ".coverage", + "coverageReporters": [ - "json-summary", - "json", - "text", - "lcov" + "json", "json-summary" + ], + + "testMatch": [ + "/src/**/*.spec.[jt]s?(x)" ] } } diff --git a/packages/winnow/coverage-unit.svg b/packages/winnow/coverage-unit.svg index 2f18fe687..f2e73d2ed 100644 --- a/packages/winnow/coverage-unit.svg +++ b/packages/winnow/coverage-unit.svg @@ -1,20 +1,20 @@ - - coverage: 96.6% + + coverage: 72.17% - + - - + + \ No newline at end of file diff --git a/packages/winnow/package.json b/packages/winnow/package.json index 4af240819..41fed149e 100644 --- a/packages/winnow/package.json +++ b/packages/winnow/package.json @@ -8,11 +8,7 @@ }, "scripts": { "test": "tape **/*.spec.js | tap-spec", - "test:cov": "nyc -r=json-summary tape '**/*.spec.js' | tap-spec && npm run cov:badge && npm run test:cov:unit", - "test:cov:unit": "nyc -r=json-summary --report-dir=coverage_unit --temp-dir=.nyc_output_unit tape 'src/**/*.spec.js' | tap-spec && npm run cov:badge:unit", - "test:cov:unit:loc": "nyc -r=html --report-dir=coverage_unit --temp-dir=.nyc_output_unit tape 'src/**/*.spec.js' | tap-spec && npm run cov:badge:unit", - "cov:badge": "coverage-badges-cli --output ./coverage.svg", - "cov:badge:unit": "coverage-badges-cli --source coverage_unit/coverage-summary.json --output ./coverage-unit.svg", + "test:unit": "tape src/**/*.spec.js | tap-spec", "benchmark": "node benchmark/index.js", "benchmark:ci": "node benchmark/index.js | tee benchmark-result.txt" },