92 lines
2.6 KiB
JavaScript
92 lines
2.6 KiB
JavaScript
const yaml = require('js-yaml')
|
|
const jszip = require('jszip')
|
|
const makerjs = require('makerjs')
|
|
|
|
const u = require('./utils')
|
|
const a = require('./assert')
|
|
const kle = require('./kle')
|
|
|
|
exports.unpack = async (zip) => {
|
|
|
|
// main config text (has to be called "config.ext" where ext is one of yaml/json/js)
|
|
const candidates = zip.file(/^config\.(yaml|json|js)$/)
|
|
if (candidates.length != 1) {
|
|
throw new Error('Ambiguous config in bundle!')
|
|
}
|
|
const config_text = await candidates[0].async('string')
|
|
const injections = []
|
|
|
|
// bundled footprints
|
|
const fps = zip.folder('footprints')
|
|
const module_prefix = 'const module = {};\n\n'
|
|
const module_suffix = '\n\nreturn module.exports;'
|
|
for (const fp of fps.file(/.*\.js$/)) {
|
|
const name = fp.name.slice('footprints/'.length).split('.')[0]
|
|
const text = await fp.async('string')
|
|
const parsed = new Function(module_prefix + text + module_suffix)()
|
|
// TODO: some sort of footprint validation?
|
|
injections.push(['footprint', name, parsed])
|
|
}
|
|
|
|
return [config_text, injections]
|
|
}
|
|
|
|
exports.interpret = (raw, logger) => {
|
|
let config = raw
|
|
let format = 'OBJ'
|
|
if (a.type(raw)() == 'string') {
|
|
try {
|
|
config = yaml.safeLoad(raw)
|
|
format = 'YAML'
|
|
} catch (yamlex) {
|
|
try {
|
|
config = new Function(raw)()
|
|
a.assert(
|
|
a.type(config)() == 'object',
|
|
'Input JS Code doesn\'t resolve into an object!'
|
|
)
|
|
format = 'JS'
|
|
} catch (codeex) {
|
|
logger('YAML exception:', yamlex)
|
|
logger('Code exception:', codeex)
|
|
throw new Error('Input is not valid YAML, JSON, or JS Code!')
|
|
}
|
|
}
|
|
}
|
|
|
|
try {
|
|
// assume it's KLE and try to convert it
|
|
config = kle.convert(config, logger)
|
|
format = 'KLE'
|
|
} catch (kleex) {
|
|
// nope... nevermind
|
|
}
|
|
|
|
if (a.type(config)() != 'object') {
|
|
throw new Error('Input doesn\'t resolve into an object!')
|
|
}
|
|
|
|
if (!Object.keys(config).length) {
|
|
throw new Error('Input appears to be empty!')
|
|
}
|
|
|
|
return [config, format]
|
|
}
|
|
|
|
exports.twodee = (model, debug) => {
|
|
const assembly = makerjs.model.originate({
|
|
models: {
|
|
export: u.deepcopy(model)
|
|
},
|
|
units: 'mm'
|
|
})
|
|
|
|
const result = {
|
|
dxf: makerjs.exporter.toDXF(assembly),
|
|
}
|
|
if (debug) {
|
|
result.yaml = assembly
|
|
result.svg = makerjs.exporter.toSVG(assembly)
|
|
}
|
|
return result
|
|
}
|