on master help sign in
switch to @replit/node-fetch if they try to import node-fetch 3 in cjs (#94)

* switch to node-fetch-commonjs if they try to import node-fetch 3 in cjs * yellow info * update to @replit/node-fetch * add yarn * respond to comments * update path to assets folder * fixed path; added tests * set docker version to overcome yarn install problem * yaml fix? * try diff docker version * try another way to up docker version * try wo yarn; blocked on getting it working on docker * Add node to nativeBuildInputs to get npm * added npm install * clean up * Update .gitignore Co-authored-by: Wade Bourne <47748690+AllAwesome497@users.noreply.github.com> * Update languages/nodejs/compile Co-authored-by: Wade Bourne <47748690+AllAwesome497@users.noreply.github.com> * Update test_files/require_node_fetch.js Co-authored-by: Wade Bourne <47748690+AllAwesome497@users.noreply.github.com> * Update tests/nodejs/node_fetch.exp Co-authored-by: Wade Bourne <47748690+AllAwesome497@users.noreply.github.com> * removed license * I think I can't remove the license * fixed test file * removed license Co-authored-by: Wade Bourne <47748690+AllAwesome497@users.noreply.github.com>

commit7aa75865a6e143c229d1c979f96803b57a58113c authorToby Ho <toby@repl.it> dateThu 18 Aug 2022, 16:51 (4 years ago) parent24a859a
12 files changed+139−3
.gitignore+2 build-prybar.nix+2−2 flake.nix+1 languages/nodejs/compile+8 prybar_assets/nodejs/module-context-hook.js+28 prybar_assets/nodejs/package.json+6 run_tests+4 run_tests_language+7−1 test_files/package-lock.json+50 test_files/package.json+14 test_files/require_node_fetch.js+3 tests/nodejs/node_fetch.exp+14
.gitignore+2
@@ -5,3 +5,5 @@ deps.lst
55prybar.tar.gz
66generated_*.go
77result*
8+prybar_assets/nodejs/node_modules
9+test_files/node_modules
build-prybar.nix+2−2
@@ -1,5 +1,5 @@
11{ language, buildInputs ? [ ], binaries ? [ ], setFlags ? false
2−, pkgName ? language }:
2+, pkgName ? language, nativeBuildInputs ? [ ] }:
33
44{ lib, buildGo117Module, fetchFromGitHub, bash, expect, pkg-config, runCommand, git
55, python3, copyPathToStore, rev, makeWrapper }:
@@ -11,7 +11,7 @@ buildGo117Module {
1111 src = ./.;
1212
1313 inherit buildInputs;
14− nativeBuildInputs = [ pkg-config makeWrapper ];
14+ nativeBuildInputs = [ pkg-config makeWrapper ] ++ nativeBuildInputs;
1515
1616 subPackages = [ "languages/${language}" ];
1717
flake.nix+1
@@ -35,6 +35,7 @@
3535
3636 prybar-nodejs = buildPrybar {
3737 language = "nodejs";
38+ nativeBuildInputs = [ pkgs.nodejs-12_x ];
3839 binaries = [ pkgs.nodejs-12_x ];
3940 };
4041
languages/nodejs/compilenew file+8
@@ -0,0 +1,8 @@
1+#!/bin/sh
2+
3+set -e
4+
5+NODEJS_LANGUAGE_DIR="$(realpath $(dirname $0))"
6+PRYBAR_ROOT_DIR="$(dirname $(dirname "${NODEJS_LANGUAGE_DIR}"))"
7+
8+cd "${PRYBAR_ROOT_DIR}/prybar_assets/nodejs" && HOME="" npm install
prybar_assets/nodejs/module-context-hook.js+28
@@ -9,6 +9,32 @@ const nodeRepl = require('repl');
99const kReplitPrybarInit = Symbol.for('replit.prybar.init');
1010const kReplitPrybarEvalCode = Symbol.for('replit.prybar.eval.code');
1111const kReplitPrybarEvalFile = Symbol.for('replit.prybar.eval.file');
12+let moduleMode = null;
13+const assets_dir =
14+ process.env.PRYBAR_ASSETS_DIR || path.join(process.cwd(), 'prybar_assets');
15+
16+const originalFindPath = Module._findPath;
17+Module._findPath = function(request, paths, isMain) {
18+ if (moduleMode === "cjs" && request === 'node-fetch') {
19+ // Because node-fetch version >= 3 doesn't support commonjs, we'll switch to
20+ // @replit/node-fetch if it comes to that
21+ const result = originalFindPath(request, paths, isMain);
22+ const dir = path.dirname(result);
23+ const packageJson = require(path.join(dir, "..", "package.json"));
24+ const [major] = packageJson.version.split(".").map(Number);
25+ if (major >= 3) {
26+ // Switch to @replit/node-fetch
27+ console.log("\u001b[33mAuto-switching node-fetch to @replit/node-fetch for cjs support\u001b[0m");
28+
29+ return path.join(assets_dir, "nodejs/node_modules/@replit/node-fetch/index.js");
30+ }
31+
32+ return result;
33+ } else {
34+
35+ return originalFindPath(request, paths, isMain);
36+ }
37+}
1238
1339/**
1440 * The footer we append at the end of files to run the code we want in the scope of the module its appended to.
@@ -194,9 +220,11 @@ function runModule(moduleName, isInteractive) {
194220 }
195221
196222 try {
223+ moduleMode = "cjs";
197224 require(absPath);
198225 } catch (e) {
199226 if (e.code === 'ERR_REQUIRE_ESM') {
227+ moduleMode = "esm";
200228 import(absPath);
201229 } else {
202230 throw e;
prybar_assets/nodejs/package.jsonnew file+6
@@ -0,0 +1,6 @@
1+{
2+ "name": "@replit/prybar-assets",
3+ "dependencies": {
4+ "@replit/node-fetch": "^3.1.0"
5+ }
6+}
run_tests+4
@@ -11,6 +11,10 @@ for t in ${tests}; do
1111
1212 if [[ $t == 'nodejs' ]]; then
1313 go test ./tests/nodejs
14+
15+ cd test_files
16+ npm install
17+ cd ..
1418 fi
1519
1620 continue
run_tests_language+7−1
@@ -7,6 +7,12 @@ language=$1
77expect_path=$2
88tests=$(find "./tests/${language}" ! -name '*.go' -printf '%P\n')
99
10+if [[ $language == 'nodejs' ]]; then
11+ cd test_files
12+ npm install
13+ cd ..
14+fi
15+
1016for t in ${tests}; do
1117 if [[ $t != *.exp ]]; then
1218 echo "$t:"
@@ -29,7 +35,7 @@ for t in ${tests}; do
2935 echo -e " \e[32m✓\e[0m $name"
3036done
3137
32−if [[ $language == 'nodejs' && $DISABLE_GO_TESTS != 1 ]]; then
38+if [[ $language == 'nodejs' && $DISABLE_GO_TESTS != 1 ]]; then
3339 echo running go tests
3440 go test ./tests/nodejs
3541fi
test_files/package-lock.jsonnew file+50
@@ -0,0 +1,50 @@
1+{
2+ "name": "test_files",
3+ "version": "1.0.0",
4+ "lockfileVersion": 1,
5+ "requires": true,
6+ "dependencies": {
7+ "data-uri-to-buffer": {
8+ "version": "4.0.0",
9+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
10+ "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA=="
11+ },
12+ "fetch-blob": {
13+ "version": "3.2.0",
14+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
15+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
16+ "requires": {
17+ "node-domexception": "^1.0.0",
18+ "web-streams-polyfill": "^3.0.3"
19+ }
20+ },
21+ "formdata-polyfill": {
22+ "version": "4.0.10",
23+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
24+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
25+ "requires": {
26+ "fetch-blob": "^3.1.2"
27+ }
28+ },
29+ "node-domexception": {
30+ "version": "1.0.0",
31+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
32+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
33+ },
34+ "node-fetch": {
35+ "version": "3.2.10",
36+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz",
37+ "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==",
38+ "requires": {
39+ "data-uri-to-buffer": "^4.0.0",
40+ "fetch-blob": "^3.1.4",
41+ "formdata-polyfill": "^4.0.10"
42+ }
43+ },
44+ "web-streams-polyfill": {
45+ "version": "3.2.1",
46+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
47+ "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q=="
48+ }
49+ }
50+}
test_files/package.jsonnew file+14
@@ -0,0 +1,14 @@
1+{
2+ "name": "test_files",
3+ "version": "1.0.0",
4+ "description": "",
5+ "main": "global_bug.js",
6+ "scripts": {
7+ "test": "echo \"Error: no test specified\" && exit 1"
8+ },
9+ "keywords": [],
10+ "author": "",
11+ "dependencies": {
12+ "node-fetch": "^3.2.10"
13+ }
14+}
test_files/require_node_fetch.jsnew file+3
@@ -0,0 +1,3 @@
1+const fetch = require('node-fetch');
2+
3+console.log('ok');
tests/nodejs/node_fetch.expnew file+14
@@ -0,0 +1,14 @@
1+#!/usr/bin/expect -f
2+
3+set timeout -1
4+
5+spawn sh
6+send "export PRYBAR_ASSETS_DIR=\$PWD/prybar_assets\r"
7+send "cd test_files\r"
8+send "../prybar-nodejs -i require_node_fetch.js\r"
9+match_max 100000
10+expect -re {Node v\d+\.\d+.\d+ on (linux|darwin)}
11+expect -re {Auto\-switching}
12+expect -re {ok}
13+expect -exact "\[0m\[90mHint: hit control+c anytime to enter REPL.\[0m\r
14+\[1G\[0J--> \[5G"