denoland / deno

A modern runtime for JavaScript and TypeScript.
https://deno.com
MIT License
94.53k stars 5.25k forks source link

Cannot import knex via npm specifier #16495

Open akatechis opened 1 year ago

akatechis commented 1 year ago

Specifically, I'm attempting to import knex via "npm:knex@2.3.0", and I suspect the issue is native modules. Not sure if there's an existing issue for that, or if it's even planned to support such packages that depend on native modules, but here goes.

In the output below, it breaks trying to install sqlite3 which according to its README, is a C++ addon for node (https://github.com/TryGhost/node-sqlite3/blob/master/README.md#features)

Repro Example

// knexample.ts
import { knex } from "npm:knex@2.3.0";

const q = knex("postgres").queryBuilder()
  .select("*")
  .table("users")
  .where({ name: "alex" })
  .toQuery();

console.log(q);
$ deno run --unstable -A knexample.ts

Output

Knex: run
$ npm install sqlite3 --save
Cannot find module 'sqlite3'
Require stack:
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\dialects\sqlite3\index.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\dialects\index.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\knex-builder\internal\config-resolver.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\knex-builder\Knex.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\index.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\knex.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\knex.js
Error: Cannot find module 'sqlite3'
Require stack:
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\dialects\sqlite3\index.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\dialects\index.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\knex-builder\internal\config-resolver.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\knex-builder\Knex.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\index.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\knex.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\knex.js
    at Function.Module._resolveFilename (deno:ext/node/02_require.js:613:17)
    at Function.Module._load (deno:ext/node/02_require.js:445:29)
    at Module.require (deno:ext/node/02_require.js:656:21)
    at require (deno:ext/node/02_require.js:790:18)
    at Client_SQLite3._driver (file:///C:/Users/Alexandros/AppData/Local/deno/npm/registry.npmjs.org/knex/2.3.0/lib/dialects/sqlite3/index.js:42:12)
    at Client_SQLite3.initializeDriver (file:///C:/Users/Alexandros/AppData/Local/deno/npm/registry.npmjs.org/knex/2.3.0/lib/client.js:190:26)
    at new Client (file:///C:/Users/Alexandros/AppData/Local/deno/npm/registry.npmjs.org/knex/2.3.0/lib/client.js:75:12)
    at new Client_SQLite3 (file:///C:/Users/Alexandros/AppData/Local/deno/npm/registry.npmjs.org/knex/2.3.0/lib/dialects/sqlite3/index.js:22:5)
    at Function.knex (file:///C:/Users/Alexandros/AppData/Local/deno/npm/registry.npmjs.org/knex/2.3.0/lib/knex-builder/Knex.js:16:28)
    at file:///C:/Users/Alexandros/workspace/boxesandlines/knexample.ts:3:16
error: Uncaught Error: Knex: run
$ npm install sqlite3 --save
Cannot find module 'sqlite3'
Require stack:
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\dialects\sqlite3\index.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\dialects\index.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\knex-builder\internal\config-resolver.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\knex-builder\Knex.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\lib\index.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\knex.js
- C:\Users\Alexandros\AppData\Local\deno\npm\registry.npmjs.org\knex\2.3.0\knex.js
    at Client_SQLite3.initializeDriver (file:///C:/Users/Alexandros/AppData/Local/deno/npm/registry.npmjs.org/knex/2.3.0/lib/client.js:194:13)
    at new Client (file:///C:/Users/Alexandros/AppData/Local/deno/npm/registry.npmjs.org/knex/2.3.0/lib/client.js:75:12)
    at new Client_SQLite3 (file:///C:/Users/Alexandros/AppData/Local/deno/npm/registry.npmjs.org/knex/2.3.0/lib/dialects/sqlite3/index.js:22:5)
    at Function.knex (file:///C:/Users/Alexandros/AppData/Local/deno/npm/registry.npmjs.org/knex/2.3.0/lib/knex-builder/Knex.js:16:28)
    at file:///C:/Users/Alexandros/workspace/boxesandlines/knexample.ts:3:16
bartlomieju commented 1 year ago

Does sqlite3 require a "postinstall" script?

akatechis commented 1 year ago

It doesn't seem so:

  "scripts": {
    "build": "node-pre-gyp build",
    "build:debug": "node-pre-gyp build --debug",
    "install": "node-pre-gyp install --fallback-to-build",
    "pretest": "node test/support/createdb.js",
    "test": "mocha -R spec --timeout 480000",
    "pack": "node-pre-gyp package"
  }
dsherret commented 1 year ago

This is peer dependencies not being supported yet. I'm working on it this week.

dsherret commented 1 year ago

Actually, looking at the source here, it seems these peer dependencies are marked as optional, so Deno would never warn about them not being set. Also, I'm not sure why knex is trying to import sqlite when specifying postgres. I'm able to get further by adding an import for sqlite3 (import "npm:sqlite3@5";) and using a node_modules directory (--node-modules-dir), but then it errors because of #15611.

bombillazo commented 9 months ago

Any update on being able to run knex with deno?