Closed JonWallsten closed 5 years ago
This is actually not a new problem, see angular/angular-cli/issues/8332
Wish they would have taken it seriously back then, now we have the mess as TS 2.6 is supported.
Here is another reproduction using Angular CLI with linked dependencies and preliminary investigation of the problem:
I think it is a bug in
compiler-cli
. Error message says thatgetSourceFile()
should not return redirect file. And the implementation in TypeScriptCompilerHost
never does it, howeverCompilerHost
implemented in Angular compiler-cli cachesSourceFile
s from old program in internal cache and returns them from the method. And cached files can be redirect files, which hits the assertion when creating a new program.
Same problem here using Typescript 2.6.2, webpack 3.10, Angular 5.2.x with ngtools/webpack 1.10.2 (compiler-cli 5.2). Interestingly, the problem only seemed to start for me after converting my webpack config to typescript. Reverting it back to JavaScript resolves the problem.
@kspearrin It's because the issue, at least in my case, is duplicate typings for UglifyJS, which is included in webpack. If you have the config in JS it won't use typings hence no error. Good to know though, it's not super important for us to have the config in TS.
Yes I think it was something to do with the typings that were added for that conversion. See here for the commit that broke things: https://github.com/bitwarden/browser/commit/df4e7f030d13e456c1b02b09cccef3ec853f55e4
Changing the webpack configs to JS was not sufficient in my case. But as soon as I removed the [at]types/webpack and [at]types/webpack-merge packages from my project the bug disappeared. Finally a current TS version for my projects!
I was able to solve this issue by disabling AOT in ngtools/webpack 1.10.2 by setting the skipCodeGeneration option to true.
new AngularCompilerPlugin({
...options,
skipCodeGeneration: true
})
Hi @samelliottdlt (et all), I'm confused by your ngtools/webpack version, you said:
ngtools/webpack 1.10.2
I have:
...
"devDependencies": {
"@ngtools/webpack": "^6.0.0-rc.3",
...
Am I on the wrong version??? Just wondering...
Either way, I keep getting the same error (and none of the above workarounds/fixes have helped):
ERROR in Debug Failure. False expression: Host should not return a redirect source file from `getSourceFile`
{
...
"scripts": {
"start": "rimraf dist && webpack-dev-server --progress --info --config config/webpack.localhost.ts --hot --watch=false --hot-only --bail --profile --open",
...
},
"keywords": [],
"author": "",
"license": "MIT",
"dependencies": {
"@angular/animations": "^5.2.5",
"@angular/common": "^5.2.5",
"@angular/compiler": "^5.2.5",
"@angular/core": "^5.2.5",
"@angular/forms": "^5.2.5",
"@angular/http": "^5.2.5",
"@angular/platform-browser": "^5.2.5",
"@angular/platform-browser-dynamic": "^5.2.5",
"@angular/router": "^5.2.5",
"@ng-bootstrap/ng-bootstrap": "1.1.1",
"@types/angular": "^1.6.43",
"@types/lodash": "4.14.106",
"@types/socket.io-client": "1.4.32",
"angular-confirmation-popover": "4.1.0",
"angular2-json2csv": "1.1.2",
"angular2-moment": "1.8.0",
"angular2-template-loader": "0.6.2",
"angular2-toaster": "5.0.1",
"angular2-uuid": "1.1.1",
"animate.css": "3.6.1",
"bootstrap": "4.0.0",
"core-js": "^2.5.3",
"font-awesome": "4.7.0",
"glyphicons-halflings": "1.9.1",
"hammerjs": "2.0.8",
"http-server": "0.11.1",
"lodash": "4.17.5",
"moment": "2.22.0",
"ng2-file-upload": "1.3.0",
"ng2-img-cropper": "0.9.0",
"ng2-scroll-to": "1.0.7",
"ng2-slim-loading-bar": "4.0.0",
"node-sass": "4.8.3",
"raven-js": "3.24.1",
"reflect-metadata": "0.1.12",
"rxjs": "^5.5.9",
"socket.io-client": "2.1.0",
"typescript": "2.8.1",
"typings": "2.1.1",
"zone.js": "^0.8.20"
},
"devDependencies": {
"@angular/compiler-cli": "^5.2.5",
"@ngtools/webpack": "^6.0.0-rc.3",
"@types/angular": "^1.6.42",
"@types/chai": "4.1.2",
"@types/core-js": "^0.9.46",
"@types/hammerjs": "2.0.35",
"@types/node": "^9.4.6",
"@types/rx": "^4.1.1",
"@types/socket.io-client": "1.4.32",
"@types/webpack": "^4.1.3",
"angular2-template-loader": "0.6.2",
"awesome-typescript-loader": "5.0.0",
"copy-webpack-plugin": "^4.5.1",
"css-loader": "^0.28.11",
"extract-text-webpack-plugin": "4.0.0-beta.0",
"file-loader": "^1.1.11",
"html-loader": "0.5.5",
"html-webpack-plugin": "3.0.7",
"jasmine-core": "3.1.0",
"jasmine-spec-reporter": "4.2.1",
"karma": "2.0.0",
"karma-chrome-launcher": "2.2.0",
"karma-jasmine": "1.1.1",
"karma-phantomjs-launcher": "1.0.4",
"karma-sourcemap-loader": "0.3.7",
"karma-verbose-reporter": "0.0.6",
"karma-webpack": "3.0.0",
"live-server": "^1.2.0",
"lodash": "4.17.5",
"moment": "2.22.0",
"ngc-webpack": "^4.1.2",
"node-sass": "^4.8.3",
"null-loader": "0.1.1",
"phantomjs-prebuilt": "2.1.16",
"protractor": "5.3.1",
"raw-loader": "^0.5.1",
"request": "2.85.0",
"rimraf": "^2.6.2",
"sass-loader": "^6.0.7",
"style-loader": "^0.20.3",
"supertest": "3.0.0",
"to-string-loader": "^1.1.5",
"ts-loader": "^4.0.0-beta.0",
"ts-node": "^5.0.1",
"tslint": "^5.9.1",
"tslint-loader": "^3.6.0",
"typescript": "^2.8.1",
"typings": "2.1.1",
"url-loader": "1.0.1",
"webpack": "^4.6.0",
"webpack-bundle-analyzer": "^2.11.1",
"webpack-cli": "^2.0.14",
"webpack-dev-server": "3.1.3",
"webpack-merge": "^4.1.2",
"write-file-webpack-plugin": "4.2.0"
},
"repository": {}
}
// --- --- --- --- --- --- --- --- --- ---
// USED by ALL 3 environment webpack configs
// --- --- --- --- --- --- --- --- --- ---
const webpack = require('webpack');
const ngcWebpack = require('ngc-webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const pathPublicFolder = 'assets';
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const path = require('path');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const REGEX_IMAGE_TEST = /\.(png|jpe?g|gif|ico)$/;
const REGEX_FONT_TEST = /\.(woff|woff2|ttf|eot|svg)(\?.*$|$)/;
console.log('\u2592\u2592 (webpack.COMMON.js) ... ');
export const commonConfig = {
entry: {
app: './src/main.ts',
polyfills: './src/polyfills.ts',
vendor: './src/vendor.ts',
},
target: 'web',
optimization: {
splitChunks: {
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendor',
chunks: 'initial',
enforce: true
}
}
}
},
resolve: {
extensions: ['.js', '.ts', '.html']
},
module: {
rules: [
{
test: /(?:\.ngfactory\.js|\.ngstyle\.js|\.ts)$/,
use: ['@ngtools/webpack']
},
{
test: /.js$/,
parser: {
system: true
}
},
// Typescript
{
test: /\.ts$/,
exclude: /node_modules/,
include: path.resolve(__dirname, 'src'),
use: '@ngtools/webpack'
},
// Templates
{
test: /\.html$/,
exclude: /index.html$/i,
use: [
{
loader: 'raw-loader'
}
]
},
{
test: REGEX_IMAGE_TEST,
use: [
{
loader: 'file-loader',
options: {
name: pathPublicFolder + '[name].[hash].[ext]'
}
}
]
},
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
},
{
test: /\.scss$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: [
{
loader: 'css-loader',
options: {
// If you are having trouble with urls not resolving add this setting.
// See https://github.com/webpack-contrib/css-loader#url
url: false,
minimize: true,
sourceMap: true
}
},
{
loader: 'sass-loader',
options: {
sourceMap: true
}
}
]
})
},
{
test: REGEX_FONT_TEST,
use: [
'file-loader'
]
}
// TURNED OFF LINTING FOR NOW
// {
// test: /\.ts$/,
// enforce: 'pre',
// loader: 'tslint-loader',
// options: { /* Loader options go here */ }
// }
]
},
plugins: [
new ExtractTextPlugin('[name].css'), // huh? why here?
// decomish this, since ACPlugin? (see localhost)
new ngcWebpack.NgcWebpackPlugin({
AOT: true,
tsConfigPath: './tsconfig.json',
mainPath: './src/main.ts'
}),
new CopyWebpackPlugin([
{
from: './src/assets/images',
to: './assets/images',
test: REGEX_IMAGE_TEST,
toType: 'dir'
},
{
// the font-awesome fonts
from: './src/assets/fonts/font-awesome',
to: './assets/fonts',
test: REGEX_FONT_TEST,
toType: 'dir'
},
{
// the google fonts (open sans) one dir higher, sorry... I blame sing and bootstrap and webpack 4 :)
from: './src/assets/fonts',
to: './assets/fonts',
test: REGEX_FONT_TEST,
toType: 'dir'
},
]),
new webpack.NamedModulesPlugin(),
new webpack.HotModuleReplacementPlugin(),
new HtmlWebpackPlugin({
template: 'src/index.html',
favicon: './src/assets/images/favicon.ico',
title: 'Alpha Omega TODO: change me'
}),
],
};
// --- --- --- --- --- --- --- --- --- ---
// USED for `npm start`
// serving from local webpack dev server, from root dir webpack.config.js
// --- --- --- --- --- --- --- --- --- ---
console.log('\u2592\u2592 (webpack.LOCALHOST.ts) WEBPACK NODE_ENV: ' + process.env.NODE_ENV);
import { commonConfig } from './webpack.common';
const webpack = require('webpack');
const webpackMerge = require('webpack-merge');
const WriteFilePlugin = require('write-file-webpack-plugin');
var moment = require('moment'); // NOTE: keep var, errors as const
const apiHost = "'http://localhost:4000'";
const socketioHost = "'http://localhost:4000'";
const sentryIOConfig = "'https://d9e0c116cbda4f028b8933a6715ceb65@sentry.io/330255'";
const friendlyDate = moment().format("dddd, MMMM Do YYYY, h:mm:ss a");
const path = require('path');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const AngularCompilerPlugin = require('@ngtools/webpack').AngularCompilerPlugin;
// This helper function is not strictly necessary.
// I just don't like repeating the path.join a dozen times.
function srcPath(subdir) {
return path.join(__dirname, '..', subdir);
}
// --- --- --- --- --- --- --- --- --- ---
module.exports = webpackMerge(commonConfig, {
mode: 'development',
devtool: process.env.NODE_ENV === 'production' ? false : 'source-map',
devServer: {
hot: true,
historyApiFallback: true,
stats: 'minimal',
port: 8080,
host: 'localhost',
https: false
},
output: {
path: path.resolve(__dirname, '../dist'),
publicPath: '',
filename: '[name].[hash].js',
/* will be polyfill, vendor, or app.js */
chunkFilename: '[id].[hash].chunk.js'
},
plugins: [
// localhost
new webpack.DefinePlugin({
'process.env': {
'ENV': JSON.stringify(process.env.NODE_ENV)
},
__API__: apiHost,
__APPVERSION__: JSON.stringify(friendlyDate),
__SOCKETIO__: socketioHost,
__SENTRYIOCONFIG__: sentryIOConfig
}),
new WriteFilePlugin(),
// new BundleAnalyzerPlugin(),
// NOTE: needed for ERROR:
// thx: https://github.com/angular/angular/issues/22524#issuecomment-382471279 (a record, fix used 4 hours after posted :)
// new AngularCompilerPlugin({
// // WORKS: (but diff. plugins):
// // tsConfigPath: './tsconfig.json',
// // mainPath: './src/main.ts'
// // DOESN'T WORK:
// tsConfigPath: srcPath('tsconfig.json'),
// entryModule: srcPath('/src/app/app.module.ts#AppModule'),
// sourceMap: true,
// skipCodeGeneration: true
// })
],
});
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": true,
"noImplicitAny": false,
"suppressImplicitAnyIndexErrors": true,
"lib": [
"dom",
"es2016",
"es2017"
],
"baseUrl": ".",
"typeRoots": [
"node_modules/@types"
],
"types": [
"hammerjs",
"socket.io-client",
"webpack"
],
"skipLibCheck": true
},
"exclude": [
"node_modules",
"dist-development",
"dist-production",
"dist",
"typings"
],
"angularCompilerOptions": {
"debug": true
}
}
Thanks so much!
@charlieargue you can try installing 1.10.2 rather than the rc version and set skipCodeGeneration to true. maybe that'll solve your issue. note that this is not a great solution but at least it allows us to keep development rolling until a fix is shipped :)
run this command to install the latest ngtools/webpack
npm i @ngtools/webpack@latest
Thx @samelliottdlt for the quick response! So I'm on:
"@ngtools/webpack": "^1.10.2",
And I had to switch from using:
// DECOMISHED THIS:
new ngcWebpack.NgcWebpackPlugin({
AOT: true, // NOTE: just changing this to FALSE breaks site and sits at Loading...
tsConfigPath: './tsconfig.json',
mainPath: './src/main.ts'
}),
new AngularCompilerPlugin({
tsConfigPath: helpers.root('tsconfig.json'),
entryModule: helpers.root('src/app/app.module#AppModule'),
mainPath: helpers.root('src/main'),
sourceMap: true,
skipCodeGeneration: true
})
This last approach compiles all my modules successfully:
ℹ 「wds」: Project is running at http://localhost:8080/
ℹ 「wds」: webpack output is served from /
ℹ 「wds」: 404s will fallback to /index.html
ℹ 「wdm」: 1272 modules
ℹ 「wdm」: Compiled successfully.
but the site never loads the angular application, and just sits on Loading.......
And adding, to tsconfig
, the following, doesn't help either:
"angularCompilerOptions": {
"debug": true,
"skipCodeGeneration": true
}
Nothing I'm trying has worked, so without some help/luck, I might have to go back to the NgcWebpackPlugin
approach, where atleast the site loads, and just do Neanderthal Web Development ™ where I kill WDS before making any changes in vscode :) lol :)
Thanks again, all assistance is much appreciated!
Hi, just checking in and wanted to see if I'd missed something, or if there was some more information I could provide to help! Thanks again!
In the same boat. Any update on a fix for this?
Should this issue be logged to Angular CLI or ngtools/webpack? They keep moving the compiler logic around. It's hard to keep track. Please fix this issue. It is the only one that's preventing us from using AOT in dev builds.
this still happen in cli v6 with aot: true in "serve" target.
Confirming that after upgrading to Angular 6, still have the same ERROR. Thanks again for any guidance on this!
ℹ 「wdm」: Compiling...
✖ 「wdm」: 1034 modules
ERROR in Debug Failure. False expression: Host should not return a redirect source file from `getSourceFile`
ℹ 「wdm」: Failed to compile.
...
"start": "rimraf dist && webpack-dev-server --progress --info --config config/webpack.localhost.ts --hot --bail",
...
"dependencies": {
"@angular/animations": "^6.0.3",
"@angular/common": "^6.0.3",
"@angular/compiler": "^6.0.3",
"@angular/core": "^6.0.3",
"@angular/forms": "^6.0.3",
"@angular/http": "^6.0.3",
"@angular/platform-browser": "^6.0.3",
"@angular/platform-browser-dynamic": "^6.0.3",
"@angular/router": "^6.0.3",
"@ng-bootstrap/ng-bootstrap": "2.0.0",
"@ngx-loading-bar/core": "^2.0.0",
"@types/angular": "^1.6.45",
"@types/lodash": "4.14.109",
"@types/socket.io-client": "1.4.32",
"angular-confirmation-popover": "4.1.0",
"angular2-json2csv": "1.1.2",
"angular2-moment": "1.9.0",
"angular2-template-loader": "0.6.2",
"angular2-toaster": "6.0.0",
"angular2-uuid": "1.1.1",
"animate.css": "3.6.1",
"bootstrap": "4.1.1",
"core-js": "^2.5.7",
"font-awesome": "4.7.0",
"glyphicons-halflings": "1.9.1",
"hammerjs": "2.0.8",
"http-server": "0.11.1",
"lodash": "4.17.10",
"moment": "2.22.1",
"ng2-file-upload": "1.3.0",
"ng2-img-cropper": "0.9.0",
"ng2-scroll-to": "1.0.7",
"node-sass": "4.8.3",
"raven-js": "3.25.2",
"reflect-metadata": "0.1.12",
"rxjs": "^6.2.0",
"socket.io-client": "2.1.1",
"typings": "2.1.1",
"zone.js": "^0.8.26"
},
"devDependencies": {
"@angular/compiler-cli": "^6.0.3",
"@ngtools/webpack": "^6.1.0-beta.1",
"@types/angular": "^1.6.45",
"@types/chai": "4.1.3",
"@types/core-js": "^0.9.46",
"@types/hammerjs": "2.0.35",
"@types/node": "^10.1.4",
"@types/rx": "^4.1.1",
"@types/socket.io-client": "1.4.32",
"@types/webpack": "^4.4.0",
"angular2-template-loader": "0.6.2",
"awesome-typescript-loader": "5.0.0",
"copy-webpack-plugin": "^4.5.1",
"css-loader": "^0.28.11",
"extract-text-webpack-plugin": "4.0.0-beta.0",
"file-loader": "^1.1.11",
"html-loader": "0.5.5",
"html-webpack-plugin": "3.2.0",
"jasmine-core": "3.1.0",
"jasmine-spec-reporter": "4.2.1",
"karma": "2.0.2",
"karma-chrome-launcher": "2.2.0",
"karma-jasmine": "1.1.2",
"karma-phantomjs-launcher": "1.0.4",
"karma-sourcemap-loader": "0.3.7",
"karma-verbose-reporter": "0.0.6",
"karma-webpack": "3.0.0",
"live-server": "^1.2.0",
"lodash": "4.17.10",
"moment": "2.22.1",
"ngc-webpack": "^4.1.2",
"node-sass": "^4.9.0",
"null-loader": "0.1.1",
"phantomjs-prebuilt": "2.1.16",
"protractor": "5.3.2",
"raw-loader": "^0.5.1",
"request": "2.87.0",
"rimraf": "^2.6.2",
"sass-loader": "^7.0.1",
"style-loader": "^0.21.0",
"supertest": "3.1.0",
"to-string-loader": "^1.1.5",
"ts-loader": "^4.3.0",
"ts-node": "^6.0.5",
"tslint": "^5.10.0",
"tslint-loader": "^3.6.0",
"typescript": "^2.7.2",
"typings": "2.1.1",
"url-loader": "1.0.1",
"webpack": "^4.10.2",
"webpack-bundle-analyzer": "^2.13.1",
"webpack-cli": "^2.1.4",
"webpack-dev-server": "3.1.4",
"webpack-merge": "^4.1.2",
"write-file-webpack-plugin": "4.3.2"
},
"repository": {}
}
Any progress on this? Having same issue with production builds using angular 6.
I was finally able to find the root cause of the problem (for my use case at least). This bug shows its ugly head whenever there a duplicate typings in the project.
In my case it reappeared when upgrading to redux 4.0.0 in a project, and some plugins still have a dependency on 3.x.x. So I ended up with
node_modules/redux
node_modules/@types/redux-logger/node_modules/redux
and redux brings it's own typings ... twice in my case.
removing the nested node_modules caused the incremental build to finally run on TS 2.7.
How did I find the culprits? I hacked the installed typescript compiler and expanded the error message to also show the file that caused the error, not only the "source redirect" without additional info.
Basically just put a if(newSourceFile.redirectInfo)-wrapped log before the compiled source at
and then the bad files show up. At least that worked in my case.
As a workaround I added a postinstall script to package.json that removes the folders, like
https://github.com/DcsMarcRemolt/ngx-starter-new/blob/master/package.json#L22
Oh and a colleague also had a node_modules folder ABOVE the project folder also containing duplicate typings. Removing that finally fixed it on his machine too.
@DcsMarcRemolt Sorry that you had to spend additional time on this. I thought the root cause was clear in my original post since I posted a solution for it, and the PR I linked to states "Issue happens due to identical *.d.ts file found via two paths in the compilation." I've updated my post with this to avoid any future confusion.
@JonWallsten Actually that was my bad. This problem is so old (bugged me long before this issue), I simply forgot that you already analyzed this thoroughly.
The problem reappeared for me last week after a few months break, so I dug into it and reported my findings.
Actually, I didn't realize there was a solution on this thread until today and thanks to @DcsMarcRemolt -- so it was not clear, and others failed to point it out for months, that there was one -- so my bad, but again, thanks to @DcsMarcRemolt for clearly pointing it out.
Still not clear on how to resolve this, have gone thru both of your answers in detail -- as you said yourself, @JonWallsten:
Webback watch mode is useless if you have to restart it after each change.
I need to use typescript version 2.7.2. @DcsMarcRemolt, you patched some newer version (master branch), and not sure how to even use the compiled built/local
typescript build...
Some other questions:
• are you building the unix binary? or just using what's gulped into the built/local
folder?
• @DcsMarcRemolt: can you show your code snippet for what you actually used to sniff out the error? Did you just include newSourceFile.redirectInfo
in the Debug.Asser() message itself?
• @JonWallsten -- you're patching the synthesized-compiler-host.ts
not the file @DcsMarcRemolt patched (program.ts)? And what is the ng-packagr applicability? Sorry, I've never built angular packages.... Is this a step I'm missing related to compiling the new local built typescript source? Sorry, not accustomed to re-building my programming language libraries themselves, silly me!
So yeah, obviously I'm not batting at your level guys
-- but throw a dog a bone here and lend us some more help, struggling to pick up what you're putting down, for months now....
And are you then:
file://
syntax? (P.S. - guys, try to sympathize, I'm rebuilding my e2e protractor
tests to async/await and after breaking protractor changes, and this extra step because webpack is broken
during my dev flow is killing me.
I know typescript isn't your responsibility!
@charlieargue
Tested with Typescript 2.7.2:
Open node_modules/typescript/lib/typescript.js (the compiled source in your project)
Search for "Host should not return a redirect source file from getSourceFile
"
In TS 2.7.2 that is around line 27286.
Directly before this line (the assert) insert:
if (newSourceFile.redirectInfo) {
console.warn('Evil file:', newSourceFile.redirectInfo.redirectTarget.fileName);
}
Start AOT dev build, change sth, watch the error.
@DcsMarcRemolt I tried to do that, but it wouldn't log anything. It seems like in my case that file is not being executed. I also tried editing tsc.js and other js files where I found the same assert to no avail.
@villelahdenvuo have you tried to log sth outside of the if? Are you sure it does not run through the function or just not through the if-statement?
If yes, does your setup use a global (or other) typescript installation by accident? Because to compile anything, the compiler must run through these lines.
Another thing to check - have you restarted the dev build after editing the files in node_modules? Because changes there are not picked up unless your restart the build.
@DcsMarcRemolt Thanks for the tips, however I had a hunch about what module was causing the problem and I was right, so I managed to fix it. 👍
Also getting this - Is there a solution?
@soates only a workaround as far as I know. You need to determine what module imports a duplicate .d.ts file and delete that duplicate dependency from the module. For example using a npm postinstall script. In my case it was fontawesome packages that all required a common types module with the types.
Remember to vote on the original post so that it gets visibility!
Thanks guys! Just wanted to confirm this workaround is 💯 👍 -- -- and yes, had to do something like this:
"hackscript": "rimraf node_modules/@types/uglify-js/node_modules",
Once I found the culprit module -- and pretty much keeps coming back, so the package.json script is necessary.
@DcsMarcRemolt thanks for your tip it worked!!
In my case it was a tslib
mismatch, but great investigation and suggestion!
Happily on AoT + TS 2.7 watch mode now 😄
For me, the workaround of uninstalling @types/webpack
worked. I'll note that I also had to uninstall some other packages to truly get rid of @types/webpack
:
@types/html-webpack-plugin
@types/karma-webpack
You may need to uninstall others, too. Look in package-lock.json
to see what is depending on @types/webpack
, and uninstall those packages.
This is a really unfortunate workaround - it would be nice to see this fixed soon.
My conflicting packages were @types/webpack": "^4.4.5"
and @types/webpack-env": "1.13.0"
. The solution was to load webpack for my webpack-config files and webpack-env for my source code - via the tsconfig.json types
option.
Thx @villelahdenvuo for the hint and thx @DcsMarcRemolt for the proof. Same problem here using fontawesome-pro. Each package includes the common-types package. Not sure if that's an issue that has to be adressed with fortawesome?
For anyone running into the same problem here my solution:
include these scripts into your package.json
"hackscript": "replace '@fortawesome/fontawesome-common-types' '@fortawesome/fontawesome' node_modules/@fortawesome/fontawesome-pro-regular/index.d.ts node_modules/@fortawesome/fontawesome-pro-solid/index.d.ts",
"postinstall": "npm run hackscript && npm run build",
Also running into this issue but not using a custom webpack config; using the @angular/cli version 6.1.5, works fine most of the time but when running ng serve --prod
to compare builds it fails upon recompile.
Was referenced here from angular-cli
, seeing as there seems to be no further progress on that ticket and it has been closed. Back then seemed to be a TypeScript
version issue, but have no idea what the current state of these two seemingly identical issues is.
I started digging a little bit again since this Angular 6/7 is on my plate again.
I logged all the files from tmpProgram.getSourceFiles()
, and it seems like it even includes files explicitly exluded in the tsconfig.
// packages/web-app/tsconfig.json
"exclude": [
"../web-lib-angular/node_modules"
]
// log
...
C:/Users/me/repo/web/packages/web-app/node_modules/tslib/tslib.d.ts
C:/Users/me/repo/web/packages/web-lib-angular/node_modules/tslib/tslib.d.ts
...
The files above will cause the error.
I also found an interesting workaround. This makes sure that any tslib used will be the same one.
"paths": {
"tslib": [ "node_modules/tslib"]
}
@tbosch as master of the compiler... why is this not fixed for so long? having such "hackscripts" upon npm install is not a long-term solution
I started digging a little bit again since this Angular 6/7 is on my plate again. I logged all the files from
tmpProgram.getSourceFiles()
, and it seems like it even includes files explicitly exluded in the tsconfig.// packages/web-app/tsconfig.json "exclude": [ "../web-lib-angular/node_modules" ]
// log ... C:/Users/me/repo/web/packages/web-app/node_modules/tslib/tslib.d.ts C:/Users/me/repo/web/packages/web-lib-angular/node_modules/tslib/tslib.d.ts ...
The files above will cause the error.
I also found an interesting workaround. This makes sure that any tslib used will be the same one.
"paths": { "tslib": [ "node_modules/tslib"] }
my god man -- this work around saved my ass -- thank you. I've been having an issue with bringing in an ngpackagr library and for some reason rxjs library also points to Rxjs (case change) and it made the compiler for typescript go crazy on rebuilds. Added the following to tsconfig:
"paths": {
"rxjs": ["../node_modules/rxjs"],
"Rxjs": ["../node_modules/rxjs"]
}
ugh. thank you again.
After updating @angular
to 7.0.0 and ng-packagr
to 4.3.1
I have this error as well every time I change something in code during serve --aot
mode:
ERROR in Debug Failure. False expression: Host should not return a redirect source file from 'getSourceFile'
After updating
@angular
to 7.0.0 andng-packagr
to4.3.1
I have this error as well every time I change something in code duringserve --aot
mode:ERROR in Debug Failure. False expression: Host should not return a redirect source file from 'getSourceFile'
Try change tsconfig.json
"compilerOptions": {
...
"paths": {
"any-symlink-package": ["real-path-of-any-symlink-package"],
"any-symlink-package/*": ["real-path-of-any-symlink-package/*"],
...
"*": [ "node_modules/*", "node_modules/@types/*"]
}
}
It works for me eventually. @piernik
@alexeagle Based on the number of thumbs up in the OP and the activity in this issue, do you still consider this as Frequency low? You are aware that we are unable to compile Angular at all with this bug, right?
Also, I created a PR for this 6 months a go: https://github.com/angular/angular/pull/26036
I've noticed that using the paths-workaround is resulting in a bad side effect in our monorepo. Since Typescript added support for definitions source maps so we can CTRL-click our way around the packages in our monorepo, but the paths-workaround makes us end up in the node_modules folder instead of the project source folder. If I instead of using the old way
"paths": {
"@my-project/*": [ "node_modules/@my-project/*"]
}
uses this way of pointing to our src folders instead I end up and the correct file when CTRL+click
"paths": {
"@my-project/*": [ "../*"]
}
however when I import stuff from another project instead of adding import ... from '@my-project/package'
it adds import ... from '../package'
which is not what I want.
So the only way of fixing this issue and keep all the nice features (auto import/ctrl+click to other packages in our monorepo) is to monkey patch angular, which I just did. I've added the same fix as in my PR. It's pretty robust since it looks for a specific line of code. So it won't have to be updated unless the Angular-team changes that specific line.
To use this. Just add it as a postinstall script in package.json.
"scripts": {
"postinstall": "node path/patch-cli"
}
/*
Monkey Patch for issue: https://github.com/angular/angular/issues/22524
Error message:
ERROR in Error: Debug Failure. False expression: Host should not return a redirect source file from `getSourceFile`
*/
const { readFileSync, writeFileSync, existsSync } = require('fs');
const fileName = './node_modules/@angular/compiler-cli/src/transformers/program.js';
const patchIdentifier = '//-patched';
const sourceCode = 'if (this.hostAdapter.isSourceFile(sf.fileName)) {';
const patchCode = "if (sf['redirectInfo']) { sf = sf['redirectInfo'].redirectTarget; } " + patchIdentifier; //eslint-disable-line quotes
// No file, nothing to patch
if (!existsSync(fileName)) {
process.exit(0);
}
const contents = readFileSync(fileName).toString().split('\n');
// Check if code has been patched already
const hasBeenPatched = contents.find(line => line.indexOf(patchIdentifier) !== -1); // eslint-disable-line strict
if (!hasBeenPatched) {
const lineNumber = contents.findIndex(line => line.indexOf(sourceCode) !== -1); // eslint-disable-line quotes, strict
if (lineNumber <= 0) {
console.error('Could not find source code. Please check ' + fileName + ' and update the patch accordingly'); // eslint-disable-line no-console
process.exit(1);
}
// Add the patched line after the source code line
contents.splice(lineNumber + 1, 0, patchCode);
const updatedContents = contents.join('\n');
writeFileSync(fileName, updatedContents);
console.log('Angular Compiler CLI has been Monkey patched'); // eslint-disable-line no-console
} else {
console.log('Angular Compiler CLI has already been patched'); // eslint-disable-line no-console
}
process.exit(0);
I really despise that I have to do this. But the Angular-team leaves me no other choice.
Edit: In the lastest Angular they've changed the TS output to ES6. So instead of using _this.hostAdapter
you need to use this.hostAdapter
when searching for the line number
Edit 2: They switched back again in Angular 8.
This is also a problem in Angular 8 when using ivy. From: @angular\compiler-cli\src\ngtsc\typecheck\src\context.js:164-173
for (var _c = tslib_1.__values(originalProgram.getSourceFiles()), _d = _c.next(); !_d.done; _d = _c.next()) {
var originalSf = _d.value;
var sf = this.transform(originalSf);
sfMap.set(sf.fileName, sf);
if (!sf.isDeclarationFile && this.opMap.has(originalSf)) {
interestingFiles.push(sf);
}
}
Fixed in the same way by adding if (sf['redirectInfo']) { sf = sf['redirectInfo'].redirectTarget; }
for (var _c = tslib_1.__values(originalProgram.getSourceFiles()), _d = _c.next(); !_d.done; _d = _c.next()) {
var originalSf = _d.value;
var sf = this.transform(originalSf);
if (sf['redirectInfo']) { sf = sf['redirectInfo'].redirectTarget; }
sfMap.set(sf.fileName, sf);
if (!sf.isDeclarationFile && this.opMap.has(originalSf)) {
interestingFiles.push(sf);
}
}
@alexeagle Will this ever be looked at? It's easily reproducible, seems to be a simple fix and affects a lot of users based on the number of "Thumbs up". The error still occurs in Angular 8 RC.
@JonWallsten tried applying your patch, but it just substitutes one error for another. Now I get the following when I make a change in watch mode:
Internal Error: The structure of the program changed during codegen.
I've asked the team to consider re-triaging this issue and raising the priority after reading the ngx-bootstrap post on upgrading to Ivy.
Thanks to this great pointer from @DcsMarcRemolt, I was able to find our offending code that lead to this error.
In node_modules/typescript/lib/typescript.js
, I changed line:
ts.Debug.assert(!newSourceFile.redirectInfo, "Host should not return a redirect source file from `getSourceFile`")
to:
ts.Debug.assert(
!newSourceFile.redirectInfo,
"Host should not return a redirect source file from `getSourceFile`",
() => `Duplicate .d.ts files: ${newSourceFile.fileName} <-> ${newSourceFile.redirectInfo.redirectTarget.fileName}`
);
And then got the error like:
ERROR in Debug Failure. False expression: Host should not return a redirect source file from `getSourceFile`
Verbose Debug Information: Duplicate .d.ts files: C:/<...>/node_modules/ngx-bootstrap/Typeahead/ngx-bootstrap-typeahead.d.ts <-> C:/<...>/node_modules/ngx-bootstrap/typeahead/ngx-bootstrap-typeahead.d.ts
Which I found odd, so I searched our code base for: /Typeahead
with a case-sensitive flag, and, lo and behold, someone added an import like import { TypeaheadMatch } from 'ngx-bootstrap/Typeahead';
. After fixing the letter casing, the error was gone.
A bit unfortunate that such a small typo can cause such an obscure error that lead to hours of debugging, but, oh well... it happens. Hope this helps someone else!
Just wanted to let you know that the PR for this issue is done. We're waiting for the code owner to be back and then approve. So hopefully in a short time we just leave this thread behind us!
So... this was only released for Angular 8? So anyone on Angular 7, which was released less than a year ago is SOL?
EDIT: I just realized my project is on Angular 6, so a more productive question from me would be, will this fix be present in 6? Or any other older versions of Angular?
Well, why can’t you upgrade?
tens of thousands of lines of code and it isn't even my project, im like a guest in the project (but i heavily need the project to work effectively for my own sister project).
I'm submitting a...
Current behavior
When using webpack-dev-server in --watch mode and you make a change the build process throws the following error:
Expected behavior
It should not throw an error and compile the code as usual.
Minimal reproduction of the problem with instructions
See this PR for more info: https://github.com/dherges/ng-packagr/pull/637
What is the motivation / use case for changing the behavior?
Webback watch mode is useless if you have to restart it after each change.
Environment
Conclusion
This seems to work. Not sure what else it will break though. Added the redirectInfo fix from the PR i referenced.
Edit: It seems like my ticket is not clear enough in pointing out the issue based on the new posts in this thread. The issue happens due to identical *.d.ts file found via two paths in the compilation. In plain english: The packages uses the same dependency that includes a definition file.