theseanl / tscc

A collection of tools to seamlessly bundle, minify Typescript with Closure Compiler
MIT License
161 stars 11 forks source link

Closure compiler error code 4294967294 when specifying more than one bundle #97

Closed foobardevpro closed 4 years ago

foobardevpro commented 4 years ago

Disclaimer: I might be doing something wrong. 😅

I've encountered this error code in 3 ways:

Scenario 1:

  1. Download todomvc-master/typescript-react
  2. Create (empty) file ./js/app2.tsx
  3. Add to tscc.spec.json another bundle:
    "modules": {
        "bundle": "./app.tsx",
        "bundle2": "./app2.tsx" <-----
    },

    also to tsconfig.json:

    "files": [
        "constants.ts",
        "interfaces.ts",
        "todoModel.ts",
        "utils.ts",
        "app.tsx",
        "app2.tsx", <-----
        "footer.tsx",
        "todoItem.tsx"
    ],
  4. Run tscc global cli (0.4.4) in ./js:
    
    TSCC: tsickle uses a custom tslib optimized for closure compiler. importHelpers flag is set.
    TSCC: Closure compiler relies on type annotations, removeComments flag is unset.
    TS: app.tsx(30,9): warning TS0: unhandled type {type flags:0x80000 alias:"Readonly" flags:0x80000 TypeAlias aliasArgs:<{type flags:0x80000 Object objectFlags:0x2 object:Interface symbol.name:"IAppState"}> Object objectFlags:0x96 object:Mapped object:Instantiated}

TS: app.tsx(30,9): warning TS0: unhandled type {type flags:0x80000 alias:"Readonly" flags:0x80000 TypeAlias aliasArgs:<{type flags:0x80000 Object objectFlags:0x2 object:Interface symbol.name:"IAppProps"}> Object objectFlags:0x96 object:Mapped object:Instantiated}

TS: app.tsx(30,9): warning TS0: unhandled type {type flags:0x80000 alias:"Pick" flags:0x80000 TypeAlias aliasArgs:<{type flags:0x80000 Object objectFlags:0x2 object:Interface symbol.name:"IAppState"},{type flags:0x40000 IncludesStructuredOrInstantiable symbol.name:"K"}> Object objectFlags:0x96 object:Mapped object:Instantiated}

TS: app.tsx(30,9): warning TS0: unhandled type {type flags:0x80000 alias:"Pick" flags:0x80000 TypeAlias aliasArgs:<{type flags:0x80000 Object objectFlags:0x2 object:Interface symbol.name:"IAppState"},{type flags:0x40000 IncludesStructuredOrInstantiable symbol.name:"K"}> Object objectFlags:0x96 object:Mapped object:Instantiated}

ClosureCompiler: java.lang.IllegalArgumentException: expected one element but was: <bundle, bundle2> at com.google.common.collect.Iterators.getOnlyElement(Iterators.java:316) at com.google.common.collect.Iterables.getOnlyElement(Iterables.java:254) at com.google.javascript.jscomp.JSModuleGraph.getRootModule(JSModuleGraph.java:325)

ClosureCompiler: at com.google.javascript.jscomp.AnalyzePrototypeProperties.(AnalyzePrototypeProperties.java:125) at com.google.javascript.jscomp.CrossChunkMethodMotion.(CrossChunkMethodMotion.java:87) at com.google.javascript.jscomp.DefaultPassConfig.lambda$new$60(DefaultPassConfig.java:2371) at com.google.javascript.jscomp.PassFactory.create(PassFactory.java:118) at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:326) at com.google.javascript.jscomp.PhaseOptimizer$Loop.process(PhaseOptimizer.java:471) at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:235) at com.google.javascript.jscomp.Compiler.performOptimizations(Compiler.java:2416) at com.google.javascript.jscomp.Compiler.lambda$stage2Passes$1(Compiler.java:793) at com.google.javascript.jscomp.CompilerExecutor$2.call(CompilerExecutor.java:102) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:473) at com.oracle.svm.core.windows.WindowsJavaThreads.osThreadStartRoutine(WindowsJavaThreads.java:137)

× Closure compiler error ClosureCompiler: Exited with code 4294967294. TSCC: 4294967294 TSCC: The compilation has terminated with an error.


_**Scenario 2:**_

1. In new workspace: ``npm i @tscc/tscc``
2. Create files:

``build.js``

const tscc = require('@tscc/tscc').default

tscc({ specFile: './tscc.spec.json' }, './tsconfig.json')

``tscc.spec.json``

{ "modules": { "bundle1": "entry1.ts", "bundle2": "entry2.ts" }, "compilerFlags": { "warning_level": "VERBOSE" }, "prefix": "./" }

``tsconfig.json``

{ "compilerOptions": { "target": "esnext", "module": "commonjs" } }

and two empty files ``entry1.ts``, ``entry2.ts``
3. Run ``node ./build.js``:

TSCC: tsickle uses a custom tslib optimized for closure compiler. importHelpers flag is set. ClosureCompiler: java.lang.IllegalArgumentException: expected one element but was: <bundle1, bundle2> at com.google.common.collect.Iterators.getOnlyElement(Iterators.java:316) at com.google.common.collect.Iterables.getOnlyElement(Iterables.java:254) at com.google.javascript.jscomp.JSModuleGraph.getRootModule(JSModuleGraph.java:325) ClosureCompiler: at com.google.javascript.jscomp.AnalyzePrototypeProperties.(AnalyzePrototypeProperties.java:125) at com.google.javascript.jscomp.CrossChunkMethodMotion.(CrossChunkMethodMotion.java:87) at com.google.javascript.jscomp.DefaultPassConfig.lambda$new$60(DefaultPassConfig.java:2371) at com.google.javascript.jscomp.PassFactory.create(PassFactory.java:118) at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:326) at com.google.javascript.jscomp.PhaseOptimizer$Loop.process(PhaseOptimizer.java:471) at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:235) at com.google.javascript.jscomp.Compiler.performOptimizations(Compiler.java:2416) at com.google.javascript.jscomp.Compiler.lambda$stage2Passes$1(Compiler.java:793) at com.google.javascript.jscomp.CompilerExecutor$2.call(CompilerExecutor.java:102) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:473) at com.oracle.svm.core.windows.WindowsJavaThreads.osThreadStartRoutine(WindowsJavaThreads.java:137)

× Closure compiler error ClosureCompiler: Exited with code 4294967294. (node:16468) UnhandledPromiseRejectionWarning: Error: 4294967294 at ChildProcess.onCompilerProcessClose (D:*****\node_modules\@tscc\tscc\dist\tscc.js:128:24) at ChildProcess.emit (events.js:203:13) at maybeClose (internal/child_process.js:1021:16) at Process.ChildProcess._handle.onexit (internal/child_process.js:283:5) (node:16468) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:16468) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

_**Scenario 3:**_

In my own personal project, same error code, but different message (couldn't re-create):

TSCC: tsickle uses a custom tslib optimized for closure compiler. importHelpers flag is set. TS: src/Play/Tilemap/App.ts(12,1): warning TS0: type/symbol conflict for default, using {?} for now

TSCC: File orders:


ClosureCompiler: args: D:*\node_modules\google-closure-compiler-windows\compiler.exe --language_in ECMASCRIPT_NEXT --language_out ECMASCRIPT5 --compilation_level ADVANCED --chunk_output_path_prefix --generate_exports --export_local_property_definitions --create_source_map %outname%.map --apply_input_source_maps --source_map_include_content --warning_level VERBOSE --chunk dist/js/homepage:3 --chunk dist/js/play:35 --json_streams BOTH --externs D:*.tscc_temp\66df952ad97c8b6685430372d4339cc6a863caccbe17b7a9dd58e2774e428734\externs_generated.js --externs D:*\node_modules\@tscc\tscc\third_party\tsickle\third_party\tslib\externs.js --externs D:*\node_modules\@tscc\tscc\third_party\tsickle\closure_externs.js

ClosureCompiler: java.lang.IllegalStateException: No common dependency found for {0, 1} at com.google.common.base.Preconditions.checkState(Preconditions.java:588)

ClosureCompiler: at com.google.javascript.jscomp.JSModuleGraph.getSmallestCoveringSubtree(JSModuleGraph.java:400) at com.google.javascript.jscomp.CrossChunkCodeMotion$DeclarationStatementGroupCycle.getPreferredModule(CrossChunkCodeMotion.java:625) at com.google.javascript.jscomp.CrossChunkCodeMotion$DeclarationStatementGroupCycle.moveToPreferredModule(CrossChunkCodeMotion.java:553) at com.google.javascript.jscomp.CrossChunkCodeMotion$GlobalSymbolCycle.moveDeclarationStatements(CrossChunkCodeMotion.java:324) at com.google.javascript.jscomp.CrossChunkCodeMotion.moveGlobalSymbols(CrossChunkCodeMotion.java:219) at com.google.javascript.jscomp.CrossChunkCodeMotion.process(CrossChunkCodeMotion.java:102) at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:326) at com.google.javascript.jscomp.PhaseOptimizer$Loop.process(PhaseOptimizer.java:471) at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:235) at com.google.javascript.jscomp.Compiler.performOptimizations(Compiler.java:2416) at com.google.javascript.jscomp.Compiler.lambda$stage2Passes$1(Compiler.java:793) at com.google.javascript.jscomp.CompilerExecutor$2.call(CompilerExecutor.java:102) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:473) at com.oracle.svm.core.windows.WindowsJavaThreads.osThreadStartRoutine(WindowsJavaThreads.java:137)

× Closure compiler error ClosureCompiler: Exited with code 4294967294. (node:20020) UnhandledPromiseRejectionWarning: Error: 4294967294 at ChildProcess.onCompilerProcessClose (D:*****\node_modules\@tscc\tscc\dist\tscc.js:128:24) at ChildProcess.emit (events.js:203:13) at maybeClose (internal/child_process.js:1021:16) at Process.ChildProcess._handle.onexit (internal/child_process.js:283:5) (node:20020) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:20020) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.



Happy to know if I'm doing something wrong or provide additional testing (Windows 10, 64-bit).

p.s. specifying more than one bundle also breaks my rollup watch
theseanl commented 4 years ago

Output modules should form a tree with a common root, this is required for closure compiler's --chunk flags. In your situations, two output modules does not share a common root module, and it seems to be causing those problems. You can 'fix' it by adding a common root

"modules": {
                "root": "./root.ts",
        "bundle":  {
                        "entry": "./app.tsx",
                        "dependencies": ["root"],
                 },
        "bundle2": {
                        "entry": "./app2.tsx"
                        "dependencies": ["root"]
                }
    },

but this is probably not what you want. If two bundles does not share any code, there is no need to compile them together from the beginning.