Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CJS + ESM Builds #1

Closed
BusinessDuck opened this issue Jun 8, 2022 · 20 comments
Closed

CJS + ESM Builds #1

BusinessDuck opened this issue Jun 8, 2022 · 20 comments

Comments

@BusinessDuck
Copy link

Для корректной работы требуется 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
Copy link
Owner

vitalets commented Jun 9, 2022

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

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

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

@BusinessDuck
Copy link
Author

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

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

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

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

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

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

@vitalets
Copy link
Owner

vitalets commented Jun 9, 2022

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

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

@BusinessDuck
Copy link
Author

BusinessDuck commented Jun 10, 2022

Попробовал мигрировать и куча проблем сразу вылезло
1 . TS не компилирует с расширением импорты import { foo } from './bar.js'
2. ts-node и pm2 если и смогут запустить то очень костыльно
3. Прочитал статью про интеграцию esm которую ты скидывал, там почти все пункты начинаются со слов "проблема с ..."

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

@vitalets
Copy link
Owner

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

vitalets added a commit that referenced this issue Jun 12, 2022
@vitalets
Copy link
Owner

vitalets commented Jun 12, 2022

Собрал версию с поддержкой 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
Copy link
Author

BusinessDuck commented Jun 12, 2022

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

@BusinessDuck
Copy link
Author

BusinessDuck commented Jun 12, 2022

Сейчас запушу ядро, там можно собрать в репозитории 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
Copy link
Author

BusinessDuck commented Jun 13, 2022

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

@vitalets
Copy link
Owner

Хотел вручную зареэкспортить все типы из Тинькофф, там тоже проблемка, т.к. есть дублирующиеся экспорты:
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
Copy link
Author

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

@vitalets
Copy link
Owner

vitalets commented Jun 13, 2022

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

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

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

@vitalets
Copy link
Owner

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

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

Тег тот же:

npm i tinkoff-invest-api@next

@BusinessDuck

@BusinessDuck
Copy link
Author

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
Copy link
Author

BusinessDuck commented Jun 13, 2022

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
Copy link
Author

Попробовал 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
Copy link
Owner

vitalets commented Jun 13, 2022

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

Если не использовать "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
Copy link
Author

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

@vitalets
Copy link
Owner

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

@vitalets
Copy link
Owner

Заодно завел тикет в @master-chief/alpaca alpacahq/alpaca-ts#106

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants