@playcraft/common 0.0.31 → 0.0.33

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/dist/index.d.ts CHANGED
@@ -13,4 +13,7 @@ export * from './agent-tools/index.js';
13
13
  export * from './prefab/index.js';
14
14
  export * from './search/index.js';
15
15
  export * from './recommend/index.js';
16
+ export * from './queue/email-queue.js';
17
+ export * from './queue/remix-cover-queue.js';
18
+ export * from './preview/phone-preview-dimensions.js';
16
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uCAAuC,CAAC"}
package/dist/index.js CHANGED
@@ -13,4 +13,7 @@ export * from './agent-tools/index.js';
13
13
  export * from './prefab/index.js';
14
14
  export * from './search/index.js';
15
15
  export * from './recommend/index.js';
16
+ export * from './queue/email-queue.js';
17
+ export * from './queue/remix-cover-queue.js';
18
+ export * from './preview/phone-preview-dimensions.js';
16
19
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uCAAuC,CAAC"}
@@ -1,6 +1,16 @@
1
1
  export declare const THEME_DIR = "src/theme";
2
2
  export declare const THEME_SCHEMA_PATH = "src/theme/theme.schema.json5";
3
3
  export declare const THEME_INDEX_PATH = "src/theme/index.ts";
4
+ /**
5
+ * `i18n.platform.json5`:仅供前端配置平台 UI 解析 schema 中
6
+ * `title: 'i18n.xplatform.<key>'` 引用,**永不写入**。
7
+ */
8
+ export declare const THEME_I18N_PLATFORM_PATH = "src/theme/i18n.platform.json5";
9
+ /**
10
+ * `i18n.runtime.json5`:SDK 运行时替换 `xplatform.value_type === 'i18n'`
11
+ * 字段值的多语言文案数据源。前端可读可写。
12
+ */
13
+ export declare const THEME_I18N_RUNTIME_PATH = "src/theme/i18n.runtime.json5";
4
14
  export declare function themeDataPath(themeId: string): string;
5
15
  export declare const DEFAULT_GAME_PATH = "assets/DefaultGame.json";
6
16
  export declare const MANIFEST_PATH = "manifest.json";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/prefab/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,cAAc,CAAC;AACrC,eAAO,MAAM,iBAAiB,iCAAiC,CAAC;AAChE,eAAO,MAAM,gBAAgB,uBAAuB,CAAC;AAErD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAID,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAC3D,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,gBAAgB,uBAAuB,CAAC;AACrD,eAAO,MAAM,UAAU,WAAW,CAAC;AACnC,eAAO,MAAM,2BAA2B,0CAA0C,CAAC;AAEnF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/prefab/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,cAAc,CAAC;AACrC,eAAO,MAAM,iBAAiB,iCAAiC,CAAC;AAChE,eAAO,MAAM,gBAAgB,uBAAuB,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,wBAAwB,kCAAkC,CAAC;AAExE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,iCAAiC,CAAC;AAEtE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAID,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAC3D,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,gBAAgB,uBAAuB,CAAC;AACrD,eAAO,MAAM,UAAU,WAAW,CAAC;AACnC,eAAO,MAAM,2BAA2B,0CAA0C,CAAC;AAEnF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD"}
@@ -2,6 +2,16 @@
2
2
  export const THEME_DIR = 'src/theme';
3
3
  export const THEME_SCHEMA_PATH = 'src/theme/theme.schema.json5';
4
4
  export const THEME_INDEX_PATH = 'src/theme/index.ts';
5
+ /**
6
+ * `i18n.platform.json5`:仅供前端配置平台 UI 解析 schema 中
7
+ * `title: 'i18n.xplatform.<key>'` 引用,**永不写入**。
8
+ */
9
+ export const THEME_I18N_PLATFORM_PATH = 'src/theme/i18n.platform.json5';
10
+ /**
11
+ * `i18n.runtime.json5`:SDK 运行时替换 `xplatform.value_type === 'i18n'`
12
+ * 字段值的多语言文案数据源。前端可读可写。
13
+ */
14
+ export const THEME_I18N_RUNTIME_PATH = 'src/theme/i18n.runtime.json5';
5
15
  export function themeDataPath(themeId) {
6
16
  return `src/theme/${themeId}/theme.data.json5`;
7
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/prefab/constants.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAErD,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,aAAa,OAAO,mBAAmB,CAAC;AACjD,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAC3D,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AACrD,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AACnC,MAAM,CAAC,MAAM,2BAA2B,GAAG,uCAAuC,CAAC;AAEnF,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,GAAG,2BAA2B,IAAI,OAAO,gBAAgB,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,GAAG,UAAU,IAAI,OAAO,OAAO,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/prefab/constants.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,+BAA+B,CAAC;AAExE;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,8BAA8B,CAAC;AAEtE,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,aAAa,OAAO,mBAAmB,CAAC;AACjD,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAC3D,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AACrD,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AACnC,MAAM,CAAC,MAAM,2BAA2B,GAAG,uCAAuC,CAAC;AAEnF,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,GAAG,2BAA2B,IAAI,OAAO,gBAAgB,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,GAAG,UAAU,IAAI,OAAO,OAAO,CAAC;AACzC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export * from './constants.js';
2
2
  export * from './types.js';
3
3
  export * from './theme-schema-parser.js';
4
+ export * from './schema-walker.js';
4
5
  export * from './extension-parser.js';
5
6
  export * from './scene-resolver.js';
6
7
  export * from './validator.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prefab/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prefab/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export * from './constants.js';
2
2
  export * from './types.js';
3
3
  export * from './theme-schema-parser.js';
4
+ export * from './schema-walker.js';
4
5
  export * from './extension-parser.js';
5
6
  export * from './scene-resolver.js';
6
7
  export * from './validator.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prefab/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prefab/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Schema 遍历与字段抽取工具(纯函数,无 IO)
3
+ *
4
+ * 用于 Remix 编辑器右侧"配置属性"面板:
5
+ * - 从 theme.schema.json5 派生「美术资源」清单
6
+ * - 解析 `xplatform.value_type === 'path' | 'i18n'` 字段
7
+ * - 解析 `i18n.xplatform.*` 标题引用
8
+ *
9
+ * 设计原则:
10
+ * - 全部纯函数,无 DOM/IO 依赖
11
+ * - 不可变更新(getByPath/setByPath 不修改入参)
12
+ * - 容忍未知 schema 结构,遇到非法/缺失节点静默返回安全默认值
13
+ */
14
+ import type { JsonSchemaNode } from './types.js';
15
+ /** 美术资源类型分类 */
16
+ export type MediaKind = 'image' | 'audio' | 'video' | 'text' | 'other';
17
+ /** 一个被识别为"美术资源"的 schema 字段 */
18
+ export interface AssetFieldInfo {
19
+ /** 字段在 themeData 中的访问路径(不含根对象本身) */
20
+ path: string[];
21
+ /** 字段对应的 schema 节点 */
22
+ schema: JsonSchemaNode;
23
+ /** 原始 mime_type(如 `image/webp`),可能缺失 */
24
+ mimeType?: string;
25
+ /** 由 mime_type 推导的分类 */
26
+ mediaKind: MediaKind;
27
+ }
28
+ /** 一个最终展示给用户的资产条目(合并 themeData.assets 块 + schema 内联字段后) */
29
+ export interface AssetItem {
30
+ /** 实际路径值(如 `./assets/ui-logo.webp`),空字符串表示未配置 */
31
+ value: string;
32
+ /** 分类(推断自 mime_type,或按扩展名兜底) */
33
+ mediaKind: MediaKind;
34
+ /** 来源 */
35
+ source: 'assets-block' | 'inline';
36
+ /** schema 字段路径(仅 inline 来源有;assets-block 没有 schema 对应位置) */
37
+ fieldPath?: string[];
38
+ /** schema 节点(仅 inline 来源有,供详情面板读取 mime_type 等元数据) */
39
+ schema?: JsonSchemaNode;
40
+ /** 是否未配置(value 为空,仅占位显示) */
41
+ empty?: boolean;
42
+ }
43
+ /**
44
+ * 按路径读取嵌套对象的值;任一环节缺失则返回 undefined。
45
+ *
46
+ * @example
47
+ * getByPath({ a: { b: 1 } }, ['a', 'b']) // → 1
48
+ * getByPath({}, ['a', 'b']) // → undefined
49
+ */
50
+ export declare function getByPath(obj: unknown, path: ReadonlyArray<string>): unknown;
51
+ /**
52
+ * 按路径不可变地设置嵌套值,返回新对象。空路径会用 value 替换根。
53
+ *
54
+ * - 路径上不存在或非对象的中间节点会被替换为新对象
55
+ * - 不修改入参 obj
56
+ *
57
+ * @example
58
+ * setByPath({ a: 1 }, ['b', 'c'], 2) // → { a: 1, b: { c: 2 } }
59
+ */
60
+ export declare function setByPath<T>(obj: T, path: ReadonlyArray<string>, value: unknown): T;
61
+ /**
62
+ * 深度优先遍历 schema,产出每个**叶子或可识别字段**的 path + schema。
63
+ *
64
+ * 遍历策略:
65
+ * - `type === 'object'` 且有 properties → 进入子节点(**自身不产出**)
66
+ * - 其它节点 → 作为叶子产出
67
+ *
68
+ * 注:只处理 properties,不处理 JSON Schema 的 patternProperties / additionalProperties。
69
+ */
70
+ export declare function walkSchemaFields(root: JsonSchemaNode | undefined): Array<{
71
+ path: string[];
72
+ schema: JsonSchemaNode;
73
+ }>;
74
+ /**
75
+ * 抽取所有 `xplatform.value_type === 'path'` 的字段。
76
+ */
77
+ export declare function extractAssetFields(root: JsonSchemaNode | undefined): AssetFieldInfo[];
78
+ /**
79
+ * 抽取所有文本类型字段(string / i18n)。
80
+ * 排除:path 字段、颜色字段、非 string 类型。
81
+ */
82
+ export declare function extractTextFields(root: JsonSchemaNode | undefined): AssetFieldInfo[];
83
+ /**
84
+ * 合并 themeData.assets 块 + schema 内联字段,按路径值去重。
85
+ *
86
+ * 规则(来自数据契约 §2.7):
87
+ * Step A: themeData.assets 块(如果存在)入 Map,source='assets-block'
88
+ * Step B: 全树扫描 schema,找 xplatform.value_type==='path' 字段
89
+ * Step C: 对每个字段,从 themeData 按 path 取实际值
90
+ * Step D: 与 A 按 value 去重;A 中已有的不被 inline 覆盖
91
+ * Step E: mime_type 分组(已在 mediaKind 里完成)
92
+ *
93
+ * @param schema 解析后的 theme.schema.json5 根节点
94
+ * @param themeData 解析后的 theme.data.json5 内容
95
+ */
96
+ export declare function collectThemeAssets(schema: JsonSchemaNode | undefined, themeData: Record<string, unknown> | null | undefined): AssetItem[];
97
+ /**
98
+ * 根据字段在 schema 中的路径,自动去 i18n.xplatform.json5 中查找 title/description。
99
+ *
100
+ * 查找规则:
101
+ * 路径 ['gamePlay', 'layout', 'preset']
102
+ * → i18nPlatform.gamePlay.layout.preset._self.title[locale]
103
+ * → fallback i18nPlatform.gamePlay.layout.preset._self.title['en']
104
+ * → undefined(调用方使用 schema 原值)
105
+ *
106
+ * @param fieldPath 字段在 schema 中的完整路径(如 ['gamePlay', 'layout'])
107
+ * @param prop 要解析的属性名:'title' 或 'description'
108
+ * @param platformI18n i18n.xplatform.json5 解析后的对象
109
+ * @param locale 当前语言
110
+ * @returns 解析后的文本;undefined 表示未找到(调用方用 schema 原值 fallback)
111
+ */
112
+ export declare function resolveSchemaI18nByPath(fieldPath: ReadonlyArray<string>, prop: 'title' | 'description', platformI18n: Record<string, unknown> | null | undefined, locale: 'en' | 'zh'): string | undefined;
113
+ /**
114
+ * 判定字段值是否是 `i18n.runtime.<key>` 引用,是则返回 key。
115
+ *
116
+ * 只识别字符串形态,对象/数字等返回 null。
117
+ */
118
+ export declare function parseRuntimeI18nRef(rawValue: unknown): string | null;
119
+ /**
120
+ * 从 i18n.runtime.json5 解析结果中取出某个 key 的多语言对象。
121
+ *
122
+ * - 不存在 → undefined(前端应初始化为空对象)
123
+ * - 存在但非 object → undefined(数据异常,按不存在处理)
124
+ * - 字段值非字符串 → 过滤掉(仅保留 string-string 映射)
125
+ */
126
+ export declare function getRuntimeI18nEntry(key: string, runtimeI18n: Record<string, unknown> | null | undefined): Record<string, string> | undefined;
127
+ /**
128
+ * 解析 i18n.runtime 字段值,返回当前 locale 下的实际文案(用于预览展示)。
129
+ *
130
+ * Fallback 顺序:
131
+ * 1. rawValue 不是 i18n.runtime 引用 → 原样返回(前提是 string)
132
+ * 2. 是引用且能查到当前 locale → 当前 locale 值
133
+ * 3. 当前 locale 缺失但 'en' 存在 → 'en' 值
134
+ * 4. 都没有 → undefined
135
+ */
136
+ export declare function resolveRuntimeI18nValue(rawValue: unknown, runtimeI18n: Record<string, unknown> | null | undefined, locale: 'en' | 'zh'): string | undefined;
137
+ //# sourceMappingURL=schema-walker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-walker.d.ts","sourceRoot":"","sources":["../../src/prefab/schema-walker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,422 @@
1
+ /**
2
+ * Schema 遍历与字段抽取工具(纯函数,无 IO)
3
+ *
4
+ * 用于 Remix 编辑器右侧"配置属性"面板:
5
+ * - 从 theme.schema.json5 派生「美术资源」清单
6
+ * - 解析 `xplatform.value_type === 'path' | 'i18n'` 字段
7
+ * - 解析 `i18n.xplatform.*` 标题引用
8
+ *
9
+ * 设计原则:
10
+ * - 全部纯函数,无 DOM/IO 依赖
11
+ * - 不可变更新(getByPath/setByPath 不修改入参)
12
+ * - 容忍未知 schema 结构,遇到非法/缺失节点静默返回安全默认值
13
+ */
14
+ // ─── 内部工具 ──────────────────────────────────────────────────────────────────
15
+ const I18N_XPLATFORM_PREFIX = 'i18n.xplatform.';
16
+ const I18N_RUNTIME_PREFIX = 'i18n.runtime.';
17
+ function isPlainObject(v) {
18
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
19
+ }
20
+ function getXplatform(schema) {
21
+ return schema.xplatform;
22
+ }
23
+ function inferMediaKind(mimeType, value) {
24
+ if (mimeType) {
25
+ if (mimeType.startsWith('image/'))
26
+ return 'image';
27
+ if (mimeType.startsWith('audio/'))
28
+ return 'audio';
29
+ if (mimeType.startsWith('video/'))
30
+ return 'video';
31
+ }
32
+ // 按文件名扩展名兜底(assets 块内通常没有 schema 信息)
33
+ if (value) {
34
+ const lower = value.toLowerCase();
35
+ if (/\.(png|jpe?g|gif|webp|bmp|svg|cubemap)$/.test(lower))
36
+ return 'image';
37
+ if (/\.(mp3|wav|ogg|flac|aac|m4a)$/.test(lower))
38
+ return 'audio';
39
+ if (/\.(mp4|webm|mov|avi|mkv)$/.test(lower))
40
+ return 'video';
41
+ }
42
+ return 'other';
43
+ }
44
+ /**
45
+ * 判断字段是否为颜色字段(应被文本扫描排除)。
46
+ * 依据:字段名含 'color'(忽略大小写)或 schema.default 以 '#' 开头。
47
+ */
48
+ function isColorField(name, schema) {
49
+ if (/color/i.test(name))
50
+ return true;
51
+ const def = schema.default;
52
+ if (typeof def === 'string' && def.startsWith('#'))
53
+ return true;
54
+ return false;
55
+ }
56
+ // ─── 路径取值/赋值(不可变) ───────────────────────────────────────────────────
57
+ /**
58
+ * 按路径读取嵌套对象的值;任一环节缺失则返回 undefined。
59
+ *
60
+ * @example
61
+ * getByPath({ a: { b: 1 } }, ['a', 'b']) // → 1
62
+ * getByPath({}, ['a', 'b']) // → undefined
63
+ */
64
+ export function getByPath(obj, path) {
65
+ let cur = obj;
66
+ for (const seg of path) {
67
+ if (!isPlainObject(cur))
68
+ return undefined;
69
+ cur = cur[seg];
70
+ }
71
+ return cur;
72
+ }
73
+ function getThemeValueBySchemaPath(obj, path) {
74
+ const exact = getByPath(obj, path);
75
+ if (exact !== undefined || path.length === 0)
76
+ return exact;
77
+ const [root, ...rest] = path;
78
+ if (root !== 'gameplay' && root !== 'gamePlay')
79
+ return exact;
80
+ const alternateRoot = root === 'gameplay' ? 'gamePlay' : 'gameplay';
81
+ return getByPath(obj, [alternateRoot, ...rest]);
82
+ }
83
+ /**
84
+ * 按路径不可变地设置嵌套值,返回新对象。空路径会用 value 替换根。
85
+ *
86
+ * - 路径上不存在或非对象的中间节点会被替换为新对象
87
+ * - 不修改入参 obj
88
+ *
89
+ * @example
90
+ * setByPath({ a: 1 }, ['b', 'c'], 2) // → { a: 1, b: { c: 2 } }
91
+ */
92
+ export function setByPath(obj, path, value) {
93
+ if (path.length === 0)
94
+ return value;
95
+ const root = isPlainObject(obj) ? { ...obj } : {};
96
+ let cur = root;
97
+ for (let i = 0; i < path.length - 1; i++) {
98
+ const seg = path[i];
99
+ const next = cur[seg];
100
+ cur[seg] = isPlainObject(next) ? { ...next } : {};
101
+ cur = cur[seg];
102
+ }
103
+ cur[path[path.length - 1]] = value;
104
+ return root;
105
+ }
106
+ // ─── Schema 遍历 ──────────────────────────────────────────────────────────────
107
+ /**
108
+ * 深度优先遍历 schema,产出每个**叶子或可识别字段**的 path + schema。
109
+ *
110
+ * 遍历策略:
111
+ * - `type === 'object'` 且有 properties → 进入子节点(**自身不产出**)
112
+ * - 其它节点 → 作为叶子产出
113
+ *
114
+ * 注:只处理 properties,不处理 JSON Schema 的 patternProperties / additionalProperties。
115
+ */
116
+ export function walkSchemaFields(root) {
117
+ const out = [];
118
+ if (!root)
119
+ return out;
120
+ const stack = [
121
+ { node: root, path: [] },
122
+ ];
123
+ while (stack.length > 0) {
124
+ const { node, path } = stack.pop();
125
+ if (!node || typeof node !== 'object')
126
+ continue;
127
+ const t = Array.isArray(node.type) ? node.type[0] : node.type;
128
+ const props = node.properties;
129
+ const isObjectWithProps = t === 'object' && isPlainObject(props);
130
+ if (isObjectWithProps) {
131
+ // 进入子节点;倒序压栈以保证遍历输出顺序与 properties 顺序一致
132
+ const entries = Object.entries(props);
133
+ for (let i = entries.length - 1; i >= 0; i--) {
134
+ const [k, sub] = entries[i];
135
+ stack.push({ node: sub, path: [...path, k] });
136
+ }
137
+ }
138
+ else if (path.length > 0) {
139
+ // 根节点本身不产出(path 为空),其它叶子产出
140
+ out.push({ path, schema: node });
141
+ }
142
+ }
143
+ return out;
144
+ }
145
+ // ─── 美术资源字段抽取 ─────────────────────────────────────────────────────────
146
+ /**
147
+ * 抽取所有 `xplatform.value_type === 'path'` 的字段。
148
+ */
149
+ export function extractAssetFields(root) {
150
+ const fields = walkSchemaFields(root);
151
+ const out = [];
152
+ for (const { path, schema } of fields) {
153
+ const xp = getXplatform(schema);
154
+ if (xp?.value_type !== 'path')
155
+ continue;
156
+ out.push({
157
+ path,
158
+ schema,
159
+ mimeType: xp.mime_type,
160
+ mediaKind: inferMediaKind(xp.mime_type),
161
+ });
162
+ }
163
+ return out;
164
+ }
165
+ /**
166
+ * 抽取所有文本类型字段(string / i18n)。
167
+ * 排除:path 字段、颜色字段、非 string 类型。
168
+ */
169
+ export function extractTextFields(root) {
170
+ const fields = walkSchemaFields(root);
171
+ const out = [];
172
+ for (const { path, schema } of fields) {
173
+ const t = Array.isArray(schema.type) ? schema.type[0] : schema.type;
174
+ if (t !== 'string' && t !== 'i18n')
175
+ continue;
176
+ const xp = getXplatform(schema);
177
+ if (xp?.value_type === 'path')
178
+ continue;
179
+ // 排除 enum/enumLabels 下拉选择字段
180
+ if (schema.enum || schema.enumLabels)
181
+ continue;
182
+ const fieldName = path[path.length - 1] ?? '';
183
+ if (isColorField(fieldName, schema))
184
+ continue;
185
+ out.push({
186
+ path,
187
+ schema,
188
+ mimeType: undefined,
189
+ mediaKind: 'text',
190
+ });
191
+ }
192
+ return out;
193
+ }
194
+ /**
195
+ * 合并 themeData.assets 块 + schema 内联字段,按路径值去重。
196
+ *
197
+ * 规则(来自数据契约 §2.7):
198
+ * Step A: themeData.assets 块(如果存在)入 Map,source='assets-block'
199
+ * Step B: 全树扫描 schema,找 xplatform.value_type==='path' 字段
200
+ * Step C: 对每个字段,从 themeData 按 path 取实际值
201
+ * Step D: 与 A 按 value 去重;A 中已有的不被 inline 覆盖
202
+ * Step E: mime_type 分组(已在 mediaKind 里完成)
203
+ *
204
+ * @param schema 解析后的 theme.schema.json5 根节点
205
+ * @param themeData 解析后的 theme.data.json5 内容
206
+ */
207
+ export function collectThemeAssets(schema, themeData) {
208
+ const data = isPlainObject(themeData) ? themeData : {};
209
+ const seen = new Set();
210
+ const out = [];
211
+ // ─── Step A: assets 块 ────────────────────────────────────────────────
212
+ // assets 块的形态没有强约束,这里支持多种常见结构:
213
+ // 1. 数组:[{ path: '...', mime_type?: '...' }, ...] 或 ['./xxx.png', ...]
214
+ // 2. 对象(浅层):{ key1: '...', key2: { path: '...', mime_type: '...' } }
215
+ // 3. 对象(嵌套):{ images: { logo: './a.webp', bg: './b.webp' }, audio: {...} }
216
+ // 任何形态都尝试递归抽出"路径字符串"
217
+ const assetsBlock = data.assets;
218
+ const collectFromValue = (raw) => {
219
+ if (typeof raw === 'string' && raw) {
220
+ return { value: raw };
221
+ }
222
+ if (isPlainObject(raw)) {
223
+ const v = raw.path ?? raw.value ?? raw.url;
224
+ if (typeof v === 'string' && v) {
225
+ const mime = typeof raw.mime_type === 'string' ? raw.mime_type : undefined;
226
+ return { value: v, mime };
227
+ }
228
+ }
229
+ return null;
230
+ };
231
+ /** 递归扫描对象/数组,收集所有看起来像资产路径的字符串 */
232
+ const scanAssetsBlock = (block, depth = 0) => {
233
+ if (depth > 5)
234
+ return; // 防止循环
235
+ if (Array.isArray(block)) {
236
+ for (const item of block) {
237
+ const r = collectFromValue(item);
238
+ if (r) {
239
+ if (!seen.has(r.value)) {
240
+ seen.add(r.value);
241
+ out.push({ value: r.value, mediaKind: inferMediaKind(r.mime, r.value), source: 'assets-block' });
242
+ }
243
+ }
244
+ else if (isPlainObject(item)) {
245
+ scanAssetsBlock(item, depth + 1);
246
+ }
247
+ }
248
+ }
249
+ else if (isPlainObject(block)) {
250
+ for (const val of Object.values(block)) {
251
+ const r = collectFromValue(val);
252
+ if (r) {
253
+ if (!seen.has(r.value)) {
254
+ seen.add(r.value);
255
+ out.push({ value: r.value, mediaKind: inferMediaKind(r.mime, r.value), source: 'assets-block' });
256
+ }
257
+ }
258
+ else if (isPlainObject(val) || Array.isArray(val)) {
259
+ scanAssetsBlock(val, depth + 1);
260
+ }
261
+ }
262
+ }
263
+ };
264
+ if (assetsBlock !== undefined && assetsBlock !== null) {
265
+ scanAssetsBlock(assetsBlock);
266
+ }
267
+ // ─── Step B-D: 内联 path 字段 ─────────────────────────────────────────
268
+ // 从 schema 中扫描所有 xplatform.value_type === 'path' 的字段,
269
+ // 然后从 themeData 中取对应路径的值;取不到时 fallback 到 schema.default
270
+ // 空值(未配置)的字段也收集,标记 empty=true,供面板显示占位项
271
+ const fields = extractAssetFields(schema);
272
+ for (const f of fields) {
273
+ const raw = getThemeValueBySchemaPath(data, f.path);
274
+ const value = typeof raw === 'string' && raw
275
+ ? raw
276
+ : (typeof f.schema.default === 'string' && f.schema.default ? f.schema.default : null);
277
+ if (value) {
278
+ // 有值:正常添加
279
+ if (seen.has(value))
280
+ continue;
281
+ seen.add(value);
282
+ out.push({
283
+ value,
284
+ mediaKind: f.mediaKind !== 'other' ? f.mediaKind : inferMediaKind(f.mimeType, value),
285
+ source: 'inline',
286
+ fieldPath: f.path,
287
+ schema: f.schema,
288
+ });
289
+ }
290
+ else {
291
+ // 无值:以字段路径为唯一 key,添加空占位项
292
+ const pathKey = `__empty__${f.path.join('.')}`;
293
+ if (seen.has(pathKey))
294
+ continue;
295
+ seen.add(pathKey);
296
+ out.push({
297
+ value: '',
298
+ mediaKind: f.mediaKind !== 'other' ? f.mediaKind : inferMediaKind(f.mimeType),
299
+ source: 'inline',
300
+ fieldPath: f.path,
301
+ schema: f.schema,
302
+ empty: true,
303
+ });
304
+ }
305
+ }
306
+ // ─── Step F: 文本字段(string / i18n),空值也收以显示占位 ──────────
307
+ // schema.default 作为 fallback:themeData 未配置时使用 schema 默认值
308
+ const textFields = extractTextFields(schema);
309
+ for (const f of textFields) {
310
+ const raw = getThemeValueBySchemaPath(data, f.path);
311
+ const fallback = typeof f.schema.default === 'string' && f.schema.default ? f.schema.default : null;
312
+ const value = typeof raw === 'string' && raw ? raw : (fallback ?? '');
313
+ const textKey = `__text__${f.path.join('.')}`;
314
+ if (seen.has(textKey))
315
+ continue;
316
+ seen.add(textKey);
317
+ out.push({
318
+ value,
319
+ mediaKind: 'text',
320
+ source: 'inline',
321
+ fieldPath: f.path,
322
+ schema: f.schema,
323
+ empty: !value,
324
+ });
325
+ }
326
+ return out;
327
+ }
328
+ /**
329
+ * 根据字段在 schema 中的路径,自动去 i18n.xplatform.json5 中查找 title/description。
330
+ *
331
+ * 查找规则:
332
+ * 路径 ['gamePlay', 'layout', 'preset']
333
+ * → i18nPlatform.gamePlay.layout.preset._self.title[locale]
334
+ * → fallback i18nPlatform.gamePlay.layout.preset._self.title['en']
335
+ * → undefined(调用方使用 schema 原值)
336
+ *
337
+ * @param fieldPath 字段在 schema 中的完整路径(如 ['gamePlay', 'layout'])
338
+ * @param prop 要解析的属性名:'title' 或 'description'
339
+ * @param platformI18n i18n.xplatform.json5 解析后的对象
340
+ * @param locale 当前语言
341
+ * @returns 解析后的文本;undefined 表示未找到(调用方用 schema 原值 fallback)
342
+ */
343
+ export function resolveSchemaI18nByPath(fieldPath, prop, platformI18n, locale) {
344
+ if (!fieldPath || fieldPath.length === 0)
345
+ return undefined;
346
+ if (!isPlainObject(platformI18n))
347
+ return undefined;
348
+ // 逐级深入:i18nPlatform[seg1][seg2]...[segN]._self[prop][locale]
349
+ let cursor = platformI18n;
350
+ for (const seg of fieldPath) {
351
+ if (!isPlainObject(cursor))
352
+ return undefined;
353
+ cursor = cursor[seg];
354
+ }
355
+ if (!isPlainObject(cursor))
356
+ return undefined;
357
+ const selfNode = cursor._self;
358
+ if (!isPlainObject(selfNode))
359
+ return undefined;
360
+ const propNode = selfNode[prop];
361
+ if (!isPlainObject(propNode))
362
+ return undefined;
363
+ const tryGet = (lc) => {
364
+ const v = propNode[lc];
365
+ return typeof v === 'string' && v ? v : undefined;
366
+ };
367
+ return tryGet(locale) ?? (locale !== 'en' ? tryGet('en') : undefined);
368
+ }
369
+ // ─── i18n.runtime 解析(字段值) ──────────────────────────────────────────────
370
+ /**
371
+ * 判定字段值是否是 `i18n.runtime.<key>` 引用,是则返回 key。
372
+ *
373
+ * 只识别字符串形态,对象/数字等返回 null。
374
+ */
375
+ export function parseRuntimeI18nRef(rawValue) {
376
+ if (typeof rawValue !== 'string')
377
+ return null;
378
+ if (!rawValue.startsWith(I18N_RUNTIME_PREFIX))
379
+ return null;
380
+ const key = rawValue.slice(I18N_RUNTIME_PREFIX.length);
381
+ return key || null;
382
+ }
383
+ /**
384
+ * 从 i18n.runtime.json5 解析结果中取出某个 key 的多语言对象。
385
+ *
386
+ * - 不存在 → undefined(前端应初始化为空对象)
387
+ * - 存在但非 object → undefined(数据异常,按不存在处理)
388
+ * - 字段值非字符串 → 过滤掉(仅保留 string-string 映射)
389
+ */
390
+ export function getRuntimeI18nEntry(key, runtimeI18n) {
391
+ if (!key || !isPlainObject(runtimeI18n))
392
+ return undefined;
393
+ const entry = runtimeI18n[key];
394
+ if (!isPlainObject(entry))
395
+ return undefined;
396
+ const out = {};
397
+ for (const [lc, v] of Object.entries(entry)) {
398
+ if (typeof v === 'string')
399
+ out[lc] = v;
400
+ }
401
+ return out;
402
+ }
403
+ /**
404
+ * 解析 i18n.runtime 字段值,返回当前 locale 下的实际文案(用于预览展示)。
405
+ *
406
+ * Fallback 顺序:
407
+ * 1. rawValue 不是 i18n.runtime 引用 → 原样返回(前提是 string)
408
+ * 2. 是引用且能查到当前 locale → 当前 locale 值
409
+ * 3. 当前 locale 缺失但 'en' 存在 → 'en' 值
410
+ * 4. 都没有 → undefined
411
+ */
412
+ export function resolveRuntimeI18nValue(rawValue, runtimeI18n, locale) {
413
+ const key = parseRuntimeI18nRef(rawValue);
414
+ if (key === null) {
415
+ return typeof rawValue === 'string' ? rawValue : undefined;
416
+ }
417
+ const entry = getRuntimeI18nEntry(key, runtimeI18n);
418
+ if (!entry)
419
+ return undefined;
420
+ return entry[locale] ?? (locale !== 'en' ? entry.en : undefined);
421
+ }
422
+ //# sourceMappingURL=schema-walker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-walker.js","sourceRoot":"","sources":["../../src/prefab/schema-walker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * 与前端 PhoneFrame / BuildPreviewFrame 对齐的预览尺寸(单源常量)。
3
+ * @see packages/frontend/src/components/device-frames/phone-frame.tsx
4
+ */
5
+ export type PhonePreviewOrientation = 'portrait' | 'landscape';
6
+ /** PhoneFrame 外框尺寸 */
7
+ export declare const PHONE_FRAME_OUTER: {
8
+ readonly portrait: {
9
+ readonly width: 490;
10
+ readonly height: 1000;
11
+ };
12
+ readonly landscape: {
13
+ readonly width: 1000;
14
+ readonly height: 490;
15
+ };
16
+ };
17
+ /** 屏幕区域(FRAME.screen) */
18
+ export declare const PHONE_FRAME_SCREEN: {
19
+ readonly portrait: {
20
+ readonly width: 454;
21
+ readonly height: 964;
22
+ };
23
+ readonly landscape: {
24
+ readonly width: 964;
25
+ readonly height: 454;
26
+ };
27
+ };
28
+ /** 状态栏高度(与 phone-frame STATUS_BAR_H 一致) */
29
+ export declare const PHONE_STATUS_BAR_HEIGHT: {
30
+ readonly portrait: 75;
31
+ readonly landscape: 50;
32
+ };
33
+ /** Playwright / 可玩内容区视窗(iframe 实际显示区域) */
34
+ export declare const PHONE_CONTENT_VIEWPORT: {
35
+ readonly portrait: {
36
+ readonly width: 454;
37
+ readonly height: number;
38
+ };
39
+ readonly landscape: {
40
+ readonly width: 964;
41
+ readonly height: number;
42
+ };
43
+ };
44
+ export declare function getPhoneContentViewport(orientation?: PhonePreviewOrientation): {
45
+ width: number;
46
+ height: number;
47
+ };
48
+ //# sourceMappingURL=phone-preview-dimensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-preview-dimensions.d.ts","sourceRoot":"","sources":["../../src/preview/phone-preview-dimensions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,uBAAuB,GAAG,UAAU,GAAG,WAAW,CAAC;AAE/D,sBAAsB;AACtB,eAAO,MAAM,iBAAiB;;;;;;;;;CAGpB,CAAC;AAEX,yBAAyB;AACzB,eAAO,MAAM,kBAAkB;;;;;;;;;CAGrB,CAAC;AAEX,2CAA2C;AAC3C,eAAO,MAAM,uBAAuB;;;CAG1B,CAAC;AAEX,0CAA0C;AAC1C,eAAO,MAAM,sBAAsB;;;;;;;;;CASzB,CAAC;AAEX,wBAAgB,uBAAuB,CACrC,WAAW,GAAE,uBAAoC,GAChD;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAEnC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 与前端 PhoneFrame / BuildPreviewFrame 对齐的预览尺寸(单源常量)。
3
+ * @see packages/frontend/src/components/device-frames/phone-frame.tsx
4
+ */
5
+ /** PhoneFrame 外框尺寸 */
6
+ export const PHONE_FRAME_OUTER = {
7
+ portrait: { width: 490, height: 1000 },
8
+ landscape: { width: 1000, height: 490 },
9
+ };
10
+ /** 屏幕区域(FRAME.screen) */
11
+ export const PHONE_FRAME_SCREEN = {
12
+ portrait: { width: 454, height: 964 },
13
+ landscape: { width: 964, height: 454 },
14
+ };
15
+ /** 状态栏高度(与 phone-frame STATUS_BAR_H 一致) */
16
+ export const PHONE_STATUS_BAR_HEIGHT = {
17
+ portrait: 75,
18
+ landscape: 50,
19
+ };
20
+ /** Playwright / 可玩内容区视窗(iframe 实际显示区域) */
21
+ export const PHONE_CONTENT_VIEWPORT = {
22
+ portrait: {
23
+ width: PHONE_FRAME_SCREEN.portrait.width,
24
+ height: PHONE_FRAME_SCREEN.portrait.height - PHONE_STATUS_BAR_HEIGHT.portrait,
25
+ },
26
+ landscape: {
27
+ width: PHONE_FRAME_SCREEN.landscape.width,
28
+ height: PHONE_FRAME_SCREEN.landscape.height - PHONE_STATUS_BAR_HEIGHT.landscape,
29
+ },
30
+ };
31
+ export function getPhoneContentViewport(orientation = 'portrait') {
32
+ return PHONE_CONTENT_VIEWPORT[orientation];
33
+ }
34
+ //# sourceMappingURL=phone-preview-dimensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-preview-dimensions.js","sourceRoot":"","sources":["../../src/preview/phone-preview-dimensions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,sBAAsB;AACtB,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IACtC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;CAC/B,CAAC;AAEX,yBAAyB;AACzB,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IACrC,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;CAC9B,CAAC;AAEX,2CAA2C;AAC3C,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,EAAE;CACL,CAAC;AAEX,0CAA0C;AAC1C,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,QAAQ,EAAE;QACR,KAAK,EAAE,kBAAkB,CAAC,QAAQ,CAAC,KAAK;QACxC,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,MAAM,GAAG,uBAAuB,CAAC,QAAQ;KAC9E;IACD,SAAS,EAAE;QACT,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,KAAK;QACzC,MAAM,EAAE,kBAAkB,CAAC,SAAS,CAAC,MAAM,GAAG,uBAAuB,CAAC,SAAS;KAChF;CACO,CAAC;AAEX,MAAM,UAAU,uBAAuB,CACrC,cAAuC,UAAU;IAEjD,OAAO,sBAAsB,CAAC,WAAW,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * BullMQ email 队列名(Backend Producer / Worker Consumer 共用)
3
+ */
4
+ export declare function getEmailQueueName(): string;
5
+ //# sourceMappingURL=email-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-queue.d.ts","sourceRoot":"","sources":["../../src/queue/email-queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAS1C"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * BullMQ email 队列名(Backend Producer / Worker Consumer 共用)
3
+ */
4
+ export function getEmailQueueName() {
5
+ if (process.env.EMAIL_QUEUE_NAME) {
6
+ return process.env.EMAIL_QUEUE_NAME;
7
+ }
8
+ if (process.env.NODE_ENV === 'production') {
9
+ return 'email';
10
+ }
11
+ const user = process.env.USER || process.env.USERNAME || 'dev';
12
+ return `email-dev-${user}`;
13
+ }
14
+ //# sourceMappingURL=email-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-queue.js","sourceRoot":"","sources":["../../src/queue/email-queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1C,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC;IAC/D,OAAO,aAAa,IAAI,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * BullMQ remix-cover 队列名(Backend Producer / Worker Consumer 共用)
3
+ */
4
+ export declare function getRemixCoverQueueName(): string;
5
+ //# sourceMappingURL=remix-cover-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remix-cover-queue.d.ts","sourceRoot":"","sources":["../../src/queue/remix-cover-queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAS/C"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * BullMQ remix-cover 队列名(Backend Producer / Worker Consumer 共用)
3
+ */
4
+ export function getRemixCoverQueueName() {
5
+ if (process.env.REMIX_COVER_QUEUE_NAME) {
6
+ return process.env.REMIX_COVER_QUEUE_NAME;
7
+ }
8
+ if (process.env.NODE_ENV === 'production') {
9
+ return 'remix-cover';
10
+ }
11
+ const user = process.env.USER || process.env.USERNAME || 'dev';
12
+ return `remix-cover-dev-${user}`;
13
+ }
14
+ //# sourceMappingURL=remix-cover-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remix-cover-queue.js","sourceRoot":"","sources":["../../src/queue/remix-cover-queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IAC5C,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1C,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC;IAC/D,OAAO,mBAAmB,IAAI,EAAE,CAAC;AACnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"upload-build-artifacts.d.ts","sourceRoot":"","sources":["../../src/storage/upload-build-artifacts.ts"],"names":[],"mappings":"AAGA,uCAAuC;AACvC,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAuBF,MAAM,WAAW,0BAA0B;IACzC,oEAAoE;IACpE,KAAK,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,SAAS,EAAE,SAAS,CAAC;IACrB,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,0BAA0B,CAAC,CA2CrC"}
1
+ {"version":3,"file":"upload-build-artifacts.d.ts","sourceRoot":"","sources":["../../src/storage/upload-build-artifacts.ts"],"names":[],"mappings":"AAGA,uCAAuC;AACvC,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA6BF,MAAM,WAAW,0BAA0B;IACzC,oEAAoE;IACpE,KAAK,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,SAAS,EAAE,SAAS,CAAC;IACrB,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,0BAA0B,CAAC,CA2CrC"}
@@ -5,6 +5,12 @@ const EXT_TO_CONTENT_TYPE = {
5
5
  '.html': 'text/html; charset=utf-8',
6
6
  '.htm': 'text/html; charset=utf-8',
7
7
  '.js': 'application/javascript; charset=utf-8',
8
+ // ESM/CommonJS 模块后缀:浏览器对 ESM <script type="module"> 加载强制要求 MIME
9
+ // 是 JavaScript-or-Wasm("Strict MIME type checking is enforced for module scripts")。
10
+ // 不设 ContentType 时 COS 默认 application/octet-stream,会让 LiteCreator 之类
11
+ // 依赖 .mjs 分发的项目(PlayCanvas + LiteCreator)预览全部 import 失败。
12
+ '.mjs': 'application/javascript; charset=utf-8',
13
+ '.cjs': 'application/javascript; charset=utf-8',
8
14
  '.json': 'application/json; charset=utf-8',
9
15
  '.css': 'text/css; charset=utf-8',
10
16
  '.png': 'image/png',
@@ -1 +1 @@
1
- {"version":3,"file":"upload-build-artifacts.js","sourceRoot":"","sources":["../../src/storage/upload-build-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAYtC,0BAA0B;AAC1B,MAAM,mBAAmB,GAA2B;IAClD,OAAO,EAAE,0BAA0B;IACnC,MAAM,EAAE,0BAA0B;IAClC,KAAK,EAAE,uCAAuC;IAC9C,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,yBAAyB;IACjC,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,kBAAkB;CAC5B,CAAC;AAoBF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAkC;IAElC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAErE,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC;QAC7B,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE;KACrC,CAAC,CAAC;IAEH,uCAAuC;IACvC,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;QACxD,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE;YACrC,MAAM,UAAU,GAAG,GAAG,OAAO,YAAY,YAAY,EAAE,CAAC;YACxD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAC7C,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACrF,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,YAAY,IAAI,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,CACjF,CAAC;IACF,MAAM,cAAc,GAClB,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAClF,MAAM,gBAAgB,GAAG,cAAc,EAAE,YAAY,IAAI,YAAY,CAAC;IACtE,MAAM,eAAe,GAAG,GAAG,OAAO,YAAY,gBAAgB,EAAE,CAAC;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAEnD,oCAAoC;IACpC,MAAM,MAAM,GAAG,GAAG,OAAO,IAAI,WAAW,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE;QACxD,WAAW,EAAE,iBAAiB;KAC/B,CAAC,CAAC;IAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"upload-build-artifacts.js","sourceRoot":"","sources":["../../src/storage/upload-build-artifacts.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playcraft/common",
3
- "version": "0.0.31",
3
+ "version": "0.0.33",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",