"Class extends value undefined is not a constructor or null" when 1.11.0 or later version used as an umd library
Describe the bug
I'm trying to use this project as an umd library. It works fine with 1.7.0 version. With v1.12.0, everyting compiles fine. But at runtime, I get the following error:
/home/wyf/umd-test/node_modules/yaml-language-server/lib/umd/languageservice/parser/yaml-documents.js:29
class SingleYAMLDocument extends jsonParser07_1.JSONDocument {
^
TypeError: Class extends value undefined is not a constructor or null
at /home/wyf/umd-test/node_modules/yaml-language-server/lib/umd/languageservice/parser/yaml-documents.js:29:53
at /home/wyf/umd-test/node_modules/yaml-language-server/lib/umd/languageservice/parser/yaml-documents.js:7:17
at Object.<anonymous> (/home/wyf/umd-test/node_modules/yaml-language-server/lib/umd/languageservice/parser/yaml-documents.js:13:3)
at Module._compile (internal/modules/cjs/loader.js:1068:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
at Module.load (internal/modules/cjs/loader.js:933:32)
at Function.Module._load (internal/modules/cjs/loader.js:774:14)
at Module.require (internal/modules/cjs/loader.js:957:19)
at require (internal/modules/cjs/helpers.js:88:18)
at /home/wyf/umd-test/node_modules/yaml-language-server/lib/umd/languageservice/services/documentSymbols.js:19:30
Expected Behavior
When v1.12.0 is used as a library, it should work as with v.1.7.0
Current Behavior
Throws TypeError at runtime
Steps to Reproduce
One can clone https://github.com/1yefuwang1/yaml-language-server-lib-sample for code and steps to reproduce.
Environment
- Linux
After some digging, the latest workable version is 1.10.0. The issue was introduced in 1.11.0 release. It seems to be caused by circular dependency https://stackoverflow.com/questions/75733102/typescript-javascript-circular-dependency-class-extends-value-undefined-is-not. In 1.11.0 release, a lot more circular dependency was introduced. I use "dpdm --no-warning --no-tree src/languageservice/parser/jsonParser07.ts" in 1.10.0 code base, and it gives me:
• Circular Dependencies
1) src/languageservice/parser/jsonParser07.ts -> src/languageservice/utils/arrUtils.ts -> src/languageservice/parser/yamlParser07.ts -> src/languageservice/parser/yaml-documents.ts
2) src/languageservice/parser/yamlParser07.ts -> src/languageservice/parser/yaml-documents.ts
3) src/languageservice/parser/jsonParser07.ts -> src/languageservice/utils/arrUtils.ts -> src/languageservice/parser/yamlParser07.ts -> src/languageservice/parser/yaml-documents.ts -> src/languageservice/parser/ast-converter.ts
4) src/languageservice/utils/arrUtils.ts -> src/languageservice/parser/yamlParser07.ts -> src/languageservice/parser/yaml-documents.ts
5) src/languageservice/utils/arrUtils.ts -> src/languageservice/parser/yamlParser07.ts -> src/languageservice/parser/custom-tag-provider.ts
However, running the same command in 1.11.0 gives me:
• Circular Dependencies
01) src/languageservice/parser/jsonParser07.ts -> src/languageservice/utils/arrUtils.ts -> src/languageservice/parser/yamlParser07.ts -> src/languageservice/parser/yaml-documents.ts
02) src/languageservice/parser/yamlParser07.ts -> src/languageservice/parser/yaml-documents.ts
03) src/languageservice/parser/jsonParser07.ts -> src/languageservice/utils/arrUtils.ts -> src/languageservice/parser/yamlParser07.ts -> src/languageservice/parser/yaml-documents.ts -> src/languageservice/parser/ast-converter.ts
04) src/languageservice/utils/arrUtils.ts -> src/languageservice/parser/yamlParser07.ts -> src/languageservice/parser/yaml-documents.ts
05) src/languageservice/utils/arrUtils.ts -> src/languageservice/parser/yamlParser07.ts -> src/languageservice/parser/custom-tag-provider.ts
06) src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts
07) src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/languageservice/services/documentSymbols.ts
08) src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlHover.ts
09) src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlHover.ts
10) src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlHover.ts -> src/languageservice/parser/isKubernetes.ts
11) src/languageservice/parser/jsonParser07.ts -> src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlHover.ts -> src/languageservice/parser/isKubernetes.ts
12) src/languageservice/parser/jsonParser07.ts -> src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlHover.ts
13) src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlValidation.ts
14) src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlValidation.ts
15) src/languageservice/parser/jsonParser07.ts -> src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlValidation.ts
16) src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlValidation.ts -> src/languageservice/services/validation/yaml-style.ts
17) src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlFormatter.ts
18) src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlCodeActions.ts
19) src/languageservice/parser/jsonParser07.ts -> src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlCodeActions.ts
20) src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlCodeLens.ts
21) src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlCompletion.ts
22) src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlCompletion.ts
23) src/languageservice/parser/jsonParser07.ts -> src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlCompletion.ts
24) src/languageservice/parser/jsonParser07.ts -> src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/languageservice/services/yamlCompletion.ts -> src/languageservice/services/modelineUtil.ts
25) src/languageservice/yamlLanguageService.ts -> src/yamlSettings.ts
26) src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/yamlSettings.ts -> src/requestTypes.ts
27) src/languageservice/yamlLanguageService.ts -> src/yamlSettings.ts -> src/requestTypes.ts
28) src/languageservice/services/yamlSchemaService.ts -> src/languageservice/yamlLanguageService.ts -> src/languageserver/handlers/schemaSelectionHandlers.ts
29) src/languageservice/parser/jsonParser07.ts -> src/languageservice/services/yamlSchemaService.ts
The simplest way of reproducing the bug is to add latest yaml-language-server to a newly created project(using npm init) and import JSONDocument.
// in index.ts, just import JSONDocument without other code
import { JSONDocument } from "yaml-language-server/lib/umd/languageservice/parser/jsonParser07"
Compilation should succeed. But when you try to run it node out/index.js, node will give you the error.