Skip to content

Instantly share code, notes, and snippets.

@jongacnik
Last active November 24, 2017 20:25
Show Gist options
  • Save jongacnik/1d424a5a79c3504eeb804eabd040af85 to your computer and use it in GitHub Desktop.
Save jongacnik/1d424a5a79c3504eeb804eabd040af85 to your computer and use it in GitHub Desktop.
choop: generate a build of choo with preact instead of nanomorph
var fs = require('fs')
var path = require('path')
var r2 = require('r2')
var x = require('xtend')
var packageJson = require('package-json')
var latestVersion = require('latest-version')
var prettyjson = require('json-format')
var raw = {
choo: 'https://raw.githubusercontent.com/choojs/choo/master/index.js'
}
// makechoop()
makePackage()
async function makechoop () {
var choosrc = await r2(raw.choo).text
// nanomorph -> preact
choosrc = choosrc.replace(`var nanomorph = require('nanomorph')`, `var preact = require('preact')\nvar rendertostring = require('preact-render-to-string').render`)
// tree reference
choosrc = choosrc.replace(`this._tree = null`, `this._tree = null\n\tthis._treeref = null`)
// nanomorph() -> preact.render()
choosrc = choosrc.replace(`nanomorph(self._tree, newTree)`, `self._treeref = preact.render(newTree, self._tree, self._treeref)`)
choosrc = choosrc.replace(`nanomorph(self._tree, newTree)`, `self._treeref = preact.render(newTree, self._tree, self._tree.lastChild)`)
// render to string
choosrc = choosrc.replace(`html.toString()`, `rendertostring(html)`)
// remove tree nodeName assets
choosrc = choosrc.replace(`assert.equal(self._tree.nodeName, newTree.nodeName, 'choo.render: The target node <' +
self._tree.nodeName.toLowerCase() + '> is not the same type as the new node <' +
newTree.nodeName.toLowerCase() + '>.')`, '')
choosrc = choosrc.replace(`assert.equal(self._tree.nodeName, newTree.nodeName, 'choo.mount: The target node <' +
self._tree.nodeName.toLowerCase() + '> is not the same type as the new node <' +
newTree.nodeName.toLowerCase() + '>.')`, '')
// write files
fs.writeFileSync(path.join(__dirname, '../index.js'), choosrc)
fs.writeFileSync(path.join(__dirname, '../html.js'), `var h = require('preact').h
var hyperx = require('hyperx')
module.exports = hyperx(h)\n`)
fs.writeFileSync(path.join(__dirname, '../h.js'), `module.exports = require('preact').h\n`)
fs.writeFileSync(path.join(__dirname, '../component.js'), `function Component () {}
Component.prototype = Object.create(require('preact').Component.prototype)
module.exports = Component\n`)
}
async function makePackage () {
var packages = {
choo: await packageJson('choo')
}
var newdeps = {
preact: '^' + await latestVersion('preact'),
hyperx: '^' + await latestVersion('hyperx'),
'preact-render-to-string': '^' + await latestVersion('preact-render-to-string')
}
var newdevdeps = {
'babel-plugin-transform-object-rest-spread': '^' + await latestVersion('babel-plugin-transform-object-rest-spread'),
'babel-plugin-transform-class-properties': '^' + await latestVersion('babel-plugin-transform-class-properties'),
'babel-plugin-transform-react-jsx': '^' + await latestVersion('babel-plugin-transform-react-jsx'),
'babel-preset-es2015': '^' + await latestVersion('babel-preset-es2015'),
'babel-preset-stage-0': '^' + await latestVersion('babel-preset-stage-0'),
}
var deps = packages.choo.dependencies
delete deps['nanomorph']
delete deps['bel']
deps = x(newdeps, deps)
var devdeps = packages.choo.devDependencies
devdeps = x(newdevdeps, devdeps)
console.log(packages.choo.version)
console.log('\n')
console.log(prettyjson(deps))
console.log('\n')
console.log(prettyjson(devdeps))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment