Как сделать модули узлов доступными в REPL Purescript? - PullRequest
0 голосов
/ 30 июня 2019

Можно ли сделать все модули узла доступными при работе через pulp repl?Кажется, что некоторые работают только при вызове через pulp run

Я следую примеру в Книге Purescript: https://github.com/paf31/purescript-book/blob/master/text/chapter12.md

exports.fooImpl = function(onSuccess, onFailure) {
    return function() {
        require('some-lib').doThing(function(error, data) {
            if (error) onFailure(error.code)()
            else onSuccess(data)();
        }

    }
}

Определения Purescript:

foreign import fooImpl
  :: Fn2 
      (String -> Effect Unit)
      (ErrorCode -> Effect Unit)
      (Effect Unit)

foo:: (Either ErrorCode String -> Effect Unit) -> Effect Unit
foo path k =
  runFn3 readFileImpl
         path
         (k <<< Right)
         (k <<< Left)

Теперь, если я прыгну в REPL

pulp repl 

и при попытке вызвать мою функцию я получаю сообщение об ошибке при попытке вызвать нужную библиотеку..xxx is not a function

Однако, если я запускаю через pulp run, все работает, как ожидалось, и функция библиотеки узла вызывается без проблем.

Точно так же, если я запускаю repl узла и вызываю библиотеку напрямую, у меня тоже не возникает проблем.

Интересно, что не все библиотеки узлов имеют эту проблему.Встроенные модули, такие как fs, работают нормально, но у сторонних есть проблемы в репле.

Есть ли способ сделать эти библиотеки доступными при работе в REPL?

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Я считаю, что это ошибка пользователя, вызвавшая конфликт имен

Редактировать:

Теперь я понимаю, что это обусловлено исключительно моим именем module .Пока это не конфликтует с библиотекой node_modules, все выглядит хорошо.

Значение, даже если вы непосредственно скрываете имена в файловой системе.Например,

npm install SomeLibrary
node_modules/SomeLibrary/

И иметь структуру каталогов purescript, которая отражает имя

src/SomeLibrary/SomeLibrary.js
src/SomeLibrary/SomeLibrary.purs
src/main

Пока имя module внутри файла Pursне соответствует имени библиотеки node_modules 1: 1, все будет хорошо

module SomeLibraryPurescript where ... 

A-OK.Принимая во внимание, что

module SomeLibrary where ...

терпит неудачу

Я создал файловую структуру в purescript, которая скрывала имя node_modules.

src/MyLibrary/MyLibrary.js
src/MyLibrary/MyLibrary.purs
src/Main.purs 

Когда purescript заполняет .psci_modules, он вытягивает мой модуль MyLibrary, что, похоже, не позволяет ему найти фактический node_modules.

Я исправил это,

  1. , очистив каталоги output/ и .psci_modules/
  2. , переместив библиотеку, которую я пытался обернуть с помощью FFI, в Data/ directory
  3. pulp repl

Результирующая структура каталогов:

0 голосов
/ 01 июля 2019

У вас есть воспроизводимый пример? Меня устраивает. Я буду использовать https://github.com/nonbili/purescript-msgpack-msgpack в качестве примера. Запустите pulp repl в каталоге репо.

PSCi, version 0.12.5
Type :? for help

> import Msgpack
> encode' { x: 1 }
"¡x\1"

Реализация encode' - это

-- Msgpack.purs
foreign import encodeToString_ :: Json -> String
encode' :: forall a. EncodeJson a => a -> String
encode' = encodeToString_ <<< encodeJson

// Msgpack.js
var msgpack = require("@msgpack/msgpack");

exports.encodeToString_ = function(json) {
  return uint8ArrayToString(msgpack.encode(json));
};
...