transpile.js 1.7 KB
Newer Older
N
nkzawa 已提交
1 2
import { dirname } from 'path'
import fs from 'mz/fs'
D
Dan Zajdband 已提交
3
import mkdirp from 'mkdirp-then'
N
nkzawa 已提交
4 5 6 7 8 9 10 11 12 13
import { transformFile } from 'babel-core'
import preset2015 from 'babel-preset-es2015'
import presetReact from 'babel-preset-react'
import transformAsyncToGenerator from 'babel-plugin-transform-async-to-generator'
import transformClassProperties from 'babel-plugin-transform-class-properties'
import transformObjectRestSpread from 'babel-plugin-transform-object-rest-spread'
import transformRuntime from 'babel-plugin-transform-runtime'
import moduleAlias from 'babel-plugin-module-alias'

const babelRuntimePath = require.resolve('babel-runtime/package')
D
Dan Zajdband 已提交
14
.replace(/[\\\/]package\.json$/, '')
N
nkzawa 已提交
15 16 17 18 19 20 21 22 23 24 25 26 27

const babelOptions = {
  presets: [preset2015, presetReact],
  plugins: [
    transformAsyncToGenerator,
    transformClassProperties,
    transformObjectRestSpread,
    transformRuntime,
    [
      moduleAlias,
      [
        { src: `npm:${babelRuntimePath}`, expose: 'babel-runtime' },
        { src: `npm:${require.resolve('react')}`, expose: 'react' },
28
        { src: `npm:${require.resolve('../../lib/link')}`, expose: 'next/link' },
N
nkzawa 已提交
29 30
        { src: `npm:${require.resolve('../../lib/css')}`, expose: 'next/css' },
        { src: `npm:${require.resolve('../../lib/head')}`, expose: 'next/head' }
N
nkzawa 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
      ]
    ]
  ],
  ast: false
}

export default async function transpile (src, dst) {
  const code = await new Promise((resolve, reject) => {
    transformFile(src, babelOptions, (err, result) => {
      if (err) return reject(err)
      resolve(result.code)
    })
  })

  await writeFile(dst, code)
}

async function writeFile (path, data) {
  await mkdirp(dirname(path))
  await fs.writeFile(path, data, { encoding: 'utf8', flag: 'w+' })
}