vitalets / tinkoff-invest-api

Node.js SDK для работы с Tinkoff Invest API
45 stars 11 forks source link

CJS + ESM Builds #1

Closed BusinessDuck closed 2 years ago

BusinessDuck commented 2 years ago

Для корректной работы требуется 2 вида сборок, сконфигурируй сборщик по образу и подобию дебюта Используй в package.json что-то типо того, чтобы мог работать как require c commonjs так и модульная архитектура.

Пример настроек в package.json

  "main": "lib/index.js",
    "module": "lib/index.js",
    "types": "lib/index.d.ts",

более современный подход через exports тут https://antfu.me/posts/publish-esm-and-cjs

vitalets commented 2 years ago

Можно конечно собрать. А поделись детальнее, где у тебя не заводится, чтобы я смог проверить? В целом тренд на то, чтобы не поддерживать cjs. Это лишние артефакты, плюс потенциальный dual package hazard. Кажется, не осталось непреодолимых кейсов. А рано или поздно понадобится какой-нибудь node-fetch, который уже тоже esm only.

На счет pm2 я еще в 2020 у них в тикете проверял, что все работает (хотя ниже там в комментах не у всех работает и сам тикет открыт до сих пор).

Может попробуем дебют в esm завести?)

BusinessDuck commented 2 years ago

Можно конечно собрать.

А поделись детальнее, где у тебя не заводится, чтобы я смог проверить?

В целом тренд на то, чтобы не поддерживать cjs. Это лишние артефакты, плюс потенциальный dual package hazard. Кажется, не осталось непреодолимых кейсов. А рано или поздно понадобится какой-нибудь node-fetch, который уже тоже esm only.

На счет pm2 я еще в 2020 у них в тикете проверял, что все работает (хотя ниже там в комментах не у всех работает и сам тикет открыт до сих пор).

Может попробуем дебют в esm завести?)

попробую сегодня, теоретически это может и ускорить его даже

vitalets commented 2 years ago

попробую сегодня, теоретически это может и ускорить его даже

Давай. Ну если что cjs соберем конечно)

BusinessDuck commented 2 years ago

Попробовал мигрировать и куча проблем сразу вылезло 1 . TS не компилирует с расширением импорты import { foo } from './bar.js'

  1. ts-node и pm2 если и смогут запустить то очень костыльно
  2. Прочитал статью про интеграцию esm которую ты скидывал, там почти все пункты начинаются со слов "проблема с ..."

Увы это точно не продакшин уровень, не буду пока мигрировать, когда --experimental-modules заупстят, тогда можно начинать уже... Я же еще в браузере планировал запускаться, а там наверняка тоже боль с этим

vitalets commented 2 years ago

Ок, собираем cjs тогда!

vitalets commented 2 years ago

Собрал версию с поддержкой cjs. Установить можно через npm i tinkoff-invest-api@next Также надо обновить ts и vscode до последних версий.

Проблемы вылезли для subpath + wildcard, через который экспортятся все тиньковские типы.

Если в tsconfig.json оставить "moduleResolution": "node", то VSCode не видит package.exports и предлагает некорректные пути (а корректный tinkoff-invest-api/generated наоборот не предлагает): image

А если вручную исправить пути на tinkoff-invest-api/generated/marketdata, ts ругается, что типов не обнаружено: image Код не запускается.

Если в tsconfig.json поставить новый "moduleResolution": "nodenext", то VSCode вариантов вообще не предлагает: image

Зато код запускается :)

С не-subpath импортами все хорошо: image

Пишут, что поддержки subpath в ближайшее время не будет. Вот еще тикет в репе тайпскрипта.

Вобщем вариант просто ручками все тинькофф-типы ре-экспортить либо в package.exports, либо в отдельном файлике.

@BusinessDuck попробуй у себя эту версию. И напиши что как.

BusinessDuck commented 2 years ago

Получилось запустить, exports корректно не работают, пока лучше их вообще убрать (локально удалил их чтобы собралось), с ними не собирается финальный модуль в стратегиях уже, говорит что пути /dist/ в них не прописаны, поэтому к dist напрямую сходить не дает сборщик. Я бы пока просто убрал, потом можем быть сделать ручной экспорт отдельным обновлением.

BusinessDuck commented 2 years ago

Сейчас запушу ядро, там можно собрать в репозитории Strategies слинковать ядро так npm link @debut/community-core ../Core и поиграться запросами истории командой npm run compile && npm run testing -- --bot=FTBot --ticker=TSLA --days=10 --visualize. Token берется и доходит до сдк, не знаю в чем дело =(

Чтобы увидеть логи, нужно вот этот лог вынести из if, дебаг режима нету у debut =(

path: '/tinkoff.public.invest.api.contract.v1.InstrumentsService/GetInstrumentBy',
  code: 16,
  details: 'Authentication failed',
  trackingId: '5e02342fdc95b8c7528cbd8e1cdbe28b',
  envoyUpstreamServiceTime: '8',
  ratelimit: '200, 200;w=60',
  ratelimitRemaining: '199',
  ratelimitReset: '199'
BusinessDuck commented 2 years ago

Запросы истории заработали, перевыпустил токен, видимо со старым что-то не так было, Подписка на свечи тоже заработала, проверил выглядит хорошо все, сделки осталось проверить, это чуть позже

vitalets commented 2 years ago

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

Перечислять явно все типы совсем не хочется. Тогда остается вариант перечислить эти файлы в package.exports:

    "./marketdata": {
      "import": "./dist/generated/marketdata.js",
      "require": "./cjs/generated/marketdata.js"
    },

И тогда импорты будут выглядеть так:

import { CandleInterval } from 'tinkoff-invest-api/marketdata';

В принципе довольно лаконично получается. @BusinessDuck Что скажешь?

exports корректно не работают, пока лучше их вообще убрать

Ты имеешь ввиду вообще секцию exports убрать или только часть про Тинькофф типы?

BusinessDuck commented 2 years ago

если все как ты в последнем сообщении предложил заработает - то можно оставлять, сделай с таким перечислением релиз и я проверю. На моей стороне проблема была когда есть exports в package.json, а я импортирую из /dist/ директории, там ругался толи тайпскрипт толи нода сама.

vitalets commented 2 years ago

когда есть exports в package.json, а я импортирую из /dist/ директории, там ругался толи тайпскрипт толи нода сама

Да, это нода. Если есть exports, то можно импортить только то, что в exports. Сейчас соберу.

А ты когда exports удалил, то импортил пути напрямую tinkoff-invest-api/cjs/marketdata?

vitalets commented 2 years ago

Новая версия выехала. Импорты доступны так:

import { CandleInterval } from 'tinkoff-invest-api/marketdata';

Тег тот же:

npm i tinkoff-invest-api@next

@BusinessDuck

BusinessDuck commented 2 years ago
import { CandleInterval } from 'tinkoff-invest-api/marketdata';

Проверил, js действительно видит import и require из библиотеки, TypeScript же упорно не хочет компилироваться, ругаясь на то, что типов нет.


semantic error TS2307: Cannot find module 'tinkoff-invest-api/marketdata' or its corresponding type declarations.
BusinessDuck commented 2 years ago

4.7 TypeScript примерно такой синтаксис требует https://devblogs.microsoft.com/typescript/announcing-typescript-4-7-beta/#package-json-exports-imports-and-self-referencing

// package.json
{
    "name": "my-package",
    "type": "module",
    "exports": {
        ".": {
            // Entry-point for `import "my-package"` in ESM
            "import": {
                // Where TypeScript will look.
                "types": "./types/esm/index.d.ts",

                // Where Node.js will look.
                "default": "./esm/index.js"
            },
            // Entry-point for `require("my-package") in CJS
            "require": {
                // Where TypeScript will look.
                "types": "./types/commonjs/index.d.cts",

                // Where Node.js will look.
                "default": "./commonjs/index.cjs"
            },
        }
    },

    // Fall-back for older versions of TypeScript
    "types": "./types/index.d.ts",

    // CJS fall-back for older versions of Node.js
    "main": "./commonjs/index.cjs"
}

UPD: Руками попробовал прописать в package.json не взлетело =( Тебе нужен явно TS проект для тестирования ибо именно тайпскрипт капризничает, js чистый все ок

UPD2: Если не получится тайпскрипт завести на exports, то пока придется убрать exports вообще и жить с импортами из dist . Большинство проектов думаю на тайпскрипте делаются тк там черт ногу сломит в типах возвращаемых из API данных

BusinessDuck commented 2 years ago

Попробовал typescript 4.7 и даже так npm install typescript@beta, руками прописал в package.json все что нужно и не завелось

error TS2307: Cannot find module 'tinkoff-invest-api/marketdata' or its corresponding type declarations.

7 import { CandleInterval } from 'tinkoff-invest-api/marketdata';
vitalets commented 2 years ago

Резюмирую сюда, что обсудили в тг.

Если не использовать "module": "NodeNext", тогда ts ругается на tinkoff-invest-api

Cannot find module 'tinkoff-invest-api/marketdata' or its corresponding type declarations.

Если использовать "module": "NodeNext", тогда ts ругается на другие библиотеки, например @master-chief/alpaca:

temp/test.ts:2:49 - error TS7016: Could not find a declaration file for module '@master-chief/alpaca'. '.../node_modules/@master-chief/alpaca/dist/cjs/index.cjs' implicitly has an 'any' type.
  Try `npm i --save-dev @types/master-chief__alpaca` if it exists or add a new declaration (.d.ts) file containing `declare module '@master-chief/alpaca';`

import { Bar, AlpacaClient, AlpacaStream } from '@master-chief/alpaca';

Кажется у них проблема в том, что генерятся cjs и для них тайпинги должны лежать в d.cts а не d.ts, либо нужно указать types внутри exports.require. В любом случае таких либ может быть много.

Решили совсем убрать package.exports и оставить только main и module. Соответственно импорты в cjs будут такие:

import { TinkoffInvestApi } from 'tinkoff-invest-api';
import { CandleInterval } from 'tinkoff-invest-api/cjs/generated/marketdata';

Выложил версию, @BusinessDuck проверяй :)

BusinessDuck commented 2 years ago

Все работает, можно релизить ;)

vitalets commented 2 years ago

Зарелизил 4.0.0 с поддержкой cjs.

vitalets commented 2 years ago

Заодно завел тикет в @master-chief/alpaca https://github.com/117/alpaca/issues/106