@lark-apaas/coding-html-devserver 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +13 -0
- package/README.md +54 -0
- package/bin/coding-html-devserver.js +2 -0
- package/lib/build.d.ts +23 -0
- package/lib/build.d.ts.map +1 -0
- package/lib/build.js +50 -0
- package/lib/build.js.map +1 -0
- package/lib/cli.d.ts +2 -0
- package/lib/cli.d.ts.map +1 -0
- package/lib/cli.js +46 -0
- package/lib/cli.js.map +1 -0
- package/lib/dev.d.ts +8 -0
- package/lib/dev.d.ts.map +1 -0
- package/lib/dev.js +23 -0
- package/lib/dev.js.map +1 -0
- package/lib/flags.d.ts +10 -0
- package/lib/flags.d.ts.map +1 -0
- package/lib/flags.js +31 -0
- package/lib/flags.js.map +1 -0
- package/lib/html-tags.d.ts +25 -0
- package/lib/html-tags.d.ts.map +1 -0
- package/lib/html-tags.js +122 -0
- package/lib/html-tags.js.map +1 -0
- package/lib/index.d.ts +24 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +37 -0
- package/lib/index.js.map +1 -0
- package/lib/minify.d.ts +11 -0
- package/lib/minify.d.ts.map +1 -0
- package/lib/minify.js +32 -0
- package/lib/minify.js.map +1 -0
- package/lib/plugins/health.d.ts +10 -0
- package/lib/plugins/health.d.ts.map +1 -0
- package/lib/plugins/health.js +38 -0
- package/lib/plugins/health.js.map +1 -0
- package/lib/plugins/inject.d.ts +15 -0
- package/lib/plugins/inject.d.ts.map +1 -0
- package/lib/plugins/inject.js +34 -0
- package/lib/plugins/inject.js.map +1 -0
- package/lib/plugins/vite-client-patch.d.ts +4 -0
- package/lib/plugins/vite-client-patch.d.ts.map +1 -0
- package/lib/plugins/vite-client-patch.js +55 -0
- package/lib/plugins/vite-client-patch.js.map +1 -0
- package/lib/plugins/ws-watchdog.d.ts +25 -0
- package/lib/plugins/ws-watchdog.d.ts.map +1 -0
- package/lib/plugins/ws-watchdog.js +103 -0
- package/lib/plugins/ws-watchdog.js.map +1 -0
- package/lib/transform/index.d.ts +38 -0
- package/lib/transform/index.d.ts.map +1 -0
- package/lib/transform/index.js +45 -0
- package/lib/transform/index.js.map +1 -0
- package/lib/transform/og-meta.d.ts +18 -0
- package/lib/transform/og-meta.d.ts.map +1 -0
- package/lib/transform/og-meta.js +54 -0
- package/lib/transform/og-meta.js.map +1 -0
- package/lib/transform/preview-bridge.d.ts +11 -0
- package/lib/transform/preview-bridge.d.ts.map +1 -0
- package/lib/transform/preview-bridge.js +16 -0
- package/lib/transform/preview-bridge.js.map +1 -0
- package/lib/transform/slardar.d.ts +17 -0
- package/lib/transform/slardar.d.ts.map +1 -0
- package/lib/transform/slardar.js +116 -0
- package/lib/transform/slardar.js.map +1 -0
- package/lib/transform/view-context.d.ts +27 -0
- package/lib/transform/view-context.d.ts.map +1 -0
- package/lib/transform/view-context.js +120 -0
- package/lib/transform/view-context.js.map +1 -0
- package/lib/vite-config.d.ts +24 -0
- package/lib/vite-config.d.ts.map +1 -0
- package/lib/vite-config.js +74 -0
- package/lib/vite-config.js.map +1 -0
- package/package.json +46 -0
- package/src/runtime/ws-watchdog-client.mjs +148 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Lark Technologies Pte. Ltd. and/or its affiliates
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted,provided that the above copyright notice and this permission notice appear in all copies.
|
|
6
|
+
|
|
7
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
8
|
+
IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
|
|
9
|
+
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
|
10
|
+
EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
|
|
11
|
+
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
12
|
+
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
|
13
|
+
ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# @lark-apaas/coding-html-devserver
|
|
2
|
+
|
|
3
|
+
miaoda-coding **html stack** 的 dev/build 工具链。**vite 被封装在内部**——消费方(html 模板)只依赖本包、调它的 bin,**`package.json` 里看不到 vite、也没有 `vite.config`**。
|
|
4
|
+
|
|
5
|
+
- **dev**:内部用 vite 起 dev server,拿 vite 原生 **HMR/热更新**(WS,经 `MIAODA_WS_HOST` 切独立域名穿沙箱网关) + `/dev/health` 探活 + 平台脚本注入。
|
|
6
|
+
- **build**:**不走 vite build**,纯拷贝 `src → dist/output`(文件名/路径/结构逐字保留)+ 平台脚本注入 + 可选 HTML 压缩。
|
|
7
|
+
- **平台脚本注入**:dev / build 共用一份清单,**用户不感知**、源文件保持纯净。
|
|
8
|
+
|
|
9
|
+
## 为什么这么设计
|
|
10
|
+
|
|
11
|
+
html stack 要的是 vite 那种**即时热更新体验**(轮询追不上),所以 dev 直接借 vite;但 vite build 会打包/加 hash/改写路径,跟"纯 HTML 产物 = 源码"冲突,所以 build 自己做纯拷贝。vite 全程是本包的内部依赖,对用户透明。
|
|
12
|
+
|
|
13
|
+
## 用法
|
|
14
|
+
|
|
15
|
+
```jsonc
|
|
16
|
+
// 消费方(html 模板)package.json —— 全程不出现 vite
|
|
17
|
+
"devDependencies": { "@lark-apaas/coding-html-devserver": "^0.1.0" },
|
|
18
|
+
"scripts": {
|
|
19
|
+
"dev": "coding-html-devserver dev",
|
|
20
|
+
"build": "coding-html-devserver build"
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
coding-html-devserver dev [--root src] [--port 8001] [--host 0.0.0.0]
|
|
26
|
+
coding-html-devserver build [--root src] [--out dist/output] [--no-minify]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
端口优先级:`--port` > `CLIENT_DEV_PORT` env > `8001`。绑定 `0.0.0.0`、`allowedHosts: true`、不设 `base`(prefix 由沙箱网关剥)。HMR 在 `MIAODA_WS_HOST` 存在时切独立 WS 域名(对齐 vite-react 网关方案)。
|
|
30
|
+
|
|
31
|
+
## 平台注入(方案 A:烧进 SDK)
|
|
32
|
+
|
|
33
|
+
注入清单是内部常量 `PLATFORM_TAGS`,随版本走、用户不可配置。改注入 = 发新版 → 模板 bump → re-render。注入实现只有一份(`injectTags`),dev 经 vite `transformIndexHtml` 插件调用、build 在拷贝后调用,两条路一致。
|
|
34
|
+
|
|
35
|
+
描述符对齐 vite 的 `HtmlTagDescriptor`:
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
{ tag: 'script', attrs: { src: 'https://cdn/x.js', async: true }, injectTo: 'head' } // 外链 CDN
|
|
39
|
+
{ tag: 'script', children: 'window.__X__=1', injectTo: 'head-prepend' } // 内联 JS
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
机制:按 `injectTo` 分组保序、同 `src`/`id` 去重、内联 `</script>` 转义、畸形 HTML 锚点兜底。
|
|
43
|
+
|
|
44
|
+
> 当前 `PLATFORM_TAGS` 为占位空清单;机制已完整实现并测试,真实平台脚本地址确定后填入即可,对 API 无影响。
|
|
45
|
+
|
|
46
|
+
## 公共 API
|
|
47
|
+
|
|
48
|
+
`startDevServer` · `buildStatic` · `createHtmlViteConfig` · `injectPlatformTags` · `injectTags` · `serializeTag` · `healthPlugin` · `platformInjectPlugin` · 类型 `HtmlTagDescriptor` 等。
|
|
49
|
+
|
|
50
|
+
## 工程
|
|
51
|
+
|
|
52
|
+
ESM 包(vite 8 仅 ESM)。`tsc → lib/`(NodeNext)。Node ≥22。
|
|
53
|
+
|
|
54
|
+
设计文档:[`docs/superpowers/plans/2026-06-05-html-devserver-sdk.md`](../../../docs/superpowers/plans/2026-06-05-html-devserver-sdk.md)
|
package/lib/build.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface BuildOptions {
|
|
2
|
+
/** 静态根目录(相对 cwd),默认 'src'。 */
|
|
3
|
+
root?: string;
|
|
4
|
+
/** 产物目录(相对 cwd),默认 'dist/output'。 */
|
|
5
|
+
outDir?: string;
|
|
6
|
+
/** 是否压缩 HTML(含内联 css/js),默认 true。 */
|
|
7
|
+
minify?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface BuildResult {
|
|
10
|
+
readonly root: string;
|
|
11
|
+
readonly outDir: string;
|
|
12
|
+
/** 注入(并按需压缩)过的 html 产物绝对路径列表。 */
|
|
13
|
+
readonly htmlFiles: string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* build:把 `root` 全量**纯拷贝**到 `outDir`(文件名/路径/结构逐字保留),
|
|
17
|
+
* 再对产物里的每个 `.html` 注入平台脚本、按需原地压缩。
|
|
18
|
+
*
|
|
19
|
+
* 不走 vite build —— 不打包、不加 hash、不改写路径,保证「产物 = 源码」。
|
|
20
|
+
* 注入与 dev 共用 `injectPlatformTags`,两条路一致。
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildStatic(opts?: BuildOptions): Promise<BuildResult>;
|
|
23
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;CAC9B;AAID;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAuB/E"}
|
package/lib/build.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.buildStatic = buildStatic;
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const transform_1 = require("./transform");
|
|
10
|
+
const minify_1 = require("./minify");
|
|
11
|
+
const HTML_EXT = new Set(['.html', '.htm']);
|
|
12
|
+
/**
|
|
13
|
+
* build:把 `root` 全量**纯拷贝**到 `outDir`(文件名/路径/结构逐字保留),
|
|
14
|
+
* 再对产物里的每个 `.html` 注入平台脚本、按需原地压缩。
|
|
15
|
+
*
|
|
16
|
+
* 不走 vite build —— 不打包、不加 hash、不改写路径,保证「产物 = 源码」。
|
|
17
|
+
* 注入与 dev 共用 `injectPlatformTags`,两条路一致。
|
|
18
|
+
*/
|
|
19
|
+
async function buildStatic(opts = {}) {
|
|
20
|
+
const root = node_path_1.default.resolve(opts.root ?? 'src');
|
|
21
|
+
const outDir = node_path_1.default.resolve(opts.outDir ?? 'dist/output');
|
|
22
|
+
const doMinify = opts.minify ?? true;
|
|
23
|
+
await node_fs_1.default.promises.rm(outDir, { recursive: true, force: true });
|
|
24
|
+
await node_fs_1.default.promises.mkdir(outDir, { recursive: true });
|
|
25
|
+
await node_fs_1.default.promises.cp(root, outDir, { recursive: true });
|
|
26
|
+
const htmlFiles = [];
|
|
27
|
+
for (const file of walk(outDir)) {
|
|
28
|
+
if (!HTML_EXT.has(node_path_1.default.extname(file).toLowerCase()))
|
|
29
|
+
continue;
|
|
30
|
+
let html = await node_fs_1.default.promises.readFile(file, 'utf8');
|
|
31
|
+
html = (0, transform_1.injectPlatformTags)(html);
|
|
32
|
+
if (doMinify) {
|
|
33
|
+
// 用 HBS-保护版 minify:占位符 {{...}} 在 CSS / inline JS 里不会被压坏
|
|
34
|
+
html = await (0, minify_1.minifyHtmlWithHbsProtection)(html);
|
|
35
|
+
}
|
|
36
|
+
await node_fs_1.default.promises.writeFile(file, html, 'utf8');
|
|
37
|
+
htmlFiles.push(file);
|
|
38
|
+
}
|
|
39
|
+
return { root, outDir, htmlFiles };
|
|
40
|
+
}
|
|
41
|
+
function* walk(dir) {
|
|
42
|
+
for (const entry of node_fs_1.default.readdirSync(dir, { withFileTypes: true })) {
|
|
43
|
+
const full = node_path_1.default.join(dir, entry.name);
|
|
44
|
+
if (entry.isDirectory())
|
|
45
|
+
yield* walk(full);
|
|
46
|
+
else
|
|
47
|
+
yield full;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=build.js.map
|
package/lib/build.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":";;;;;AA8BA,kCAuBC;AArDD,sDAAyB;AACzB,0DAA6B;AAC7B,2CAAiD;AACjD,qCAAuD;AAkBvD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5C;;;;;;GAMG;AACI,KAAK,UAAU,WAAW,CAAC,OAAqB,EAAE;IACvD,MAAM,IAAI,GAAG,mBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,mBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;IAErC,MAAM,iBAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,iBAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,iBAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAAE,SAAS;QAC9D,IAAI,IAAI,GAAG,MAAM,iBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,GAAG,IAAA,8BAAkB,EAAC,IAAI,CAAC,CAAC;QAChC,IAAI,QAAQ,EAAE,CAAC;YACb,wDAAwD;YACxD,IAAI,GAAG,MAAM,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,iBAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAChD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACrC,CAAC;AAED,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAW;IACxB,KAAK,MAAM,KAAK,IAAI,iBAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YACtC,MAAM,IAAI,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/lib/cli.d.ts
ADDED
package/lib/cli.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/lib/cli.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const dev_1 = require("./dev");
|
|
4
|
+
const build_1 = require("./build");
|
|
5
|
+
const flags_1 = require("./flags");
|
|
6
|
+
const USAGE = `Usage: coding-html-devserver <dev|build> [options]
|
|
7
|
+
|
|
8
|
+
dev [--root src] [--port 8001] [--host 0.0.0.0]
|
|
9
|
+
build [--root src] [--out dist/output] [--no-minify]`;
|
|
10
|
+
async function main() {
|
|
11
|
+
const [command, ...rest] = process.argv.slice(2);
|
|
12
|
+
const flags = (0, flags_1.parseFlags)(rest);
|
|
13
|
+
switch (command) {
|
|
14
|
+
case 'dev': {
|
|
15
|
+
const server = await (0, dev_1.startDevServer)(flags);
|
|
16
|
+
const shutdown = () => {
|
|
17
|
+
void server.close().then(() => process.exit(0));
|
|
18
|
+
};
|
|
19
|
+
process.on('SIGINT', shutdown);
|
|
20
|
+
process.on('SIGTERM', shutdown);
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
case 'build': {
|
|
24
|
+
const { outDir, htmlFiles } = await (0, build_1.buildStatic)(flags);
|
|
25
|
+
// eslint-disable-next-line no-console
|
|
26
|
+
console.log(`[coding-html-devserver] build complete → ${outDir} (${htmlFiles.length} html)`);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
case '--help':
|
|
30
|
+
case '-h':
|
|
31
|
+
case undefined:
|
|
32
|
+
// eslint-disable-next-line no-console
|
|
33
|
+
console.log(USAGE);
|
|
34
|
+
break;
|
|
35
|
+
default:
|
|
36
|
+
// eslint-disable-next-line no-console
|
|
37
|
+
console.error(`Unknown command: ${command}\n\n${USAGE}`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
void main().catch((err) => {
|
|
42
|
+
// eslint-disable-next-line no-console
|
|
43
|
+
console.error(err);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=cli.js.map
|
package/lib/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAAA,+BAAuC;AACvC,mCAAsC;AACtC,mCAAqC;AAErC,MAAM,KAAK,GAAG;;;wDAG0C,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAA,kBAAU,EAAC,IAAI,CAAC,CAAC;IAE/B,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAc,EAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,GAAS,EAAE;gBAC1B,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC;YACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAChC,MAAM;QACR,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,mBAAW,EAAC,KAAK,CAAC,CAAC;YACvD,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,4CAA4C,MAAM,KAAK,SAAS,CAAC,MAAM,QAAQ,CAAC,CAAC;YAC7F,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,SAAS;YACZ,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM;QACR;YACE,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACxB,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/lib/dev.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ViteDevServer } from 'vite';
|
|
2
|
+
import { type HtmlViteOptions } from './vite-config';
|
|
3
|
+
/**
|
|
4
|
+
* 起 html stack 的 dev server(vite 封装在内,用户不感知)。
|
|
5
|
+
* 热更新走 vite 原生 HMR/WS。
|
|
6
|
+
*/
|
|
7
|
+
export declare function startDevServer(opts?: HtmlViteOptions): Promise<ViteDevServer>;
|
|
8
|
+
//# sourceMappingURL=dev.d.ts.map
|
package/lib/dev.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAY3E;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CAMvF"}
|
package/lib/dev.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startDevServer = startDevServer;
|
|
4
|
+
const vite_config_1 = require("./vite-config");
|
|
5
|
+
/**
|
|
6
|
+
* vite 7/8 的 Node API 是 ESM-only(package `exports` 无 CJS 入口)。本包编译为
|
|
7
|
+
* CommonJS,而 tsc 在 `module: CommonJS` 下会把字面 `import()` 降级成 `require()`
|
|
8
|
+
* —— 对 ESM-only 的 vite 会 `ERR_REQUIRE_ESM`。用 `new Function` 包一层,让 tsc
|
|
9
|
+
* 看不到这是 import(),从而保留运行时真正的动态 ESM import。
|
|
10
|
+
*/
|
|
11
|
+
const importESM = new Function('specifier', 'return import(specifier)');
|
|
12
|
+
/**
|
|
13
|
+
* 起 html stack 的 dev server(vite 封装在内,用户不感知)。
|
|
14
|
+
* 热更新走 vite 原生 HMR/WS。
|
|
15
|
+
*/
|
|
16
|
+
async function startDevServer(opts = {}) {
|
|
17
|
+
const { createServer } = await importESM('vite');
|
|
18
|
+
const server = await createServer((0, vite_config_1.createHtmlViteConfig)(opts));
|
|
19
|
+
await server.listen();
|
|
20
|
+
server.printUrls();
|
|
21
|
+
return server;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=dev.js.map
|
package/lib/dev.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":";;AAiBA,wCAMC;AAtBD,+CAA2E;AAE3E;;;;;GAKG;AACH,MAAM,SAAS,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAEvD,CAAC;AAEhB;;;GAGG;AACI,KAAK,UAAU,cAAc,CAAC,OAAwB,EAAE;IAC7D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,SAAS,CAAwB,MAAM,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAA,kCAAoB,EAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,SAAS,EAAE,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/lib/flags.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { HtmlViteOptions } from './vite-config';
|
|
2
|
+
import type { BuildOptions } from './build';
|
|
3
|
+
export interface Flags extends HtmlViteOptions, BuildOptions {
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* 解析 CLI flags。`--port` 缺值/非整数/越界直接抛错(否则 NaN 会漏过 vite-config
|
|
7
|
+
* 的 `??` fallback 流进 vite,给出难懂的报错)。
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseFlags(argv: string[]): Flags;
|
|
10
|
+
//# sourceMappingURL=flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,KAAM,SAAQ,eAAe,EAAE,YAAY;CAAG;AAE/D;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAkBhD"}
|
package/lib/flags.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseFlags = parseFlags;
|
|
4
|
+
/**
|
|
5
|
+
* 解析 CLI flags。`--port` 缺值/非整数/越界直接抛错(否则 NaN 会漏过 vite-config
|
|
6
|
+
* 的 `??` fallback 流进 vite,给出难懂的报错)。
|
|
7
|
+
*/
|
|
8
|
+
function parseFlags(argv) {
|
|
9
|
+
const flags = {};
|
|
10
|
+
for (let i = 0; i < argv.length; i++) {
|
|
11
|
+
const arg = argv[i];
|
|
12
|
+
if (arg === '--root')
|
|
13
|
+
flags.root = argv[++i];
|
|
14
|
+
else if (arg === '--host')
|
|
15
|
+
flags.host = argv[++i];
|
|
16
|
+
else if (arg === '--out')
|
|
17
|
+
flags.outDir = argv[++i];
|
|
18
|
+
else if (arg === '--no-minify')
|
|
19
|
+
flags.minify = false;
|
|
20
|
+
else if (arg === '--port') {
|
|
21
|
+
const raw = argv[++i];
|
|
22
|
+
const n = Number(raw);
|
|
23
|
+
if (!Number.isInteger(n) || n < 0 || n > 65535) {
|
|
24
|
+
throw new Error(`--port 需要 0-65535 的整数,收到: ${raw ?? '(空)'}`);
|
|
25
|
+
}
|
|
26
|
+
flags.port = n;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return flags;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=flags.js.map
|
package/lib/flags.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":";;AASA,gCAkBC;AAtBD;;;GAGG;AACH,SAAgB,UAAU,CAAC,IAAc;IACvC,MAAM,KAAK,GAAU,EAAE,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,QAAQ;YAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aACxC,IAAI,GAAG,KAAK,QAAQ;YAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aAC7C,IAAI,GAAG,KAAK,OAAO;YAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aAC9C,IAAI,GAAG,KAAK,aAAa;YAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;aAChD,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML 标签注入原语。
|
|
3
|
+
*
|
|
4
|
+
* 描述符对齐 vite 的 `HtmlTagDescriptor`:泛化、向前兼容——
|
|
5
|
+
* 今天注 `<script>`,以后要注 `<link>`/`<meta>` 不用改契约。
|
|
6
|
+
*/
|
|
7
|
+
export type InjectPosition = 'head' | 'head-prepend' | 'body' | 'body-prepend';
|
|
8
|
+
export interface HtmlTagDescriptor {
|
|
9
|
+
/** 标签名,如 'script' | 'link' | 'meta'。 */
|
|
10
|
+
tag: string;
|
|
11
|
+
/** 属性。`true` → 裸属性;`false`/`undefined` → 跳过;字符串 → key="value"。 */
|
|
12
|
+
attrs?: Record<string, string | boolean | undefined>;
|
|
13
|
+
/** 内联内容(如 inline `<script>` 的 body)。 */
|
|
14
|
+
children?: string;
|
|
15
|
+
/** 注入位置,默认 'head'。 */
|
|
16
|
+
injectTo?: InjectPosition;
|
|
17
|
+
}
|
|
18
|
+
export declare function serializeTag(tag: HtmlTagDescriptor): string;
|
|
19
|
+
/**
|
|
20
|
+
* 把一组 tag 注入 html。
|
|
21
|
+
* - 已存在的(同 src / 同 id)跳过,保证幂等
|
|
22
|
+
* - 按 injectTo 分组、组内保序,确定性输出
|
|
23
|
+
*/
|
|
24
|
+
export declare function injectTags(html: string, tags: HtmlTagDescriptor[]): string;
|
|
25
|
+
//# sourceMappingURL=html-tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-tags.d.ts","sourceRoot":"","sources":["../src/html-tags.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,cAAc,GAAG,MAAM,GAAG,cAAc,CAAC;AAE/E,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IACrD,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AA+BD,wBAAgB,YAAY,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAO3D;AAwDD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAkB1E"}
|
package/lib/html-tags.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HTML 标签注入原语。
|
|
4
|
+
*
|
|
5
|
+
* 描述符对齐 vite 的 `HtmlTagDescriptor`:泛化、向前兼容——
|
|
6
|
+
* 今天注 `<script>`,以后要注 `<link>`/`<meta>` 不用改契约。
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.serializeTag = serializeTag;
|
|
10
|
+
exports.injectTags = injectTags;
|
|
11
|
+
const VOID_TAGS = new Set(['link', 'meta', 'base', 'br', 'hr', 'img', 'input', 'source']);
|
|
12
|
+
function escapeAttr(value) {
|
|
13
|
+
return value
|
|
14
|
+
.replace(/&/g, '&')
|
|
15
|
+
.replace(/</g, '<')
|
|
16
|
+
.replace(/>/g, '>')
|
|
17
|
+
.replace(/"/g, '"');
|
|
18
|
+
}
|
|
19
|
+
function serializeAttrs(attrs) {
|
|
20
|
+
if (!attrs)
|
|
21
|
+
return '';
|
|
22
|
+
const parts = [];
|
|
23
|
+
for (const [key, value] of Object.entries(attrs)) {
|
|
24
|
+
if (value === false || value === undefined)
|
|
25
|
+
continue;
|
|
26
|
+
if (value === true)
|
|
27
|
+
parts.push(key);
|
|
28
|
+
else
|
|
29
|
+
parts.push(`${key}="${escapeAttr(value)}"`);
|
|
30
|
+
}
|
|
31
|
+
return parts.length ? ' ' + parts.join(' ') : '';
|
|
32
|
+
}
|
|
33
|
+
/** 防止内联内容里的 `</script>` 提前闭合标签。 */
|
|
34
|
+
function escapeChildren(tag, content) {
|
|
35
|
+
if (tag.toLowerCase() === 'script') {
|
|
36
|
+
return content.replace(/<\/(script)/gi, '<\\/$1');
|
|
37
|
+
}
|
|
38
|
+
return content;
|
|
39
|
+
}
|
|
40
|
+
function serializeTag(tag) {
|
|
41
|
+
const attrs = serializeAttrs(tag.attrs);
|
|
42
|
+
if (VOID_TAGS.has(tag.tag.toLowerCase())) {
|
|
43
|
+
return `<${tag.tag}${attrs}>`;
|
|
44
|
+
}
|
|
45
|
+
const children = tag.children ? escapeChildren(tag.tag, tag.children) : '';
|
|
46
|
+
return `<${tag.tag}${attrs}>${children}</${tag.tag}>`;
|
|
47
|
+
}
|
|
48
|
+
/** 该 tag 是否已存在于 html,用于幂等去重。 */
|
|
49
|
+
function isAlreadyPresent(html, tag) {
|
|
50
|
+
const src = tag.attrs?.src;
|
|
51
|
+
if (typeof src === 'string' && src) {
|
|
52
|
+
// 锚定到属性边界,避免 "/app" 误判命中 "/app.js"(与下面 id 分支一致)
|
|
53
|
+
return new RegExp(`src=["']${src.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}["']`).test(html);
|
|
54
|
+
}
|
|
55
|
+
const id = tag.attrs?.id;
|
|
56
|
+
if (typeof id === 'string' && id) {
|
|
57
|
+
return new RegExp(`id=["']${id.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}["']`).test(html);
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
/** 每个位置的锚点 fallback 链——畸形 HTML(缺 head/body)也能稳定落点。 */
|
|
62
|
+
const ANCHORS = {
|
|
63
|
+
'head-prepend': [
|
|
64
|
+
{ re: /<head[^>]*>/i, where: 'after' },
|
|
65
|
+
{ re: /<html[^>]*>/i, where: 'after' },
|
|
66
|
+
],
|
|
67
|
+
head: [
|
|
68
|
+
{ re: /<\/head>/i, where: 'before' },
|
|
69
|
+
{ re: /<body[^>]*>/i, where: 'before' },
|
|
70
|
+
{ re: /<\/html>/i, where: 'before' },
|
|
71
|
+
],
|
|
72
|
+
'body-prepend': [
|
|
73
|
+
{ re: /<body[^>]*>/i, where: 'after' },
|
|
74
|
+
{ re: /<\/head>/i, where: 'after' },
|
|
75
|
+
{ re: /<html[^>]*>/i, where: 'after' },
|
|
76
|
+
],
|
|
77
|
+
body: [
|
|
78
|
+
{ re: /<\/body>/i, where: 'before' },
|
|
79
|
+
{ re: /<\/html>/i, where: 'before' },
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
function insertAt(html, position, tags) {
|
|
83
|
+
if (!tags.length)
|
|
84
|
+
return html;
|
|
85
|
+
const block = '\n' + tags.map((t) => ' ' + serializeTag(t)).join('\n');
|
|
86
|
+
for (const anchor of ANCHORS[position]) {
|
|
87
|
+
const m = anchor.re.exec(html);
|
|
88
|
+
if (!m)
|
|
89
|
+
continue;
|
|
90
|
+
const idx = anchor.where === 'after' ? m.index + m[0].length : m.index;
|
|
91
|
+
return html.slice(0, idx) + block + html.slice(idx);
|
|
92
|
+
}
|
|
93
|
+
// 兜底:prepend 位置贴文档头,append 位置贴文档尾
|
|
94
|
+
return position.endsWith('prepend') ? block + '\n' + html : html + block;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 把一组 tag 注入 html。
|
|
98
|
+
* - 已存在的(同 src / 同 id)跳过,保证幂等
|
|
99
|
+
* - 按 injectTo 分组、组内保序,确定性输出
|
|
100
|
+
*/
|
|
101
|
+
function injectTags(html, tags) {
|
|
102
|
+
if (!tags.length)
|
|
103
|
+
return html;
|
|
104
|
+
const groups = {
|
|
105
|
+
'head-prepend': [],
|
|
106
|
+
head: [],
|
|
107
|
+
'body-prepend': [],
|
|
108
|
+
body: [],
|
|
109
|
+
};
|
|
110
|
+
for (const tag of tags) {
|
|
111
|
+
if (isAlreadyPresent(html, tag))
|
|
112
|
+
continue;
|
|
113
|
+
groups[tag.injectTo ?? 'head'].push(tag);
|
|
114
|
+
}
|
|
115
|
+
let out = html;
|
|
116
|
+
out = insertAt(out, 'head-prepend', groups['head-prepend']);
|
|
117
|
+
out = insertAt(out, 'head', groups['head']);
|
|
118
|
+
out = insertAt(out, 'body-prepend', groups['body-prepend']);
|
|
119
|
+
out = insertAt(out, 'body', groups['body']);
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=html-tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-tags.js","sourceRoot":"","sources":["../src/html-tags.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export { startDevServer } from './dev';
|
|
2
|
+
export { createHtmlViteConfig } from './vite-config';
|
|
3
|
+
export type { HtmlViteOptions } from './vite-config';
|
|
4
|
+
export { buildStatic } from './build';
|
|
5
|
+
export type { BuildOptions, BuildResult } from './build';
|
|
6
|
+
export { minifyHtmlWithHbsProtection } from './minify';
|
|
7
|
+
export { injectPlatformTags, PLATFORM_TAGS } from './transform';
|
|
8
|
+
export type { InjectPlatformOptions } from './transform';
|
|
9
|
+
export { viewContextTag, buildRenderContext } from './transform/view-context';
|
|
10
|
+
export type { ViewContextOptions, RequestRenderContext } from './transform/view-context';
|
|
11
|
+
export { slardarTags } from './transform/slardar';
|
|
12
|
+
export type { SlardarOptions } from './transform/slardar';
|
|
13
|
+
export { previewBridgeTags, MIAODA_PREVIEW_BRIDGE_URL } from './transform/preview-bridge';
|
|
14
|
+
export { injectOgMeta } from './transform/og-meta';
|
|
15
|
+
export type { OgMetaOptions } from './transform/og-meta';
|
|
16
|
+
export { injectTags, serializeTag } from './html-tags';
|
|
17
|
+
export type { HtmlTagDescriptor, InjectPosition } from './html-tags';
|
|
18
|
+
export { healthPlugin, HEALTH_ENDPOINT } from './plugins/health';
|
|
19
|
+
export { platformInjectPlugin } from './plugins/inject';
|
|
20
|
+
export type { PlatformInjectPluginOptions } from './plugins/inject';
|
|
21
|
+
export { viteClientPatchPlugin } from './plugins/vite-client-patch';
|
|
22
|
+
export { wsWatchdogPlugin } from './plugins/ws-watchdog';
|
|
23
|
+
export type { WsWatchdogPluginOptions } from './plugins/ws-watchdog';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,YAAY,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.wsWatchdogPlugin = exports.viteClientPatchPlugin = exports.platformInjectPlugin = exports.HEALTH_ENDPOINT = exports.healthPlugin = exports.serializeTag = exports.injectTags = exports.injectOgMeta = exports.MIAODA_PREVIEW_BRIDGE_URL = exports.previewBridgeTags = exports.slardarTags = exports.buildRenderContext = exports.viewContextTag = exports.PLATFORM_TAGS = exports.injectPlatformTags = exports.minifyHtmlWithHbsProtection = exports.buildStatic = exports.createHtmlViteConfig = exports.startDevServer = void 0;
|
|
4
|
+
var dev_1 = require("./dev");
|
|
5
|
+
Object.defineProperty(exports, "startDevServer", { enumerable: true, get: function () { return dev_1.startDevServer; } });
|
|
6
|
+
var vite_config_1 = require("./vite-config");
|
|
7
|
+
Object.defineProperty(exports, "createHtmlViteConfig", { enumerable: true, get: function () { return vite_config_1.createHtmlViteConfig; } });
|
|
8
|
+
var build_1 = require("./build");
|
|
9
|
+
Object.defineProperty(exports, "buildStatic", { enumerable: true, get: function () { return build_1.buildStatic; } });
|
|
10
|
+
var minify_1 = require("./minify");
|
|
11
|
+
Object.defineProperty(exports, "minifyHtmlWithHbsProtection", { enumerable: true, get: function () { return minify_1.minifyHtmlWithHbsProtection; } });
|
|
12
|
+
var transform_1 = require("./transform");
|
|
13
|
+
Object.defineProperty(exports, "injectPlatformTags", { enumerable: true, get: function () { return transform_1.injectPlatformTags; } });
|
|
14
|
+
Object.defineProperty(exports, "PLATFORM_TAGS", { enumerable: true, get: function () { return transform_1.PLATFORM_TAGS; } });
|
|
15
|
+
var view_context_1 = require("./transform/view-context");
|
|
16
|
+
Object.defineProperty(exports, "viewContextTag", { enumerable: true, get: function () { return view_context_1.viewContextTag; } });
|
|
17
|
+
Object.defineProperty(exports, "buildRenderContext", { enumerable: true, get: function () { return view_context_1.buildRenderContext; } });
|
|
18
|
+
var slardar_1 = require("./transform/slardar");
|
|
19
|
+
Object.defineProperty(exports, "slardarTags", { enumerable: true, get: function () { return slardar_1.slardarTags; } });
|
|
20
|
+
var preview_bridge_1 = require("./transform/preview-bridge");
|
|
21
|
+
Object.defineProperty(exports, "previewBridgeTags", { enumerable: true, get: function () { return preview_bridge_1.previewBridgeTags; } });
|
|
22
|
+
Object.defineProperty(exports, "MIAODA_PREVIEW_BRIDGE_URL", { enumerable: true, get: function () { return preview_bridge_1.MIAODA_PREVIEW_BRIDGE_URL; } });
|
|
23
|
+
var og_meta_1 = require("./transform/og-meta");
|
|
24
|
+
Object.defineProperty(exports, "injectOgMeta", { enumerable: true, get: function () { return og_meta_1.injectOgMeta; } });
|
|
25
|
+
var html_tags_1 = require("./html-tags");
|
|
26
|
+
Object.defineProperty(exports, "injectTags", { enumerable: true, get: function () { return html_tags_1.injectTags; } });
|
|
27
|
+
Object.defineProperty(exports, "serializeTag", { enumerable: true, get: function () { return html_tags_1.serializeTag; } });
|
|
28
|
+
var health_1 = require("./plugins/health");
|
|
29
|
+
Object.defineProperty(exports, "healthPlugin", { enumerable: true, get: function () { return health_1.healthPlugin; } });
|
|
30
|
+
Object.defineProperty(exports, "HEALTH_ENDPOINT", { enumerable: true, get: function () { return health_1.HEALTH_ENDPOINT; } });
|
|
31
|
+
var inject_1 = require("./plugins/inject");
|
|
32
|
+
Object.defineProperty(exports, "platformInjectPlugin", { enumerable: true, get: function () { return inject_1.platformInjectPlugin; } });
|
|
33
|
+
var vite_client_patch_1 = require("./plugins/vite-client-patch");
|
|
34
|
+
Object.defineProperty(exports, "viteClientPatchPlugin", { enumerable: true, get: function () { return vite_client_patch_1.viteClientPatchPlugin; } });
|
|
35
|
+
var ws_watchdog_1 = require("./plugins/ws-watchdog");
|
|
36
|
+
Object.defineProperty(exports, "wsWatchdogPlugin", { enumerable: true, get: function () { return ws_watchdog_1.wsWatchdogPlugin; } });
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,6BAAuC;AAA9B,qGAAA,cAAc,OAAA;AACvB,6CAAqD;AAA5C,mHAAA,oBAAoB,OAAA;AAG7B,iCAAsC;AAA7B,oGAAA,WAAW,OAAA;AAEpB,mCAAuD;AAA9C,qHAAA,2BAA2B,OAAA;AAEpC,yCAAgE;AAAvD,+GAAA,kBAAkB,OAAA;AAAE,0GAAA,aAAa,OAAA;AAE1C,yDAA8E;AAArE,8GAAA,cAAc,OAAA;AAAE,kHAAA,kBAAkB,OAAA;AAE3C,+CAAkD;AAAzC,sGAAA,WAAW,OAAA;AAEpB,6DAA0F;AAAjF,mHAAA,iBAAiB,OAAA;AAAE,2HAAA,yBAAyB,OAAA;AACrD,+CAAmD;AAA1C,uGAAA,YAAY,OAAA;AAErB,yCAAuD;AAA9C,uGAAA,UAAU,OAAA;AAAE,yGAAA,YAAY,OAAA;AAGjC,2CAAiE;AAAxD,sGAAA,YAAY,OAAA;AAAE,yGAAA,eAAe,OAAA;AACtC,2CAAwD;AAA/C,8GAAA,oBAAoB,OAAA;AAE7B,iEAAoE;AAA3D,0HAAA,qBAAqB,OAAA;AAC9B,qDAAyD;AAAhD,+GAAA,gBAAgB,OAAA"}
|
package/lib/minify.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 压缩 HTML,同时保护 HBS(Handlebars)占位符。
|
|
3
|
+
*
|
|
4
|
+
* `{{csrfToken}}` / `{{{appAvatar}}}` 这类占位符是部署运行时(vefaas)替换的,直接交给
|
|
5
|
+
* html-minifier-terser 会被解析破坏(minifyCSS 会把 `width:{{w}}px` 压成 `width:{}`,
|
|
6
|
+
* minifyJS 也会在 `var n={{x}}` 处抛错)。先把它们抽出来用 `__HBS_<i>__` 占位,压缩完再放回。
|
|
7
|
+
*
|
|
8
|
+
* 行为对齐 `@lark-apaas/coding-preset-vite-react` 的 minifyHtmlWithHbsProtection。
|
|
9
|
+
*/
|
|
10
|
+
export declare function minifyHtmlWithHbsProtection(html: string): Promise<string>;
|
|
11
|
+
//# sourceMappingURL=minify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minify.d.ts","sourceRoot":"","sources":["../src/minify.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB/E"}
|
package/lib/minify.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.minifyHtmlWithHbsProtection = minifyHtmlWithHbsProtection;
|
|
4
|
+
const html_minifier_terser_1 = require("html-minifier-terser");
|
|
5
|
+
/**
|
|
6
|
+
* 压缩 HTML,同时保护 HBS(Handlebars)占位符。
|
|
7
|
+
*
|
|
8
|
+
* `{{csrfToken}}` / `{{{appAvatar}}}` 这类占位符是部署运行时(vefaas)替换的,直接交给
|
|
9
|
+
* html-minifier-terser 会被解析破坏(minifyCSS 会把 `width:{{w}}px` 压成 `width:{}`,
|
|
10
|
+
* minifyJS 也会在 `var n={{x}}` 处抛错)。先把它们抽出来用 `__HBS_<i>__` 占位,压缩完再放回。
|
|
11
|
+
*
|
|
12
|
+
* 行为对齐 `@lark-apaas/coding-preset-vite-react` 的 minifyHtmlWithHbsProtection。
|
|
13
|
+
*/
|
|
14
|
+
async function minifyHtmlWithHbsProtection(html) {
|
|
15
|
+
const placeholders = [];
|
|
16
|
+
let processed = html.replace(/\{\{\{?.+?\}\}\}?/g, (match) => {
|
|
17
|
+
const i = placeholders.length;
|
|
18
|
+
placeholders.push(match);
|
|
19
|
+
return `__HBS_${i}__`;
|
|
20
|
+
});
|
|
21
|
+
processed = await (0, html_minifier_terser_1.minify)(processed, {
|
|
22
|
+
collapseWhitespace: true,
|
|
23
|
+
removeComments: true,
|
|
24
|
+
removeRedundantAttributes: true,
|
|
25
|
+
removeEmptyAttributes: true,
|
|
26
|
+
minifyCSS: true,
|
|
27
|
+
// 不压 JS:inline script 里可能引用了 HBS 占位符
|
|
28
|
+
minifyJS: false,
|
|
29
|
+
});
|
|
30
|
+
return processed.replace(/__HBS_(\d+)__/g, (_, i) => placeholders[Number(i)]);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=minify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minify.js","sourceRoot":"","sources":["../src/minify.ts"],"names":[],"mappings":";;AAWA,kEAmBC;AA9BD,+DAA8C;AAE9C;;;;;;;;GAQG;AACI,KAAK,UAAU,2BAA2B,CAAC,IAAY;IAC5D,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3D,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;QAC9B,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,SAAS,CAAC,IAAI,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,SAAS,GAAG,MAAM,IAAA,6BAAM,EAAC,SAAS,EAAE;QAClC,kBAAkB,EAAE,IAAI;QACxB,cAAc,EAAE,IAAI;QACpB,yBAAyB,EAAE,IAAI;QAC/B,qBAAqB,EAAE,IAAI;QAC3B,SAAS,EAAE,IAAI;QACf,qCAAqC;QACrC,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Plugin } from 'vite';
|
|
2
|
+
/**
|
|
3
|
+
* 妙搭沙箱外壳探活接口。协议对齐 `@lark-apaas/coding-preset-vite-react`:
|
|
4
|
+
* - connection refused / timeout → dev server 没起来 → 外壳重启沙箱
|
|
5
|
+
* - 200 + { ready: true } → 应用已就绪
|
|
6
|
+
* - 200 + { ready: false } → 还在启动
|
|
7
|
+
*/
|
|
8
|
+
export declare const HEALTH_ENDPOINT = "/dev/health";
|
|
9
|
+
export declare function healthPlugin(): Plugin;
|
|
10
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/plugins/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAElD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C,wBAAgB,YAAY,IAAI,MAAM,CAuBrC"}
|