diff --git a/.bazelignore b/.bazelignore new file mode 100644 index 0000000000..3c3629e647 --- /dev/null +++ b/.bazelignore @@ -0,0 +1 @@ +node_modules diff --git a/.bazelrc b/.bazelrc new file mode 100644 index 0000000000..916fb79b83 --- /dev/null +++ b/.bazelrc @@ -0,0 +1,87 @@ +# Common Bazel settings for JavaScript/NodeJS workspaces +# This rc file is automatically discovered when Bazel is run in this workspace, +# see https://docs.bazel.build/versions/master/guide.html#bazelrc +# +# The full list of Bazel options: https://docs.bazel.build/versions/master/command-line-reference.html + +# Cache action outputs on disk so they persist across output_base and bazel shutdown (eg. changing branches) +build --disk_cache=.cache/bazel-disk-cache + +# Bazel will create symlinks from the workspace directory to output artifacts. +# Build results will be placed in a directory called "dist/bin" +# Other directories will be created like "dist/testlogs" +# Be aware that this will still create a bazel-out symlink in +# your project directory, which you must exclude from version control and your +# editor's search path. +build --symlink_prefix=dist/ +# To disable the symlinks altogether (including bazel-out) you can use +# build --symlink_prefix=/ +# however this makes it harder to find outputs. + +# Specifies desired output mode for running tests. +# Valid values are +# 'summary' to output only test status summary +# 'errors' to also print test logs for failed tests +# 'all' to print logs for all tests +# 'streamed' to output logs for all tests in real time +# (this will force tests to be executed locally one at a time regardless of --test_strategy value). +test --test_output=errors + +# Support for debugging NodeJS tests +# Add the Bazel option `--config=debug` to enable this +# --test_output=streamed +# Stream stdout/stderr output from each test in real-time. +# See https://docs.bazel.build/versions/master/user-manual.html#flag--test_output for more details. +# --test_strategy=exclusive +# Run one test at a time. +# --test_timeout=9999 +# Prevent long running tests from timing out +# See https://docs.bazel.build/versions/master/user-manual.html#flag--test_timeout for more details. +# --nocache_test_results +# Always run tests +# --node_options=--inspect-brk +# Pass the --inspect-brk option to all tests which enables the node inspector agent. +# See https://nodejs.org/de/docs/guides/debugging-getting-started/#command-line-options for more details. +# --define=VERBOSE_LOGS=1 +# Rules will output verbose logs if the VERBOSE_LOGS environment variable is set. `VERBOSE_LOGS` will be passed to +# `nodejs_binary` and `nodejs_test` via the default value of the `default_env_vars` attribute of those rules. +# --compilation_mode=dbg +# Rules may change their build outputs if the compilation mode is set to dbg. For example, +# mininfiers such as terser may make their output more human readable when this is set. `COMPILATION_MODE` will be passed to +# `nodejs_binary` and `nodejs_test` via the default value of the `default_env_vars` attribute of those rules. +# See https://docs.bazel.build/versions/master/user-manual.html#flag--compilation_mode for more details. +test:debug --test_output=streamed --test_strategy=exclusive --test_timeout=9999 --nocache_test_results --define=VERBOSE_LOGS=1 +# Use bazel run with `--config=debug` to turn on the NodeJS inspector agent. +# The node process will break before user code starts and wait for the debugger to connect. +run:debug --define=VERBOSE_LOGS=1 -- --node_options=--inspect-brk +# The following option will change the build output of certain rules such as terser and may not be desirable in all cases +build:debug --compilation_mode=dbg + +# Turn off legacy external runfiles +# This prevents accidentally depending on this feature, which Bazel will remove. +build --nolegacy_external_runfiles + +# Turn on the "Managed Directories" feature. +# This allows Bazel to share the same node_modules directory with other tools +# NB: this option was introduced in Bazel 0.26 +# See https://docs.bazel.build/versions/master/command-line-reference.html#flag--experimental_allow_incremental_repository_updates +common --experimental_allow_incremental_repository_updates + +# Turn on --incompatible_strict_action_env which was on by default +# in Bazel 0.21.0 but turned off again in 0.22.0. Follow +# https://github.com/bazelbuild/bazel/issues/7026 for more details. +# This flag is needed to so that the bazel cache is not invalidated +# when running bazel via `yarn bazel`. +# See https://github.com/angular/angular/issues/27514. +build --incompatible_strict_action_env +run --incompatible_strict_action_env + +# Load any settings specific to the current user. +# .bazelrc.user should appear in .gitignore so that settings are not shared with team members +# This needs to be last statement in this +# config, as the user configuration should be able to overwrite flags from this file. +# See https://docs.bazel.build/versions/master/best-practices.html#bazelrc +# (Note that we use .bazelrc.user so the file appears next to .bazelrc in directory listing, +# rather than user.bazelrc as suggested in the Bazel docs) +try-import %workspace%/.bazelrc.user + diff --git a/.gitignore b/.gitignore index 97c18a2ff0..67f7f6d020 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ **/docs **/src/*.html index.html +bazel-* +.cache # Logs logs *.log @@ -12,7 +14,7 @@ npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* - +bazel-* # Firebase .firebase/ diff --git a/.license-check.json b/.license-check.json index 5cc8e86f25..47a02e46ea 100644 --- a/.license-check.json +++ b/.license-check.json @@ -1,5 +1,5 @@ { - "license": "../../LICENSE", + "license": "LICENSE", "licenseFormats": { "js|ts|css|scss|less|php|as|c|java|cpp|go|cto|acl": { "prepend": "/*", @@ -11,6 +11,12 @@ "njk": { "prepend": "" + }, + "bazel|bzl": { + "eachLine": { + "prepend": " # " + } } - } + }, + "ignore": ["license_check*"] } \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index b307b13409..5e0f1f25a4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,20 +2,20 @@ language: node_js node_js: - stable cache: + yarn: true directories: - ".firebase" + - ".cache/bazel-disk-cache" script: -- npm run bootstrap -- npm run ci -- npm run build +- yarn run ci deploy: - provider: script skip_cleanup: true - script: firebase deploy --token "$FIREBASE_TOKEN" + script: yarn run deploy:ci on: branch: dev - provider: pages - local_dir: dist + local_dir: dist/bin target_branch: master skip_cleanup: true github_token: "$GITHUB_TOKEN" diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 0000000000..e8311005ee --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,99 @@ +load("@npm//eslint:index.bzl", "eslint", "eslint_test") +load("@npm//license-check-and-add:index.bzl", "license_check_and_add_test") +load("@npm//http-server:index.bzl", "http_server") +load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary", "nodejs_test") + +exports_files( + [ + "tsconfig.json", + "LICENSE", + "package.json", + "babel.config.json", + "rollup.config.js", + ], + visibility = ["//:__subpackages__"], +) + +http_server( + name = "serve", + args = [ + ], + data = [ + "//:index.html", + "//samples:outputs", + ], +) + +CMD = ''' +set -e +context="{\\"packages\\": {\n" +packages=$$($(location @npm//lerna/bin:lerna) list) +i=0 +for p in $$packages; do + if ((i > 0)); then + context="$${context},\\n" + fi + context="$${context}\\"$$($(location @npm//json/bin:json) -f samples/$$p/data.json title)\\": \\"$$p\\"" + i=$$((i + 1)) +done + +context="$${context}}}" +echo -e $${context} > $@ +''' + +# Used to generate data.json +# +# genrule( +# name = "data", +# outs = ["data.json"], +# cmd = CMD, +# local = 1, +# tools = [ +# "@npm//json/bin:json", +# "@npm//lerna/bin:lerna", +# ], +# ) + +genrule( + name = "index", + srcs = [ + ":data.json", + ":index.njk", + "//shared:templates", + ], + outs = ["index.html"], + cmd = "$(location @npm//nunjucks-cli/bin:nunjucks) $(location index.njk) $(location data.json) -p . && cat index.html > $@", + tools = ["@npm//nunjucks-cli/bin:nunjucks"], +) + + +eslint_test( + name = "eslint", + args = ["samples/**/*.js"], + data = [ + # config files + ":.eslintrc.json", + "//samples:.eslintrc.json", + # files to test + "//samples:inputs", + # plugins + "@npm//eslint-config-prettier", + "@npm//eslint-plugin-jest", + "@npm//eslint-plugin-prettier", + ], +) + +license_check_and_add_test( + name = "license_check", + args = [ + "check", + "**/*.js", + "-f", + ".license-check.json", + ], + data = [ + ":.license-check.json", + ":LICENSE", + "//samples:inputs", + ], +) diff --git a/README.md b/README.md index b531406cc6..1f21a1e9e9 100644 --- a/README.md +++ b/README.md @@ -15,23 +15,18 @@ Samples for the Google Maps JavaScript API. ## Development **Note**: The default branch for this repo is dev and **not** master. -Start a server that will reload as built files change. +Start a server with all samples. ``` -npm run serve +yarn run serve ``` -Build files as they change using one of these options: -1. Limited to a single sample: `lerna --scope circle-simple run build:watch` -2. Building all samples on change: `npm run build:watch` -3. Limited to matching scope: `lerna --scope control-* --concurrency 16 run build:watch` Requires a concurrency value > # of samples. - -Alternatively, `npm run serve:watch` can be called to wrap `npm run serve` and `npm build:watch`. +Bazel is used for the build system and can be called similar to `npx bazel build //...`. ## Other Resources - [Google Maps Documentation](https://developers.google.com/maps/documentation/javascript/tutorial) - [Google Maps Reference Documenations](https://developers.google.com/maps/documentation/javascript/reference/) -- [Google Maps Typings](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/googlemaps) - Community supported `npm i -D @types/googlemaps` +- [Google Maps Typings](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/googlemaps) - Community supported `yarn i -D @types/googlemaps` - [Google Maps Utilitiies](https://github.com/googlemaps/v3-utility-library) ## Support diff --git a/WORKSPACE b/WORKSPACE new file mode 100644 index 0000000000..79b1063d9a --- /dev/null +++ b/WORKSPACE @@ -0,0 +1,58 @@ +# Bazel workspace created by @bazel/create 0.41.0 + +# Declares that this directory is the root of a Bazel workspace. +# See https://docs.bazel.build/versions/master/build-ref.html#workspace +workspace( + # How this workspace would be referenced with absolute labels from another workspace + name = "googlemaps_js_samples", + # Map the @npm bazel workspace to the node_modules directory. + # This lets Bazel use the same node_modules as other local tooling. + managed_directories = {"@npm": ["node_modules"]}, +) + +# Install the nodejs "bootstrap" package +# This provides the basic tools for running and packaging nodejs programs in Bazel +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "build_bazel_rules_nodejs", + sha256 = "8dc1466f8563f3aa4ac7ab7aa3c96651eb7764108219f40b2d1c918e1a81c601", + urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.41.0/rules_nodejs-0.41.0.tar.gz"], +) + +load("@build_bazel_rules_nodejs//:index.bzl", "yarn_install") + +yarn_install( + name = "npm", + package_json = "//:package.json", + yarn_lock = "//:yarn.lock", +) + +# Install any Bazel rules which were extracted earlier by the npm_install rule. +load("@npm//:install_bazel_dependencies.bzl", "install_bazel_dependencies") + +install_bazel_dependencies() + +# Setup TypeScript toolchain +load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace") + +ts_setup_workspace() + +http_archive( + name = "io_bazel_rules_sass", + sha256 = "617e444f47a1f3e25eb1b6f8e88a2451d54a2afdc7c50518861d9f706fc8baaa", + strip_prefix = "rules_sass-1.23.7", + # Make sure to check for the latest version when you install + url = "https://github.com/bazelbuild/rules_sass/archive/1.23.7.zip", +) + +# Fetch required transitive dependencies. This is an optional step because you +# can always fetch the required NodeJS transitive dependency on your own. +load("@io_bazel_rules_sass//:package.bzl", "rules_sass_dependencies") + +rules_sass_dependencies() + +# Setup repositories which are needed for the Sass rules. +load("@io_bazel_rules_sass//:defs.bzl", "sass_repositories") + +sass_repositories() \ No newline at end of file diff --git a/babel.config.json b/babel.config.json index f62a3c897b..0163784c16 100644 --- a/babel.config.json +++ b/babel.config.json @@ -8,5 +8,6 @@ } } ] - ] + ], + "sourceType": "script" } diff --git a/build/index.sh b/build/index.sh deleted file mode 100755 index 6a26067725..0000000000 --- a/build/index.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -context="{\"packages\": {\n" -packages=$(lerna list) -i=0 -for p in $packages; do - if ((i > 0)); then - context="${context},\n" - fi - context="${context}\"$(json -f samples/$p/data.json title)\":\"$p\"" - i=$((i + 1)) -done - -context="${context}}}" - -tmp=$(mktemp) - -echo -e $context >$tmp -cat $tmp -nunjucks index.njk -p . $tmp diff --git a/build/move_dist.sh b/build/move_dist.sh deleted file mode 100755 index bd39500371..0000000000 --- a/build/move_dist.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -mkdir -p ../../dist/samples/$npm_package_name/src - -cp dist/* ../../dist/samples/$npm_package_name -cp src/index.js ../../dist/samples/$npm_package_name/src/index.js diff --git a/build/render_template.sh b/build/render_template.sh deleted file mode 100755 index 4be8e9ef97..0000000000 --- a/build/render_template.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -set -ex - -# store path to individual sample folder -d=$(pwd) - -# nunjucks cli does not support multiple paths -# https://github.com/jeremyben/nunjucks-cli/pull/10 -pushd ../../ - -# render the template -nunjucks $d/src/index.njk -p . $d/data.json --loglevel info - -# nunjucks -o will render the relative path to the njk in this -# folder, eg $d/dist/$d/index.html, so we move manually -mkdir -p $d/dist - -if [ "$JSFIDDLE" -eq "1" ]; then - mv $d/src/index.html $d/dist/jsfiddle.html -else - mv $d/src/index.html $d/dist/index.html -fi - -popd diff --git a/data.json b/data.json new file mode 100644 index 0000000000..aea6424840 --- /dev/null +++ b/data.json @@ -0,0 +1,149 @@ +{ + "packages": { + "Add Map": "add-map", + "Rotating 45° Imagery": "aerial-rotation", + "45° Imagery": "aerial-simple", + "Circles": "circle-simple", + "Mashups with google.maps.Data": "combining-data", + "Conserve Map on Scroll": "conserve-map-on-scroll", + "Map Bounds Restriction": "control-bounds-restriction", + "Adding State to Controls": "control-custom-state", + "Custom Controls": "control-custom", + "Default Controls": "control-default", + "Disabling the Default UI": "control-disableUI", + "Control Options": "control-options", + "Control Positioning Labels": "control-positioning-labels", + "Control Positioning": "control-positioning", + "Replacing Default Controls": "control-replacement", + "Adding Controls to the Map": "control-simple", + "Controls Basic Map": "controls-basic-map", + "Custom Markers": "custom-markers", + "Deleting a Vertex": "delete-vertex-menu", + "Directions Service (Complex)": "directions-complex", + "Draggable Directions": "directions-draggable", + "Displaying Text Directions With setPanel()": "directions-panel", + "Directions Service": "directions-simple", + "Travel Modes in Directions": "directions-travel-modes", + "Waypoints in Directions": "directions-waypoints", + "Disable Zoom and Pan": "disable-zoom-and-pan", + "Distance Matrix Service": "distance-matrix", + "Drawing Tools": "drawing-tools", + "Earthquake Circles": "earthquake_circles", + "Earthquake Heatmap": "earthquake_heatmap", + "Earthquake Weighted Heatmap": "earthquake_heatmap_weighted", + "Earthquake Markers": "earthquake_markers", + "Showing Elevation Along a Path": "elevation-paths", + "Elevation Service": "elevation-simple", + "Accessing Arguments in UI Events": "event-arguments", + "Using Closures in Event Listeners": "event-closure", + "Listening to DOM Events": "event-domListener", + "POI Click Events": "event-poi", + "Getting Properties With Event Handlers": "event-properties", + "Simple Click Events": "event-simple", + "Firebase Map": "firebase-map", + "Geocoding Component Restriction": "geocoding-component-restriction", + "Retrieving an Address for a Place ID": "geocoding-place-id", + "Geocoding Region": "geocoding-region", + "Reverse Geocoding": "geocoding-reverse", + "Geocoding Service": "geocoding-simple", + "Encoding Methods": "geometry-encodings", + "Navigation Functions (Heading)": "geometry-headings", + "Ground Overlays": "groundoverlay-simple", + "Hiding Map Features With Styling": "hiding-features", + "Complex Marker Icons": "icon-complex", + "Simple Marker Icons": "icon-simple", + "Info Window With maxWidth": "infowindow-simple-max", + "Info Windows": "infowindow-simple", + "Cooperative Gesture Handling": "interaction-cooperative", + "KML Map": "kml-map", + "Simple Map (Landing Page)": "landing-page-add-map", + "Marker Clustering (Landing Page)": "landing-page-marker-clustering", + "Visualize Data (Landing Page)": "landing-page-visualize-data", + "Bicycle Layer": "layer-bicycling", + "Data Layer: Drag and Drop GeoJSON": "layer-data-dragndrop", + "Data Layer: Dynamic Styling": "layer-data-dynamic", + "Data Layer: Event Handling": "layer-data-event", + "Data Layer: Polygon": "layer-data-polygon", + "Simple Data Layer: Earthquakes": "layer-data-quakes-red", + "Default Data Layer: Earthquakes": "layer-data-quakes-simple", + "Advanced Data Layer: Earthquakes": "layer-data-quakes", + "Data Layer: Simple": "layer-data-simple", + "Data Layer: Styling": "layer-data-style", + "GeoRSS Layers": "layer-georss", + "Heatmaps": "layer-heatmap", + "KML Feature Details": "layer-kml-features", + "KML Layers": "layer-kml", + "Traffic Layer": "layer-traffic", + "Transit Layer": "layer-transit", + "Custom Legend": "legend", + "Showing Pixel and Tile Coordinates": "map-coordinates", + "Map Events Explorer": "map-events", + "Geolocation": "map-geolocation", + "Localizing the Map": "map-language", + "Lat/Lng Object Literal": "map-latlng-literal", + "Custom Map Projections": "map-projection-simple", + "Map Puzzle": "map-puzzle", + "Right-to-Left Languages": "map-rtl", + "Simple Map": "map-simple", + "Synchronous Loading": "map-sync", + "Basic Map Types": "maptype-base", + "Overlaying an Image Map Type": "maptype-image-overlay", + "Image Map Types": "maptype-image", + "Overlay Map Types": "maptype-overlay", + "Styled Map Types": "maptype-styled-simple", + "Marker Animations With setTimeout()": "marker-animations-iteration", + "Marker Animations": "marker-animations", + "Marker Clustering": "marker-clustering", + "Marker Labels": "marker-labels", + "Removing Markers": "marker-remove", + "Simple Markers": "marker-simple", + "Custom Symbols (Marker)": "marker-symbol-custom", + "Predefined Symbols (Marker)": "marker-symbol-predefined", + "Maximum Zoom Imagery Service": "maxzoom-simple", + "Using MySQL and PHP with Google Maps": "mysql-to-maps", + "Showing/Hiding Overlays": "overlay-hideshow", + "Custom Popups": "overlay-popup", + "Removing Overlays": "overlay-remove", + "Custom Overlays": "overlay-simple", + "Animating Symbols": "overlay-symbol-animate", + "Arrow Symbols (Polyline)": "overlay-symbol-arrow", + "Custom Symbols (Polyline)": "overlay-symbol-custom", + "Dashed Line Symbols (Polyline)": "overlay-symbol-dashed", + "Place Details": "place-details", + "Place ID": "place-id", + "Place Search Pagination": "place-search-pagination", + "Place Searches": "place-search", + "Place Autocomplete Address Form": "places-autocomplete-addressform", + "Place Autocomplete and Directions": "places-autocomplete-directions", + "Place Autocomplete Hotel Search": "places-autocomplete-hotelsearch", + "Place Autocomplete Restricted to Multiple Countries": "places-autocomplete-multiple-countries", + "Place Autocomplete": "places-autocomplete", + "Place ID Finder": "places-placeid-finder", + "Place ID Geocoder": "places-placeid-geocoder", + "Retrieving Autocomplete Predictions": "places-queryprediction", + "Places Search Box": "places-searchbox", + "Polygon Contains Location": "poly-containsLocation", + "Polygon Arrays": "polygon-arrays", + "Polygon Auto-Completion": "polygon-autoclose", + "Draggable Polygons": "polygon-draggable", + "Polygon With Hole": "polygon-hole", + "Simple Polygon": "polygon-simple", + "Complex Polylines": "polyline-complex", + "Removing Polylines": "polyline-remove", + "Simple Polylines": "polyline-simple", + "Listening to Events": "rectangle-event", + "Rectangles": "rectangle-simple", + "Rectangle Zoom": "rectangle-zoom", + "Street View Controls": "streetview-controls", + "Custom Street View Panoramas": "streetview-custom-simple", + "Custom Street View Panorama Tiles": "streetview-custom-tiles", + "Street View Containers": "streetview-embed", + "Street View Events": "streetview-events", + "Overlays Within Street View": "streetview-overlays", + "Directly Accessing Street View Data": "streetview-service", + "Street View Side-By-Side": "streetview-simple", + "Styled Maps - Night Mode": "style-array", + "Styled Map Selection": "style-selector", + "User-Editable Shapes": "user-editable-shapes" + } +} diff --git a/firebase.json b/firebase.json index 51b9101b4e..36838c5e90 100644 --- a/firebase.json +++ b/firebase.json @@ -1,6 +1,6 @@ { "hosting": { - "public": "dist", + "public": "dist/bin", "ignore": [ "firebase.json", "**/.*", diff --git a/index.njk b/index.njk index 2f027d1229..77de681ee7 100644 --- a/index.njk +++ b/index.njk @@ -73,22 +73,22 @@