transone-cli 0.6.1 → 0.7.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/README.md +6 -0
- package/README.zh-CN.md +4 -0
- package/dist/cli.js +1 -1
- package/dist/create.d.ts +1 -1
- package/dist/document-styles.d.ts +7 -0
- package/dist/{index-z1sm57t6.js → index-x5rrsfyb.js} +1189 -121
- package/dist/index-x5rrsfyb.js.map +30 -0
- package/dist/index.js +1 -1
- package/dist/web-bundle.d.ts +15 -0
- package/dist/web-styles.d.ts +9 -0
- package/package.json +1 -1
- package/dist/index-z1sm57t6.js.map +0 -27
package/dist/index.js
CHANGED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Persist only the final bundle, retaining runtime cascade for shared selectors. */
|
|
2
|
+
export declare function buildWebBundle(options: Parameters<typeof Bun.build>[0] & {
|
|
3
|
+
outdir: string;
|
|
4
|
+
}): Promise<{
|
|
5
|
+
result: {
|
|
6
|
+
success: boolean;
|
|
7
|
+
logs: (BuildMessage | ResolveMessage)[];
|
|
8
|
+
outputs: {
|
|
9
|
+
path: string;
|
|
10
|
+
kind: string;
|
|
11
|
+
type: string;
|
|
12
|
+
}[];
|
|
13
|
+
};
|
|
14
|
+
styles: Map<string, string>;
|
|
15
|
+
}>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BunPlugin } from 'bun';
|
|
2
|
+
export interface WebStylesPlugin extends BunPlugin {
|
|
3
|
+
/** Source file -> fixed component CSS, emitted after document styles by Web. */
|
|
4
|
+
readonly styles: Map<string, string>;
|
|
5
|
+
/** Files requiring a second build without extraction to preserve selector precedence. */
|
|
6
|
+
readonly runtimeFiles: Set<string>;
|
|
7
|
+
}
|
|
8
|
+
/** Extract complete, pure initStyles methods. Runtime StyleManager stays intact. */
|
|
9
|
+
export declare function createWebStylesPlugin(disabledFiles?: ReadonlySet<string>): WebStylesPlugin;
|
package/package.json
CHANGED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/target/types.ts", "../src/config.ts", "../src/target/web-target.ts", "../src/build-output.ts", "../src/safe-path.ts", "../src/mp/dialect.ts", "../src/target/mp-target.ts", "../src/app/build-app.ts", "../src/app/errors.ts", "../src/app/analyze.ts", "../src/target/app-target.ts", "../src/app/dialects.ts", "../src/target/registry.ts", "../src/build.ts", "../src/create.ts", "../src/server.ts", "../src/proxy.ts", "../src/watch.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import type { ResolvedConfig } from '../types';\nimport type { BuildOptions, BuildResult } from '../types';\n\n/**\n * 目标端类型。\n *\n * 编译器按 Target 分发代码生成(见 positioning 7.3):\n * - web 直接渲染(HTML + 浏览器运行时,与 TSone 一致)\n * - mp-weixin WXML / WXSS / JS 静态转换\n * - mp-alipay AXML / ACSS 静态转换\n * - mp-bytedance TTML / TTSS 静态转换\n * - mp-xiaohongshu XHSML / CSS 静态转换\n * - app-* 原生应用源码生成(app-ios / app-android / app-harmony)\n */\nexport const TARGET_TYPES = [\n 'web',\n 'mp-weixin',\n 'mp-alipay',\n 'mp-bytedance',\n 'mp-xiaohongshu',\n 'app-ios',\n 'app-android',\n 'app-harmony',\n] as const;\n\nexport type TargetType = (typeof TARGET_TYPES)[number];\n\nexport function isTargetType(value: unknown): value is TargetType {\n return (\n typeof value === 'string' &&\n (TARGET_TYPES as readonly string[]).includes(value)\n );\n}\n\n/** 小程序目标端类型(mp-*),config.mp 按平台分组时使用。 */\nexport const MP_TARGET_TYPES = [\n 'mp-weixin',\n 'mp-alipay',\n 'mp-bytedance',\n 'mp-xiaohongshu',\n] as const satisfies readonly TargetType[];\n\nexport type MpTargetType = (typeof MP_TARGET_TYPES)[number];\n\n/** 原生 App 目标端类型(app-*)。 */\nexport const APP_TARGET_TYPES = [\n 'app-ios',\n 'app-android',\n 'app-harmony',\n] as const satisfies readonly TargetType[];\n\nexport type AppTargetType = (typeof APP_TARGET_TYPES)[number];\n\nexport function isAppTargetType(value: unknown): value is AppTargetType {\n return (\n typeof value === 'string' &&\n (APP_TARGET_TYPES as readonly string[]).includes(value)\n );\n}\n\nexport function isMpTargetType(value: unknown): value is MpTargetType {\n return (\n typeof value === 'string' &&\n (MP_TARGET_TYPES as readonly string[]).includes(value)\n );\n}\n\n/**\n * 编译目标抽象:每个端一个实现,编译器按 Target 分发构建。\n *\n * 新增目标端时实现本接口并注册到 TargetRegistry,无需改动构建入口。\n */\nexport interface BuildTarget {\n readonly type: TargetType;\n /** 目标端产物形态描述(用于 CLI 输出与文档)。 */\n readonly label: string;\n build(config: ResolvedConfig, options: BuildOptions): Promise<BuildResult>;\n}\n",
|
|
6
|
-
"import type { TargetType } from './target/types';\nimport { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport {\n APP_TARGET_TYPES,\n isAppTargetType,\n isMpTargetType,\n isTargetType,\n MP_TARGET_TYPES,\n} from './target/types';\nimport type {\n BuildConfig,\n AppConfig,\n AppConfigMap,\n LibraryConfig,\n MiniProgramConfig,\n ProxyOptions,\n ResolveConfigOptions,\n ResolvedConfig,\n ResolvedAppConfig,\n ResolvedLibraryConfig,\n ResolvedMiniProgramConfig,\n ServerConfig,\n UserConfig,\n UserAppConfig,\n UserMiniProgramConfig,\n} from './types';\n\ninterface MergedConfig {\n entry: string;\n pages?: Record<string, string>;\n server: {\n host: string;\n port: number;\n proxy: Record<string, string | ProxyOptions>;\n };\n build: {\n outDir: string;\n basePath: string;\n directoryPages: boolean;\n };\n library?: LibraryConfig;\n mp?: UserMiniProgramConfig;\n app?: UserAppConfig;\n}\n\ntype ConfigFileLoadResult =\n { exists: false } | { exists: true; config: unknown };\n\nconst DEFAULT_CONFIG: MergedConfig = {\n entry: 'src/main.ts',\n server: {\n host: '127.0.0.1',\n port: 52211,\n proxy: {},\n },\n build: {\n outDir: 'dist/build/h5',\n basePath: '',\n directoryPages: false,\n },\n};\n\nexport function defineConfig(config: UserConfig): UserConfig {\n return config;\n}\n\nexport async function resolveConfig(\n options: ResolveConfigOptions = {}\n): Promise<ResolvedConfig> {\n const root = resolve(options.root ?? process.cwd());\n const configFile = resolve(root, 'transone.config.ts');\n const hasInlineConfig = options.config !== undefined;\n const loadedConfig: ConfigFileLoadResult = hasInlineConfig\n ? { exists: false }\n : await loadConfigFile(configFile);\n let fileConfig: UserConfig = {};\n if (loadedConfig.exists) {\n const config = loadedConfig.config;\n validateUserConfig(config);\n fileConfig = config;\n }\n if (hasInlineConfig) {\n validateUserConfig(options.config);\n }\n const inlineOverrides = toInlineOverrides(options);\n validateUserConfig(inlineOverrides);\n const config = mergeConfig(fileConfig, options.config ?? {}, inlineOverrides);\n\n const entry = resolve(root, config.entry);\n if (!existsSync(entry) && !config.library) {\n throw new Error(`Entry file does not exist: ${entry}`);\n }\n const pages = await resolvePages(root, entry, config.pages);\n const target = resolveTarget(options.target);\n // 公共小程序配置与当前平台配置合并,平台字段优先。\n const mpConfig = pickMpConfig(config.mp, target);\n const mpPages = mpConfig?.pages\n ? await resolvePages(root, entry, mpConfig.pages, {\n includeEntry: false,\n allowRoot: true,\n })\n : pages;\n // 任一 --target mp-* 都启用小程序构建;config.mp 缺失则走平台默认值。\n const mpEnabled = config.mp !== undefined || isMpTargetType(target);\n const appConfig = pickAppConfig(config.app, target);\n\n return {\n root,\n ...(loadedConfig.exists ? { configFile } : {}),\n entry,\n pages,\n target,\n server: {\n host: config.server.host,\n port: config.server.port,\n proxy: config.server.proxy,\n },\n build: {\n outDir: resolve(root, config.build.outDir),\n basePath: normalizeBasePath(config.build.basePath),\n directoryPages: config.build.directoryPages,\n },\n ...(config.library\n ? { library: resolveLibrary(root, config.library) }\n : {}),\n ...(mpEnabled\n ? {\n mp: resolveMiniProgram(\n root,\n options.mpOutDir,\n mpConfig ?? {},\n mpPages,\n target\n ),\n }\n : {}),\n ...(isAppTargetType(target)\n ? { app: await resolveApp(root, options.outDir, appConfig ?? {}, target, pages) }\n : {}),\n };\n}\n\nfunction isAppConfigMap(value: unknown): value is AppConfigMap {\n return (\n isRecord(value) &&\n APP_TARGET_TYPES.some((platform) => platform in value)\n );\n}\n\nfunction pickAppConfig(\n app: UserAppConfig | undefined,\n target: TargetType\n): AppConfig | undefined {\n if (app === undefined) {\n return undefined;\n }\n if (isAppConfigMap(app)) {\n return { ...(app.host !== undefined ? { host: app.host } : {}),\n ...(isAppTargetType(target) ? app[target] : {}) };\n }\n return app;\n}\n\nasync function resolveApp(\n root: string,\n outDirOverride: string | undefined,\n app: AppConfig,\n target: TargetType,\n fallbackPages: Record<string, string>\n): Promise<ResolvedAppConfig> {\n return {\n ...(app.host !== undefined ? { host: app.host } : {}),\n appName: app.appName ?? 'TransOne',\n bundleId: app.bundleId ?? 'com.transone.app',\n outDir: resolve(root, outDirOverride ?? app.outDir ?? `dist/build/${target}`),\n minPlatformVersion: app.minPlatformVersion ?? '16.0',\n publicDir: resolve(root, app.publicDir ?? 'public'),\n pages: app.pages\n ? await resolvePages(root, resolve(root, app.pages['/'] ?? 'src/main.ts'), app.pages, {\n includeEntry: false,\n allowRoot: true,\n })\n : fallbackPages,\n };\n}\n\nconst MP_DEFAULT_OUT_DIRS: Record<string, string> = {\n 'mp-weixin': 'dist/build/mp-weixin',\n 'mp-alipay': 'dist/build/mp-alipay',\n 'mp-bytedance': 'dist/build/mp-bytedance',\n 'mp-xiaohongshu': 'dist/build/mp-xiaohongshu',\n};\n\n/** 公共配置先应用,再递归合并当前平台配置;数组和其他值整体替换。 */\nfunction pickMpConfig(\n mp: UserMiniProgramConfig | undefined,\n target: TargetType\n): MiniProgramConfig | undefined {\n if (mp === undefined) {\n return undefined;\n }\n const common = Object.fromEntries(\n Object.entries(mp).filter(\n ([key]) => !MP_TARGET_TYPES.includes(key as typeof MP_TARGET_TYPES[number])\n )\n );\n const platform = isMpTargetType(target) ? mp[target] : undefined;\n return mergeMpRecords(common, { ...platform });\n}\n\nfunction mergeMpRecords(\n common: Record<string, unknown>,\n overrides: Record<string, unknown>\n): Record<string, unknown> {\n const merged = { ...common };\n for (const [key, value] of Object.entries(overrides)) {\n if (value === undefined) continue;\n const previous = Object.prototype.hasOwnProperty.call(common, key)\n ? common[key]\n : undefined;\n const next = isRecord(previous) && isRecord(value)\n ? mergeMpRecords(previous, value)\n : value;\n Object.defineProperty(merged, key, {\n value: next,\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n return merged;\n}\n\nfunction resolveMiniProgram(\n root: string,\n outDirOverride: string | undefined,\n mp: MiniProgramConfig,\n pages: Record<string, string>,\n target: TargetType\n): ResolvedMiniProgramConfig {\n return {\n ...(mp.host !== undefined ? { host: mp.host } : {}),\n appId: mp.appId ?? 'touristappid',\n outDir: resolve(\n root,\n outDirOverride ?? mp.outDir ?? (MP_DEFAULT_OUT_DIRS[target] ?? 'dist/build/mp-weixin')\n ),\n navigationBarTitleText: mp.navigationBarTitleText ?? 'TransOne',\n pages,\n ...(mp.window !== undefined ? { window: mp.window } : {}),\n ...(mp.tabBar !== undefined ? { tabBar: mp.tabBar } : {}),\n ...(mp.appExtra !== undefined ? { appExtra: mp.appExtra } : {}),\n ...(mp.pageExtra !== undefined ? { pageExtra: mp.pageExtra } : {}),\n lengthUnit: mp.lengthUnit ?? 'px',\n publicDir: resolve(root, mp.publicDir ?? 'public'),\n ...(mp.globalData !== undefined ? { globalData: mp.globalData } : {}),\n };\n}\n\nfunction resolveLibrary(\n root: string,\n library: LibraryConfig\n): ResolvedLibraryConfig {\n return {\n entry: resolve(root, library.entry ?? 'src/index.ts'),\n outDir: resolve(root, library.outDir ?? 'dist'),\n external: library.external ?? [],\n tsconfigs: (library.tsconfigs ?? ['tsconfig.build.json']).map((path) =>\n resolve(root, path)\n ),\n dts: library.dts ?? true,\n splitting: library.splitting ?? true,\n sourcemap: library.sourcemap ?? true,\n minify: library.minify,\n };\n}\n\nfunction normalizeBasePath(base: string | undefined): string {\n const trimmed = (base ?? '').trim();\n if (!trimmed || trimmed === '/') {\n return '';\n }\n\n const withLeading = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n return withLeading.endsWith('/') ? withLeading.slice(0, -1) : withLeading;\n}\n\nfunction resolveTarget(target: unknown): ResolvedConfig['target'] {\n if (target === undefined) {\n return 'web';\n }\n if (isTargetType(target)) {\n return target;\n }\n throw new Error(\n `Unknown build target \"${String(target)}\". ` +\n 'Available targets: web, mp-weixin, mp-alipay, mp-bytedance, mp-xiaohongshu, ' +\n 'app-ios, app-android, app-harmony.'\n );\n}\n\nasync function resolvePages(\n root: string,\n entry: string,\n pages: Record<string, string> | undefined,\n options: { includeEntry?: boolean; allowRoot?: boolean } = {}\n): Promise<Record<string, string>> {\n const resolved: Record<string, string> =\n options.includeEntry === false ? {} : { '/': entry };\n for (const [route, pageEntry] of Object.entries(pages ?? {})) {\n const normalized = normalizePageRoute(route, options.allowRoot);\n const absolute = resolve(root, pageEntry);\n if (!existsSync(absolute)) {\n throw new Error(\n `Page entry file does not exist for \"${normalized}\": ${absolute}`\n );\n }\n resolved[normalized] = absolute;\n }\n return resolved;\n}\n\nfunction normalizePageRoute(\n route: string,\n allowRoot = false\n): string {\n if (route === '/') {\n if (allowRoot) {\n return '/';\n }\n throw new Error(\n 'Config pages must not redefine the root page \"/\"; use config.entry instead'\n );\n }\n const normalized = route.replace(/\\/+$/, '');\n if (normalized === '') {\n throw new Error(`Page route must not be empty: ${route}`);\n }\n return normalized;\n}\n\nlet configLoadSequence = 0;\n\nasync function loadConfigFile(\n configFile: string\n): Promise<ConfigFileLoadResult> {\n if (!existsSync(configFile)) {\n return { exists: false };\n }\n\n configLoadSequence += 1;\n const module = await import(\n `${configFile}?transone_config=${configLoadSequence}`\n );\n return { exists: true, config: module.default };\n}\n\nfunction toInlineOverrides(options: ResolveConfigOptions): UserConfig {\n const server: ServerConfig = {};\n const build: BuildConfig = {};\n\n if (options.host !== undefined) {\n server.host = options.host;\n }\n if (options.port !== undefined) {\n server.port = options.port;\n }\n if (options.outDir !== undefined) {\n build.outDir = options.outDir;\n }\n if (options.base !== undefined) {\n build.basePath = options.base;\n }\n\n return {\n ...(Object.keys(server).length > 0 ? { server } : {}),\n ...(Object.keys(build).length > 0 ? { build } : {}),\n };\n}\n\nfunction mergeConfig(...configs: UserConfig[]): MergedConfig {\n return configs.reduce<MergedConfig>((merged, config) => {\n const server = config.server;\n const build = config.build;\n\n return {\n entry: config.entry ?? merged.entry,\n pages: config.pages ?? merged.pages,\n server: {\n host: server?.host ?? merged.server.host,\n port: server?.port ?? merged.server.port,\n proxy: {\n ...merged.server.proxy,\n ...server?.proxy,\n },\n },\n build: {\n outDir: build?.outDir ?? merged.build.outDir,\n basePath: build?.basePath ?? merged.build.basePath,\n directoryPages: build?.directoryPages ?? merged.build.directoryPages,\n },\n library: config.library ?? merged.library,\n mp: config.mp ?? merged.mp,\n app: config.app ?? merged.app,\n };\n }, DEFAULT_CONFIG);\n}\n\nfunction validateUserConfig(config: unknown): asserts config is UserConfig {\n assertRecord(config, 'Config');\n\n if (config.entry !== undefined && typeof config.entry !== 'string') {\n throw new Error('Config entry must be a string');\n }\n if (config.pages !== undefined) {\n validatePagesConfig(config.pages);\n }\n if (config.server !== undefined) {\n validateServerConfig(config.server);\n }\n if (config.build !== undefined) {\n validateBuildConfig(config.build);\n }\n if (config.library !== undefined) {\n validateLibraryConfig(config.library);\n }\n if (config.mp !== undefined) {\n validateMpConfig(config.mp);\n }\n if (config.app !== undefined) {\n validateAppConfig(config.app);\n }\n}\n\nfunction validateAppConfig(app: unknown): asserts app is UserAppConfig {\n assertRecord(app, 'Config app');\n validateApiHost(app.host, 'Config app.host');\n if (isAppConfigMap(app)) {\n const flatKeys = ['appName', 'bundleId', 'outDir', 'minPlatformVersion', 'publicDir', 'pages'];\n if (flatKeys.some((key) => key in app)) {\n throw new Error('Config app cannot mix flat fields with platform keys');\n }\n for (const platform of APP_TARGET_TYPES) {\n if (app[platform] !== undefined) {\n validateSingleAppConfig(app[platform], `Config app.${platform}`);\n }\n }\n return;\n }\n validateSingleAppConfig(app, 'Config app');\n}\n\nfunction validateSingleAppConfig(\n app: unknown,\n label: string\n): asserts app is AppConfig {\n assertRecord(app, label);\n validateApiHost(app.host, `${label}.host`);\n for (const key of ['appName', 'bundleId', 'outDir', 'minPlatformVersion', 'publicDir'] as const) {\n if (app[key] !== undefined && typeof app[key] !== 'string') {\n throw new Error(`${label}.${key} must be a string`);\n }\n }\n if (app.pages !== undefined) {\n validatePagesConfig(app.pages, `${label}.pages`);\n }\n}\n\n/** 公共字段和各平台字段分别校验,避免平台键使公共字段绕过校验。 */\nfunction validateMpConfig(\n mp: unknown\n): asserts mp is UserMiniProgramConfig {\n assertRecord(mp, 'Config mp');\n validateMiniProgramConfig(mp, 'Config mp');\n for (const platform of MP_TARGET_TYPES) {\n if (mp[platform] !== undefined) {\n validateMiniProgramConfig(mp[platform], `Config mp.${platform}`);\n }\n }\n}\n\nfunction validateMiniProgramConfig(\n mp: unknown,\n label: string\n): asserts mp is MiniProgramConfig {\n assertRecord(mp, label);\n validateApiHost(mp.host, `${label}.host`);\n\n for (const key of ['appId', 'outDir', 'navigationBarTitleText', 'publicDir'] as const) {\n if (mp[key] !== undefined && typeof mp[key] !== 'string') {\n throw new Error(`${label}.${key} must be a string`);\n }\n }\n if (mp.pages !== undefined) {\n validatePagesConfig(mp.pages, `${label}.pages`);\n }\n for (const key of ['window', 'tabBar', 'appExtra', 'globalData'] as const) {\n if (mp[key] !== undefined) {\n assertRecord(mp[key], `${label}.${key}`);\n }\n }\n if (mp.pageExtra !== undefined) {\n assertRecord(mp.pageExtra, `${label}.pageExtra`);\n for (const [route, extra] of Object.entries(mp.pageExtra)) {\n assertRecord(extra, `${label}.pageExtra.${route}`);\n }\n }\n if (\n mp.lengthUnit !== undefined &&\n mp.lengthUnit !== 'px' &&\n mp.lengthUnit !== 'rpx'\n ) {\n throw new Error(`${label}.lengthUnit must be 'px' or 'rpx'`);\n }\n}\n\nfunction validateLibraryConfig(\n library: unknown\n): asserts library is LibraryConfig {\n assertRecord(library, 'Config library');\n if (library.entry !== undefined && typeof library.entry !== 'string') {\n throw new Error('Config library.entry must be a string');\n }\n if (library.outDir !== undefined && typeof library.outDir !== 'string') {\n throw new Error('Config library.outDir must be a string');\n }\n if (library.external !== undefined) {\n assertStringArray(library.external, 'Config library.external');\n }\n if (library.tsconfigs !== undefined) {\n assertStringArray(library.tsconfigs, 'Config library.tsconfigs');\n }\n for (const key of ['dts', 'splitting', 'sourcemap', 'minify'] as const) {\n if (library[key] !== undefined && typeof library[key] !== 'boolean') {\n throw new Error(`Config library.${key} must be a boolean`);\n }\n }\n}\n\nfunction assertStringArray(value: unknown, name: string): void {\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'string')) {\n throw new Error(`${name} must be an array of strings`);\n }\n}\n\nfunction validatePagesConfig(\n pages: unknown,\n label = 'Config pages'\n): asserts pages is Record<string, string> {\n assertRecord(pages, label);\n\n for (const [route, entry] of Object.entries(pages)) {\n if (!route.startsWith('/')) {\n throw new Error(`Page route must start with \"/\": ${route}`);\n }\n if (typeof entry !== 'string') {\n throw new Error(`Page entry for \"${route}\" must be a string`);\n }\n }\n}\n\nfunction validateServerConfig(server: unknown): asserts server is ServerConfig {\n assertRecord(server, 'Config server');\n\n if (server.host !== undefined && typeof server.host !== 'string') {\n throw new Error('Config server.host must be a string');\n }\n const port = server.port;\n if (\n port !== undefined &&\n (typeof port !== 'number' ||\n !Number.isInteger(port) ||\n port < 0 ||\n port > 65535)\n ) {\n throw new Error(\n 'Config server.port must be an integer between 0 and 65535'\n );\n }\n if (server.proxy === undefined) {\n return;\n }\n assertRecord(server.proxy, 'Config server.proxy');\n\n for (const [prefix, value] of Object.entries(server.proxy)) {\n if (!prefix.startsWith('/')) {\n throw new Error(`Proxy prefix must start with \"/\": ${prefix}`);\n }\n\n const target = getProxyTarget(value);\n validateProxyTarget(target);\n }\n}\n\nfunction validateBuildConfig(build: unknown): asserts build is BuildConfig {\n assertRecord(build, 'Config build');\n if (build.outDir !== undefined && typeof build.outDir !== 'string') {\n throw new Error('Config build.outDir must be a string');\n }\n if (build.basePath !== undefined && typeof build.basePath !== 'string') {\n throw new Error('Config build.basePath must be a string');\n }\n if (\n build.directoryPages !== undefined &&\n typeof build.directoryPages !== 'boolean'\n ) {\n throw new Error('Config build.directoryPages must be a boolean');\n }\n}\n\nfunction getProxyTarget(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n assertRecord(value, 'Proxy options');\n if (typeof value.target !== 'string') {\n throw new Error('Proxy target must be a string');\n }\n if (\n value.changeOrigin !== undefined &&\n typeof value.changeOrigin !== 'boolean'\n ) {\n throw new Error('Proxy changeOrigin must be a boolean');\n }\n if (value.rewrite !== undefined && typeof value.rewrite !== 'function') {\n throw new Error('Proxy rewrite must be a function');\n }\n\n return value.target;\n}\n\nfunction validateProxyTarget(target: string): void {\n try {\n const url = new URL(target);\n if (url.protocol === 'http:' || url.protocol === 'https:') {\n return;\n }\n } catch {\n // Keep the public error stable for malformed URLs and unsupported protocols.\n }\n\n throw new Error(`Proxy target must use http or https: ${target}`);\n}\n\nfunction assertRecord(\n value: unknown,\n name: string\n): asserts value is Record<string, unknown> {\n if (!isRecord(value)) {\n throw new Error(`${name} must be an object`);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n (Object.getPrototypeOf(value) === Object.prototype ||\n Object.getPrototypeOf(value) === null)\n );\n}\n\nfunction validateApiHost(host: unknown, label: string): void {\n if (host === undefined) return;\n if (typeof host !== 'string') throw new Error(`${label} must be a string`);\n try {\n const url = new URL(host);\n if (url.protocol === 'http:' || url.protocol === 'https:') return;\n } catch {}\n throw new Error(`${label} must use http or https`);\n}\n",
|
|
7
|
-
"import { mkdir, rm, writeFile } from 'node:fs/promises';\nimport { dirname, isAbsolute, relative, resolve, sep } from 'node:path';\nimport { isEntryJavaScriptOutput, isStylesheetOutput } from '../build-output';\nimport { assertSafeSubdirectoryDoesNotContain } from '../safe-path';\nimport type { BuildOptions, BuildResult, ResolvedConfig } from '../types';\nimport type { BuildTarget } from './types';\n\nconst INVALID_OUTPUT_DIRECTORY_MESSAGE =\n 'Build output must be a subdirectory of the project root';\n\ninterface BuiltPage {\n entry: string;\n assets: string[];\n javascriptAssets: string[];\n stylesheetAssets: string[];\n}\n\n/**\n * Web 目标端:复用 TSone 渲染策略,直接产出可运行的 H5 站点。\n *\n * 每个页面入口经 Bun 构建为浏览器 ESM,再以入口组件渲染出对应 HTML\n * 壳(SSR 形式)并注入构建产物,产物可直接静态部署。\n */\nexport class WebTarget implements BuildTarget {\n public readonly type = 'web' as const;\n public readonly label = '静态站点 / SPA(复用 TSone 策略化渲染)';\n\n public async build(\n config: ResolvedConfig,\n _options: BuildOptions\n ): Promise<BuildResult> {\n const entries = [...new Set(Object.values(config.pages))];\n\n for (const entry of entries) {\n await assertSafeSubdirectoryDoesNotContain(\n config.root,\n config.build.outDir,\n entry,\n INVALID_OUTPUT_DIRECTORY_MESSAGE\n );\n }\n // 动态加载:project.ts 依赖 'transone/dom'(框架 dist 的 DOM\n // 渲染模块),仅在站点渲染路径需要。\n const { renderProjectHtml } = await import('../project');\n for (const [route, entry] of Object.entries(config.pages)) {\n await renderProjectHtml(config, {}, entry, route);\n }\n\n await rm(config.build.outDir, { recursive: true, force: true });\n await mkdir(config.build.outDir, { recursive: true });\n\n const builtByEntry = new Map<string, BuiltPage>();\n const failures: string[] = [];\n for (const entry of entries) {\n const built = await buildPage(config, entry);\n if (typeof built === 'string') {\n failures.push(built);\n continue;\n }\n builtByEntry.set(entry, built);\n }\n if (failures.length > 0) {\n throw buildFailure(failures);\n }\n\n const assetsBuilt: string[] = [];\n for (const [route, entry] of Object.entries(config.pages)) {\n const page = builtByEntry.get(entry);\n if (!page) {\n throw new Error(`Missing built assets for entry: ${entry}`);\n }\n const pageHtmlPath = htmlPath(config, route);\n const html = await renderProjectHtml(\n config,\n {\n head: page.stylesheetAssets.map((asset) => ({\n tag: 'link',\n attributes: {\n rel: 'stylesheet',\n href: toAssetUrl(config.build.outDir, pageHtmlPath, asset),\n },\n })),\n scripts: page.javascriptAssets.map((asset) => ({\n type: 'module',\n src: toAssetUrl(config.build.outDir, pageHtmlPath, asset),\n })),\n },\n page.entry,\n route\n );\n await mkdir(dirname(pageHtmlPath), { recursive: true });\n await writeFile(pageHtmlPath, html);\n assetsBuilt.push(...page.assets, pageHtmlPath);\n }\n\n return {\n root: config.root,\n outDir: config.build.outDir,\n assetsBuilt,\n };\n }\n}\n\nasync function buildPage(\n config: ResolvedConfig,\n entry: string\n): Promise<BuiltPage | string> {\n let result: Awaited<ReturnType<typeof Bun.build>>;\n try {\n result = await Bun.build({\n entrypoints: [entry],\n outdir: config.build.outDir,\n target: 'browser',\n format: 'esm',\n // 生产构建默认压缩;TRANSONE_MINIFY=0 时生成未压缩产物,便于排查问题\n minify: process.env.TRANSONE_MINIFY !== '0',\n naming: { entry: '[name].[ext]', chunk: '[name]-[hash].[ext]' },\n throw: false,\n });\n } catch (error: unknown) {\n return pageFailureReason(entry, [errorMessage(error)]);\n }\n const assets = result.outputs.map((output) => resolve(output.path));\n const javascriptAssets = result.outputs\n .filter(isEntryJavaScriptOutput)\n .map((output) => resolve(output.path));\n const stylesheetAssets = result.outputs\n .filter(isStylesheetOutput)\n .map((output) => resolve(output.path));\n\n if (!result.success || assets.length === 0 || javascriptAssets.length === 0) {\n return pageFailureReason(\n entry,\n result.logs.map((log) => log.message),\n {\n success: result.success,\n hasOutput: assets.length > 0,\n hasJavaScript: javascriptAssets.length > 0,\n }\n );\n }\n\n return {\n entry,\n assets,\n javascriptAssets,\n stylesheetAssets,\n };\n}\n\nfunction pageFailureReason(\n entry: string,\n logs: string[],\n state?: { success: boolean; hasOutput: boolean; hasJavaScript: boolean }\n): string {\n const reasons = [\n state && !state.success ? 'Bun build reported failure' : '',\n state && !state.hasOutput ? 'Bun emitted no output files' : '',\n state && !state.hasJavaScript ? 'Bun emitted no JavaScript output' : '',\n ...logs,\n ].filter((reason) => reason !== '');\n\n return `${entry}: ${reasons.join('\\n')}`;\n}\n\nfunction buildFailure(failures: string[]): Error {\n if (failures.length === 1) {\n return new Error(`Failed to build TransOne application: ${failures[0]}`);\n }\n return new Error(\n `Failed to build TransOne application:\\n${failures\n .map((failure) => `- ${failure}`)\n .join('\\n')}`\n );\n}\n\nfunction htmlPath(config: ResolvedConfig, route: string): string {\n if (route === '/') {\n return resolve(config.build.outDir, 'index.html');\n }\n const relativeRoute = route.replace(/^\\/+/, '');\n if (config.build.directoryPages) {\n return resolve(config.build.outDir, relativeRoute, 'index.html');\n }\n return resolve(config.build.outDir, `${relativeRoute}.html`);\n}\n\nfunction toAssetUrl(\n outDir: string,\n fromHtmlFile: string,\n asset: string\n): string {\n const fromOutDir = relative(outDir, asset).split(sep).join('/');\n if (\n fromOutDir === '' ||\n fromOutDir === '..' ||\n fromOutDir.startsWith('../') ||\n isAbsolute(fromOutDir)\n ) {\n throw new Error(\n `Build asset must be inside the output directory: ${asset}`\n );\n }\n\n const fromHtmlDir = dirname(fromHtmlFile);\n const assetPath = relative(fromHtmlDir, asset).split(sep).join('/');\n return `./${assetPath}`;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n",
|
|
8
|
-
"interface BuildOutputDescriptor {\n path: string;\n kind: string;\n}\n\nexport function isEntryJavaScriptOutput(\n output: BuildOutputDescriptor\n): boolean {\n return output.kind === 'entry-point' && isJavaScriptPath(output.path);\n}\n\nexport function isStylesheetOutput(output: { path: string }): boolean {\n return /\\.css$/i.test(output.path);\n}\n\nfunction isJavaScriptPath(path: string): boolean {\n return /\\.(?:[cm]?js)$/i.test(path);\n}\n",
|
|
9
|
-
"import { lstat, realpath } from 'node:fs/promises';\nimport { dirname, isAbsolute, relative, resolve, sep } from 'node:path';\n\nexport async function assertSafeSubdirectory(\n root: string,\n path: string,\n errorMessage: string\n): Promise<void> {\n try {\n const canonicalRoot = await realpath(root);\n const canonicalPath = await canonicalizePotentialPath(path);\n\n if (!isStrictSubdirectory(canonicalRoot, canonicalPath)) {\n throw new Error(errorMessage);\n }\n } catch {\n throw new Error(errorMessage);\n }\n}\n\nexport async function assertSafeSubdirectoryDoesNotContain(\n root: string,\n path: string,\n protectedPath: string,\n errorMessage: string\n): Promise<void> {\n try {\n const lexicalPath = resolve(path);\n const lexicalProtectedPath = resolve(protectedPath);\n const canonicalRoot = await realpath(root);\n const canonicalPath = await canonicalizePotentialPath(path);\n const canonicalProtectedPath = await realpath(protectedPath);\n\n if (\n !isStrictSubdirectory(canonicalRoot, canonicalPath) ||\n isPathWithinOrEqual(lexicalPath, lexicalProtectedPath) ||\n isPathWithinOrEqual(canonicalPath, canonicalProtectedPath)\n ) {\n throw new Error(errorMessage);\n }\n } catch {\n throw new Error(errorMessage);\n }\n}\n\nasync function canonicalizePotentialPath(path: string): Promise<string> {\n const ancestor = await findExistingAncestor(path);\n const canonicalAncestor = await realpath(ancestor);\n return resolve(canonicalAncestor, relative(ancestor, path));\n}\n\nasync function findExistingAncestor(path: string): Promise<string> {\n let candidate = path;\n\n while (candidate !== dirname(candidate)) {\n try {\n await lstat(candidate);\n return candidate;\n } catch (error: unknown) {\n if (!isMissingPathError(error)) {\n throw error;\n }\n }\n\n candidate = dirname(candidate);\n }\n\n await lstat(candidate);\n return candidate;\n}\n\nfunction isMissingPathError(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === 'ENOENT'\n );\n}\n\nfunction isStrictSubdirectory(root: string, path: string): boolean {\n const pathFromRoot = relative(root, path);\n return (\n pathFromRoot !== '' &&\n pathFromRoot !== '..' &&\n !pathFromRoot.startsWith(`..${sep}`) &&\n !isAbsolute(pathFromRoot)\n );\n}\n\nfunction isPathWithinOrEqual(parent: string, candidate: string): boolean {\n const pathFromParent = relative(parent, candidate);\n return (\n pathFromParent === '' ||\n (pathFromParent !== '..' &&\n !pathFromParent.startsWith(`..${sep}`) &&\n !isAbsolute(pathFromParent))\n );\n}\n",
|
|
10
|
-
"import type { ResolvedMiniProgramConfig } from '../types';\n\n/**\n * 跨端差异层:同一套 mp 编译器(AST 静态分析 → WXML 系模板 / WXSS 系样式 /\n * Page/Component JS)通过 MpDialect 描述各小程序平台的产物差异。\n *\n * 平台差异点(positioning 9.M3「沉淀跨端差异层」):\n * - 模板文件后缀:.wxml / .axml / .ttml\n * - 样式文件后缀与 app 样式文件名:.wxss / .acss / .ttss\n * - 模板指令前缀:wx: / a: / tt:\n * - 事件绑定写法:bindtap / onTap / bindtap\n * - 工程配置文件与字段:project.config.json / mini.project.json / project.config.json\n * - app.json 的 window 字段名(navigationBarTitleText vs defaultTitle)与顶层差异\n * - 组件 json(微信 multipleSlots;阿里 / 字节无需)\n * - 是否生成 sitemap.json(微信特有)\n */\nexport interface MpDialect {\n /** 目标端标识,与 TargetType 一致。 */\n id: string;\n /** 人类可读描述。 */\n label: string;\n /** 模板文件后缀(不含点)。 */\n templateExt: string;\n /** 样式文件后缀(不含点)。 */\n styleExt: string;\n /** 全局样式文件名(app.wxss / app.acss / app.ttss)。 */\n appStyleFile: string;\n /** 模板指令前缀(wx: / a: / tt:)。 */\n directivePrefix: string;\n /** 普通事件绑定:bindtap / onTap / bindtap。 */\n bindEvent: (eventName: string) => string;\n /** 阻止冒泡事件绑定:catchtap / catchTap / catchtap。 */\n catchEvent: (eventName: string) => string;\n /** 工程配置文件文件名(project.config.json / mini.project.json)。 */\n projectConfigFile: string;\n /** 工程配置文件内容。 */\n buildProjectConfig: (\n mp: ResolvedMiniProgramConfig,\n projectName: string\n ) => Record<string, unknown>;\n /** app.json.window 的默认字段(平台字段名映射)。 */\n windowDefaults: (title: string) => Record<string, unknown>;\n /** app.json 顶层额外字段(微信的 style / sitemapLocation)。 */\n appJsonExtras: () => Record<string, unknown>;\n /** 是否生成 sitemap.json(微信特有)。 */\n sitemap: boolean;\n /** 自定义组件 json 的固定字段。 */\n componentJson: (usingComponents: Record<string, string>) => Record<string, unknown>;\n}\n\n/** camelCase 事件名转 PascalCase(阿里 onTap / onTouchStart)。 */\nfunction pascalEvent(eventName: string): string {\n return eventName.charAt(0).toUpperCase() + eventName.slice(1);\n}\n\nconst WEIXIN_PROJECT_SETTING = {\n es6: true,\n postcss: true,\n minified: true,\n urlCheck: false,\n} as const;\n\nexport const MP_WEIXIN_DIALECT: MpDialect = {\n id: 'mp-weixin',\n label: '微信小程序原生工程(WXML / WXSS / JS 静态转换)',\n templateExt: 'wxml',\n styleExt: 'wxss',\n appStyleFile: 'app.wxss',\n directivePrefix: 'wx:',\n bindEvent: (event) => `bind${event}`,\n catchEvent: (event) => `catch${event}`,\n projectConfigFile: 'project.config.json',\n buildProjectConfig: (mp, projectName) => ({\n appid: mp.appId,\n projectname: projectName,\n compileType: 'miniprogram',\n setting: { ...WEIXIN_PROJECT_SETTING },\n }),\n windowDefaults: (title) => ({\n navigationBarTitleText: title,\n navigationBarBackgroundColor: '#ffffff',\n navigationBarTextStyle: 'black',\n backgroundTextStyle: 'light',\n }),\n appJsonExtras: () => ({\n lazyCodeLoading: 'requiredComponents',\n style: 'v2',\n sitemapLocation: 'sitemap.json',\n }),\n sitemap: true,\n componentJson: (usingComponents) => ({\n component: true,\n multipleSlots: true,\n usingComponents,\n }),\n};\n\nexport const MP_ALIPAY_DIALECT: MpDialect = {\n id: 'mp-alipay',\n label: '阿里小程序原生工程(AXML / ACSS / JS 静态转换)',\n templateExt: 'axml',\n styleExt: 'acss',\n appStyleFile: 'app.acss',\n directivePrefix: 'a:',\n bindEvent: (event) => `on${pascalEvent(event)}`,\n catchEvent: (event) => `catch${pascalEvent(event)}`,\n projectConfigFile: 'mini.project.json',\n buildProjectConfig: () => ({\n miniprogramRoot: './',\n component2: true,\n enableAppxNg: true,\n compileType: 'miniprogram',\n }),\n windowDefaults: (title) => ({\n defaultTitle: title,\n titleBarColor: '#ffffff',\n }),\n appJsonExtras: () => ({}),\n sitemap: false,\n componentJson: (usingComponents) => ({\n component: true,\n usingComponents,\n }),\n};\n\nexport const MP_BYTEDANCE_DIALECT: MpDialect = {\n id: 'mp-bytedance',\n label: '字节小程序原生工程(TTML / TTSS / JS 静态转换)',\n templateExt: 'ttml',\n styleExt: 'ttss',\n appStyleFile: 'app.ttss',\n directivePrefix: 'tt:',\n bindEvent: (event) => `bind${event}`,\n catchEvent: (event) => `catch${event}`,\n projectConfigFile: 'project.config.json',\n buildProjectConfig: (mp, projectName) => ({\n miniprogramRoot: './',\n compileType: 'miniprogram',\n projectname: projectName,\n appid: mp.appId,\n setting: { ...WEIXIN_PROJECT_SETTING },\n }),\n windowDefaults: (title) => ({\n navigationBarTitleText: title,\n navigationBarBackgroundColor: '#ffffff',\n navigationBarTextStyle: 'black',\n backgroundTextStyle: 'light',\n }),\n appJsonExtras: () => ({}),\n sitemap: false,\n componentJson: (usingComponents) => ({\n component: true,\n usingComponents,\n }),\n};\n\nexport const MP_XIAOHONGSHU_DIALECT: MpDialect = {\n id: 'mp-xiaohongshu',\n label: '小红书小程序原生工程(XHSML / CSS / JS 静态转换)',\n templateExt: 'xhsml',\n styleExt: 'css',\n appStyleFile: 'app.css',\n directivePrefix: 'xhs:',\n bindEvent: (event) => `bind${event}`,\n catchEvent: (event) => `catch${event}`,\n projectConfigFile: 'project.config.json',\n buildProjectConfig: (mp, projectName) => ({\n appid: mp.appId,\n projectname: projectName,\n compileType: 'miniprogram',\n }),\n windowDefaults: (title) => ({\n navigationBarTitleText: title,\n navigationBarBackgroundColor: '#ffffff',\n navigationBarTextStyle: 'black',\n backgroundTextStyle: 'light',\n }),\n appJsonExtras: () => ({}),\n sitemap: false,\n componentJson: (usingComponents) => ({\n component: true,\n multipleSlots: true,\n usingComponents,\n }),\n};\n\nexport const MP_DIALECTS: Record<string, MpDialect> = {\n 'mp-weixin': MP_WEIXIN_DIALECT,\n 'mp-alipay': MP_ALIPAY_DIALECT,\n 'mp-bytedance': MP_BYTEDANCE_DIALECT,\n 'mp-xiaohongshu': MP_XIAOHONGSHU_DIALECT,\n};\n",
|
|
11
|
-
"import type { BuildOptions, BuildResult, ResolvedConfig } from '../types';\nimport type { BuildTarget, TargetType } from './types';\nimport {\n MP_ALIPAY_DIALECT,\n MP_BYTEDANCE_DIALECT,\n MP_WEIXIN_DIALECT,\n MP_XIAOHONGSHU_DIALECT,\n type MpDialect,\n} from '../mp/dialect';\n\n/**\n * 小程序目标端通用实现:同一套 mp 编译器 + MpDialect 差异层。\n *\n * 流水线(src/mp/):\n * 入口 → 静态分析(定位 createApp root / Component 子类)\n * → 逐页面编译(模板 / 样式 / data / methods / 生命周期)\n * → 组件调用点属性聚合(properties)\n * → 按 dialect 生成平台原生工程(app.json / app.js / 样式 / pages / components)。\n *\n * 依赖 TypeScript 编译器 API,仅在小程序构建路径惰性加载。\n */\nexport class MpTarget implements BuildTarget {\n public constructor(private readonly dialect: MpDialect) {}\n\n public get type(): TargetType {\n return this.dialect.id as TargetType;\n }\n\n public get label(): string {\n return this.dialect.label;\n }\n\n public async build(\n config: ResolvedConfig,\n _options: BuildOptions\n ): Promise<BuildResult> {\n if (!config.mp) {\n throw new Error(\n 'Mini program build requires config.mp(请在 transone.config.ts 配置 mp 字段,' +\n '如 appId / pages / outDir)'\n );\n }\n // 动态加载:mp 编译器依赖 typescript API,仅在小程序构建路径加载\n const { buildMiniProgram } = await import('../mp/build-mp');\n return buildMiniProgram(config, this.dialect);\n }\n}\n\nexport const mpWeixinTarget = new MpTarget(MP_WEIXIN_DIALECT);\nexport const mpAlipayTarget = new MpTarget(MP_ALIPAY_DIALECT);\nexport const mpBytedanceTarget = new MpTarget(MP_BYTEDANCE_DIALECT);\nexport const mpXiaohongshuTarget = new MpTarget(MP_XIAOHONGSHU_DIALECT);\n",
|
|
12
|
-
"import { cp, mkdir, rm, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport type { BuildResult, ResolvedConfig } from '../types';\nimport { nativeError } from './errors';\nimport { analyzeNativeScreen } from './analyze';\nimport type { NativeDialect } from './types';\n\nexport async function buildNativeApp(config: ResolvedConfig, dialect: NativeDialect): Promise<BuildResult> {\n if (!config.app) throw new Error('Native app build requires config.app');\n const entries = Object.values(config.app.pages);\n if (entries.length !== 1) throw nativeError(config.entry, '首期原生 App 只支持一个页面');\n const screen = await analyzeNativeScreen(entries[0]);\n const files = dialect.generateProject(screen, config.app);\n if (config.app.host !== undefined) {\n files[`${dialect.resourceDirectory}/transone.config.json`] =\n `${JSON.stringify({ host: config.app.host }, null, 2)}\\n`;\n }\n await rm(config.app.outDir, { recursive: true, force: true });\n const assetsBuilt: string[] = [];\n for (const [relative, content] of Object.entries(files).sort(([a], [b]) => a.localeCompare(b))) {\n const target = join(config.app.outDir, relative); await mkdir(dirname(target), { recursive: true }); await writeFile(target, content, 'utf8'); assetsBuilt.push(target);\n }\n if (existsSync(config.app.publicDir)) await cp(config.app.publicDir, join(config.app.outDir, dialect.resourceDirectory), { recursive: true });\n return { root: config.root, outDir: resolve(config.app.outDir), assetsBuilt };\n}\n",
|
|
13
|
-
"import { basename } from 'node:path';\n\nexport function nativeError(filePath: string, message: string): Error {\n return new Error(`[transone app] ${basename(filePath)}: ${message}`);\n}\n",
|
|
14
|
-
"import { existsSync, readFileSync } from 'node:fs';\nimport type * as tsTypes from 'typescript';\nimport { loadTypescript } from '../mp/ts-loader';\nimport { nativeError } from './errors';\nimport type { NativeAction, NativeNode, NativeScreen, NativeStateEntry, NativeStyle, NativeTextPart } from './types';\n\nconst CONTAINERS = new Set(['view', 'main', 'div']);\nconst TEXT = new Set(['text', 'span', 'p', 'h1']);\nconst STYLE_KEYS = new Set(['color', 'backgroundColor', 'fontSize', 'fontWeight', 'padding', 'margin', 'width', 'height', 'borderRadius', 'textAlign']);\n\nexport async function analyzeNativeScreen(entry: string): Promise<NativeScreen> {\n if (!existsSync(entry)) throw nativeError(entry, '源文件不存在');\n const ts = await loadTypescript();\n const source = ts.createSourceFile(entry, readFileSync(entry, 'utf8'), ts.ScriptTarget.Latest, true);\n const component = source.statements.find((s): s is tsTypes.ClassDeclaration => ts.isClassDeclaration(s));\n if (!component) throw nativeError(entry, '未找到 Component 类');\n const state = readState(ts, component, entry);\n const actions = new Map<string, NativeAction>();\n for (const member of component.members) if (ts.isMethodDeclaration(member) && ts.isIdentifier(member.name)) {\n const action = readAction(ts, member, entry); if (action) actions.set(member.name.text, action);\n }\n const render = component.members.find((m): m is tsTypes.MethodDeclaration => ts.isMethodDeclaration(m) && m.name.getText(source) === 'render');\n const value = render?.body?.statements.find(ts.isReturnStatement)?.expression;\n if (!value || !ts.isObjectLiteralExpression(value)) throw nativeError(entry, 'render() 必须返回静态 VNode 对象');\n const root = readNode(ts, value, entry, new Set(state.map((item) => item.key)), actions);\n if (root.kind !== 'container') throw nativeError(entry, '根节点必须是容器节点');\n return { name: component.name?.text ?? 'App', state, root };\n}\n\nfunction readState(ts: typeof tsTypes, component: tsTypes.ClassDeclaration, file: string): NativeStateEntry[] {\n const method = component.members.find((m): m is tsTypes.MethodDeclaration => ts.isMethodDeclaration(m) && m.name.getText() === 'initState');\n const value = method?.body?.statements.find(ts.isReturnStatement)?.expression;\n if (!value) return [];\n if (!ts.isObjectLiteralExpression(value)) throw nativeError(file, 'initState() 必须返回对象字面量');\n return value.properties.map((item) => {\n if (!ts.isPropertyAssignment(item) || !ts.isIdentifier(item.name)) throw nativeError(file, 'state 必须使用标识符属性');\n const literal = literalValue(ts, item.initializer);\n if (literal === undefined) throw nativeError(file, `state.${item.name.text} 必须是字面量`);\n return { key: item.name.text, value: literal };\n });\n}\n\nfunction readAction(ts: typeof tsTypes, method: tsTypes.MethodDeclaration, file: string): NativeAction | undefined {\n const expression = method.body?.statements[0];\n if (!expression || !ts.isExpressionStatement(expression) || !ts.isBinaryExpression(expression.expression)) return undefined;\n const binary = expression.expression;\n if (!ts.isPropertyAccessExpression(binary.left) || !ts.isPropertyAccessExpression(binary.left.expression) || binary.left.expression.expression.kind !== ts.SyntaxKind.ThisKeyword || binary.left.expression.name.text !== 'state') return undefined;\n const value = literalValue(ts, binary.right); const key = binary.left.name.text;\n if ((binary.operatorToken.kind === ts.SyntaxKind.PlusEqualsToken || binary.operatorToken.kind === ts.SyntaxKind.MinusEqualsToken) && typeof value === 'number') return { kind: 'increment', key, by: binary.operatorToken.kind === ts.SyntaxKind.MinusEqualsToken ? -value : value };\n if (binary.operatorToken.kind === ts.SyntaxKind.EqualsToken && value !== undefined) return { kind: 'set-literal', key, value };\n throw nativeError(file, `方法 ${method.name.getText()} 不支持原生编译`);\n}\n\nfunction readNode(ts: typeof tsTypes, node: tsTypes.ObjectLiteralExpression, file: string, state: Set<string>, actions: Map<string, NativeAction>): NativeNode {\n const tag = stringValue(ts, get(ts, node, 'tag'), file, 'VNode tag');\n const style = readStyle(ts, get(ts, node, 'props'), file);\n const children = get(ts, node, 'children');\n const childNodes = children && ts.isArrayLiteralExpression(children) ? [...children.elements].filter(ts.isExpression) : [];\n if (CONTAINERS.has(tag)) return { kind: 'container', children: childNodes.map((child) => {\n if (!ts.isObjectLiteralExpression(child)) throw nativeError(file, '容器 children 只支持静态 VNode');\n return readNode(ts, child, file, state, actions);\n }), ...(style ? { style } : {}) };\n const parts = childNodes.flatMap((child) => readText(ts, child, file, state));\n if (TEXT.has(tag)) return { kind: 'text', parts, ...(style ? { style } : {}) };\n if (tag === 'button') return { kind: 'button', parts, action: readClick(ts, get(ts, node, 'listeners'), file, actions), ...(style ? { style } : {}) };\n throw nativeError(file, `不支持的原生节点: ${tag}`);\n}\n\nfunction readText(ts: typeof tsTypes, expression: tsTypes.Expression, file: string, state: Set<string>): NativeTextPart[] {\n const value = literalValue(ts, expression); if (typeof value !== 'string') throw nativeError(file, '文本 children 必须是字符串字面量');\n const result: NativeTextPart[] = []; const matcher = /{{([^}]+)}}/g; let cursor = 0; let match: RegExpExecArray | null;\n while ((match = matcher.exec(value))) { if (match.index > cursor) result.push({ kind: 'literal', value: value.slice(cursor, match.index) }); const key = match[1]; if (!/^[A-Za-z_$][\\w$]*$/.test(key) || !state.has(key)) throw nativeError(file, '只支持已声明 state 的 {{key}} 绑定'); result.push({ kind: 'state', key }); cursor = matcher.lastIndex; }\n if (cursor < value.length || result.length === 0) result.push({ kind: 'literal', value: value.slice(cursor) }); return result;\n}\n\nfunction readClick(ts: typeof tsTypes, listeners: tsTypes.Expression | undefined, file: string, actions: Map<string, NativeAction>): NativeAction {\n if (!listeners || !ts.isObjectLiteralExpression(listeners)) throw nativeError(file, 'button 必须声明 listeners.click');\n const handler = get(ts, listeners, 'click');\n const body = handler && ts.isArrowFunction(handler) ? handler.body : undefined;\n const expression = body && ts.isCallExpression(body) ? body : body && ts.isBlock(body) && ts.isExpressionStatement(body.statements[0]) ? body.statements[0].expression : undefined;\n if (!expression || !ts.isCallExpression(expression) || !ts.isPropertyAccessExpression(expression.expression) || expression.expression.expression.kind !== ts.SyntaxKind.ThisKeyword) throw nativeError(file, 'click 只支持调用 this.method()');\n const action = actions.get(expression.expression.name.text); if (!action) throw nativeError(file, `click 方法 ${expression.expression.name.text} 不支持原生编译`); return action;\n}\n\nfunction readStyle(ts: typeof tsTypes, props: tsTypes.Expression | undefined, file: string): NativeStyle | undefined {\n if (!props || !ts.isObjectLiteralExpression(props)) return undefined; const style = get(ts, props, 'style'); if (!style || !ts.isObjectLiteralExpression(style)) return undefined;\n const out: Record<string, string | number> = {}; for (const item of style.properties) { if (!ts.isPropertyAssignment(item) || !ts.isIdentifier(item.name) || !STYLE_KEYS.has(item.name.text)) throw nativeError(file, '不支持的原生样式属性'); const value = literalValue(ts, item.initializer); const keyword = item.name.text === 'color' || item.name.text === 'backgroundColor' || item.name.text === 'fontWeight' || item.name.text === 'textAlign'; if (keyword && (typeof value === 'string' || typeof value === 'number')) { out[item.name.text] = value; continue; } if (typeof value !== 'number' && !(typeof value === 'string' && /^\\d+(\\.\\d+)?px$/.test(value))) throw nativeError(file, `样式 ${item.name.text} 只支持数字或 px`); out[item.name.text] = typeof value === 'string' ? Number.parseFloat(value) : value; } return out as NativeStyle;\n}\n\nfunction get(ts: typeof tsTypes, node: tsTypes.ObjectLiteralExpression, name: string): tsTypes.Expression | undefined { const item = node.properties.find((p) => ts.isPropertyAssignment(p) && p.name.getText().replace(/['\"]/g, '') === name); return item && ts.isPropertyAssignment(item) ? item.initializer : undefined; }\nfunction stringValue(ts: typeof tsTypes, expression: tsTypes.Expression | undefined, file: string, label: string): string { const value = expression && literalValue(ts, expression); if (typeof value !== 'string') throw nativeError(file, `${label} 必须是字符串`); return value; }\nfunction literalValue(ts: typeof tsTypes, value: tsTypes.Expression): string | number | boolean | undefined { if (ts.isStringLiteral(value) || ts.isNoSubstitutionTemplateLiteral(value)) return value.text; if (ts.isNumericLiteral(value)) return Number(value.text); if (value.kind === ts.SyntaxKind.TrueKeyword) return true; if (value.kind === ts.SyntaxKind.FalseKeyword) return false; return undefined; }\n",
|
|
15
|
-
"import type { BuildOptions, BuildResult, ResolvedConfig } from '../types';\nimport { buildNativeApp } from '../app/build-app';\nimport type { NativeDialect } from '../app/types';\nimport type { BuildTarget, TargetType } from './types';\n\nexport class AppTarget implements BuildTarget {\n public constructor(private readonly dialect: NativeDialect) {}\n public get type(): TargetType { return this.dialect.id; }\n public get label(): string { return this.dialect.label; }\n public build(config: ResolvedConfig, _options: BuildOptions): Promise<BuildResult> { return buildNativeApp(config, this.dialect); }\n}\n",
|
|
16
|
-
"import type { NativeDialect, NativeNode, NativeScreen, NativeTextPart } from './types';\n\nfunction text(parts: NativeTextPart[], language: 'swift' | 'kotlin' | 'ark'): string {\n if (language === 'swift') {\n const value = parts.map((part) => part.kind === 'literal' ? part.value : `\\\\(${part.key})`).join('');\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n }\n if (language === 'kotlin') {\n return JSON.stringify(parts.map((part) => part.kind === 'literal' ? part.value : `$${part.key}`).join(''));\n }\n return parts.map((part) => part.kind === 'literal' ? JSON.stringify(part.value) : `this.${part.key}`).join(' + ') || '\"\"';\n}\nfunction action(node: Extract<NativeNode, { kind: 'button' }>, language: 'swift' | 'kotlin' | 'ark'): string {\n const { action } = node;\n const target = language === 'ark' ? `this.${action.key}` : action.key;\n return action.kind === 'increment' ? `${target} ${action.by >= 0 ? '+=' : '-='} ${Math.abs(action.by)}` : `${target} = ${typeof action.value === 'string' ? JSON.stringify(action.value) : action.value}`;\n}\nfunction swiftNode(node: NativeNode, indent = ' '): string {\n if (node.kind === 'container') return `${indent}VStack {\\n${node.children.map((child) => swiftNode(child, `${indent} `)).join('\\n')}\\n${indent}}`;\n if (node.kind === 'text') return `${indent}Text(${text(node.parts, 'swift')})`;\n return `${indent}Button(${text(node.parts, 'swift')}) { ${action(node, 'swift')} }`;\n}\nfunction kotlinNode(node: NativeNode, indent = ' '): string {\n if (node.kind === 'container') return `${indent}Column {\\n${node.children.map((child) => kotlinNode(child, `${indent} `)).join('\\n')}\\n${indent}}`;\n if (node.kind === 'text') return `${indent}Text(${text(node.parts, 'kotlin')})`;\n return `${indent}Button(onClick = { ${action(node, 'kotlin')} }) { Text(${text(node.parts, 'kotlin')}) }`;\n}\nfunction arkNode(node: NativeNode, indent = ' '): string {\n if (node.kind === 'container') return `${indent}Column() {\\n${node.children.map((child) => arkNode(child, `${indent} `)).join('\\n')}\\n${indent}}`;\n if (node.kind === 'text') return `${indent}Text(${text(node.parts, 'ark')})`;\n return `${indent}Button(${text(node.parts, 'ark')}).onClick(() => { ${action(node, 'ark')} })`;\n}\nfunction swiftState(screen: NativeScreen): string { return screen.state.map((item) => ` @State private var ${item.key}: ${typeof item.value === 'number' ? 'Int' : typeof item.value === 'boolean' ? 'Bool' : 'String'} = ${JSON.stringify(item.value)}`).join('\\n'); }\nfunction kotlinState(screen: NativeScreen): string { return screen.state.map((item) => ` var ${item.key} by remember { mutableStateOf(${JSON.stringify(item.value)}) }`).join('\\n'); }\nfunction arkState(screen: NativeScreen): string { return screen.state.map((item) => ` @State ${item.key}: ${typeof item.value === 'number' ? 'number' : typeof item.value === 'boolean' ? 'boolean' : 'string'} = ${JSON.stringify(item.value)}`).join('\\n'); }\n\nexport const IOS_DIALECT: NativeDialect = {\n id: 'app-ios', label: 'iOS 原生 App(SwiftUI)', resourceDirectory: 'TransOneApp/Assets',\n generateProject(screen, config) {\n return {\n 'TransOneApp/TransOneApp.swift': `import SwiftUI\\n\\n@main struct TransOneApp: App { var body: some Scene { WindowGroup { ContentView() } } }\\n`,\n 'TransOneApp/ContentView.swift': `import SwiftUI\\n\\nstruct ContentView: View {\\n${swiftState(screen)}\\n var body: some View {\\n${swiftNode(screen.root)}\\n }\\n}\\n`,\n 'TransOneApp.xcodeproj/project.pbxproj': xcodeProject(config),\n 'TransOneApp/Assets.xcassets/Contents.json': '{\"info\":{\"author\":\"xcode\",\"version\":1}}\\n',\n };\n },\n};\n\nfunction xcodeProject(config: { appName: string; bundleId: string; minPlatformVersion: string }): string {\n const escapedName = config.appName.replace(/\"/g, '\\\\\"');\n return `// !$*UTF8*$!\n{\n archiveVersion = 1;\n classes = {};\n objectVersion = 56;\n objects = {\n\n/* Begin PBXBuildFile section */\n A00100000000000000000001 /* TransOneApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = A00100000000000000000011 /* TransOneApp.swift */; };\n A00100000000000000000002 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A00100000000000000000012 /* ContentView.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n A00100000000000000000011 /* TransOneApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransOneApp.swift; sourceTree = \"<group>\"; };\n A00100000000000000000012 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n A00100000000000000000013 /* TransOneApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TransOneApp.app; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXGroup section */\n A00100000000000000000021 = {isa = PBXGroup; children = (A00100000000000000000022 /* TransOneApp */, A00100000000000000000023 /* Products */, ); sourceTree = \"<group>\"; };\n A00100000000000000000022 /* TransOneApp */ = {isa = PBXGroup; children = (A00100000000000000000011 /* TransOneApp.swift */, A00100000000000000000012 /* ContentView.swift */, ); path = TransOneApp; sourceTree = \"<group>\"; };\n A00100000000000000000023 /* Products */ = {isa = PBXGroup; children = (A00100000000000000000013 /* TransOneApp.app */, ); name = Products; sourceTree = \"<group>\"; };\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n A00100000000000000000031 /* TransOneApp */ = {isa = PBXNativeTarget; buildConfigurationList = A00100000000000000000041 /* Build configuration list for PBXNativeTarget \"TransOneApp\" */; buildPhases = (A00100000000000000000032 /* Sources */, A00100000000000000000033 /* Frameworks */, A00100000000000000000034 /* Resources */, ); buildRules = (); dependencies = (); name = TransOneApp; productName = TransOneApp; productReference = A00100000000000000000013 /* TransOneApp.app */; productType = \"com.apple.product-type.application\"; };\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n A00100000000000000000051 /* Project object */ = {isa = PBXProject; attributes = { LastUpgradeCheck = 2700; TargetAttributes = { A00100000000000000000031 = { CreatedOnToolsVersion = 27.0; }; }; }; buildConfigurationList = A00100000000000000000052 /* Build configuration list for PBXProject \"TransOneApp\" */; compatibilityVersion = \"Xcode 14.0\"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = (en, Base, ); mainGroup = A00100000000000000000021; productRefGroup = A00100000000000000000023; projectDirPath = \"\"; projectRoot = \"\"; targets = (A00100000000000000000031 /* TransOneApp */, ); };\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n A00100000000000000000034 /* Resources */ = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (); runOnlyForDeploymentPostprocessing = 0; };\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n A00100000000000000000032 /* Sources */ = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (A00100000000000000000001 /* TransOneApp.swift in Sources */, A00100000000000000000002 /* ContentView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXFrameworksBuildPhase section */\n A00100000000000000000033 /* Frameworks */ = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (); runOnlyForDeploymentPostprocessing = 0; };\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n A00100000000000000000061 /* Debug */ = {isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; SWIFT_VERSION = 5.0; }; name = Debug; };\n A00100000000000000000062 /* Release */ = {isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; SWIFT_VERSION = 5.0; }; name = Release; };\n A00100000000000000000063 /* Debug */ = {isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CODE_SIGNING_ALLOWED = NO; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = ${config.minPlatformVersion}; PRODUCT_BUNDLE_IDENTIFIER = ${config.bundleId}; PRODUCT_NAME = \"${escapedName}\"; SDKROOT = iphoneos; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = \"1,2\"; }; name = Debug; };\n A00100000000000000000064 /* Release */ = {isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CODE_SIGNING_ALLOWED = NO; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = ${config.minPlatformVersion}; PRODUCT_BUNDLE_IDENTIFIER = ${config.bundleId}; PRODUCT_NAME = \"${escapedName}\"; SDKROOT = iphoneos; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = \"1,2\"; }; name = Release; };\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n A00100000000000000000041 /* Build configuration list for PBXNativeTarget \"TransOneApp\" */ = {isa = XCConfigurationList; buildConfigurations = (A00100000000000000000063 /* Debug */, A00100000000000000000064 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; };\n A00100000000000000000052 /* Build configuration list for PBXProject \"TransOneApp\" */ = {isa = XCConfigurationList; buildConfigurations = (A00100000000000000000061 /* Debug */, A00100000000000000000062 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; };\n/* End XCConfigurationList section */\n };\n rootObject = A00100000000000000000051 /* Project object */;\n}\n`;\n}\n\nexport const ANDROID_DIALECT: NativeDialect = {\n id: 'app-android', label: 'Android 原生 App(Jetpack Compose)', resourceDirectory: 'app/src/main/assets',\n generateProject(screen, config) {\n const pkg = config.bundleId.replace(/[^A-Za-z0-9_.]/g, '_'); const path = pkg.replace(/\\./g, '/');\n return {\n 'settings.gradle.kts': `rootProject.name = \"${config.appName}\"\\ninclude(\":app\")\\n`,\n 'build.gradle.kts': 'plugins { }\\n',\n 'app/build.gradle.kts': `plugins { id(\"com.android.application\") version \"8.5.0\" apply false }\\n`,\n 'app/src/main/AndroidManifest.xml': `<manifest package=\"${pkg}\" xmlns:android=\"http://schemas.android.com/apk/res/android\"><application android:label=\"${config.appName}\"><activity android:name=\".MainActivity\" android:exported=\"true\"><intent-filter><action android:name=\"android.intent.action.MAIN\"/><category android:name=\"android.intent.category.LAUNCHER\"/></intent-filter></activity></application></manifest>\\n`,\n [`app/src/main/java/${path}/MainActivity.kt`]: `package ${pkg}\\n\\nimport androidx.activity.ComponentActivity\\nimport androidx.activity.compose.setContent\\nimport androidx.compose.runtime.*\\nimport androidx.compose.foundation.layout.Column\\nimport androidx.compose.material3.*\\n\\nclass MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: android.os.Bundle?) { super.onCreate(savedInstanceState); setContent {\\n${kotlinState(screen)}\\n${kotlinNode(screen.root)}\\n} } }\\n`,\n };\n },\n};\n\nexport const HARMONY_DIALECT: NativeDialect = {\n id: 'app-harmony', label: 'HarmonyOS 原生 App(ArkUI)', resourceDirectory: 'entry/src/main/resources/rawfile',\n generateProject(screen, config) {\n return {\n 'AppScope/app.json5': `{ \"app\": { \"bundleName\": \"${config.bundleId}\", \"vendor\": \"TransOne\", \"versionCode\": 1, \"versionName\": \"1.0.0\" } }\\n`,\n 'AppScope/resources/base/element/string.json': `{ \"string\": [{ \"name\": \"app_name\", \"value\": \"${config.appName}\" }] }\\n`,\n 'entry/src/main/module.json5': '{ \"module\": { \"name\": \"entry\", \"type\": \"entry\", \"mainElement\": \"EntryAbility\" } }\\n',\n 'entry/src/main/ets/entryability/EntryAbility.ets': 'import UIAbility from \\'@ohos.app.ability.UIAbility\\';\\nexport default class EntryAbility extends UIAbility {}\\n',\n 'entry/src/main/ets/pages/Index.ets': `@Entry\\n@Component\\nstruct Index {\\n${arkState(screen)}\\n build() {\\n${arkNode(screen.root)}\\n }\\n}\\n`,\n };\n },\n};\n",
|
|
17
|
-
"import type { BuildTarget, TargetType } from './types';\nimport { WebTarget } from './web-target';\nimport {\n mpAlipayTarget,\n mpBytedanceTarget,\n mpWeixinTarget,\n mpXiaohongshuTarget,\n} from './mp-target';\nimport { AppTarget } from './app-target';\nimport { ANDROID_DIALECT, HARMONY_DIALECT, IOS_DIALECT } from '../app/dialects';\n\n/**\n * 目标端注册表:编译器按 Target 分发代码生成(positioning 7.3)。\n *\n * 注册 Web 与各小程序 target;\n * app-* 通过平台方言注册原生源码生成器。\n */\nexport class TargetRegistry {\n private readonly targets = new Map<TargetType, BuildTarget>();\n\n public constructor() {\n this.register(new WebTarget());\n this.register(mpWeixinTarget);\n this.register(mpAlipayTarget);\n this.register(mpBytedanceTarget);\n this.register(mpXiaohongshuTarget);\n this.register(new AppTarget(IOS_DIALECT));\n this.register(new AppTarget(ANDROID_DIALECT));\n this.register(new AppTarget(HARMONY_DIALECT));\n }\n\n public register(target: BuildTarget): void {\n this.targets.set(target.type, target);\n }\n\n public resolve(type: TargetType): BuildTarget {\n const target = this.targets.get(type);\n if (!target) {\n throw new Error(`Unknown build target: ${type}`);\n }\n return target;\n }\n\n public getAvailableTargets(): BuildTarget[] {\n return [...this.targets.values()];\n }\n}\n\nexport const targetRegistry = new TargetRegistry();\n",
|
|
18
|
-
"import { mkdir, rm } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport { resolveConfig } from './config';\nimport { targetRegistry } from './target/registry';\nimport type { BuildOptions, BuildResult } from './types';\n\n/**\n * TransOne 构建入口:解析配置后按 Target 分发到对应编译目标。\n *\n * 同一个入口文档,`transone build --target <端>` 产出对应平台原生产物\n * (positioning 1:一份源码,多端原生产物,零运行时桥接)。\n */\nexport async function build(options: BuildOptions = {}): Promise<BuildResult> {\n const config = await resolveConfig(options);\n\n // 库构建与目标端无关:直接产出可发布的 ESM bundle + .d.ts。\n if (options.library) {\n return buildLibrary(config);\n }\n\n const target = targetRegistry.resolve(config.target);\n return target.build(config, options);\n}\n\nasync function buildLibrary(\n config: Awaited<ReturnType<typeof resolveConfig>>\n): Promise<BuildResult> {\n const library = config.library;\n if (!library) {\n throw new Error('TransOne library build requires config.library');\n }\n\n await rm(library.outDir, { recursive: true, force: true });\n await mkdir(library.outDir, { recursive: true });\n\n if (library.dts) {\n for (const tsconfig of library.tsconfigs) {\n await runTsc(config.root, tsconfig);\n }\n }\n\n const minify = library.minify ?? process.env.TRANSONE_MINIFY !== '0';\n const result = await Bun.build({\n entrypoints: [library.entry],\n outdir: library.outDir,\n root: dirname(library.entry),\n target: 'browser',\n format: 'esm',\n sourcemap: library.sourcemap ? 'linked' : undefined,\n splitting: library.splitting,\n minify,\n external: library.external,\n throw: false,\n });\n\n if (!result.success || result.outputs.length === 0) {\n throw new Error(\n `Failed to build TransOne library:\\n${result.logs\n .map((log) => log.message)\n .join('\\n')}`\n );\n }\n\n const assetsBuilt = result.outputs.map((output) => resolve(output.path));\n return { root: config.root, outDir: library.outDir, assetsBuilt };\n}\n\nasync function runTsc(root: string, tsconfig: string): Promise<void> {\n const proc = Bun.spawn(['bunx', 'tsc', '--project', tsconfig], {\n cwd: root,\n stdout: 'inherit',\n stderr: 'inherit',\n });\n const exitCode = await proc.exited;\n if (exitCode !== 0) {\n throw new Error(\n `tsc --project ${tsconfig} failed with exit code ${exitCode}`\n );\n }\n}\n",
|
|
19
|
-
"import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { basename, join } from 'node:path';\n\nexport interface CreateProjectOptions {\n /** Target directory; defaults to the current working directory. */\n root?: string;\n /** Package name; defaults to the target directory basename. */\n name?: string;\n}\n\nexport interface CreateProjectResult {\n root: string;\n files: string[];\n}\n\n/** Published framework version referenced by generated projects. */\nexport const TRANSONE_FRAMEWORK_VERSION = '0.4.0';\n/** Published CLI version referenced by generated projects. */\nexport const TRANSONE_CLI_VERSION = '0.6.1';\n\nexport const GITHUB_URL = 'https://github.com/geektech-team/transone';\n\ninterface ScaffoldFile {\n path: string;\n content: string;\n}\n\nexport function createProject(\n options: CreateProjectOptions = {}\n): CreateProjectResult {\n const root = options.root ?? process.cwd();\n const name = options.name ?? basename(root);\n const files = scaffoldFiles(name);\n\n const existing = files.filter((file) => existsSync(join(root, file.path)));\n if (existing.length > 0) {\n throw new Error(\n `Refusing to overwrite existing TransOne project files: ${existing\n .map((file) => file.path)\n .join(', ')}`\n );\n }\n\n mkdirSync(join(root, 'src'), { recursive: true });\n const created: string[] = [];\n for (const file of files) {\n writeFileSync(join(root, file.path), file.content, 'utf8');\n created.push(file.path);\n }\n\n return { root, files: created };\n}\n\nfunction scaffoldFiles(name: string): ScaffoldFile[] {\n return [\n {\n path: 'package.json',\n content: `${JSON.stringify(\n {\n name,\n private: true,\n type: 'module',\n scripts: {\n dev: 'transone dev',\n build: 'transone build',\n typecheck: 'bunx tsc --noEmit',\n },\n dependencies: {\n 'transone': `^${TRANSONE_FRAMEWORK_VERSION}`,\n },\n devDependencies: {\n 'transone-cli': `^${TRANSONE_CLI_VERSION}`,\n },\n },\n null,\n 2\n )}\\n`,\n },\n {\n path: 'transone.config.ts',\n content: `import { defineConfig } from 'transone-cli';\\n\\nexport default defineConfig({\\n entry: 'src/main.ts',\\n});\\n`,\n },\n {\n path: 'tsconfig.json',\n content: `${JSON.stringify(\n {\n compilerOptions: {\n target: 'ESNext',\n module: 'ESNext',\n moduleResolution: 'Bundler',\n lib: ['ESNext', 'DOM', 'DOM.Iterable'],\n strict: true,\n noEmit: true,\n skipLibCheck: true,\n verbatimModuleSyntax: true,\n },\n include: ['src/**/*', 'transone.config.ts'],\n },\n null,\n 2\n )}\\n`,\n },\n {\n path: '.gitignore',\n content: 'node_modules/\\ndist/\\n',\n },\n {\n path: 'src/main.ts',\n content: `import { Component, createApp, h, type VNode } from 'transone';\\n\\nclass App extends Component<object, object> {\\n protected initState(): object {\\n return {};\\n }\\n\\n protected initStyles(): void {\\n this.styleManager.addStyle('app-body', {\\n selector: 'body',\\n properties: {\\n margin: 0,\\n background: '#f7fbf6',\\n color: '#142216',\\n fontFamily:\\n \"ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif\",\\n },\\n });\\n this.styleManager.addStyle('app-shell', {\\n selector: '.app-shell',\\n properties: {\\n alignItems: 'center',\\n display: 'flex',\\n flexDirection: 'column',\\n gap: '14px',\\n justifyContent: 'center',\\n minHeight: '100vh',\\n },\\n });\\n this.styleManager.addStyle('app-title', {\\n selector: '.app-title',\\n properties: {\\n fontSize: '64px',\\n letterSpacing: 0,\\n lineHeight: 1.05,\\n margin: 0,\\n },\\n });\\n this.styleManager.addStyle('app-link', {\\n selector: '.app-link',\\n properties: {\\n color: '#2f7c39',\\n fontSize: '16px',\\n textDecoration: 'none',\\n },\\n hover: {\\n textDecoration: 'underline',\\n },\\n });\\n }\\n\\n protected render(): VNode {\\n return h('main', { className: 'app-shell' }, [\\n h('h1', { className: 'app-title' }, ['TransOne']),\\n h(\\n 'a',\\n { className: 'app-link', href: '${GITHUB_URL}' },\\n ['GitHub']\\n ),\\n ]);\\n }\\n}\\n\\nexport const app = createApp({\\n root: App,\\n document: {\\n lang: 'zh-CN',\\n title: 'TransOne',\\n description: '轻量级纯 TypeScript 前端框架',\\n },\\n});\\n\\napp.mount();\\n`,\n },\n ];\n}\n",
|
|
20
|
-
"import { randomUUID } from 'node:crypto';\nimport {\n basename,\n extname,\n isAbsolute,\n relative,\n resolve,\n sep,\n} from 'node:path';\nimport { isEntryJavaScriptOutput, isStylesheetOutput } from './build-output';\nimport { resolveConfig } from './config';\nimport { createProxyHandler } from './proxy';\nimport { assertSafeSubdirectory } from './safe-path';\nimport { createFileWatcher, type FileWatcher } from './watch';\nimport type { ResolveConfigOptions, ResolvedConfig } from './types';\n\nconst DEVELOPMENT_URL_PREFIX = '/dev';\nconst INVALID_DEVELOPMENT_DIRECTORY_MESSAGE =\n 'Development output must be a subdirectory of the project root';\nconst LIVE_RELOAD_PATH = '/__transone/reload';\nconst WATCHED_EXTENSIONS = new Set([\n '.ts',\n '.js',\n '.mjs',\n '.cjs',\n '.json',\n '.css',\n '.html',\n]);\nconst IGNORED_WATCH_SEGMENTS = new Set([\n 'dist',\n 'node_modules',\n '.git',\n '.worktrees',\n]);\nconst LIVE_RELOAD_CLIENT_SCRIPT = [\n '<script type=\"module\">',\n 'const transoneReloadSource=new EventSource(',\n JSON.stringify(LIVE_RELOAD_PATH),\n ');',\n 'transoneReloadSource.addEventListener(\"reload\",()=>location.reload());',\n '</script>',\n].join('');\n\ntype DevServer = ReturnType<typeof Bun.serve>;\n\nexport interface StartDevServerOptions extends ResolveConfigOptions {\n watch?: boolean;\n}\n\nexport async function startDevServer(\n options: StartDevServerOptions = {}\n): Promise<DevServer> {\n if (options.watch) {\n return startWatchingDevServer(options);\n }\n const instance = await createServerInstance(options, false);\n return instance.server;\n}\n\nasync function startWatchingDevServer(\n options: StartDevServerOptions\n): Promise<DevServer> {\n let instance = await createServerInstance(options, true);\n let watcher = createProjectWatcher(instance, onChange);\n\n async function onChange(changedPath: string): Promise<void> {\n const configFile = instance.config.configFile;\n const configRelativePath =\n configFile === undefined\n ? undefined\n : toRelativePath(instance.config.root, configFile);\n if (configRelativePath === changedPath) {\n await restart();\n return;\n }\n await rebuildAndReload();\n }\n\n async function rebuildAndReload(): Promise<void> {\n const entries = [...new Set(Object.values(instance.config.pages))];\n instance.markDirty(entries);\n for (const entry of entries) {\n const bundle = await instance.getBundle(entry);\n if (bundle instanceof Response) {\n console.error('TransOne rebuild failed; keeping the last working page.');\n return;\n }\n }\n instance.liveReload?.broadcast();\n }\n\n async function restart(): Promise<void> {\n watcher.dispose();\n instance.server.stop(true);\n instance = await createServerInstance(options, true);\n watcher = createProjectWatcher(instance, onChange);\n console.log(\n `TransOne dev server restarted at http://${instance.server.hostname}:${instance.server.port}`\n );\n }\n\n return createServerHandle(\n () => instance,\n () => watcher.dispose()\n );\n}\n\nfunction createProjectWatcher(\n instance: DevServerInstance,\n onChange: (changedPath: string) => Promise<void>\n): FileWatcher {\n return createFileWatcher({\n root: instance.config.root,\n isRelevant: (relativePath) => isWatchedFile(instance, relativePath),\n onChange: (changedPath) => {\n void onChange(changedPath);\n },\n });\n}\n\ninterface DevServerInstance {\n server: DevServer;\n config: ResolvedConfig;\n getBundle: (entry: string) => Promise<DevelopmentBundle | Response>;\n markDirty: (entries: string[]) => void;\n liveReload: LiveReloadHub | undefined;\n}\n\nasync function createServerInstance(\n options: StartDevServerOptions,\n watch: boolean\n): Promise<DevServerInstance> {\n const config = await resolveConfig(options);\n // 动态加载:project.ts 依赖 'transone/dom'(框架 dist 的 DOM 渲染\n // 模块),仅在需要预渲染页面 HTML 时加载,避免 dev/build 其他路径被拖累。\n const { renderProjectHtml } = await import('./project');\n for (const [route, entry] of Object.entries(config.pages)) {\n await renderProjectHtml(config, {}, entry, route);\n }\n const developmentOutDir = resolve(config.root, 'dist', 'dev', 'h5');\n await assertSafeSubdirectory(\n config.root,\n developmentOutDir,\n INVALID_DEVELOPMENT_DIRECTORY_MESSAGE\n );\n const proxy = createProxyHandler(config.server.proxy);\n const sessionId = createGenerationId();\n const sessionOutDir = resolve(developmentOutDir, sessionId);\n const artifacts = new Map<string, DevelopmentOutput>();\n const buildProject = createDevelopmentBuilder(sessionId, sessionOutDir);\n const liveReload = watch ? createLiveReloadHub() : undefined;\n const bundles = new Map<string, DevelopmentBundle>();\n const dirtyEntries = new Set<string>();\n\n const getBundle = async (\n entry: string\n ): Promise<DevelopmentBundle | Response> => {\n const cached = bundles.get(entry);\n if (watch && cached !== undefined && !dirtyEntries.has(entry)) {\n return cached;\n }\n const bundle = await buildProject(entry);\n if (bundle instanceof Response) {\n if (watch) {\n dirtyEntries.add(entry);\n }\n return bundle;\n }\n if (watch) {\n bundles.set(entry, bundle);\n dirtyEntries.delete(entry);\n }\n return bundle;\n };\n\n const server = Bun.serve({\n hostname: config.server.host,\n port: config.server.port,\n fetch: async (request) => {\n const reloadResponse = liveReload?.handleRequest(request);\n if (reloadResponse) {\n return reloadResponse;\n }\n return (\n (await proxy(request)) ??\n serveProjectRequest(\n request,\n config,\n config.pages,\n getBundle,\n artifacts,\n liveReload\n )\n );\n },\n });\n\n return {\n server,\n config,\n getBundle,\n markDirty: (entries) => {\n entries.forEach((entry) => dirtyEntries.add(entry));\n },\n liveReload,\n };\n}\n\nfunction createServerHandle(\n getInstance: () => DevServerInstance,\n disposeWatcher: () => void\n): DevServer {\n return new Proxy({} as DevServer, {\n get(_target, property) {\n if (property === 'stop') {\n return (closeActiveConnections?: boolean) => {\n disposeWatcher();\n getInstance().server.stop(closeActiveConnections);\n };\n }\n const server = getInstance().server as unknown as Record<\n PropertyKey,\n unknown\n >;\n const value = server[property];\n return typeof value === 'function'\n ? (value as (...args: unknown[]) => unknown).bind(server)\n : value;\n },\n });\n}\n\nasync function serveProjectRequest(\n request: Request,\n config: ResolvedConfig,\n pages: Record<string, string>,\n getBundle: (entry: string) => Promise<DevelopmentBundle | Response>,\n artifacts: Map<string, DevelopmentOutput>,\n liveReload: LiveReloadHub | undefined\n): Promise<Response> {\n const pathname = new URL(request.url).pathname;\n const route = pageRouteForPathname(pages, pathname);\n\n if (route !== undefined) {\n const entry = pages[route];\n const bundle = await getBundle(entry);\n if (bundle instanceof Response) {\n return bundle;\n }\n\n try {\n const { renderProjectHtml } = await import('./project');\n const html = await renderProjectHtml(\n config,\n {\n head: bundle.stylesheets.map(({ pathname: href }) => ({\n tag: 'link',\n attributes: { rel: 'stylesheet', href },\n })),\n scripts: [{ type: 'module', src: bundle.entry.pathname }],\n },\n entry,\n route\n );\n publishDevelopmentBundle(bundle, artifacts);\n return new Response(liveReload ? injectLiveReloadScript(html) : html, {\n headers: {\n 'content-type': 'text/html; charset=utf-8',\n 'cache-control': 'no-store',\n },\n });\n } catch (error: unknown) {\n console.error(error);\n return buildFailureResponse();\n }\n }\n\n if (pathname === '/bundle.js') {\n const bundle = await getBundle(config.entry);\n if (bundle instanceof Response) {\n return bundle;\n }\n\n try {\n publishDevelopmentBundle(bundle, artifacts);\n return new Response(null, {\n status: 307,\n headers: {\n location: bundle.entry.pathname,\n 'cache-control': 'no-store',\n },\n });\n } catch (error: unknown) {\n console.error(error);\n return buildFailureResponse();\n }\n }\n\n const artifact = artifacts.get(pathname);\n if (artifact) {\n return new Response(Bun.file(artifact.filePath), {\n headers: {\n 'content-type': artifact.type,\n 'cache-control': 'no-store',\n },\n });\n }\n\n // SPA history fallback:H5 端使用 history 模式路由时,刷新/直达深层路径\n // (如 /rankings/metro)在服务端没有对应页面,回落到入口页由前端路由接管。\n // 排除 API 路径与带扩展名的静态资源请求。\n if (\n pathname !== '/' &&\n !pathname.startsWith('/api/') &&\n !/\\.[a-zA-Z0-9]+$/.test(pathname)\n ) {\n const bundle = await getBundle(config.entry);\n if (!(bundle instanceof Response)) {\n try {\n const { renderProjectHtml } = await import('./project');\n const html = await renderProjectHtml(\n config,\n {\n head: bundle.stylesheets.map(({ pathname: href }) => ({\n tag: 'link',\n attributes: { rel: 'stylesheet', href },\n })),\n scripts: [{ type: 'module', src: bundle.entry.pathname }],\n },\n config.entry,\n '/'\n );\n publishDevelopmentBundle(bundle, artifacts);\n return new Response(liveReload ? injectLiveReloadScript(html) : html, {\n headers: {\n 'content-type': 'text/html; charset=utf-8',\n 'cache-control': 'no-store',\n },\n });\n } catch (error: unknown) {\n console.error(error);\n return buildFailureResponse();\n }\n }\n }\n\n return new Response('Not found', {\n status: 404,\n headers: { 'cache-control': 'no-store' },\n });\n}\n\nfunction pageRouteForPathname(\n pages: Record<string, string>,\n pathname: string\n): string | undefined {\n if (pages[pathname] !== undefined) {\n return pathname;\n }\n if (pathname === '/index.html') {\n return '/';\n }\n const candidate =\n pathname.length > 1 && pathname.endsWith('/')\n ? pathname.replace(/\\/+$/, '')\n : pathname;\n if (pages[candidate] !== undefined) {\n return candidate;\n }\n if (candidate.endsWith('/index.html')) {\n const base = candidate.slice(0, candidate.length - '/index.html'.length);\n if (base === '') {\n return '/';\n }\n if (pages[base] !== undefined) {\n return base;\n }\n }\n return undefined;\n}\n\nfunction injectLiveReloadScript(html: string): string {\n if (html.includes(LIVE_RELOAD_PATH)) {\n return html;\n }\n if (html.includes('</body>')) {\n return html.replace('</body>', `${LIVE_RELOAD_CLIENT_SCRIPT}</body>`);\n }\n return html + LIVE_RELOAD_CLIENT_SCRIPT;\n}\n\ninterface LiveReloadHub {\n handleRequest(request: Request): Response | undefined;\n broadcast(): void;\n}\n\nconst reloadEncoder = new TextEncoder();\n\nfunction createLiveReloadHub(): LiveReloadHub {\n const controllers = new Set<ReadableStreamDefaultController<Uint8Array>>();\n\n function handleRequest(request: Request): Response | undefined {\n if (new URL(request.url).pathname !== LIVE_RELOAD_PATH) {\n return undefined;\n }\n\n let streamController:\n ReadableStreamDefaultController<Uint8Array> | undefined;\n const stream = new ReadableStream<Uint8Array>({\n start: (controller) => {\n streamController = controller;\n controllers.add(controller);\n try {\n controller.enqueue(reloadEncoder.encode(': connected\\n\\n'));\n } catch {\n controllers.delete(controller);\n }\n },\n cancel: () => {\n if (streamController) {\n controllers.delete(streamController);\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-store',\n },\n });\n }\n\n function broadcast(): void {\n const message = reloadEncoder.encode('event: reload\\ndata: {}\\n\\n');\n for (const controller of [...controllers]) {\n try {\n controller.enqueue(message);\n } catch {\n controllers.delete(controller);\n }\n }\n }\n\n return { handleRequest, broadcast };\n}\n\nfunction isWatchedFile(\n instance: DevServerInstance,\n relativePath: string\n): boolean {\n if (relativePath === '' || relativePath.startsWith('..')) {\n return false;\n }\n const segments = relativePath.split('/');\n if (segments.some((segment) => IGNORED_WATCH_SEGMENTS.has(segment))) {\n return false;\n }\n const absolutePath = resolve(instance.config.root, relativePath);\n if (isWithinOrEqual(instance.config.build.outDir, absolutePath)) {\n return false;\n }\n const base = basename(absolutePath);\n if (base.startsWith('.') && absolutePath !== instance.config.configFile) {\n return false;\n }\n return WATCHED_EXTENSIONS.has(extname(base).toLowerCase());\n}\n\nfunction toRelativePath(root: string, absolutePath: string): string {\n return relative(root, absolutePath).split(sep).join('/');\n}\n\nfunction isWithinOrEqual(parent: string, candidate: string): boolean {\n const pathFromParent = relative(parent, candidate);\n return (\n pathFromParent === '' ||\n (pathFromParent !== '..' &&\n !pathFromParent.startsWith(`..${sep}`) &&\n !isAbsolute(pathFromParent))\n );\n}\n\ninterface DevelopmentOutput {\n filePath: string;\n pathname: string;\n type: string;\n}\n\ninterface DevelopmentBundle {\n entry: DevelopmentOutput;\n stylesheets: DevelopmentOutput[];\n artifacts: ReadonlyMap<string, DevelopmentOutput>;\n}\n\nfunction createDevelopmentBuilder(\n sessionId: string,\n sessionOutDir: string\n): (entry: string) => Promise<DevelopmentBundle | Response> {\n let queue = Promise.resolve();\n\n return (entry) => {\n const result = queue.then(() =>\n buildProjectBundle(entry, sessionId, sessionOutDir)\n );\n queue = result.then(\n () => undefined,\n () => undefined\n );\n return result;\n };\n}\n\nasync function buildProjectBundle(\n entry: string,\n sessionId: string,\n sessionOutDir: string\n): Promise<DevelopmentBundle | Response> {\n const generationId = createGenerationId();\n const generationOutDir = resolve(sessionOutDir, generationId);\n const generationUrl = `${DEVELOPMENT_URL_PREFIX}/${sessionId}/${generationId}`;\n const buildOptions = {\n entrypoints: [entry],\n outdir: generationOutDir,\n target: 'browser' as const,\n format: 'esm' as const,\n sourcemap: 'inline' as const,\n write: true,\n throw: false,\n publicPath: `${generationUrl}/`,\n naming: {\n entry: '[name]-[hash].[ext]',\n chunk: '[name]-[hash].[ext]',\n asset: 'assets/[name]-[hash].[ext]',\n },\n };\n\n try {\n const result = await Bun.build(buildOptions);\n const entryArtifact = result.outputs.find(isEntryJavaScriptOutput);\n if (!result.success || !entryArtifact) {\n result.logs.forEach((log) => console.error(log));\n if (!entryArtifact) {\n console.error('Failed to build project bundle: no JavaScript output');\n }\n return buildFailureResponse();\n }\n\n const pendingArtifacts = new Map<string, DevelopmentOutput>();\n const outputs = new Map<\n Awaited<ReturnType<typeof Bun.build>>['outputs'][number],\n DevelopmentOutput\n >();\n\n for (const output of result.outputs) {\n const developmentOutput = createDevelopmentOutput(\n generationOutDir,\n generationUrl,\n output\n );\n if (pendingArtifacts.has(developmentOutput.pathname)) {\n throw new Error(\n `Development output URL collision: ${developmentOutput.pathname}`\n );\n }\n pendingArtifacts.set(developmentOutput.pathname, developmentOutput);\n outputs.set(output, developmentOutput);\n }\n\n const entry = outputs.get(entryArtifact);\n if (!entry) {\n throw new Error('Development entry output was not indexed');\n }\n\n return {\n entry,\n stylesheets: result.outputs\n .filter(isStylesheetOutput)\n .map((output) => outputs.get(output))\n .filter((output): output is DevelopmentOutput => output !== undefined),\n artifacts: pendingArtifacts,\n };\n } catch (error: unknown) {\n console.error(error);\n return buildFailureResponse();\n }\n}\n\nfunction publishDevelopmentBundle(\n bundle: DevelopmentBundle,\n artifacts: Map<string, DevelopmentOutput>\n): void {\n for (const [pathname, output] of bundle.artifacts) {\n const existing = artifacts.get(pathname);\n if (existing) {\n if (existing.filePath === output.filePath) {\n continue;\n }\n throw new Error(`Development output URL collision: ${pathname}`);\n }\n artifacts.set(pathname, output);\n }\n}\n\nfunction createDevelopmentOutput(\n generationOutDir: string,\n generationUrl: string,\n output: Awaited<ReturnType<typeof Bun.build>>['outputs'][number]\n): DevelopmentOutput {\n const filePath = resolve(output.path);\n const pathFromGeneration = relative(generationOutDir, filePath);\n if (\n pathFromGeneration === '' ||\n pathFromGeneration === '..' ||\n pathFromGeneration.startsWith(`..${sep}`) ||\n isAbsolute(pathFromGeneration)\n ) {\n throw new Error(\n `Development output must not escape outside its generation directory: ${output.path}`\n );\n }\n\n const urlPath = pathFromGeneration\n .split(sep)\n .map((segment) => encodeURIComponent(segment))\n .join('/');\n\n return {\n filePath,\n pathname: `${generationUrl}/${urlPath}`,\n type: output.type,\n };\n}\n\nfunction createGenerationId(): string {\n return randomUUID().replace(/-/g, '');\n}\n\nfunction buildFailureResponse(): Response {\n return new Response('Failed to build project bundle', {\n status: 500,\n headers: { 'cache-control': 'no-store' },\n });\n}\n",
|
|
21
|
-
"import type { ProxyOptions, ServerConfig } from './types';\n\nconst HOP_BY_HOP_HEADERS = new Set([\n 'connection',\n 'keep-alive',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'te',\n 'trailer',\n 'transfer-encoding',\n 'upgrade',\n]);\n\ninterface ProxyRule {\n prefix: string;\n target: URL;\n changeOrigin: boolean;\n rewrite?: (path: string) => string;\n}\n\nexport function createProxyHandler(\n proxy: ServerConfig['proxy']\n): (request: Request) => Promise<Response | undefined> {\n const rules = Object.entries(proxy ?? {})\n .map(([prefix, options]) => toProxyRule(prefix, options))\n .sort((first, second) => second.prefix.length - first.prefix.length);\n\n return async (request) => {\n const sourceUrl = new URL(request.url);\n const rule = rules.find(({ prefix }) =>\n sourceUrl.pathname.startsWith(prefix)\n );\n\n if (!rule) {\n return undefined;\n }\n\n const target = createTargetUrl(rule, sourceUrl);\n const headers = createRequestHeaders(request, sourceUrl, rule, target);\n const body =\n request.method === 'GET' || request.method === 'HEAD'\n ? undefined\n : request.body;\n\n try {\n const upstream = await fetch(target, {\n method: request.method,\n headers,\n body,\n signal: request.signal,\n redirect: 'manual',\n });\n\n return new Response(upstream.body, {\n status: upstream.status,\n statusText: upstream.statusText,\n headers: filterHeaders(upstream.headers),\n });\n } catch {\n return new Response('Bad Gateway', { status: 502 });\n }\n };\n}\n\nfunction toProxyRule(prefix: string, value: string | ProxyOptions): ProxyRule {\n const options = typeof value === 'string' ? { target: value } : value;\n\n return {\n prefix,\n target: new URL(options.target),\n changeOrigin: options.changeOrigin ?? false,\n ...(options.rewrite === undefined ? {} : { rewrite: options.rewrite }),\n };\n}\n\nfunction createTargetUrl(rule: ProxyRule, sourceUrl: URL): URL {\n const target = new URL(rule.target);\n const pathname = rule.rewrite?.(sourceUrl.pathname) ?? sourceUrl.pathname;\n\n target.pathname = joinPathnames(target.pathname, pathname);\n target.search = sourceUrl.search;\n return target;\n}\n\nfunction joinPathnames(basePathname: string, pathname: string): string {\n const base = basePathname === '/' ? '' : basePathname.replace(/\\/+$/, '');\n const path = pathname.startsWith('/') ? pathname : `/${pathname}`;\n\n return `${base}${path}` || '/';\n}\n\nfunction createRequestHeaders(\n request: Request,\n sourceUrl: URL,\n rule: ProxyRule,\n target: URL\n): Headers {\n const headers = filterHeaders(request.headers);\n const incomingHost = request.headers.get('host') ?? sourceUrl.host;\n\n headers.set('host', rule.changeOrigin ? target.host : incomingHost);\n return headers;\n}\n\nfunction filterHeaders(source: Headers): Headers {\n const headers = new Headers(source);\n const connection = headers.get('connection');\n\n if (connection) {\n connection.split(',').forEach((header) => {\n const name = header.trim();\n if (name) {\n headers.delete(name);\n }\n });\n }\n\n HOP_BY_HOP_HEADERS.forEach((header) => headers.delete(header));\n return headers;\n}\n",
|
|
22
|
-
"import { watch, type FSWatcher } from 'node:fs';\nimport { readdir, stat } from 'node:fs/promises';\nimport { isAbsolute, join, relative } from 'node:path';\n\nconst RECURSIVE_WATCH_UNSUPPORTED_ERROR = 'ERR_FEATURE_UNAVAILABLE_ON_PLATFORM';\nconst DEFAULT_DEBOUNCE_MS = 100;\nconst DEFAULT_POLL_INTERVAL_MS = 300;\n\nexport interface FileWatcherOptions {\n root: string;\n isRelevant: (relativePath: string) => boolean;\n onChange: (changedPath: string) => void;\n debounceMs?: number;\n pollIntervalMs?: number;\n}\n\nexport interface FileWatcher {\n dispose: () => void;\n}\n\nexport function createFileWatcher(options: FileWatcherOptions): FileWatcher {\n const debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const disposers: Array<() => void> = [];\n\n const scheduleChange = (relativePath: string): void => {\n if (timer) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n timer = undefined;\n options.onChange(relativePath);\n }, debounceMs);\n };\n\n disposers.push(() => {\n if (timer) {\n clearTimeout(timer);\n }\n });\n\n const nativeWatcher = tryCreateNativeWatcher(\n options.root,\n options.isRelevant,\n scheduleChange\n );\n if (nativeWatcher) {\n disposers.push(nativeWatcher);\n } else {\n disposers.push(\n createPollingWatcher(\n options.root,\n options.isRelevant,\n options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,\n scheduleChange\n )\n );\n }\n\n return {\n dispose: () => {\n disposers.splice(0).reverse().forEach((dispose) => dispose());\n },\n };\n}\n\nfunction tryCreateNativeWatcher(\n root: string,\n isRelevant: (relativePath: string) => boolean,\n onRelevantChange: (relativePath: string) => void\n): (() => void) | undefined {\n let watcher: FSWatcher;\n try {\n watcher = watch(root, { recursive: true }, (_event, filename) => {\n if (typeof filename !== 'string') {\n return;\n }\n const relativePath = toRelativePath(root, filename);\n if (relativePath === undefined || !isRelevant(relativePath)) {\n return;\n }\n onRelevantChange(relativePath);\n });\n } catch (error: unknown) {\n if (isRecursiveWatchUnsupported(error)) {\n return undefined;\n }\n throw error;\n }\n\n return () => watcher.close();\n}\n\nfunction createPollingWatcher(\n root: string,\n isRelevant: (relativePath: string) => boolean,\n intervalMs: number,\n onRelevantChange: (relativePath: string) => void\n): () => void {\n let running = true;\n let snapshot = new Map<string, FileSnapshot>();\n let timer: ReturnType<typeof setInterval> | undefined;\n\n const scan = async (): Promise<void> => {\n if (!running) {\n return;\n }\n const next = new Map<string, FileSnapshot>();\n try {\n await collectRelevantFiles(root, isRelevant, next);\n } catch {\n return;\n }\n\n let changedPath: string | undefined;\n for (const [relativePath, snapshotEntry] of next) {\n const previous = snapshot.get(relativePath);\n if (\n !previous ||\n previous.mtimeMs !== snapshotEntry.mtimeMs ||\n previous.size !== snapshotEntry.size\n ) {\n changedPath = relativePath;\n break;\n }\n }\n if (changedPath === undefined) {\n for (const relativePath of snapshot.keys()) {\n if (!next.has(relativePath)) {\n changedPath = relativePath;\n break;\n }\n }\n }\n snapshot = next;\n if (changedPath !== undefined) {\n onRelevantChange(changedPath);\n }\n };\n\n void scan();\n timer = setInterval(() => {\n void scan();\n }, intervalMs);\n if (typeof timer.unref === 'function') {\n timer.unref();\n }\n\n return () => {\n running = false;\n if (timer) {\n clearInterval(timer);\n }\n };\n}\n\ninterface FileSnapshot {\n mtimeMs: number;\n size: number;\n}\n\nasync function collectRelevantFiles(\n root: string,\n isRelevant: (relativePath: string) => boolean,\n output: Map<string, FileSnapshot>\n): Promise<void> {\n const pendingDirectories = [''];\n while (pendingDirectories.length > 0) {\n const relativeDirectory = pendingDirectories.pop();\n if (relativeDirectory === undefined) {\n break;\n }\n const absoluteDirectory = join(root, relativeDirectory);\n let entries;\n try {\n entries = await readdir(absoluteDirectory, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const relativePath =\n relativeDirectory === '' ? entry.name : `${relativeDirectory}/${entry.name}`;\n if (entry.isDirectory()) {\n pendingDirectories.push(relativePath);\n continue;\n }\n if (!entry.isFile() || !isRelevant(relativePath)) {\n continue;\n }\n try {\n const info = await stat(join(root, relativePath));\n output.set(relativePath, { mtimeMs: info.mtimeMs, size: info.size });\n } catch {\n // The file vanished while the tree was being scanned.\n }\n }\n }\n}\n\nfunction toRelativePath(root: string, filename: string): string | undefined {\n const relativePath = isAbsolute(filename)\n ? relative(root, filename)\n : filename.split('\\\\').join('/');\n if (relativePath === '' || relativePath === '..' || relativePath.startsWith('../')) {\n return undefined;\n }\n return relativePath.split('\\\\').join('/');\n}\n\nfunction isRecursiveWatchUnsupported(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === RECURSIVE_WATCH_UNSUPPORTED_ERROR\n );\n}\n"
|
|
23
|
-
],
|
|
24
|
-
"mappings": "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",
|
|
25
|
-
"debugId": "5C8800968D2B97E564756E2164756E21",
|
|
26
|
-
"names": []
|
|
27
|
-
}
|