            ;; doesn't really impact much here anyways
            :language-in :ecmascript-next
            :language-out :ecmascript5}
-          (dissoc js-options :resolve))
+          (dissoc js-options :resolve)
+          ;; always enable source-map, just skip emitting them later if desired
+          {:source-map true})
+
+        generate-source-map?
+        (not (false? (:source-map js-options)))
 
         property-collector
         (PropertyCollector. cc)


        co-opts
        (merge
          {:source-map true
           ;; :whitespace or :simple work but some patterns really require the DCE done by :simple
           ;; eg some conditional imports done by react&friends
           :optimizations :simple
           :pretty-print false
           :pseudo-names false
           ;; es6+ is transformed by babel first

                  (into #{} (remove removed-requires) deps)

                  output
                  (-> {:resource-id resource-id
                       :js js
                       :source (.getCode source-file)
                       :removed-requires removed-requires
                       :actual-requires actual-requires
                       :properties (into #{} (-> property-collector (.-properties) (.get name)))
                       :compiled-at (System/currentTimeMillis)}
                      (cond->
                        generate-source-map?
                        (assoc :source-map-json sm-json)))]

              (assoc-in state [:output resource-id] output)
              ))
