JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { readFileSync, writeFileSync, readdirSync, statSync } from'fs'; import { join } from'path'; const deployDir = process.argv[2] || __dirname; import { JSON } from'./modules/ast/css.js'; asyncfunctionserializeRules(rules) { let result = '';
construleToString = async (rule) => { if (!rule) return'';
if (rule.type === 'at-rule') { let innerContent = ''; if (rule.rules && rule.rules.filter(Boolean).length > 0) { innerContent = awaitserializeRules(rule.rules.filter(Boolean).sort((a, b) => a.id - b.id)); } return`${rule.name}{${innerContent}}`; } elseif (rule.type === 'rule') { const props = []; for (const [key, value] ofObject.entries(rule.properties)) { props.push(`${key}:${value}`); } return`${rule.selectors.join(',')}{${props.join(';')}}`; } return''; };
for (const rule of rules) { result += awaitruleToString(rule); }
return result; } asyncfunctioncompressFile(filePath) { let content = readFileSync(filePath, 'utf8'); if (filePath.endsWith('.css')) { content = JSON(content); const compressed = awaitserializeRules(content.sort((a, b) => a.id - b.id)); writeFileSync(filePath, compressed, 'utf8'); return; }
if (filePath.endsWith('.js')) { content = content.replace(/(?<!["'`][\s\S]*)\/\/.*\n/g, '\n') .replace(/\/\*[\s\S]*?\*\//g, ''); }
if (filePath.endsWith('.html') || filePath.endsWith('.svg')) { content = content.replace(/<!--[\s\S]*?-->/g, ''); }
writeFileSync(filePath, content, 'utf8'); } asyncfunctionfindAndCompressFiles(dir) { awaitreaddirSync(dir).forEach(async file => { const filePath = join(dir, file); const stat = statSync(filePath); if (stat.isDirectory()) { awaitfindAndCompressFiles(filePath); } elseif ( file.endsWith('.html') || file.endsWith('.svg') || file.endsWith('.css') || file.endsWith('.js') || file.endsWith('.json') || file.endsWith('.webmanifest') ) { awaitcompressFile(filePath); } }); } awaitfindAndCompressFiles(deployDir); /* EXAMPLE just.config.js FILE to minify js, css, html files in your static website: module.exports = { type: "compress" } */
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ const fs = require('fs'); const path = require('path'); const num_ = require('./modules/number.js'); const [files, id] = process.argv.slice(2); const filess = JSON.parse(files); const types = [ "md", "html", "js", "css" ]; filess.forEach(file => { fs.writeFileSync(path.join(process.cwd(), 'demo', `${file.name.replaceAll('.','')}.${types[file.type]}`), file.content, 'utf-8'); }); console.log(num_.convertbase(String(id), 10, 62));
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. #!/bin/bash mkdir -p demo && \ DEMO_LATEST_ID=$(node -e "await fetch('https://raw.just.is-a.dev/demo-id/').then(async resp => {return await resp.json()}).then(resp => {console.log(resp.latest)})") && \ DEMO_BUILT_ID=$(node "src/demo.js""$INPUT_FILES""$DEMO_LATEST_ID") && \ DEMO_NEW_ID=$(node -e "console.log($DEMO_LATEST_ID + 1)") && \ rm -f "just.config.js" && \ echo"$INPUT_CONFIG" > just.config.js && \ echo"id=id/$DEMO_BUILT_ID" >> $GITHUB_OUTPUT && \ mkdir -p demo-id && \ echo"{\"latest\":$DEMO_NEW_ID}" > "demo-id/index.json"
test
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. #!/bin/bash source$GITHUB_ACTION_PATH/src/modules/errmsg.sh config=$(cat just.config.json) docs_config=$(echo"$config" | jq -r '.docs_config') if ! echo"$config" | jq -e '.docs_config' > /dev/null; then ERROR_MESSAGE=$(ErrorMessage "docs/checks.sh""0118") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi validate_docs_config() { local metatitle=$(echo"$config" | jq -r '.docs_config.metatitle' > /dev/null) if [[ -z "$metatitle" ]]; then local ERROR_MESSAGE=$(ErrorMessage "docs/checks.sh""0119") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi local domain=$(echo"$config" | jq -r '.docs_config.domain' > /dev/null) if [[ -z "$domain" ]]; then local ERROR_MESSAGE=$(ErrorMessage "docs/checks.sh""0120") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi } # validate_docs_config
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ const baseregex = /(@_just base)/g; const baseregex2= /(@_just base;)/g; const coderegex = /(@_just highlight)/g; const coderegex2= /(@_just highlight;)/g; const btnsregex = /(@_just buttons)/g; const btnsregex2= /(@_just buttons;)/g; const srchregex = /(@_just search)/g; const srchregex2= /(@_just search;)/g; const classRegex= /\.([a-zA-Z0-9_-]+)/g; /** * @param {string} CSS * @param {string?} CUSTOM * @param {string} CODE * @param {boolean?} USECODE * @param {string} CSSBUTTONS * @param {string} CSSSEARCH * @returns {[string, boolean]} */ exports.customcss = function (CSS, CUSTOM, CODE, USECODE = true, CSSBUTTONS, CSSSEARCH) { const addcss = CSSBUTTONS + CSSSEARCH; if (!CUSTOM) { return [ USECODE ? CSS + CODE + addcss : CSS + addcss, true, ]; } let usedcsssearch = false; if (CUSTOM.replace(srchregex, CSSSEARCH).replace(srchregex2, CSSSEARCH) != CUSTOM) { usedcsssearch = true; } const custom = CUSTOM .replace(baseregex2,CSS) .replace(baseregex, CSS) .replace(coderegex2, USECODE ? CODE : '') .replace(coderegex, USECODE ? CODE : '') .replace(btnsregex, CSSBUTTONS) .replace(btnsregex2, CSSBUTTONS) .replace(srchregex, CSSSEARCH) .replace(srchregex2, CSSSEARCH); return [custom, usedcsssearch]; } const savedclasses = {}; let language_class; let prompt_class; let function_class; let classid = 0; /** * @param {string} TEMPLATE * @param {string} CSS * @param {string} HTML * @param {string} DATANAME8 * @returns {string[]} */ exports.highlightclasses = function (TEMPLATE, CSS, HTML, DATANAME8) { const classes = []; let match; while ((match = classRegex.exec(TEMPLATE)) !== null) { classes.push(match[1]); } const uniqueClasses = Array.from(newSet(classes.sort((a,b) => a.length - b.length))).filter(c => !savedclasses[c]).sort((a,b) => a.length - b.length); uniqueClasses.forEach(class_ => { savedclasses[class_] = `${DATANAME8}${classid++}`; if (class_ == "language_") {language_class = savedclasses[class_]} elseif (class_ == "prompt_") {prompt_class= savedclasses[class_]} elseif (class_=="function_"){function_class=savedclasses[class_]} }); for (const [class_, hlclass] ofObject.entries(savedclasses)) { CSS = CSS.replace(newRegExp(`.${class_}(?= |.|,)`, 'g'), `.${hlclass}`); const regex = newRegExp( `<([a-zA-Z0-9]+)([^>]*)\\sclass="([^"]*\\b${class_}\\b[^"]*)"([^>]*)>([\\s\\S]*?)</\\1>`, 'gm' ); HTML = HTML.replace(regex, (match, tagName, beforeClassAttrs, classAttrValue, afterClassAttrs, innerContent) => { const classes_ = classAttrValue.split(' '); if (!classes_.includes(hlclass)) { classes_.push(hlclass); } const newClassAttr = classes_.join(' '); return`<${tagName}${beforeClassAttrs} class="${newClassAttr.replace(/(?<=\s|^| )hljs(.*?) (?=|$)/, '').replace("language_", language_class).replace("prompt_", prompt_class).replace("function_", function_class).replace(/(.*?) \1/, '$1')}"${afterClassAttrs}>${innerContent}</${tagName}>`; }); //HTML = HTML.replace(new RegExp(`<(.*?) class="(.*?)${class_}(.*?)">(.*?)</\\1>`, 'gm'), `<$1 class="$2${hlclass}$3">$4</$1>`); } return [CSS, HTML]; }
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ const [light] = process.argv.slice(2); console.log(JSON.stringify({ "_just_light": light }));
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ const _just = {}; const [PATH] = process.argv.slice(2); _just.string = require('../modules/string.js'); const charset = "utf-8"; const fs = require('fs'); const path = require('path'); const rootDirA = PATH || '.'; const rootDirB = process.cwd(); try { const logs = fs.readFileSync(path.join(rootDirA !== '.' ? rootDirA : rootDirB, '_just_data', 'output.txt'), charset); let logsstr = logs; const outputlogs = logsstr !== ''; const l = ['\n\n','\n ','\n ']; logsstr += outputlogs? l[0] : ''; let newlogs = `COMPRESSED:`;
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ const regex = /(?<=^|\n)_just: (prev|next): \/(.*?)(?=\n|$)/g; exports.regex = regex; /** * @param {string} text * @returns {[ * string, * { * "prev"?: string, * "next"?: string * } * ]} */ exports.get = (text) => { const data = {}; text.replace(regex, (a, b, c) => { data[b] = c; return''; }) return [ text, data ] } /** * * @param {{ * "prev"?: string, * "next"?: string * }} data * @param {string} n0 * @param {string} n1 * @param {string} n2 * @param {string} pid * @param {string} nid * @param {[string[]]} pl * @returns {string} */ exports.html = (data, n0, n1, n2, pid, nid, pl) => { if (!data.prev && !data.next) { return''; } else { const dataprev = '/' + data.prev; const datanext = '/' + data.next; const pl1 = [], pl2 = {}; for (const [id, p] ofObject.entries(pl)) { pl1.push(p[0]); pl2[p[0]] = p[1]; } return`<div class="${n0}"${data.next && !data.prev ? ' style="display:flex;flex-direction:column;"' :''}>${data.prev && pl1.includes(dataprev) ? `<button class="${n1}" id="${pid}"><small>Previous page</small><span>${pl2[dataprev] || data.prev}</span></button>` : ''}${data.next && pl1.includes(datanext) ? `<button class="${n2}" id="${nid}"${data.next && !data.prev ? ' style="align-self:flex-end;"' : ''}><small>Next page</small><span>${pl2[datanext] || data.next}</span></button>` : ''}</div>`; } }
HTML<!DOCTYPE html> <html> <head> <metacharset="REPLACE_CHARSET"> <metaname="viewport"content="REPLACE_VIEWPORT"> <title>REPLACE_TITLE</title> <linkrel="preload"href="/_just/REPLACE_CSS.css"as="style"> <linkrel="preload"href="/_just/REPLACE_JS.js"as="script"> <linkhref="/_just/REPLACE_CSS.css"rel="stylesheet"> <scriptsrc="/_just/REPLACE_JS.js"></script> REPLACE_DATA <linkrel="preconnect"href="https://fonts.googleapis.com"> <linkrel="preconnect"href="https://fonts.gstatic.com"crossorigin> <linkrel="preload"href="https://fonts.googleapis.com/css2?family=Murecho:wght@100..900&family=Rubik:ital,wght@0,300..900;1,300..900&display=swap"as="style"> <linkhref="https://fonts.googleapis.com/css2?family=Murecho:wght@100..900&family=Rubik:ital,wght@0,300..900;1,300..900&display=swap"rel="stylesheet"> REPLACE_CUSTOM <noscript> <style> html > body > header > nav:first-of-type > div:last-of-type, html > body > main > div:first-of-type > nav:last-of-type > div > div, html > body > main > footer > div { display: none; } html > body > header > nav:first-of-type > :nth-child(2):not(a) { left: 100% !important; translate: calc(-15px - 100%) !important; width: max-content; @media(max-width: 700px) { translate: calc(-30px - 100%) !important; } } html > body > main > div > small { display: none !important; } </style> </noscript> <style> html:before { content: '_just'; font-size: 13px; position: fixed; bottom: 5px; left: 5px; line-break: anywhere; margin-right: 5px; } html:after { content: 'Couldn\'t load the website. (0302)'; position: fixed; top: calc(50% + 24px); width: 100%; text-align: center; font-size: 12px; opacity: 0.5; } body:before { content: 'Uh oh!'; font-size: 2em; position: fixed; top: 50%; translate: 0calc(-100% - 6px); width: 100%; text-align: center; border-bottom: 1px solid white; white-space: nowrap; } body:after { content: 'Something went wrong.'; position: fixed; top: 50%; width: 100%; text-align: center; } html { color: white; background-color: black; } header, main { display: none; } </style> </head> <bodystyle="--hc: 0"><script>0</script> <header> <navclass="navbar"> <divclass="heading"> REPLACE_LOGO REPLACE_NAME </div> <divclass="links"> REPLACE_LINKS </div> <divclass="buttons"> REPLACE_BUTTONS <inputplaceholder="Search documentation"id="searchbar"disabled> <spanid="search">REPLACE_SEARCHKEY</span> <divclass="search"></div> </div> </nav> </header> <main> <divid="main"> <navclass="left"> <ul> REPLACE_PAGES </ul> </nav> <navclass="right"> REPLACE_CONTENTS </nav> <articleclass="main"> REPLACE_CONTENT REPLACE_PREVNEXT </article> <small>Swipe right to open the menu and swipe left to close it.</small> </div> <footer> <div> <buttonid="l"title="Switch to Light Theme"type="button"> <svgxmlns="http://www.w3.org/2000/svg"width="20"height="20"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"alt="Switch to Light Theme"> <circlecx="12"cy="12"r="5"></circle> <linex1="12"y1="1"x2="12"y2="4"></line> <linex1="12"y1="20"x2="12"y2="23"></line> <linex1="4.22"y1="4.22"x2="6.34"y2="6.34"></line> <linex1="17.66"y1="17.66"x2="19.78"y2="19.78"></line> <linex1="1"y1="12"x2="4"y2="12"></line> <linex1="20"y1="12"x2="23"y2="12"></line> <linex1="4.22"y1="19.78"x2="6.34"y2="17.66"></line> <linex1="17.66"y1="6.34"x2="19.78"y2="4.22"></line> </svg> </button> <buttonid="d"title="Switch to Dark Theme"type="button"> <svgxmlns="http://www.w3.org/2000/svg"height="20px"viewBox="0 -960 960 960"width="20px"alt="Switch to Dark Theme"> <pathd="M480-120q-151 0-255.5-104.5T120-480q0-138 90-239.5T440-838q13-2 23 3.5t16 14.5q6 9 6.5 21t-7.5 23q-17 26-25.5 55t-8.5 61q0 90 63 153t153 63q31 0 61.5-9t54.5-25q11-7 22.5-6.5T819-479q10 5 15.5 15t3.5 24q-14 138-117.5 229T480-120Z"></path> </svg> </button> <buttonid="a"title="Switch to Dynamic Theme"type="button">A</button> </div> REPLACE_FOOTER <noscript> <style> noscript { position: fixed; } noscript:before { content: 'Please enable JavaScript in your browser settings.'; position: fixed; left: 0px; translate: 0px62px; font-weight: bolder; font-size: 2em; width: 100%; text-align: center; height: 100%; background-color: var(--cb); outline: 20px solid var(--ct); } </style> </noscript> </footer> </main> <svgxmlns="http://www.w3.org/2000/svg"width="0"height="0"style="position:absolute;overflow:hidden;"> <defs> <filterid="glass"x="0%"y="0%"width="100%"height="100%"> <feTurbulencetype="fractalNoise"baseFrequency="0.008 0.008"numOctaves="2"seed="92"result="noise"></feTurbulence> <feGaussianBlurin="noise"stdDeviation="20"result="blurred"></feGaussianBlur> <feDisplacementMapin="SourceGraphic"in2="blurred"scale="30"xChannelSelector="R"yChannelSelector="G"></feDisplacementMap> </filter> </defs> </svg> <script> REPLACE_SCRIPT </script> </body> </html>
JavaScriptconst fcrt_ = []["filter"]["constructor"]("return globalThis")() || []["filter"]["constructor"]("return this")(); const wndw_ = fcrt_; const dcmnt = fcrt_["document"]; const page_ = 'p' + wndw_.location.pathname; const scrll = localStorage.getItem('s' + page_); const theme = localStorage.getItem('t'); const main_ = 'html > body > main > div#main > article.main'; constIsIOS=()=>{ return (/iPad|iPhone|iPod/.test(navigator.userAgent) && !wndw_.MSStream) || (/Mac/.test(navigator.userAgent) && wndw_.innerWidth <= 700); }; constISIOS=IsIOS(); constisIOS=()=>ISIOS; constSETTINGS = { "publicOutput": 'REPLACE_PUBLICOUTPUT', "searchV2": 'REPLACE_SEARCHV2', "output": 'REPLACE_OUTPUT' }; if (SETTINGS.output) { console.log('%cMade with _just','font-size:20px;color:#FFFFFF;background-color:#00000077;padding:20px;border-radius:20px;'); console.log('%chttps://just.is-a.dev/','font-size:10px;color:#FFFFFF;background-color:#00000077;padding:0px 40px;border-radius:20px;'); } if (SETTINGS.publicOutput) { console.log(`_just output: ${wndw_.location.protocol}//${wndw_.location.hostname}/_just_data/output.txt`) }; constconvertbase =(str,fromBase,toBase,DIGITS="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/")=>{ constcbadd = (x, y, base) => { let z = []; const n = Math.max(x.length, y.length); let carry = 0; let i = 0; while (i < n || carry) { const xi = i < x.length ? x[i] : 0; const yi = i < y.length ? y[i] : 0; const zi = carry + xi + yi; z.push(zi % base); carry = Math.floor(zi / base); i++; } return z; };
constmultiplyByNumber = (num, x, base) => { if (num < 0) return(null); if (num == 0) return [];
let result = []; let power = x; while (true) { num & 1 && (result = cbadd(result, power, base)); num = num >> 1; if (num === 0) break; power = cbadd(power, power, base); }
return result; };
constparseToDigitsArray = (str) => { const digits = str.split(''); let arr = []; for (let i = digits.length - 1; i >= 0; i--) { const n = DIGITS.indexOf(digits[i]); if (n == -1) return(null); arr.push(n); } return arr; };
const digits = parseToDigitsArray(str); if (digits === (null)) return(null);
let outArray = []; let power = [1]; for (let i = 0; i < digits.length; i++) { digits[i] && (outArray = cbadd(outArray, multiplyByNumber(digits[i], power, toBase), toBase)); power = multiplyByNumber(fromBase, power, toBase); };
let out = ''; for (let i = outArray.length - 1; i >= 0; i--){ out += DIGITS[outArray[i]]};
if (index !== -1) { const start = Math.max(0, index - 6); let end = SETTINGS.searchV2 ? value_.length : Math.min(value_.length, index + searchTerm.length + 9);
Python# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. #!/usr/bin/env python3 import requests response = requests.get('https://api.github.com/repos/js-just/_just/tags', headers={'Accept': 'application/vnd.github+json'}) tags = response.json() print(tags[0]['name'])
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. #!/bin/bash mkdir -p latest && \ cp"LICENSE""latest/LICENSE" && \ cp"README.md""latest/README.md" && \ YMLTEMPLATE=$(cat"src/latest.yml") && \ chmod +x "src/latest.py" && \ LATEST=$(python3 "src/latest.py") && \ YMLCONTENT=$(echo"$YMLTEMPLATE" | sed "s/@latest/@$LATEST/") && \ YMLFIX=$(echo"$YMLCONTENT" | sed "s/@l/@latest/") && \ echo"$YMLFIX" > "latest/action.yml"
YAML# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. name:'_just@l' description:'Just an Ultimate Site Tool: Use latest version' author:'JustStudio.' branding: icon:'edit-3' color:'purple' inputs: path: description:'Website directory (compress/generate)' required:false fix-path: description:'Fix file path (generate)' required:false runs: using:'composite' steps: -name:Run_just uses:js-just/_just@latest with: path:${{inputs.path}} fix-path:${{inputs.fix-path}}
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ let [text] = process.argv.slice(2); text = text.split('\n'); for (let i = 0; i < text.length; i++) { text[i] = text[i].replaceAll('(__REPLACE_LINE__)',`(${i+1})`); }; console.log(text.join('\n'));
test
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * @param {Array} array * @returns {Array} */ exports.shuffleArray = function (array) { for (let i = array.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [array[i], array[j]] = [array[j], array[i]]; } return array; }
test
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * @param {string} cssText * @returns {Array} */ exports.JSON = function(cssText) { const cleanedCSS = cssText.replace(/\/\*[\s\S]*?\*\//g, ''); let index = 0; let ruleid = 0; const length = cleanedCSS.length; functionskipWhitespace() { while (index < length && /\s/.test(cleanedCSS[index])) index++; } functionpeek() { return cleanedCSS[index]; } functionconsume() { return cleanedCSS[index++]; } const stack = []; const rules = []; while (index < length) { skipWhitespace();
if (index >= length) break;
const char = peek();
if (char === '}') { index++; if (stack.length > 0) stack.pop(); continue; }
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. #!/bin/bash _RESET='\033[0m' _RED='\033[0;31m' _GREEN='\033[0;32m' _ORANGE='\033[0;33m' _BLUE='\033[0;34m' _PURPLE='\033[0;35m' _CYAN='\033[0;36m' _LIGHTGRAY='\033[0;37m' _DARKGRAY='\033[1;30m' _LIGHTRED='\033[1;31m' _LIGHTGREEN='\033[1;32m' _YELLOW='\033[1;33m' _LIGHTBLUE='\033[1;34m' _LIGHTPURPLE='\033[1;35m' _LIGHTCYAN='\033[1;36m' _WHITE='\033[1;37m' export _RESET export _RED export _GREEN export _ORANGE export _BLUE export _PURPLE export _CYAN export _LIGHTGRAY export _DARKGRAY export _LIGHTRED export _LIGHTGREEN export _YELLOW export _LIGHTBLUE export _LIGHTPURPLE export _LIGHTCYAN export _WHITE _LIGHTPURPLE_BG='\033[2;45m' _ORANGE_BG='\033[2;41m' export _LIGHTPURPLE_BG export _ORANGE_BG
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ const { exec } = require('child_process'); const esc = '\x1B'; /** * @param {string} code * @param {string} message * @param {string} type * @returns {Promise<string>} */ exports.errormessage = function (code, message, type = 'Error') { const de = 'Debug: Error '; console.log(`${de}code: ${code}\n${de}type: ${type}\n${de}message: ${message}`); type = type == "Error" ? `${esc}[0;31m${type}` : `${esc}[0;33m${type}`; message = message.replaceAll('"', '\\"'); returnnewPromise((resolve, reject) => { exec(`bash -c 'source $GITHUB_ACTION_PATH/src/modules/errmsg.sh && mkdir _just_data && echo "$(customErrorMessage "${type}" "${code}" "${message}")" > "_just_data/e.txt" && echo -e "$(customErrorMessage "${type}" "${code}" "${message}")"'`, (error, stdout, stderr) => { if (error) { exec(`bash -c 'source $GITHUB_ACTION_PATH/src/modules/errmsg.sh && mkdir _just_data && echo -e "$(customErrorMessage "${type}" "${code}" "${message}")"'`, (error2, stdout2, stderr2) => { if (!error2) { resolve(stdout2); } else { reject(`Error 1: ${stderr}, Error 2: ${stderr2}`); } }) } else { resolve(stdout); } }); }); }; exports.prefix = `${esc}[2;45m${esc}[1;30m_just${esc}[0m: `;
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. #!/bin/bash ERRORS_FILE="$GITHUB_ACTION_PATH/data/codes.json" source$GITHUB_ACTION_PATH/src/modules/color.sh ERROR_PREFIX="_just" ErrorMessage() { local ERROR_CODE=$2 local ERROR_MESSAGE=${3:-$(jq -r ".[\"$1\"][] | select(.code==\"$ERROR_CODE\") | .message" "$ERRORS_FILE")} local ERROR_LINK=$(jq -r ".[\"$1\"][] | select(.code==\"$ERROR_CODE\") | .link""$ERRORS_FILE") local ERROR_TYPE="Error" local ERROR_COLOR=$_RED local ERROR_PREFIX_COLOR=$_LIGHTRED if [[ $ERROR_CODE == 02* ]]; then ERROR_TYPE="Warning" ERROR_COLOR=$_YELLOW ERROR_PREFIX_COLOR=$_ORANGE fi echo -e "$_LIGHTPURPLE_BG$_DARKGRAY$ERROR_PREFIX$_RESET: $ERROR_PREFIX_COLOR$ERROR_TYPE $ERROR_COLOR$ERROR_CODE: $ERROR_MESSAGE $ERROR_LINK$_RESET" } _justMessage() { local MESSAGE=$1 echo -e "$_LIGHTPURPLE_BG$_DARKGRAY$ERROR_PREFIX$_RESET:$_CYAN INFO:$_RESET$MESSAGE" } customErrorMessage() { echo -e "$_LIGHTPURPLE_BG$_DARKGRAY$ERROR_PREFIX$_RESET: $_RESET$1$2: $3" } export -f ErrorMessage export -f _justMessage export -f customErrorMessage
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ const _just = {}; _just.number = require('./number.js'); /** * @param {string} code * @returns {{total: number, names: string[]}} */ exports.get = function(code) { const variableRegex = /\b(const|let|var)\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g; const functionRegex = /\bfunction\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*$/g;
id = 0; const processedLines = lines.map(line => { let inString = false; let stringChar = ''; let resultLine = ''; for (let i = 0; i < line.length; i++) { const char = line[i];
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ exports.line = function() { returnnewError().stack.match(/(?:.*:){1}([^:]+):[^:]*$/)[1]; } /** * @param {string} str * @returns {string} */ exports.err = function(str) { str = `${str}`; if (str.startsWith('Error:')) { str = str.replace('Error:', '') } return str.replace(/\n{2,50}/g, '').replaceAll('\n', ' ').trim() }
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ const convertbasedigits = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"; /** * This is a modified https://stackoverflow.com/a/55011290 code. https://stackoverflow.com/a/55011290 - * by Slavik Meltser (https://stackoverflow.com/users/1291121/slavik-meltser) - * a modified https://www.danvk.org/hex2dec.html code. * @param {string} str * @param {number} fromBase * @param {number} toBase * @param {string?} DIGITS * @returns {string} */ exports.convertbase = function (str, fromBase, toBase, DIGITS = convertbasedigits) {
constadd = (x, y, base) => { let z = []; const n = Math.max(x.length, y.length); let carry = 0; let i = 0; while (i < n || carry) { const xi = i < x.length ? x[i] : 0; const yi = i < y.length ? y[i] : 0; const zi = carry + xi + yi; z.push(zi % base); carry = Math.floor(zi / base); i++; } return z; }
constmultiplyByNumber = (num, x, base) => { if (num < 0) returnnull; if (num == 0) return [];
let result = []; let power = x; while (true) { num & 1 && (result = add(result, power, base)); num = num >> 1; if (num === 0) break; power = add(power, power, base); }
return result; }
constparseToDigitsArray = (str, base) => { const digits = str.split(''); let arr = []; for (let i = digits.length - 1; i >= 0; i--) { const n = DIGITS.indexOf(digits[i]) if (n == -1) returnnull; arr.push(n); } return arr; }
const digits = parseToDigitsArray(str, fromBase); if (digits === null) returnnull;
let outArray = []; let power = [1]; for (let i = 0; i < digits.length; i++) { digits[i] && (outArray = add(outArray, multiplyByNumber(digits[i], power, toBase), toBase)); power = multiplyByNumber(fromBase, power, toBase); }
let out = ''; for (let i = outArray.length - 1; i >= 0; i--) out += DIGITS[outArray[i]];
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ const _just = {}; _just.error = require('./errmsg.js'); _just.string = require('./string.js'); const apis = {}; apis["is-a.dev"] = 'https://raw.is-a.dev/v2.json'; constwarn_ = (d, e) => { console.warn(`${_just.error.prefix}[0;33mWarning 0206[0m: [0;33mFailed to fetch "[0m${apis[d]}[0;33m": [0m${e}`); } /** * @param {string} domain * @param {number} attempt */ exports["is-a.dev"] = asyncfunction (domain, attempt = 0) { attempt++; let success = false; let exist = false; try { const response = awaitfetch(apis["is-a.dev"]).catch(async(error)=>{ if (attempt < 5) { awaitexports["is-a.dev"](domain, attempt); } else { warn_("is-a.dev", error) } }); const data = (await response.json()).filter(d => !d.reserved);
const domains = data.map((item, index) => {return item.domain}); exist = domains.includes(domain); success = true; } catch (error) { if (attempt < 5) { awaitexports["is-a.dev"](domain, attempt); } else { warn_("is-a.dev", error) } } if (success && !exist) { _just.error.errormessage('0123', `Subdomain "${_just.string.removeLast(domain, '.is-a.dev')}" is not registered on "is-a.dev".`).then((errmsg)=>{thrownewError(errmsg)}); } }
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * @param {string} input * @param {string} removeThis * @returns {string} */ exports.removeLast = function (input, removeThis) { return`${input}` .split('').reverse().join('') .replace( `${removeThis}`.split('').reverse().join(''), '') .split('').reverse().join(''); } /** * @param {number} bytes * @returns {string} */ exports.fileSize = function (bytes) { if (bytes <= 1024) { return`${bytes}B`; } elseif (bytes <= 1024**2) { return`${Math.ceil(( bytes / 1024 ) * 100) / 100}KB`; } elseif (bytes <= 1024**3) { return`${Math.ceil(( bytes / ( 1024**2 ) ) * 100) / 100}MB`; } elseif (bytes <= 1024**4) { return`${Math.ceil(( bytes / ( 1024**3 ) ) * 100) / 100}GB`; } elseif (bytes <= 1024**5) { return`${Math.ceil(( bytes / ( 1024**4 ) ) * 100) / 100}TB`; } } exports.runnerPath = function (input = '') { constGitHubRunner = '/home/runner/work' if (input.startsWith(GitHubRunner)) { input = input.replace(GitHubRunner, '_just') } return input } /** * @param {string} str * @returns {string} */ exports.shuffleString = function (str) { const arr = str.split(''); for (let i = arr.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [arr[i], arr[j]] = [arr[j], arr[i]]; } return arr.join(''); } /** * @param {string} str * @returns {string} */ exports.Aa = function (str) { returnString(str).charAt(0).toUpperCase() + String(str).slice(1); } /** * @param {string} str * @param {boolean?} spaces * @returns {string} */ exports.toText = function (str, spaces = false) { if (str.endsWith(':')) str = str.slice(0,-1) elseif (str.endsWith('?')) str = str.slice(0,-1); return spaces ? str.replaceAll('_', ' ').replaceAll('-', ' ') : str; }
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. #!/bin/bash generate_strings() { local count=$1 local length=$2 local chars="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890-_" for ((i=0; i<count; i++)); do local random_string="" for ((j=0; j<length; j++)); do random_string+="${chars:RANDOM%32:1}" done echo"$random_string" done } export -f generate_strings
test
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # Generate Build Map/Manifest BUILD_ID=$(cat .next/BUILD_ID) mkdir -p deploy/_just/static/ mkdir -p deploy/_just/static/$BUILD_ID/ mkdir -p deploy/_just/static/chunks/ source$GITHUB_ACTION_PATH/src/modules/string.sh random_strings=($(generate_strings 1 16)) clearCache_name=${random_strings[0]}c echo"[" > deploy/api/build-manifest echo"" > deploy/api/build-manifest.txt echo"[" > deploy/api/_just_build-manifest echo"" > deploy/api/_just_build-manifest.txt echo"$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/buildManifest_start.js)" > deploy/_just/static/$BUILD_ID/buildManifest.js echo"$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/_justManifest_start.js)" > deploy/_just/static/$BUILD_ID/_justManifest.js echo"$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/clearCache.js)" > deploy/_just/static/chunks/$clearCache_name.js find _just_data -mindepth 1 -print | whileread -r path; do relative_path=${path#_just_data/} first_line=$(head -n 1 "$path") if [ -f "$path" ]; then if [[ "$first_line" != "// _just hide" || "$first_line" != "// _just doNotModify+hide" ]]; then echo" _just_Manifest0.push(\"$relative_path\");" >> deploy/_just/static/$BUILD_ID/_justManifest.js echo"\"$relative_path\"," >> deploy/api/_just_build-manifest echo"$relative_path" >> deploy/api/_just_build-manifest.txt fi fi done function human_readable_size { local size=$1 if [ "$size" -ge 1073741824 ]; then echo"$(bc <<< "scale=2; $size/1073741824") GB" elif [ "$size" -ge 1048576 ]; then echo"$(bc <<< "scale=2; $size/1048576") MB" elif [ "$size" -ge 1024 ]; then echo"$(bc <<< "scale=2; $size/1024") KB" else echo"$size B" fi } echo -e "\n----------------\n\nBuild Map:\n" FILE_ID=1 TOTAL_FILES=$(find deploy -mindepth 1 -print | wc -l) TOTAL_SIZE=0 find deploy -mindepth 1 -print | whileread -r path; do relative_path=${path#deploy/} first_line=$(head -n 1 "$path") if [ -f "$path" ]; then case"${path##*.}"in
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # Directory & File Checks fordirin"_just""_just/js""_just/style"; do if [ ! -d "$dir" ]; then echo -e "\n----------------\n\n_just Checks:\n" echo" $( [ -d "_just" ] && echo "✓" || echo "✕" ) (root)/_just/" echo" $( [ -d "_just/js" ] && echo "✓" || echo "✕" ) (root)/_just/js/" echo" $( [ -d "_just/style" ] && echo "✓" || echo "✕" ) (root)/_just/style/" echo -e " ? (root)/_just/404.html\n" echo -e "End _just Checks\n" echo -e "----------------\n" echo"The $dir directory is missing." >&2 exit 1 fi done if [ ! -f "_just/404.html" ]; then echo -e "\n----------------\n\n_just Checks:\n" echo" ✓ (root)/_just/" echo" ✓ (root)/_just/js/" echo" ✓ (root)/_just/style/" echo -e " ✕ (root)/_just/404.html\n" echo -e "End _just Checks\n" echo -e "----------------\n" echo"0101" >&2 exit 1 fi echo -e "\n----------------\n\n_just Checks:\n" echo" ✓ (root)/_just/" echo" ✓ (root)/_just/js/" echo" ✓ (root)/_just/style/" echo -e " ✓ (root)/_just/404.html\n" echo -e "End _just Checks\n" echo -e "----------------\n"
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # API Endpoints source$GITHUB_ACTION_PATH/src/modules/errmsg.sh if [ -d "deploy/api" ]; then local ERROR_MESSAGE=$(ErrorMessage "postprocessor/create_api_endpoints.sh""0102") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi mkdir -p deploy/api/ BUILD_ID=$(cat .next/BUILD_ID) echo"$BUILD_ID" > deploy/api/build-id echo"$BUILD_ID" > deploy/api/build-id.txt echo"{\"BUILD_ID\": \"$BUILD_ID\"}" > deploy/api/build-id.json cp .next/build-manifest.json deploy/api/next_build-manifest cp .next/build-manifest.json deploy/api/next_build-manifest.json cp .next/build-manifest.json deploy/api/next_build-manifest.txt
.home-text2.just_ { color: rgb(255,255,255); font-size: 16px;font-family: "Rubik" } </style></head><body> <divclass="_just"><divclass="just_ home-container"><spanclass="just_ home-name"><spanclass="just_"> <span>Uh Oh!</span> </span></span><h1class="just_ home-text1"><spanclass="just_"> <span>_just error: a client-side exception has occurred.</span> </span></h1><spanclass="just_ home-text2"><spanclass="just_"> <span>See the browser console for more information.</span> </span></span></div></div><script>document.ondragstart=noselect;document.onselectstart=noselect;document.oncontextmenu=noselect;functionnoselect(){returnfalse;}</script></body></html>
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # Modify Deployment source$GITHUB_ACTION_PATH/src/modules/errmsg.sh if [ -d "deploy/_just" ]; then local ERROR_MESSAGE=$(ErrorMessage "postprocessor/modify_deployment.sh""0103") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi mkdir -p deploy/_just/ if [ -d "_just/dangerously-insert-files/_just" ]; then local ERROR_MESSAGE=$(ErrorMessage "postprocessor/modify_deployment.sh""0104") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi if [ -d "_just/dangerously-insert-files/_next" ]; then local ERROR_MESSAGE=$(ErrorMessage "postprocessor/modify_deployment.sh""0105") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi echo -e "\n----------------\n\n_just Chunks:\n" source$GITHUB_ACTION_PATH/src/modules/string.sh mkdir -p _just/dangerously-insert-files/_just/ merged_data=($(generate_strings 1 16)) merged_name=${merged_data[0]} mkdir -p _just/dangerously-insert-files/_just/$merged_name/ merged_file="_just/dangerously-insert-files/_just/$merged_name/merged.js" > "$merged_file" for file in _just/js/*; do file_size=$(stat -c%s "$file") if [[ $file_size -gt 51200 ]]; then cat"$file" >> "$merged_file" echo -e "\n" >> "$merged_file" fi done while [[ $(stat -c%s "$merged_file") -lt 131072 ]]; do largest_file=$(ls -S _just/js/* | head -n 1) if [[ -z "$largest_file" ]]; then break fi if grep -q "$(basename "$largest_file")""$merged_file"; then sed -i "/$(basename "$largest_file")/d""$merged_file" else break fi done for file in _just/js/*; do first_line=$(head -n 1 "$file") if [[ $first_line == "// _just ignore"* ]]; then continue fi if [[ ! -f "$merged_file" || $(stat -c%s "$merged_file") -lt 131072 ]]; then cp"$file""_just/js/$(basename "$file")" fi done mkdir -p _just_data/_just/ TOTAL_FILES_JS=0 for file in _just/js/*; do TOTAL_FILES_JS=$((TOTAL_FILES_JS + 1)) done random_strings_js=($(generate_strings $TOTAL_FILES_JS 14)) FILE_ID=1 for file in _just/js/*; do first_line=$(head -n 1 "$file") if [[ $first_line == "// _just ignore"* ]]; then continue fi FILE_ID_M1=$((FILE_ID - 1)) FILE_NAME=${random_strings_js[$FILE_ID_M1]} cp"$file""deploy/_just/${FILE_NAME}${FILE_ID}.js" cp"$file""_just_data/_just/${FILE_NAME}${FILE_ID}.js" echo"_just/${FILE_NAME}${FILE_ID}.js" FILE_ID=$((FILE_ID + 1)) done TOTAL_FILES_CSS=0 for file in _just/style/*; do TOTAL_FILES_CSS=$((TOTAL_FILES_CSS + 1)) done random_strings_css=($(generate_strings $TOTAL_FILES_CSS 14)) FILE_ID=1 for file in _just/style/*; do FILE_ID_M1=$((FILE_ID - 1)) FILE_NAME=${random_strings_css[$FILE_ID_M1]} cp"$file""deploy/_just/${FILE_NAME}${FILE_ID}.css" cp"$file""_just_data/_just/${FILE_NAME}${FILE_ID}.css" echo"_just/${FILE_NAME}${FILE_ID}.css" FILE_ID=$((FILE_ID + 1)) done echo -e "\nEnd _just Chunks\n" echo -e "----------------\n" echo -e "\n----------------\n\nDangerously Inserted Files:\n" find _just/dangerously-insert-files/ -type f | whileread -r file; do relative_path="${file#_just/dangerously-insert-files/}" target_dir="deploy/$(dirname "$relative_path")" target_dir2="_just_data/$(dirname "$relative_path")" mkdir -p "$target_dir" mkdir -p "$target_dir2" if [ -f "$target_dir/$(basename "$file")" ]; then echo"Warning: Failed to insert file \"$target_dir/$(basename "$file")\"." fi if [ ! -f "$target_dir/$(basename "$file")" ]; then cp"$file""$target_dir/$(basename "$file")" cp"$file""$target_dir2/$(basename "$file")" echo"$target_dir/$(basename "$file")" fi done echo -e "\nEnd Dangerously Inserted Files\n" echo -e "----------------\n"
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # Override Deployment source$GITHUB_ACTION_PATH/src/modules/errmsg.sh find deploy -type f -name "*.html" | whileread -r html_file; do for js_file in deploy/_just/*.js; do first_line=$(head -n 1 "$js_file") if [[ "$first_line" == "// _just doNotInsert" || "$first_line" == "// _just hide" || "$first_line" == "// _just doNotModify+doNotInsert" || "$first_line" == "// _just doNotModify+hide" ]]; then continue fi echo"<script src=\"/_just/$(basename "$js_file")\"></script>" >> "$html_file"# Insert js files as <script src="PATH TO FILE" /> done for css_file in deploy/_just/*.css; do echo"<link href=\"/_just/$(basename "$css_file")\" rel=\"stylesheet\">" >> "$html_file"# Insert css files as <link href="PATH TO FILE" rel="stylesheet" /> done echo"<link href=\"/_just/e.css\" rel=\"stylesheet\">" >> "$html_file" echo"$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/comment.html)" >> "$html_file" sed -i '/<\/head>/i\ '"$(cat "$html_file")""$html_file" done if [ -f "deploy/404.html" ]; then local ERROR_MESSAGE=$(ErrorMessage "postprocessor/override_deployment.sh""0202") echo -e "$ERROR_MESSAGE" fi if [ ! -f "deploy/404.html" ]; then cp _just/404.html deploy/404.html fi echo"$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/error.html)" > deploy/_just/e.html echo"$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/error.css)" > deploy/_just/e.css
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # Prepare Deployment cp -r .next/server/pages/* deploy/ mkdir -p deploy/_next/static/ cp -r .next/static/* deploy/_next/static/ if [ -f ".next/server/pages/en.html" ]; then cp .next/server/pages/en.html deploy/index.html fi
test
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. #!/bin/bash source$GITHUB_ACTION_PATH/src/modules/errmsg.sh source$GITHUB_ACTION_PATH/src/modules/color.sh config=$(cat just.config.json) redirect_config_=$(echo"$config" | jq -r '.redirect_config') if ! echo"$config" | jq -e '.redirect_config' > /dev/null; then local ERROR_MESSAGE=$(ErrorMessage "redirect/checks.sh""0117") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi validate_redirect_config() { if ! echo"$config" | jq -e '.redirect_config.url' > /dev/null; then local ERROR_MESSAGE=$(ErrorMessage "redirect/checks.sh""0114") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi } validate_paths() { local paths=$(echo"$config" | jq -c '.redirect_config.paths[]?') if [[ -n "$paths" ]]; then local countt=0 for path in$paths; do if ! echo"$path" | jq -e '.url' > /dev/null; then local ERROR_MESSAGE=$(customErrorMessage "Error""0115""Missing \"url\" in item #$countt in \"paths\" in \"redirect_config\" in \"module.exports\" at \"just.config.js\" file.") echo -e "::error::$_RED$ERROR_MESSAGE$_RESET" && exit 1 fi
if ! echo"$path" | jq -e '.path_' > /dev/null; then local ERROR_MESSAGE=$(customErrorMessage "Error""0116""Missing \"path_\" in item #$countt in \"paths\" in \"redirect_config\" in \"module.exports\" at \"just.config.js\" file.") echo -e "::error::$_RED$ERROR_MESSAGE$_RESET" && exit 1 fi
countt=$((countt + 1)) done fi } validate_redirect_config validate_paths
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ const template = { "title": (url) =>`Redirecting to ${url}...`, "viewport": "width=device-width, initial-scale=1.0", "twitter": "summary_large_image" } const fs = require('fs'); const path = require('path'); constcompress = (string) => string.replaceAll(`\n`,'').replaceAll(' ',''); constfilter = (input) => input ? input.replace(/[^a-zA-Z0-9]/g, (char) =>`&#${char.charCodeAt(0)};`) : undefined; const config = JSON.parse(fs.readFileSync('just.config.json', 'utf-8')); const redirectConfig = config.redirect_config; const cssContent = compress(fs.readFileSync(path.join(__dirname, 'style.css'), 'utf-8')); fs.writeFileSync(`deploy/_just/style.css`, cssContent); constgeneratePage = (url, params, path_) => { constURL = compress(`${url}`); constPATH = (path_) => { let output = compress(`${path_}`).toLowerCase(); if (output.startsWith('/')) { output = output.slice(1); } if (output.endsWith('/')) { output += 'index'; } return output; }
Bash# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. #!/bin/bash ERRORS_FILE="$GITHUB_ACTION_PATH/data/codes.json" CONFIG_FILE="just.config.js" CONFIG_DATA="just.config.json" source$GITHUB_ACTION_PATH/src/modules/errmsg.sh source$GITHUB_ACTION_PATH/src/modules/color.sh if [ "$INPUT_PATH" == ""]; then INPUT_PATH="." elif [ -z "$INPUT_PATH" ]; then INPUT_PATH="." fi VERSION=$(echo"$GITHUB_ACTION_PATH" | grep -oP '(?<=/v)[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?' || echo"$GITHUB_SHA") if [[ "$VERSION" != "$GITHUB_SHA" && "$VERSION" != v* ]]; then VERSION="v$VERSION" fi msg1=$(_justMessage "$_BLUE Running$_LIGHTPURPLE Just an Ultimate Site Tool$_RESET$VERSION") msg2=$(_justMessage "$_BLUE Installing Node.js$_RESET...") msg3=$(_justMessage "$_BLUE Installed Node.js$_RESET") msg4=$(_justMessage "$_GREEN Postprocessing completed$_RESET") msg5=$(_justMessage "$_GREEN Generating completed$_RESET") msg6=$(_justMessage "$_GREEN Compressing completed$_RESET") msg9=$(_justMessage "$_GREEN Generating completed$_RESET") echo -e "$msg1" chmod +x "$GITHUB_ACTION_PATH/src/time.py"# use python to get current time in ms cuz yes TIME0=$(python3 "$GITHUB_ACTION_PATH/src/time.py") installNodejs() { echo -e "$msg2" local TIME1=$(python3 "$GITHUB_ACTION_PATH/src/time.py") if ! command -v node > /dev/null; then# attempt 0: nodejs installed before running _just # attempt 1: install via curl sudo apt-get remove -y nodejs npm > /dev/null 2>&1 || true sudo apt-get update -qq > /dev/null 2>&1 curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - > /dev/null 2>&1 sudo apt-get install -y nodejs > /dev/null 2>&1 if ! command -v node > /dev/null; then # attempt 2: install via curl with logs local ERROR_MESSAGE=$(ErrorMessage "run.sh""0207") echo -e "$ERROR_MESSAGE" sudo apt-get remove -y nodejs npm || true sudo apt-get update -qq curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs if ! command -v node > /dev/null; then # attempt 3: install via sudo apt install local ERROR_MESSAGE=$(ErrorMessage "run.sh""0208") echo -e "$ERROR_MESSAGE" sudo apt update -qq && sudo apt install -y nodejs npm > /dev/null 2>&1 if [ $? -ne 0 ]; then # attempt 4: install via sudo apt install with logs local ERROR_MESSAGE=$(ErrorMessage "run.sh""0205") echo -e "::error::$ERROR_MESSAGE" sudo apt update sudo apt install -y nodejs npm fi fi fi fi local TIME2=$(python3 "$GITHUB_ACTION_PATH/src/time.py") NODEVERSION=$(node --version) NODESECONDS=$(node "$GITHUB_ACTION_PATH/src/time.js""$TIME1""$TIME2") # use js to get nodejs installing duration cuz yes echo -e "$msg3$NODEVERSION ($NODESECONDS)" } if [ -f "$CONFIG_DATA" ]; then ERROR_MESSAGE=$(ErrorMessage "run.sh""0113") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi if [ ! -f "$CONFIG_FILE" ]; then ERROR_MESSAGE=$(ErrorMessage "run.sh""0108") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi CONFIG_JSON=$(node -e "console.log(JSON.stringify(require('./just.config.js')));") if [ $? -ne 0 ]; then ERROR_MESSAGE=$(ErrorMessage "run.sh""0109") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi echo"Parsed just.config.js module.exports: $CONFIG_JSON"# debug echo"$CONFIG_JSON" > "$CONFIG_DATA" if [ -z "$(echo "$CONFIG_JSON" | jq -r '.module.exports')" ]; then ERROR_MESSAGE=$(ErrorMessage "run.sh""0112") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi TYPE=$(echo"$CONFIG_JSON" | jq -r '.type') if [ -z "$TYPE" ]; then ERROR_MESSAGE=$(ErrorMessage "run.sh""0110") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi if [[ "$TYPE" != "postprocessor" && "$TYPE" != "redirect" && "$TYPE" != "compress" && "$TYPE" != "docs" ]]; then ERROR_MESSAGE=$(ErrorMessage "run.sh""0111") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi _just_d="no" && \ if [[ "$TYPE" != "compress" && ! ( "$TYPE" == "docs" && "$INPUT_PATH" != "." ) ]]; then if [ -d "deploy" ]; then ERROR_MESSAGE=$(ErrorMessage "important_dirs""0106") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi if [ -d "_just_data" ]; then ERROR_MESSAGE=$(ErrorMessage "important_dirs""0107") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi mkdir -p deploy mkdir -p _just_data elif [ "$TYPE" == "docs" ]; then JDD=$(echo"$INPUT_PATH/_just_data" | sed 's#//*#/#g') _just_dir=$(echo"$INPUT_PATH/_just" | sed 's#//*#/#g') if [ -d "$JDD" ]; then ERROR_MESSAGE=$(ErrorMessage "important_dirs""0125") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi if [ -d "$_just_dir" ]; then ERROR_MESSAGE=$(ErrorMessage "important_dirs""0125") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi mkdir -p "$JDD" mkdir -p "$_just_dir" _just_d="yes" fi jserr() { echo -e "::error::$(cat "_just_data/e.txt")" && exit 1 } HLJSCSS="$GITHUB_ACTION_PATH/src/documentation/templates/hljs-themes" hljsstyles() { echo"$(node $GITHUB_ACTION_PATH/src/documentation/hljscss.js "$(cat "$HLJSCSS/_just_default_light.css")")" } if [ "$TYPE" == "postprocessor" ]; then set -e postprocessor_checks=$(bash $GITHUB_ACTION_PATH/src/postprocessor/checks.sh 2>&1) || { error_code=$? if [ $error_code -eq 1 ]; then ERROR_MESSAGE=$(ErrorMessage "postprocessor/checks.sh""0100""$postprocessor_checks") if [ "$postprocessor_checks" == "0101" ]; then ERROR_MESSAGE=$(ErrorMessage "postprocessor/checks.sh""0101") fi echo -e "::error::$ERROR_MESSAGE" && exit 1 fi } && \ bash $GITHUB_ACTION_PATH/src/postprocessor/prepare_deployment.sh && \ bash $GITHUB_ACTION_PATH/src/postprocessor/create_api_endpoints.sh && \ bash $GITHUB_ACTION_PATH/src/postprocessor/modify_deployment.sh && \ bash $GITHUB_ACTION_PATH/src/postprocessor/override_deployment.sh && \ installNodejs && \ node $GITHUB_ACTION_PATH/src/compress.js "deploy" && \ bash $GITHUB_ACTION_PATH/src/postprocessor/build_map.sh && \ TIME3=$(python3 "$GITHUB_ACTION_PATH/src/time.py") && \ DONEIN=$(node "$GITHUB_ACTION_PATH/src/time.js""$TIME0""$TIME3") && \ echo -e "$msg4 ($DONEIN)" elif [ "$TYPE" == "redirect" ]; then mkdir -p deploy/_just && \ installNodejs && \ bash $GITHUB_ACTION_PATH/src/redirect/checks.sh && \ node $GITHUB_ACTION_PATH/src/redirect/index.js && \ TIME3=$(python3 "$GITHUB_ACTION_PATH/src/time.py") && \ DONEIN=$(node "$GITHUB_ACTION_PATH/src/time.js""$TIME0""$TIME3") && \ echo -e "$msg5 ($DONEIN)" elif [ "$TYPE" == "compress" ]; then mkdir -p deploy && \ installNodejs && \ node $GITHUB_ACTION_PATH/src/compress.js "$INPUT_PATH" && \ TIME3=$(python3 "$GITHUB_ACTION_PATH/src/time.py") && \ DONEIN=$(node "$GITHUB_ACTION_PATH/src/time.js""$TIME0""$TIME3") && \ echo -e "$msg6 ($DONEIN)" elif [ "$TYPE" == "docs" ]; then HTML=$(cat"$GITHUB_ACTION_PATH/src/documentation/templates/page.html") && \ CSS=$(cat"$GITHUB_ACTION_PATH/src/documentation/templates/base.css") && \ JS=$(cat"$GITHUB_ACTION_PATH/src/documentation/templates/page.js") && \ HIGHLIGHTCSS=$(cat"$HLJSCSS/_just_default_dark.css") && \ HIGHLIGHTJSON=$(hljsstyles) && \ BUTTONSCSS=$(cat"$GITHUB_ACTION_PATH/src/documentation/templates/buttons.css") && \ SEARCHCSS=$(cat"$GITHUB_ACTION_PATH/src/documentation/templates/search.css") && \ CUSTOMCSS=false && \ CUSTOMCSSPATH="just.config.css" && \ if [ -f "$CUSTOMCSSPATH" ]; then CUSTOMCSS=$(cat"$CUSTOMCSSPATH") fi && \ if [[ -d "_just" && "$_just_d" == "no" ]]; then ERROR_MESSAGE=$(ErrorMessage "important_dirs""0121") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi && \ if [ -f "_just_error" ]; then ERROR_MESSAGE=$(ErrorMessage "run.sh""0127") echo -e "::error::$ERROR_MESSAGE" && exit 1 fi && \ mkdir -p _just && \ mkdir -p deploy && \ installNodejs && \ bash $GITHUB_ACTION_PATH/src/documentation/checks.sh && \ INDEXJS0="$GITHUB_ACTION_PATH/src/documentation/index.js" INDEXJS1=$(cat"$INDEXJS0") && \ INDEXJS2=$(cat"$GITHUB_ACTION_PATH/src/line.js") && \ echo"$INDEXJS2" > "$INDEXJS0" && \ INDEXJS3=$(node "$INDEXJS0""$INDEXJS1") && \ echo"$INDEXJS3" > "$INDEXJS0" && \ HLJSLANGS=$(cat"$GITHUB_ACTION_PATH/data/hljslangs.json") && \ LANGS=$(cat"$GITHUB_ACTION_PATH/data/langs.json") && \ LANGSTEXT=$(cat"$GITHUB_ACTION_PATH/data/langstext.json") && \ node "$INDEXJS0""$HTML""$CSS""$JS""$INPUT_PATH""$GITHUB_REPOSITORY""$GITHUB_REPOSITORY_OWNER""$CUSTOMCSS""$HLJSLANGS""$LANGS""$HIGHLIGHTCSS""$LANGSTEXT""$VERSION""$BUTTONSCSS""$SEARCHCSS""$HIGHLIGHTJSON""$INPUT_FIXPATH" || jserr && \ node $GITHUB_ACTION_PATH/src/compress.js "$INPUT_PATH" && \ node "$GITHUB_ACTION_PATH/src/documentation/logs.js""$INPUT_PATH" && \ TIME3=$(python3 "$GITHUB_ACTION_PATH/src/time.py") && \ DONEIN=$(node "$GITHUB_ACTION_PATH/src/time.js""$TIME0""$TIME3") && \ echo -e "$msg9 ($DONEIN)" fi
test
JavaScript/* MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ const [time1, time2] = process.argv.slice(2); const diff = Math.ceil(Math.ceil(parseInt(time2, 10)) - Math.ceil(parseInt(time1, 10))); functiontime(ms) { const s_ = Math.ceil(ms/1000); if (ms < 0) { return"0ms"; } elseif (ms < 1000) { return`${ms}ms`; } elseif (s_ > 60) { return`${Math.ceil(s_/60*100)/100}m`; } else { return`${Math.ceil(ms/100)/10}s`; } } console.log(time(diff));
Python# MIT License # # Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. #!/usr/bin/env python3 import time out = int(time.time() * 1000) print(out)
- name: Generate with _just uses: js-just/latest@main with: # Remove "with" and "path" here if you are not using compressor or generator modes! path: . # Root directory, or you can replace the dot with the path to your website/docs directory to be generated/compressed. (Only for compressor and generator modes) - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: . # Root directory, or you can replace the dot with the path to your entire website to be deployed to GitHub Pages. deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest needs: build steps: - name: Deploy to GitHub Pages id: deployment
uses: actions/deploy-pages@v4 ``` You can change name of workflow file and workflow name: ```yml name: Workflow name ``` You can also choose _just version: ```yml
uses: js-just/_just@(put version name here) ``` **If you know what exactly you are doing, you may change anything.** - Create `just.config.js` file in the root directory: Choose what mode you want to use.
Using `Postprocessor` mode: ```js module.exports = { type: "postprocessor" } ``` Using `Redirector` mode: ```js module.exports = {
type: "redirect", redirect_config: { url: "https://example.com/", // Required. Replace with destination URL. } } ``` Using `Compressor` mode: ```js module.exports = { type: "compress" } ``` Using `Generator` mode: ```js module.exports = { type: "docs", docs_config: { metatitle: "Documentation title", // Required. Replace with your documentation title.
domain: "example.com" // Required. Replace with your domain name. Domain name should be valid.
} } ``` - Read the documentation for the mode that you've chosen. --- ### Pro installation - Create or modify your `.github/workflows/github_pages_workflow_name.yml`: Make sure that permissions allow writing `pages` and `id-token`, but do not allow writing `contents`, only read. ```yml permissions: contents: read pages: write id-token: write ``` Make a job for building your website using _just: ```yml jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4
- name: Generate with _just uses: js-just/_just@ # version name (recommended) (example: v0.0.29) / main branch (latest commit) (unstable, not recommended) / commit SHA (not recommended) with:
path: # Path to your website directory to be generated/compressed. (Only for compressor and generator modes) ``` - Create `just.config.js` file: Basic usage: ```js module.exports = { type: "(postprocessor/redirect/compress/docs)" } ``` Using multiple modes: -# Currently available only combining generator and compressor. ```js module.exports = { type: ["docs", "compress"] } ``` - Read the documentation for the mode/modes that you've chosen.
Markdown_just: title: Redirector Mode # Redirector mode This mode requires only the just.config.js file, ~except for the workflow file~. `just.config.js` ```js module.exports = { type: "redirect", redirect_config: { url: "https://example.com/" // Required. Replace with destination URL.
} } ``` > [!TIP] Do not use this mode if you can make server-side `HTTP 3XX` redirects. You can add `params{}`: ```js module.exports = { type: "redirect", redirect_config: { url: "https://example.com/", // Required. Replace with destination URL. params: { // Optional. title: "redirect website title here", // Optional. Replace with any title you want. Recommended. description: "redirect website description here", // Optional. Replace with any description you want. keywords: "some, keywords, here", // Optional. Replace with any keywords you want. Separate keywords by commas. htmlLang: "en", // Optional. <htmllang="${htmlLang}"> robots: "index", // Optional. <metaname="robots"content="${robots}"> charset: "utf-8", // Optional. "utf-8" by default. <metacharset="${charset}"> and file charset. viewport: "width=device-width, initial-scale=1.0", // Optional. "width=device-width, initial-scale=1.0" by default. <metaname="viewport"content="${viewport}"> yandex: "", // Optional. Put your Yandex verification string here. <metaname="yandex-verification"content="${yandex}"> google: "", // Optional. Put your Google verification string here. <metaname="google-site-verification"content="${google}"> googleAnalytics: "" // Optional. Put your Google Analytics ID here. } } } ``` You can also add `content{}` in `params{}` if you want to modify HTML content. ```js module.exports = { type: "redirect", redirect_config: { url: "https://example.com/", // Required. Replace with destination URL.
Markdown_just: title: Docs # _just Docs Welcome to Just an Ultimate Site Tool documentation! -# "**`_just`**" is an abbreviation of **Just an Ultimate Site Tool**. --- ## What is _just? Just an Ultimate Site Tool is a GitHub Action for building static websites. Currently it have 4 modes: - `Postprocessor`: Modify and add your own files to generated Next.js website. - `Redirector`: Client-side redirect using JavaScript. - `Compressor`: Compresses your website. - `Generator`: Generates documentation website using Markdown. > [!WARNING] Just an Ultimate Site Tool is still in development at the **alpha** stage. Expect regular updates, possible bugs, and changes. If you have found a bug, please [report it here](https://github.com/js-just/_just/issues/new?labels=bug&template=bug.md). > [!CAUTION] The docs are under construction! > [!TIP] Do not use `Redirector` if you can make server-side `HTTP 3XX` redirects. ## Why _just? 1. __No packages.__ 2. __Fast build.__ 3. __**No watermarks.**__ -# _just uses Node.js, but _just does not require you to use Node.js/npm/pnpm/Yarn/related packages stuff. _just: next: /docs/getting-started
test
SVG<!-- MIT License Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \--> <svgxmlns="http://www.w3.org/2000/svg"width="1024"height="1024"viewBox="0 0 1024 1024"version="1.1"> <pathd="M 518.656 198.677 C 518.404 198.929, 516.016 199.317, 513.349 199.538 C 506.674 200.092, 500.971 200.830, 498 201.525 C 496.625 201.847, 494.375 202.255, 493 202.432 C 488.792 202.974, 483.782 203.983, 477.500 205.555 C 469.302 207.605, 468.500 207.823, 468.500 208.006 C 468.500 208.093, 467.237 208.371, 465.694 208.624 C 463.331 209.011, 452.219 212.639, 447 214.727 C 446.175 215.057, 445.275 215.388, 445 215.463 C 442.343 216.183, 439.406 217.396, 439 217.941 C 438.725 218.310, 435.575 219.648, 432 220.915 C 423.517 223.922, 418.676 226.144, 417.765 227.448 C 417.361 228.027, 417.024 228.151, 417.015 227.724 C 416.995 226.714, 395.745 237.805, 394.773 239.333 C 394.365 239.975, 394.024 240.146, 394.015 239.714 C 394.007 239.282, 392.321 240.069, 390.268 241.464 C 388.215 242.859, 386.212 244, 385.816 244 C 384.771 244, 372.505 252.686, 371.016 254.480 C 369.412 256.413, 367.274 256.417, 365.348 254.491 C 364.518 253.661, 363.476 253.206, 363.033 253.480 C 362.589 253.754, 361.671 253.308, 360.991 252.489 C 360.311 251.670, 358.910 251, 357.878 251 C 356.845 251, 356 250.550, 356 250 C 356 249.450, 355.525 249, 354.944 249 C 354.363 249, 351.326 247.729, 348.194 246.175 C 345.062 244.621, 342.050 243.217, 341.500 243.055 C 340.950 242.893, 339.375 242.318, 338 241.778 C 327.899 237.809, 317.310 234.344, 316.342 234.691 C 315.705 234.919, 314.890 234.632, 314.533 234.053 C 314.175 233.474, 312.634 233, 311.108 233 C 309.582 233, 308.024 232.691, 307.646 232.313 C 307.268 231.935, 306.181 231.516, 305.230 231.382 C 304.278 231.248, 299.675 230.236, 295 229.133 C 290.325 228.031, 284.025 226.868, 281 226.548 C 277.975 226.228, 273.025 225.659, 270 225.283 C 252.363 223.091, 209.932 224.968, 197 228.513 C 196.725 228.588, 194.250 228.986, 191.500 229.397 C 188.750 229.808, 185.375 230.568, 184 231.086 C 182.625 231.603, 180.488 232.246, 179.250 232.513 C 170.497 234.407, 167.510 235.268, 166.250 236.260 C 165.563 236.802, 165 236.989, 165 236.676 C 165 236.363, 161.963 237.233, 158.250 238.609 C 154.538 239.986, 150.825 241.267, 150 241.457 C 147.263 242.086, 139.530 245.318, 137.527 246.669 C 136.443 247.401, 134.789 248, 133.852 248 C 131.586 248, 98 264.963, 98 266.107 C 98 266.598, 97.155 267, 96.122 267 C 95.090 267, 93.685 267.675, 93 268.500 C 92.315 269.325, 91.205 270, 90.533 270 C 89.860 270, 88.495 270.900, 87.500 272 C 86.505 273.100, 85.085 274, 84.345 274 C 83.605 274, 83 274.450, 83 275 C 83 275.550, 82.501 276, 81.891 276 C 79.879 276, 62 293.252, 62 295.193 C 62 295.715, 61.437 296.770, 60.750 297.537 C 60.062 298.303, 58.985 299.552, 58.355 300.311 C 56.590 302.438, 49.052 318.249, 48.729 320.500 C 48.571 321.600, 48.137 322.988, 47.765 323.584 C 47.392 324.180, 46.818 326.205, 46.488 328.084 C 46.159 329.963, 45.500 333.300, 45.022 335.500 C 42.724 346.102, 45.051 371.259, 49.057 379.112 C 50.126 381.207, 51 383.664, 51 384.572 C 51 388.475, 62.719 406.730, 69.448 413.306 C 74.672 418.413, 79.015 422, 79.973 422 C 80.538 422, 81 422.360, 81 422.801 C 81 423.640, 89.638 429.408, 90.185 428.933 C 90.358 428.783, 92.483 429.911, 94.907 431.441 C 97.330 432.971, 99.805 434.298, 100.407 434.390 C 101.008 434.481, 101.950 434.821, 102.500 435.145 C 110.803 440.033, 138.482 442.831, 152.255 440.174 C 156.691 439.318, 169.650 439.457, 176.500 440.434 C 178.150 440.670, 179.982 440.893, 180.570 440.931 C 182.470 441.053, 190.132 448.217, 191.108 450.783 C 192.858 455.388, 193.088 459.655, 193.517 495.642 C 193.752 515.364, 194.165 534.200, 194.434 537.500 C 194.703 540.800, 195.137 546.200, 195.400 549.500 C 195.662 552.800, 196.123 556.886, 196.423 558.581 C 196.723 560.276, 197.185 563.201, 197.450 565.081 C 197.714 566.961, 198.170 569.625, 198.464 571 C 198.757 572.375, 199.257 575.525, 199.576 578 C 200.060 581.763, 201.684 589.358, 203.424 596 C 203.640 596.825, 204.374 599.750, 205.054 602.500 C 205.735 605.250, 206.910 608.733, 207.666 610.240 C 208.422 611.746, 209.038 613.321, 209.035 613.740 C 209.020 615.802, 212.551 626, 213.281 626 C 213.741 626, 213.890 626.370, 213.610 626.822 C 213.331 627.274, 213.795 628.961, 214.641 630.572 C 215.487 632.182, 216.353 634.366, 216.566 635.424 C 217.569 640.418, 233.042 669.497, 240.107 679.663 C 241.698 681.953, 243 684.316, 243 684.913 C 243 685.511, 243.367 686, 243.815 686 C 244.263 686, 245.381 687.575, 246.299 689.500 C 247.217 691.425, 248.395 693, 248.916 693 C 249.438 693, 250.126 693.821, 250.444 694.824 C 250.762 695.827, 251.824 697.514, 252.803 698.574 C 253.782 699.633, 256.069 702.668, 257.886 705.318 C 259.703 707.967, 261.822 710.378, 262.595 710.675 C 263.368 710.971, 264 711.579, 264 712.025 C 264 713.441, 280.782 731.865, 289.877 740.434 C 292.834 743.220, 297.359 747.525, 299.932 750 C 306.218 756.047, 315.475 763.938, 319.874 767 C 321.850 768.375, 324.316 770.260, 325.355 771.188 C 328.588 774.077, 341.899 783, 342.977 783 C 343.539 783, 344 783.348, 344 783.773 C 344 784.198, 345.688 785.416, 347.750 786.481 C 349.813 787.545, 352.713 789.236, 354.196 790.238 C 356.992 792.127, 378.500 803.373, 378.500 802.946 C 378.500 802.813, 380.525 803.737, 383 805 C 385.475 806.263, 387.500 807.198, 387.500 807.078 C 387.500 806.958, 388.850 807.388, 390.500 808.034 C 398.667 811.233, 405.577 813.805, 406.250 813.897 C 406.663 813.954, 407.225 814.056, 407.500 814.125 C 407.775 814.194, 408.337 814.335, 408.750 814.438 C 409.163 814.542, 412.450 815.569, 416.056 816.721 C 419.661 817.872, 424.161 819.071, 426.056 819.383 C 427.950 819.696, 430.850 820.324, 432.500 820.778 C 434.150 821.232, 436.175 821.551, 437 821.486 C 437.825 821.421, 439.175 821.690, 440 822.083 C 440.825 822.477, 443.975 823.106, 447 823.482 C 479.004 827.453, 509.300 826.187, 542.500 819.491 C 543.600 819.269, 544.950 819.023, 545.500 818.945 C 546.050 818.867, 547.343 818.351, 548.374 817.800 C 549.405 817.248, 551.205 816.676, 552.374 816.528 C 558.106 815.803, 574.895 810.501, 583 806.857 C 584.375 806.238, 586.400 805.403, 587.500 805.001 C 592.414 803.203, 609.632 795.547, 610.851 794.617 C 611.594 794.051, 612.755 793.506, 613.432 793.407 C 614.108 793.308, 618 791.301, 622.081 788.947 C 626.161 786.593, 630.962 783.973, 632.750 783.125 C 634.538 782.277, 636 781.227, 636 780.792 C 636 780.356, 636.873 780, 637.941 780 C 639.009 780, 640.171 779.532, 640.525 778.959 C 640.879 778.387, 643.043 776.746, 645.334 775.312 C 647.625 773.879, 650.574 771.647, 651.886 770.353 C 654.887 767.394, 656.038 767.408, 660.531 770.456 C 662.521 771.807, 666.479 773.789, 669.325 774.860 C 672.171 775.931, 676.750 777.923, 679.500 779.288 C 682.250 780.652, 687.425 782.758, 691 783.967 C 694.575 785.176, 698.897 786.793, 700.604 787.560 C 703.908 789.045, 714.204 791.756, 720 792.666 C 721.925 792.968, 724.276 793.627, 725.224 794.129 C 726.172 794.631, 730.447 795.511, 734.724 796.083 C 739.001 796.655, 743.625 797.340, 745 797.606 C 750.749 798.715, 759.518 799.235, 776.500 799.471 C 799.268 799.789, 812.128 798.661, 831.500 794.650 C 832.600 794.422, 835.410 793.919, 837.745 793.531 C 840.079 793.143, 842.248 792.408, 842.564 791.897 C 842.880 791.386, 843.489 791.184, 843.918 791.449 C 844.582 791.860, 858.409 788.125, 863 786.296 C 863.825 785.967, 864.950 785.597, 865.500 785.474 C 867.450 785.037, 876.544 781.836, 879.500 780.546 C 882.252 779.345, 887.500 777.118, 892.500 775.029 C 900.922 771.510, 917 763.451, 917 762.749 C 917 762.272, 917.414 762.138, 917.919 762.450 C 918.425 762.763, 919.438 762.451, 920.169 761.758 C 920.901 761.065, 923.975 759.200, 927 757.612 C 932.504 754.724, 941.704 748.953, 945.440 746.046 C 949.684 742.744, 957.972 734.449, 957.985 733.491 C 957.993 732.935, 958.900 731.919, 960 731.232 C 961.100 730.545, 962 729.378, 962 728.638 C 962 727.898, 963.090 726.116, 964.422 724.678 C 968.304 720.490, 976.276 702.756, 977.539 695.500 C 979.207 685.914, 979.659 680.484, 979.480 672.167 C 979.246 661.296, 978.304 653.436, 976.926 650.863 C 976.417 649.910, 976 648.387, 976 647.478 C 976 644.894, 969.226 630.091, 965.256 624 C 955.874 609.605, 929.667 589, 920.742 589 C 920.004 589, 918.973 588.575, 918.450 588.055 C 917.928 587.536, 916.061 586.859, 914.301 586.550 C 912.542 586.242, 909.998 585.570, 908.648 585.056 C 902.810 582.837, 884.480 582.241, 872.620 583.885 C 851.766 586.777, 834.628 581.777, 832.550 572.194 C 832.229 570.712, 831.721 568.375, 831.422 567 C 830.965 564.900, 829.683 500.778, 829.913 491.500 C 830.055 485.772, 825.439 448.343, 823.873 442.529 C 823.279 440.324, 822.649 437.390, 822.472 436.010 C 822.114 433.212, 818.282 418.339, 817.317 416 C 816.977 415.175, 816.591 414.050, 816.460 413.500 C 815.768 410.596, 811.657 399.237, 810.461 396.925 C 809.701 395.456, 809.362 393.972, 809.707 393.627 C 810.051 393.282, 809.883 393, 809.333 393 C 808.783 393, 808.333 392.367, 808.333 391.594 C 808.333 390.304, 805.895 384.797, 800.765 374.500 C 793.332 359.580, 789.947 353.455, 784.817 345.646 C 781.617 340.776, 779 336.581, 779 336.323 C 779 335.758, 768.812 322.352, 766.164 319.431 C 765.132 318.294, 764.110 316.876, 763.894 316.282 C 762.158 311.520, 729.615 278.189, 714 265.182 C 709.325 261.288, 703.870 256.728, 701.878 255.051 C 699.887 253.373, 697.787 252, 697.212 252 C 696.637 252, 696.017 251.606, 695.833 251.126 C 695.430 250.069, 680.296 239.716, 675.746 237.384 C 673.961 236.469, 672.275 235.413, 672 235.036 C 671.725 234.659, 669.475 233.316, 667 232.050 C 664.525 230.785, 661.825 229.374, 661 228.914 C 655.177 225.668, 642 219.151, 642 219.517 C 642 219.764, 640.399 219.067, 638.443 217.968 C 636.486 216.869, 634.124 215.842, 633.193 215.686 C 632.262 215.530, 630.600 214.928, 629.500 214.349 C 624.814 211.881, 597.497 204.064, 587.500 202.332 C 578.874 200.836, 571.669 199.787, 567 199.347 C 559.665 198.655, 519.238 198.095, 518.656 198.677"stroke="none"fill="#6c3cf4"fill-rule="evenodd"/> </svg>
Markdown# This is a test page Generated using [Just an Ultimate Site Tool](https://just.is-a.dev/). Some **bold**, *italic*, ***important***, __underlined__, ~~strikethrough~~, ~sub~, ^super^, ==marked==, __***very important***__, __==***extreme important***==__, ~~***not important***~~ text. Some `code`; **`bold`**, *`italic`*, ***`important`***, __`underlined`__, ~~`strikethrough`~~, ~`sub`~, ^`super`^, ==`marked`==, __***`very important`***__, __==***`extreme important`***==__, ~~***`not important`***~~ code. 1. List 2. (with numbers) - List - (no numbers) A line: --- ``` Some code here ``` # Blockquotes test > A blockquote. > > Another one! > > > And another blockquote! > > > > Many nested blockquotes. > > > > > This line should not be another nested blockquote. (Limit: 4 nested blockqutes) > <_justelement="OMZq"></_just>[!NOTE] A note! > [!TIP] A tip! > [!IMPORTANT] Something important. > [!WARNING] A warning! > [!CAUTION] Another warning? > <_justelement="OMZq"></_just>[!NOTE] `[!NOTE]`, `[!TIP]`, `[!IMPORTANT]`, `[!WARNING]` and `[!CAUTION]` are should be in one line. You can add \<br> tags to break the line for HTML. <br> > `[!NOTE]`, `[!TIP]`, `[!IMPORTANT]`, `[!WARNING]` and `[!CAUTION]` cannot have nested blockquotes. # Headers test (h1) ## h2 ### h3 #### h4 ##### h5 ###### h6 > [!IMPORTANT] Only h1, h2, h3 and h4 will be included in the "On this page" content list and will have their own unique IDs for shortlinks. # Escape test Not a line: \--- \1. Not a list 2\. (with numbers) \- Not a list \- (no numbers) ``` No code here ``` \> Not a blockquote. > <_justelement="OMZq"></_just>\[!NOTE] A blockquote, but not a note. # Links test [a link](https://just.is-a.dev/ "link title") <https://just.is-a.dev/> https://just.is-a.dev --- ## v0.0.28 bugs: #### blockquote link: > [!WARNING] Just an Ultimate Site Tool is in **beta**. Expect regular updates, possible bugs, and changes. If you have found a bug, please [report it here](https://github.com/js-just/_just/issues/new?labels=bug&template=bug.md). #### text styling: "**`_just`**" ## v0.0.29 features: -# small text _just: prev: /docs/getting-started _just: next: /docs/getting-started
Markdown_just: title: Mattcone's Markdown Test # Markdown test This is a Markdown test for the Markdown Guide tools directory. --- headings # One ## Two ### Three #### Four ##### Five ###### Six Alternate One ============= Alternate Two ------------- --- paragraphs first paragraph second para --- line breaks line one with trailing whitespace line two right under line one with no trailing whitespace, just hard return line two right under line one with no trailing backslash \ line two right under --- bold **asterisks** __underscores__ in**middle**here --- italic *asterisk* _underscore_ in*middle*here --- bold and italic ***asterisks*** ___underscores___ __*combo*__ **_second combo_** --- blockquotes > single > <_justelement="OMZq"></_just>multi > line > <_justelement="OMZq"></_just>nested > > > blockquotes --- ordered lists 1. first 2. second 3. third 1. this 2. is 1. nested 3. now --- unordered lists - dashes - here - nested * asterisks * here + plus + signs --- code `one tick mark`
<onetab> <indented> --- horizontal rules throughout this :) --- links normal link => [cnn](https://cnn.com) brackets => <https://cnn.com> brackets => <me@somewhere.com> naked url (test auto link) => https://cnn.com --- images  --- ## Tables | Syntax | Description | | ----------- | ----------- | | Header | Title | | Paragraph | Text | --- ## Fenced code blocks ``` { "firstName": "John", "lastName": "Smith", "age": 25 } ``` --- ## Syntax highlighting ```json { "firstName": "John", "lastName": "Smith", "age": 25 } ``` --- ## Footnotes Here's a simple footnote,[^1] and here's a longer one.[^bignote] [^1]: This is the first footnote. [^bignote]: Here's one with multiple paragraphs and code.
Indent paragraphs to include them in the footnote.
`{ my code }`
Add as many paragraphs as you like. --- ## Heading IDs ### My Great Heading {#custom-id} --- ## Definition lists First Term : This is the definition of the first term. Second Term : This is one definition of the second term. : This is another definition of the second term. --- ## Strikethrough ~~two tilde~~ ~one tilde~ --- ## Task lists - [x] Write the press release - [ ] Update the website - [ ] Contact the media --- ## Emoji copy and paste: ☕ shortcodes: :joy: --- ## Highlight ==twoequals== ::twohypens:: --- ## Subscript H~2~O --- ## Superscript X^2^ --- ## Abbreviation *[HTML]: Hyper Text Markup Language The HTML specification is maintained by the W3C. --- ## HTML <em>italic test</em> <strong>bold test</strong>
Markdowntest Swipe right to open the menu and swipe left to close it.