quasar

Форк
0
204 строки · 4.5 Кб
1
const path = require('path')
2
const fs = require('fs')
3
const fse = require('fs-extra')
4
const rollup = require('rollup')
5
const uglify = require('uglify-es')
6
const buble = require('@rollup/plugin-buble')
7
const json = require('@rollup/plugin-json')
8
const { nodeResolve } = require('@rollup/plugin-node-resolve')
9

10
const buildConf = require('./config')
11
const buildUtils = require('./utils')
12

13
const rollupPlugins = [
14
  nodeResolve({
15
    extensions: ['.js'],
16
    preferBuiltins: false
17
  }),
18
  json(),
19
  buble({
20
    objectAssign: 'Object.assign'
21
  })
22
]
23

24
const builds = [
25
  {
26
    rollup: {
27
      input: {
28
        input: pathResolve('entry/index.esm.js')
29
      },
30
      output: {
31
        file: pathResolve('../dist/index.esm.js'),
32
        format: 'es'
33
      }
34
    },
35
    build: {
36
      // unminified: true,
37
      minified: true
38
    }
39
  },
40
  {
41
    rollup: {
42
      input: {
43
        input: pathResolve('entry/index.common.js')
44
      },
45
      output: {
46
        file: pathResolve('../dist/index.common.js'),
47
        format: 'cjs'
48
      }
49
    },
50
    build: {
51
      // unminified: true,
52
      minified: true
53
    }
54
  },
55
  {
56
    rollup: {
57
      input: {
58
        input: pathResolve('entry/index.umd.js')
59
      },
60
      output: {
61
        name: '<%= umdExportName %>',
62
        file: pathResolve('../dist/index.umd.js'),
63
        format: 'umd'
64
      }
65
    },
66
    build: {
67
      unminified: true,
68
      minified: true,
69
      minExt: true
70
    }
71
  }
72
]
73

74
// Add your asset folders here, if needed
75
// addAssets(builds, 'icon-set', 'iconSet')
76
// addAssets(builds, 'lang', 'lang')
77

78
build(builds)
79

80
/**
81
 * Helpers
82
 */
83

84
function pathResolve (_path) {
85
  return path.resolve(__dirname, _path)
86
}
87

88
// eslint-disable-next-line no-unused-vars
89
function addAssets (builds, type, injectName) {
90
  const
91
    files = fs.readdirSync(pathResolve('../../ui/src/components/' + type)),
92
    plugins = [ buble(/* bubleConfig */) ],
93
    outputDir = pathResolve(`../dist/${type}`)
94

95
    fse.mkdirp(outputDir)
96

97
  files
98
    .filter(file => file.endsWith('.js'))
99
    .forEach(file => {
100
      const name = file.substr(0, file.length - 3).replace(/-([a-z])/g, g => g[1].toUpperCase())
101
      builds.push({
102
        rollup: {
103
          input: {
104
            input: pathResolve(`../src/components/${type}/${file}`),
105
            plugins
106
          },
107
          output: {
108
            file: addExtension(pathResolve(`../dist/${type}/${file}`), 'umd'),
109
            format: 'umd',
110
            name: `<%= umdExportName %>.${injectName}.${name}`
111
          }
112
        },
113
        build: {
114
          minified: true
115
        }
116
      })
117
    })
118
}
119

120
function build (builds) {
121
  return Promise
122
    .all(builds.map(genConfig).map(buildEntry))
123
    .catch(buildUtils.logError)
124
}
125

126
function genConfig (opts) {
127
  Object.assign(opts.rollup.input, {
128
    plugins: rollupPlugins,
129
    external: [ 'vue', 'quasar' ]
130
  })
131

132
  Object.assign(opts.rollup.output, {
133
    banner: buildConf.banner,
134
    globals: { vue: 'Vue', quasar: 'Quasar' }
135
  })
136

137
  return opts
138
}
139

140
function addExtension (filename, ext = 'min') {
141
  const insertionPoint = filename.lastIndexOf('.')
142
  return `${filename.slice(0, insertionPoint)}.${ext}${filename.slice(insertionPoint)}`
143
}
144

145
function buildEntry (config) {
146
  return rollup
147
    .rollup(config.rollup.input)
148
    .then(bundle => bundle.generate(config.rollup.output))
149
    .then(({ output }) => {
150
      const code = config.rollup.output.format === 'umd'
151
        ? injectVueRequirement(output[0].code)
152
        : output[0].code
153

154
      return config.build.unminified
155
        ? buildUtils.writeFile(config.rollup.output.file, code)
156
        : code
157
    })
158
    .then(code => {
159
      if (!config.build.minified) {
160
        return code
161
      }
162

163
      const minified = uglify.minify(code, {
164
        compress: {
165
          pure_funcs: ['makeMap']
166
        }
167
      })
168

169
      if (minified.error) {
170
        return Promise.reject(minified.error)
171
      }
172

173
      return buildUtils.writeFile(
174
        config.build.minExt === true
175
          ? addExtension(config.rollup.output.file)
176
          : config.rollup.output.file,
177
        buildConf.banner + minified.code,
178
        true
179
      )
180
    })
181
    .catch(err => {
182
      console.error(err)
183
      process.exit(1)
184
    })
185
}
186

187
function injectVueRequirement (code) {
188
  // eslint-disable-next-line
189
  const index = code.indexOf(`Vue = Vue && Vue.hasOwnProperty('default') ? Vue['default'] : Vue`)
190

191
  if (index === -1) {
192
    return code
193
  }
194

195
  const checkMe = ` if (Vue === void 0) {
196
    console.error('[ Quasar ] Vue is required to run. Please add a script tag for it before loading Quasar.')
197
    return
198
  }
199
  `
200

201
  return code.substring(0, index - 1) +
202
    checkMe +
203
    code.substring(index)
204
}
205

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.