{"version":3,"sources":["tailwindcss.ts"],"sourcesContent":["import { UIX } from \"../../uix.ts\";\nimport type { Theme } from \"../base/theme-manager.ts\";\nimport { Path } from \"datex-core-legacy/utils/path.ts\";\nimport { Logger } from \"datex-core-legacy/utils/logger.ts\";\nimport { getBaseDirectory, getOS } from \"../utils/uix-base-directory.ts\";\nimport { KnownError, handleError } from \"datex-core-legacy/utils/error-handling.ts\";\nimport { registerBuildLock } from \"../app/build-lock.ts\";\n\nexport const tailwindcss = {\n\tname: 'tailwindcss',\n\tstylesheets: [\n\t\tUIX.cacheDir.getChildPath(\"tailwind-styles.css\")\n\t],\n\tasync onRegister() {\n\t\tconst { app } = await import(\"../app/app.ts\" /*lazy*/);\n\t\tconst { watch, watch_backend, live } = await import(\"../app/args.ts\" /*lazy*/);\n\t\tconst logger = new Logger(\"tailwindcss\")\n\n\t\t// install tailwindcss via GitHub Releases if not available\n\t\tconst executableTarget = getBaseDirectory().getChildPath(\"tailwindcss\");\n\t\tlet tailwindCssCmd = \"tailwindcss\"\n\t\tlet cmdAvailable = commandExists(tailwindCssCmd);\n\t\tif (!cmdAvailable) {\n\t\t\ttailwindCssCmd = executableTarget.normal_pathname\n\t\t\tcmdAvailable = commandExists(tailwindCssCmd);\n\t\t}\n\n\t\tif (!cmdAvailable)\n\t\t\tawait installTailwind4(executableTarget, logger);\n\n\t\t// check if v4 is installed\n\t\tlet version = await getCurrentTailwindVersion(tailwindCssCmd);\n\n\t\t// check version of self-installed tailwindcss\n\t\tif (!version.includes(\"v4\")) {\n\t\t\ttailwindCssCmd = executableTarget.normal_pathname\n\t\t\tversion = await getCurrentTailwindVersion(tailwindCssCmd);\n\t\t}\n\t\t\n\t\tif (!version.includes(\"v4\")) {\n\t\t\tlogger.warn(\"Detected outdated version \" + version + \" - installing TailwindCSS v4\");\n\t\t\tawait installTailwind4(executableTarget, logger);\n\t\t\tversion = await getCurrentTailwindVersion(tailwindCssCmd);\n\t\t}\n\n\t\tconst outFile = new Path(this.stylesheets![0]);\n\t\tconst inFile = new Path(app.base_url).getChildPath(\"tailwind.css\");\n\n\t\tif (!inFile.fs_exists) {\n\t\t\tDeno.writeTextFileSync(inFile.normal_pathname, \"@import 'tailwindcss';\")\n\t\t}\n\t\tlogger.info(\"using\", version);\n\n\t\ttry {\n\t\t\tconst args =  [\n\t\t\t\t\"-i\",\n\t\t\t\tinFile.normal_pathname,\n\t\t\t\t\"-o\",\n\t\t\t\toutFile.normal_pathname\n\t\t\t]\n\t\t\tif (watch || watch_backend || live) {\n\t\t\t\tlogger.info(\"watching files\");\n\t\t\t\targs.push(\"--watch\");\n\t\t\t}\n\n\t\t\tconst status = new Deno.Command(tailwindCssCmd, {args, stderr: \"piped\", stdout: \"piped\"}).spawn();\n\t\t\tconst decoder = new TextDecoder();\n\t\t\tlet resolver: (() => void) | undefined = undefined;\n\t\t\tlet isResolved = false;\n\n\t\t\tfor await (const data of status.stderr) {\n\t\t\t\tconst out = decoder.decode(data);\n\t\t\t\tif (out.includes(\"Done in\")) {\n\t\t\t\t\tlogger.success(\"finished building\");\n\t\t\t\t\tisResolved = true;\n\t\t\t\t\tresolver?.();\n\t\t\t\t} else if (out.includes(\"Rebuilding...\")) {\n\t\t\t\t\tisResolved = false;\n\t\t\t\t\tconst { promise, resolve, reject } = Promise.withResolvers<void>();\n\t\t\t\t\tresolver = resolve;\n\t\t\t\t\tregisterBuildLock(Promise.race<void>([\n\t\t\t\t\t\tpromise,\n\t\t\t\t\t\tsleep(15_000).then(()=> {\n\t\t\t\t\t\t\tif (!isResolved)\n\t\t\t\t\t\t\t\tlogger.warn(\"TailwindCSS has not finished building in 15s\");\n\t\t\t\t\t\t}).catch(reject)\n\t\t\t\t\t]));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((await status.status).code != 0) {\n\t\t\t\tlogger.error(\"Error running tailwindcss\");\n\t\t\t\tconsole.error(\"Command:\", tailwindCssCmd, args.join(\" \"));\n\t\t\t\tconst output = (await status.output());\n\t\t\t\tconsole.error(decoder.decode(output.stdout).trim() + \"\\n\" + decoder.decode(output.stderr).trim());\n\t\t\t}\n\t\t}\n\t\tcatch (e) {\n\t\t\tlogger.error(e);\n\t\t}\n\t}\n} satisfies Theme;\n\n\nasync function getCurrentTailwindVersion(tailwindCssCmd: string) {\n\treturn new TextDecoder().decode((await new Deno.Command(tailwindCssCmd, {args: ['--help'], stdout: \"piped\"}).spawn().output()).stdout).trim().split(\"\\n\")[0];\n}\n\n\nasync function installTailwind4(executableTarget: Path, logger: Logger) {\n\tconst os = getOS();\n\tconst executableName = {\n\t\t'linux-x86_64': \"tailwindcss-linux-x64\",\n\t\t'linux-aarm': \"tailwindcss-linux-arm64\",\n\t\t'windows-x86_64': \"tailwindcss-windows-x64.exe\",\n\t\t'windows-aarch64': \"tailwindcss-windows-arm64.exe\",\n\t\t'darwin-x86_64': \"tailwindcss-macos-x64\",\n\t\t'darwin-aarch64': \"tailwindcss-macos-arm64\"\n\t}[os];\n\tif (!executableName)\n\t\thandleError(\n\t\t\tnew KnownError(\n\t\t\t\t`TailwindCSS executable could not be installed for your platform (${os}).`,\n\t\t\t\t[\"Please open an issue on https://www.github.com/unyt-org/uix providing your platform details\"]\n\t\t\t),\n\t\t\tlogger\n\t\t);\n\t\n\ttry {\n\t\tlogger.info(\"Downloading TailwindCSS. HTTP requests / page loads will be deferred until the installation is complete.\");\n\t\tconst downloadMap = await datex.get<{assets: {browser_download_url: string, name: string}[]}>(\"https://api.github.com/repos/tailwindlabs/tailwindcss/releases/latest\");\n\t\tconst releaseURL = downloadMap.assets.find(e => e.name === executableName && e.browser_download_url.includes(\"v4.\"))?.browser_download_url;\n\t\tif (!releaseURL)\n\t\t\tthrow new Error(`Could not get release URL for ${executableName}`);\n\n\t\tawait Deno.writeFile(\n\t\t\texecutableTarget.normal_pathname,\n\t\t\tnew Uint8Array(await (await fetch(releaseURL)).arrayBuffer()),\n\t\t\t{\n\t\t\t\tcreate: true\n\t\t\t}\n\t\t);\n\n\t\ttry {\n\t\t\tawait Deno.chmod(\n\t\t\t\texecutableTarget.normal_pathname,\n\t\t\t\t0o777\n\t\t\t);\n\t\t}\n\t\tcatch  {\n\t\t\t// ignore if chmod fails on Windows\n\t\t}\n\t\tlogger.success(`TailwindCSS was installed to ${executableTarget}`);\n\t} catch (e) {\n\t\thandleError(\n\t\t\tnew KnownError(\n\t\t\t\t`The TailwindCSS executable could not be downloaded\\n(${e})`,\n\t\t\t\t[\n\t\t\t\t\t\"Check your internet connectivity\",\n\t\t\t\t\t\"Ensure that you have enough disk space and that the directory is writable\"\n\t\t\t\t]\n\t\t\t),\n\t\t\tlogger\n\t\t);\n\t}\n}\n\n\nfunction commandExists(cmd: string, arg = \"-h\") {\n\ttry {\n\t\tconsole.log(new TextDecoder().decode(new Deno.Command(cmd, {args:[arg]}).outputSync().stderr));\n\t\treturn true;\n\t}\n\tcatch {\n\t\treturn false;\n\t}\n}"],"names":["UIX","Path","Logger","getBaseDirectory","getOS","KnownError","handleError","registerBuildLock","tailwindcss","name","stylesheets","cacheDir","getChildPath","onRegister","app","watch","watch_backend","live","logger","executableTarget","tailwindCssCmd","cmdAvailable","commandExists","normal_pathname","installTailwind4","version","getCurrentTailwindVersion","includes","warn","outFile","inFile","base_url","fs_exists","Deno","writeTextFileSync","info","resolver","args","push","status","Command","stderr","stdout","spawn","decoder","TextDecoder","isResolved","data","out","decode","success","promise","resolve","reject","Promise","withResolvers","race","sleep","then","catch","code","error","console","join","output","trim","e","split","os","executableName","downloadMap","datex","get","releaseURL","assets","find","browser_download_url","Error","writeFile","Uint8Array","fetch","arrayBuffer","create","chmod","cmd","arg","log","outputSync"],"mappings":"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","sourceRoot":"/lib/uix-0.4.22/src/themes/","file":"tailwindcss.ts"}