#lang scheme/base
(require "../../base.ss")
(require (for-syntax scheme/base
(unlib-in debug syntax))
"../javascript.ss"
"../javascript-registry.ss")
(define-for-syntax (extract-requires stx)
(let loop ([stx stx] [req-accum null] [stmt-accum null])
(syntax-case* stx (require) symbolic-identifier=?
[((require arg ...) req+stmt ...)
(loop #'(req+stmt ...)
(cons #'(require arg ...) req-accum)
stmt-accum)]
[(stmt req+stmt ...)
(loop #'(req+stmt ...)
req-accum
(cons #'stmt stmt-accum))]
[() #`(#,(reverse req-accum)
#,(reverse stmt-accum))])))
(define-syntax (module-begin stx)
(syntax-case stx ()
[(module-begin) #'(#%plain-module-begin (begin #f))]
[(module-begin req+stmt ...)
(with-syntax ([script (datum->syntax stx 'script)]
[((require ...) (stmt ...))
(extract-requires #'(req+stmt ...))])
#'(#%plain-module-begin
require ...
(define script (js stmt ...))
(display (javascript->pretty-string script))
(registry-add! script)
(provide script)))]))
(provide (rename-out [module-begin #%module-begin])
(except-out (all-from-out scheme/base) #%module-begin))