You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
2.6 KiB
116 lines
2.6 KiB
#!/usr/bin/env node |
|
|
|
const fs = require('fs'); |
|
const prefersColorScheme = require('./postcss'); |
|
|
|
if (process.argv.length < 3) { |
|
console.log([ |
|
'Prefers Color Scheme\n', |
|
' Transforms CSS with @media (prefers-color-scheme) {}\n', |
|
'Usage:\n', |
|
' css-prefers-color-scheme source.css transformed.css', |
|
' css-prefers-color-scheme --in=source.css --out=transformed.css --opts={}', |
|
' echo "@media (prefers-color-scheme: dark) {}" | css-prefers-color-scheme\n' |
|
].join('\n')); |
|
process.exit(0); |
|
} |
|
|
|
// get process and plugin options from the command line |
|
const fileRegExp = /^[\w\/.]+$/; |
|
const argRegExp = /^--(\w+)=("|')?(.+)\2$/; |
|
const relaxedJsonRegExp = /(['"])?([a-z0-9A-Z_]+)(['"])?:/g; |
|
const argo = process.argv.slice(2).reduce( |
|
(object, arg) => { |
|
const argMatch = arg.match(argRegExp); |
|
const fileMatch = arg.match(fileRegExp); |
|
|
|
if (argMatch) { |
|
object[argMatch[1]] = argMatch[3]; |
|
} else if (fileMatch) { |
|
if (object.from === '<stdin>') { |
|
object.from = arg; |
|
} else if (object.to === '<stdout>') { |
|
object.to = arg; |
|
} |
|
} |
|
|
|
return object; |
|
}, |
|
{ from: '<stdin>', to: '<stdout>', opts: 'null' } |
|
); |
|
|
|
// get css from command line arguments or stdin |
|
(argo.from === '<stdin>' ? getStdin() : readFile(argo.from)) |
|
.then(css => { |
|
const pluginOpts = JSON.parse(argo.opts.replace(relaxedJsonRegExp, '"$2": ')); |
|
const processOptions = Object.assign({ from: argo.from, to: argo.to || argo.from }, argo.map ? { map: JSON.parse(argo.map) } : {}); |
|
|
|
const result = prefersColorScheme.process(css, processOptions, pluginOpts); |
|
|
|
if (argo.to === '<stdout>') { |
|
return result.css; |
|
} else { |
|
return writeFile(argo.to, result.css).then( |
|
() => `CSS was written to "${argo.to}"` |
|
) |
|
} |
|
}).then( |
|
result => { |
|
console.log(result); |
|
|
|
process.exit(0); |
|
}, |
|
error => { |
|
console.error(error); |
|
|
|
process.exit(1); |
|
} |
|
); |
|
|
|
function readFile(pathname) { |
|
return new Promise((resolve, reject) => { |
|
fs.readFile(pathname, 'utf8', (error, data) => { |
|
if (error) { |
|
reject(error); |
|
} else { |
|
resolve(data); |
|
} |
|
}); |
|
}); |
|
} |
|
|
|
function writeFile(pathname, data) { |
|
return new Promise((resolve, reject) => { |
|
fs.writeFile(pathname, data, (error, content) => { |
|
if (error) { |
|
reject(error); |
|
} else { |
|
resolve(content); |
|
} |
|
}); |
|
}); |
|
} |
|
|
|
function getStdin() { |
|
return new Promise(resolve => { |
|
let data = ''; |
|
|
|
if (process.stdin.isTTY) { |
|
resolve(data); |
|
} else { |
|
process.stdin.setEncoding('utf8'); |
|
|
|
process.stdin.on('readable', () => { |
|
let chunk; |
|
|
|
while (chunk = process.stdin.read()) { |
|
data += chunk; |
|
} |
|
}); |
|
|
|
process.stdin.on('end', () => { |
|
resolve(data); |
|
}); |
|
} |
|
}); |
|
}
|
|
|