1 var canPromise = require('./can-promise')
2 var QRCode = require('./core/qrcode')
3 var PngRenderer = require('./renderer/png')
4 var Utf8Renderer = require('./renderer/utf8')
5 var TerminalRenderer = require('./renderer/terminal')
6 var SvgRenderer = require('./renderer/svg')
8 function checkParams (text, opts, cb) {
9 if (typeof text === 'undefined') {
10 throw new Error('String required as first argument')
13 if (typeof cb === 'undefined') {
18 if (typeof cb !== 'function') {
20 throw new Error('Callback required as last argument')
33 function getTypeFromFilename (path) {
34 return path.slice((path.lastIndexOf('.') - 1 >>> 0) + 2).toLowerCase()
37 function getRendererFromType (type) {
53 function getStringRendererFromType (type) {
59 return TerminalRenderer
67 function render (renderFunc, text, params) {
69 return new Promise(function (resolve, reject) {
71 var data = QRCode.create(text, params.opts)
72 return renderFunc(data, params.opts, function (err, data) {
73 return err ? reject(err) : resolve(data)
82 var data = QRCode.create(text, params.opts)
83 return renderFunc(data, params.opts, params.cb)
89 exports.create = QRCode.create
91 exports.toCanvas = require('./browser').toCanvas
93 exports.toString = function toString (text, opts, cb) {
94 var params = checkParams(text, opts, cb)
95 var renderer = getStringRendererFromType(params.opts.type)
96 return render(renderer.render, text, params)
99 exports.toDataURL = function toDataURL (text, opts, cb) {
100 var params = checkParams(text, opts, cb)
101 var renderer = getRendererFromType(params.opts.type)
102 return render(renderer.renderToDataURL, text, params)
105 exports.toBuffer = function toBuffer (text, opts, cb) {
106 var params = checkParams(text, opts, cb)
107 var renderer = getRendererFromType(params.opts.type)
108 return render(renderer.renderToBuffer, text, params)
111 exports.toFile = function toFile (path, text, opts, cb) {
112 if (typeof path !== 'string' || !(typeof text === 'string' || typeof text === 'object')) {
113 throw new Error('Invalid argument')
116 if ((arguments.length < 3) && !canPromise()) {
117 throw new Error('Too few arguments provided')
120 var params = checkParams(text, opts, cb)
121 var type = params.opts.type || getTypeFromFilename(path)
122 var renderer = getRendererFromType(type)
123 var renderToFile = renderer.renderToFile.bind(null, path)
125 return render(renderToFile, text, params)
128 exports.toFileStream = function toFileStream (stream, text, opts) {
129 if (arguments.length < 2) {
130 throw new Error('Too few arguments provided')
133 var params = checkParams(text, opts, stream.emit.bind(stream, 'error'))
134 var renderer = getRendererFromType('png') // Only png support for now
135 var renderToFileStream = renderer.renderToFileStream.bind(null, stream)
136 render(renderToFileStream, text, params)