From c45cdf06f5f3f4c36820a70cb57511bb743e51a7 Mon Sep 17 00:00:00 2001 From: Rene Rubalcava Date: Wed, 22 Sep 2021 15:31:59 -0700 Subject: [PATCH] update for 4.21 (#108) --- README.md | 8 +- config.js | 9 ++ package.json | 74 ++++++------ src/commands/create.ts | 4 +- src/commands/init.ts | 2 +- src/lib/copyTemplate.ts | 6 +- templates/rollup/app/README.md | 3 - templates/rollup/app/package.json | 92 --------------- templates/rollup/app/rollup.config.js | 43 ------- .../@arcgis/core/widgets/LayerList.ts | 7 -- .../__mocks__/@arcgis/core/widgets/Legend.ts | 7 -- .../rollup/app/src/__mocks__/tsconfig.json | 12 -- templates/rollup/app/src/assets/favicon.ico | Bin 944 -> 0 bytes templates/rollup/app/src/assets/icon.png | Bin 84933 -> 0 bytes templates/rollup/app/src/css/.gitkeep | 0 templates/rollup/app/src/css/index.css | 41 ------- templates/rollup/app/src/data/app.ts | 33 ------ templates/rollup/app/src/index.html | 33 ------ templates/rollup/app/src/index.ts | 24 ---- templates/rollup/app/src/oauth-callback.html | 23 ---- templates/rollup/app/src/widgets.spec.ts | 29 ----- templates/rollup/app/src/widgets.ts | 12 -- templates/{rollup => vite}/app/.gitignore | 8 +- templates/vite/app/README.md | 32 ++++++ templates/vite/app/favicon.svg | 15 +++ templates/vite/app/index.html | 20 ++++ templates/vite/app/package.json | 101 ++++++++++++++++ .../__mocks__/@arcgis/core/core/Accessor.ts | 1 + .../core/core/accessorSupport/decorators.ts | 2 + .../__mocks__/@arcgis/core/core/watchUtils.ts | 1 + .../@arcgis/core/widgets/LayerList.ts | 8 ++ .../__mocks__/@arcgis/core/widgets/Legend.ts | 8 ++ .../__mocks__/@arcgis/core/widgets/Search.ts | 8 ++ .../core/widgets/Search/LayerSearchSource.ts | 5 + templates/vite/app/src/_variables.css | 4 + templates/vite/app/src/main.ts | 32 ++++++ templates/vite/app/src/style.css | 62 ++++++++++ templates/vite/app/src/vite-env.d.ts | 1 + templates/vite/app/src/widgets.spec.ts | 25 ++++ templates/vite/app/src/widgets.ts | 32 ++++++ templates/vite/app/tsconfig.json | 18 +++ templates/vite/app/vite.config.js | 28 +++++ templates/webpack/app/.gitignore | 1 + templates/webpack/app/README.md | 25 ++-- templates/webpack/app/package.json | 108 +++++++----------- templates/webpack/app/src/App.tsx | 87 -------------- templates/webpack/app/src/App/AppViewModel.ts | 11 -- templates/webpack/app/src/App/styles/App.scss | 72 ------------ .../__mocks__/@arcgis/core/core/Accessor.ts | 2 +- .../core/core/accessorSupport/decorators.ts | 2 +- .../__mocks__/@arcgis/core/core/watchUtils.ts | 4 +- templates/webpack/app/src/index.ejs | 7 ++ templates/webpack/app/src/index.scss | 43 ++++++- templates/webpack/app/src/index.ts | 47 +------- templates/webpack/app/src/interfaces.d.ts | 54 --------- templates/webpack/app/src/widgets.spec.ts | 11 +- templates/webpack/app/src/widgets.ts | 24 +++- templates/webpack/app/tsconfig.json | 21 +--- templates/webpack/app/webpack.config.js | 60 ++++------ 59 files changed, 629 insertions(+), 823 deletions(-) create mode 100644 config.js delete mode 100644 templates/rollup/app/README.md delete mode 100644 templates/rollup/app/package.json delete mode 100644 templates/rollup/app/rollup.config.js delete mode 100644 templates/rollup/app/src/__mocks__/@arcgis/core/widgets/LayerList.ts delete mode 100644 templates/rollup/app/src/__mocks__/@arcgis/core/widgets/Legend.ts delete mode 100644 templates/rollup/app/src/__mocks__/tsconfig.json delete mode 100644 templates/rollup/app/src/assets/favicon.ico delete mode 100644 templates/rollup/app/src/assets/icon.png delete mode 100644 templates/rollup/app/src/css/.gitkeep delete mode 100644 templates/rollup/app/src/css/index.css delete mode 100644 templates/rollup/app/src/data/app.ts delete mode 100644 templates/rollup/app/src/index.html delete mode 100755 templates/rollup/app/src/index.ts delete mode 100644 templates/rollup/app/src/oauth-callback.html delete mode 100644 templates/rollup/app/src/widgets.spec.ts delete mode 100644 templates/rollup/app/src/widgets.ts rename templates/{rollup => vite}/app/.gitignore (65%) create mode 100644 templates/vite/app/README.md create mode 100644 templates/vite/app/favicon.svg create mode 100644 templates/vite/app/index.html create mode 100644 templates/vite/app/package.json create mode 100644 templates/vite/app/src/__mocks__/@arcgis/core/core/Accessor.ts create mode 100644 templates/vite/app/src/__mocks__/@arcgis/core/core/accessorSupport/decorators.ts create mode 100644 templates/vite/app/src/__mocks__/@arcgis/core/core/watchUtils.ts create mode 100644 templates/vite/app/src/__mocks__/@arcgis/core/widgets/LayerList.ts create mode 100644 templates/vite/app/src/__mocks__/@arcgis/core/widgets/Legend.ts create mode 100644 templates/vite/app/src/__mocks__/@arcgis/core/widgets/Search.ts create mode 100644 templates/vite/app/src/__mocks__/@arcgis/core/widgets/Search/LayerSearchSource.ts create mode 100644 templates/vite/app/src/_variables.css create mode 100644 templates/vite/app/src/main.ts create mode 100644 templates/vite/app/src/style.css create mode 100644 templates/vite/app/src/vite-env.d.ts create mode 100644 templates/vite/app/src/widgets.spec.ts create mode 100644 templates/vite/app/src/widgets.ts create mode 100644 templates/vite/app/tsconfig.json create mode 100644 templates/vite/app/vite.config.js delete mode 100644 templates/webpack/app/src/App.tsx delete mode 100644 templates/webpack/app/src/App/AppViewModel.ts delete mode 100644 templates/webpack/app/src/App/styles/App.scss delete mode 100644 templates/webpack/app/src/interfaces.d.ts diff --git a/README.md b/README.md index d1c59cb..87fb8b6 100644 --- a/README.md +++ b/README.md @@ -49,9 +49,9 @@ Commands: arcgis create jsapi-app ``` -> rollup template application +> vite template application ```sh -arcgis create jsapi-rollup-app -t rollup +arcgis create jsapi-vite-app -t vite ``` ## Sample Apps @@ -73,7 +73,7 @@ Options: --version Show version number [boolean] --name, -n directory and package name for the new app --dest Directory to create the application in [default: ] - --type, -t A project template [choices: "jsapi". "rollup"] [default: "jsapi"] + --type, -t A project template [choices: "jsapi". "vite"] [default: "jsapi"] -h, --help Show help [boolean] ``` @@ -87,7 +87,7 @@ Initialize a new application in current directory Options: --version Show version number [boolean] - --type, -t A project template [choices: "jsapi". "rollup"] [default: "jsapi"] + --type, -t A project template [choices: "jsapi". "vite"] [default: "jsapi"] -h, --help Show help [boolean] ``` diff --git a/config.js b/config.js new file mode 100644 index 0000000..d25a5af --- /dev/null +++ b/config.js @@ -0,0 +1,9 @@ +const ArcGISPlugin = require('@arcgis/webpack-plugin'); +const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); +const Dotenv = require('dotenv-webpack'); +const TerserPlugin = require('terser-webpack-plugin'); +const HtmlWebPackPlugin = require('html-webpack-plugin'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const HTMLInlineCSSWebpackPlugin = require('html-inline-css-webpack-plugin').default; +const CopyPlugin = require('copy-webpack-plugin'); +const { GenerateSW } = require('workbox-webpack-plugin'); \ No newline at end of file diff --git a/package.json b/package.json index 6f94001..728c9b6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arcgis/cli", - "version": "4.19.0", + "version": "4.21.0", "description": "CLI to scaffold ArcGIS API for JavaScript applications", "main": "dist/index.js", "bin": { @@ -47,30 +47,30 @@ "author": "Rene Rubalcava ", "license": "Apache-2.0", "devDependencies": { - "@babel/cli": "^7.12.10", - "@babel/core": "^7.12.10", - "@babel/preset-env": "^7.12.10", - "@babel/preset-typescript": "^7.12.7", - "@types/browser-sync": "^2.26.1", + "@babel/cli": "^7.15.7", + "@babel/core": "^7.15.5", + "@babel/preset-env": "^7.15.6", + "@babel/preset-typescript": "^7.15.0", + "@types/browser-sync": "^2.26.2", "@types/chalk": "^2.2.0", "@types/chokidar": "^2.1.3", - "@types/fibers": "^3.1.0", - "@types/jest": "^26.0.19", - "@types/node": "^14.14.25", - "@types/pify": "^5.0.0", - "@types/sass": "^1.16.0", - "@types/yargs": "^16.0.0", - "@typescript-eslint/eslint-plugin": "^4.15.0", - "@typescript-eslint/parser": "^4.15.0", + "@types/fibers": "^3.1.1", + "@types/jest": "^27.0.2", + "@types/node": "^16.9.6", + "@types/pify": "^5.0.1", + "@types/sass": "^1.16.1", + "@types/yargs": "^17.0.3", + "@typescript-eslint/eslint-plugin": "^4.31.2", + "@typescript-eslint/parser": "^4.31.2", "cpy-cli": "^3.1.1", - "eslint": "^7.19.0", - "eslint-config-prettier": "^7.2.0", - "eslint-plugin-prettier": "^3.3.1", - "husky": "^4.3.8", - "jest": "^26.6.3", - "lint-staged": "^10.5.4", - "prettier": "^2.2.1", - "typescript": "^4.1.3" + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "husky": "^7.0.2", + "jest": "^27.2.1", + "lint-staged": "^11.1.2", + "prettier": "^2.4.1", + "typescript": "^4.4.3" }, "babel": { "presets": [ @@ -111,29 +111,29 @@ "useTabs": true }, "dependencies": { - "arcgis-js-api": "^4.18.1", - "browser-sync": "^2.26.14", - "chalk": "^4.1.0", - "chokidar": "^3.5.1", - "core-js": "^3.8.1", - "cpy": "^8.1.1", + "arcgis-js-api": "^4.20.2", + "browser-sync": "^2.27.5", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "core-js": "^3.18.0", + "cpy": "^8.1.2", "cross-spawn-promise": "^0.10.2", "del": "^6.0.0", "fibers": "^5.0.0", - "fs-extra": "^9.0.1", - "inquirer": "^7.3.3", + "fs-extra": "^10.0.0", + "inquirer": "^8.1.5", "lodash.camelcase": "^4.3.0", "lodash.startcase": "^4.4.0", - "ora": "^5.1.0", + "ora": "^6.0.1", "pify": "^5.0.0", - "pkg-dir": "^4.2.0", + "pkg-dir": "^5.0.0", "ramda": "^0.27.1", - "recursive-copy": "^2.0.11", - "regenerator-runtime": "^0.13.7", + "recursive-copy": "^2.0.13", + "regenerator-runtime": "^0.13.9", "rimraf": "^3.0.2", - "sass": "^1.32.6", - "tslib": "^2.1.0", + "sass": "^1.42.1", + "tslib": "^2.3.1", "watch": "^1.0.2", - "yargs": "^16.2.0" + "yargs": "^17.1.1" } } diff --git a/src/commands/create.ts b/src/commands/create.ts index 5a62870..ea18d12 100644 --- a/src/commands/create.ts +++ b/src/commands/create.ts @@ -35,7 +35,7 @@ const create = { type: { alias: 't', describe: 'A project template', - choices: ['jsapi', 'rollup'], + choices: ['jsapi', 'vite'], demandOption: false, default: 'jsapi', }, @@ -44,7 +44,7 @@ const create = { async handler(argv: CreatArgs): Promise { console.info(chalk.underline(`Creating ArcGIS project: ${argv.name}\n`)); - if (argv.type === 'jsapi' || argv.type === 'rollup') { + if (argv.type === 'jsapi' || argv.type === 'vite') { return await createApp({ argv }); } else { console.info(chalk.red(`Unknown app template "${argv.type}.\n`)); diff --git a/src/commands/init.ts b/src/commands/init.ts index 3f8d08f..5d58b91 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -31,7 +31,7 @@ const init = { type: { alias: 't', describe: 'A project template', - choices: ['jsapi', 'rollup'], + choices: ['jsapi', 'vite'], demandOption: false, default: 'jsapi', }, diff --git a/src/lib/copyTemplate.ts b/src/lib/copyTemplate.ts index afc73db..a96c2b4 100644 --- a/src/lib/copyTemplate.ts +++ b/src/lib/copyTemplate.ts @@ -24,7 +24,7 @@ type Args = { }; const BASIC = 'templates/webpack/app'; -const ROLLUP = 'templates/rollup/app'; +const VITE = 'templates/vite/app'; const gitignore = ` node_modules/* @@ -47,8 +47,8 @@ coverage/* const copyTemplate = async (arg: Args, init = false): Promise => { let templateDirectory = BASIC; - if (arg.type === 'rollup') { - templateDirectory = ROLLUP; + if (arg.type === 'vite') { + templateDirectory = VITE; } let target: string; diff --git a/templates/rollup/app/README.md b/templates/rollup/app/README.md deleted file mode 100644 index 9a0407f..0000000 --- a/templates/rollup/app/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# ArcGIS API for JavaScript with rollup - -This repo demonstrates how to use the [`@arcgis/core`](https://www.npmjs.com/package/@arcgis/core) esm modules with rollup. \ No newline at end of file diff --git a/templates/rollup/app/package.json b/templates/rollup/app/package.json deleted file mode 100644 index e7cb762..0000000 --- a/templates/rollup/app/package.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "private": true, - "dependencies": { - "@arcgis/core": "~4.19.0" - }, - "devDependencies": { - "@rollup/plugin-commonjs": "^18.0.0", - "@rollup/plugin-html": "^0.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-typescript": "^8.0.0", - "@types/jest": "^26.0.18", - "@typescript-eslint/eslint-plugin": "^4.8.1", - "@typescript-eslint/parser": "^4.8.1", - "eslint": "^7.15.0", - "eslint-config-prettier": "^8.2.0", - "eslint-plugin-prettier": "^3.2.0", - "husky": "^6.0.0", - "jest": "^26.6.3", - "lint-staged": "^10.5.3", - "ncp": "^2.0.0", - "npm-run-all": "^4.1.5", - "postcss": "^8.2.1", - "prettier": "^2.2.1", - "rollup": "^2.26.11", - "rollup-plugin-copy": "^3.3.0", - "rollup-plugin-delete": "^2.0.0", - "rollup-plugin-postcss": "^4.0.0", - "rollup-plugin-terser": "^7.0.2", - "serve": "^11.3.2", - "ts-jest": "^26.4.4", - "tslib": "^2.0.3", - "typescript": "^4.1.2" - }, - "scripts": { - "build": "rollup -c", - "watch": "rollup -c -w", - "start": "npm-run-all --parallel serve watch", - "serve": "serve dist", - "lint": "eslint 'src/**/*.{js,ts,tsx}' --quiet --fix" - }, - "eslintConfig": { - "env": { - "browser": true, - "node": true - }, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 2020, - "sourceType": "module" - }, - "rules": { - "@typescript-eslint/no-empty-function": 0, - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_|^h" - } - ] - }, - "extends": [ - "plugin:@typescript-eslint/recommended", - "prettier/@typescript-eslint", - "plugin:prettier/recommended" - ] - }, - "jest": { - "roots": [ - "/src" - ], - "testMatch": [ - "**/__tests__/**/*.+(ts|tsx|js)", - "**/?(*.)+(spec|test).+(ts|tsx|js)" - ], - "transform": { - "^.+\\.(ts|tsx)$": "ts-jest" - } - }, - "prettier": { - "semi": true, - "singleQuote": true, - "trailingComma": "all", - "printWidth": 120, - "tabWidth": 4, - "useTabs": true - }, - "lint-staged": { - "*.{ts,tsx}": [ - "prettier --write", - "eslint --fix" - ] - } -} diff --git a/templates/rollup/app/rollup.config.js b/templates/rollup/app/rollup.config.js deleted file mode 100644 index f0b2283..0000000 --- a/templates/rollup/app/rollup.config.js +++ /dev/null @@ -1,43 +0,0 @@ -import commonjs from '@rollup/plugin-commonjs'; -import copy from 'rollup-plugin-copy' -import del from 'rollup-plugin-delete'; -import postcss from 'rollup-plugin-postcss' -import resolve from '@rollup/plugin-node-resolve'; -import { terser } from 'rollup-plugin-terser'; -import typescript from '@rollup/plugin-typescript'; - -import fs from 'fs'; -import path from 'path'; - -// `npm run build` -> `production` is true -// `npm run dev` -> `production` is false -const production = !process.env.ROLLUP_WATCH; - -export default { - input: 'src/index.ts', - output: { - chunkFileNames: 'chunks/[name].[hash].js', - dir: 'dist', - format: 'es' - }, - plugins: [ - del({ targets: 'dist/', runOnce: true, verbose: true }), - resolve(), - commonjs(), - production && terser(), - typescript({ - // make sure to use latest - // version of typescript - typescript: require('typescript'), - }), - postcss({ extract: true }), - copy({ - targets: [ - { src: 'src/index.html', dest: 'dist/' }, - { src: 'src/oauth-callback.html', dest: 'dist/' } - ], - copyOnce: true - }) - ], - preserveEntrySignatures: false -}; diff --git a/templates/rollup/app/src/__mocks__/@arcgis/core/widgets/LayerList.ts b/templates/rollup/app/src/__mocks__/@arcgis/core/widgets/LayerList.ts deleted file mode 100644 index 3ebc8f1..0000000 --- a/templates/rollup/app/src/__mocks__/@arcgis/core/widgets/LayerList.ts +++ /dev/null @@ -1,7 +0,0 @@ -export default class LayerList { - view: any; - container: any; - constructor(params?: any) { - this.view = params.view; - } -} diff --git a/templates/rollup/app/src/__mocks__/@arcgis/core/widgets/Legend.ts b/templates/rollup/app/src/__mocks__/@arcgis/core/widgets/Legend.ts deleted file mode 100644 index dd1e0c9..0000000 --- a/templates/rollup/app/src/__mocks__/@arcgis/core/widgets/Legend.ts +++ /dev/null @@ -1,7 +0,0 @@ -export default class Legend { - view: any; - container: any; - constructor(params?: any) { - this.view = params.view; - } -} diff --git a/templates/rollup/app/src/__mocks__/tsconfig.json b/templates/rollup/app/src/__mocks__/tsconfig.json deleted file mode 100644 index ca994bf..0000000 --- a/templates/rollup/app/src/__mocks__/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "module": "commonjs", - "declaration": true, - "strict": true, - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true - } -} diff --git a/templates/rollup/app/src/assets/favicon.ico b/templates/rollup/app/src/assets/favicon.ico deleted file mode 100644 index bb17d3530edfb56c1a1cfd454fc1164bc5ae7a44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 944 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 diff --git a/templates/rollup/app/src/css/.gitkeep b/templates/rollup/app/src/css/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/templates/rollup/app/src/css/index.css b/templates/rollup/app/src/css/index.css deleted file mode 100644 index 6be3f38..0000000 --- a/templates/rollup/app/src/css/index.css +++ /dev/null @@ -1,41 +0,0 @@ -:root { - --blue: #0079c1; - --gray: #efefef; - --white: #fff; -} - -html, body { - height: 100%; - width: 100%; - margin: 0; - padding: 0; -} - -body { - background-color: var(--gray); - font-family: Avenir Next W01,Avenir Next W00,Avenir Next,Avenir,Helvetica Neue,sans-serif; -} - -.header { - background-color: var(--blue); - color: var(--white); -} - -.heading { - padding-left: 0.75rem; -} - -.app-container { - width: 100%; - height: 100%; - display: flex; - flex-direction: column; -} - -/* map view */ -#viewDiv { - padding: 0; - margin: 0; - height: 100%; - width: 100%; -} diff --git a/templates/rollup/app/src/data/app.ts b/templates/rollup/app/src/data/app.ts deleted file mode 100644 index 9996298..0000000 --- a/templates/rollup/app/src/data/app.ts +++ /dev/null @@ -1,33 +0,0 @@ -import FeatureLayer from '@arcgis/core/layers/FeatureLayer'; -import TileLayer from '@arcgis/core/layers/TileLayer'; -import VectorTileLayer from '@arcgis/core/layers/VectorTileLayer'; -import ArcGISMap from '@arcgis/core/Map'; - -export const featureLayer = new FeatureLayer({ - portalItem: { - id: 'b234a118ab6b4c91908a1cf677941702', - }, - outFields: ['NAME', 'STATE_NAME', 'VACANT', 'HSE_UNITS'], - title: 'U.S. counties', - opacity: 0.8, -}); - -export const map = new ArcGISMap({ - basemap: { - baseLayers: [ - new TileLayer({ - portalItem: { - // world hillshade - id: '1b243539f4514b6ba35e7d995890db1d', - }, - }), - new VectorTileLayer({ - portalItem: { - // topographic - id: '7dc6cea0b1764a1f9af2e679f642f0f5', - }, - }), - ], - }, - layers: [featureLayer], -}); diff --git a/templates/rollup/app/src/index.html b/templates/rollup/app/src/index.html deleted file mode 100644 index 2d24c83..0000000 --- a/templates/rollup/app/src/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - ArcGIS Template Application - - - - -
-
-

ArcGIS Template Application

-
-
-
- - - diff --git a/templates/rollup/app/src/index.ts b/templates/rollup/app/src/index.ts deleted file mode 100755 index c4edd78..0000000 --- a/templates/rollup/app/src/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import './css/index.css'; - -// Map data -import { featureLayer, map } from './data/app'; - -// MapView -import MapView from '@arcgis/core/views/MapView'; - -// widget utils -import { initWidgets } from './widgets'; - -/** - * Initialize application - */ -const view = new MapView({ - container: 'viewDiv', - map, -}); - -featureLayer.when(() => { - view.goTo(featureLayer.fullExtent); -}); - -view.when(initWidgets); diff --git a/templates/rollup/app/src/oauth-callback.html b/templates/rollup/app/src/oauth-callback.html deleted file mode 100644 index 006a602..0000000 --- a/templates/rollup/app/src/oauth-callback.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - diff --git a/templates/rollup/app/src/widgets.spec.ts b/templates/rollup/app/src/widgets.spec.ts deleted file mode 100644 index efdbda1..0000000 --- a/templates/rollup/app/src/widgets.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { initWidgets } from './widgets'; - -jest.mock('@arcgis/core/widgets/LayerList'); -jest.mock('@arcgis/core/widgets/Legend'); - -let spy: jest.SpyInstance; - -describe('widgets', () => { - beforeEach(() => { - spy = jest.spyOn(document, 'getElementById'); - const mockElem: any = { - offsetWidth: 300, - }; - spy.mockReturnValue(mockElem); - }); - - it('initializes widgets in view', () => { - const widgets: any[] = []; - const view: any = { - ui: { - add(w: any) { - widgets.push(w); - }, - }, - }; - initWidgets(view); - expect(widgets).toHaveLength(2); - }); -}); diff --git a/templates/rollup/app/src/widgets.ts b/templates/rollup/app/src/widgets.ts deleted file mode 100644 index e54ff0f..0000000 --- a/templates/rollup/app/src/widgets.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Widgets -import LayerList from '@arcgis/core/widgets/LayerList'; -import Legend from '@arcgis/core/widgets/Legend'; - -export function initWidgets(view: __esri.MapView) { - const legend = new Legend({ view }); - const layerList = new LayerList({ view }); - - view.ui.add(legend, 'bottom-left'); - view.ui.add(layerList, 'top-right'); - return view; -} diff --git a/templates/rollup/app/.gitignore b/templates/vite/app/.gitignore similarity index 65% rename from templates/rollup/app/.gitignore rename to templates/vite/app/.gitignore index 42d7e67..1574197 100644 --- a/templates/rollup/app/.gitignore +++ b/templates/vite/app/.gitignore @@ -1,7 +1,3 @@ -# override cli .gitignore -# can be removed from scaffolded app -!src/assets - node_modules/* .vscode/* build/* @@ -14,5 +10,9 @@ html-report/* npm-debug.log coverage-final.* *.env +*.local coverage/* debug.log +coverage +.DS_Store +dist-ssr \ No newline at end of file diff --git a/templates/vite/app/README.md b/templates/vite/app/README.md new file mode 100644 index 0000000..39c3b66 --- /dev/null +++ b/templates/vite/app/README.md @@ -0,0 +1,32 @@ +# ArcGIS API for JavaScript Template Application + +## Usage + +This application is written in [TypeScript](http://www.typescriptlang.org/) and utilizes the [`vite`](https://vitejs.dev/). + +You can develop, test, and build the application using various commands. + +You will need to create an [API Key](https://developers.arcgis.com/documentation/mapping-apis-and-services/security/#api-keys) using a free [ArcGIS Developer Account](https://developers.arcgis.com/sign-up/). + +Add your API Key to a `.env` file at the root of this project. + +``` +VITE_API_KEY=MY-DEVELOPER-API-KEY +``` + +Vite will pick up the API Key for use in your application. + +Run the application in development mode with a local development server. +```sh +npm start +``` + +Run the unit tests for the application. Unit tests are written with [Jest](https://jestjs.io/). +```sh +npm test +``` + +Build the application for deployment. +```sh +npm run build +``` \ No newline at end of file diff --git a/templates/vite/app/favicon.svg b/templates/vite/app/favicon.svg new file mode 100644 index 0000000..de4aedd --- /dev/null +++ b/templates/vite/app/favicon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/templates/vite/app/index.html b/templates/vite/app/index.html new file mode 100644 index 0000000..ddef8f0 --- /dev/null +++ b/templates/vite/app/index.html @@ -0,0 +1,20 @@ + + + + + + + Vite App + + + +
+
+
ArcGIS WebMap Template
+ +
+
+
+ + + diff --git a/templates/vite/app/package.json b/templates/vite/app/package.json new file mode 100644 index 0000000..bc8636a --- /dev/null +++ b/templates/vite/app/package.json @@ -0,0 +1,101 @@ +{ + "name": "jsapi-vite-template", + "version": "0.0.0", + "scripts": { + "start": "vite", + "build": "tsc && vite build", + "serve": "vite preview", + "prettier": "prettier --write \"src/**/*.ts?(x)\"", + "lint": "eslint . --ext .js,.ts,.tsx --fix", + "test": "jest --coverage --passWithNoTests", + "precommit": "lint-staged" + }, + "eslintConfig": { + "env": { + "browser": true, + "node": true + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module" + }, + "ignorePatterns": [ + "vite.config.js", + "*.d.ts", + "dist/", + "__mocks__" + ], + "rules": { + "@typescript-eslint/no-empty-function": 0, + "@typescript-eslint/ban-ts-comment": 1, + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_|^h" + } + ] + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended" + ], + "plugins": [ + "prettier", + "@typescript-eslint" + ] + }, + "prettier": { + "semi": true, + "singleQuote": true, + "trailingComma": "all", + "printWidth": 120, + "tabWidth": 2 + }, + "lint-staged": { + "*.{ts,tsx}": [ + "prettier --write", + "eslint --fix" + ] + }, + "jest": { + "roots": [ + "/src" + ], + "testEnvironment": "jsdom", + "moduleDirectories": [ + "node_modules", + "src" + ], + "extensionsToTreatAsEsm": [ + ".ts" + ], + "transformIgnorePatterns": [ + "node_modules/(?!@arcgis)" + ], + "transform": { + "^.+\\.tsx?$": "ts-jest" + } + }, + "devDependencies": { + "@types/jest": "^27.0.1", + "@typescript-eslint/eslint-plugin": "^4.31.2", + "@typescript-eslint/parser": "^4.31.2", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "husky": "^7.0.2", + "jest": "^27.2.1", + "lint-staged": "^11.1.2", + "prettier": "^2.4.1", + "rollup-plugin-copy": "^3.4.0", + "ts-jest": "^27.0.5", + "typescript": "^4.3.2", + "vite": "^2.5.4", + "vite-plugin-pwa": "^0.11.2" + }, + "dependencies": { + "@arcgis/core": "^4.21.0" + } +} diff --git a/templates/vite/app/src/__mocks__/@arcgis/core/core/Accessor.ts b/templates/vite/app/src/__mocks__/@arcgis/core/core/Accessor.ts new file mode 100644 index 0000000..0ac5074 --- /dev/null +++ b/templates/vite/app/src/__mocks__/@arcgis/core/core/Accessor.ts @@ -0,0 +1 @@ +export default class Accessor {} diff --git a/templates/vite/app/src/__mocks__/@arcgis/core/core/accessorSupport/decorators.ts b/templates/vite/app/src/__mocks__/@arcgis/core/core/accessorSupport/decorators.ts new file mode 100644 index 0000000..ab5096e --- /dev/null +++ b/templates/vite/app/src/__mocks__/@arcgis/core/core/accessorSupport/decorators.ts @@ -0,0 +1,2 @@ +export const property = () => {}; +export const subclass = () => {}; diff --git a/templates/vite/app/src/__mocks__/@arcgis/core/core/watchUtils.ts b/templates/vite/app/src/__mocks__/@arcgis/core/core/watchUtils.ts new file mode 100644 index 0000000..227ff43 --- /dev/null +++ b/templates/vite/app/src/__mocks__/@arcgis/core/core/watchUtils.ts @@ -0,0 +1 @@ +export function whenOnce() {} diff --git a/templates/vite/app/src/__mocks__/@arcgis/core/widgets/LayerList.ts b/templates/vite/app/src/__mocks__/@arcgis/core/widgets/LayerList.ts new file mode 100644 index 0000000..1cfa5fe --- /dev/null +++ b/templates/vite/app/src/__mocks__/@arcgis/core/widgets/LayerList.ts @@ -0,0 +1,8 @@ +import esri = __esri; +export default class LayerList { + view!: esri.MapViewProperties | esri.SceneViewProperties | undefined; + container!: HTMLDivElement; + constructor(params?: esri.LayerListProperties) { + this.view = params?.view; + } +} diff --git a/templates/vite/app/src/__mocks__/@arcgis/core/widgets/Legend.ts b/templates/vite/app/src/__mocks__/@arcgis/core/widgets/Legend.ts new file mode 100644 index 0000000..282e936 --- /dev/null +++ b/templates/vite/app/src/__mocks__/@arcgis/core/widgets/Legend.ts @@ -0,0 +1,8 @@ +import esri = __esri; +export default class Legend { + view!: esri.MapViewProperties | esri.SceneViewProperties | undefined; + container!: HTMLDivElement; + constructor(params?: esri.LegendProperties) { + this.view = params?.view; + } +} diff --git a/templates/vite/app/src/__mocks__/@arcgis/core/widgets/Search.ts b/templates/vite/app/src/__mocks__/@arcgis/core/widgets/Search.ts new file mode 100644 index 0000000..31a2c96 --- /dev/null +++ b/templates/vite/app/src/__mocks__/@arcgis/core/widgets/Search.ts @@ -0,0 +1,8 @@ +import esri = __esri; +export default class Search { + view!: esri.MapViewProperties | esri.SceneViewProperties | undefined; + container!: HTMLDivElement; + constructor(params?: __esri.SearchProperties) { + params; + } +} diff --git a/templates/vite/app/src/__mocks__/@arcgis/core/widgets/Search/LayerSearchSource.ts b/templates/vite/app/src/__mocks__/@arcgis/core/widgets/Search/LayerSearchSource.ts new file mode 100644 index 0000000..4f8ea21 --- /dev/null +++ b/templates/vite/app/src/__mocks__/@arcgis/core/widgets/Search/LayerSearchSource.ts @@ -0,0 +1,5 @@ +export default class LayerSearchSource { + constructor(params?: any) { + params; + } +} diff --git a/templates/vite/app/src/_variables.css b/templates/vite/app/src/_variables.css new file mode 100644 index 0000000..5251bb5 --- /dev/null +++ b/templates/vite/app/src/_variables.css @@ -0,0 +1,4 @@ +:root { + --main-bg-color: #007ac2; + --font-color-white: #ffffff; + } \ No newline at end of file diff --git a/templates/vite/app/src/main.ts b/templates/vite/app/src/main.ts new file mode 100644 index 0000000..8dfafcb --- /dev/null +++ b/templates/vite/app/src/main.ts @@ -0,0 +1,32 @@ +import config from '@arcgis/core/config'; +import Map from '@arcgis/core/Map'; +import MapView from '@arcgis/core/views/MapView'; +import FeatureLayer from '@arcgis/core/layers/FeatureLayer'; +import { initWidgets } from './widgets'; + +import './style.css'; + +config.apiKey = import.meta.env.VITE_API_KEY as string; + +const featureLayer = new FeatureLayer({ + portalItem: { + id: 'b234a118ab6b4c91908a1cf677941702', + }, + outFields: ['NAME', 'STATE_NAME', 'VACANT', 'HSE_UNITS'], + title: 'U.S. Counties', + opacity: 0.8, +}); + +featureLayer.when(() => { + view.goTo(featureLayer.fullExtent); +}); + +const view = new MapView({ + container: 'viewDiv', + map: new Map({ + basemap: 'arcgis-topographic', + layers: [featureLayer], + }), +}); + +view.when(() => initWidgets({ view, layer: featureLayer })); diff --git a/templates/vite/app/src/style.css b/templates/vite/app/src/style.css new file mode 100644 index 0000000..600b817 --- /dev/null +++ b/templates/vite/app/src/style.css @@ -0,0 +1,62 @@ +/************************************************* + Custom ArcGIS JavaScript API theming. +*************************************************/ +@import url("https://js.arcgis.com/4.21/esri/themes/light/main.css"); + +@import "./_variables.css"; + +/************************************************* + Add application and widget styles. +*************************************************/ + +html, +body { + padding: 0; + margin: 0; + height: 100%; + width: 100%; + font-size: 14px; +} + +.app { + display: flex; + flex-flow: column; + width: 100%; + height: 100%; + padding: 0; + margin: 0; + overflow: hidden; +} + +.app--header { + display: flex; + flex-flow: row; + justify-content: space-between; + align-items: center; + height: 40px; + width: 100%; + background-color: var(--main-bg-color); + color: var(--font-color-white); +} + +.app--header-title { + font-size: 20px; + font-weight: 500; + margin-left: 0.5rem; +} + +@media screen and (min-width: 880px) { + .app--header-search.esri-search { + width: 340px; + } +} +@media screen and (min-width: 1280px) { + .app--header-search.esri-search { + width: 640px; + } +} + +.app--view { + width: 100%; + height: calc(100% - 40px); +} diff --git a/templates/vite/app/src/vite-env.d.ts b/templates/vite/app/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/templates/vite/app/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/templates/vite/app/src/widgets.spec.ts b/templates/vite/app/src/widgets.spec.ts new file mode 100644 index 0000000..612a97b --- /dev/null +++ b/templates/vite/app/src/widgets.spec.ts @@ -0,0 +1,25 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { initWidgets } from './widgets'; + +jest.mock('@arcgis/core/widgets/LayerList'); +jest.mock('@arcgis/core/widgets/Legend'); +jest.mock('@arcgis/core/widgets/Search'); + +describe('widgets', () => { + it('initializes widgets in view', () => { + const widgets: unknown[] = []; + + const view: any = { + ui: { + add(w: unknown) { + widgets.push(w); + }, + }, + }; + + const layer: any = {}; + + initWidgets({ view, layer }); + expect(widgets).toHaveLength(2); + }); +}); diff --git a/templates/vite/app/src/widgets.ts b/templates/vite/app/src/widgets.ts new file mode 100644 index 0000000..b639c8a --- /dev/null +++ b/templates/vite/app/src/widgets.ts @@ -0,0 +1,32 @@ +// Widgets +import FeatureLayer from '@arcgis/core/layers/FeatureLayer'; +import MapView from '@arcgis/core/views/MapView'; +import LayerList from '@arcgis/core/widgets/LayerList'; +import Legend from '@arcgis/core/widgets/Legend'; +import Search from '@arcgis/core/widgets/Search'; +import LayerSearchSource from '@arcgis/core/widgets/Search/LayerSearchSource'; + +interface Params { + view: MapView; + layer: FeatureLayer; +} + +export function initWidgets({ view, layer }: Params): MapView { + const legend = new Legend({ view }); + const layerList = new LayerList({ view }); + view.ui.add(legend, 'bottom-left'); + view.ui.add(layerList, 'top-right'); + new Search({ + container: 'searchDiv', + sources: [ + new LayerSearchSource({ + layer, + outFields: ['NAME', 'STATE_NAME', 'VACANT', 'HSE_UNITS'], + searchFields: ['NAME'], + suggestionTemplate: '{NAME} County, {STATE_NAME}', + placeholder: 'Search by County Name', + }), + ], + }); + return view; +} diff --git a/templates/vite/app/tsconfig.json b/templates/vite/app/tsconfig.json new file mode 100644 index 0000000..8cdbb2a --- /dev/null +++ b/templates/vite/app/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "moduleResolution": "Node", + "strict": true, + "sourceMap": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true + }, + "include": ["./src"] +} diff --git a/templates/vite/app/vite.config.js b/templates/vite/app/vite.config.js new file mode 100644 index 0000000..4a38d8e --- /dev/null +++ b/templates/vite/app/vite.config.js @@ -0,0 +1,28 @@ +import { defineConfig } from 'vite' +import { VitePWA } from 'vite-plugin-pwa' +import copy from 'rollup-plugin-copy' + +export default defineConfig({ + plugins: [ + VitePWA(), + // copy({ + // targets: [ { src: 'node_modules/@arcgis/core/assets/', dest: './public/' }, ], + // hook: 'writeBundle' + // }) + ], + css: { + preprocessorOptions: { + scss : { + sassOptions: { + importer: function (url, prev, done) { + console.log(url) + const result = url.includes("@arcgis/core") + ? url.replace("../", "./assets/esri/themes/") + : url; + return { file: result }; + } + } + } + } + } +}); diff --git a/templates/webpack/app/.gitignore b/templates/webpack/app/.gitignore index 42d7e67..29bb730 100644 --- a/templates/webpack/app/.gitignore +++ b/templates/webpack/app/.gitignore @@ -14,5 +14,6 @@ html-report/* npm-debug.log coverage-final.* *.env +*.env.local coverage/* debug.log diff --git a/templates/webpack/app/README.md b/templates/webpack/app/README.md index ef7c582..9b7e265 100644 --- a/templates/webpack/app/README.md +++ b/templates/webpack/app/README.md @@ -1,22 +1,11 @@ -# ArcGIS API for JavaScript Template Application +# ArcGIS API for JavaScript with webpack -## Usage +This project was bootstrapped with the [`@arcgis/cli`](https://github.com/Esri/arcgis-js-cli). -This application is written in [TypeScript](http://www.typescriptlang.org/) and utilizes the [`@arcgis/webpack-plugin`](https://github.com/Esri/arcgis-webpack-plugin). +For additional information, see the [Build with ES modules](https://developers.arcgis.com/javascript/latest/es-modules/) Guide topic in the SDK. -You can develop, test, and build the application using various commands. +## Commands -Run the application in development mode with a local development server. -```sh -npm start -``` - -Run the unit tests for the application. Unit tests are written with [Jest](https://jestjs.io/). -```sh -npm test -``` - -Build the application for deployment. -```sh -npm run build -``` +- `npm start` to run in development mode. +- `npm run build` to create a deployable build. +- `npm test` to run tests. \ No newline at end of file diff --git a/templates/webpack/app/package.json b/templates/webpack/app/package.json index 5601797..060096d 100644 --- a/templates/webpack/app/package.json +++ b/templates/webpack/app/package.json @@ -1,6 +1,7 @@ { - "name": "jsapi-cli-webpack-template-app", + "name": "jsapi-cli-basic", "version": "0.0.1", + "type": "module", "description": "ArcGIS API for JavaScript Webpack template application.", "author": { "name": "arcgis-js-cli", @@ -12,75 +13,50 @@ }, "license": "Apache-2.0", "dependencies": { - "@arcgis/core": "~4.19.0", - "@arcgis/webpack-plugin": "~4.19.0", - "@babel/polyfill": "^7.12.1" + "@arcgis/core": "~4.21.0" }, "devDependencies": { - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-decorators": "^7.12.12", - "@babel/preset-typescript": "^7.12.7", - "@types/jest": "^26.0.20", - "@typescript-eslint/eslint-plugin": "^4.14.1", - "@typescript-eslint/parser": "^4.14.1", - "babel-loader": "^8.2.2", - "clean-webpack-plugin": "^3.0.0", - "copy-webpack-plugin": "^8.1.1", - "css-loader": "^5.0.1", - "css-minimizer-webpack-plugin": "^2.0.0", - "eslint": "^7.18.0", - "eslint-config-prettier": "^8.2.0", - "eslint-plugin-prettier": "^3.3.1", + "@arcgis/webpack-plugin": "^4.20.0", + "@types/jest": "^27.0.1", + "@typescript-eslint/eslint-plugin": "^4.31.1", + "@typescript-eslint/parser": "^4.31.1", + "copy-webpack-plugin": "^9.0.1", + "css-loader": "^6.2.0", + "css-minimizer-webpack-plugin": "^3.0.2", + "dotenv-webpack": "^7.0.3", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", "file-loader": "^6.2.0", - "html-inline-css-webpack-plugin": "^1.10.0", - "html-webpack-plugin": "^5.0.0-alpha.7", - "husky": "^6.0.0", - "jest": "^26.6.3", - "lint-staged": "^10.5.3", - "mini-css-extract-plugin": "^1.3.4", - "prettier": "^2.2.1", - "resolve-url-loader": "^3.1.2", - "sass": "^1.32.11", - "sass-loader": "^11.0.1", - "terser-webpack-plugin": "^5.1.1", - "ts-jest": "^26.4.4", - "ts-loader": "^9.0.2", - "tslib": "^2.1.0", - "typescript": "^4.1.3", - "webpack": "^5.18.0", - "webpack-cli": "^4.4.0", - "webpack-dev-server": "^3.11.2", - "workbox-webpack-plugin": "^6.0.2" + "html-inline-css-webpack-plugin": "^1.11.1", + "html-webpack-plugin": "^5.3.2", + "husky": "^7.0.2", + "jest": "^27.2.0", + "lint-staged": "^11.1.2", + "mini-css-extract-plugin": "^2.3.0", + "prettier": "^2.4.0", + "resolve-url-loader": "^4.0.0", + "sass": "^1.39.2", + "sass-loader": "^12.1.0", + "terser-webpack-plugin": "^5.2.4", + "ts-jest": "^27.0.5", + "ts-loader": "^9.2.5", + "tslib": "^2.3.1", + "typescript": "^4.4.3", + "webpack": "^5.52.1", + "webpack-cli": "^4.8.0", + "webpack-dev-server": "^4.2.0", + "workbox-webpack-plugin": "^6.3.0" }, "scripts": { "build": "webpack --mode production", "start": "webpack serve --mode development", "prettier": "prettier --write \"src/**/*.ts?(x)\"", "prettier-webpack": "prettier --write webpack.config.js", - "lint": "eslint . --ext .js,.ts,.tsx", + "lint": "eslint . --ext .js,.ts,.tsx --fix", "test": "jest --coverage --passWithNoTests", "precommit": "lint-staged" }, - "babel": { - "presets": [ - "@babel/preset-env", - "@babel/preset-typescript" - ], - "plugins": [ - [ - "@babel/plugin-proposal-decorators", - { - "legacy": true - } - ], - [ - "@babel/plugin-proposal-class-properties", - { - "loose": true - } - ] - ] - }, "eslintConfig": { "env": { "browser": true, @@ -94,7 +70,8 @@ "ignorePatterns": [ "webpack.config.js", "*.d.ts", - "dist/" + "dist/", + "__mocks__" ], "rules": { "@typescript-eslint/no-empty-function": 0, @@ -107,11 +84,12 @@ ] }, "extends": [ + "eslint:recommended", "plugin:@typescript-eslint/recommended", - "prettier/@typescript-eslint", "plugin:prettier/recommended" ], "plugins": [ + "prettier", "@typescript-eslint" ] }, @@ -123,16 +101,14 @@ "tabWidth": 2 }, "jest": { - "preset": "ts-jest", "roots": [ "/src" ], - "testMatch": [ - "**/__tests__/**/*.+(ts|tsx|js)", - "**/?(*.)+(spec|test).+(ts|tsx|js)" - ], + "moduleDirectories": ["node_modules", "src"], + "extensionsToTreatAsEsm": [".ts"], + "transformIgnorePatterns": ["node_modules/(?!@arcgis)"], "transform": { - "^.+\\.(ts|tsx)$": "ts-jest" + "^.+\\.tsx?$": "ts-jest" } }, "lint-staged": { diff --git a/templates/webpack/app/src/App.tsx b/templates/webpack/app/src/App.tsx deleted file mode 100644 index ab4b219..0000000 --- a/templates/webpack/app/src/App.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import app = __app; - -import { whenOnce } from '@arcgis/core/core/watchUtils'; - -import { property, subclass } from '@arcgis/core/core/accessorSupport/decorators'; - -import { tsx } from '@arcgis/core/widgets/support/widget'; - -import Widget from '@arcgis/core/widgets/Widget'; - -import AppViewModel from 'app/App/AppViewModel'; - -import Search from '@arcgis/core/widgets/Search'; - -const CSS = { - base: 'app', - header: 'app--header', - headerTitle: 'app--header-title', - headerSearch: 'app--header-search', - view: 'app--view', -}; - -@subclass('app/App') -export default class App extends Widget { - // view model has no purpose here but more complex apps should have all logic and _init() contained therein - @property({ - type: AppViewModel, - }) - viewModel = new AppViewModel(); - - @property({ - aliasOf: 'viewModel.view', - }) - view!: esri.MapView | esri.SceneView; - - @property() - title = 'ArcGIS for JavaScript'; - - @property() - searchViewModel: esri.SearchViewModel | undefined; - - constructor(properties: app.AppProperties) { - super(properties); - whenOnce(this, 'view', this._init.bind(this)); - } - - private async _init(): Promise { - const { view, searchViewModel } = this; - - setTimeout((): void => { - view.container = document.querySelector('div[data-app-view]') as HTMLDivElement; - }, 0); - - await view.when(); - - const searchContainer = document.querySelector('div[data-app-search]') as HTMLDivElement; - if (searchViewModel && !searchViewModel.view) { - searchViewModel.view = view; - } - searchViewModel - ? new Search({ - view, - viewModel: searchViewModel, - container: searchContainer, - }) - : new Search({ - view, - container: searchContainer, - }); - } - - render(): tsx.JSX.Element { - const { title } = this; - return ( -
- {/* header */} -
-
{title}
-
-
- - {/* view */} -
-
- ); - } -} diff --git a/templates/webpack/app/src/App/AppViewModel.ts b/templates/webpack/app/src/App/AppViewModel.ts deleted file mode 100644 index 8ab999a..0000000 --- a/templates/webpack/app/src/App/AppViewModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -// import app = __app; - -import { property, subclass } from '@arcgis/core/core/accessorSupport/decorators'; - -import Accessor from '@arcgis/core/core/Accessor'; - -@subclass('app/App/AppViewModel') -export default class AppViewModel extends Accessor { - @property() - view!: esri.MapView | esri.SceneView; -} diff --git a/templates/webpack/app/src/App/styles/App.scss b/templates/webpack/app/src/App/styles/App.scss deleted file mode 100644 index 71f09db..0000000 --- a/templates/webpack/app/src/App/styles/App.scss +++ /dev/null @@ -1,72 +0,0 @@ -.app { - display: flex; - flex-flow: column; - width: 100%; - height: 100%; - padding: 0; - margin: 0; - overflow: hidden; -} - -.app--header { - display: flex; - flex-flow: row; - justify-content: space-between; - align-items: center; - height: 40px; - width: 100%; - background-color: $Brand_Blue_200; - color: $Calcite_Gray_050; -} - -.app--header-title { - font-size: 20px; - font-weight: 500; - margin-left: 0.5rem; -} - -.app--header-search { - .esri-widget--button { - width: 40px; - } - .esri-widget--button, - .esri-input { - height: 40px; - background: lighten($Brand_Blue_200, 10%); - color: $Calcite_Gray_050; - } - .esri-search__input { - height: 40px; - &::-webkit-input-placeholder, - &::placeholder { - color: rgba($Calcite_Gray_050, 0.4); - } - } - .esri-search__submit-button, - .esri-search__sources-button { - border: none; - } - .esri-menu { - margin-top: 0; - } - .esri-menu__list-item--active, - .esri-menu__list-item--active:focus, - .esri-menu__list-item--active:hover { - border-left-color: lighten($Brand_Blue_200, 25%); - } -} -@media screen and (min-width: 880px) { - .app--header-search.esri-search { - width: 340px; - } -} -@media screen and (min-width: 1280px) { - .app--header-search.esri-search { - width: 640px; - } -} - -.app--view { - width: 100%; - height: calc(100% - 40px); -} \ No newline at end of file diff --git a/templates/webpack/app/src/__mocks__/@arcgis/core/core/Accessor.ts b/templates/webpack/app/src/__mocks__/@arcgis/core/core/Accessor.ts index 8935057..0ac5074 100644 --- a/templates/webpack/app/src/__mocks__/@arcgis/core/core/Accessor.ts +++ b/templates/webpack/app/src/__mocks__/@arcgis/core/core/Accessor.ts @@ -1 +1 @@ -export default class Accessor {} \ No newline at end of file +export default class Accessor {} diff --git a/templates/webpack/app/src/__mocks__/@arcgis/core/core/accessorSupport/decorators.ts b/templates/webpack/app/src/__mocks__/@arcgis/core/core/accessorSupport/decorators.ts index 94b1fa5..ab5096e 100644 --- a/templates/webpack/app/src/__mocks__/@arcgis/core/core/accessorSupport/decorators.ts +++ b/templates/webpack/app/src/__mocks__/@arcgis/core/core/accessorSupport/decorators.ts @@ -1,2 +1,2 @@ export const property = () => {}; -export const subclass = () => {}; \ No newline at end of file +export const subclass = () => {}; diff --git a/templates/webpack/app/src/__mocks__/@arcgis/core/core/watchUtils.ts b/templates/webpack/app/src/__mocks__/@arcgis/core/core/watchUtils.ts index 29dd1d7..227ff43 100644 --- a/templates/webpack/app/src/__mocks__/@arcgis/core/core/watchUtils.ts +++ b/templates/webpack/app/src/__mocks__/@arcgis/core/core/watchUtils.ts @@ -1,3 +1 @@ -export function whenOnce () { - -} +export function whenOnce() {} diff --git a/templates/webpack/app/src/index.ejs b/templates/webpack/app/src/index.ejs index 20f5dee..9dacc13 100644 --- a/templates/webpack/app/src/index.ejs +++ b/templates/webpack/app/src/index.ejs @@ -24,5 +24,12 @@ +
+
+
<%= htmlWebpackPlugin.options.title %>
+ +
+
+
diff --git a/templates/webpack/app/src/index.scss b/templates/webpack/app/src/index.scss index c7723e2..ba0e598 100644 --- a/templates/webpack/app/src/index.scss +++ b/templates/webpack/app/src/index.scss @@ -129,4 +129,45 @@ body { font-size: 14px; } -@import "./App/styles/App.scss"; +.app { + display: flex; + flex-flow: column; + width: 100%; + height: 100%; + padding: 0; + margin: 0; + overflow: hidden; +} + +.app--header { + display: flex; + flex-flow: row; + justify-content: space-between; + align-items: center; + height: 40px; + width: 100%; + background-color: $Brand_Blue_200; + color: $Calcite_Gray_050; +} + +.app--header-title { + font-size: 20px; + font-weight: 500; + margin-left: 0.5rem; +} + +@media screen and (min-width: 880px) { + .app--header-search.esri-search { + width: 340px; + } +} +@media screen and (min-width: 1280px) { + .app--header-search.esri-search { + width: 640px; + } +} + +.app--view { + width: 100%; + height: calc(100% - 40px); +} diff --git a/templates/webpack/app/src/index.ts b/templates/webpack/app/src/index.ts index 3e0da58..83ce8f9 100755 --- a/templates/webpack/app/src/index.ts +++ b/templates/webpack/app/src/index.ts @@ -1,12 +1,11 @@ +import config from '@arcgis/core/config'; import Map from '@arcgis/core/Map'; import MapView from '@arcgis/core/views/MapView'; -import TileLayer from '@arcgis/core/layers/TileLayer'; -import VectorTileLayer from '@arcgis/core/layers/VectorTileLayer'; import FeatureLayer from '@arcgis/core/layers/FeatureLayer'; -import SearchViewModel from '@arcgis/core/widgets/Search/SearchViewModel'; -import App from 'app/App'; import { initWidgets } from './widgets'; +config.apiKey = process.env.API_KEY as string; + const featureLayer = new FeatureLayer({ portalItem: { id: 'b234a118ab6b4c91908a1cf677941702', @@ -21,45 +20,11 @@ featureLayer.when(() => { }); const view = new MapView({ + container: 'viewDiv', map: new Map({ - basemap: { - baseLayers: [ - new TileLayer({ - portalItem: { - // world hillshade - id: '1b243539f4514b6ba35e7d995890db1d', - }, - }), - new VectorTileLayer({ - portalItem: { - // topographic - id: '7dc6cea0b1764a1f9af2e679f642f0f5', - }, - }), - ], - }, + basemap: 'arcgis-topographic', layers: [featureLayer], }), }); -const app = new App({ - view, - title: 'ArcGIS Webpack Template', - searchViewModel: new SearchViewModel({ - includeDefaultSources: false, - sources: [ - { - layer: featureLayer, - outFields: ['NAME', 'STATE_NAME', 'VACANT', 'HSE_UNITS'], - searchFields: ['NAME'], - suggestionTemplate: '{NAME} County, {STATE_NAME}', - placeholder: 'Search by County Name', - }, - ], - }), - container: document.createElement('div'), -}); - -view.when(initWidgets); - -document.body.append(app.container); +view.when(() => initWidgets({ view, layer: featureLayer })); diff --git a/templates/webpack/app/src/interfaces.d.ts b/templates/webpack/app/src/interfaces.d.ts deleted file mode 100644 index 80a019f..0000000 --- a/templates/webpack/app/src/interfaces.d.ts +++ /dev/null @@ -1,54 +0,0 @@ -import esri = __esri; - -declare namespace __app { - export interface AppViewModelProperties extends Object { - /** - * Esri map or scene view. - */ - view?: esri.MapView | esri.SceneView; - } - - export class AppViewModel extends esri.Accessor { - view: esri.MapView | esri.SceneView; - } - - export interface AppProperties extends esri.WidgetProperties { - /** - * App view model. - */ - viewModel?: AppViewModel; - - /** - * Esri map or scene view. - */ - view: esri.MapView | esri.SceneView; - - /** - * Title to display in header. - */ - title?: string; - - /** - * Esri search view model for search widget. - */ - searchViewModel?: esri.SearchViewModel; - } - - export class App extends esri.Widget { - constructor(properties: AppProperties); - viewModel: AppViewModel; - view: esri.MapView | esri.SceneView; - title: string; - searchViewModel: esri.SearchViewModel; - } -} - -declare module 'app/App' { - import App = __app.App; - export = App; -} - -declare module 'app/App/AppViewModel' { - import AppViewModel = __app.AppViewModel; - export = AppViewModel; -} diff --git a/templates/webpack/app/src/widgets.spec.ts b/templates/webpack/app/src/widgets.spec.ts index 2258ff8..8ddd411 100644 --- a/templates/webpack/app/src/widgets.spec.ts +++ b/templates/webpack/app/src/widgets.spec.ts @@ -8,22 +8,25 @@ let spy: jest.SpyInstance; describe('widgets', () => { beforeEach(() => { spy = jest.spyOn(document, 'getElementById'); - const mockElem: any = { + const mockElem: unknown = { offsetWidth: 300, }; spy.mockReturnValue(mockElem); }); it('initializes widgets in view', () => { - const widgets: any[] = []; + const widgets: unknown[] = []; const view: any = { ui: { - add(w: any) { + add(w: unknown) { widgets.push(w); }, }, }; - initWidgets(view); + + const layer: any= {} + + initWidgets({ view, layer }); expect(widgets).toHaveLength(2); }); }); diff --git a/templates/webpack/app/src/widgets.ts b/templates/webpack/app/src/widgets.ts index 3f2a782..b639c8a 100644 --- a/templates/webpack/app/src/widgets.ts +++ b/templates/webpack/app/src/widgets.ts @@ -1,12 +1,32 @@ // Widgets -import esri = __esri; +import FeatureLayer from '@arcgis/core/layers/FeatureLayer'; +import MapView from '@arcgis/core/views/MapView'; import LayerList from '@arcgis/core/widgets/LayerList'; import Legend from '@arcgis/core/widgets/Legend'; +import Search from '@arcgis/core/widgets/Search'; +import LayerSearchSource from '@arcgis/core/widgets/Search/LayerSearchSource'; -export function initWidgets(view: esri.MapView): esri.MapView { +interface Params { + view: MapView; + layer: FeatureLayer; +} + +export function initWidgets({ view, layer }: Params): MapView { const legend = new Legend({ view }); const layerList = new LayerList({ view }); view.ui.add(legend, 'bottom-left'); view.ui.add(layerList, 'top-right'); + new Search({ + container: 'searchDiv', + sources: [ + new LayerSearchSource({ + layer, + outFields: ['NAME', 'STATE_NAME', 'VACANT', 'HSE_UNITS'], + searchFields: ['NAME'], + suggestionTemplate: '{NAME} County, {STATE_NAME}', + placeholder: 'Search by County Name', + }), + ], + }); return view; } diff --git a/templates/webpack/app/tsconfig.json b/templates/webpack/app/tsconfig.json index ba2f8df..e587356 100644 --- a/templates/webpack/app/tsconfig.json +++ b/templates/webpack/app/tsconfig.json @@ -1,25 +1,16 @@ { "compilerOptions": { "target": "esnext", - "module": "commonjs", - "declaration": true, + "module": "esnext", + "moduleResolution": "node", "strict": true, - "allowSyntheticDefaultImports": true, "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "importHelpers": true, - "paths": { - "tslib" : ["./node_modules/tslib/tslib.d.ts"] - }, - "experimentalDecorators": true, - "jsx": "react", - "jsxFactory": "tsx" + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noEmit": true }, "include": [ "src/**/*", - ], - "files": [ - "src/interfaces.d.ts" ] } diff --git a/templates/webpack/app/webpack.config.js b/templates/webpack/app/webpack.config.js index 2bee0f5..994c4d0 100644 --- a/templates/webpack/app/webpack.config.js +++ b/templates/webpack/app/webpack.config.js @@ -1,13 +1,12 @@ -const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); -const TerserPlugin = require('terser-webpack-plugin'); -const { CleanWebpackPlugin } = require('clean-webpack-plugin'); -const HtmlWebPackPlugin = require('html-webpack-plugin'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const HTMLInlineCSSWebpackPlugin = require('html-inline-css-webpack-plugin').default; -const ArcGISPlugin = require('@arcgis/webpack-plugin'); -const CopyPlugin = require('copy-webpack-plugin'); -const { GenerateSW } = require('workbox-webpack-plugin'); -const path = require('path'); +import ArcGISPlugin from '@arcgis/webpack-plugin'; +import CssMinimizerPlugin from 'css-minimizer-webpack-plugin'; +import Dotenv from 'dotenv-webpack'; +import TerserPlugin from 'terser-webpack-plugin'; +import HtmlWebPackPlugin from 'html-webpack-plugin'; +import MiniCssExtractPlugin from 'mini-css-extract-plugin'; +import HTMLInlineCSSWebpackPlugin from 'html-inline-css-webpack-plugin'; +import CopyPlugin from 'copy-webpack-plugin'; +import { GenerateSW } from 'workbox-webpack-plugin'; /** * Application options. @@ -52,10 +51,8 @@ const outputPublicPath = ''; // Dev server options. // https://webpack.js.org/configuration/dev-server/ const devServer = { - contentBase: path.join(__dirname, 'dist'), - // historyApiFallback: true, // single page/routing apps compress: true, - https: true, + https: false, port: 8080, open: true, }; @@ -65,13 +62,6 @@ const devServer = { const developmentDevtool = 'eval'; const productionDevtool = false; -// Add any aliases to config.resolve. -// Useful for aliasing packages or paths in source. -// https://webpack.js.org/configuration/resolve/#resolvealias -const resolveAlias = { - app: path.resolve(__dirname, 'src'), -}; - // Workbox service workers. // Important! Read up on and understand Workbox before use: https://developers.google.com/web/tools/workbox // There are potential browser cache pitfalls and other repercussions for deploying an app with Workbox. @@ -84,7 +74,7 @@ const workboxExcludes = []; * * Editing only required to add additional plugins or effect how Webpack operates. */ -module.exports = (_, args) => { +export default (_, args) => { const mode = args.mode; const config = { @@ -93,15 +83,16 @@ module.exports = (_, args) => { // Entry points. entry: { - index: ['./src/index.scss', '@babel/polyfill', './src/index.ts'], + index: ['./src/index.scss', './src/index.ts'], }, // Output parameters. output: { - path: path.join(__dirname, 'dist'), + // path: path.join(__dirname, 'dist'), filename: '[name].[chunkhash].js', chunkFilename: 'chunks/[id].js', publicPath: outputPublicPath, + clean: true }, // Development server parameters (provided in Webpack options above). @@ -132,11 +123,6 @@ module.exports = (_, args) => { // Module handling and loaders. module: { rules: [ - { - test: /\.(ts|js)x?$/, - exclude: /node_modules/, - loader: 'babel-loader', - }, { test: /\.tsx?$/, use: [ @@ -175,12 +161,12 @@ module.exports = (_, args) => { debug: mode === 'development', join: (_rul_uri, _rul_base) => { // args must be included - return (assetPath, absolutePath) => { + return (arg) => { // ArcGISPlugin copies assets and cannot be resolved when using api sass // replace relative path with absolute path in `dist` so files can be found for resolving - return absolutePath.includes('@arcgis/core') - ? assetPath.replace('../', './assets/esri/themes/') - : assetPath; + return arg.bases.value.includes("@arcgis/core") + ? arg.uri.replace("../", "./assets/esri/themes/") + : arg.uri; }; }, }, @@ -198,16 +184,16 @@ module.exports = (_, args) => { // Configure how modules are resolved. resolve: { - modules: [path.resolve(__dirname, 'src'), path.resolve(__dirname, 'node_modules')], - alias: resolveAlias || {}, extensions: ['.ts', '.tsx', '.js', '.scss', '.css'], }, // Webpack plugins. plugins: [ - new CleanWebpackPlugin(), + new Dotenv({ + path: './.env.local' + }), - new ArcGISPlugin({ locales: ['en'] }), + new ArcGISPlugin(), new HtmlWebPackPlugin({ template: './src/index.ejs', @@ -229,7 +215,7 @@ module.exports = (_, args) => { chunkFilename: '[id].css', }), - new HTMLInlineCSSWebpackPlugin({ + new HTMLInlineCSSWebpackPlugin.default({ filter: (fileName) => { return fileName.includes('index'); },