import glob import os import subprocess import warnings from os import path from pathlib import Path from typing import Any, List, NamedTuple, Optional LNBITS_PATH = path.dirname(path.realpath(__file__)) + "/lnbits" def get_js_vendored(prefer_minified: bool = False) -> List[str]: paths = get_vendored(".js", prefer_minified) def sorter(key: str): if "moment@" in key: return 1 if "vue@" in key: return 2 if "vue-router@" in key: return 3 if "polyfills" in key: return 4 return 9 return sorted(paths, key=sorter) def get_css_vendored(prefer_minified: bool = False) -> List[str]: paths = get_vendored(".css", prefer_minified) def sorter(key: str): if "quasar@" in key: return 1 if "vue@" in key: return 2 if "chart.js@" in key: return 100 return 9 return sorted(paths, key=sorter) def get_vendored(ext: str, prefer_minified: bool = False) -> List[str]: paths: List[str] = [] for path in glob.glob( os.path.join(LNBITS_PATH, "static/vendor/**"), recursive=True ): if path.endswith(".min" + ext): # path is minified unminified = path.replace(".min" + ext, ext) if prefer_minified: paths.append(path) if unminified in paths: paths.remove(unminified) elif unminified not in paths: paths.append(path) elif path.endswith(ext): # path is not minified minified = path.replace(ext, ".min" + ext) if not prefer_minified: paths.append(path) if minified in paths: paths.remove(minified) elif minified not in paths: paths.append(path) return sorted(paths) def url_for_vendored(abspath: str) -> str: return "/" + os.path.relpath(abspath, LNBITS_PATH) def transpile_scss(): with warnings.catch_warnings(): warnings.simplefilter("ignore") from scss.compiler import compile_string # type: ignore with open(os.path.join(LNBITS_PATH, "static/scss/base.scss")) as scss: with open(os.path.join(LNBITS_PATH, "static/css/base.css"), "w") as css: css.write(compile_string(scss.read())) def bundle_vendored(): for getfiles, outputpath in [ (get_js_vendored, os.path.join(LNBITS_PATH, "static/bundle.js")), (get_css_vendored, os.path.join(LNBITS_PATH, "static/bundle.css")), ]: output = "" for path in getfiles(): with open(path) as f: output += "/* " + url_for_vendored(path) + " */\n" + f.read() + ";\n" with open(outputpath, "w") as f: f.write(output) def build(): transpile_scss() bundle_vendored() if __name__ == "__main__": build()