Skip to content

Commit 2953bdc

Browse files
committed
REPL state
1 parent 7225a1d commit 2953bdc

File tree

5 files changed

+72
-59
lines changed

5 files changed

+72
-59
lines changed

bb/node_repl_tests.clj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141
(deftest refer-test
4242
(is (str/includes? (:out (repl "(ns foo (:require [\"fs\" :refer [existsSync]])) (existsSync \"README.md\")")) "true")))
4343

44+
(deftest repl-api-test
45+
(let [out (:out (p/shell {:out :string} "node test-resources/js_api.mjs"))]
46+
(is (= ["1" "1"] (str/split-lines out)))))
47+
4448
(defn run-tests [_]
4549
(let [{:keys [fail error]}
4650
(t/run-tests 'node-repl-tests)]

index.html

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,13 @@
7575
let urlParams = new URLSearchParams(window.location.search);
7676
var repl = JSON.parse(urlParams.get('repl'));
7777

78+
let compilerState = null;
79+
console.log(compilerState);
7880
let evalCode = async (code) => {
7981
try {
80-
let js = compileString(`(do ${code}\n)`, {repl: repl, "elide-exports": repl, context: repl ? 'return' : 'statement'});
82+
let opts = {repl: repl, "elide-exports": repl, context: repl ? 'return' : 'statement'};
83+
compilerState = compileStringEx(`(do ${code}\n)`, opts, compilerState);
84+
let js = compilerState.javascript;
8185
if (dev) {
8286
js = js.replace('squint-cljs/core.js', 'http://' + window.location.host + '/core.js');
8387
}
@@ -195,7 +199,7 @@
195199
squintUrl = 'squint-cljs';
196200
}
197201
var squint = await(import(squintUrl));
198-
var compileString = squint.compileString;
202+
var compileStringEx = squint.compileStringEx;
199203
window.compile = () => {
200204
let code = editor.state.doc.toString();
201205
code = '' + boilerplateSrc + '\n\n' + code;

index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export { compileString } from './lib/compiler.js'
1+
export * from './lib/compiler.js';

shadow-cljs.edn

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
:output-dir "lib"
1111
:modules
1212
{:compiler {:exports
13-
{compileString squint.compiler/compile-string}}
13+
{compileString squint.compiler/compile-string
14+
compileStringEx squint.compiler/compileStringEx}}
1415
;; this is necessary to move fs, path to a common node module instead of to compiler
1516
:node {:entries [] :depends-on #{:compiler}}
1617
:compiler.sci {:depends-on #{:compiler :compiler.node :node}

src/squint/compiler.cljc

Lines changed: 59 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -396,73 +396,77 @@
396396

397397
(defn compile-string*
398398
([s] (compile-string* s nil))
399+
([s opts] (compile-string* s opts nil))
399400
([s {:keys [elide-exports
400401
elide-imports
401402
core-alias
402403
aliases]
403404
:or {core-alias "squint_core"}
404-
:as opts}]
405-
(binding [cc/*core-package* "squint-cljs/core.js"
406-
cc/*target* :squint
407-
*jsx* false
408-
cc/*repl* (:repl opts cc/*repl*)]
409-
(let [opts (merge {:ns-state (atom {})} opts)
410-
imported-vars (atom {})
411-
public-vars (atom #{})
412-
aliases (atom (merge aliases {core-alias cc/*core-package*}))
413-
imports (atom (if cc/*repl*
414-
(format "var %s = await import('%s');\n"
415-
core-alias cc/*core-package*)
416-
(format "import * as %s from '%s';\n"
417-
core-alias cc/*core-package*)))]
418-
(binding [*imported-vars* imported-vars
419-
*public-vars* public-vars
420-
*aliases* aliases
421-
*jsx* false
422-
*excluded-core-vars* (atom #{})
423-
*cljs-ns* *cljs-ns*
424-
cc/*target* :squint
425-
cc/*async* (:async opts)]
426-
(let [transpiled (transpile-string* s (assoc opts
427-
:core-alias core-alias
428-
:imports imports))
429-
imports (when-not elide-imports @imports)
430-
exports (when-not elide-exports
431-
(str
432-
(when-let [vars (disj @public-vars "default$")]
433-
(when (seq vars)
434-
(str (format "\nexport { %s }\n"
435-
(str/join ", " vars)))))
436-
(when (contains? @public-vars "default$")
437-
"export default default$\n")))]
438-
{:imports imports
439-
:exports exports
440-
:body transpiled
441-
:javascript (str imports transpiled exports)
442-
:jsx *jsx*
443-
:ns *cljs-ns*}))))))
405+
:as opts} state]
406+
(let [opts (merge state opts)]
407+
(binding [cc/*core-package* "squint-cljs/core.js"
408+
cc/*target* :squint
409+
*jsx* false
410+
cc/*repl* (:repl opts cc/*repl*)]
411+
(let [opts (merge {:ns-state (atom {})} opts)
412+
imported-vars (atom {})
413+
public-vars (atom #{})
414+
aliases (atom (merge aliases {core-alias cc/*core-package*}))
415+
imports (atom (if cc/*repl*
416+
(format "var %s = await import('%s');\n"
417+
core-alias cc/*core-package*)
418+
(format "import * as %s from '%s';\n"
419+
core-alias cc/*core-package*)))]
420+
(binding [*imported-vars* imported-vars
421+
*public-vars* public-vars
422+
*aliases* aliases
423+
*jsx* false
424+
*excluded-core-vars* (atom #{})
425+
*cljs-ns* (:ns opts *cljs-ns*)
426+
cc/*target* :squint
427+
cc/*async* (:async opts)]
428+
(let [transpiled (transpile-string* s (assoc opts
429+
:core-alias core-alias
430+
:imports imports))
431+
imports (when-not elide-imports @imports)
432+
exports (when-not elide-exports
433+
(str
434+
(when-let [vars (disj @public-vars "default$")]
435+
(when (seq vars)
436+
(str (format "\nexport { %s }\n"
437+
(str/join ", " vars)))))
438+
(when (contains? @public-vars "default$")
439+
"export default default$\n")))]
440+
(assoc opts
441+
:imports imports
442+
:exports exports
443+
:body transpiled
444+
:javascript (str imports transpiled exports)
445+
:jsx *jsx*
446+
:ns *cljs-ns*
447+
:ns-state (:ns-state opts)))))))))
448+
449+
#?(:cljs
450+
(defn clj-ize-opts [opts]
451+
(cond-> opts
452+
(:context opts) (update :context keyword)
453+
(:ns opts) (update :ns symbol)
454+
(:elide_imports opts) (assoc :elide-imports (:elide_imports opts))
455+
(:elide_exports opts) (assoc :elide-exports (:elide_exports opts)))))
456+
457+
#?(:cljs
458+
(defn compileStringEx [s opts state]
459+
(let [opts (js->clj opts :keywordize-keys true)
460+
state (js->clj state :keywordize-keys true)]
461+
(clj->js (compile-string* s (clj-ize-opts opts) (clj-ize-opts state))))))
444462

445463
(defn compile-string
446464
([s] (compile-string s nil))
447465
([s opts]
448466
(let [opts #?(:cljs (if (object? opts)
449-
(cond-> (js->clj opts :keywordize-keys true)
450-
:context (update :context keyword))
467+
(clj-ize-opts opts)
451468
opts)
452469
:default opts)
453470
{:keys [javascript]}
454471
(compile-string* s opts)]
455472
javascript)))
456-
457-
#_(defn compile! [s]
458-
(prn :s s)
459-
(let [expr (e/parse-string s {:row-key :line
460-
:col-key :column
461-
:end-location false})
462-
compiler-env (ana-api/empty-state)]
463-
(prn :expr expr (meta expr))
464-
(binding [cljs.env/*compiler* compiler-env
465-
ana/*cljs-ns* 'cljs.user]
466-
(let [analyzed (ana/analyze (ana/empty-env) expr)]
467-
(prn (keys analyzed))
468-
(prn (compiler/emit-str analyzed))))))

0 commit comments

Comments
 (0)