UNPKG

rollup-plugin-monkey

Version:
224 lines (204 loc) 6.9 kB
/* eslint-disable */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var fastify = require('fastify'); var fastifyCors = require('@fastify/cors'); var fp = require('fastify-plugin'); var staticPlugin = require('@fastify/static'); var path = require('path'); var wsPlugin = require('@fastify/websocket'); var url = require('url'); var node_module = require('node:module'); var fs = require('fs'); var chokidar = require('chokidar'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var fastify__default = /*#__PURE__*/_interopDefaultLegacy(fastify); var fastifyCors__default = /*#__PURE__*/_interopDefaultLegacy(fastifyCors); var fp__default = /*#__PURE__*/_interopDefaultLegacy(fp); var staticPlugin__default = /*#__PURE__*/_interopDefaultLegacy(staticPlugin); var path__default = /*#__PURE__*/_interopDefaultLegacy(path); var wsPlugin__default = /*#__PURE__*/_interopDefaultLegacy(wsPlugin); var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); var chokidar__default = /*#__PURE__*/_interopDefaultLegacy(chokidar); const serverDefaults = Object.freeze({ ignoreTrailingSlash: true, disableRequestLogging: true }); const pluginServer = Object.freeze({ logger: { transport: { target: '#pinoPretty', // target: "pino-pretty", options: { colorize: true, }, } } }); const defConfig = { cors: { origin: '*', methods: ['GET'] }, static: { basePath: undefined, dirs: [''], }, listen: { host: 'localhost', port: 3000, }, server: { ...pluginServer, ...serverDefaults }, watch: { }, livereload: true, force: false, extend: undefined, onListen: undefined }; var fastifyStatic = fp__default["default"](async (server, { basePath, dirs }) => { const prefix = basePath; const root = dirs.map(dir => path.resolve(dir)); server.register(staticPlugin__default["default"], { prefix, root }); }); const onRefresh = (server, filepath) => { const { websocketServer } = server; const data = JSON.stringify({ command: 'reload', path: filepath, }); websocketServer.clients.forEach(socket => { socket.send(data); }); }; var fastifyWS = fp__default["default"](async (server) => { await server.register(wsPlugin__default["default"]); server.get('/livereload', { websocket: true }, (connection, req) => { server.log.info('「livereload」 connection'); connection.socket.on('message', message => { const request = JSON.parse(message.toString()); server.log.info(`「livereload」 ${request.command}`); if (request.command === 'hello') { const data = JSON.stringify({ command: 'hello', protocols: ['http://livereload.com/protocols/official-7', 'http://livereload.com/protocols/official-8', 'http://livereload.com/protocols/official-9', 'http://livereload.com/protocols/2.x-origin-version-negotiation', 'http://livereload.com/protocols/2.x-remote-control'], serverName: 'node-livereload' }); connection.socket.send(data); } }); }); }); const __filename$1 = url.fileURLToPath((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('index.cjs', document.baseURI).href))); const __dirname$1 = path__default["default"].dirname(__filename$1); const require$1 = node_module.createRequire((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('index.cjs', document.baseURI).href))); const monkeyPath = { base: path__default["default"].resolve(__dirname$1, '../'), liveJS: require$1.resolve('livereload-js'), devJS: require$1.resolve('#dev'), }; class Server { async init(config = defConfig) { this.config = config; this.server = fastify__default["default"](config.server); if (config.livereload) { this.server.register(fastifyWS); this.livereload(); } this.server.register(fastifyStatic, config.static); this.server.register(fastifyCors__default["default"], config.cors); await this.server.ready(); return this } start() { this.server.listen({ host: this.config.listen.host, port: this.config.listen.port, }, (err, address) => { if (err) { this.server.log.error(err); // process.exit(1) } }); if (this.config.onListen) { this.config.onListen(this); } } livereload() { this.server.get('/livereload.js', function (req, reply) { // console.log(monkeyPath.liveJS) // reply.type('text/javascript').sendFile('livereload.js', monkeyPath.livePath) fs__default["default"].readFile(monkeyPath.liveJS, (err, fileBuffer) => { reply.type('text/javascript').send(err || fileBuffer); }); }); } } const defaultExclusions = [/\.git\//, /\.svn\//, /\.hg\//, /node_modules\//]; function watcher (config, act = () => { }) { config.exclusions = config.exclusions || []; config.exclusions = config.exclusions.concat(defaultExclusions); config.dirs = config.dirs || ''; let paths; if (Array.isArray(config.dirs)) { paths = config.dirs.map(item => path.resolve(process.cwd(), item)); } else { paths = path.resolve(process.cwd(), config.dirs); } return chokidar__default["default"].watch(paths, { ignoreInitial: true, usePolling: false, ignored: config.exclusions, }).on('all', (event, path) => { if (event === 'add' || event === 'change' || event === 'unlink') { act(event, path); } }) } var main = (opts = {}) => { let booted = false; return { name: 'dev-monkey', async writeBundle() { if (booted) return booted = true; try { const config = Object.assign({}, defConfig, opts); if (!this.meta.watchMode) { if (!config.force) return else this.warn('Starting dev-monkey even though we\'re not in watch mode'); } const web = new Server(); await web.init(config); web.start(); if (config.livereload) { watcher(config.watch, (event, path) => { web.server.log.info(`${event} ${path}`); onRefresh(web.server, path); }); } } catch (err) { this.error(err); } } } }; const monkeyRequire = (arrOpts) => { const entryList = []; const apiList = []; arrOpts.forEach((s) => { entryList.push(s.url); apiList.push(s.func); }); return { gm_entry: JSON.stringify(entryList), gm_api: JSON.stringify(apiList), gm_require: arrOpts.map((s) => `// @require ${s.url}`).join('\n'), } }; exports["default"] = main; exports.monkeyPath = monkeyPath; exports.monkeyRequire = monkeyRequire;