laravelphp
Version:
laravel2js and js2laravel converter laravel php resource utils
56 lines (50 loc) • 1.6 kB
JavaScript
import Engine from 'php-parser'
const laravel2jsClb = (str, cb) => {
if (typeof str !== 'string') {
const err = new Error('The first parameter was not a string')
if (!cb) throw err
return cb(err)
}
const parser = new Engine({
parser: {
extractDoc: false,
php7: true
},
ast: {
withPositions: false
}
})
try {
const result = {}
const ast = parser.parseCode(str)
if (ast && ast.children && ast.children.length > 0) {
const returnElem = ast.children.find((ele) => (ele.kind === 'return'))
if (returnElem && returnElem.expr && returnElem.expr.kind === 'array' && returnElem.expr.items) {
;(function parseArr (items, parent) {
items.forEach((item) => {
if (item && item.kind === 'entry' && item.key && item.key.kind === 'string' && item.key.value && item.value) {
if (item.value.kind === 'string') {
parent[item.key.value] = item.value.value || ''
}
if (item.value.kind === 'array' && item.value.items) {
parent[item.key.value] = {}
parseArr(item.value.items, parent[item.key.value])
}
}
})
})(returnElem.expr.items, result)
}
}
if (cb) return cb(null, result)
return result
} catch (e) {
if (cb) return cb(e)
throw e
}
}
export default function laravel2js (str, cb) {
if (!cb) {
return new Promise((resolve, reject) => laravel2jsClb(str, (err, ret) => err ? reject(err) : resolve(ret)))
}
return laravel2jsClb(str, cb)
}