@adamlui/scss-to-css 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # 🏛️ MIT License
2
2
 
3
- **Copyright © 2024 [Adam Lui](https://github.com/adamlui) & contributors**
3
+ **Copyright © 2024 [Adam Lui](https://github.com/adamlui) & contributors.**
4
4
 
5
5
  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:
6
6
 
package/README.md CHANGED
@@ -27,14 +27,14 @@
27
27
 
28
28
  # { } scss-to-css
29
29
 
30
- ### Recursively compile all SCSS files into minified CSS.
30
+ ### Recursively compile all SCSS files into minified CSS
31
31
 
32
32
  <a href="https://www.npmjs.com/package/@adamlui/scss-to-css">
33
33
  <img height=31 src="https://img.shields.io/npm/dm/%40adamlui%2Fscss-to-css?logo=npm&color=af68ff&logoColor=white&labelColor=464646&style=for-the-badge"></a>
34
34
  <a href="#%EF%B8%8F-mit-license">
35
35
  <img height=31 src="https://img.shields.io/badge/License-MIT-orange.svg?logo=internetarchive&logoColor=white&labelColor=464646&style=for-the-badge"></a>
36
- <a href="https://github.com/adamlui/js-utils/releases/tag/scss-to-css-2.1.0">
37
- <img height=31 src="https://img.shields.io/badge/Latest_Build-2.1.0-44cc11.svg?logo=icinga&logoColor=white&labelColor=464646&style=for-the-badge"></a>
36
+ <a href="https://github.com/adamlui/js-utils/releases/tag/scss-to-css-2.2.1">
37
+ <img height=31 src="https://img.shields.io/badge/Latest_Build-2.2.1-44cc11.svg?logo=icinga&logoColor=white&labelColor=464646&style=for-the-badge"></a>
38
38
  <a href="https://www.npmjs.com/package/@adamlui/scss-to-css?activeTab=code">
39
39
  <img height=31 src="https://img.shields.io/npm/unpacked-size/%40adamlui%2Fscss-to-css?style=for-the-badge&logo=ebox&logoColor=white&color=blue&labelColor=464646"></a>
40
40
  <a href="https://sonarcloud.io/component_measures?metric=new_vulnerabilities&id=adamlui_scss-to-css:src/scss-to-css.js">
@@ -158,11 +158,12 @@ Boolean options:
158
158
  -q, --quiet Suppress all logging except errors.
159
159
 
160
160
  Parameter options:
161
- --ignores="dir/,file1.scss,file2.scss" Files/directories to exclude from
161
+ --ignores="dir/,file1.scss,file2.sass" Files/directories to exclude from
162
162
  compilation.
163
163
  --comment="comment" Prepend header comment to
164
164
  compiled CSS. Separate by
165
165
  line using '\n'.
166
+ --ui-lang="code" ISO 639-1 code of language to display UI in.
166
167
  --config="path/to/file" Load custom config file.
167
168
 
168
169
  Commands:
@@ -287,7 +288,7 @@ findSCSS() » Search complete! 2 files found.
287
288
  findSCSS() » Check returned array.
288
289
  [
289
290
  'E:\\js\\utils\\scss-to-css\assets\\scss\\foo.scss',
290
- 'E:\\js\\utils\\scss-to-css\assets\\scss\\bar.scss'
291
+ 'E:\\js\\utils\\scss-to-css\assets\\scss\\bar.sass'
291
292
  ]
292
293
  */
293
294
  ```
@@ -4,8 +4,6 @@
4
4
  * Source: https://github.com/adamlui/scss-to-css/tree/main/src
5
5
  * Documentation: https://github.com/adamlui/scss-to-css/tree/main/docs
6
6
  */
7
- (async()=>{var e,s=process.argv.slice(2);globalThis.env={debugMode:s.some(e=>/^--?debug(?:-?mode)?$/.test(e)),devMode:/[\\/]src(?:[\\/]|$)/i.test(__dirname)};let o=require("node-clipboardy"),c=require("fs"),{generateRandomLang:i,getMsgs:n,getSysLang:r}=require(`./lib/language${env.devMode?"":".min"}.js`),t=require(`./lib/log${env.devMode?"":".min"}.js`),a=require("path"),p=require(`../scss-to-css${env.devMode?"":".min"}.js`),g=require(`./lib/settings${env.devMode?"":".min"}.js`);Object.assign(globalThis.app??={},require(`../${env.devMode?"../":"./data/"}app.json`)),t.debug(app.msgs=await n(env.debugMode?i({excludes:["en"]}):r())),app.urls.docs+="/#-command-line-usage";for(e of s){if(g.controls.init.regex.test(e))return g.initConfigFile();if(g.controls.help.regex.test(e))return t.help();if(g.controls.version.regex.test(e))return t.version()}let[l="",f=""]=s.filter(e=>!e.startsWith("-")).map(e=>e.replace(/^\/*/,"")),d=a.resolve(process.cwd(),l);l&&!c.existsSync(d)&&(s=d+".scss",c.existsSync(s)?d=s:(t.error(`${app.msgs.error_firstArgNotExist}.\n${d} ${app.msgs.error_doesNotExist}.`),t.success(app.msgs.info_exampleValidCmd+`:
8
- » scss-to-css . output.min.css`),t.helpCmdAndDocURL(),process.exit(1))),g.load();var m,s=d.endsWith(".scss")&&!c.statSync(d).isDirectory()?[d]:p.findSCSS(d,{recursive:!app.config.noRecursion,verbose:!app.config.quietMode,ignores:(app.config.ignores?.split(",")??[]).map(e=>e.trim())});if(app.config.dryRun)s.length?(t.info(app.msgs.info_scssFilesToBeCompiled+":"),s.forEach(e=>console.info(e))):t.info(`
9
- ${app.msgs.info_noSCSSfilesWillBeCompiled}.`);else{let i=[],e=[];!app.config.relativeOutput&&c.statSync(d).isDirectory()?(m=p.compile(d,{verbose:!app.config.quietMode,minify:!app.config.noMinify,comment:app.config.comment?.replace(/\\n/g,"\n"),relativeOutput:!1,recursive:!app.config.noRecursion,dotFolders:!!app.config.includeDotFolders,sourceMaps:!app.config.noSourceMaps,ignores:app.config.ignores?app.config.ignores.split(",").map(e=>e.trim()):[]}),Array.isArray(m)&&(e=m),m&&(m.error?i.push(d):e=[].concat(m))):e=s.map(e=>{var s=p.compile(e,{verbose:!app.config.quietMode,minify:!app.config.noMinify,sourceMaps:!app.config.noSourceMaps,comment:app.config.comment?.replace(/\\n/g,"\n")});return s.error&&i.push(e),s}).filter(e=>!e.error),app.config.quietMode||(s=1==(m=e.length)?"":"s",m?(t.success(app.msgs.info_compilationComplete+"!"),t.data(`${m} CSS ${app.msgs.info_file}${s}${app.config.noSourceMaps?"":` + ${m} `+app.msgs.info_srcMap+s} ${app.msgs.info_generated}.`)):console.info(app.msgs.info_noSCSSfilesProcessed+"."),i.length&&(t.error(i.length+" "+app.msgs.info_file+(1==i.length?"":"s"),app.msgs.info_failedToCompile+":"),i.forEach(e=>t.ifNotQuiet(e)))),e?.length&&(app.config.copy&&1==e?.length?(t.data(e[0].code),t.ifNotQuiet(`
10
- ${app.msgs.info_copying}...`),o.writeSync(e[0].code)):(t.ifNotQuiet(`
11
- ${app.msgs.info_writing}${1<e?.length?"s":""}...`),e?.forEach(({code:e,srcMap:s,srcPath:i,relPath:o})=>{let n,r;if(!app.config.relativeOutput&&o){let e=a.resolve(process.cwd(),f||"css"),s=a.dirname(o);n="."!=s?a.join(e,s):e,r=`${a.basename(i,".scss")}${app.config.noMinify?"":".min"}.css`}else n=a.join(a.dirname(i),f.endsWith(".css")?a.dirname(f):f||"css"),r=`${f.endsWith(".css")&&l.endsWith(".scss")?a.basename(f).replace(/(\.min)?\.css$/,""):a.basename(i,".scss")}.min.css`;let p=a.join(n,r);c.mkdirSync(n,{recursive:!0}),c.writeFileSync(p,e,"utf8"),t.ifNotQuiet(` ${t.colors.bg}✓${t.colors.nc} `+a.relative(process.cwd(),p)),app.config.noSourceMaps||c.writeFileSync(p+".map",JSON.stringify(s),"utf8"),t.ifNotQuiet(` ${t.colors.bg}✓${t.colors.nc} ${a.relative(process.cwd(),p)}.map`)})))}})();
7
+ (async()=>{globalThis.env={args:process.argv.slice(2),devMode:/[\\/]src(?:[\\/]|$)/i.test(__dirname)},env.debugMode=env.args.some(e=>/^--?debug(?:-?mode)?$/.test(e)),env.modExt=`${env.devMode?"":".min"}.js`;let e=require("./lib/compile"+env.modExt),s=require("../scss-to-css"+env.modExt).findSCSS,i=require("fs"),r=require("./lib/init"+env.modExt),o=require("./lib/log"+env.modExt),c=require("path");if(await r.cli(),cli.config.init)return r.configFile();if(cli.config.help)return o.help();if(cli.config.version)return o.version();var[n="",t=""]=env.args.filter(e=>!e.startsWith("-")).map(e=>e.replace(/^\/*/,""));let l=c.resolve(process.cwd(),n);n&&!i.existsSync(l)&&(d=l+".scss",i.existsSync(d)?l=d:(o.error(`${cli.msgs.error_firstArgNotExist}.\n${l} ${cli.msgs.error_doesNotExist}.`),o.success(cli.msgs.info_exampleValidCmd+`:
8
+ » scss-to-css . output.min.css`),o.helpCmdAndDocURL(),process.exit(1)));var d=/s[ac]ss$/.test(l)&&!i.statSync(l).isDirectory()?[l]:s(l,{recursive:!cli.config.noRecursion,verbose:!cli.config.quietMode,ignores:cli.config.ignores});env.debugMode||cli.config.dryRun?d.length?(o.info(cli.msgs.info_scssFilesToBeCompiled+":"),d.forEach(e=>o.dim(e))):o.info(`
9
+ ${cli.msgs.info_noSCSSfilesWillBeCompiled}.`):e.scss({srcFiles:d,inputPath:l,inputArg:n,outputArg:t})})();
@@ -0,0 +1,8 @@
1
+ /**
2
+ * © 2024–2026 Adam Lui & contributors under the MIT license.
3
+ * Source: https://github.com/adamlui/scss-to-css/tree/main/src
4
+ * Documentation: https://github.com/adamlui/scss-to-css/tree/main/docs
5
+ */
6
+ let log=require("./log"+env.modExt);module.exports={scss({srcFiles:i,inputPath:e,inputArg:r,outputArg:t}){let o=require("../../scss-to-css"+env.modExt).compile,g=require("fs"),f=require("path"),c=[],s=[];var n;!cli.config.relativeOutput&&g.statSync(e).isDirectory()?(n=o(e,{verbose:!1,minify:!cli.config.noMinify,comment:cli.config.comment,relativeOutput:!1,recursive:!cli.config.noRecursion,dotFolders:cli.config.includeDotFolders,sourceMaps:!cli.config.noSourceMaps,ignores:cli.config.ignores}))&&(n.error?c.push(e):s=[].concat(n)):s=i.map(i=>{var e=o(i,{verbose:!cli.config.quietMode,minify:!cli.config.noMinify,sourceMaps:!cli.config.noSourceMaps,comment:cli.config.comment});return e.error&&c.push(i),e}).filter(i=>!i.error),cli.config.quietMode||(n=1==(e=s.length)?"":"s",e?(log.success(cli.msgs.info_compilationComplete+"!"),log.data(`${e} CSS ${cli.msgs.info_file}${n}${cli.config.noSourceMaps?"":` + ${e} `+cli.msgs.info_srcMap+n} ${cli.msgs.info_generated}.`)):console.info(cli.msgs.info_noSCSSfilesProcessed+"."),c.length&&(log.error(c.length+" "+cli.msgs.info_file+(1==c.length?"":"s"),cli.msgs.info_failedToCompile+":"),c.forEach(i=>log.ifNotQuiet(i)))),s?.length&&(cli.config.copy&&1==s?.length?(log.data(s[0].code),log.ifNotQuiet(`
7
+ ${cli.msgs.info_copyingToClip}...`),require("node-clipboardy").writeSync(s[0].code)):(log.ifNotQuiet(`
8
+ ${cli.msgs.info_writing}${1<s?.length?"s":""}...`),s?.forEach(({code:i,srcMap:e,srcPath:o,relPath:c})=>{let s,n;if(!cli.config.relativeOutput&&c){let i=f.resolve(process.cwd(),t||"css"),e=f.dirname(c);s="."!=e?f.join(i,e):i,n=`${f.basename(o,f.extname(o))}${cli.config.noMinify?"":".min"}.css`}else s=f.join(f.dirname(o),t.endsWith(".css")?f.dirname(t):t||"css"),n=`${t.endsWith(".css")&&/s[ac]ss$/.test(r)?f.basename(t).replace(/(\.min)?\.css$/,""):f.basename(o,f.extname(o))}.min.css`;let l=f.join(s,n);g.mkdirSync(s,{recursive:!0}),g.writeFileSync(l,i,"utf8"),log.ifNotQuiet(` ${log.colors.bg}✓${log.colors.nc} `+f.relative(process.cwd(),l)),cli.config.noSourceMaps||g.writeFileSync(l+".map",JSON.stringify(e),"utf8"),log.ifNotQuiet(` ${log.colors.bg}✓${log.colors.nc} ${f.relative(process.cwd(),l)}.map`)})))}};
@@ -3,4 +3,4 @@
3
3
  * Source: https://github.com/adamlui/scss-to-css/tree/main/src
4
4
  * Documentation: https://github.com/adamlui/scss-to-css/tree/main/docs
5
5
  */
6
- module.exports={atomicWrite(e,r,t="utf8"){var n=require("path"),a=require("fs"),n=n.join(n.dirname(e),`.${n.basename(e)}.tmp`);a.writeFileSync(n,r,t),a.renameSync(n,e)},fetch(n){return"undefined"==typeof fetch?new Promise((t,e)=>{var r=n.match(/^([^:]+):\/\//)[1];/^https?$/.test(r)||e(new Error(app.msgs.error_invalidURL+".")),require(r).get(n,e=>{let r="";e.on("data",e=>r+=e),e.on("end",()=>t({json:()=>JSON.parse(r)}))}).on("error",e)}):fetch(n)},flatten(e,{key:r="message"}={}){var t,n={};for(t in e)n[t]="object"==typeof e[t]&&r in e[t]?e[t][r]:e[t];return n}};
6
+ module.exports={atomicWrite(e,r,t="utf8"){var n=require("fs"),a=require("path"),a=a.join(a.dirname(e),`.${a.basename(e)}.tmp`);n.writeFileSync(a,r,t),n.renameSync(a,e)},fetch(n){return"undefined"==typeof fetch?new Promise((t,e)=>{var r=n.match(/^([^:]+):\/\//)[1];/^https?$/.test(r)||e(new Error(cli.msgs.error_invalidURL+".")),require(r).get(n,e=>{let r="";e.on("data",e=>r+=e),e.on("end",()=>t({json:()=>JSON.parse(r)}))}).on("error",e)}):fetch(n)},flatten(e,{key:r="message"}={}){var t,n={};for(t in e)n[t]="object"==typeof e[t]&&r in e[t]?e[t][r]:e[t];return n}};
@@ -0,0 +1,6 @@
1
+ /**
2
+ * © 2024–2026 Adam Lui & contributors under the MIT license.
3
+ * Source: https://github.com/adamlui/scss-to-css/tree/main/src
4
+ * Documentation: https://github.com/adamlui/scss-to-css/tree/main/docs
5
+ */
6
+ let language=require("./language"+env.modExt),log=require("./log"+env.modExt),settings=require("./settings"+env.modExt),dataPath="../../"+(env.devMode?"../":"data/");module.exports={async cli(){Object.assign(globalThis.cli??={},require(dataPath+"package-data.json")),cli.lang=settings.load("uiLang")||(env.debugMode?language.generateRandomLang({excludes:["en"]}):language.getSysLang()),cli.msgs=await language.getMsgs(cli.lang),cli.urls.cliDocs=cli.urls.docs+"/#-command-line-usage",cli.lang.startsWith("en")||(cli.docLocale=cli.lang.replace("_","-").toLowerCase(),cli.docLocales??=await language.getDocLocales(),cli.docLocales?.includes(cli.docLocale)&&log.debug(cli.urls.cliDocs=cli.urls.docs+`/${cli.docLocale}#readme`)),settings.load()},async configFile(e=settings.configFilename){var a=require("fs"),i=require("path"),t={target:i.resolve(process.cwd(),e)};if(a.existsSync(t.target))return log.warn(cli.msgs.warn_configFileExists+":",t.target);if(a.existsSync(t.src=i.resolve(__dirname,""+dataPath+e)))a.copyFileSync(t.src,t.target);else{i=require("./jsdelivr"+env.modExt).pkgVerURL+`/${e}/`;log.data(cli.msgs.info_fetchingRemoteConfigFrom+` ${i}...`);try{var l=require("./data"+env.modExt),s=await l.fetch(i);if(!s.ok)return log.warn(`${cli.msgs.warn_remoteConfigNotFound}: ${i} (${s.status})`);l.atomicWrite(t.target,await s.text())}catch(e){return log.warn(cli.msgs.warn_remoteConfigFailed+`: ${i} `+e.message)}}log.success(`${cli.msgs.info_configFileCreated}: ${t.target}\n`),log.tip(cli.msgs.tip_editToSetDefaults+"."),log.tip(cli.msgs.tip_cliArgsPrioritized+".")}};
@@ -0,0 +1,6 @@
1
+ /**
2
+ * © 2024–2026 Adam Lui & contributors under the MIT license.
3
+ * Source: https://github.com/adamlui/scss-to-css/tree/main/src
4
+ * Documentation: https://github.com/adamlui/scss-to-css/tree/main/docs
5
+ */
6
+ module.exports={pkgVerURL(e){e||=cli.version||=require("./pkg"+env.modExt).getVer("local")||"none";e=/^\d+\.\d+\.\d+$/.test(e)?"v"+e:"latest";return cli.urls.jsdelivr+"@"+e},commitURL(e="latest"){return cli.urls.jsdelivr+"@"+e}};
@@ -3,6 +3,5 @@
3
3
  * Source: https://github.com/adamlui/scss-to-css/tree/main/src
4
4
  * Documentation: https://github.com/adamlui/scss-to-css/tree/main/docs
5
5
  */
6
- let data=require(`./data${env.devMode?"":".min"}.js`);module.exports={generateRandomLang({includes:e=[],excludes:a=[]}={}){let s=require("fs"),r=require(`./log${env.devMode?"":".min"}.js`),t=require("path"),n=e.length?e:(()=>{var e=t.join(__dirname,"..",".cache"),a=t.join(e,"locales.json");if(s.existsSync(a))try{return JSON.parse(s.readFileSync(a,"utf8"))}catch(e){}var r=t.resolve(process.cwd(),"_locales");return s.existsSync(r)?(r=s.readdirSync(r,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name).filter(e=>/^[a-z]{2}(?:_[A-Z]{2})?$/.test(e)),s.mkdirSync(e,{recursive:!0}),data.atomicWrite(a,JSON.stringify(r,null,2)),r):["en"]})(),l=new Set(a),i="en";return(n=n.filter(e=>!l.has(e))).length&&(i=n[Math.floor(Math.random()*n.length)]),r.debug(`
7
- Random language: ${i}
8
- `),i},async getMsgs(s="en"){let e=data.flatten(require(`../../${env.devMode?"../_locales/en/":"data/"}messages.json`),{key:"message"});if(!s.startsWith("en")){var t=`${app.urls.jsdelivr}@${app.commitHashes.locales}/_locales/`;let a=t+s.replace("-","_")+"/messages.json",r=0;for(;r<3;)try{e=data.flatten(await(await data.fetch(a)).json(),{key:"message"});break}catch(e){if(2<++r)break;a=s.includes("-")&&1==r?a.replace(/([^_]*)_[^/]*(\/.*)/,"$1$2"):t+"en/messages.json"}}return e},getSysLang(){var e;if("win32"!=process.platform)return((e=process.env).LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES||e.LC_NAME||"en").split(".")[0];try{return require("child_process").execSync("(Get-Culture).TwoLetterISOLanguageName",{shell:"powershell",encoding:"utf-8"}).trim()}catch(e){return console.error("ERROR loading system language:",e.message),"en"}}};
6
+ let data=require("./data"+env.modExt),log=require("./log"+env.modExt);module.exports={formatCode(e){return e.replace(/([a-z]{2,8})[-_]([a-z]{2})/i,(e,r,a)=>r.toLowerCase()+"_"+a.toUpperCase())},generateRandomLang({includes:e=[],excludes:r=[]}={}){let t=require("fs"),s=require("path"),a=e.length?e:(()=>{var e=s.join(__dirname,"..",".cache"),r=s.join(e,"locales.json");if(t.existsSync(r))try{return JSON.parse(t.readFileSync(r,"utf8"))}catch(e){}var a=s.resolve(process.cwd(),"_locales");return t.existsSync(a)?(a=t.readdirSync(a,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name).filter(e=>/^\w{2}[-_]?\w{0,2}$/.test(e)),t.mkdirSync(e,{recursive:!0}),data.atomicWrite(r,JSON.stringify(a,null,2)),a):["en"]})(),n=new Set(r),o="en";return(a=a.filter(e=>!n.has(e))).length&&(o=a[Math.floor(Math.random()*a.length)]),log.debug(`Random language: ${o}
7
+ `),o},async getDocLocales(){cli.version||=require("./pkg"+env.modExt).getVer("local")||"none";var e=require("./jsdelivr"+env.modExt).pkgVerURL()+"/docs/",r=[];try{for(var a,t=await(await data.fetch(e)).text(),s=/href=".*\/docs\/([^/]+)\/"/g;a=s.exec(t);)r.push(a[1])}catch(e){log.warn(cli.msgs.warn_docLocalesFetchFailed+":",e.message)}return r},async getMsgs(t="en"){if(t=module.exports.formatCode(t),env.msgs&&t==cli.lang)return env.msgs;let e=data.flatten(require(`../../${env.devMode?"../_locales/en/":"data/"}messages.json`));if(!t.startsWith("en")){var s=require("./jsdelivr"+env.modExt).commitURL(cli.commitHashes.locales)+"/_locales/";let r=s+t+"/messages.json",a=0;for(;a<3;)try{e=data.flatten(await(await data.fetch(r)).json());break}catch(e){if(3<=++a)break;log.debug(r=t.includes("-")&&1==a?r.replace(/([^_]*)_[^/]*(\/.*)/,"$1$2"):s+"en/messages.json")}}return e},getSysLang(){try{var e;return"win32"==process.platform?require("child_process").execSync("(Get-Culture).TwoLetterISOLanguageName",{shell:"powershell",encoding:"utf-8"}).trim():((e=process.env).LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES||e.LC_NAME).split(".")[0]}catch(e){return log.error(cli.msgs.error_failedToFetchSysLang+":",e.message),"en"}},validateLangCode(e){return"string"==typeof e&&/^[a-z]{2,8}(?:[-_][a-z]{2,3})?$/i.test(e)}};
@@ -3,21 +3,21 @@
3
3
  * Source: https://github.com/adamlui/scss-to-css/tree/main/src
4
4
  * Documentation: https://github.com/adamlui/scss-to-css/tree/main/docs
5
5
  */
6
- module.exports={colors:{nc:"",br:"",by:"",bo:"",bg:"",bw:"",blk:"",tlBG:""},configURL(){this.info(`
7
- ${app.msgs.info_exampleValidConfigFile}: `+app.urls.config)},configURLandExit(...s){this.error(...s),this.configURL(),process.exit(1)},data(s){console.log(`
8
- `+this.colors.bw+s+this.colors.nc)},debug(s){env.debugMode&&console.log(s)},error(...s){console.error(`
9
- ${this.colors.br}${app.msgs.prefix_error}:`,...s,this.colors.nc)},errorAndExit(...s){this.error(...s),this.helpCmdAndDocURL(),process.exit(1)},ifNotQuiet(s){app.config.quietMode||console.info(s)},info(s){console.info(`
10
- `+this.colors.by+s+this.colors.nc)},tip(s){console.info(""+this.colors.by+app.msgs.prefix_tip+": "+s+this.colors.nc)},success(s){console.log(`
6
+ module.exports={colors:{nc:"",br:"",by:"",bo:"",bg:"",bw:"",gry:"",blk:"",tlBG:""},configURL(){this.info(`
7
+ ${cli.msgs.info_exampleValidConfigFile}: `+cli.urls.config)},configURLandExit(...s){this.error(...s),this.configURL(),process.exit(1)},data(s){console.log(`
8
+ `+this.colors.bw+s+this.colors.nc)},debug(s){env.debugMode&&console.debug(`
9
+ ${this.colors.bo}DEBUG:`,s,this.colors.nc,"\n")},dim(s){console.log(""+this.colors.gry+s+this.colors.nc)},error(...s){console.error(`
10
+ ${this.colors.br}ERROR:`,...s,this.colors.nc)},errorAndExit(...s){this.error(...s),this.helpCmdAndDocURL(),process.exit(1)},ifNotQuiet(s){cli.config.quietMode||console.info(s)},info(s){console.info(`
11
+ `+this.colors.by+s+this.colors.nc)},tip(s){console.info(this.colors.by+"TIP: "+s+this.colors.nc)},success(s){console.log(`
11
12
  `+this.colors.bg+s+this.colors.nc)},warn(...s){console.warn(`
12
- ${this.colors.bo}${app.msgs.prefix_warning}:`,...s,this.colors.nc)},help(s=["header","usage","pathArgs","flags","params","cmds"]){app.prefix=""+this.colors.tlBG+this.colors.blk+` ${app.name.replace(/^@[^/]+\//,"")} ${this.colors.nc} `;let o={header:[`
13
- ├ ${app.prefix}${app.msgs.appCopyright}.`,""+app.prefix+app.msgs.prefix_source+": "+app.urls.src],usage:[`
14
- ${this.colors.bw}o ${app.msgs.helpSection_usage}:`+this.colors.nc,` ${this.colors.bw}» `+this.colors.bg+app.cmdFormat+this.colors.nc],pathArgs:[`
15
- ${this.colors.bw}o ${app.msgs.helpSection_pathArgs}:`+this.colors.nc,` [inputPath] ${app.msgs.inputPathDesc_main}, ${app.msgs.inputPathDesc_extra}.`,` [outputPath] ${app.msgs.outputPathDesc_main}, `+app.msgs.outputPathDesc_extra],flags:[`
16
- ${this.colors.bw}o ${app.msgs.helpSection_flags}:`+this.colors.nc,` -n, --dry-run ${app.msgs.optionDesc_dryRun}.`,` -d, --include-dotfolders ${app.msgs.optionDesc_dotfolders}.`,` -S, --no-source-maps ${app.msgs.optionDesc_noSourceMaps}.`,` -M, --no-minify ${app.msgs.optionDesc_noMinify}.`,` -R, --no-recursion ${app.msgs.optionDesc_noRecursion}.`,` -r, --relative-output ${app.msgs.optionDesc_relativeOutput}.`,` -c, --copy ${app.msgs.optionDesc_copy}.`,` -q, --quiet ${app.msgs.optionDesc_quiet}.`],params:[`
17
- ${this.colors.bw}o ${app.msgs.helpSection_params}:`+this.colors.nc,`--ignores="dir/,file1.scss,file2.scss" ${app.msgs.optionDesc_ignores}.`,`--comment="comment" ${app.msgs.optionDesc_commentMain}. ${app.msgs.optionDesc_commentExtra}.`,` --config="path/to/file" ${app.msgs.optionDesc_config}.`],cmds:[`
18
- ${this.colors.bw}o ${app.msgs.helpSection_cmds}:`+this.colors.nc,` -i, --init ${app.msgs.optionDesc_init}.`,` -h, --help ${app.msgs.optionDesc_help}.`,` -v, --version ${app.msgs.optionDesc_version}.`]};s.forEach(t=>o[t]?.forEach(o=>{{var r=/header|usage/.test(t)?1:41;let p=process.stdout.columns||80,s=o.match(/\S+|\s+/g),e=[],i="";s.forEach(s=>{var o=p-(e.length?r:0);i.length+"| ".length+s.length>o&&(e.push(e.length?i.trimStart():i),i=""),i+=s}),e.push(e.length?i.trimStart():i),e.forEach((s,o)=>console.info("| "+(0==o?s:" ".repeat(r)+s)))}})),console.info(`
19
- ${app.msgs.info_moreHelp}, ${app.msgs.info_visit}: `+this.colors.bw+app.urls.docs+this.colors.nc)},helpCmdAndDocURL(){console.info(`
20
- ${app.msgs.info_moreHelp}, ${app.msgs.info_type} ${app.name.split("/")[1]} --help' ${app.msgs.info_or} ${app.msgs.info_visit}
21
- `+this.colors.bw+app.urls.docs+this.colors.nc)},version(){var s=require("path"),o=require("child_process").execSync(`npm view ${JSON.stringify(app.name)} version`).toString().trim()||"none";let p,e=process.cwd();for(;"/"!=e;){var i=s.join(e,"package.json");if(require("fs").existsSync(i)){i=require(i);p=(i.dependencies?.[app.name]||i.devDependencies?.[app.name])?.match(/^[~^>=]?\d+\.\d+\.\d+$/)[1]||"none";break}e=s.dirname(e)}console.info(`
22
- ${app.msgs.prefix_globalVer}: ${o}
23
- ${app.msgs.prefix_localVer}: `+p)}};
13
+ ${this.colors.bo}WARNING:`,...s,this.colors.nc)},help(s=["header","usage","pathArgs","flags","params","cmds"]){cli.prefix=""+this.colors.tlBG+this.colors.blk+` ${cli.name.replace(/^@[^/]+\//,"")} ${this.colors.nc} `;let o={header:[`
14
+ ├ ${cli.prefix}${cli.msgs.appCopyright}.`,""+cli.prefix+cli.msgs.prefix_source+": "+cli.urls.src],usage:[`
15
+ ${this.colors.bw}o ${cli.msgs.helpSection_usage}:`+this.colors.nc,` ${this.colors.bw}» `+this.colors.bg+cli.cmdFormat+this.colors.nc],pathArgs:[`
16
+ ${this.colors.bw}o ${cli.msgs.helpSection_pathArgs}:`+this.colors.nc,` [inputPath] ${cli.msgs.inputPathDesc_main}, ${cli.msgs.inputPathDesc_extra}.`,` [outputPath] ${cli.msgs.outputPathDesc_main}, `+cli.msgs.outputPathDesc_extra],flags:[`
17
+ ${this.colors.bw}o ${cli.msgs.helpSection_flags}:`+this.colors.nc,` -n, --dry-run ${cli.msgs.optionDesc_dryRun}.`,` -d, --include-dotfolders ${cli.msgs.optionDesc_dotfolders}.`,` -S, --no-source-maps ${cli.msgs.optionDesc_noSourceMaps}.`,` -M, --no-minify ${cli.msgs.optionDesc_noMinify}.`,` -R, --no-recursion ${cli.msgs.optionDesc_noRecursion}.`,` -r, --relative-output ${cli.msgs.optionDesc_relativeOutput}.`,` -c, --copy ${cli.msgs.optionDesc_copy}.`,` -q, --quiet ${cli.msgs.optionDesc_quiet}.`],params:[`
18
+ ${this.colors.bw}o ${cli.msgs.helpSection_params}:`+this.colors.nc,`--ignores="dir/,file1.scss,file2.sass" ${cli.msgs.optionDesc_ignores}.`,`--comment="comment" ${cli.msgs.optionDesc_commentMain}. ${cli.msgs.optionDesc_commentExtra}.`,` --ui-lang="code" ${cli.msgs.optionDesc_uiLang}.`,` --config="path/to/file" ${cli.msgs.optionDesc_config}.`],cmds:[`
19
+ ${this.colors.bw}o ${cli.msgs.helpSection_cmds}:`+this.colors.nc,` -i, --init ${cli.msgs.optionDesc_init}.`,` -h, --help ${cli.msgs.optionDesc_help}.`,` -v, --version ${cli.msgs.optionDesc_version}.`]};s.forEach(t=>o[t]?.forEach(o=>{{var e=/header|usage/.test(t)?1:41;let i=process.stdout.columns||80,s=o.match(/\S+|\s+/g),c=[],l="";s.forEach(s=>{var o=i-(c.length?e:0);l.length+"| ".length+s.length>o&&(c.push(c.length?l.trimStart():l),l=""),l+=s}),c.push(c.length?l.trimStart():l),c.forEach((s,o)=>console.info("| "+(0==o?s:" ".repeat(e)+s)))}})),console.info(`
20
+ ${cli.msgs.info_moreHelp}, ${cli.msgs.info_visit}: `+this.colors.bw+cli.urls.cliDocs+this.colors.nc)},helpCmdAndDocURL(){console.info(`
21
+ ${cli.msgs.info_moreHelp}, ${cli.msgs.info_type} ${cli.name.split("/")[1]} --help' ${cli.msgs.info_or} ${cli.msgs.info_visit}
22
+ `+this.colors.bw+cli.urls.docs+this.colors.nc)},version(){var s=require("./pkg"+env.modExt).getVer;this.info(cli.name),this.data(`${cli.msgs.prefix_globalVer}: ${s("global")||"none"}
23
+ ${cli.msgs.prefix_localVer}: `+(s("local")||"none"))}};
@@ -0,0 +1,6 @@
1
+ /**
2
+ * © 2024–2026 Adam Lui & contributors under the MIT license.
3
+ * Source: https://github.com/adamlui/scss-to-css/tree/main/src
4
+ * Documentation: https://github.com/adamlui/scss-to-css/tree/main/docs
5
+ */
6
+ let log=require("./log"+env.modExt);module.exports={getVer(e="any"){let r;if("global"!=e)try{var l=require("path").resolve(process.cwd(),"node_modules",cli.name,"package.json");r=require(l).version}catch(e){log.debug(cli.msgs.error_readingLocalPkgVer+": "+e.message)}if("global"==e||"all"==e&&!r)try{r=require("child_process").execSync(`npm view ${JSON.stringify(cli.name)} version`).toString().trim()}catch(e){log.debug(cli.msgs.error_failedToFetchGlobalVer+": "+e.message)}return r}};
@@ -3,6 +3,5 @@
3
3
  * Source: https://github.com/adamlui/scss-to-css/tree/main/src
4
4
  * Documentation: https://github.com/adamlui/scss-to-css/tree/main/docs
5
5
  */
6
- let fs=require("fs"),log=require(`./log${env.devMode?"":".min"}.js`),path=require("path");(globalThis.app??={}).config={},module.exports={configFilename:"scss-to-css.config.mjs",controls:{dryRun:{type:"flag",regex:/^--?(?:n|dry-?run)$/},includeDotFolders:{type:"flag",regex:/^--?(?:dd?|(?:include-?)?dot-?(?:folder|dir(?:ector(?:y|ie))?)s?=?(?:true|1)?)$/},noSourceMaps:{type:"flag",regex:/^--?(?:S|(?:exclude|disable|no)-?so?u?rce?-?maps?|so?u?rce?-?maps?=(?:false|0))$/},noRecursion:{type:"flag",regex:/^--?(?:R|(?:disable|no)-?recursi(?:on|ve)|recursi(?:on|ve)=(?:false|0))$/},noMinify:{type:"flag",regex:/^--?(?:M|(?:disable|no)-?minif(?:y|ication)|minif(?:y|ication)=(?:false|0))$/},relativeOutput:{type:"param",regex:/^--?(?:r|relative-?output?=?(?:true|1)?)$/},copy:{type:"param",regex:/^--?c(?:opy)?$/},quietMode:{type:"param",regex:/^--?q(?:uiet)?(?:-?mode)?$/},ignores:{type:"param",regex:/^--?(?:ignores?|(?:ignore|skip|exclude)(?:d?-?files?)?)(?:=.*|$)/},comment:{type:"param",regex:/^--?comments?(?:=.*|$)/},config:{type:"param",regex:/^--?config(?:=.*|$)/},init:{type:"cmd",regex:/^-{0,2}i(?:nit)?$/},help:{type:"cmd",regex:/^--?h(?:elp)?$/},version:{type:"cmd",regex:/^--?ve?r?s?i?o?n?$/}},async initConfigFile(e=this.configFilename){var r=path.resolve(process.cwd(),e);if(fs.existsSync(r))return log.warn(app.msgs.warn_configFileExists+":",r);var i=path.resolve(__dirname,"../../"+(env.devMode?"../":"./data/")+e);if(fs.existsSync(i))fs.copyFileSync(i,r);else{i=app.urls.jsdelivr+"/"+e;log.data(app.msgs.info_fetchingRemoteConfigFrom+` ${i}...`);try{var o=await require(`./data${env.devMode?"":".min"}.js`).fetch(i);if(!o.ok)return log.warn(`${app.msgs.warn_remoteConfigNotFound}: ${i} (${o.status})`);require(`./data${env.devMode?"":".min"}.js`).atomicWrite(r,await o.text())}catch(e){return log.warn(app.msgs.warn_remoteConfigFailed+`: ${i} `+e.message)}}log.success(app.msgs.info_configFileCreated+`: ${r}
7
- `),log.tip(app.msgs.tip_editToSetDefaults+"."),log.tip(app.msgs.tip_cliArgsPrioritized+".")},load({args:e=process.argv.slice(2),ctrlKeys:s=Object.keys(this.controls)}={}){let r=null;var i=e.find(e=>this.controls.config.regex.test(e));if(i){/=/.test(i)||log.errorAndExit(`[${i}] `+app.msgs.error_mustIncludePath);i=i.split("=")[1];r=path.isAbsolute(i)?i:path.resolve(process.cwd(),i),fs.existsSync(r)||log.configURLandExit(app.msgs.error_configFileNotFound+":",r)}else for(var o of["mjs","cjs","js"]){o=path.resolve(process.cwd(),this.configFilename.replace(/\.[^.]+$/,"."+o));if(fs.existsSync(o)){r=o;break}}if(r)try{var t=require(r),a=t?.default??t;a&&"object"==typeof a||log.configURLandExit(app.msgs.error_invalidConfigFile+"."),Object.assign(app.config,a)}catch(e){log.configURLandExit(app.msgs.error_failedToLoadConfigFile+":",r,`
8
- `+e.message)}return e.forEach(r=>{if(!/^[^-]|--?(?:config|debug)/.test(r)){var i=s.find(e=>this.controls[e]?.regex?.test(r)),o=(i||log.errorAndExit(`[${r}] ${app.msgs.error_notRecognized}.`),this.controls[i]);if("cmd"!=o.type){let e="param"!=o.type||r.split("=")[1]?.trim();o.mode?app.config.mode=i.replace(/mode$/i,"").toLowerCase():((o=o.parser)&&(e=o(e),isNaN(e)||e<1)&&log.errorAndExit(`[${i}] ${app.msgs.error_nonPositiveNum}.`),app.config[i]=e)}}}),app.config}};
6
+ let fs=require("fs"),log=require("./log"+env.modExt),path=require("path");(globalThis.cli??={}).config={},module.exports={configFilename:"scss-to-css.config.mjs",controls:{dryRun:{type:"flag",regex:/^--?(?:n|dry-?run)$/},includeDotFolders:{type:"flag",regex:/^--?(?:dd?|(?:include-?)?dot-?(?:folder|dir(?:ector(?:y|ie))?)s?=?(?:true|1)?)$/},noSourceMaps:{type:"flag",regex:/^--?(?:S|(?:exclude|disable|no)-?so?u?rce?-?maps?|so?u?rce?-?maps?=(?:false|0))$/},noRecursion:{type:"flag",regex:/^--?(?:R|(?:disable|no)-?recursi(?:on|ve)|recursi(?:on|ve)=(?:false|0))$/},noMinify:{type:"flag",regex:/^--?(?:M|(?:disable|no)-?minif(?:y|ication)|minif(?:y|ication)=(?:false|0))$/},relativeOutput:{type:"flag",regex:/^--?(?:r|relative-?output?=?(?:true|1)?)$/},copy:{type:"flag",regex:/^--?c(?:opy)?$/},quietMode:{type:"flag",regex:/^--?q(?:uiet)?(?:-?mode)?$/},ignores:{type:"param",parser:e=>e.split(",").map(e=>e.trim()),regex:/^--?(?:ignores?|(?:ignore|skip|exclude)(?:d?-?files?)?)(?:=.*|$)/},comment:{type:"param",parser:e=>e.replace(/\\n/g,"\n"),regex:/^--?comments?(?:=.*)?$/},uiLang:{type:"param",valType:"langCode",regex:/^--?ui-?lang(?:=.*|$)/},config:{type:"param",valType:"filepath",regex:/^--?config(?:=.*|$)/},init:{type:"cmd",regex:/^-{0,2}i(?:nit)?$/},help:{type:"cmd",regex:/^--?h(?:elp)?$/},version:{type:"cmd",regex:/^--?ve?r?s?i?o?n?$/}},load(e=Object.keys(this.controls)){let r=[].concat(e);if(cli.defaultsSet||arguments.length||(r.forEach(e=>{var i=this.controls[e];i.mode||(cli.config[e]??=i.defaultVal??("param"==i.type&&""))}),cli.defaultsSet=!0),!cli.configPathTried){e=env.args.find(e=>this.controls.config.regex.test(e));if(e){/=/.test(e)||log.errorAndExit(`[${e}] `+cli.msgs.error_mustIncludePath);e=e.split("=")[1];cli.configPath=path.isAbsolute(e)?e:path.resolve(process.cwd(),e),fs.existsSync(cli.configPath)||log.configURLandExit(cli.msgs.error_configFileNotFound+":",cli.configPath)}else for(var i of[".mjs",".cjs",".js"]){i=path.resolve(process.cwd(),this.configFilename.replace(/\.[^.]+$/,i));if(fs.existsSync(i)){cli.configPath=i;break}}cli.configPathTried=!0}if(cli.configPath)try{let e=require(cli.configPath),o=e?.default??e;o&&"object"==typeof o||log.configURLandExit(cli.msgs.error_invalidConfigFile+"."),Object.assign(cli.config,arguments.length?r.reduce((e,i)=>o[i]?{...e,[i]:o[i]}:e,{}):o)}catch(e){log.configURLandExit(cli.msgs.error_failedToLoadConfigFile+":",cli.configPath,`
7
+ `+e.message)}return env.args.forEach(i=>{var e,o;/^[^-]|--?(?:config|debug)/.test(i)&&"init"!=i||(!(e=Object.keys(this.controls).find(e=>this.controls[e]?.regex?.test(i)))&&cli.msgs&&log.errorAndExit(`[${i}] ${cli.msgs.error_notRecognized}.`),r.includes(e)&&((o=this.controls[e]).mode?cli.config.mode=e.replace(/mode$/i,"").toLowerCase():cli.config[e]="param"!=o.type||(i.split("=")[1]?.trim()??"")))}),this.parseValidateConfig(r),1==r.length?cli.config[r[0]]:cli.config},parseValidateConfig(e=Object.keys(this.controls)){let r=require("./language"+env.modExt);for(let o of[].concat(e)){let e=this.controls[o],i=cli.config[o];e.parser&&!e.parsed&&(cli.config[o]=e.parser(i),e.parsed=!0),e.valType&&{positiveInt(){var e=parseInt(i,10);(isNaN(e)||e<1)&&log.errorAndExit(`[${o}] ${cli.msgs.error_nonPositiveNum}: `+i),cli.config[o]=e},filepath(){i&&!fs.existsSync(i)&&log.errorAndExit(`[${o}] ${cli.msgs.error_invalidFilepath}: `+i)},langCode(){i&&!r.validateLangCode(i)&&log.errorAndExit(`[${o}] ${cli.msgs.error_invalidLangCode}: `+i)}}[e.valType]()}}};
@@ -1,27 +1,32 @@
1
1
  {
2
2
  "appName": { "message": "scss-to-css" },
3
3
  "appCopyright": { "message": "© 2024–2026 Adam Lui & contributors under the MIT license" },
4
- "prefix_error": { "message": "ERROR" },
5
- "prefix_tip": { "message": "TIP" },
6
- "prefix_warning": { "message": "WARNING" },
7
4
  "prefix_globalVer": { "message": "Global version" },
8
5
  "prefix_localVer": { "message": "Local version" },
9
6
  "prefix_source": { "message": "Source" },
7
+ "error_readingLocalPkgVer": { "message": "Error reading local package version" },
10
8
  "error_notRecognized": { "message": "not recognized" },
11
9
  "error_nonPositiveNum": { "message": "argument can only be > 0" },
10
+ "error_invalidFilepath": { "message": "must be a valid existing file path. Got" },
11
+ "error_invalidLangCode": { "message": "is an invalid language code" },
12
12
  "error_invalidURL": { "message": "Invalid URL" },
13
13
  "error_invalidConfigFile": { "message": "Config file must export an object" },
14
14
  "error_configFileNotFound": { "message": "Config file not found" },
15
15
  "error_failedToLoadConfigFile": { "message": "Failed to load config file" },
16
+ "error_failedToFetchGlobalVer": { "message": "Failed to fetch global version" },
17
+ "error_failedToFetchSysLang": { "message": "Failed to fetch system language" },
16
18
  "error_mustIncludePath": { "message": "must include =path" },
17
- "warn_configFileExists": { "message": "Config file already exists" },
18
- "info_exampleValidConfigFile": { "message": "Example valid config file" },
19
19
  "error_firstArgNotExist": { "message": "First argument can only be an existing file or directory" },
20
20
  "error_doesNotExist": { "message": "does not exist" },
21
+ "warn_configFileExists": { "message": "Config file already exists" },
22
+ "warn_remoteConfigNotFound": { "message": "Remote config file not found" },
23
+ "warn_remoteConfigFailed": { "message": "Failed to fetch remote config file" },
24
+ "warn_docLocalesFetchFailed": { "message": "Failed to fetch doc locales" },
25
+ "info_exampleValidConfigFile": { "message": "Example valid config file" },
21
26
  "info_exampleValidCmd": { "message": "Example valid command" },
22
27
  "info_scssFilesToBeCompiled": { "message": "SCSS files to be compiled" },
23
28
  "info_noSCSSfilesWillBeCompiled": { "message": "No SCSS files will be compiled" },
24
- "info_copying": { "message": "Copying to clipboard" },
29
+ "info_copyingToClip": { "message": "Copying to clipboard" },
25
30
  "info_writing": { "message": "Writing to file" },
26
31
  "info_compilationComplete": { "message": "Compilation complete" },
27
32
  "info_file": { "message": "file" },
@@ -35,8 +40,6 @@
35
40
  "info_visit": { "message": "visit" },
36
41
  "info_configFileCreated": { "message": "Config file created" },
37
42
  "info_fetchingRemoteConfigFrom": { "message": "Fetching remote config file from" },
38
- "warn_remoteConfigNotFound": { "message": "Remote config file not found" },
39
- "warn_remoteConfigFailed": { "message": "Remote config file not found" },
40
43
  "tip_editToSetDefaults": { "message": "Edit this file to customize defaults" },
41
44
  "tip_cliArgsPrioritized": { "message": "CLI arguments always override these values" },
42
45
  "helpSection_usage": { "message": "Usage" },
@@ -44,6 +47,7 @@
44
47
  "helpSection_flags": { "message": "Boolean options" },
45
48
  "helpSection_params": { "message": "Parameter options" },
46
49
  "helpSection_cmds": { "message": "Commands" },
50
+ "optionDesc_uiLang": { "message": "ISO 639-1 code of language to display UI in" },
47
51
  "inputPathDesc_main": { "message": "Path to SCSS file or directory containing SCSS files to be compiled" },
48
52
  "inputPathDesc_extra": { "message": "relative to the current working directory" },
49
53
  "outputPathDesc_main": { "message": "Path to file or directory where CSS + sourcemap files will be stored" },
@@ -13,6 +13,6 @@
13
13
  "src": "https://github.com/adamlui/scss-to-css/tree/main/src"
14
14
  },
15
15
  "commitHashes": {
16
- "locales": "ca10f06"
16
+ "locales": "83a673c"
17
17
  }
18
18
  }
@@ -10,17 +10,20 @@
10
10
 
11
11
  export default {
12
12
 
13
- // Boolean options
13
+ // Info options
14
14
  dryRun: false, // don't actually minify the file(s), just show if they will be processed
15
+ quietMode: false, // suppress all logging except errors
16
+ uiLang: '', // ISO 639-1 code of language to display UI in
17
+
18
+ // Input options
15
19
  includeDotFolders: false, // include dotfolders in file search
20
+ noRecursion: false, // disable recursive file searching
21
+ ignores: '', // files/dirs to exclude from minification
22
+
23
+ // Output options
16
24
  noSourceMaps: false, // prevent source maps from being generated
17
25
  noMinify: false, // disable minification of output CSS
18
- noRecursion: false, // disable recursive file searching
19
26
  relativeOutput: false, // output files relative to each src file instead of to input root
20
27
  copy: false, // copy compiled CSS to clipboard instead of write to file if single file processed
21
- quietMode: false, // suppress all logging except errors
22
-
23
- // String params
24
- ignores: '', // files/dirs to exclude from minification
25
28
  comment: '' // header comment to prepend to minified code
26
29
  }
@@ -3,7 +3,7 @@
3
3
  * Source: https://github.com/adamlui/scss-to-css/tree/main/src
4
4
  * Documentation: https://github.com/adamlui/scss-to-css/tree/main/docs
5
5
  */
6
- let fs=require("fs"),path=require("path"),sass=require("sass");function findSCSS(r,i={}){var e="https://github.com/adamlui/scss-to-css/tree/main/docs/#findscsssearchdir-options",o={recursive:!0,verbose:!0,dotFolders:!1,ignores:[]};if(log.prefix="findSCSS()","string"!=typeof r)return log.error("1st arg <searchDir> must be a string."),log.helpURL(e);var s=path.resolve(process.cwd(),r);if(!fs.existsSync(s))return log.error("1st arg <searchDir> must be an existing directory."),log.error(s+" does not exist."),log.helpURL(e);if(validateOptions({options:i,defaultOptions:o,helpURL:e,exampleCall:"findSCSS('assets/scss', { verbose: false, dotFolders: true })"})){(i={...o,...i}).ignoreFiles&&(i.ignores=[...i.ignores,...i.ignoreFiles]);let e=fs.readdirSync(r),s=[];return i.verbose&&!i.isRecursing&&log.info("Searching for SCSS files..."),e.forEach(e=>{let o=path.resolve(r,e);i.ignores.some(s=>s.endsWith("/")?o.split(path.sep).some(e=>e==s.replace(/\/$/,"")):e==s)?i.verbose&&log.info(`** ${e} ignored`):fs.statSync(o).isDirectory()&&"node_modules"!=e&&i.recursive&&(i.dotFolders||!e.startsWith("."))?s.push(...findSCSS(o,{...i,isRecursing:!0})):e.endsWith(".scss")&&s.push(o)}),i.verbose&&!i.isRecursing&&(log.info("Search complete!",`${s.length||"No"} file${1==s.length?"":"s"} found.`),"compile"!=findSCSS.caller?.name)&&"undefined"!=typeof window&&log.info("Check returned array."),i.isRecursing||s.length?s:[]}}function compile(i,t={}){var e="https://github.com/adamlui/scss-to-css/tree/main/docs/#compileinput-options",s={recursive:!0,verbose:!0,dotFolders:!1,minify:!0,sourceMaps:!0,relativeOutput:!1,ignores:[],comment:""};if(log.prefix="compile()","string"!=typeof i)return log.error("1st arg <input> must be a string."),log.helpURL(e);if(validateOptions({options:t,defaultOptions:s,helpURL:e,exampleCall:"compile('assets/scss', { recursive: false, minify: false })"})){(t={...s,...t}).ignoreFiles&&(t.ignores=[...t.ignores,...t.ignoreFiles]);let r={style:t.minify?"compressed":"expanded",sourceMap:t.sourceMaps,charset:!1};if(fs.existsSync(i)){if(!i.endsWith(".scss")||!fs.statSync(i).isFile())return e=findSCSS(i,t)?.map(e=>{t.verbose&&log.info(`** Compiling ${e}...`);try{var s=sass.compile(e,r),o=t.relativeOutput?void 0:path.relative(path.resolve(process.cwd(),i),e);return t.comment&&(s.css=prependComment(s.css,t.comment)),{code:s.css,srcMap:s.sourceMap,srcPath:e,relPath:o,error:void 0}}catch(e){return log.error(e.message),{code:void 0,srcMap:void 0,srcPath:void 0,error:e}}}).filter(e=>!e.error),t.verbose&&(e.length&&"undefined"!=typeof window?log.info("Compilation complete! Check returned object."):log.info("No SCSS files processed.")),e;t.verbose&&log.info(`** Compiling ${i}...`);try{var o=sass.compile(i,r);return t.comment&&(o.css=prependComment(o.css,t.comment)),t.verbose&&"undefined"!=typeof window&&log.info("Compilation complete! Check returned object."),{code:o.css,srcMap:o.sourceMap,srcPath:path.resolve(process.cwd(),i),error:void 0}}catch(e){return log.error(e.message),{code:void 0,srcMap:void 0,srcPath:void 0,error:e}}}else{t.verbose&&log.info("** Compiling passed source code...");try{var n=sass.compileString(i,r);return t.comment&&(n.css=prependComment(n.css,t.comment)),{code:n.css,srcMap:n.sourceMap,srcPath:void 0,error:void 0}}catch(e){return log.error(e.message),{code:void 0,srcMap:void 0,srcPath:void 0,error:e}}}}}function prependComment(e,s){let o="";var r=e.match(/^#!.*\n/);return r&&(o=r[0],e=e.slice(o.length)),`${o}/**
6
+ let fs=require("fs"),path=require("path"),sass=require("sass");function findSCSS(o,i={}){var e="https://github.com/adamlui/scss-to-css/tree/main/docs/#findscsssearchdir-options",r={recursive:!0,verbose:!0,dotFolders:!1,ignores:[]};if(log.prefix="findSCSS()","string"!=typeof o)log.errHelpURLandThrow({errMsg:"1st arg <searchDir> must be a string.",helpURL:e});else{var s=path.resolve(process.cwd(),o);if(!fs.existsSync(s))return log.error("1st arg <searchDir> must be an existing directory."),log.error(s+" does not exist."),log.helpURL(e)}if(validateOptions({options:i,defaultOptions:r,helpURL:e,exampleCall:"findSCSS('assets/scss', { verbose: false, dotFolders: true })"})){(i={...r,...i}).ignoreFiles&&(i.ignores=[...i.ignores,...i.ignoreFiles]);let e=fs.readdirSync(o),s=[];return i.verbose&&!i.isRecursing&&log.info("Searching for files..."),e.forEach(e=>{let r=path.resolve(o,e);i.ignores.some(s=>s.endsWith("/")?r.split(path.sep).some(e=>e==s.replace(/\/$/,"")):e==s)?i.verbose&&log.info(`** ${e} ignored`):fs.statSync(r).isDirectory()&&"node_modules"!=e&&i.recursive&&(i.dotFolders||!e.startsWith("."))?s.push(...findSCSS(r,{...i,isRecursing:!0})):/s[ac]ss$/.test(e)&&s.push(r)}),i.verbose&&!i.isRecursing&&(log.info("Search complete!",`${s.length||"No"} file${1==s.length?"":"s"} found.`),"compile"!=findSCSS.caller?.name)&&"undefined"!=typeof window&&log.info("Check returned array."),i.isRecursing||s.length?s:[]}}function compile(i,t={}){var e="https://github.com/adamlui/scss-to-css/tree/main/docs/#compileinput-options",s={recursive:!0,verbose:!0,dotFolders:!1,minify:!0,sourceMaps:!0,relativeOutput:!1,ignores:[],comment:""};if(log.prefix="compile()","string"!=typeof i&&log.errHelpURLandThrow({errMsg:"1st arg <input> must be a string.",helpURL:e}),validateOptions({options:t,defaultOptions:s,helpURL:e,exampleCall:"compile('assets/scss', { recursive: false, minify: false })"})){(t={...s,...t}).ignoreFiles&&(t.ignores=[...t.ignores,...t.ignoreFiles]);let o={style:t.minify?"compressed":"expanded",sourceMap:t.sourceMaps,charset:!1};if(fs.existsSync(i)){if(!/s[ac]ss$/.test(i)||!fs.statSync(i).isFile())return e=findSCSS(i,t)?.map(e=>{t.verbose&&log.info(`** Compiling ${e}...`);try{var s=sass.compile(e,o),r=t.relativeOutput?void 0:path.relative(path.resolve(process.cwd(),i),e);return t.comment&&(s.css=prependComment(s.css,t.comment)),{code:s.css,srcMap:s.sourceMap,srcPath:e,relPath:r,error:void 0}}catch(e){return log.error(e.message),{code:void 0,srcMap:void 0,srcPath:void 0,error:e}}}).filter(e=>!e.error),t.verbose&&(e.length&&"undefined"!=typeof window?log.info("Compilation complete! Check returned object."):log.info("No SCSS files processed.")),e;t.verbose&&log.info(`** Compiling ${i}...`);try{var r=sass.compile(i,o);return t.comment&&(r.css=prependComment(r.css,t.comment)),t.verbose&&"undefined"!=typeof window&&log.info("Compilation complete! Check returned object."),{code:r.css,srcMap:r.sourceMap,srcPath:path.resolve(process.cwd(),i),error:void 0}}catch(e){return log.error(e.message),{code:void 0,srcMap:void 0,srcPath:void 0,error:e}}}else{t.verbose&&log.info("** Compiling passed source code...");try{var n=sass.compileString(i,o);return t.comment&&(n.css=prependComment(n.css,t.comment)),{code:n.css,srcMap:n.sourceMap,srcPath:void 0,error:void 0}}catch(e){return log.error(e.message),{code:void 0,srcMap:void 0,srcPath:void 0,error:e}}}}}function prependComment(e,s){let r="";var o=e.match(/^#!.*\n/);return o&&(r=o[0],e=e.slice(r.length)),`${r}/**
7
7
  ${s.split("\n").map(e=>" * "+e).join("\n")}
8
8
  */
9
- `+e}function validateOptions({options:e,defaultOptions:s,helpURL:o,exampleCall:r}){var i,t,n=Object.keys(s).filter(e=>"boolean"==typeof s[e]),l=Object.keys(s).filter(e=>Number.isInteger(s[e]));if("object"!=typeof e)return i=r.split(",").findIndex(e=>e.trim().startsWith("{"))+1,i+=["st","nd","rd"][i-1]||"th",log.error(`${"0th"==i?"[O":i+" arg [o"}ptions] can only be an object of key/vals.`),log.info("Example valid call:",r),log.validOptions(s),log.helpURL(o),!1;for(t in e)if("isRecursing"!=t&&Object.prototype.hasOwnProperty.call(s,t)){if(n.includes(t)&&"boolean"!=typeof e[t])return log.error(`[${t}] option can only be \`true\` or \`false\`.`),log.helpURL(o),!1;if(l.includes(t)&&(e[t]=parseInt(e[t],10),isNaN(e[t])||e[t]<1))return log.error(`[${t}] option can only be an integer > 0.`),log.helpURL(o),!1}return!0}Object.assign(globalThis.app??={},require(`${/[\\/]src(?:[\\/]|$)/i.test(__dirname)?"../":"./data/"}app.json`)),app.aliases={compile:["build","Build","Compile","compress","Compress","minify","Minify"],findSCSS:["find","Find","findscss","findScss","Findscss","FindScss","FindSCSS","search","Search"]};let log={prefix:app.name,error(...e){console.error(this.prefix+" » ERROR:",...e)},helpURL(e=app.urls?.docs){this.info("For more help, please visit",e)},info(...e){console.info(this.prefix+" »",...e)},validOptions(e){var s=Object.keys(e).join(", "),e=JSON.stringify(e,void 0,2).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'").replace(/\n\s*/g," ");this.info(`Valid options: [${s}]`),this.info("If omitted, default settings are: "+e)}};module.exports={compile:compile,findSCSS:findSCSS};for(let s in app.aliases)app.aliases[s].forEach(e=>module.exports[e]??=module.exports[s]);
9
+ `+e}function validateOptions({options:e,defaultOptions:s,helpURL:r,exampleCall:o}){var i,t,n=Object.keys(s).filter(e=>"boolean"==typeof s[e]),l=Object.keys(s).filter(e=>Number.isInteger(s[e]));if("object"!=typeof e)return i=o.split(",").findIndex(e=>e.trim().startsWith("{"))+1,i+=["st","nd","rd"][i-1]||"th",log.error(`${"0th"==i?"[O":i+" arg [o"}ptions] can only be an object of key/vals.`),log.info("Example valid call:",o),log.validOptions(s),log.helpURL(r),!1;for(t in e)if("isRecursing"!=t&&Object.prototype.hasOwnProperty.call(s,t)){if(n.includes(t)&&"boolean"!=typeof e[t])return log.error(`[${t}] option can only be \`true\` or \`false\`.`),log.helpURL(r),!1;if(l.includes(t)&&(e[t]=parseInt(e[t],10),isNaN(e[t])||e[t]<1))return log.error(`[${t}] option can only be an integer > 0.`),log.helpURL(r),!1}return!0}Object.assign(globalThis.api??={},require(`${/[\\/]src(?:[\\/]|$)/i.test(__dirname)?"../":"./data/"}package-data.json`)),api.aliases={compile:["build","Build","Compile","compress","Compress","minify","Minify"],findSCSS:["find","Find","findscss","findScss","Findscss","FindScss","FindSCSS","search","Search"]};let log={prefix:api.name,errHelpURLandThrow({errMsg:e,helpURL:s}){throw this.error(e),this.helpURL(s),new Error(e)},error(...e){console.error(this.prefix+" » ERROR:",...e)},helpURL(e=api.urls?.docs){this.info("For more help, please visit",e)},info(...e){console.info(this.prefix+" »",...e)},validOptions(e){var s=Object.keys(e).join(", "),e=JSON.stringify(e,null,2).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'").replace(/\n\s*/g," ");this.info(`Valid options: [${s}]`),this.info("If omitted, default settings are: "+e)}};module.exports={compile:compile,findSCSS:findSCSS};for(let s in api.aliases)api.aliases[s].forEach(e=>module.exports[e]??=module.exports[s]);
package/docs/README.md CHANGED
@@ -27,14 +27,14 @@
27
27
 
28
28
  # { } scss-to-css
29
29
 
30
- ### Recursively compile all SCSS files into minified CSS.
30
+ ### Recursively compile all SCSS files into minified CSS
31
31
 
32
32
  <a href="https://www.npmjs.com/package/@adamlui/scss-to-css">
33
33
  <img height=31 src="https://img.shields.io/npm/dm/%40adamlui%2Fscss-to-css?logo=npm&color=af68ff&logoColor=white&labelColor=464646&style=for-the-badge"></a>
34
34
  <a href="#%EF%B8%8F-mit-license">
35
35
  <img height=31 src="https://img.shields.io/badge/License-MIT-orange.svg?logo=internetarchive&logoColor=white&labelColor=464646&style=for-the-badge"></a>
36
- <a href="https://github.com/adamlui/js-utils/releases/tag/scss-to-css-2.1.0">
37
- <img height=31 src="https://img.shields.io/badge/Latest_Build-2.1.0-44cc11.svg?logo=icinga&logoColor=white&labelColor=464646&style=for-the-badge"></a>
36
+ <a href="https://github.com/adamlui/js-utils/releases/tag/scss-to-css-2.2.1">
37
+ <img height=31 src="https://img.shields.io/badge/Latest_Build-2.2.1-44cc11.svg?logo=icinga&logoColor=white&labelColor=464646&style=for-the-badge"></a>
38
38
  <a href="https://www.npmjs.com/package/@adamlui/scss-to-css?activeTab=code">
39
39
  <img height=31 src="https://img.shields.io/npm/unpacked-size/%40adamlui%2Fscss-to-css?style=for-the-badge&logo=ebox&logoColor=white&color=blue&labelColor=464646"></a>
40
40
  <a href="https://sonarcloud.io/component_measures?metric=new_vulnerabilities&id=adamlui_scss-to-css:src/scss-to-css.js">
@@ -158,11 +158,12 @@ Boolean options:
158
158
  -q, --quiet Suppress all logging except errors.
159
159
 
160
160
  Parameter options:
161
- --ignores="dir/,file1.scss,file2.scss" Files/directories to exclude from
161
+ --ignores="dir/,file1.scss,file2.sass" Files/directories to exclude from
162
162
  compilation.
163
163
  --comment="comment" Prepend header comment to
164
164
  compiled CSS. Separate by
165
165
  line using '\n'.
166
+ --ui-lang="code" ISO 639-1 code of language to display UI in.
166
167
  --config="path/to/file" Load custom config file.
167
168
 
168
169
  Commands:
@@ -287,7 +288,7 @@ findSCSS() » Search complete! 2 files found.
287
288
  findSCSS() » Check returned array.
288
289
  [
289
290
  'E:\\js\\utils\\scss-to-css\assets\\scss\\foo.scss',
290
- 'E:\\js\\utils\\scss-to-css\assets\\scss\\bar.scss'
291
+ 'E:\\js\\utils\\scss-to-css\assets\\scss\\bar.sass'
291
292
  ]
292
293
  */
293
294
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adamlui/scss-to-css",
3
- "version": "2.1.0",
3
+ "version": "2.2.1",
4
4
  "description": "Recursively compile all SCSS files into minified CSS",
5
5
  "author": {
6
6
  "name": "Adam Lui",
@@ -47,7 +47,7 @@
47
47
  "lint:all": "eslint .",
48
48
  "lint:fix": "eslint . --fix --cache",
49
49
  "lint:fix-all": "eslint . --fix",
50
- "translate": "py utils/translate-en-messages.py",
50
+ "translate": "translate-messages",
51
51
  "build": "node utils/build",
52
52
  "build:js": "node utils/build --js",
53
53
  "build:data": "node utils/build --data",
@@ -62,14 +62,16 @@
62
62
  "url": "git+https://github.com/adamlui/scss-to-css.git"
63
63
  },
64
64
  "keywords": [
65
- "scss",
66
- "compiler",
67
- "minifier",
68
- "cli",
69
65
  "api",
70
- "sass",
66
+ "cli",
67
+ "compiler",
68
+ "compression",
71
69
  "css",
72
- "stylesheets"
70
+ "sass",
71
+ "scss",
72
+ "stylesheets",
73
+ "minifier",
74
+ "utility"
73
75
  ],
74
76
  "bugs": {
75
77
  "url": "https://github.com/adamlui/scss-to-css/issues"
@@ -79,11 +81,11 @@
79
81
  "sass": "^1.97.3"
80
82
  },
81
83
  "devDependencies": {
82
- "@adamlui/minify.js": "^2.2.0",
83
- "@eslint/json": "^1.0.0",
84
+ "@adamlui/minify.js": "^2.3.0",
85
+ "@eslint/json": "^1.0.1",
84
86
  "@eslint/markdown": "^7.5.1",
85
- "@stylistic/eslint-plugin": "^5.7.1",
86
- "eslint": "^9.39.2",
87
+ "@stylistic/eslint-plugin": "^5.9.0",
88
+ "eslint": "^9.39.3",
87
89
  "eslint-plugin-import": "^2.32.0",
88
90
  "eslint-plugin-regexp": "^3.0.0",
89
91
  "husky": "^9.1.7"