UNPKG

@lark-project/cli

Version:

飞书项目插件开发工具

136 lines (135 loc) 7.46 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.startProject = void 0; const webpack_1 = __importStar(require("webpack")); const webpack_dev_server_1 = __importDefault(require("webpack-dev-server")); const qrcode_1 = __importDefault(require("qrcode")); const cheerio = __importStar(require("cheerio")); const constants_1 = require("../../../constants"); const logger_1 = require("../../../utils/logger"); const kill_port_1 = require("../../../utils/kill-port"); const resolve_project_path_1 = require("../../../utils/resolve-project-path"); const webpack_config_react_1 = require("../../webpack/custom-ui/webpack.config.react"); const webpack_dev_server_config_1 = require("../../webpack/dev-server/webpack-dev-server.config"); const get_plugin_profile_for_v2_1 = require("../../../get-plugin-profile-for-v2"); const env_1 = require("../../../utils/env"); const types_1 = require("../../../types"); const utils_1 = require("../../../v1/utils"); const download_html_tpl_1 = require("./download-html-tpl"); const generate_html_entry_script_1 = require("../../../utils/generate-html-entry-script"); const find_entries_1 = require("../find-entries"); async function startProject() { await (0, kill_port_1.killPort)(constants_1.DEV_SERVER_PORT); const pluginProfile = await (0, get_plugin_profile_for_v2_1.getPluginProfileForV2)(); const [needBuildResources, missedResourceIds] = (0, find_entries_1.findEntries)(pluginProfile); if (missedResourceIds.length) { logger_1.logger.warn(`The resource entries for these ids (${missedResourceIds.join(', ')}) is missing in plugin.config.json.`); } if (!needBuildResources.length) { logger_1.logger.error('No resources need to build, please check the plugin.config.json / developer platform and retry.'); process.exit(1); } // 拉取 HTML 模板 const firstWebFeature = pluginProfile.features.find(f => { var _a, _b; return (_b = (_a = f[types_1.EFeaturePlatform.web]) === null || _a === void 0 ? void 0 : _a.resourceId) === null || _b === void 0 ? void 0 : _b.resource; }); const firstMobileFeature = pluginProfile.features.find(f => { var _a, _b; return (_b = (_a = f[types_1.EFeaturePlatform.mobile]) === null || _a === void 0 ? void 0 : _a.resourceId) === null || _b === void 0 ? void 0 : _b.resource; }); const downloadTplTasks = []; if (firstWebFeature) { downloadTplTasks.push((0, download_html_tpl_1.downloadHTMLTemplateAndCache)({ pageServerDomain: pluginProfile.pageServerDomain, pluginId: pluginProfile.id, platform: types_1.EFeaturePlatform.web, resourceId: firstWebFeature[types_1.EFeaturePlatform.web].resourceId.resource, })); } if (firstMobileFeature) { downloadTplTasks.push((0, download_html_tpl_1.downloadHTMLTemplateAndCache)({ pageServerDomain: pluginProfile.pageServerDomain, pluginId: pluginProfile.id, platform: types_1.EFeaturePlatform.mobile, resourceId: firstMobileFeature[types_1.EFeaturePlatform.mobile].resourceId.resource, })); } await (0, utils_1.wrapOraLoading)(() => Promise.all(downloadTplTasks), 'downloading the html template...'); const webpackConfigs = needBuildResources.map(resource => { const { id, entry } = resource; const platform = pluginProfile.findFirstFeaturePlatformByResourceId(id); return (0, webpack_config_react_1.getWebpackConfigForReact)({ key: id, webpackEnv: 'development', entry: (0, resolve_project_path_1.resolveProjectPath)(entry), generateHtmlTemplate: (jsFiles, cssFiles) => { const htmlTpl = (0, download_html_tpl_1.getCachedHTMLByPlatform)(platform); const $ = cheerio.load(htmlTpl); const entryScript = (0, generate_html_entry_script_1.generateHTMLEntryScript)(jsFiles, cssFiles); $(entryScript).prependTo($('head')); const finalHTML = $.html(); return finalHTML; }, }); }); logger_1.logger.debug(JSON.stringify(webpackConfigs, null, 0)); const multiCompiler = new webpack_1.MultiCompiler(webpackConfigs.map(c => (0, webpack_1.default)(c)), { parallelism: 3 }); let isFirstCompileDone = true; multiCompiler.hooks.done.tap('LPM_START_MULTI_COMPILER_DONE', () => { // rebuild 不打印二维码 if (!isFirstCompileDone) { return; } isFirstCompileDone = false; // 有移动端产物才打印二维码 if (pluginProfile.hasMobileFeature()) { const url = new URL(`${pluginProfile.siteDomain}/openapp/plugin/dev/m`); // 避免 siteDomain 带了 /,替换掉多余的 / url.pathname = url.pathname.replace(/\/+/g, '/'); let localIPv4 = env_1.env.originForDevServer; // 当用户指定 devServer 返回资源的 origin,则不取本地 ipv4 地址 if (!localIPv4) { localIPv4 = webpack_dev_server_1.default.internalIPSync('v4'); } const localAddress = `${env_1.env.disableHttps ? 'http' : 'https'}://${localIPv4}:${constants_1.DEV_SERVER_PORT}`; const qrCodeUrl = `${url.toString()}?plugin_id=${pluginProfile.id}&local_address=${localAddress}`; logger_1.logger.debug(qrCodeUrl); qrcode_1.default.toString(qrCodeUrl, { type: 'terminal', small: true }, function (err, url) { console.log('\n'); console.log(url); console.log('Please use Lark App scan the QRCode above, debug your plugin in the app. \n'); }); } }); const webpackDevServerConfig = await (0, webpack_dev_server_config_1.getWebpackDevServerConfig)(); logger_1.logger.debug(JSON.stringify(webpackDevServerConfig, null, 0)); const devServer = new webpack_dev_server_1.default(webpackDevServerConfig, multiCompiler); devServer.startCallback(() => { logger_1.logger.success('Starting the development server...'); }); devServer.stopCallback(() => { logger_1.logger.success('The development server stoped.'); }); } exports.startProject = startProject;