yaml-language-server icon indicating copy to clipboard operation
yaml-language-server copied to clipboard

"Class extends value undefined is not a constructor or null" when 1.11.0 or later version used as an umd library

Open 1yefuwang1 opened this issue 2 years ago • 2 comments

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

1yefuwang1 avatar May 09 '23 08:05 1yefuwang1

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

1yefuwang1 avatar Jul 05 '23 06:07 1yefuwang1

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.

1yefuwang1 avatar Jul 05 '23 06:07 1yefuwang1