Cannot set breakpoints in Angular 2 application in Visual Studio Code - google-chrome

I am using the Chrome Debugger extension for Visual Studio Code with an Angular 2 application where the initial setup was done with the Angular CLI. I have looked at several Stack Overflow questions and tried several things but nothing seems to work. I keep getting the message: Breakpoint ignored because generated code not found
Here is what I have for the tsconfig.json as generated by the Angular CLI
{
"compilerOptions": {
"baseUrl": "",
"declaration": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": ["es6", "dom"],
"mapRoot": "./",
"module": "es6",
"moduleResolution": "node",
"outDir": "../dist/out-tsc",
"sourceMap": true,
"target": "es5",
"typeRoots": [
"../node_modules/#types"
]
}
}
Here is what I have for the launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Chrome against localhost, with sourcemaps",
"type": "chrome",
"request": "launch",
"url": "http://localhost:4200",
"sourceMaps": true,
"trace": true,
"webRoot": "${workspaceRoot}/src",
"userDataDir": "${workspaceRoot}/.vscode/chrome",
"sourceMapPathOverrides": {
"webpack:///C:*":"C:/*"
}
}
]
}
I have looked at these resources and they did not resolve the issue:
Debug & Run Angular2 Typescript with Visual Studio Code?
http://mattslay.com/debugging-angular2-apps-in-visual-studio-code/

Related

Syntax Error: error while parsing tsconfig.json - trying to build Vue app on Linux VPS

I am getting this error when trying to build my Vue app on my Linux VPS.
Syntax Error: Error: error while parsing tsconfig.json
The only thing I can see is a small red squiggle underneath the very first { of my tsconfig.json file.
However, when I run the build locally it completes without any errors even with the red squiggle in the tsconfig.
Incidentally, when I hover on the red squiggle it says:
No inputs were found in config file
Any suggestions I have found for this have related to adding at least one Typescript file at the same level as the tsconfig. I already have a main.ts so this does not solve the problem.
Here is the file itself.
{ // red squiggle line appears here
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"strict": false,
"jsx": "preserve",
"importHelpers": true,
"moduleResolution": "node",
"experimentalDecorators": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"sourceMap": true,
"baseUrl": ".",
"types": [
"webpack-env",
"mocha",
"chai",
"vuetify"
],
"paths": {
"#/*": [
"./*"
]
},
"lib": [
"esnext",
"dom",
"dom.iterable",
"scripthost"
]
},
"include": [
"src/**/*.ts",
"src/**/*.tsx",
"src/**/*.vue",
"tests/**/*.ts",
"tests/**/*.tsx"
],
"exclude": [
"node_modules"
]
}
The error itself doesn't help find what's causing the issue. The only other console output is the following eslint related suggestion.
You may use special comments to disable some warnings.
Use // eslint-disable-next-line to ignore the next line.
Use /* eslint-disable */ to ignore all warnings in a file.
I have tried adding both of these to the top of the tsconfig.json, but neither of them work and I get the exact same build error.
Any help is much appreciated.

Is there any way for typescript test files to import typescript source files when they have separate tsconfigs?

Sorry about the vague title here, it's one of those problems where I don't know what I don't know. Let me describe my directory structure:
root
src
tsconfig.json
test
tsconfig.json
tsconfig.json
This is some legacy code. Normally I like to set up my project so that test files and source files are in the same directories, but that would be a massive change, so I'm trying to figure out how to get it to work the way it's already structured.
Basically, I want to be able to do this in a test file:
// current file: test/downloader_test.ts
// downloader file: src/downloader.ts
import { Downloader } from "./downloader";
...
I can do this when source and test files are in the same directory, but in this case, they are in separate directories so I get an error on the import line about how "./downloader" doesn't exist.
There is a workaround that's already being used: instead, I could import from ../lib/downloader, and it works, but I'd like to be able to refer to the typescript files. Is there any way for test files to import typescript source files when they are under separate tsconfig.json files?
I figure if a solution exists it's probably a tsconfig setting. These are what mine currently look like:
root/tsconfig.json:
{
"compilerOptions": {
"rootDir": ".",
},
"files": [],
"references": [
{
"path": "./src"
},
{
"path": "./test"
},
]
}
root/src/tsconfig.json:
{
"compilerOptions": {
"module": "commonjs",
"outDir": "../lib",
"noImplicitReturns": true,
"noUnusedLocals": true,
"sourceMap": true,
"strict": true,
"lib": ["es2020", "dom"],
"target": "es2019",
"composite": true,
"allowSyntheticDefaultImports": true
},
"compileOnSave": true,
"types": ["node"],
"include": ["**/*.ts"]
}
root/test/tsconfig.json:
{
"compilerOptions": {
"module": "commonjs",
"outDir": "../libtest",
"strict": false,
"composite": true,
"sourceMap": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true
},
"include": [
"**/*.ts"
]
}
I've also tried modifying that last file to add a
"references": [
{
"path": "../src"
}
]
but that didn't change anything for me.
You can use one config file in root folder only, and in include, you can add
"include": [
"src/**/*" // According to your structure
]
other things in config file set according to your requirement and change the path.
import { Downloader } from "../src/downloader”;

lit-element.js not found after polymer build

I am currently encountering a problem which is probably simple, but I don't manage to nail it.
I have a polymer application using the latest version of lit-element (2.0.1).
Unfortunately after running the npm run build:static (behind it is polymer build) and serve it using: npm run serve:static (behind it is executing: polymer serve --port 5000 build/es5-bundled).
The lit-element.js is not available.
If I list the files in the project node_module I have:
pxke#station:ls -1 node_modules/lit-element/
CHANGELOG.md
lib
LICENSE
lit-element.d.ts
lit-element.d.ts.map
lit-element.js
lit-element.js.map
package.json
README.md
src
The lit-element.js seems to be there, after the build if I look in the node_module of the build it is not copied.
g#station: ls -1 build/es5-bundled/node_modules/lit-element/
CHANGELOG.md
lib
LICENSE
lit-element.d.ts
lit-element.d.ts.map
lit-element.js.map
package.json
README.md
src
Do you know why this would happen?
Thank you in advance.
Have a great day!
Here are some extra information:
Dependency section of package.json
"dependencies": {
"#material/base": ">=0.3.6",
"#material/mwc-base": ">=0.3.6",
"#material/mwc-button": ">=0.4.0",
"#material/mwc-icon": ">=0.3.6",
"#material/mwc-ripple": ">=0.3.6",
"#material/ripple": ">=0.3.6",
"#polymer/app-layout": ">=3.0.0",
"#polymer/paper-button": ">=3.0.1",
"#polymer/polymer": ">=3.1.0",
"#webcomponents/webcomponentsjs": ">=2.2.4",
"browser-sync": "2.26.3",
"lit-element": ">=2.0.1",
"lit-html": ">=1.0.0",
"npm": "^6.9.0",
"pwa-helpers": "^0.9.0",
"redux": ">=4.0.0",
"redux-thunk": ">=2.3.0",
"reselect": "^4.0.0",
"sinon": "^4.5.0"
},
polymer.json
{
"entrypoint": "index.html",
"shell": "src/components/test-app.js",
"sources": [
"images/**/*"
],
"extraDependencies": [
"manifest.json",
"node_modules/#webcomponents/webcomponentsjs/**",
"node_modules/lit-element/**",
"node_modules/lit-html/**",
"node_modules/#material/mwc-button/**",
"node_modules/#material/mwc-base/**",
"node_modules/#material/base/**",
"node_modules/#material/mwc-ripple/**",
"node_modules/#material/ripple/**",
"node_modules/#material/mwc-icon/**",
"push-manifest.json"
],
"builds": [
{
"name": "esm-bundled",
"browserCapabilities": [
"es2015",
"modules"
],
"js": {
"minify": true
},
"css": {
"minify": true
},
"html": {
"minify": true
},
"bundle": true,
"addServiceWorker": true
},
{
"name": "es6-bundled",
"browserCapabilities": [
"es2015"
],
"js": {
"compile": "es2015",
"minify": true,
"transformModulesToAmd": true
},
"css": {
"minify": true
},
"html": {
"minify": true
},
"bundle": true,
"addServiceWorker": true
},
{
"name": "es5-bundled",
"js": {
"compile": "es5",
"minify": true,
"transformModulesToAmd": true
},
"css": {
"minify": true
},
"html": {
"minify": true
},
"bundle": true,
"addServiceWorker": true
}
],
"moduleResolution": "node",
"npm": true
}
Normally, when you import lit-element, Polymer build may bundle the lit-element codes into built codes. You may not see at the path. But if you want to force to add the path then you may define in polymer.json file under fragments. example:
polymer.json:
{
"entrypoint": "index.html",
"shell": "src/components/test-app.js",
"sources": [
"images/**/*"
],
"fragments": [
"node_modules/lit-element/**/*",
],
"sources": [
"images/**/*"
],
"extraDependencies": [
...

Resource file missing in TypeScript package

I have a Lerna project containing two Typescript packages A and B. The tsconfig.json for both packages is:
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"esModuleInterop": true,
"noImplicitAny": false,
"noUnusedLocals": true,
"noUnusedParameters": true,
"removeComments": false,
"preserveConstEnums": true,
"sourceMap": true,
"allowJs": false,
"resolveJsonModule": true,
"declaration": true,
"moduleResolution": "node",
"lib": ["es2015", "dom"]
},
"include": [
"src",
"test"
],
"exclude": [
"node_modules/**",
"packages/*/node_modules/**",
"examples/*/node_modules/**",
"**/*.d.ts"
]
}
Package A contains the following code:
const data = require('./myData.json');
Package B depends on package A. Inside package B a call is made to a function exported by package A, and so the above code is loaded. However, I get Error: Cannot find module './myData.json' in this context. Now, looking inside compiler output directory for package A I do not see the JSON file. Indeed, looking inside package B's node_modules directory at package A I do not see the file there either.
Why might the JSON file missing from the published package? Is there anything special that needs to be done to include resource files (JSON, plaintext) in the Typescript package?

Is there a way to extend configurations in angular.json?

While building my Angular 6 application, I need to specify 2 things at once:
If it's production or development build
The locale I'm using
In my angular.json I have:
"build": {
...
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
},
"pl": {
"fileReplacements": [
{
"replace": "src/assets/i18n/translations.json",
"with": "src/assets/i18n/pl.json"
}
]
},
"en": {
"fileReplacements": [
{
"replace": "src/assets/i18n/translations.json",
"with": "src/assets/i18n/en.json"
}
]
}
}
}
But when I'm doing ng build --configuration=en --configuration=production I'm getting an error Configuration 'en,production' could not be found. I understand it means you can specify only 1 configuration at a time.
This means I need to create separate en, pl, productionEn, productionPl configurations. Though not the cleanest pattern, I can live with that.
"build": {
...
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
},
"pl": {
"fileReplacements": [
{
"replace": "src/assets/i18n/translations.json",
"with": "src/assets/i18n/pl.json"
}
]
},
"en": {
"fileReplacements": [
{
"replace": "src/assets/i18n/translations.json",
"with": "src/assets/i18n/en.json"
}
]
},
"productionPl": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
},
{
"replace": "src/assets/i18n/translations.json",
"with": "src/assets/i18n/pl.json"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
},
"productionEn": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
},
{
"replace": "src/assets/i18n/translations.json",
"with": "src/assets/i18n/en.json"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
}
}
But what I can't live with is copying and pasting the whole production configuration contents into productionEn and productionPl. If I add even more locales, or some third separate aspect that I'd like to specify during build, this pattern would become a total nightmare to maintain. Unfortunately it seem it's the pattern that Angular team recommends in their documentation.
Is there a way to tell Angular CLI that productionEn extends production, so to not duplicate the same configuration code multiple times? Something like the code below:
"build": {
...
"configurations": {
"production": {
(...)
},
"pl": {
"extends": "production",
(...)
},
"en": {
"extends": "production",
(...)
}
}
}
There finally is a way to do it, specifying multiple configurations in the command line:
ng build --configuration=en,production
Relevant issue in Angular repo
Note that --prod flag is ignored when you use --configuration (so you need to add production to the configuration list explicitly).
Angular docs for --configuration=configuration:
A named build target, as specified in the "configurations" section of angular.json. Each named target is accompanied by a configuration of option defaults for that target. Setting this explicitly overrides the "--prod" flag
Aliases: -c
Update: see accepted answer for building with multiple configurations. The details below are now outdated
Reading through some issues and angular.json documentation, it appears that the options act as the defaults for the project
"architect": {
"build": {
"options": {...}
These are overridden with partial options set in the configurations. From the Angular CLI workspace wiki:
configurations (object): A map of alternative target options.
configurationName (object): Partial options override for this builder.
This issue comment also mentions using configurations as an override
This sounds like all of the defaults for the project can be added to the options object e.g. move any duplicates from production, productionPl to the options: {}, and then add the fileReplacements, and the few other overrides that you require
Note: I have not tested this yet, it's just a suggestion based on the docs and issues
But this doesn't work for ng serve you say?
Here's what probably happened:
First, here's my configuration for angular12/architect/build/configurations:
"development": {
"customWebpackConfig": {
"path": "custom-webpack.dev.config.js",
"replaceDuplicatePlugins": true
},
"buildOptimizer": false,
"optimization": false,
"vendorChunk": true,
"extractLicenses": false,
"sourceMap": false,
"namedChunks": true,
"aot": true
},
"quick": {
"fileReplacements": [
{
"replace": "src/app/app-routing.module.ts",
"with": "src/app/app-routing.module.quick.ts"
}
]
}
I have a standard development config, with an added configuration called quick which is what I want to set in addition to the options from development.
(So my quick is the same as OP's en and pl.)
Sorry this isn't a magic new 'quick Angular build' feature (!) - I simply made a copy of my app-routing file, commented out every lazy module except the one I'm currently working with and configured the fileReplacements option to override the standard file. The build is significant faster for a large project. Clearly though I didn't want to accidentally deploy this which is why I needed a separate configuration.
What happens when you run ng serve --configuration development,quick is it looks in the serve part of the configuration (below). As you can see I added quick here as a browser target, referencing what I have above.
"serve":
{
"builder": "#angular-builders/custom-webpack:dev-server",
"options": {
"browserTarget": "angular12:build"
},
"configurations":
{
"production": {
"browserTarget": "angular12:build:production"
},
"development": {
"browserTarget": "angular12:build:development"
},
"quick": {
"browserTarget": "angular12:build:quick"
}
},
"defaultConfiguration": "development"
},
What's actually happening when you ask for --configuration development,quick is it merges these two nodes:
"development": {
"browserTarget": "angular12:build:development"
}
"quick": {
"browserTarget": "angular12:build:quick"
}
Which results in:
"development": {
"browserTarget": "angular12:build:development"
}
Makes sense why it didn't work now :-)
Solution:
The solution is fortunately as simple as updating serve/quick to:
"quick": {
"browserTarget": "angular12:build:development,quick"
}
Then simply run:
ng-serve --configuration quick
This will in turn will merge your development and quick configurations under architect/build as if you were running ng build.
PS. You may see I'm using customWebpackConfig. That is the #angular-builders/custom-webpack package that allows for customization. It's irrelevant to my answer, but allowed me to prove to myself that it was indeed working as I was able to observe both my customWebpack plugins running and only the single lazy chunk I wanted was built.
are you ask about ?
"scripts": {
[...]
"build-i18n": "for lang in en es fr pt;
do ng build --config=$lang;
done"
}