diff --git a/.github/workflows/beta-deploy.yml b/.github/workflows/beta-deploy.yml index 90405c938..89d8356c9 100644 --- a/.github/workflows/beta-deploy.yml +++ b/.github/workflows/beta-deploy.yml @@ -45,6 +45,6 @@ jobs: chmod 600 ~/.ssh/deploy_key rsync -avz --delete \ -e "ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no -p ${{ secrets.BETA_PORT }}" \ - ./dist/ \ + ./dist/browser/ \ ${{ secrets.BETA_UID }}@${{ secrets.BETA_HOST }}:/home/${{ secrets.BETA_UID }}/d2checklist-beta/ rm -f ~/.ssh/deploy_key diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 6713db5b7..82dacd41d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -46,6 +46,6 @@ jobs: chmod 600 ~/.ssh/deploy_key rsync -avz --delete \ -e "ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no -p ${{ secrets.PORT }}" \ - ./dist/ \ + ./dist/browser/ \ ${{ secrets.UID }}@${{ secrets.HOST }}:/home/${{ secrets.UID }}/d2checklist/ rm -f ~/.ssh/deploy_key diff --git a/angular.json b/angular.json index c600e87bd..590689582 100644 --- a/angular.json +++ b/angular.json @@ -9,14 +9,15 @@ "projectType": "application", "architect": { "build": { - "builder": "@angular-devkit/build-angular:browser", + "builder": "@angular-devkit/build-angular:application", "options": { - "aot": true, "outputPath": "dist", "index": "src/index.html", - "main": "src/main.ts", + "browser": "src/main.ts", "tsConfig": "src/tsconfig.app.json", - "polyfills": "src/polyfills.ts", + "polyfills": [ + "zone.js" + ], "stylePreprocessorOptions": { "includePaths": [ "src", @@ -62,31 +63,19 @@ "optimization": true, "outputHashing": "all", "sourceMap": false, - "namedChunks": false, - "aot": true, "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.prod.ts" } ], - "serviceWorker": true, - "ngswConfigPath": "ngsw-config.json" + "serviceWorker": "ngsw-config.json" }, "development": { - "buildOptimizer": false, - "optimization": { - "scripts": false, - "styles": false, - "fonts": false - }, - "vendorChunk": true, + "optimization": false, "extractLicenses": false, - "sourceMap": true, - "namedChunks": true + "sourceMap": true } }, "defaultConfiguration": "development" @@ -117,7 +106,9 @@ "options": { "main": "src/test.ts", "karmaConfig": "./karma.conf.js", - "polyfills": "src/polyfills.ts", + "polyfills": [ + "zone.js" + ], "tsConfig": "src/tsconfig.spec.json", "scripts": [], "styles": [ diff --git a/docs/modernization-plan.md b/docs/modernization-plan.md index a90df8fd8..7df1e3d7a 100644 --- a/docs/modernization-plan.md +++ b/docs/modernization-plan.md @@ -143,7 +143,13 @@ Angular migrations must go one major version at a time: - Removed `unsubscribe$` from 7 root services (singletons never destroy) - Deleted unused `StreamingChildComponent` - [ ] Adopt Angular signals where beneficial -- [ ] Evaluate esbuild-based builder (`@angular-devkit/build-angular:application`) +- [x] Evaluate esbuild-based builder (`@angular-devkit/build-angular:application`) + - Switched from webpack `browser` builder to esbuild `application` builder + - Replaced `require()` with ESM `import` for package.json in environment files + - Removed polyfills.ts (zone.js now specified in angular.json polyfills array) + - Removed webpack-only options: `vendorChunk`, `buildOptimizer`, `namedChunks`, `aot` + - Updated deploy workflows for new `dist/browser/` output path + - Updated tsconfig: `module: "ES2022"`, `moduleResolution: "bundler"`, `resolveJsonModule: true` **Done (7a+7b).** Running on Angular 18.2.14. Post-migration modernization (7c) is optional follow-up work. diff --git a/package-lock.json b/package-lock.json index c1ceb9e2f..2883c7296 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "d2-checklist", - "version": "29.2.0", + "version": "29.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "d2-checklist", - "version": "29.2.0", + "version": "29.3.0", "license": "MIT", "dependencies": { "@angular/animations": "^18.2.14", @@ -57,6 +57,7 @@ "bungie-api-ts": "4.21.0", "eslint": "^8.57.0", "jasmine-core": "~4.5.0", + "jsonc-parser": "^3.3.1", "jszip": "3.10.1", "karma": "~6.4.0", "karma-chrome-launcher": "~3.1.0", @@ -347,13 +348,6 @@ "node": ">=10" } }, - "node_modules/@angular-devkit/build-angular/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@angular-devkit/build-angular/node_modules/open": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", @@ -486,13 +480,6 @@ } } }, - "node_modules/@angular-devkit/core/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@angular-devkit/core/node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", @@ -535,13 +522,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/schematics/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -890,13 +870,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@angular/common": { "version": "18.2.14", "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.14.tgz", @@ -5183,13 +5156,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@schematics/angular/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@sigstore/bundle": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", @@ -9920,6 +9886,13 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", diff --git a/package.json b/package.json index 6b7ad9c6f..40228d22c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "d2-checklist", - "version": "29.2.0", + "version": "29.3.0", "manifest": "242999.26.03.25.2000-1-bnet.64463", "license": "MIT", "scripts": { @@ -71,13 +71,14 @@ "bungie-api-ts": "4.21.0", "eslint": "^8.57.0", "jasmine-core": "~4.5.0", + "jsonc-parser": "^3.3.1", + "jszip": "3.10.1", "karma": "~6.4.0", "karma-chrome-launcher": "~3.1.0", "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.0.0", "karma-spec-reporter": "^0.0.36", - "jszip": "3.10.1", "sql.js": "^1.14.1", "ts-node": "10.9.1", "typescript": "5.4.5" diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 2c4b5537c..108aa9100 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,7 +1,5 @@ import { bungieProd } from './keys-prod'; - -// eslint-disable-next-line @typescript-eslint/no-var-requires -const packageJson = require('../../package.json'); +import packageJson from '../../package.json'; export const environment = { bungie: bungieProd, production: true, @@ -10,7 +8,6 @@ export const environment = { manifest: packageJson.manifest, angular: packageJson.dependencies['@angular/core'], material: packageJson.dependencies['@angular/material'], - bootstrap: packageJson.dependencies.bootstrap, rxjs: packageJson.dependencies.rxjs, angularCli: packageJson.devDependencies['@angular/cli'] } diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 1998606e7..06dfdbe34 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -1,7 +1,5 @@ import { bungieDev } from './keys'; - -// eslint-disable-next-line @typescript-eslint/no-var-requires -const packageJson = require('../../package.json'); +import packageJson from '../../package.json'; export const environment = { bungie: bungieDev, @@ -11,7 +9,6 @@ export const environment = { manifest: packageJson.manifest, angular: packageJson.dependencies['@angular/core'], material: packageJson.dependencies['@angular/material'], - bootstrap: packageJson.dependencies.bootstrap, rxjs: packageJson.dependencies.rxjs, angularCli: packageJson.devDependencies['@angular/cli'] } diff --git a/src/polyfills.ts b/src/polyfills.ts deleted file mode 100644 index 813c82481..000000000 --- a/src/polyfills.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags.ts'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import 'zone.js'; // Included with Angular CLI. - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json index b84408f60..612a3b4e1 100644 --- a/src/tsconfig.app.json +++ b/src/tsconfig.app.json @@ -8,8 +8,7 @@ ] }, "files": [ - "main.ts", - "polyfills.ts" + "main.ts" ], "include": [ "**/*.d.ts" diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json index 9c56a51c4..d45116595 100644 --- a/src/tsconfig.spec.json +++ b/src/tsconfig.spec.json @@ -9,8 +9,7 @@ ] }, "files": [ - "test.ts", - "polyfills.ts" + "test.ts" ], "include": [ "**/*.spec.ts", diff --git a/tsconfig.json b/tsconfig.json index 61b7972fd..d87b0b68b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,12 +18,13 @@ "declaration": false, "downlevelIteration": true, "experimentalDecorators": true, - "moduleResolution": "node", + "moduleResolution": "bundler", "importHelpers": true, "target": "ES2022", - "module": "es2020", + "module": "ES2022", + "resolveJsonModule": true, "lib": [ - "es2020", + "ES2022", "dom" ], "paths": {