karmajs не запускается, когда node-openid-client импортируется в файл спецификации машинописи - PullRequest
0 голосов
/ 02 октября 2019

Я использую node-openid-client для выполнения аутентификации на основе OpenIDConnect с поставщиком OpenID.

Я столкнулся с проблемами при попытке написать контрольные примеры для этой программы. Когда приложение запускается из узла 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

Это журналы, созданныеКарма при запуске с LOG_DEBUG конфигурацией.

Я не использую Angular или какие-либо другие фреймворки пользовательского интерфейса .

У меня есть несколько вопросов, основанных на этих ошибках -

Q1 : Интересно, почему karma анализирует файл js в папке node_modules? Я исключаю это в tsconfig.json.

На основании действий, выполненных до ошибки, я замечаю, что не удается связать необходимые файлы библиотеки openid-client. Тем не менее, если я запустил пакет browserify для этой библиотеки, это будет успешно. Я думаю, что я сделал некоторые настройки неправильно в любом из файлов, перечисленных ниже.

Q2 : Пожалуйста, помогите мне, как определить, какое свойство конфигурации является ошибочным! , иначе само решение будет высоко ценится!

Q3 : Меня беспокоит вопрос - Разве openid-client не совместим с бегуном по карма-тесту? Возможно ли такое ограничение? Я не увидел ни одной соответствующей проблемы в репозитории GitHub.

Ниже приведены интересующие файлы, которые я продолжал редактировать, чтобы обойти эту ошибку. Тем не менее, я думаю, что сейчас попал в стену.

Чтобы сфокусироваться на проблеме и посмотреть в черно-белых тонах, является ли openid-client причиной проблемы, я ввел минимальный тест-кейс, ориентированный на среду жасмина. ,Спецификация выглядит следующим образом -

probe.spec.ts file

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

Теперь во время эксперимента я удалил импорт в первой строке. Если это сделано;Карма запускает и сообщает, что тестовый случай был успешным!

Зависимости (включая dev) для 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
  })
}

1 Ответ

0 голосов
/ 02 октября 2019

Кажется, я выяснил (со средним уровнем доверия) ответы на мои вопросы. Попросите сообщество проголосовать, если это достаточно правдоподобный ответ.

TL; DR - кармаскрипт имеет известное ограничение , которое является причиной ошибки. Даже без плагина машинописного текста;Также ожидается, что node-openid-client не будет работать в браузере с 2 октября по 2019T16: 30UT. Итак, да, я не могу использовать нод-открытый-клиент с кармой (который не может работать без браузера , даже с настоящего момента (2 октября-2019T16: 30UT)). Жизнеспособный альтернативный должен использовать мокко вместо кармы.

Подробности для вышеупомянутого заключения

Файл ошибка.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-open-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 Issue.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 иНепосредственный вопрос заключается в том, поддерживается ли ключевое слово async в процессе (com / trans) пилотирования?

Чтобы проверить эту гипотезу, я удалил ключевое слово async и заметил, что местоположение ошибки перемещено в следующее вхождение async.

Я не смог найти много ошибок в библиотеке node-openid-client. Но в плагине karma-typcript во время объединения файлов происходит что-то ужасное. Поиск в их хранилище дает мало подсказок. В котором я узнал о конфигурации, которая могла вызвать проблему.

Файл configuration.ts область вокруг строки 113 выглядит следующим образом -

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

Если я изменю эту версию ecmaVersion 7 прямо здесь, влокальная копия, присутствующая в папке node_modules, проблема была решена, но я застрял в другой ошибке, но на этот раз с распространенным синтаксисом для массивов.

При сфокусированном поиске я наткнулся на вопрос SO karma-машинопись: импортировать файл JS с ключевым словом Async . По-видимому, это открытый выпуск с кармаскриптом, который еще находится в открытом состоянии (2 октября 2019T16: 30UT). Вместо изменения js-файла вы можете установить недокументированное свойство karma-typcript. Однако это не приближает меня к желаемому решению!

Отвечая на отдельные вопросы

Q1: Интересно, почему карма анализирует файл js в папке node_modules? Я исключаю это в tsconfig.json.

A1 : karma связывает зависимые файлы для сценария тестирования, который будет запущен в браузере ,В этом процессе настройка, упомянутая в tsconfig.json, не имеет значения.

Q2: Пожалуйста, помогите мне определить, какое свойство конфигурации является ошибочным!

A2 : Для ошибки, указанной в этом вопросе SO, karmaTypescriptConfig.bundlerOptions.acorOptions принимает JSON, и его можно установить в файле karma.conf.js как

    karmaTypescriptConfig: {
        bundlerOptions: {
            acornOptions: {
            ecmaVersion: 8,
        },
        transforms: [require("karma-typescript-es6-transform")()]
    }

В3: Меня беспокоит вопрос: неужели openid-клиент не совместим с бегуном на карме? Возможно ли такое ограничение? Я не увидел ни одной соответствующей проблемы в репозитории GitHub.

A3 : неявно да! - openid-client не совместим с кармой, потому что он использует браузер, а node-openid-client не поддерживается для таких сред, даже если я преодолею вызов с помощью karma-typcript, комментируя его, я не смогуиспользуйте его с кармой, которая использует браузерный запуск тестов.

В качестве альтернативы я мог бы использовать mocha в качестве фреймворка для запуска тестов вместо кармы. Я проверил; Библиотека node-openid-client сама использует mocha для тестирования. Мокко - гражданин первого класса для nodejs.

...