[在打字稿规范文件中导入node-openid-client时,karmajs无法启动

问题描述 投票:0回答:1

我正在使用node-openid-client通过OpenID提供程序执行基于OpenIDConnect的身份验证。

现在,当我尝试为该程序编写测试用例时,我遇到了问题。当从节点CLI运行应用程序时,它可以正常工作。即它获取代码,我也可以使用它来获取令牌!

我遇到的错误是

ERROR [source-reader.karma-typescript]: Error parsing code: Unexpected token (24:2)
in C:\VSCode\Projects\openid-client-test\javascript\node_modules\openid-client\lib\errors.js 
at line 24, column 2:

... );
if (response) {
     Object.defineProperty(th ...

在此错误之后,是业力赛跑者正在执行的活动-

INFO [compiler.karma-typescript]: Compiled 1 files in 3029 ms.

DEBUG [bundler.karma-typescript]: Project has 2 import/require statements, code will be bundled

DEBUG [es6-transform.karma-typescript]: Transforming C:\VSCode\Projects\openid-client-test\javascript\node_modules\openid-client\lib\index.js

这些是由Karma使用LOG_DEBUG配置运行时生成的日志。

我没有使用Angular或任何其他UI框架

基于这些错误,我有几个问题-

Q1我不知道为什么业力会解析node_modules文件夹中的js文件?我在tsconfig.json中排除了它。

基于错误发生之前的活动,我注意到它无法捆绑openid-client库的必需文件。但是,如果我为此库运行browserify捆绑包,它将成功。我想我在下面列出的任何文件中都做了一些配置错误。

Q2请帮助我确定哪个配置属性有问题!,否则解决方案本身也将不胜感激!

Q3:对我来说令人担忧的问题-openid-client与业力测试运行程序不兼容吗?这样的限制可能吗?我在GitHub存储库中没有看到任何对应的issue

以下是我不断编辑以解决此错误的感兴趣的文件。但是,我想我现在撞墙了。

为了专注于该问题并以黑白方式查看openid-client是否是导致该问题的原因,我介绍了一个针对茉莉花框架的最小测试用例。规格看起来像这样-

probe.spec.ts文件

import { Issuer } from 'openid-client';
describe('Hello', () => {
  it('Checks', () => {
    expect('hello').toBe('hello');
  })
});

现在,在进行实验时,我已经在第一行中删除了导入。如果完成的话;业力启动并报告测试用例成功!

package.json文件的依赖项(包括开发)

"dependencies": {
  "@types/node": "^12.7.5",
  "amazon-cognito-auth-js": "^1.3.2",
  "atob": "^2.1.2",
  "openid-client": "^3.7.2",
  "typescript": "^3.6.3",
  "xmlhttprequest": "^1.8.0"
},
"devDependencies": {
  "@types/jasmine": "^3.4.1",
  "jasmine-core": "^3.5.0",
  "karma": "^4.3.0",
  "karma-chrome-launcher": "^3.1.0",
  "karma-coverage-istanbul-reporter": "^2.1.0",
  "karma-jasmine": "^2.0.1",
  "karma-jasmine-html-reporter": "^1.4.2",
  "karma-spec-reporter": "0.0.32",
  "karma-typescript": "^4.1.1",
  "karma-typescript-es6-transform": "^4.1.1"
}

tsconfig.json看起来像这样-

{
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "node_modules"
  ],
  "compilerOptions": {
  "module": "commonjs",
  "target": "es2016",
  "noImplicitAny": false,
  "strictNullChecks": true,
  "moduleResolution": "node",
  "sourceMap": true,
  "importHelpers": true,
  "outDir": "output",
  "baseUrl": ".",
  "typeRoots": [
    "node_modules/@types"
  ],
  "types": [
    "@types/jasmine",
    "@types/node"
  ],
  "lib": [
    "es2017",
    "dom",
    "es2015.generator",
    "es2015.iterable",
    "es2015.promise",
    "es2015.symbol",
    "es2015.symbol.wellknown",
    "esnext.asynciterable"
  ]}
}

karma.conf.js看起来像这样-

module.exports = (config) => {
  config.set({
    frameworks: ['jasmine', 'karma-typescript'],
    plugins: [
      'karma-jasmine',
      'karma-typescript',
      'karma-chrome-launcher',
      'karma-spec-reporter',
      'karma-typescript-es6-transform'
    ],
    karmaTypescriptConfig: {
      tsconfig: "./tsconfig.json",
      compilerOptions: {
        allowJs: true
      },
      bundlerOptions: {
        entrypoints: /\.spec\.(ts|tsx)$/,
        addNodeGlobals: true,
        transforms: [require("karma-typescript-es6-transform")()]
      }
    },
    files: [{ pattern: 'src/**/*.+(js|ts)' }],
    preprocessors: {
      'src/**/*.+(js|ts)': ['karma-typescript']
    },
    client: {
      clearContext: false
    },
    reporters: ['spec', 'karma-typescript'],
    colors: true,
    logLevel: config.LOG_DEBUG,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: true
  })
}
typescript karma-jasmine node-modules openid-connect
1个回答
0
投票

TL; DR-因果型脚本有一个known limitation,这会导致错误。即使没有karma-typescript插件;到目前为止,node-openid-client也为not expected to work in browser(2019年10月2日至16T:30UT)。因此,是的,我无法将节点打开的客户端与业力一起使用(它无法工作without browser甚至as-of now(2-October-2019T16:30UT))。可行的alternate是使用摩卡代替业力。

上述结论的详细信息

] >>File error.js

第24,2行附近的区域看起来像这样

Line 16: Object.assign( Line 17: this, Line 18: {error}, Line 19: (error_description && {error_description}), Line 20: (error_uri && {error_uri}), Line 21: (state && {state}), Line 22: (scope && {scope}), Line 23: (session_state && {session_state}), Line 24: );

第24,2行对应于Object.assign调用的右括号。如果您发现上面的行有多余的逗号,请注意。我将其删除以查看错误消失。可能是库node-opened-client使用错误的编译器。修复后,出现以下错误

    ERROR [source-reader.karma-typescript]: Error parsing code: Unexpected token (72:8)
    in C:\VSCode\Projects\openid-client-test\javascript\node_modules\openid-client\lib\issuer.js
    at line 72, column 8:

    ... keystore(reload = false) {
        assertIssuerConfigu ...

File

issuer.js
第72行附近的区域看起来像这样

Line 68 /** Line 69 * @name keystore Line 70 * @api public Line 71 */ Line 72 async keystore(reload=false) { Line 73 assertIssuerConfiguration(this, 'jkws_uri');

第72行使用async关键字,直接的问题是(com / trans)pilation过程中是否支持async关键字?
为了测试这个假设,我删除了async关键字,并注意到错误位置移至了下一个异步事件。

我在node-openid-client库中找不到很多错误。但是在karma-typescript插件中,当文件捆绑在一起时,出了点问题。在他们的存储库中搜索不会产生任何提示。在其中我意识到可能引起问题的配置。

File

configuration.ts

第113行周围的区域看起来像这样-

... Line 111 const defaultBundlerOptions: BundlerOptions = { Line 112 acorOptions: { Line 113 ecmaVersion : 7, Line 114 sourceType : "module" Line 115 }, ...

如果我在这里在node_modules文件夹中的本地副本中更改此版本的ecmaVersion 7,我已解决了问题,但遇到另一个错误,但是这次使用数组的扩展语法。
[通过集中搜索,我找到了SO问题karma-typescript: import JS file with Async keyword。显然,这是一个带有因果类型脚本的open issue,尚处于打开状态(2-October-2019T16:30UT)。无需更改js文件,您可以设置karma-typescript的未记录属性。但是,这并不能使我更接近我所希望的解决方案!

回答个别问题

Q1:我想知道为什么业力会解析node_modules文件夹中的js文件?我在tsconfig.json中排除了它。

[[A1

:业力将测试脚本的依赖文件捆绑在浏览器中运行。在此过程中,tsconfig.json中引用的设置无关紧要。Q2:请帮助我确定哪个配置属性有问题!

[[A2

:对于此SO问题中引用的错误,是karmaTypescriptConfig.bundlerOptions.acorOptions接受JSON,并且可以在karma.conf.js中将其设置为 karmaTypescriptConfig: { bundlerOptions: { acornOptions: { ecmaVersion: 8, }, transforms: [require("karma-typescript-es6-transform")()] }

Q3:让我担心的问题-openid-client与业力测试运行程序不兼容吗?这样的限制可能吗?我没有在GitHub存储库中看到任何相应的问题。

[A3

:隐式是! -openid-client与karma不兼容,因为它在这种环境下使用浏览器,而node-openid-client在此类环境中为not supported,即使我通过注释注释克服了karma-typescript的挑战,我也无法将其与karma一起使用,使用基于浏览器的测试运行。或者,我可以将Mocha用作测试运行器框架而不是业力。我检查了; node-openid-client library themselves use mocha进行测试。摩卡(mocha)是nodejs的一等公民。
© www.soinside.com 2019 - 2024. All rights reserved.