@lark-apaas/coding-preset-vite-react 0.1.1-alpha.0 → 0.1.1-alpha.1

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.
Files changed (84) hide show
  1. package/lib/index.d.ts +52 -0
  2. package/lib/index.d.ts.map +1 -0
  3. package/lib/index.js +406 -0
  4. package/lib/index.js.map +1 -0
  5. package/lib/plugins/capabilities.d.ts +23 -0
  6. package/lib/plugins/capabilities.d.ts.map +1 -0
  7. package/lib/plugins/capabilities.js +151 -0
  8. package/lib/plugins/capabilities.js.map +1 -0
  9. package/lib/plugins/dev-logs.d.ts +44 -0
  10. package/lib/plugins/dev-logs.d.ts.map +1 -0
  11. package/lib/plugins/dev-logs.js +544 -0
  12. package/lib/plugins/dev-logs.js.map +1 -0
  13. package/lib/plugins/error-overlay.d.ts +19 -0
  14. package/lib/plugins/error-overlay.d.ts.map +1 -0
  15. package/lib/plugins/error-overlay.js +136 -0
  16. package/lib/plugins/error-overlay.js.map +1 -0
  17. package/lib/plugins/fonts-mirror.d.ts +14 -0
  18. package/lib/plugins/fonts-mirror.d.ts.map +1 -0
  19. package/lib/plugins/fonts-mirror.js +70 -0
  20. package/lib/plugins/fonts-mirror.js.map +1 -0
  21. package/lib/plugins/health.d.ts +19 -0
  22. package/lib/plugins/health.d.ts.map +1 -0
  23. package/lib/plugins/health.js +36 -0
  24. package/lib/plugins/health.js.map +1 -0
  25. package/lib/plugins/hmr-timing.d.ts +13 -0
  26. package/lib/plugins/hmr-timing.d.ts.map +1 -0
  27. package/lib/plugins/hmr-timing.js +93 -0
  28. package/lib/plugins/hmr-timing.js.map +1 -0
  29. package/lib/plugins/html-minify.d.ts +18 -0
  30. package/lib/plugins/html-minify.d.ts.map +1 -0
  31. package/lib/plugins/html-minify.js +100 -0
  32. package/lib/plugins/html-minify.js.map +1 -0
  33. package/lib/plugins/module-alias.d.ts +12 -0
  34. package/lib/plugins/module-alias.d.ts.map +1 -0
  35. package/lib/plugins/module-alias.js +78 -0
  36. package/lib/plugins/module-alias.js.map +1 -0
  37. package/lib/plugins/og-meta.d.ts +21 -0
  38. package/lib/plugins/og-meta.d.ts.map +1 -0
  39. package/lib/plugins/og-meta.js +60 -0
  40. package/lib/plugins/og-meta.js.map +1 -0
  41. package/lib/plugins/polyfill.d.ts +11 -0
  42. package/lib/plugins/polyfill.d.ts.map +1 -0
  43. package/lib/plugins/polyfill.js +137 -0
  44. package/lib/plugins/polyfill.js.map +1 -0
  45. package/lib/plugins/routes.d.ts +26 -0
  46. package/lib/plugins/routes.d.ts.map +1 -0
  47. package/lib/plugins/routes.js +265 -0
  48. package/lib/plugins/routes.js.map +1 -0
  49. package/lib/plugins/slardar.d.ts +24 -0
  50. package/lib/plugins/slardar.d.ts.map +1 -0
  51. package/lib/plugins/slardar.js +74 -0
  52. package/lib/plugins/slardar.js.map +1 -0
  53. package/lib/plugins/static-assets.d.ts +10 -0
  54. package/lib/plugins/static-assets.d.ts.map +1 -0
  55. package/lib/plugins/static-assets.js +297 -0
  56. package/lib/plugins/static-assets.js.map +1 -0
  57. package/lib/plugins/view-context.d.ts +22 -0
  58. package/lib/plugins/view-context.d.ts.map +1 -0
  59. package/lib/plugins/view-context.js +132 -0
  60. package/lib/plugins/view-context.js.map +1 -0
  61. package/lib/plugins/vite-client-patch.d.ts +4 -0
  62. package/lib/plugins/vite-client-patch.d.ts.map +1 -0
  63. package/lib/plugins/vite-client-patch.js +37 -0
  64. package/lib/plugins/vite-client-patch.js.map +1 -0
  65. package/lib/plugins/ws-watchdog.d.ts +22 -0
  66. package/lib/plugins/ws-watchdog.d.ts.map +1 -0
  67. package/lib/plugins/ws-watchdog.js +103 -0
  68. package/lib/plugins/ws-watchdog.js.map +1 -0
  69. package/lib/polyfills/index.d.ts +15 -0
  70. package/lib/polyfills/index.d.ts.map +1 -0
  71. package/lib/polyfills/index.js +36 -0
  72. package/lib/polyfills/index.js.map +1 -0
  73. package/lib/utils/normalize-base-path.d.ts +15 -0
  74. package/lib/utils/normalize-base-path.d.ts.map +1 -0
  75. package/lib/utils/normalize-base-path.js +27 -0
  76. package/lib/utils/normalize-base-path.js.map +1 -0
  77. package/lib/utils/snapdom-proxy.d.ts +12 -0
  78. package/lib/utils/snapdom-proxy.d.ts.map +1 -0
  79. package/lib/utils/snapdom-proxy.js +75 -0
  80. package/lib/utils/snapdom-proxy.js.map +1 -0
  81. package/package.json +10 -16
  82. package/dist/index.d.ts +0 -320
  83. package/dist/index.js +0 -1941
  84. package/dist/index.js.map +0 -1
@@ -0,0 +1,21 @@
1
+ import type { Plugin } from 'vite';
2
+ /**
3
+ * 向 `index.html` 注入 / 改写 OG meta、title、description meta、favicon。
4
+ *
5
+ * 所有值用 HBS 占位符(`{{appName}}` 等),由部署运行时(vefaas)替换为
6
+ * platform API 拿到的真值;jsPage 流程下浏览器侧不直接消费这些 meta。
7
+ *
8
+ * 既存 tag 会被原地改写(保留其它属性),缺失则插入到 `</head>` 之前。
9
+ */
10
+ export interface OgMetaPluginOptions {
11
+ customTags?: Array<{
12
+ property: string;
13
+ placeholder: string;
14
+ }>;
15
+ titlePlaceholder?: string;
16
+ descriptionPlaceholder?: string;
17
+ faviconPlaceholder?: string;
18
+ }
19
+ export declare function ogMetaPlugin(options?: OgMetaPluginOptions): Plugin;
20
+ export default ogMetaPlugin;
21
+ //# sourceMappingURL=og-meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"og-meta.d.ts","sourceRoot":"","sources":["../../src/plugins/og-meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAQD,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,MAAM,CAoFtE;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ogMetaPlugin = ogMetaPlugin;
4
+ const DEFAULT_TAGS = [
5
+ { property: 'og:title', placeholder: '{{appName}}' },
6
+ { property: 'og:description', placeholder: '{{appDescription}}' },
7
+ { property: 'og:image', placeholder: '{{appAvatar}}' },
8
+ ];
9
+ function ogMetaPlugin(options = {}) {
10
+ const { customTags, titlePlaceholder = '{{appName}}', descriptionPlaceholder = '{{appDescription}}', faviconPlaceholder = '{{appAvatar}}', } = options;
11
+ const tags = customTags || DEFAULT_TAGS;
12
+ return {
13
+ name: 'miaoda-og-meta',
14
+ transformIndexHtml(html) {
15
+ let result = html;
16
+ // 1. OG meta tags
17
+ for (const { property, placeholder } of tags) {
18
+ const esc = property.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
19
+ const exists = new RegExp(`<meta\\s+[^>]*property=["']?${esc}["']?[^>]*>`, 'i').test(result);
20
+ if (exists) {
21
+ result = result.replace(new RegExp(`(<meta\\s+[^>]*property=["']?${esc}["']?[^>]*content=)["'][^"']*["']([^>]*>)`, 'gi'), `$1"${placeholder}"$2`);
22
+ }
23
+ else {
24
+ result = result.replace('</head>', `\n <meta property="${property}" content="${placeholder}">\n </head>`);
25
+ }
26
+ }
27
+ // 2. <title>
28
+ if (/<title>[^<]*<\/title>/i.test(result)) {
29
+ result = result.replace(/<title>[^<]*<\/title>/gi, `<title>${titlePlaceholder}</title>`);
30
+ }
31
+ else {
32
+ result = result.replace('</head>', `\n <title>${titlePlaceholder}</title>\n </head>`);
33
+ }
34
+ // 2.1 <meta name="description">
35
+ const descRe = /<meta\b[^>]*\bname=["']description["'][^>]*>/i;
36
+ if (descRe.test(result)) {
37
+ result = result.replace(/<meta\b[^>]*\bname=["']description["'][^>]*>/gi, (tag) => {
38
+ if (/\bcontent=/.test(tag)) {
39
+ return tag.replace(/\bcontent=(["'])([\s\S]*?)\1/i, `content="${descriptionPlaceholder}"`);
40
+ }
41
+ return tag.replace(/>$/, ` content="${descriptionPlaceholder}">`);
42
+ });
43
+ }
44
+ else {
45
+ result = result.replace('</head>', `\n <meta name="description" content="${descriptionPlaceholder}">\n </head>`);
46
+ }
47
+ // 3. <link rel="icon">
48
+ const iconRe = /<link\s+[^>]*rel=["']?(?:icon|shortcut icon)["']?[^>]*>/i;
49
+ if (iconRe.test(result)) {
50
+ result = result.replace(/(<link\s+[^>]*rel=["']?(?:icon|shortcut icon)["']?[^>]*href=)["'][^"']*["']([^>]*>)/gi, `$1"${faviconPlaceholder}"$2`);
51
+ }
52
+ else {
53
+ result = result.replace('</head>', `\n <link rel="icon" href="${faviconPlaceholder}">\n </head>`);
54
+ }
55
+ return result;
56
+ },
57
+ };
58
+ }
59
+ exports.default = ogMetaPlugin;
60
+ //# sourceMappingURL=og-meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"og-meta.js","sourceRoot":"","sources":["../../src/plugins/og-meta.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Plugin } from 'vite';
2
+ /**
3
+ * 为旧版浏览器生成独立 `polyfills.js`,HTML 注入 detection 脚本按需加载。
4
+ * 现代浏览器不会请求该文件,零开销。
5
+ *
6
+ * 使用 Vite build API 二次 build 把 `src/polyfills/index.ts` 打成 IIFE bundle。
7
+ * 仅生产构建生效(`apply: 'build'`)。
8
+ */
9
+ export declare function polyfillPlugin(): Plugin;
10
+ export default polyfillPlugin;
11
+ //# sourceMappingURL=polyfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyfill.d.ts","sourceRoot":"","sources":["../../src/plugins/polyfill.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAA0B,MAAM,MAAM,CAAC;AAK3D;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAmFvC;AAqBD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.polyfillPlugin = polyfillPlugin;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ /**
40
+ * 为旧版浏览器生成独立 `polyfills.js`,HTML 注入 detection 脚本按需加载。
41
+ * 现代浏览器不会请求该文件,零开销。
42
+ *
43
+ * 使用 Vite build API 二次 build 把 `src/polyfills/index.ts` 打成 IIFE bundle。
44
+ * 仅生产构建生效(`apply: 'build'`)。
45
+ */
46
+ function polyfillPlugin() {
47
+ let config;
48
+ return {
49
+ name: 'miaoda-polyfill',
50
+ apply: 'build',
51
+ enforce: 'post',
52
+ configResolved(c) {
53
+ config = c;
54
+ },
55
+ async generateBundle(_options, bundle) {
56
+ // 编译后:__dirname = lib/plugins/,资产在 ../../src/polyfills/;
57
+ // src 直跑(vitest):__dirname = src/plugins/,资产在 ../polyfills/
58
+ const candidates = [
59
+ path.resolve(__dirname, '../../src/polyfills/index'),
60
+ path.resolve(__dirname, '../polyfills/index'),
61
+ ];
62
+ const entry = candidates.find((p) => fs.existsSync(p + '.ts') || fs.existsSync(p));
63
+ if (!entry) {
64
+ console.error('[miaoda-polyfill] polyfills entry not found in:', candidates);
65
+ return;
66
+ }
67
+ const { build } = await Promise.resolve().then(() => __importStar(require('vite')));
68
+ let polyfillCode = '';
69
+ try {
70
+ const result = await build({
71
+ configFile: false,
72
+ logLevel: 'silent',
73
+ build: {
74
+ write: false,
75
+ lib: {
76
+ entry,
77
+ formats: ['iife'],
78
+ name: 'polyfills',
79
+ fileName: 'polyfills',
80
+ },
81
+ minify: true,
82
+ rollupOptions: {
83
+ output: { inlineDynamicImports: true },
84
+ },
85
+ },
86
+ });
87
+ const output = Array.isArray(result) ? result[0] : result;
88
+ polyfillCode = 'output' in output ? output.output[0]?.code || '' : '';
89
+ this.emitFile({
90
+ type: 'asset',
91
+ fileName: 'polyfills.js',
92
+ source: polyfillCode,
93
+ });
94
+ console.log(`[miaoda-polyfill] generated polyfills.js (${Math.round(polyfillCode.length / 1024)}KB)`);
95
+ }
96
+ catch (error) {
97
+ console.error('[miaoda-polyfill] build failed:', error);
98
+ return;
99
+ }
100
+ // 改写 HTML:head 起始注入按需加载脚本
101
+ const base = config.base || '/';
102
+ const polyfillUrl = `${base}polyfills.js`.replace(/\/+/g, '/').replace(':/', '://');
103
+ const htmlFiles = Object.keys(bundle).filter((name) => name.endsWith('.html'));
104
+ for (const file of htmlFiles) {
105
+ const chunk = bundle[file];
106
+ if (chunk.type !== 'asset')
107
+ continue;
108
+ let htmlContent = typeof chunk.source === 'string'
109
+ ? chunk.source
110
+ : Buffer.from(chunk.source).toString('utf-8');
111
+ const detection = buildDetectionScript(polyfillUrl);
112
+ htmlContent = htmlContent.replace(/<head([^>]*)>/i, `<head$1>\n${detection}`);
113
+ chunk.source = htmlContent;
114
+ }
115
+ },
116
+ };
117
+ }
118
+ function buildDetectionScript(polyfillUrl) {
119
+ return `<script>
120
+ (function(){
121
+ var needsPolyfill=(function(){
122
+ try{
123
+ if(typeof crypto==="undefined"||typeof crypto.randomUUID!=="function")return true;
124
+ if(typeof Object.hasOwn!=="function")return true;
125
+ if(typeof[].at!=="function")return true;
126
+ if(typeof[].findLast!=="function")return true;
127
+ return false;
128
+ }catch(e){return true}
129
+ })();
130
+ if(needsPolyfill){
131
+ document.write('<script src="${polyfillUrl}"><\\/script>');
132
+ }
133
+ })();
134
+ </script>`;
135
+ }
136
+ exports.default = polyfillPlugin;
137
+ //# sourceMappingURL=polyfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyfill.js","sourceRoot":"","sources":["../../src/plugins/polyfill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Plugin } from 'vite';
2
+ export interface RoutesPluginOptions {
3
+ /** 应用入口路径(相对项目根)。默认按顺序探测 `src/app.tsx`、`client/src/app.tsx`。 */
4
+ appPath?: string;
5
+ /** 写入 routes.json 时给每条 path 的前缀。未传时回退到 `process.env.CLIENT_BASE_PATH`。 */
6
+ basePath?: string;
7
+ /** dev middleware 把 `/routes.json` 挂在哪个 URL 前缀下。未传时回退到 `process.env.CLIENT_BASE_PATH`。 */
8
+ serveBasePath?: string;
9
+ }
10
+ interface RouteEntry {
11
+ path: string;
12
+ }
13
+ /**
14
+ * AST 解析 React Router 的 `<Route>` 元素,返回路由列表。
15
+ *
16
+ * 算法移植自 `@lark-apaas/devtool-kits` 的 `parseRoutesFromFile`:
17
+ * - `<Route path="..." />` / `path={'...'}` / `path={`...`}` 都识别
18
+ * - 嵌套 path 自动 join,子节点用绝对路径时覆盖
19
+ * - `<Route index>` 视作当前层级根
20
+ * - `path="*"` 通配符跳过
21
+ * - 表达式形如 `path={variable}` 时跳过(无法静态求值)
22
+ */
23
+ export declare function parseRoutes(source: string, basePath: string): RouteEntry[];
24
+ export declare function routesPlugin(options?: RoutesPluginOptions): Plugin;
25
+ export default routesPlugin;
26
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/plugins/routes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAOlD,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0FAA0F;IAC1F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAwED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAuD1E;AAcD,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,MAAM,CAqEtE;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.parseRoutes = parseRoutes;
40
+ exports.routesPlugin = routesPlugin;
41
+ const fs = __importStar(require("node:fs"));
42
+ const path = __importStar(require("node:path"));
43
+ const parser_1 = require("@babel/parser");
44
+ const traverse_1 = __importDefault(require("@babel/traverse"));
45
+ const t = __importStar(require("@babel/types"));
46
+ const normalize_base_path_1 = require("../utils/normalize-base-path");
47
+ // @babel/traverse 在 ESM 下默认是 default export
48
+ const traverse = traverse_1.default.default ?? traverse_1.default;
49
+ function isRouteComponent(opening) {
50
+ return t.isJSXIdentifier(opening.name) && opening.name.name === 'Route';
51
+ }
52
+ function evaluateTemplateLiteral(tpl) {
53
+ // 仅处理纯字面量 quasis;有 expression 时把表达式段当空字符串拼
54
+ if (tpl.quasis.length === 1 && tpl.expressions.length === 0) {
55
+ return tpl.quasis[0].value.raw;
56
+ }
57
+ return tpl.quasis.map((q) => q.value.raw).join('');
58
+ }
59
+ function extractRouteFrame(opening) {
60
+ const frame = {};
61
+ for (const attr of opening.attributes) {
62
+ if (!t.isJSXAttribute(attr) || !t.isJSXIdentifier(attr.name))
63
+ continue;
64
+ const name = attr.name.name;
65
+ if (name !== 'path' && name !== 'index')
66
+ continue;
67
+ let value;
68
+ if (attr.value) {
69
+ if (t.isStringLiteral(attr.value)) {
70
+ value = attr.value.value;
71
+ }
72
+ else if (t.isJSXExpressionContainer(attr.value)) {
73
+ const expr = attr.value.expression;
74
+ if (t.isStringLiteral(expr))
75
+ value = expr.value;
76
+ else if (t.isTemplateLiteral(expr))
77
+ value = evaluateTemplateLiteral(expr);
78
+ else
79
+ value = true;
80
+ }
81
+ }
82
+ else {
83
+ // 无值属性:`<Route index>` → value=true
84
+ value = true;
85
+ }
86
+ if (name === 'path' && typeof value === 'string')
87
+ frame.path = value;
88
+ if (name === 'index' && value === true)
89
+ frame.index = true;
90
+ }
91
+ return frame;
92
+ }
93
+ function buildFullPath(stack, current) {
94
+ let fullPath = '';
95
+ for (const parent of stack) {
96
+ if (!parent.path)
97
+ continue;
98
+ let p = parent.path;
99
+ if (!p.startsWith('/'))
100
+ p = '/' + p;
101
+ if (p.endsWith('/') && p !== '/')
102
+ p = p.slice(0, -1);
103
+ fullPath += p === '/' ? '' : p;
104
+ }
105
+ if (current.index)
106
+ return fullPath || '/';
107
+ if (current.path) {
108
+ const rp = current.path;
109
+ if (rp === '*')
110
+ return null;
111
+ if (!rp.startsWith('/'))
112
+ fullPath = `${fullPath}/${rp}`;
113
+ else
114
+ fullPath = rp; // 绝对路径覆盖
115
+ if (fullPath === '')
116
+ fullPath = '/';
117
+ if (!fullPath.startsWith('/'))
118
+ fullPath = '/' + fullPath;
119
+ return fullPath;
120
+ }
121
+ return null;
122
+ }
123
+ /**
124
+ * AST 解析 React Router 的 `<Route>` 元素,返回路由列表。
125
+ *
126
+ * 算法移植自 `@lark-apaas/devtool-kits` 的 `parseRoutesFromFile`:
127
+ * - `<Route path="..." />` / `path={'...'}` / `path={`...`}` 都识别
128
+ * - 嵌套 path 自动 join,子节点用绝对路径时覆盖
129
+ * - `<Route index>` 视作当前层级根
130
+ * - `path="*"` 通配符跳过
131
+ * - 表达式形如 `path={variable}` 时跳过(无法静态求值)
132
+ */
133
+ function parseRoutes(source, basePath) {
134
+ const defaultPath = basePath ? `${basePath}/` : '/';
135
+ let ast;
136
+ try {
137
+ ast = (0, parser_1.parse)(source, {
138
+ sourceType: 'module',
139
+ plugins: [
140
+ 'jsx',
141
+ 'typescript',
142
+ 'decorators-legacy',
143
+ 'classProperties',
144
+ 'objectRestSpread',
145
+ 'functionBind',
146
+ 'exportDefaultFrom',
147
+ 'exportNamespaceFrom',
148
+ 'dynamicImport',
149
+ 'nullishCoalescingOperator',
150
+ 'optionalChaining',
151
+ ],
152
+ });
153
+ }
154
+ catch (e) {
155
+ // 解析失败:fallback 到默认单根路由(与上游一致)
156
+ return [{ path: defaultPath }];
157
+ }
158
+ const routeSet = new Set();
159
+ const stack = [];
160
+ traverse(ast, {
161
+ JSXElement: {
162
+ enter(p) {
163
+ const opening = p.node.openingElement;
164
+ if (isRouteComponent(opening)) {
165
+ stack.push(extractRouteFrame(opening));
166
+ }
167
+ },
168
+ exit(p) {
169
+ const opening = p.node.openingElement;
170
+ if (!isRouteComponent(opening))
171
+ return;
172
+ const current = stack.pop();
173
+ if (!current)
174
+ return;
175
+ if (current.path === '*')
176
+ return;
177
+ if (current.path || current.index) {
178
+ const full = buildFullPath(stack, current);
179
+ if (full)
180
+ routeSet.add(full);
181
+ }
182
+ },
183
+ },
184
+ });
185
+ const routes = Array.from(routeSet).map((p) => ({
186
+ path: basePath ? `${basePath}${p}` : p,
187
+ }));
188
+ return routes.length > 0 ? routes : [{ path: defaultPath }];
189
+ }
190
+ function resolveAppPath(rootDir, hint) {
191
+ if (hint) {
192
+ const abs = path.resolve(rootDir, hint);
193
+ return fs.existsSync(abs) ? abs : null;
194
+ }
195
+ for (const rel of ['src/app.tsx', 'client/src/app.tsx']) {
196
+ const abs = path.resolve(rootDir, rel);
197
+ if (fs.existsSync(abs))
198
+ return abs;
199
+ }
200
+ return null;
201
+ }
202
+ function routesPlugin(options = {}) {
203
+ const envBase = process.env.CLIENT_BASE_PATH || '';
204
+ const buildBase = (0, normalize_base_path_1.normalizeBasePath)(options.basePath ?? envBase);
205
+ const serveBase = (0, normalize_base_path_1.normalizeBasePath)(options.serveBasePath ?? envBase);
206
+ let appAbs = null;
207
+ let cached = null;
208
+ function generate(forBase) {
209
+ if (cached && cached.base === forBase)
210
+ return cached.routes;
211
+ if (!appAbs || !fs.existsSync(appAbs)) {
212
+ const fallback = [{ path: forBase ? `${forBase}/` : '/' }];
213
+ cached = { routes: fallback, base: forBase };
214
+ return fallback;
215
+ }
216
+ const src = fs.readFileSync(appAbs, 'utf-8');
217
+ const routes = parseRoutes(src, forBase);
218
+ cached = { routes, base: forBase };
219
+ return routes;
220
+ }
221
+ return {
222
+ name: 'miaoda-routes',
223
+ configResolved(config) {
224
+ appAbs = resolveAppPath(config.root, options.appPath);
225
+ },
226
+ configureServer(server) {
227
+ // dev:base 强制为空(沙箱预览代理把 base path 剥掉了),middleware URL 按 serveBase 挂载
228
+ generate('');
229
+ if (appAbs) {
230
+ server.watcher.add(appAbs);
231
+ server.watcher.on('change', (file) => {
232
+ if (file === appAbs) {
233
+ cached = null;
234
+ generate('');
235
+ }
236
+ });
237
+ }
238
+ const urlPath = serveBase ? `${serveBase}/routes.json` : '/routes.json';
239
+ server.middlewares.use((req, res, next) => {
240
+ const pathname = req.url?.split('?')[0];
241
+ if (pathname === urlPath) {
242
+ const routes = generate('');
243
+ res.setHeader('Content-Type', 'application/json');
244
+ res.end(JSON.stringify(routes, null, 2));
245
+ return;
246
+ }
247
+ next();
248
+ });
249
+ },
250
+ buildStart() {
251
+ cached = null;
252
+ generate(buildBase);
253
+ },
254
+ generateBundle() {
255
+ const routes = generate(buildBase);
256
+ this.emitFile({
257
+ type: 'asset',
258
+ fileName: 'routes.json',
259
+ source: JSON.stringify(routes, null, 2),
260
+ });
261
+ },
262
+ };
263
+ }
264
+ exports.default = routesPlugin;
265
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/plugins/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Plugin } from 'vite';
2
+ /**
3
+ * 注入 Slardar SDK + Performance + Tea 监控埋点。
4
+ *
5
+ * 三段都通过 `<script>` 注入到 head-prepend:
6
+ * 1. Slardar SDK loader(onload 后读 `window.tenantId/appId/userId/ENVIRONMENT` 初始化)
7
+ * 2. Performance SDK
8
+ * 3. Tea SDK loader
9
+ *
10
+ * 依赖 viewContextPlugin 提前注入 `window.tenantId/appId/userId/ENVIRONMENT`。
11
+ *
12
+ * head-prepend bucket:Vite 同 bucket 是"后执行者插更前"。
13
+ * 数组里 slardar 必须排在 viewContext **之前** —— 这样在 HTML 里 viewContext 出现在
14
+ * slardar 之上,slardar onload 时才能读到 window.tenantId 等真值。
15
+ */
16
+ export interface SlardarPluginOptions {
17
+ /** Business ID。默认 `apaas_miaoda` */
18
+ bid?: string;
19
+ /** SDK 暴露在 window 上的全局名。默认 `KSlardarWeb` */
20
+ globalName?: string;
21
+ }
22
+ export declare function slardarPlugin(options?: SlardarPluginOptions): Plugin;
23
+ export default slardarPlugin;
24
+ //# sourceMappingURL=slardar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slardar.d.ts","sourceRoot":"","sources":["../../src/plugins/slardar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,MAAM,CAAC;AAEtD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,oBAAoB;IACnC,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAmDD,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,MAAM,CAuBxE;AAED,eAAe,aAAa,CAAC"}