Replace CDN React/ReactDOM/Babel with local libs; remove Babel and inline scripts Build Tailwind locally, add safelist; switch to assets/tailwind.css Self-host Font Awesome and Inter (CSS + woff2); remove external font CDNs Implement strict CSP (no unsafe-inline/eval; scripts/styles/fonts from self) Extract inline handlers; move PWA scripts to external files Add local QR code generation (qrcode lib) and remove api.qrserver.com Improve SessionTypeSelector visual selection (highlighted background and ring) Keep PWA working with service worker and offline assets Refs: CSP hardening, offline-first, no external dependencies
77 lines
1.8 KiB
JavaScript
77 lines
1.8 KiB
JavaScript
|
|
const canPromise = require('./can-promise')
|
|
|
|
const QRCode = require('./core/qrcode')
|
|
const CanvasRenderer = require('./renderer/canvas')
|
|
const SvgRenderer = require('./renderer/svg-tag.js')
|
|
|
|
function renderCanvas (renderFunc, canvas, text, opts, cb) {
|
|
const args = [].slice.call(arguments, 1)
|
|
const argsNum = args.length
|
|
const isLastArgCb = typeof args[argsNum - 1] === 'function'
|
|
|
|
if (!isLastArgCb && !canPromise()) {
|
|
throw new Error('Callback required as last argument')
|
|
}
|
|
|
|
if (isLastArgCb) {
|
|
if (argsNum < 2) {
|
|
throw new Error('Too few arguments provided')
|
|
}
|
|
|
|
if (argsNum === 2) {
|
|
cb = text
|
|
text = canvas
|
|
canvas = opts = undefined
|
|
} else if (argsNum === 3) {
|
|
if (canvas.getContext && typeof cb === 'undefined') {
|
|
cb = opts
|
|
opts = undefined
|
|
} else {
|
|
cb = opts
|
|
opts = text
|
|
text = canvas
|
|
canvas = undefined
|
|
}
|
|
}
|
|
} else {
|
|
if (argsNum < 1) {
|
|
throw new Error('Too few arguments provided')
|
|
}
|
|
|
|
if (argsNum === 1) {
|
|
text = canvas
|
|
canvas = opts = undefined
|
|
} else if (argsNum === 2 && !canvas.getContext) {
|
|
opts = text
|
|
text = canvas
|
|
canvas = undefined
|
|
}
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
try {
|
|
const data = QRCode.create(text, opts)
|
|
resolve(renderFunc(data, canvas, opts))
|
|
} catch (e) {
|
|
reject(e)
|
|
}
|
|
})
|
|
}
|
|
|
|
try {
|
|
const data = QRCode.create(text, opts)
|
|
cb(null, renderFunc(data, canvas, opts))
|
|
} catch (e) {
|
|
cb(e)
|
|
}
|
|
}
|
|
|
|
exports.create = QRCode.create
|
|
exports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render)
|
|
exports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL)
|
|
|
|
// only svg for now.
|
|
exports.toString = renderCanvas.bind(null, function (data, _, opts) {
|
|
return SvgRenderer.render(data, opts)
|
|
})
|