diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 6efb8d6d5..ff8a3a018 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -25,6 +25,9 @@ jobs: - name: Update README.md run: sed -i "s|.*|${{ env.VERSION }}|g" README.md + - name: Update Docs + run: 'sed -i "s|docs-version: .*|docs-version: ${{ env.VERSION }}|g" docs/docs/antora.yml' + - name: Commit release POM and Tag run: | git config --local user.email "action@github.com" diff --git a/.gitignore b/.gitignore index ede60376a..b3c9a5c5a 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,3 @@ target /bin LineString.* results.* -docs/* diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..410f47b23 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +/build +node_modules diff --git a/docs/docs.yml b/docs/docs.yml new file mode 100644 index 000000000..db07b2fad --- /dev/null +++ b/docs/docs.yml @@ -0,0 +1,16 @@ +site: + title: Neo4j-Spatial User Guide + url: /neo4j-spatial-docs +content: + sources: + - url: ../ + start_path: docs/docs + branches: HEAD +ui: + bundle: + url: https://static-content.neo4j.com/build/ui-bundle.zip + snapshot: true +asciidoc: + attributes: + page-theme: docs + page-cdn: /_/ diff --git a/docs/docs/antora.yml b/docs/docs/antora.yml new file mode 100644 index 000000000..7846b0f3f --- /dev/null +++ b/docs/docs/antora.yml @@ -0,0 +1,13 @@ +name: neo4j-spatial +version: 5.0 +title: Neo4j-Spatial User Guide +nav: + - modules/ROOT/nav.adoc + +asciidoc: + attributes: + docs-version: 5.20 + copyright: Neo4j Inc. + page-product: Neo4j Spatial + page-type: Neo4j Spatial Manual + page-canonical-root: /labs diff --git a/docs/docs/modules/ROOT/examples/GeoPipesDocTest.java b/docs/docs/modules/ROOT/examples/GeoPipesDocTest.java new file mode 120000 index 000000000..94fcd9b2f --- /dev/null +++ b/docs/docs/modules/ROOT/examples/GeoPipesDocTest.java @@ -0,0 +1 @@ +../../../../../src/test/java/org/neo4j/gis/spatial/pipes/GeoPipesDocTest.java \ No newline at end of file diff --git a/docs/docs/modules/ROOT/examples/TestsForDocs.java b/docs/docs/modules/ROOT/examples/TestsForDocs.java new file mode 120000 index 000000000..da3d7ce5a --- /dev/null +++ b/docs/docs/modules/ROOT/examples/TestsForDocs.java @@ -0,0 +1 @@ +../../../../../src/test/java/org/neo4j/gis/spatial/TestsForDocs.java \ No newline at end of file diff --git a/src/docs/dev/export_to_gml.xml b/docs/docs/modules/ROOT/examples/export_to_gml.xml similarity index 100% rename from src/docs/dev/export_to_gml.xml rename to docs/docs/modules/ROOT/examples/export_to_gml.xml diff --git a/docs/docs/modules/ROOT/images/Geoserver-1-logged-in.png b/docs/docs/modules/ROOT/images/Geoserver-1-logged-in.png new file mode 100644 index 000000000..0c4fae573 Binary files /dev/null and b/docs/docs/modules/ROOT/images/Geoserver-1-logged-in.png differ diff --git a/docs/docs/modules/ROOT/images/Geoserver-10-layer-group-settings.png b/docs/docs/modules/ROOT/images/Geoserver-10-layer-group-settings.png new file mode 100644 index 000000000..2b349454b Binary files /dev/null and b/docs/docs/modules/ROOT/images/Geoserver-10-layer-group-settings.png differ diff --git a/docs/docs/modules/ROOT/images/Geoserver-11-layer-preview-list.png b/docs/docs/modules/ROOT/images/Geoserver-11-layer-preview-list.png new file mode 100644 index 000000000..dfa997a09 Binary files /dev/null and b/docs/docs/modules/ROOT/images/Geoserver-11-layer-preview-list.png differ diff --git a/docs/docs/modules/ROOT/images/Geoserver-12-layer-group-preview.png b/docs/docs/modules/ROOT/images/Geoserver-12-layer-group-preview.png new file mode 100644 index 000000000..382bd3166 Binary files /dev/null and b/docs/docs/modules/ROOT/images/Geoserver-12-layer-group-preview.png differ diff --git a/docs/docs/modules/ROOT/images/Geoserver-13-layers-preview-with-styles.png b/docs/docs/modules/ROOT/images/Geoserver-13-layers-preview-with-styles.png new file mode 100644 index 000000000..af69943ad Binary files /dev/null and b/docs/docs/modules/ROOT/images/Geoserver-13-layers-preview-with-styles.png differ diff --git a/docs/docs/modules/ROOT/images/Geoserver-2-add-new-store.png b/docs/docs/modules/ROOT/images/Geoserver-2-add-new-store.png new file mode 100644 index 000000000..41b14d02f Binary files /dev/null and b/docs/docs/modules/ROOT/images/Geoserver-2-add-new-store.png differ diff --git a/docs/docs/modules/ROOT/images/Geoserver-3-path-to-neo4j-db.png b/docs/docs/modules/ROOT/images/Geoserver-3-path-to-neo4j-db.png new file mode 100644 index 000000000..3b2481c6b Binary files /dev/null and b/docs/docs/modules/ROOT/images/Geoserver-3-path-to-neo4j-db.png differ diff --git a/docs/docs/modules/ROOT/images/Geoserver-5-choose-new-layer.png b/docs/docs/modules/ROOT/images/Geoserver-5-choose-new-layer.png new file mode 100644 index 000000000..a8d683c7c Binary files /dev/null and b/docs/docs/modules/ROOT/images/Geoserver-5-choose-new-layer.png differ diff --git a/docs/docs/modules/ROOT/images/Geoserver-6-choose-new-layer2.png b/docs/docs/modules/ROOT/images/Geoserver-6-choose-new-layer2.png new file mode 100644 index 000000000..96a96d607 Binary files /dev/null and b/docs/docs/modules/ROOT/images/Geoserver-6-choose-new-layer2.png differ diff --git a/docs/docs/modules/ROOT/images/Geoserver-6-publish-layer-settings.png b/docs/docs/modules/ROOT/images/Geoserver-6-publish-layer-settings.png new file mode 100644 index 000000000..2c506a53f Binary files /dev/null and b/docs/docs/modules/ROOT/images/Geoserver-6-publish-layer-settings.png differ diff --git a/docs/docs/modules/ROOT/images/Geoserver-7-four-layers-published.png b/docs/docs/modules/ROOT/images/Geoserver-7-four-layers-published.png new file mode 100644 index 000000000..3d3bc197f Binary files /dev/null and b/docs/docs/modules/ROOT/images/Geoserver-7-four-layers-published.png differ diff --git a/docs/docs/modules/ROOT/images/Geoserver-8-single-layer-preview.png b/docs/docs/modules/ROOT/images/Geoserver-8-single-layer-preview.png new file mode 100644 index 000000000..053d081d2 Binary files /dev/null and b/docs/docs/modules/ROOT/images/Geoserver-8-single-layer-preview.png differ diff --git a/docs/docs/modules/ROOT/images/Geoserver-9-layer-groups.png b/docs/docs/modules/ROOT/images/Geoserver-9-layer-groups.png new file mode 100644 index 000000000..f076fd4a7 Binary files /dev/null and b/docs/docs/modules/ROOT/images/Geoserver-9-layer-groups.png differ diff --git a/docs/docs/modules/ROOT/images/Udig-map2-rt90.png b/docs/docs/modules/ROOT/images/Udig-map2-rt90.png new file mode 100644 index 000000000..d539907ef Binary files /dev/null and b/docs/docs/modules/ROOT/images/Udig-map2-rt90.png differ diff --git a/docs/docs/modules/ROOT/images/Udig-map2-styled.png b/docs/docs/modules/ROOT/images/Udig-map2-styled.png new file mode 100644 index 000000000..3e098291b Binary files /dev/null and b/docs/docs/modules/ROOT/images/Udig-map2-styled.png differ diff --git a/docs/docs/modules/ROOT/images/Udig-map2.png b/docs/docs/modules/ROOT/images/Udig-map2.png new file mode 100644 index 000000000..9294c4d93 Binary files /dev/null and b/docs/docs/modules/ROOT/images/Udig-map2.png differ diff --git a/docs/docs/modules/ROOT/images/Udig-multi-styled-layers.png b/docs/docs/modules/ROOT/images/Udig-multi-styled-layers.png new file mode 100644 index 000000000..a9020cdd0 Binary files /dev/null and b/docs/docs/modules/ROOT/images/Udig-multi-styled-layers.png differ diff --git a/docs/docs/modules/ROOT/images/generated/affine_transformation.png b/docs/docs/modules/ROOT/images/generated/affine_transformation.png new file mode 100644 index 000000000..d4e63017c Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/affine_transformation.png differ diff --git a/docs/docs/modules/ROOT/images/generated/boundary.png b/docs/docs/modules/ROOT/images/generated/boundary.png new file mode 100644 index 000000000..fedd60cd8 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/boundary.png differ diff --git a/docs/docs/modules/ROOT/images/generated/buffer.png b/docs/docs/modules/ROOT/images/generated/buffer.png new file mode 100644 index 000000000..314910aa3 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/buffer.png differ diff --git a/docs/docs/modules/ROOT/images/generated/centroid.png b/docs/docs/modules/ROOT/images/generated/centroid.png new file mode 100644 index 000000000..a7bda292f Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/centroid.png differ diff --git a/docs/docs/modules/ROOT/images/generated/convex_hull.png b/docs/docs/modules/ROOT/images/generated/convex_hull.png new file mode 100644 index 000000000..e72d5fd07 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/convex_hull.png differ diff --git a/docs/docs/modules/ROOT/images/generated/densify.png b/docs/docs/modules/ROOT/images/generated/densify.png new file mode 100644 index 000000000..e47b0c9a2 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/densify.png differ diff --git a/docs/docs/modules/ROOT/images/generated/difference.png b/docs/docs/modules/ROOT/images/generated/difference.png new file mode 100644 index 000000000..193d97eed Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/difference.png differ diff --git a/docs/docs/modules/ROOT/images/generated/end_point.png b/docs/docs/modules/ROOT/images/generated/end_point.png new file mode 100644 index 000000000..f3547517d Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/end_point.png differ diff --git a/docs/docs/modules/ROOT/images/generated/envelope.png b/docs/docs/modules/ROOT/images/generated/envelope.png new file mode 100644 index 000000000..95f953772 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/envelope.png differ diff --git a/docs/docs/modules/ROOT/images/generated/extract_points.png b/docs/docs/modules/ROOT/images/generated/extract_points.png new file mode 100644 index 000000000..099e7382e Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/extract_points.png differ diff --git a/docs/docs/modules/ROOT/images/generated/intersect_all.png b/docs/docs/modules/ROOT/images/generated/intersect_all.png new file mode 100644 index 000000000..86ced6060 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/intersect_all.png differ diff --git a/docs/docs/modules/ROOT/images/generated/intersecting_windows.png b/docs/docs/modules/ROOT/images/generated/intersecting_windows.png new file mode 100644 index 000000000..316c965e8 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/intersecting_windows.png differ diff --git a/docs/docs/modules/ROOT/images/generated/intersection.png b/docs/docs/modules/ROOT/images/generated/intersection.png new file mode 100644 index 000000000..f718bd0b7 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/intersection.png differ diff --git a/docs/docs/modules/ROOT/images/generated/layers/boxesLayer.png b/docs/docs/modules/ROOT/images/generated/layers/boxesLayer.png new file mode 100644 index 000000000..41da23f8e Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/layers/boxesLayer.png differ diff --git a/docs/docs/modules/ROOT/images/generated/layers/concaveLayer.png b/docs/docs/modules/ROOT/images/generated/layers/concaveLayer.png new file mode 100644 index 000000000..4907bf0b6 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/layers/concaveLayer.png differ diff --git a/docs/docs/modules/ROOT/images/generated/layers/equalLayer.png b/docs/docs/modules/ROOT/images/generated/layers/equalLayer.png new file mode 100644 index 000000000..0d105c9f1 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/layers/equalLayer.png differ diff --git a/docs/docs/modules/ROOT/images/generated/layers/intersectionLayer.png b/docs/docs/modules/ROOT/images/generated/layers/intersectionLayer.png new file mode 100644 index 000000000..da9d0a153 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/layers/intersectionLayer.png differ diff --git a/docs/docs/modules/ROOT/images/generated/layers/linesLayer.png b/docs/docs/modules/ROOT/images/generated/layers/linesLayer.png new file mode 100644 index 000000000..592f9f44c Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/layers/linesLayer.png differ diff --git a/docs/docs/modules/ROOT/images/generated/layers/osmLayer.png b/docs/docs/modules/ROOT/images/generated/layers/osmLayer.png new file mode 100644 index 000000000..64e49c356 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/layers/osmLayer.png differ diff --git a/docs/docs/modules/ROOT/images/generated/max.png b/docs/docs/modules/ROOT/images/generated/max.png new file mode 100644 index 000000000..316c965e8 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/max.png differ diff --git a/docs/docs/modules/ROOT/images/generated/min.png b/docs/docs/modules/ROOT/images/generated/min.png new file mode 100644 index 000000000..3fb6f122d Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/min.png differ diff --git a/docs/docs/modules/ROOT/images/generated/start_point.png b/docs/docs/modules/ROOT/images/generated/start_point.png new file mode 100644 index 000000000..7bd273d1b Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/start_point.png differ diff --git a/docs/docs/modules/ROOT/images/generated/step1_break_up_all_geometries_into_points_and_make_density_islands.png b/docs/docs/modules/ROOT/images/generated/step1_break_up_all_geometries_into_points_and_make_density_islands.png new file mode 100644 index 000000000..40383929b Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/step1_break_up_all_geometries_into_points_and_make_density_islands.png differ diff --git a/docs/docs/modules/ROOT/images/generated/step2_break_up_all_geometries_into_points_and_make_density_islands.png b/docs/docs/modules/ROOT/images/generated/step2_break_up_all_geometries_into_points_and_make_density_islands.png new file mode 100644 index 000000000..561f0715b Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/step2_break_up_all_geometries_into_points_and_make_density_islands.png differ diff --git a/docs/docs/modules/ROOT/images/generated/step3_break_up_all_geometries_into_points_and_make_density_islands.png b/docs/docs/modules/ROOT/images/generated/step3_break_up_all_geometries_into_points_and_make_density_islands.png new file mode 100644 index 000000000..039d17474 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/step3_break_up_all_geometries_into_points_and_make_density_islands.png differ diff --git a/docs/docs/modules/ROOT/images/generated/step4_break_up_all_geometries_into_points_and_make_density_islands.png b/docs/docs/modules/ROOT/images/generated/step4_break_up_all_geometries_into_points_and_make_density_islands.png new file mode 100644 index 000000000..4659deb86 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/step4_break_up_all_geometries_into_points_and_make_density_islands.png differ diff --git a/docs/docs/modules/ROOT/images/generated/step5_break_up_all_geometries_into_points_and_make_density_islands.png b/docs/docs/modules/ROOT/images/generated/step5_break_up_all_geometries_into_points_and_make_density_islands.png new file mode 100644 index 000000000..378c57acf Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/step5_break_up_all_geometries_into_points_and_make_density_islands.png differ diff --git a/docs/docs/modules/ROOT/images/generated/union.png b/docs/docs/modules/ROOT/images/generated/union.png new file mode 100644 index 000000000..12ad94b0a Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/union.png differ diff --git a/docs/docs/modules/ROOT/images/generated/unite_all.png b/docs/docs/modules/ROOT/images/generated/unite_all.png new file mode 100644 index 000000000..b07e87df8 Binary files /dev/null and b/docs/docs/modules/ROOT/images/generated/unite_all.png differ diff --git a/docs/docs/modules/ROOT/images/one-street.png b/docs/docs/modules/ROOT/images/one-street.png new file mode 100644 index 000000000..16c0dc036 Binary files /dev/null and b/docs/docs/modules/ROOT/images/one-street.png differ diff --git a/docs/docs/modules/ROOT/images/translate_geometries.png b/docs/docs/modules/ROOT/images/translate_geometries.png new file mode 100644 index 000000000..4291eb288 Binary files /dev/null and b/docs/docs/modules/ROOT/images/translate_geometries.png differ diff --git a/docs/docs/modules/ROOT/index.adoc b/docs/docs/modules/ROOT/index.adoc new file mode 100644 index 000000000..e69de29bb diff --git a/docs/docs/modules/ROOT/nav.adoc b/docs/docs/modules/ROOT/nav.adoc new file mode 100644 index 000000000..a850148e2 --- /dev/null +++ b/docs/docs/modules/ROOT/nav.adoc @@ -0,0 +1,5 @@ +* xref:overview/introduction.adoc[] +* xref::dev/index.adoc[] +** Examples +*** xref:geo-pipes/index.adoc[] +* xref:appendix/index.adoc[] diff --git a/src/docs/dev/geoserver.adoc b/docs/docs/modules/ROOT/pages/appendix/geoserver.adoc similarity index 100% rename from src/docs/dev/geoserver.adoc rename to docs/docs/modules/ROOT/pages/appendix/geoserver.adoc diff --git a/src/docs/dev/geoserver2.adoc b/docs/docs/modules/ROOT/pages/appendix/geoserver2.adoc similarity index 96% rename from src/docs/dev/geoserver2.adoc rename to docs/docs/modules/ROOT/pages/appendix/geoserver2.adoc index 9c2aa2cf2..393e484d4 100644 --- a/src/docs/dev/geoserver2.adoc +++ b/docs/docs/modules/ROOT/pages/appendix/geoserver2.adoc @@ -1,3 +1,4 @@ +[[geoserver]] = Neo4j Spatial in GeoServer Neo4j Spatial includes built-in support for a GeoTools data store. This means it is, in principle, directly usable inside GeoServer. This document will discuss how to get it up and running in GeoServer. If you are interested in a desktop GIS, take a look at Neo4j Spatial in uDig. @@ -6,7 +7,8 @@ Neo4j Spatial includes built-in support for a GeoTools data store. This means it === Installing GeoServer -First of all you need to download and install geoserver from http://geoserver.org/display/GEOS/Download. For detailed installation instructions, refer to the official GeoServer documentation athttp://docs.geoserver.org/stable/en/user/installation/index.html +First of all you need to download and install geoserver from http://geoserver.org/display/GEOS/Download. +For detailed installation instructions, refer to the official GeoServer documentation at http://docs.geoserver.org/stable/en/user/installation/index.html Here we provide very basic instructions, with factors to consider regarding installing GeoServer with Neo4j Spatial: * Choose the right version for the version of Neo4j Spatial you are going to use: diff --git a/src/docs/dev/appendix.adoc b/docs/docs/modules/ROOT/pages/appendix/index.adoc similarity index 100% rename from src/docs/dev/appendix.adoc rename to docs/docs/modules/ROOT/pages/appendix/index.adoc diff --git a/src/docs/dev/udig.adoc b/docs/docs/modules/ROOT/pages/appendix/udig.adoc similarity index 98% rename from src/docs/dev/udig.adoc rename to docs/docs/modules/ROOT/pages/appendix/udig.adoc index 1ad5d3dd9..f11bc7147 100644 --- a/src/docs/dev/udig.adoc +++ b/docs/docs/modules/ROOT/pages/appendix/udig.adoc @@ -1,6 +1,7 @@ = Neo4j Spatial in uDig -Neo4j Spatial supports Geotools, and therefor also Geotools based platforms like GeoServer and uDig. For information on setting up and running Neo4j Spatial in GeoServer, see the wiki page <>. +Neo4j Spatial supports Geotools, and therefor also Geotools based platforms like GeoServer and uDig. +For information on setting up and running Neo4j Spatial in GeoServer, see the section <>. == uDig SDK diff --git a/src/docs/dev/examples.adoc b/docs/docs/modules/ROOT/pages/dev/examples.adoc similarity index 78% rename from src/docs/dev/examples.adoc rename to docs/docs/modules/ROOT/pages/dev/examples.adoc index 2dc3a8603..4495d58db 100644 --- a/src/docs/dev/examples.adoc +++ b/docs/docs/modules/ROOT/pages/dev/examples.adoc @@ -1,7 +1,5 @@ [[spatial-examples]] = Examples -:sourceDir: ../../../src/test/java -:leveloffset: 1 [[spatial-import-shapefile]] == Importing a shapefile @@ -10,7 +8,7 @@ Neo4j-Spatial includes a utility for importing ESRI Shapefile data. The Shapefil [source,java,indent=0] ---- -include::{sourceDir}/org/neo4j/gis/spatial/TestsForDocs.java[tags=importShapefile] +include::example$TestsForDocs.java[tags=importShapefile] ---- This code will import the layer 'highway' from the file 'shp/highway.shp' which is included in the source distribution. This layer will be indexed using an RTree and can therefore be queried using any of the supported spatial operations. See the example on querying layers below. @@ -25,7 +23,7 @@ Refer to the unit tests in classes +TestDynamicLayers+ and +TestOSMImport+ for t [source,java,indent=0] ---- -include::{sourceDir}/org/neo4j/gis/spatial/TestsForDocs.java[tags=importOsm] +include::example$TestsForDocs.java[tags=importOsm] ---- This code will import the map.osm Open Street Map file, populating the database with a little over 200 geometries, including streets, buildings and points of interest. @@ -38,7 +36,7 @@ Assuming you imported the map.osm file as in the previous example, you can now p [source,java,indent=0] ---- -include::{sourceDir}/org/neo4j/gis/spatial/TestsForDocs.java[tags=searchBBox] +include::example$TestsForDocs.java[tags=searchBBox] ---- For more examples of query code, refer to the test code in the +LayerTest+ and the +SpatialTest+ classes. @@ -51,50 +49,18 @@ The ESRI Shapefile that we imported in the first example above was actually crea [source,java,indent=0] ---- -include::{sourceDir}/org/neo4j/gis/spatial/TestsForDocs.java[tags=exportShapefileFromOSM] +include::example$TestsForDocs.java[tags=exportShapefileFromOSM] ---- This example shows how we can import an OSM dataset, which contains data with a number of different Geometry types, and then by using a DynamicLayer to select for only geometries of type 'LineString', we can export all the OSM ways to a Shapefile. This is particularly important when you consider that ESRI Shapefile format does not allow more than one Geometry type per shapefile. [source,java,indent=0] ---- -include::{sourceDir}/org/neo4j/gis/spatial/TestsForDocs.java[tags=exportShapefileFromQuery] +include::example$TestsForDocs.java[tags=exportShapefileFromQuery] ---- This time we import the same OSM model, but query for all geometries inside an envelope, and export that to a new Shapefile. -[[spatial-geopipes]] -== GeoPipes - -=== Base Layers - -These are the different base layers being used for the following examples: - -OsmLayer: - -image::osmLayer.png[] - -IntersectionLayer: - -image::intersectionLayer.png[] - -LinesLayer: - -image::linesLayer.png[] - -BoxesLayer: - -image::boxesLayer.png[] - -ConcaveLayer: - -image::concaveLayer.png[] - -EqualLayer: - -image::equalLayer.png[] - -:leveloffset: 2 - -include::geo-pipes.adoc[] +== More Examples +* xref:geo-pipes/index.adoc[] diff --git a/src/docs/dev/index.adoc b/docs/docs/modules/ROOT/pages/dev/index.adoc similarity index 88% rename from src/docs/dev/index.adoc rename to docs/docs/modules/ROOT/pages/dev/index.adoc index d010ae30f..dc866e008 100644 --- a/src/docs/dev/index.adoc +++ b/docs/docs/modules/ROOT/pages/dev/index.adoc @@ -1,4 +1,5 @@ - +:toclevels: 1 += Development :leveloffset: 1 include::indexing.adoc[] diff --git a/src/docs/dev/indexing.adoc b/docs/docs/modules/ROOT/pages/dev/indexing.adoc similarity index 100% rename from src/docs/dev/indexing.adoc rename to docs/docs/modules/ROOT/pages/dev/indexing.adoc diff --git a/docs/docs/modules/ROOT/pages/dev/layers.adoc b/docs/docs/modules/ROOT/pages/dev/layers.adoc new file mode 100644 index 000000000..e47a826bc --- /dev/null +++ b/docs/docs/modules/ROOT/pages/dev/layers.adoc @@ -0,0 +1,16 @@ +[[spatial-layers]] += Layers and GeometryEncoders + +The primary type that defines a collection of geometries is the `Layer`. +A layer contains an index for querying. +In addition, a `Layer` can be an `EditableLayer` if it is possible to add and modify geometries in the layer. +The next most important interface is the GeometryEncoder. + +The `DefaultLayer` is the standard layer, making use of the `WKBGeometryEncoder` for storing all geometry types as `byte[]` properties of one node per geometry instance. + +The `OSMLayer` is a special layer supporting Open Street Map and storing the OSM model as a single fully connected graph. +The set of `Geometries` provided by this layer includes `Points`, `LineStrings` and `Polygons`, and as such cannot be exported to Shapefile format, since that format only allows a single `Geometry` per layer. +However, `OMSLayer` extends `DynamicLayer`, which allow it to provide any number of sub-layers, each with a specific geometry type and in addition based on an OSM tag filter. +For example, you can have a layer providing all cycle paths as `LineStrings`, or a layer providing all lakes as `Polygons`. +Underneath these are all still backed by the same fully connected graph, but exposed dynamically as apparently separate geometry layers. + diff --git a/src/docs/dev/procedures.adoc b/docs/docs/modules/ROOT/pages/dev/procedures.adoc similarity index 86% rename from src/docs/dev/procedures.adoc rename to docs/docs/modules/ROOT/pages/dev/procedures.adoc index 2379fe0f6..a03c9ff88 100644 --- a/src/docs/dev/procedures.adoc +++ b/docs/docs/modules/ROOT/pages/dev/procedures.adoc @@ -9,7 +9,8 @@ After restarting the server, you should be able to use the following *procedure [[table-all]] [separator=¦,opts=header,cols="1m,4,4m"] |=== -¦ name ¦ description ¦ signature ¦ "spatial.addLayer" ¦ "Adds a new layer with the given type (see spatial.getAllLayerTypes) and configuration, returns the layer root node" ¦ "spatial.addLayer(name :: STRING?, type :: STRING?, encoderConfig :: STRING?) :: (node :: NODE?)" +¦ name ¦ description ¦ signature +¦ "spatial.addLayer" ¦ "Adds a new layer with the given type (see spatial.getAllLayerTypes) and configuration, returns the layer root node" ¦ "spatial.addLayer(name :: STRING?, type :: STRING?, encoderConfig :: STRING?) :: (node :: NODE?)" ¦ "spatial.addLayerWithEncoder" ¦ "Adds a new layer with the given encoder class and configuration, returns the layer root node" ¦ "spatial.addLayerWithEncoder(name :: STRING?, encoder :: STRING?, encoderConfig :: STRING?) :: (node :: NODE?)" ¦ "spatial.addNode" ¦ "Adds the given node to the layer, returns the geometry-node" ¦ "spatial.addNode(layerName :: STRING?, node :: NODE?) :: (node :: NODE?)" ¦ "spatial.addNodes" ¦ "Adds the given nodes list to the layer, returns the count" ¦ "spatial.addNodes(layerName :: STRING?, nodes :: LIST? OF NODE?) :: (count :: INTEGER?)" @@ -25,10 +26,10 @@ After restarting the server, you should be able to use the following *procedure ¦ "spatial.closest" ¦ "Finds all geometry nodes in the layer within the distance to the given coordinate" ¦ "spatial.closest(layerName :: STRING?, coordinate :: ANY?, distanceInKm :: FLOAT?) :: (node :: NODE?)" ¦ "spatial.decodeGeometry" ¦ "Returns a geometry of a layer node as internal cypher geometry type, to be passed to other procedures but not returned to a client" ¦ "spatial.decodeGeometry(layerName :: STRING?, node :: NODE?) :: (geometry :: ANY?)" ¦ "spatial.getFeatureAttributes" ¦ "Returns feature attributes of the given layer" ¦ "spatial.getFeatureAttributes(name :: STRING?) :: (name :: STRING?)" -¦ "spatial.importOSM" ¦ "Imports the provided osm-file from URI to a layer of the same name, returns the count of data added" ¦ "spatial.importOSM(uri :: STRING?) :: (count :: INTEGER?)" -¦ "spatial.importOSMToLayer" ¦ "Imports the provided osm-file from URI to a layer, returns the count of data added" ¦ "spatial.importOSMToLayer(layerName :: STRING?, uri :: STRING?) :: (count :: INTEGER?)" -¦ "spatial.importShapefile" ¦ "Imports the provided shape-file from URI to a layer of the same name, returns the count of data added" ¦ "spatial.importShapefile(uri :: STRING?) :: (count :: INTEGER?)" -¦ "spatial.importShapefileToLayer" ¦ "Imports the provided shape-file from URI to the given layer, returns the count of data added" ¦ "spatial.importShapefileToLayer(layerName :: STRING?, uri :: STRING?) :: (count :: INTEGER?)" +¦ "spatial.importOSM" ¦ "Imports the provided osm-file from URI to a layer of the same name, returns the count of data added" ¦ "spatial.importOSM(uri :: STRING?) :: (count :: INTEGER?)" +¦ "spatial.importOSMToLayer" ¦ "Imports the provided osm-file from URI to a layer, returns the count of data added" ¦ "spatial.importOSMToLayer(layerName :: STRING?, uri :: STRING?) :: (count :: INTEGER?)" +¦ "spatial.importShapefile" ¦ "Imports the provided shape-file from URI to a layer of the same name, returns the count of data added" ¦ "spatial.importShapefile(uri :: STRING?) :: (count :: INTEGER?)" +¦ "spatial.importShapefileToLayer" ¦ "Imports the provided shape-file from URI to the given layer, returns the count of data added" ¦ "spatial.importShapefileToLayer(layerName :: STRING?, uri :: STRING?) :: (count :: INTEGER?)" ¦ "spatial.intersects" ¦ "Returns all geometry nodes that intersect the given geometry (shape, polygon) in the layer" ¦ "spatial.intersects(layerName :: STRING?, geometry :: ANY?) :: (node :: NODE?)" ¦ "spatial.layer" ¦ "Returns the layer root node for the given layer name" ¦ "spatial.layer(name :: STRING?) :: (node :: NODE?)" ¦ "spatial.layerTypes" ¦ "Returns the different registered layer types" ¦ "spatial.layerTypes() :: (name :: STRING?, signature :: STRING?)" @@ -40,10 +41,8 @@ After restarting the server, you should be able to use the following *procedure ¦ "spatial.withinDistance" ¦ "Returns all geometry nodes and their ordered distance in the layer within the distance to the given coordinate" ¦ "spatial.withinDistance(layerName :: STRING?, coordinate :: ANY?, distanceInKm :: FLOAT?) :: (node :: NODE?, distance :: FLOAT?)" |=== -//// -[[table-all]] -[separator=¦,opts=header,cols="1m,4,4m"] -|=== -include::../target/generated-documentation/org.neo4j.gis.spatial.procedures.csv[] -|=== -//// +// [[table-all]] +// [separator=¦,opts=header,cols="1m,4,4m"] +// |=== +// include::../target/generated-documentation/org.neo4j.gis.spatial.procedures.csv[] +// |=== diff --git a/src/docs/dev/querying.adoc b/docs/docs/modules/ROOT/pages/dev/querying.adoc similarity index 100% rename from src/docs/dev/querying.adoc rename to docs/docs/modules/ROOT/pages/dev/querying.adoc diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/affine-transformation.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/affine-transformation.adoc new file mode 100644 index 000000000..ffc7f55be --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/affine-transformation.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-affine-transformation]] +== Affine Transformation + +This pipe applies an affine transformation to every geometry. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_affine_transformation] +---- + +Output: + +image::generated/affine_transformation.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/boundary.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/boundary.adoc new file mode 100644 index 000000000..1902d782e --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/boundary.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-boundary]] +== Boundary + +The boundary pipe calculates boundary of every geometry in the pipeline. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_boundary] +---- + +Output: + +image::generated/boundary.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/break-up-all-geometries-into-points-and-make-density-islands.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/break-up-all-geometries-into-points-and-make-density-islands.adoc new file mode 100644 index 000000000..b06a216ca --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/break-up-all-geometries-into-points-and-make-density-islands.adoc @@ -0,0 +1,34 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-break-up-all-geometries-into-points-and-make-density-islands]] +== Break up all geometries into points and make density islands + +This example demonstrates the some pipes chained together to make a full geoprocessing pipeline. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_break_up_all_geometries_into_points_and_make_density_islands] +---- + +Step 1 - startOsm: + +image::generated/step1_break_up_all_geometries_into_points_and_make_density_islands.png[] + +Step 2 - extractOsmPoints: + +image::generated/step2_break_up_all_geometries_into_points_and_make_density_islands.png[] + +Step 3 - groupByDensityIslands: + +image::generated/step3_break_up_all_geometries_into_points_and_make_density_islands.png[] + +Step 4 - toConvexHull: + +image::generated/step4_break_up_all_geometries_into_points_and_make_density_islands.png[] + +Step 5- toBuffer: + +image::generated/step5_break_up_all_geometries_into_points_and_make_density_islands.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/buffer.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/buffer.adoc new file mode 100644 index 000000000..20b0dbcfc --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/buffer.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-buffer]] +== Buffer + +This pipe applies a buffer to geometries. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_buffer] +---- + +Output: + +image::generated/buffer.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/centroid.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/centroid.adoc new file mode 100644 index 000000000..d285aece3 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/centroid.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-centroid]] +== Centroid + +This pipe calculates geometry centroid. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_centroid] +---- + +Output: + +image::generated/centroid.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/convex-hull.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/convex-hull.adoc new file mode 100644 index 000000000..d02574f14 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/convex-hull.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-convex-hull]] +== Convex Hull + +This pipe calculates geometry convex hull. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_convex_hull] +---- + +Output: + +image::generated/convex_hull.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/densify.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/densify.adoc new file mode 100644 index 000000000..51fce3eb4 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/densify.adoc @@ -0,0 +1,19 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-densify]] +== Densify + +This pipe inserts extra vertices along the line segments in the geometry. +The densified geometry contains no line segment which is longer than the given distance tolerance. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_densify] +---- + +Output: + +image::generated/densify.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/difference.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/difference.adoc new file mode 100644 index 000000000..610c21a89 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/difference.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-difference]] +== Difference + +The Difference pipe computes a geometry representing the points making up item geometry that do not make up the given geometry. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_difference] +---- + +Output: + +image::generated/difference.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/end-point.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/end-point.adoc new file mode 100644 index 000000000..2d515a154 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/end-point.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-end-point]] +== End Point + +The EndPoint pipe finds the ending point of item geometry. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_end_point] +---- + +Output: + +image::generated/end_point.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/envelope.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/envelope.adoc new file mode 100644 index 000000000..a01866c31 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/envelope.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-envelope]] +== Envelope + +The Envelope pipe computes the minimum bounding box of item geometry. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_envelope] +---- + +Output: + +image::generated/envelope.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/export-to-gml.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/export-to-gml.adoc new file mode 100644 index 000000000..bbe787428 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/export-to-gml.adoc @@ -0,0 +1,39 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-export-to-gml]] +== Export to GML + +This pipe exports every geometry as a http://en.wikipedia.org/wiki/Geography_Markup_Language[GML] snippet. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_export_to_gml] +---- + +Output: + +[source,xml] +---- + + + + + 2.0,3.0 2.0,5.0 6.0,5.0 6.0,3.0 2.0,3.0 + + + + + + + + + 12.0,26.0 12.0,27.0 13.0,27.0 13.0,26.0 12.0,26.0 + + + + + +---- + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/extract-points.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/extract-points.adoc new file mode 100644 index 000000000..dfee1ae48 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/extract-points.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-extract-points]] +== Extract Points + +This pipe extracts every point from a geometry. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_extract_points] +---- + +Output: + +image::generated/extract_points.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/filter-by-cql-using-bbox.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/filter-by-cql-using-bbox.adoc new file mode 100644 index 000000000..d697ce317 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/filter-by-cql-using-bbox.adoc @@ -0,0 +1,14 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-filter-by-cql-using-bbox]] +== Filter by cql using bbox + +This pipe is filtering according to a CQL Bounding Box description. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_filter_by_cql_using_bbox] +---- + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/filter-by-cql-using-complex-cql.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/filter-by-cql-using-complex-cql.adoc new file mode 100644 index 000000000..609e384d0 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/filter-by-cql-using-complex-cql.adoc @@ -0,0 +1,14 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-filter-by-cql-using-complex-cql]] +== Filter by cql using complex cql + +This pipe is filtering according to a complex CQL description. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_filter_by_cql_using_complex_cql] +---- + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/index.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/index.adoc new file mode 100644 index 000000000..2fd330b6d --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/index.adoc @@ -0,0 +1,24 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +include::affine-transformation.adoc[] +include::boundary.adoc[] +include::break-up-all-geometries-into-points-and-make-density-islands.adoc[] +include::buffer.adoc[] +include::centroid.adoc[] +include::convex-hull.adoc[] +include::densify.adoc[] +include::difference.adoc[] +include::end-point.adoc[] +include::envelope.adoc[] +include::export-to-gml.adoc[] +include::extract-points.adoc[] +include::filter-by-cql-using-bbox.adoc[] +include::filter-by-cql-using-complex-cql.adoc[] +include::intersect-all.adoc[] +include::intersecting-windows.adoc[] +include::intersection.adoc[] +include::max.adoc[] +include::min.adoc[] +include::search-within-geometry.adoc[] +include::start-point.adoc[] +include::union.adoc[] +include::unite-all.adoc[] diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/intersect-all.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/intersect-all.adoc new file mode 100644 index 000000000..a9ba84788 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/intersect-all.adoc @@ -0,0 +1,20 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-intersect-all]] +== Intersect All + +The Intersect All pipe intersects geometries of every item contained in the pipeline. +This pipe groups every item in the pipeline in a single item containing the geometry output +of the intersection. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_intersect_all] +---- + +Output: + +image::generated/intersect_all.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/intersecting-windows.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/intersecting-windows.adoc new file mode 100644 index 000000000..b309fe1c5 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/intersecting-windows.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-intersecting-windows]] +== Intersecting Windows + +The FilterIntersectWindow pipe finds geometries that intersects a given rectangle. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_intersecting_windows] +---- + +Output: + +image::generated/intersecting_windows.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/intersection.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/intersection.adoc new file mode 100644 index 000000000..a3111e197 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/intersection.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-intersection]] +== Intersection + +The Intersection pipe computes a geometry representing the intersection between item geometry and the given geometry. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_intersection] +---- + +Output: + +image::generated/intersection.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/max.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/max.adoc new file mode 100644 index 000000000..862ff552b --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/max.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-max]] +== Max + +The Max pipe computes the maximum value of the specified property and discard items with a value less than the maximum. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_max] +---- + +Output: + +image::generated/max.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/min.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/min.adoc new file mode 100644 index 000000000..22b83c727 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/min.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-min]] +== Min + +The Min pipe computes the minimum value of the specified property and discard items with a value greater than the minimum. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_min] +---- + +Output: + +image::generated/min.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/search-within-geometry.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/search-within-geometry.adoc new file mode 100644 index 000000000..efb746ae0 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/search-within-geometry.adoc @@ -0,0 +1,16 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-search-within-geometry]] +== Search within geometry + +This pipe performs a search within a geometry in this example, +both OSM street geometries should be found in when searching with +an enclosing rectangle Envelope. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_search_within_geometry] +---- + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/start-point.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/start-point.adoc new file mode 100644 index 000000000..98bebcbab --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/start-point.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-start-point]] +== Start Point + +The StartPoint pipe finds the starting point of item geometry. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_start_point] +---- + +Output: + +image::generated/start_point.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/union.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/union.adoc new file mode 100644 index 000000000..9dd923b66 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/union.adoc @@ -0,0 +1,18 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-union]] +== Union + +The Union pipe unites item geometry with a given geometry. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_union] +---- + +Output: + +image::generated/union.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/unite-all.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/unite-all.adoc new file mode 100644 index 000000000..814d0fc4f --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/examples/generated/unite-all.adoc @@ -0,0 +1,20 @@ +// DO NOT MODIFY, THIS FILE IS AUTO GENERATED! +[[examples-unite-all]] +== Unite All + +The Union All pipe unites geometries of every item contained in the pipeline. +This pipe groups every item in the pipeline in a single item containing the geometry output +of the union. + +Example: + +[source,java,indent=0] +---- +include::example$GeoPipesDocTest.java[tags=s_unite_all] +---- + +Output: + +image::generated/unite_all.png[] + + diff --git a/docs/docs/modules/ROOT/pages/geo-pipes/index.adoc b/docs/docs/modules/ROOT/pages/geo-pipes/index.adoc new file mode 100644 index 000000000..4bffdbb7d --- /dev/null +++ b/docs/docs/modules/ROOT/pages/geo-pipes/index.adoc @@ -0,0 +1,38 @@ +[[spatial-geopipes]] += GeoPipes + +== Base Layers + +These are the different base layers being used for the following examples: + +OsmLayer: + +image::generated/layers/osmLayer.png[] + +IntersectionLayer: + +image::generated/layers/intersectionLayer.png[] + +LinesLayer: + +image::generated/layers/linesLayer.png[] + +BoxesLayer: + +image::generated/layers/boxesLayer.png[] + +ConcaveLayer: + +image::generated/layers/concaveLayer.png[] + +EqualLayer: + +image::generated/layers/equalLayer.png[] + +== GeoPipes Examples + +Below follows a non-exhaustive lists of interesting GeoPipes that can be chained together to contruct a geoprocessing system in while trying to keep the processing as lazy as possible using iterators through the different steps. + +:leveloffset: 1 +include::./examples/generated/index.adoc[] + diff --git a/docs/docs/modules/ROOT/pages/index.adoc b/docs/docs/modules/ROOT/pages/index.adoc new file mode 100644 index 000000000..a596e57b3 --- /dev/null +++ b/docs/docs/modules/ROOT/pages/index.adoc @@ -0,0 +1,10 @@ += Neo4j Spatial v{docs-version} +:experimental: +:sectid: +:toclevels: 2 + +* xref:overview/introduction.adoc[] +* xref:dev/index.adoc[] +* xref:appendix/index.adoc[] + + diff --git a/src/docs/dev/introduction.adoc b/docs/docs/modules/ROOT/pages/overview/introduction.adoc similarity index 87% rename from src/docs/dev/introduction.adoc rename to docs/docs/modules/ROOT/pages/overview/introduction.adoc index a7dec3627..daf1374dc 100644 --- a/src/docs/dev/introduction.adoc +++ b/docs/docs/modules/ROOT/pages/overview/introduction.adoc @@ -21,7 +21,7 @@ The key features include: The easiest way to get started with neo4j-spatial is to grab the `server-plugin-*.jar` from https://github.com/neo4j-contrib/spatial/releases[the latest release], copy it to your `$NEO4J_HOME/plugins` and restart your Neo4j server. -From there you can use all the <> in your Cypher queries to add Nodes to the spatial index and perform a number of spatial point, distance and intersection queries. +From there you can use all the xref:dev/procedures.adoc[spatial-procedures] in your Cypher queries to add Nodes to the spatial index and perform a number of spatial point, distance and intersection queries. .Simple Example [source,cypher] @@ -39,6 +39,6 @@ CALL spatial.bbox('geom',{lon:15.0,lat:60.0}, {lon:15.3, lat:61.0}); A good example blog post for how to use them with one of the neo4j drivers, is http://www.lyonwj.com/2016/08/09/neo4j-spatial-procedures-congressional-boundaries/[Spatial Procedures in Legis Graph] by http://twitter.com/lyonwj[William Lyon] (http://www.lyonwj.com/2016/03/21/legis-graph-spatial-indexing/[Part 1]). -http://twitter.com/maxdemarzi[Max de Marzi] explains <> in his https://maxdemarzi.com/2014/02/11/neo4j-spatial-part-2/[two-part blog post around restaurant recommendations]. +http://twitter.com/maxdemarzi[Max de Marzi] explains the spatial-server-plugin in his https://maxdemarzi.com/2014/02/11/neo4j-spatial-part-2/[two-part blog post around restaurant recommendations]. A general introduction to Neo4j Spatial and a simple example on how to use the Spatial Java APIs can be found in this https://neo4j.com/blog/neo4j-spatial-part1-finding-things-close-to-other-things/[blog post] by http://twitter.com/craigtaverner[Craig Taverner]. diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 000000000..20d021e1e --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,2939 @@ +{ + "name": "@neo4j/docs", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@neo4j/docs", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@antora/cli": "^2.3.4", + "@antora/site-generator-default": "^2.3.4" + }, + "devDependencies": { + "express": "^4.19.2" + } + }, + "node_modules/@antora/asciidoc-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-2.3.4.tgz", + "integrity": "sha512-IQ0d/hnOCGZXzTYUwKAw2BlyRMI4Kg/zu7XejQ6ERIncjuUUv/+PhlzVxoJNT0r9uasJFHDlZ7l3X53Hn+MUuQ==", + "dependencies": { + "asciidoctor.js": "1.5.9", + "opal-runtime": "1.0.11" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@antora/cli": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-2.3.4.tgz", + "integrity": "sha512-KItaWFEf/X4LLY2XCidjD00oUp4Ay7y9Hu26+T8dPqV+qnMwOL+MGHhYXsJz+4JaeNJu1Ofwc4onmShpwHQruA==", + "dependencies": { + "@antora/playbook-builder": "2.3.4", + "commander": "~6.1" + }, + "bin": { + "antora": "bin/antora" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@antora/content-aggregator": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-2.3.4.tgz", + "integrity": "sha512-ZwlGm/t90PUnGVo+pir71O+wC+gyXnVuhoAed+9bBLjsiGI7EGUzwUEXSZqHRSihPx5XLFj6pZinoCGX+uabcw==", + "dependencies": { + "@antora/expand-path-helper": "~1.0", + "braces": "~3.0", + "cache-directory": "~2.0", + "camelcase-keys": "~6.2", + "fs-extra": "~8.1", + "isomorphic-git": "0.78.5", + "js-yaml": "~3.14", + "matcher": "~2.1", + "mime-types": "~2.1", + "multi-progress": "~2.0", + "picomatch": "~2.2", + "through2": "~4.0", + "vinyl": "~2.2", + "vinyl-fs": "~3.0" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@antora/content-classifier": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-2.3.4.tgz", + "integrity": "sha512-DR4I6dLSZEFOS3T0F/hYwLf3AGY2Rb3e9j8V8ygEFzdP8OySAAZWyTjjJPF4pJZqjWtqD7s7S1f5/cCI83977Q==", + "dependencies": { + "@antora/asciidoc-loader": "2.3.4", + "vinyl": "~2.2" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@antora/document-converter": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-2.3.4.tgz", + "integrity": "sha512-Fo2SKdX3BlNrvfQEBOi2II+YmYzdEqKQ5+lO2pzxJuNBfqN0kJJYYk30jFPR27h6QuU43U/XZgufyDt+FjfdZg==", + "dependencies": { + "@antora/asciidoc-loader": "2.3.4" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@antora/expand-path-helper": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@antora/expand-path-helper/-/expand-path-helper-1.0.0.tgz", + "integrity": "sha512-hg3y6M3OvRTb7jtLAnwwloYDxafbyKYttcf16kGCXvP7Wqosh7c+Ag+ltaZ7VSebpzpphO/umb/BXdpU7rxapw==" + }, + "node_modules/@antora/navigation-builder": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-2.3.4.tgz", + "integrity": "sha512-55I7p9tNTernQ/YR1+mp6RRXMV5EcU8q20Tdodt3mazdm3ObTe9E9XVAvUDFmDzRA27D0eb06jVRwLoth1gHYA==", + "dependencies": { + "@antora/asciidoc-loader": "2.3.4" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@antora/page-composer": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-2.3.4.tgz", + "integrity": "sha512-xY0O9X87DzcoP6k/5Jx55ysy0iQIhgav3q1JbOQK/FoYQYHbiQgmVWOjJdqh5nZw57ih3yE20JROPuYqOYuUZA==", + "dependencies": { + "handlebars": "~4.7", + "require-from-string": "~2.0" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@antora/playbook-builder": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-2.3.4.tgz", + "integrity": "sha512-iPjBndcoZhWqpN608WOkXKUUD94b3JX38igebshiT5/NRINJbeEclpdEX/gPv8D1Z1JcrSVGURZQO1uML76dkg==", + "dependencies": { + "@iarna/toml": "~2.2", + "camelcase-keys": "~6.2", + "convict": "~6.0", + "js-yaml": "~3.14", + "json5": "~2.1" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@antora/redirect-producer": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-2.3.4.tgz", + "integrity": "sha512-148amiLc+1Pod6kluAOBke8OATFWFUW3LZdTPFVfqX1lJolCp5ciOnGciy52sIIysSyVkQUjotEUhqGO9Af1EQ==", + "dependencies": { + "@antora/asciidoc-loader": "2.3.4", + "vinyl": "~2.2" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@antora/site-generator-default": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@antora/site-generator-default/-/site-generator-default-2.3.4.tgz", + "integrity": "sha512-uRiFJ/nG5bxjDmFOur27ae7A1J7r+OFVocEwx+vVLRvVYfNHxYP0fI2uUrmJTci8xJ92NLH9VLHpfsHypsoq9Q==", + "dependencies": { + "@antora/asciidoc-loader": "2.3.4", + "@antora/content-aggregator": "2.3.4", + "@antora/content-classifier": "2.3.4", + "@antora/document-converter": "2.3.4", + "@antora/navigation-builder": "2.3.4", + "@antora/page-composer": "2.3.4", + "@antora/playbook-builder": "2.3.4", + "@antora/redirect-producer": "2.3.4", + "@antora/site-mapper": "2.3.4", + "@antora/site-publisher": "2.3.4", + "@antora/ui-loader": "2.3.4" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@antora/site-mapper": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-2.3.4.tgz", + "integrity": "sha512-GVghn6ausIWZlUfbEEdDD4YB7M1mWJAUMokyha9sE5w0gyYoWwukKWQiwCwk/JhvnwXunMLhEUm6y2nrHEmlLw==", + "dependencies": { + "@antora/content-classifier": "2.3.4", + "vinyl": "~2.2" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@antora/site-publisher": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-2.3.4.tgz", + "integrity": "sha512-7xI/5OdjKq5tkdGzE0ABkl/QpIcgtnof+rnIWZweQKeQtA3LWutvEHtdIeXLQt0oNZmE/kf45FwC2XCg9/ptDg==", + "dependencies": { + "@antora/expand-path-helper": "~1.0", + "fs-extra": "~8.1", + "gulp-vinyl-zip": "~2.2", + "vinyl": "~2.2", + "vinyl-fs": "~3.0" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@antora/ui-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-2.3.4.tgz", + "integrity": "sha512-eorTmZW7zc6ZHgGLt3Vrq7mzPuobPeJnyfli50/m/DIQ91slkqjPKUYGcq4paPEz6IWoa7LT2ZwtwA5KzMyTPg==", + "dependencies": { + "@antora/expand-path-helper": "~1.0", + "bl": "~4.0", + "cache-directory": "~2.0", + "camelcase-keys": "~6.2", + "fs-extra": "~8.1", + "got": "~9.6", + "gulp-vinyl-zip": "~2.2", + "js-yaml": "~3.14", + "minimatch-all": "~1.1", + "through2": "~4.0", + "vinyl": "~2.2", + "vinyl-fs": "~3.0" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==", + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/asciidoctor.js": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/asciidoctor.js/-/asciidoctor.js-1.5.9.tgz", + "integrity": "sha512-k5JgwyV82TsiCpnYbDPReuHhzf/vRUt6NaZ+OGywkDDGeGG/CPfvN2Gd1MJ0iIZKDyuk4iJHOdY/2x1KBrWMzA==", + "deprecated": "Package no longer supported. Replaced by @asciidoctor/core", + "dependencies": { + "opal-runtime": "1.0.11" + }, + "engines": { + "node": ">=8.11", + "npm": ">=5.0.0", + "yarn": ">=1.1.0" + } + }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.4.tgz", + "integrity": "sha512-7tdr4EpSd7jJ6tuQ21vu2ke8w7pNEstzj1O8wwq6sNNzO3UDi5MA8Gny/gquCj7r2C6fHudg8tKRGyjRgmvNxQ==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bops": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/bops/-/bops-0.0.7.tgz", + "integrity": "sha512-oF8JFj2vZoTTzbS4haaB/37vqoJbZXxPBWmNdFONu3dUBW+zp7JcoIIYYd1r+4/YwFM8QUSR1u4rrPbtcdHsRg==", + "dependencies": { + "base64-js": "0.0.2", + "to-utf8": "0.0.1" + } + }, + "node_modules/bops/node_modules/base64-js": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.2.tgz", + "integrity": "sha512-Pj9L87dCdGcKlSqPVUjD+q96pbIx1zQQLb2CUiWURfjiBELv84YX+0nGnKmyT/9KkC7PQk7UN1w+Al8bBozaxQ==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-directory": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cache-directory/-/cache-directory-2.0.0.tgz", + "integrity": "sha512-7YKEapH+2Uikde8hySyfobXBqPKULDyHNl/lhKm7cKf/GJFdG/tU/WpLrOg2y9aUrQrWUilYqawFIiGJPS6gDA==", + "dependencies": { + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clean-git-ref": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", + "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==" + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==" + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/cloneable-readable/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/cloneable-readable/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/cloneable-readable/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/commander": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz", + "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/convict": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.0.1.tgz", + "integrity": "sha512-M4YNNq5NV4/VS8JhvBSHAokwvQRL4evEuU0VFe1GNPiqnj9TAkLXpf39ImCCVZlsp3CFp04bc/kRSWPGsJGJWg==", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "yargs-parser": "^18.1.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff3": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", + "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==" + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/flush-write-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/flush-write-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/flush-write-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/fs-mkdirp-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/git-apply-delta": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/git-apply-delta/-/git-apply-delta-0.0.7.tgz", + "integrity": "sha512-P99rChCrhraaY7D6E4NUotfhjzRRNvlf3Mumw9BHgOJFQTfYHhTwAgSTEtcBvb25iXttvMRLEHtzyz9mE2gLjQ==", + "dependencies": { + "bops": "~0.0.6", + "varint": "0.0.3" + } + }, + "node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/glob-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/glob-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/globalyzer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.4.tgz", + "integrity": "sha512-LeguVWaxgHN0MNbWC6YljNMzHkrCny9fzjmEUdnF1kQ7wATFD1RHFRqA1qxaX2tgxGENlcxjOflopBwj3YZiXA==" + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/gulp-vinyl-zip": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.2.1.tgz", + "integrity": "sha512-9lwCZUkrENzP649hVQB2r+8GgeGtVrqA2fEeVDX6aYr6+yJjdczWu0r1C6WvbZdzhXcA61MtR5MEyjR9a3D7cw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dependencies": { + "queue": "^4.2.1", + "through": "^2.3.8", + "through2": "^2.0.3", + "vinyl": "^2.0.2", + "vinyl-fs": "^3.0.3", + "yauzl": "^2.2.1", + "yazl": "^2.2.1" + } + }, + "node_modules/gulp-vinyl-zip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/gulp-vinyl-zip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/gulp-vinyl-zip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/gulp-vinyl-zip/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isomorphic-git": { + "version": "0.78.5", + "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-0.78.5.tgz", + "integrity": "sha512-LrF5t9x7RdFeg84NsYpZo9qF1MZeb56LpBm6Jv47qMjnWMv0Il/3wPTA8I/lUYywgVbvF/e7xypHauj5auKW3w==", + "dependencies": { + "async-lock": "^1.1.0", + "clean-git-ref": "^2.0.1", + "crc-32": "^1.2.0", + "diff3": "0.0.3", + "git-apply-delta": "0.0.7", + "globalyzer": "^0.1.4", + "globrex": "^0.1.2", + "ignore": "^5.1.4", + "marky": "^1.2.1", + "minimisted": "^2.0.0", + "pako": "^1.0.10", + "pify": "^4.0.1", + "readable-stream": "^3.4.0", + "sha.js": "^2.4.9", + "simple-get": "^3.0.2" + }, + "bin": { + "isogit": "cli.js" + }, + "engines": { + "node": ">=7.6.0" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==", + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/marky": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", + "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==" + }, + "node_modules/matcher": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-2.1.0.tgz", + "integrity": "sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimatch-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz", + "integrity": "sha512-g1wQmOhBRTqQw9dqkpkhKMT6LvJREygVzRRTqJUe/B6NCtM1+exYpzjR9mS0vGj7q3gbHdHpqNVoCXtZk6qk6A==", + "dependencies": { + "minimatch": "^3.0.2" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimisted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", + "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", + "dependencies": { + "minimist": "^1.2.5" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/multi-progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/multi-progress/-/multi-progress-2.0.0.tgz", + "integrity": "sha512-ArGgS/Qib/X2FWfE6CVpic+Z0C9kQuhiK9HQtz5pcCfsXwMzoNnXP6FJlplNAMsJuoLtWA8bAoPV36ezT2IFGw==", + "dependencies": { + "progress": "^1.1.8" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/opal-runtime": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/opal-runtime/-/opal-runtime-1.0.11.tgz", + "integrity": "sha512-L+6pnRvXPlDtbamBRnJAnB9mEMXmsIQ/b+0r/2xJ5/n/nxheEkLo+Pm5QNQ08LEbEN9TI6/kedhIspqRRu6tXA==", + "dependencies": { + "glob": "6.0.4", + "xmlhttprequest": "1.8.0" + }, + "engines": { + "node": ">=8.11" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/ordered-read-streams/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/ordered-read-streams/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/ordered-read-streams/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.1.tgz", + "integrity": "sha512-AMD7w5hRXcFSb8s9u38acBZ+309u6GsiibP4/0YacJeaurRshogB7v/ZcVPxP5gD5+zIw6ixRHdutiYUJfwKHw==", + "dependencies": { + "inherits": "~2.0.0" + } + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==", + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/remove-bom-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/remove-bom-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/remove-bom-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==", + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-get/node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/through2-filter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2-filter/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/through2-filter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/through2-filter/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==", + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==", + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/to-through/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/to-through/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/to-through/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/to-through/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/to-utf8": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", + "integrity": "sha512-zks18/TWT1iHO3v0vFp5qLKOG27m67ycq/Y7a7cTiRuUNlc4gf3HGnkRgMv0NyhnfTamtkYBJl+YeD1/j07gBQ==" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uglify-js": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz", + "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/varint": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/varint/-/varint-0.0.3.tgz", + "integrity": "sha512-SZOWhAh1wbG6fxU5QJMudwrudDkVFCQJlcZEDFQoKdcpr0q2YG5VuS24WSA+w4m0N+9SNe1S2Zd5IdLWXaHyKQ==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/vinyl-fs/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/vinyl-fs/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/vinyl-fs/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==", + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dependencies": { + "buffer-crc32": "~0.2.3" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 000000000..43a02efc5 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,19 @@ +{ + "name": "@neo4j/docs", + "version": "1.0.0", + "description": "Neo4j Docs builder", + "main": "index.js", + "scripts": { + "start": "node server.js", + "build": "npm run build:docs", + "build:docs": "antora --fetch --stacktrace docs.yml" + }, + "license": "ISC", + "dependencies": { + "@antora/cli": "^2.3.4", + "@antora/site-generator-default": "^2.3.4" + }, + "devDependencies": { + "express": "^4.19.2" + } +} diff --git a/docs/server.js b/docs/server.js new file mode 100644 index 000000000..d2ee2faee --- /dev/null +++ b/docs/server.js @@ -0,0 +1,25 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [http://neo4j.com] + * + * This file is part of Neo4j Spatial. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const express = require('express') +const app = express() +app.use(express.static('./build/site')) +app.get('/', (req, res) => res.redirect('/neo4j-spatial/1.0.0')) +app.listen(8020, () => console.log('📘 http://localhost:8020')) diff --git a/pom.xml b/pom.xml index 8028afc68..29cadd6e1 100644 --- a/pom.xml +++ b/pom.xml @@ -148,66 +148,6 @@ -server -Xms1024m -Xmx2048m - - org.asciidoctor - asciidoctor-maven-plugin - 3.0.0 - - - generate-docs - package - - process-asciidoc - - - - - html5 - - ${basedir}/target/docs - index.adoc - ${basedir}/docs - - ${project.version} - images - coderay - style - - - asciidoctor-diagram - - - - - target/docs - - **/*.txt - **/*.xml - conf - dev - examples - manual.* - docinfo.html - - - - **/*.html - **/*.png - **/*.jpg - **/*.gif - - - - asciidoctor-diagram - - - - org.asciidoctor - asciidoctorj-diagram - 2.3.0 - - - @@ -511,150 +451,6 @@ - - neo-docs-build - - false - - docsBuild - - - - - org.neo4j.build.plugins - neo4j-doctools - 33 - provided - - - - - - maven-dependency-plugin - - - unpack-doctools - generate-sources - - unpack-dependencies - - - jar - neo4j-doctools - ${docs.tools} - - - - - - maven-resources-plugin - - - copy-docs - process-resources - - copy-resources - - - ${project.build.directory}/docs - - - src/docs - - - - - - copy-test-sources - process-resources - - copy-resources - - - - ${project.build.directory}/test-sources/${project.artifactId}-test-sources-jar - - - - src/test/java - - - - - - copy-configuration - process-resources - - copy-resources - - - ${project.build.directory}/conf - - - src/docs/conf - - - - - - - filter-asciidoc-files - post-integration-test - - copy-resources - - - ${project.build.directory}/docs-filtered - - - ${project.build.directory}/docs - true - - - - - - - copy-filtered-asciidoc-files-back - post-integration-test - - copy-resources - - - ${project.build.directory}/docs - - - ${project.build.directory}/docs-filtered - false - - - - - - - copy-generated-files - post-integration-test - - copy-resources - - - ${project.build.directory}/src/dev - - - ${project.build.directory}/docs - - - - - - - - - - ${project.build.directory}/tools - none - - test-default diff --git a/src/docs/conf/asciidoc.local.conf b/src/docs/conf/asciidoc.local.conf deleted file mode 100644 index 2e7209fd5..000000000 --- a/src/docs/conf/asciidoc.local.conf +++ /dev/null @@ -1,5 +0,0 @@ -[attributes] -imagesdir=images -iconsdir=icons -imagestargetdir=target/src/images -fontsdir=target/tools/bin/fonts diff --git a/src/docs/conf/version b/src/docs/conf/version deleted file mode 100644 index ad96e7cf9..000000000 --- a/src/docs/conf/version +++ /dev/null @@ -1 +0,0 @@ -${project.version} diff --git a/src/docs/dev/geo-pipes.adoc b/src/docs/dev/geo-pipes.adoc deleted file mode 100644 index 1997047e5..000000000 --- a/src/docs/dev/geo-pipes.adoc +++ /dev/null @@ -1,297 +0,0 @@ -= GeoPipes Examples -:source: ../../../src/test/java/org/neo4j/gis/spatial/pipes/GeoPipesDocTest.java - -Below follows a non-exhaustive lists of interesting GeoPipes that can be chained together to contruct a geoprocessing system in while trying to keep the processing as lazy as possible using iterators through the different steps. - -== Search within geometry - -This pipe performs a search within a geometry in this example, both OSM street geometries should be found in when searching with an enclosing rectangle Envelope. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=search_within_geometry] ----- - -== Intersecting windows - - -The FilterIntersectWindow pipe finds geometries that intersects a given rectangle. This pipeline: - -[source,java,indent=0] ----- -include::{source}[tags=intersecting_windows] ----- - -will output: - -image::intersecting_windows.png[] - - -== Intersect All - - -The IntersectAll pipe intersects geometries of every item contained in the pipeline. -It groups every item in the pipeline in a single item containing the geometry output of the intersection. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=intersect_all] ----- - -Output: - -image::intersect_all.png[] - -== Unite All - - -The Union All pipe unites geometries of every item contained in the pipeline. This pipe groups every item in the pipeline in a single item containing the geometry output of the union. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=unite_all] ----- - -Output: - -image::unite_all.png[] - -== Extract Points - - -The Extract Points pipe extracts every point from a geometry. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=extract_points] ----- - - -image::extract_points.png[] - -== Filter by cql using complex cql - - -This filter will apply the provided CQL expression to the different geometries and only let the matching ones pass. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=filter_by_cql_using_complex_cql] ----- - -== Boundary - - -The boundary pipe calculates boundary of every geometry in the pipeline. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=boundary] ----- - -Output: - -image::boundary.png[] - -== Centroid - - -The Centroid pipe calculates geometry centroid. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=centroid] ----- - -Output: - -image::centroid.png[] - -== Convex Hull - - -The ConvexHull pipe calculates geometry convex hull. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=convex_hull] ----- - -Output: - -image::convex_hull.png[] - -== Densify - - -The Densify pipe inserts extra vertices along the line segments in the geometry. The densified geometry contains no line segment which is longer than the given distance tolerance. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=densify] ----- - -Output: - -image::densify.png[] - -== Envelope - - -The Envelope pipe computes the minimum bounding box of item geometry. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=envelope] ----- - -Output: - -image::envelope.png[] - -== Export to GML - - -This pipe exports every geometry as a GML snippet. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=export_to_gml] ----- - -Output: - -[source,xml] ----- -include::export_to_gml.xml[] ----- - -== Intersection - - -The Intersection pipe computes a geometry representing the intersection between item geometry and the given geometry. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=intersection] ----- - -Output: - -image::intersection.png[] - -== Union - -The Union pipe unites item geometry with a given geometry. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=union] ----- - -Output: - -image::union.png[] - -== Start Point - -The StartPoint pipe finds the starting point of item geometry. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=start_point] ----- - -Output: - -image::start_point.png[] - -== End Point - - -The EndPoint pipe finds the ending point of item geometry. - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=end_point] ----- - -Output: - -image::end_point.png[] - -== Max - - -The Max pipe computes the maximum value of the specified property and discard items with a value less than the maximum. - - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=max] ----- - -Output: - -image::max.png[] - -== Min - - -The Min pipe computes the minimum value of the specified property and discard items with a value greater than the minimum. - - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=min] ----- - -Output: - -image::min.png[] - -== Break up all geometries into points and make density islands - - -A more complex Open Street Map example. - - -.Example: -[source,java,indent=0] ----- -include::{source}[tags=break_up_all_geometries_into_points_and_make_density_islands] ----- - -Output: - -.Step1 -image::step1_break_up_all_geometries_into_points_and_make_density_islands.png[] - -.Step2 -image::step2_break_up_all_geometries_into_points_and_make_density_islands.png[] - -.Step3 -image::step3_break_up_all_geometries_into_points_and_make_density_islands.png[] - -.Step4 -image::step4_break_up_all_geometries_into_points_and_make_density_islands.png[] - -.Step5 -image::step5_break_up_all_geometries_into_points_and_make_density_islands.png[] \ No newline at end of file diff --git a/src/docs/dev/layers.adoc b/src/docs/dev/layers.adoc deleted file mode 100644 index c0d85d51b..000000000 --- a/src/docs/dev/layers.adoc +++ /dev/null @@ -1,17 +0,0 @@ -[[spatial-layers]] -= Layers and GeometryEncoders - - -The primary type that defines a collection of geometries is the +Layer+. -A layer contains an index for querying. -In addition, a +Layer+ can be an +EditableLayer+ if it is possible to add and modify geometries in the layer. -The next most important interface is the GeometryEncoder. - -The +DefaultLayer+ is the standard layer, making use of the +WKBGeometryEncoder+ for storing all geometry types as +byte[]+ properties of one node per geometry instance. - -The +OSMLayer+ is a special layer supporting Open Street Map and storing the OSM model as a single fully connected graph. -The set of +Geometries+ provided by this layer includes +Points+, +LineStrings+ and +Polygons+, and as such cannot be exported to Shapefile format, since that format only allows a single +Geometry+ per layer. -However, +OMSLayer+ extends +DynamicLayer+, which allow it to provide any number of sub-layers, each with a specific geometry type and in addition based on an OSM tag filter. -For example, you can have a layer providing all cycle paths as +LineStrings+, or a layer providing all lakes as +Polygons+. -Underneath these are all still backed by the same fully connected graph, but exposed dynamically as apparently separate geometry layers. - diff --git a/src/docs/docinfo.html b/src/docs/docinfo.html deleted file mode 100644 index d51936505..000000000 --- a/src/docs/docinfo.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/docs/index.adoc b/src/docs/index.adoc deleted file mode 100644 index 3fcaa5f45..000000000 --- a/src/docs/index.adoc +++ /dev/null @@ -1,21 +0,0 @@ -= Neo4j Spatial v{neo4j-version} -:toc: left -:experimental: -:sectid: -:toclevels: 2 - -:neo4j-spatial-version: {neo4j-version} - -:leveloffset: 1 - -include::dev/introduction.adoc[] - -:leveloffset: 1 - -include::dev/index.adoc[] - -:leveloffset: 1 - -include::dev/appendix.adoc[] - - diff --git a/src/test/java/org/neo4j/doc/tools/AsciiDocGenerator.java b/src/test/java/org/neo4j/doc/tools/AsciiDocGenerator.java index f9838a67a..55f738bde 100644 --- a/src/test/java/org/neo4j/doc/tools/AsciiDocGenerator.java +++ b/src/test/java/org/neo4j/doc/tools/AsciiDocGenerator.java @@ -23,9 +23,10 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; -import java.io.PrintWriter; import java.io.Writer; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; @@ -104,18 +105,6 @@ protected static void line(final Writer fw, final String string) fw.append("\n"); } - public static Writer getFW(String dir, String title) { - try { - File dirs = new File(dir); - String name = title.replace(" ", "-") - .toLowerCase() + ".asciidoc"; - return getFW(dirs, name); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - public static Writer getFW(File dir, String filename) { try { if (!dir.exists()) { @@ -136,66 +125,20 @@ public static Writer getFW(File dir, String filename) { } } - public static String dumpToSeparateFile(File dir, String testId, - String content) { - if (content == null || content.isEmpty()) { - throw new IllegalArgumentException("The content can not be empty(" + content + ")."); - } - String filename = testId + ".asciidoc"; - Writer writer = AsciiDocGenerator.getFW(new File(dir, "includes"), filename); - String title = ""; - char firstChar = content.charAt(0); - if (firstChar == '.' || firstChar == '_') { - int pos = content.indexOf('\n'); - if (pos != -1) { - title = content.substring(0, pos + 1); - content = content.substring(pos + 1); - } - } - try { - writer.write(content); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return title + "include::includes/" + filename + "[]\n"; - } - - public static String dumpToSeparateFileWithType(File dir, String type, - String content) { - if (type == null || type.isEmpty()) { - throw new IllegalArgumentException( - "The type can not be null or empty: [" + type + "]"); - } - String key = dir.getAbsolutePath() + type; - Integer counter = counters.get(key); - if (counter == null) { - counter = 0; - } - counter++; - counters.put(key, counter); - String testId = type + "-" + counter; - return dumpToSeparateFile(dir, testId, content); - } - - public static PrintWriter getPrintWriter(String dir, String title) { - return new PrintWriter(getFW(dir, title)); - } - public static String getPath(Class source) { return source.getPackage() .getName() .replace(".", "/") + "/" + source.getSimpleName() + ".java"; } - protected String replaceSnippets(String description, File dir, String title) { - for (String key : snippets.keySet()) { - description = replaceSnippet(description, key, dir, title); + protected String replaceSnippets(String description) { + for (var entry : snippets.entrySet()) { + String snippetString = SNIPPET_MARKER + entry.getKey(); + if (description.contains(snippetString + "\n")) { + description = description.replace(snippetString + "\n", "\n" + entry.getValue()); + } else { + log.severe("Could not find " + snippetString + "\\n in " + description); + } } if (description.contains(SNIPPET_MARKER)) { int indexOf = description.indexOf(SNIPPET_MARKER); @@ -205,20 +148,6 @@ protected String replaceSnippets(String description, File dir, String title) { return description; } - private String replaceSnippet(String description, String key, File dir, - String title) { - String snippetString = SNIPPET_MARKER + key; - if (description.contains(snippetString + "\n")) { - String include = dumpToSeparateFile(dir, title + "-" + key, - snippets.get(key)); - description = description.replace(snippetString + "\n", include); - } else { - log.severe("Could not find " + snippetString + "\\n in " - + description); - } - return description; - } - /** * Add snippets that will be replaced into corresponding. *

@@ -242,29 +171,25 @@ public void addSnippet(String key, String content) { */ public void addTestSourceSnippets(Class source, String... tagNames) { for (String tagName : tagNames) { - addSnippet(tagName, sourceSnippet(tagName, source, "test-sources")); + addSnippet(tagName, sourceSnippet(tagName, source)); } } - /** - * Added one or more source snippets, available from javadoc using - * - * @param source the class where the snippet is found - * @param tagNames the tag names which should be included - * @@tagName. - */ - public void addSourceSnippets(Class source, String... tagNames) { - for (String tagName : tagNames) { - addSnippet(tagName, sourceSnippet(tagName, source, "sources")); + private static String sourceSnippet(String tagName, Class source) { + // ensure symlink is created + Path target = new File("docs/docs/modules/ROOT/examples/" + source.getSimpleName() + ".java").toPath(); + if (!Files.exists(target)) { + String sourcePath = "src/test/java/" + getPath(source); + Path relPath = target.getParent().relativize(new File(sourcePath).toPath()); + try { + Files.createSymbolicLink(target, relPath); + } catch (IOException e) { + throw new RuntimeException(e); + } } - } - - private static String sourceSnippet(String tagName, Class source, - String classifier) { - return "[snippet,java]\n" + "----\n" - + "component=${project.artifactId}\n" + "source=" - + getPath(source) + "\n" + "classifier=" + classifier + "\n" - + "tag=" + tagName + "\n" + "----\n"; + return "[source,java,indent=0]\n" + "----\n" + + "include::example$" + source.getSimpleName() + ".java[tags=" + tagName + "]\n" + + "----\n"; } public void addGithubTestSourceLink(String key, Class source, diff --git a/src/test/java/org/neo4j/doc/tools/JavaTestDocsGenerator.java b/src/test/java/org/neo4j/doc/tools/JavaTestDocsGenerator.java index cb072d66d..0bba48317 100644 --- a/src/test/java/org/neo4j/doc/tools/JavaTestDocsGenerator.java +++ b/src/test/java/org/neo4j/doc/tools/JavaTestDocsGenerator.java @@ -39,20 +39,20 @@ public JavaTestDocsGenerator(String title) { } public void document(String directory, String sectionName) { + if (description == null || description.isEmpty()) { + return; + } this.setSection(sectionName); String name = title.replace(" ", "-").toLowerCase(); - File dir = new File(new File(directory), section); - String filename = name + ".asciidoc"; + File dir = new File(new File(directory, section), "generated"); + String filename = name + ".adoc"; Writer fw = getFW(dir, filename); - description = replaceSnippets(description, dir, name); + description = replaceSnippets(description); try { - line(fw, "[[" + sectionName + "-" + name.replaceAll("[()]", "") + "]]"); + line(fw, "// DO NOT MODIFY, THIS FILE IS AUTO GENERATED!"); + line(fw, "[[" + sectionName.replaceAll("/", "-") + "-" + name.replaceAll("[()]", "") + "]]"); String firstChar = title.substring(0, 1).toUpperCase(); - line(fw, firstChar + title.substring(1)); - for (int i = 0; i < title.length(); i++) { - fw.append("="); - } - fw.append("\n"); + line(fw, "== " + firstChar + title.substring(1)); line(fw, ""); line(fw, description); line(fw, ""); @@ -63,8 +63,4 @@ public void document(String directory, String sectionName) { e.printStackTrace(); } } - - public void addImageSnippet(String tagName, String imageName, String title) { - this.addSnippet(tagName, "\nimage:" + imageName + "[" + title + "]\n"); - } } diff --git a/src/test/java/org/neo4j/gis/spatial/pipes/GeoPipesDocTest.java b/src/test/java/org/neo4j/gis/spatial/pipes/GeoPipesDocTest.java index 58d4313d8..5de36ebae 100644 --- a/src/test/java/org/neo4j/gis/spatial/pipes/GeoPipesDocTest.java +++ b/src/test/java/org/neo4j/gis/spatial/pipes/GeoPipesDocTest.java @@ -29,7 +29,13 @@ import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.NoSuchElementException; +import java.util.TreeSet; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.geotools.api.style.Style; import org.geotools.data.neo4j.Neo4jFeatureBuilder; import org.geotools.data.neo4j.StyledImageExporter; @@ -37,6 +43,7 @@ import org.geotools.filter.text.cql2.CQLException; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.referencing.crs.DefaultEngineeringCRS; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -48,6 +55,7 @@ import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKTReader; import org.neo4j.annotations.documented.Documented; +import org.neo4j.doc.tools.JavaTestDocsGenerator; import org.neo4j.gis.spatial.AbstractJavaDocTestBase; import org.neo4j.gis.spatial.Constants; import org.neo4j.gis.spatial.EditableLayerImpl; @@ -119,39 +127,37 @@ public void filter_by_window_intersection() { assertEquals(1, GeoPipeline.start(tx, osmLayer).windowIntersectionFilter(10, 40, 20, 56.0583531).count()); } - /** - * This pipe is filtering according to a CQL Bounding Box description. - *

- * Example: - * - * @@s_filter_by_cql_using_bbox - */ - @Documented("filter_by_cql_using_bbox") @Test + @Title("Filter by cql using bbox") + @Documented(""" + This pipe is filtering according to a CQL Bounding Box description. + + Example: + @@s_filter_by_cql_using_bbox + """) public void filter_by_cql_using_bbox() throws CQLException { - // tag::filter_by_cql_using_bbox[] + // tag::s_filter_by_cql_using_bbox[] GeoPipeline cqlFilter = GeoPipeline.start(tx, osmLayer).cqlFilter(tx, "BBOX(the_geom, 10, 40, 20, 56.0583531)"); - // end::filter_by_cql_using_bbox[] + // end::s_filter_by_cql_using_bbox[] assertEquals(1, cqlFilter.count()); } - /** - * This pipe performs a search within a geometry in this example, - * both OSM street geometries should be found in when searching with - * an enclosing rectangle Envelope. - *

- * Example: - * - * @@s_search_within_geometry - */ @Test - @Documented("search_within_geometry") + @Title("Search within geometry") + @Documented(""" + This pipe performs a search within a geometry in this example, + both OSM street geometries should be found in when searching with + an enclosing rectangle Envelope. + + Example: + @@s_search_within_geometry + """) public void search_within_geometry() throws CQLException { - // tag::search_within_geometry[] + // tag::s_search_within_geometry[] GeoPipeline pipeline = GeoPipeline .startWithinSearch(tx, osmLayer, osmLayer.getGeometryFactory().toGeometry(new Envelope(10, 20, 50, 60))); - // end::search_within_geometry[] + // end::s_search_within_geometry[] assertEquals(2, pipeline.count()); } @@ -166,21 +172,19 @@ public void filter_by_cql_using_property() throws CQLException { assertEquals("Storgatan", flow.getProperties().get("name")); } - /** - * This filter will apply the provided CQL expression to the different - * geometries and only let the matching ones pass. - *

- * Example: - * - * @@s_filter_by_cql_using_complex_cql - */ - @Documented("filter_by_cql_using_complex_cql") @Test + @Title("Filter by cql using complex cql") + @Documented(""" + This pipe is filtering according to a complex CQL description. + + Example: + @@s_filter_by_cql_using_complex_cql + """) public void filter_by_cql_using_complex_cql() throws CQLException { - // tag::filter_by_cql_using_complex_cql[] + // tag::s_filter_by_cql_using_complex_cql[] long counter = GeoPipeline.start(tx, osmLayer) .cqlFilter(tx, "highway is not null and geometryType(the_geom) = 'LineString'").count(); - // end::filter_by_cql_using_complex_cql[] + // end::s_filter_by_cql_using_complex_cql[] FilterCQL filter = new FilterCQL(tx, osmLayer, "highway is not null and geometryType(the_geom) = 'LineString'"); filter.setStarts(GeoPipeline.start(tx, osmLayer)); @@ -192,23 +196,22 @@ public void filter_by_cql_using_complex_cql() throws CQLException { assertEquals(0, counter); } - /** - * Affine Transformation - *

- * The ApplyAffineTransformation pipe applies an affine transformation to every geometry. - *

- * Example: - * - * @@s_affine_transformation Output: - * @@affine_transformation - */ - @Documented("translate_geometries") @Test + @Title("Affine Transformation") + @Documented(""" + This pipe applies an affine transformation to every geometry. + + Example: + @@s_affine_transformation + + Output: + @@affine_transformation + """) public void translate_geometries() { - // tag::affine_transformation[] + // tag::s_affine_transformation[] GeoPipeline pipeline = GeoPipeline.start(tx, boxesLayer) .applyAffineTransform(AffineTransformation.translationInstance(2, 3)); - // end::affine_transformation[] + // end::s_affine_transformation[] addImageSnippet(boxesLayer, pipeline, getTitle()); GeoPipeline original = GeoPipeline.start(tx, osmLayer).copyDatabaseRecordProperties(tx).sort( @@ -261,22 +264,21 @@ public void get_boundary_length() { pipeline.reset(); } - /** - * Buffer - *

- * The Buffer pipe applies a buffer to geometries. - *

- * Example: - * - * @@s_buffer Output: - * @@buffer - */ - @Documented("get_buffer") @Test + @Title("Buffer") + @Documented(""" + This pipe applies a buffer to geometries. + + Example: + @@s_buffer + + Output: + @@buffer + """) public void get_buffer() { - // tag::buffer[] + // tag::s_buffer[] GeoPipeline pipeline = GeoPipeline.start(tx, boxesLayer).toBuffer(0.5); - // end::buffer[] + // end::s_buffer[] addImageSnippet(boxesLayer, pipeline, getTitle()); pipeline = GeoPipeline.start(tx, boxesLayer).toBuffer(0.1).createWellKnownText().calculateArea().sort("Area"); @@ -286,22 +288,21 @@ public void get_buffer() { pipeline.reset(); } - /** - * Centroid - *

- * The Centroid pipe calculates geometry centroid. - *

- * Example: - * - * @@s_centroid Output: - * @@centroid - */ - @Documented("get_centroid") @Test + @Title("Centroid") + @Documented(""" + This pipe calculates geometry centroid. + + Example: + @@s_centroid + + Output: + @@centroid + """) public void get_centroid() { - // tag::centroid[] + // tag::s_centroid[] GeoPipeline pipeline = GeoPipeline.start(tx, boxesLayer).toCentroid(); - // end::centroid[] + // end::s_centroid[] addImageSnippet(boxesLayer, pipeline, getTitle(), Constants.GTYPE_POINT); pipeline = GeoPipeline.start(tx, boxesLayer).toCentroid().createWellKnownText().copyDatabaseRecordProperties(tx) @@ -312,47 +313,46 @@ public void get_centroid() { pipeline.reset(); } - /** - * This pipe exports every geometry as a - * http://en.wikipedia.org/wiki/Geography_Markup_Language[GML] snippet. - *

- * Example: - * - * @@s_export_to_gml Output: - * @@exportgml - */ - @Documented("export_to_GML") @Test + @Title("Export to GML") + @Documented(""" + This pipe exports every geometry as a http://en.wikipedia.org/wiki/Geography_Markup_Language[GML] snippet. + + Example: + @@s_export_to_gml + + Output: + @@exportgml + """) public void export_to_GML() { - // tag::export_to_gml[] + // tag::s_export_to_gml[] GeoPipeline pipeline = GeoPipeline.start(tx, boxesLayer).createGML(); for (GeoPipeFlow flow : pipeline) { System.out.println(flow.getProperties().get("GML")); } - // end::export_to_gml[] - String result = ""; + // end::s_export_to_gml[] + StringBuilder result = new StringBuilder(); for (GeoPipeFlow flow : GeoPipeline.start(tx, boxesLayer).createGML()) { - result = result + flow.getProperties().get("GML"); + result.append(flow.getProperties().get("GML")); } gen.get().addSnippet("exportgml", "[source,xml]\n----\n" + result + "\n----\n"); } - /** - * Convex Hull - *

- * The ConvexHull pipe calculates geometry convex hull. - *

- * Example: - * - * @@s_convex_hull Output: - * @@convex_hull - */ - @Documented("get_convex_hull") @Test + @Title("Convex Hull") + @Documented(""" + This pipe calculates geometry convex hull. + + Example: + @@s_convex_hull + + Output: + @@convex_hull + """) public void get_convex_hull() { - // tag::convex_hull[] + // tag::s_convex_hull[] GeoPipeline pipeline = GeoPipeline.start(tx, concaveLayer).toConvexHull(); - // end::convex_hull[] + // end::s_convex_hull[] addImageSnippet(concaveLayer, pipeline, getTitle()); pipeline = GeoPipeline.start(tx, concaveLayer).toConvexHull().createWellKnownText(); @@ -361,23 +361,22 @@ public void get_convex_hull() { pipeline.reset(); } - /** - * Densify - *

- * The Densify pipe inserts extra vertices along the line segments in the geometry. - * The densified geometry contains no line segment which is longer than the given distance tolerance. - *

- * Example: - * - * @@s_densify Output: - * @@densify - */ - @Documented("densify") @Test + @Title("Densify") + @Documented(""" + This pipe inserts extra vertices along the line segments in the geometry. + The densified geometry contains no line segment which is longer than the given distance tolerance. + + Example: + @@s_densify + + Output: + @@densify + """) public void densify() { - // tag::densify[] + // tag::s_densify[] GeoPipeline pipeline = GeoPipeline.start(tx, concaveLayer).densify(5).extractPoints(); - // end::densify[] + // end::s_densify[] addImageSnippet(concaveLayer, pipeline, getTitle(), Constants.GTYPE_POINT); pipeline = GeoPipeline.start(tx, concaveLayer).toConvexHull().densify(5).createWellKnownText(); @@ -399,25 +398,23 @@ public void json() { pipeline.reset(); } - /** - * Max - *

- * The Max pipe computes the maximum value of the specified property and - * discard items with a value less than the maximum. - *

- * Example: - * - * @@s_max Output: - * @@max - */ - @Documented("get_max_area") @Test + @Title("Max") + @Documented(""" + The Max pipe computes the maximum value of the specified property and discard items with a value less than the maximum. + + Example: + @@s_max + + Output: + @@max + """) public void get_max_area() { - // tag::max[] + // tag::s_max[] GeoPipeline pipeline = GeoPipeline.start(tx, boxesLayer) .calculateArea() .getMax("Area"); - // end::max[] + // end::s_max[] addImageSnippet(boxesLayer, pipeline, getTitle()); pipeline = GeoPipeline.start(tx, boxesLayer).calculateArea().getMax("Area"); @@ -425,116 +422,110 @@ public void get_max_area() { pipeline.reset(); } - /** - * The boundary pipe calculates boundary of every geometry in the pipeline. - *

- * Example: - * - * @@s_boundary Output: - * @@boundary - */ - @Documented("boundary") @Test + @Title("Boundary") + @Documented(""" + The boundary pipe calculates boundary of every geometry in the pipeline. + + Example: + @@s_boundary + + Output: + @@boundary + """) public void boundary() { - // tag::boundary[] + // tag::s_boundary[] GeoPipeline pipeline = GeoPipeline.start(tx, boxesLayer).toBoundary(); - // end::boundary[] + // end::s_boundary[] addImageSnippet(boxesLayer, pipeline, getTitle(), Constants.GTYPE_LINESTRING); // TODO test? } - /** - * Difference - *

- * The Difference pipe computes a geometry representing the points making - * up item geometry that do not make up the given geometry. - *

- * Example: - * - * @@s_difference Output: - * @@difference - */ - @Documented("difference.") @Test + @Title("Difference") + @Documented(""" + The Difference pipe computes a geometry representing the points making up item geometry that do not make up the given geometry. + + Example: + @@s_difference + + Output: + @@difference + """) public void difference() throws Exception { - // tag::difference[] + // tag::s_difference[] WKTReader reader = new WKTReader(intersectionLayer.getGeometryFactory()); Geometry geometry = reader.read("POLYGON ((3 3, 3 5, 7 7, 7 3, 3 3))"); GeoPipeline pipeline = GeoPipeline.start(tx, intersectionLayer).difference(geometry); - // end::difference[] + // end::s_difference[] addImageSnippet(intersectionLayer, pipeline, getTitle()); // TODO test? } - /** - * Intersection - *

- * The Intersection pipe computes a geometry representing the intersection - * between item geometry and the given geometry. - *

- * Example: - * - * @@s_intersection Output: - * @@intersection - */ - @Documented("intersection") @Test + @Title("Intersection") + @Documented(""" + The Intersection pipe computes a geometry representing the intersection between item geometry and the given geometry. + + Example: + @@s_intersection + + Output: + @@intersection + """) public void intersection() throws Exception { - // tag::intersection[] + // tag::s_intersection[] WKTReader reader = new WKTReader(intersectionLayer.getGeometryFactory()); Geometry geometry = reader.read("POLYGON ((3 3, 3 5, 7 7, 7 3, 3 3))"); GeoPipeline pipeline = GeoPipeline.start(tx, intersectionLayer).intersect(geometry); - // end::intersection[] + // end::s_intersection[] addImageSnippet(intersectionLayer, pipeline, getTitle()); // TODO test? } - /** - * Union - *

- * The Union pipe unites item geometry with a given geometry. - *

- * Example: - * - * @@s_union Output: - * @@union - */ - @Documented("union") @Test + @Title("Union") + @Documented(""" + The Union pipe unites item geometry with a given geometry. + + Example: + @@s_union + + Output: + @@union + """) public void union() throws Exception { - // tag::union[] + // tag::s_union[] WKTReader reader = new WKTReader(intersectionLayer.getGeometryFactory()); Geometry geometry = reader.read("POLYGON ((3 3, 3 5, 7 7, 7 3, 3 3))"); SearchFilter filter = new SearchIntersectWindow(intersectionLayer, new Envelope(7, 10, 7, 10)); GeoPipeline pipeline = GeoPipeline.start(tx, intersectionLayer, filter).union(geometry); - // end::union[] + // end::s_union[] addImageSnippet(intersectionLayer, pipeline, getTitle()); // TODO test? } - /** - * Min - *

- * The Min pipe computes the minimum value of the specified property and - * discard items with a value greater than the minimum. - *

- * Example: - * - * @@s_min Output: - * @@min - */ - @Documented("get_min_area") @Test + @Title("Min") + @Documented(""" + The Min pipe computes the minimum value of the specified property and discard items with a value greater than the minimum. + + Example: + @@s_min + + Output: + @@min + """) public void get_min_area() { - // tag::min[] + // tag::s_min[] GeoPipeline pipeline = GeoPipeline.start(tx, boxesLayer) .calculateArea() .getMin("Area"); - // end::min[] + // end::s_min[] addImageSnippet(boxesLayer, pipeline, getTitle()); pipeline = GeoPipeline.start(tx, boxesLayer).calculateArea().getMin("Area"); @@ -557,26 +548,32 @@ public void extract_osm_points() { assertEquals(24, count); } - /** - * A more complex Open Street Map example. - *

- * This example demostrates the some pipes chained together to make a full - * geoprocessing pipeline. - *

- * Example: - * - * @@s_break_up_all_geometries_into_points_and_make_density_islands _Step1_ - * @@step1_break_up_all_geometries_into_points_and_make_density_islands _Step2_ - * @@step2_break_up_all_geometries_into_points_and_make_density_islands _Step3_ - * @@step3_break_up_all_geometries_into_points_and_make_density_islands _Step4_ - * @@step4_break_up_all_geometries_into_points_and_make_density_islands _Step5_ - * @@step5_break_up_all_geometries_into_points_and_make_density_islands - */ - @Documented("break_up_all_geometries_into_points_and_make_density_islands_and_get_the_outer_linear_ring_of_the_density_islands_and_buffer_the_geometry_and_count_them") - @Title("break_up_all_geometries_into_points_and_make_density_islands") @Test + @Title("Break up all geometries into points and make density islands") + @Documented(""" + This example demonstrates the some pipes chained together to make a full geoprocessing pipeline. + + Example: + @@s_break_up_all_geometries_into_points_and_make_density_islands + + Step 1 - startOsm: + @@step1_break_up_all_geometries_into_points_and_make_density_islands + + Step 2 - extractOsmPoints: + @@step2_break_up_all_geometries_into_points_and_make_density_islands + + Step 3 - groupByDensityIslands: + @@step3_break_up_all_geometries_into_points_and_make_density_islands + + Step 4 - toConvexHull: + @@step4_break_up_all_geometries_into_points_and_make_density_islands + + Step 5- toBuffer: + @@step5_break_up_all_geometries_into_points_and_make_density_islands + """) + public void break_up_all_geometries_into_points_and_make_density_islands_and_get_the_outer_linear_ring_of_the_density_islands_and_buffer_the_geometry_and_count_them() { - // tag::break_up_all_geometries_into_points_and_make_density_islands[] + // tag::s_break_up_all_geometries_into_points_and_make_density_islands[] //step1 GeoPipeline pipeline = OSMGeoPipeline.startOsm(tx, osmLayer) //step2 @@ -587,7 +584,7 @@ public void break_up_all_geometries_into_points_and_make_density_islands_and_get .toConvexHull() //step5 .toBuffer(0.0004); - // end::break_up_all_geometries_into_points_and_make_density_islands[] + // end::s_break_up_all_geometries_into_points_and_make_density_islands[] assertEquals(9, pipeline.count()); @@ -606,22 +603,21 @@ public void break_up_all_geometries_into_points_and_make_density_islands_and_get .toBuffer(0.0004), "step5_" + getTitle(), Constants.GTYPE_POLYGON); } - /** - * Extract Points - *

- * The Extract Points pipe extracts every point from a geometry. - *

- * Example: - * - * @@s_extract_points Output: - * @@extract_points - */ - @Documented("extract_points") @Test + @Title("Extract Points") + @Documented(""" + This pipe extracts every point from a geometry. + + Example: + @@s_extract_points + + Output: + @@extract_points + """) public void extract_points() { - // tag::extract_points[] + // tag::s_extract_points[] GeoPipeline pipeline = GeoPipeline.start(tx, boxesLayer).extractPoints(); - // end::extract_points[] + // end::s_extract_points[] addImageSnippet(boxesLayer, pipeline, getTitle(), Constants.GTYPE_POINT); int count = 0; @@ -666,24 +662,23 @@ public void compute_distance() throws ParseException { pipeline.reset(); } - /** - * Unite All - *

- * The Union All pipe unites geometries of every item contained in the pipeline. - * This pipe groups every item in the pipeline in a single item containing the geometry output - * of the union. - *

- * Example: - * - * @@s_unite_all Output: - * @@unite_all - */ - @Documented("unite_all") @Test + @Title("Unite All") + @Documented(""" + The Union All pipe unites geometries of every item contained in the pipeline. + This pipe groups every item in the pipeline in a single item containing the geometry output + of the union. + + Example: + @@s_unite_all + + Output: + @@unite_all + """) public void unite_all() { - // tag::unite_all[] + // tag::s_unite_all[] GeoPipeline pipeline = GeoPipeline.start(tx, intersectionLayer).unionAll(); - // end::unite_all[] + // end::s_unite_all[] addImageSnippet(intersectionLayer, pipeline, getTitle()); pipeline = GeoPipeline.start(tx, intersectionLayer) @@ -700,24 +695,23 @@ public void unite_all() { } } - /** - * Intersect All - *

- * The IntersectAll pipe intersects geometries of every item contained in the pipeline. - * It groups every item in the pipeline in a single item containing the geometry output - * of the intersection. - *

- * Example: - * - * @@s_intersect_all Output: - * @@intersect_all - */ - @Documented("intersect_all") @Test + @Title("Intersect All") + @Documented(""" + The Intersect All pipe intersects geometries of every item contained in the pipeline. + This pipe groups every item in the pipeline in a single item containing the geometry output + of the intersection. + + Example: + @@s_intersect_all + + Output: + @@intersect_all + """) public void intersect_all() { - // tag::intersect_all[] + // tag::s_intersect_all[] GeoPipeline pipeline = GeoPipeline.start(tx, intersectionLayer).intersectAll(); - // end::intersect_all[] + // end::s_intersect_all[] addImageSnippet(intersectionLayer, pipeline, getTitle()); pipeline = GeoPipeline.start(tx, intersectionLayer) @@ -733,46 +727,44 @@ public void intersect_all() { } } - /** - * Intersecting windows - *

- * The FilterIntersectWindow pipe finds geometries that intersects a given rectangle. - * This pipeline: - * - * @@s_intersecting_windows will output: - * @@intersecting_windows - */ - @Documented("intersecting_windows") @Test + @Title("Intersecting Windows") + @Documented(""" + The FilterIntersectWindow pipe finds geometries that intersects a given rectangle. + + Example: + @@s_intersecting_windows + + Output: + @@intersecting_windows + """) public void intersecting_windows() { - // tag::intersecting_windows[] + // tag::s_intersecting_windows[] GeoPipeline pipeline = GeoPipeline .start(tx, boxesLayer) .windowIntersectionFilter(new Envelope(0, 10, 0, 10)); - // end::intersecting_windows[] + // end::s_intersecting_windows[] addImageSnippet(boxesLayer, pipeline, getTitle()); // TODO test? } - /** - * Start Point - *

- * The StartPoint pipe finds the starting point of item geometry. - *

- * Example: - * - * @@s_start_point Output: - * @@start_point - */ - @Documented("start_point") @Test + @Title("Start Point") + @Documented(""" + The StartPoint pipe finds the starting point of item geometry. + + Example: + @@s_start_point + + Output: + @@start_point""") public void start_point() { - // tag::start_point[] + // tag::s_start_point[] GeoPipeline pipeline = GeoPipeline .start(tx, linesLayer) .toStartPoint(); - // end::start_point[] + // end::s_start_point[] addImageSnippet(linesLayer, pipeline, getTitle(), Constants.GTYPE_POINT); pipeline = GeoPipeline @@ -784,24 +776,23 @@ public void start_point() { pipeline.reset(); } - /** - * End Point - *

- * The EndPoint pipe finds the ending point of item geometry. - *

- * Example: - * - * @@s_end_point Output: - * @@end_point - */ - @Documented("end_point") @Test + @Title("End Point") + @Documented(""" + The EndPoint pipe finds the ending point of item geometry. + + Example: + @@s_end_point + + Output: + @@end_point + """) public void end_point() { - // tag::end_point[] + // tag::s_end_point[] GeoPipeline pipeline = GeoPipeline .start(tx, linesLayer) .toEndPoint(); - // end::end_point[] + // end::s_end_point[] addImageSnippet(linesLayer, pipeline, getTitle(), Constants.GTYPE_POINT); pipeline = GeoPipeline @@ -813,24 +804,23 @@ public void end_point() { pipeline.reset(); } - /** - * Envelope - *

- * The Envelope pipe computes the minimum bounding box of item geometry. - *

- * Example: - * - * @@s_envelope Output: - * @@envelope - */ - @Documented("envelope") @Test + @Title("Envelope") + @Documented(""" + The Envelope pipe computes the minimum bounding box of item geometry. + + Example: + @@s_envelope + + Output: + @@envelope + """) public void envelope() { - // tag::envelope[] + // tag::s_envelope[] GeoPipeline pipeline = GeoPipeline .start(tx, linesLayer) .toEnvelope(); - // end::envelope[] + // end::s_envelope[] addImageSnippet(linesLayer, pipeline, getTitle(), Constants.GTYPE_POLYGON); // TODO test @@ -879,7 +869,6 @@ private void addImageSnippet( addImageSnippet(layer, pipeline, imgName, null); } - @SuppressWarnings({"unchecked", "rawtypes"}) private void addOsmImageSnippet( Layer layer, GeoPipeline pipeline, @@ -903,7 +892,7 @@ private void addImageSnippet( String imgName, Integer geomType, double boundsDelta) { - gen.get().addSnippet(imgName, "\nimage::" + imgName + ".png[scaledwidth=\"75%\"]\n"); + gen.get().addSnippet(imgName, "image::generated/" + imgName + ".png[]\n"); try { FeatureCollection layerCollection = GeoPipeline.start(tx, layer, new SearchAll()).toFeatureCollection(tx); @@ -921,7 +910,7 @@ private void addImageSnippet( bounds.expandBy(boundsDelta, boundsDelta); StyledImageExporter exporter = new StyledImageExporter(db); - exporter.setExportDir("target/docs/images/"); + exporter.setExportDir("docs/docs/modules/ROOT/images/generated"); exporter.saveImage( new FeatureCollection[]{ layerCollection, @@ -1010,7 +999,7 @@ public void setUp() { gen.get().setGraph(db); try (Transaction tx = db.beginTx()) { StyledImageExporter exporter = new StyledImageExporter(db); - exporter.setExportDir("target/docs/images/"); + exporter.setExportDir("docs/docs/modules/ROOT/images/generated/layers"); exporter.saveImage(GeoPipeline.start(tx, intersectionLayer).toFeatureCollection(tx), StyledImageExporter.createDefaultStyle(Color.BLUE, Color.CYAN), new File( "intersectionLayer.png")); @@ -1041,9 +1030,9 @@ public void setUp() { @AfterEach public void doc() { - // gen.get().addSnippet( "graph", AsciidocHelper.createGraphViz( imgName , graphdb(), "graph"+getTitle() ) ); - gen.get().addTestSourceSnippets(GeoPipesDocTest.class, "s_" + getTitle().toLowerCase()); - gen.get().document("target/docs", "examples"); + JavaTestDocsGenerator docsGenerator = gen.get(); + docsGenerator.addTestSourceSnippets(GeoPipesDocTest.class, "s_" + getTitle().toLowerCase()); + docsGenerator.document("docs/docs/modules/ROOT/pages/geo-pipes", "examples"); if (tx != null) { tx.commit(); tx.close(); @@ -1064,6 +1053,23 @@ public static void init() { exporter.setExportDir("target/docs/images/"); } + @AfterAll + public static void writeIndexAdoc() throws IOException { + // write an index.adoc file including all generated snippets + var adocs = new TreeSet<>(); + Path path = Paths.get("docs/docs/modules/ROOT/pages/geo-pipes/examples/generated"); + try (Stream paths = Files.walk(path)) { + paths.filter(Files::isRegularFile) + .filter(p -> p.toString().endsWith(".adoc")) + .forEach(p -> adocs.add(p.getFileName().toString())); + } + adocs.remove("index.adoc"); + Files.write(path.resolve("index.adoc"), Stream.concat( + Stream.of("// DO NOT MODIFY, THIS FILE IS AUTO GENERATED!"), + adocs.stream().map(s -> "include::" + s + "[]")) + .collect(Collectors.toList())); + } + private static GeoPipeFlow print(GeoPipeFlow pipeFlow) { System.out.println("GeoPipeFlow:"); for (String key : pipeFlow.getProperties().keySet()) {