@funhub/platform 0.1.52 → 0.1.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +0 -13
  2. package/dist/biz.d.mts +8 -10
  3. package/dist/biz.mjs +1 -1
  4. package/dist/components/biz/business/banner/variants/basic-banner/material.d.mts +1 -1
  5. package/dist/components/biz/business/banner-carousel/material.d.mts +1 -1
  6. package/dist/components/biz/business/channel-list/material.d.mts +1 -1
  7. package/dist/components/biz/business/detail/materials/registry.d.mts +7 -6
  8. package/dist/components/biz/business/detail/materials/runtime-context-provider.mjs +2 -0
  9. package/dist/components/biz/business/detail/materials/video-detail-actions/client.d.mts +0 -2
  10. package/dist/components/biz/business/detail/materials/video-detail-actions/client.mjs +1 -1
  11. package/dist/components/biz/business/detail/materials/video-detail-actions/material.d.mts +1 -1
  12. package/dist/components/biz/business/detail/materials/video-detail-actions/schema.d.mts +1 -5
  13. package/dist/components/biz/business/detail/materials/video-detail-info/client.d.mts +0 -4
  14. package/dist/components/biz/business/detail/materials/video-detail-info/client.mjs +1 -1
  15. package/dist/components/biz/business/detail/materials/video-detail-info/material.d.mts +1 -1
  16. package/dist/components/biz/business/detail/materials/video-detail-info/schema.d.mts +1 -7
  17. package/dist/components/biz/business/detail/materials/video-detail-info-title/client.d.mts +0 -1
  18. package/dist/components/biz/business/detail/materials/video-detail-info-title/client.mjs +1 -1
  19. package/dist/components/biz/business/detail/materials/video-detail-info-title/material.d.mts +1 -1
  20. package/dist/components/biz/business/detail/materials/video-detail-info-title/schema.d.mts +1 -4
  21. package/dist/components/biz/business/detail/materials/video-detail-info-title-tags-episodes/client.d.mts +0 -3
  22. package/dist/components/biz/business/detail/materials/video-detail-info-title-tags-episodes/client.mjs +1 -1
  23. package/dist/components/biz/business/detail/materials/video-detail-info-title-tags-episodes/material.d.mts +1 -1
  24. package/dist/components/biz/business/detail/materials/video-detail-info-title-tags-episodes/schema.d.mts +1 -6
  25. package/dist/components/biz/business/detail/materials/video-detail-player/client.d.mts +0 -3
  26. package/dist/components/biz/business/detail/materials/video-detail-player/client.mjs +1 -1
  27. package/dist/components/biz/business/detail/materials/video-detail-player/material.d.mts +1 -1
  28. package/dist/components/biz/business/detail/materials/video-detail-player/schema.d.mts +1 -6
  29. package/dist/components/biz/business/detail/materials/video-detail-recommend/client.d.mts +1 -2
  30. package/dist/components/biz/business/detail/materials/video-detail-recommend/client.mjs +1 -1
  31. package/dist/components/biz/business/detail/materials/video-detail-recommend/material.d.mts +2 -1
  32. package/dist/components/biz/business/detail/materials/video-detail-recommend/schema.d.mts +2 -3
  33. package/dist/components/biz/business/detail/materials/video-detail-recommend/schema.mjs +1 -1
  34. package/dist/components/biz/business/detail/materials/video-detail-recommend/utils.mjs +1 -1
  35. package/dist/components/biz/business/floating-ball/material.d.mts +1 -1
  36. package/dist/components/biz/business/header-search/header-avatar-icon/material.d.mts +1 -1
  37. package/dist/components/biz/business/header-search/header-avatar-logo-search/material.d.mts +1 -1
  38. package/dist/components/biz/business/header-search/header-avatar-logo-search-icon/material.d.mts +1 -1
  39. package/dist/components/biz/business/header-search/header-logo-search/material.d.mts +1 -1
  40. package/dist/components/biz/business/header-search/header-search/material.d.mts +1 -1
  41. package/dist/components/biz/business/home-recommend/index.d.mts +4 -6
  42. package/dist/components/biz/business/home-recommend/shared/home-recommend-base.mjs +1 -1
  43. package/dist/components/biz/business/home-recommend/shared/home-recommend-default-config.mjs +2 -0
  44. package/dist/components/biz/business/home-recommend/shared/home-recommend-feed-mode.mjs +2 -0
  45. package/dist/components/biz/business/home-recommend/shared/home-recommend-preview.mjs +1 -1
  46. package/dist/components/biz/business/home-recommend/shared/home-recommend-server-data.mjs +2 -0
  47. package/dist/components/biz/business/home-recommend/shared/home-recommend-video-detail.mjs +2 -0
  48. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/index.d.mts +2 -3
  49. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/index.mjs +1 -1
  50. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/inspector-schema.d.mts +35 -1
  51. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/inspector-schema.mjs +1 -1
  52. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/material.d.mts +29 -3
  53. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/material.mjs +1 -1
  54. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/runtime/prefetch-client.d.mts +27 -0
  55. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/runtime/prefetch-client.mjs +2 -0
  56. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/schema/index.mjs +1 -1
  57. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/server.d.mts +3 -6
  58. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/server.mjs +1 -1
  59. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/index.d.mts +2 -3
  60. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/index.mjs +1 -1
  61. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/inspector-schema.d.mts +30 -2
  62. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/inspector-schema.mjs +1 -1
  63. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/material.d.mts +26 -4
  64. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/material.mjs +1 -1
  65. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/runtime/prefetch-client.d.mts +27 -0
  66. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/runtime/prefetch-client.mjs +2 -0
  67. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/schema/index.mjs +1 -1
  68. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/server.d.mts +3 -6
  69. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/server.mjs +1 -1
  70. package/dist/components/biz/business/index.d.mts +11 -13
  71. package/dist/components/biz/business/large-feature-grid/card-item.mjs +1 -1
  72. package/dist/components/biz/business/large-feature-grid/material.d.mts +2 -2
  73. package/dist/components/biz/business/marquee/material.d.mts +1 -1
  74. package/dist/components/biz/business/profile/profile-header/material.d.mts +2 -2
  75. package/dist/components/biz/business/profile/profile-header/user-profile-avatar.mjs +1 -1
  76. package/dist/components/biz/business/profile/profile-header/user-profile-cover-background.mjs +1 -1
  77. package/dist/components/biz/business/profile/profile-main/material.d.mts +1 -1
  78. package/dist/components/biz/business/search-history/material.d.mts +1 -1
  79. package/dist/components/biz/business/search-input/material.d.mts +1 -1
  80. package/dist/components/biz/business/shortcut-grid/material.d.mts +1 -1
  81. package/dist/components/biz/business/tab-bar/material.d.mts +2 -2
  82. package/dist/components/biz/business/tab-bar/schema.d.mts +1 -1
  83. package/dist/components/biz/business/text-recommend/material.d.mts +1 -1
  84. package/dist/components/biz/business/video-horizontal-list/material.d.mts +1 -1
  85. package/dist/components/biz/example/button/material.d.mts +1 -1
  86. package/dist/components/biz/example/button/material.mjs +1 -1
  87. package/dist/components/biz/utils/transformers/data.mjs +1 -1
  88. package/dist/components/common/cards/mini-three-card.mjs +1 -1
  89. package/dist/components/pages/(follow)/_components/follow-button/index.mjs +1 -1
  90. package/dist/components/pages/login/password.mjs +1 -1
  91. package/dist/components/pages/login/register.mjs +1 -1
  92. package/dist/components/pages/login/reset-password.mjs +1 -1
  93. package/dist/components/pages/login/verify.mjs +1 -1
  94. package/dist/components/pages/search-result/page-client.mjs +1 -1
  95. package/dist/components/pages/search-result/search-all.mjs +1 -1
  96. package/dist/components/pages/search-result/search-tab.mjs +1 -1
  97. package/dist/components/pages/search-result/search-user.mjs +1 -1
  98. package/dist/components/pages/search-result/search-video.mjs +1 -1
  99. package/dist/components/pages/settings/_components/reset-password-drawer.mjs +1 -1
  100. package/dist/components/pages/settings/_components/settings.mjs +1 -1
  101. package/dist/components/pages/video-detail/video-detail-client.mjs +1 -1
  102. package/dist/components/ui/badge.d.mts +1 -1
  103. package/dist/components/ui/button.d.mts +1 -1
  104. package/dist/components/ui/image.d.mts +4 -4
  105. package/dist/i18n/locales/en.mjs +1 -1
  106. package/dist/i18n/locales/zh-CN.mjs +1 -1
  107. package/dist/service/content-batch-get-video-detail.d.mts +21 -0
  108. package/dist/service/content-batch-get-video-detail.mjs +2 -0
  109. package/dist/service.d.mts +2 -1
  110. package/dist/service.mjs +1 -1
  111. package/dist/utils/schema/index.d.mts +1 -1
  112. package/dist/utils/schema/material.d.mts +9 -7
  113. package/dist/utils/schema/utils.d.mts +3 -13
  114. package/dist/utils/schema/utils.mjs +1 -1
  115. package/dist/utils.d.mts +2 -3
  116. package/dist/utils.mjs +1 -1
  117. package/package.json +2 -7
  118. package/bin/index.mjs +0 -323
  119. package/dist/assets/images/user/default_avatar.mjs +0 -2
  120. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/defaults/default-props.d.mts +0 -10
  121. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/defaults/default-props.mjs +0 -2
  122. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/runtime/client.d.mts +0 -20
  123. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/runtime/client.mjs +0 -2
  124. package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/schema/props.schema.mjs +0 -2
  125. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/defaults/default-props.d.mts +0 -8
  126. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/defaults/default-props.mjs +0 -2
  127. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/runtime/client.d.mts +0 -20
  128. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/runtime/client.mjs +0 -2
  129. package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/schema/props.schema.mjs +0 -2
  130. package/dist/utils/password-validator.d.mts +0 -28
  131. package/dist/utils/password-validator.mjs +0 -2
  132. package/templates/base/_meta.json +0 -4
  133. package/templates/base/template/README.md.template +0 -32
  134. package/templates/base/template/__dot__gitignore +0 -6
  135. package/templates/base/template/app/[locale]/layout.tsx.template +0 -36
  136. package/templates/base/template/app/[locale]/page.tsx.template +0 -24
  137. package/templates/base/template/app/globals.css +0 -26
  138. package/templates/base/template/app/layout.tsx.template +0 -38
  139. package/templates/base/template/eslint.config.mjs.template +0 -68
  140. package/templates/base/template/i18n/request.ts.template +0 -3
  141. package/templates/base/template/next-env.d.ts.template +0 -4
  142. package/templates/base/template/next.config.ts.template +0 -21
  143. package/templates/base/template/package.json.template +0 -37
  144. package/templates/base/template/postcss.config.js.template +0 -18
  145. package/templates/base/template/proxy.ts.template +0 -18
  146. package/templates/base/template/tailwind.config.cjs.template +0 -13
  147. package/templates/base/template/tsconfig.json.template +0 -43
@@ -8,6 +8,9 @@ import z$1 from "zod";
8
8
  * 物料分类
9
9
  */
10
10
  declare const MATERIAL_CATEGORY: {
11
+ readonly TOP: "TOP";
12
+ readonly CENTER: "CENTER";
13
+ readonly BOTTOM: "BOTTOM";
11
14
  readonly 内容组件: "内容组件";
12
15
  readonly 金刚组件: "金刚组件";
13
16
  readonly 大图宫格: "大图宫格";
@@ -16,7 +19,6 @@ declare const MATERIAL_CATEGORY: {
16
19
  readonly 视频模块: "视频模块";
17
20
  readonly 详情页: "详情页";
18
21
  };
19
- type MaterialCategory = typeof MATERIAL_CATEGORY[keyof typeof MATERIAL_CATEGORY];
20
22
  type MaterialPropsSchema = z$1.ZodObject<z$1.ZodRawShape>;
21
23
  type MaterialSchemaProps<TSchema extends MaterialPropsSchema> = InferSchemaProps<TSchema>;
22
24
  type InternalMaterialSchemaKey = 'mode';
@@ -24,22 +26,22 @@ type SchemaExtraKeys<TSchemaProps, TComponentProps> = Exclude<keyof TSchemaProps
24
26
  type SchemaIncompatibleKeys<TSchemaProps, TComponentProps> = { [Key in keyof TSchemaProps]-?: Key extends InternalMaterialSchemaKey ? never : Key extends keyof TComponentProps ? TSchemaProps[Key] extends TComponentProps[Key] ? never : Key : Key }[keyof TSchemaProps];
25
27
  type EnsurePropsSchemaSubset<TComponent extends ComponentType<any>, TPropsSchema extends MaterialPropsSchema> = [SchemaExtraKeys<MaterialSchemaProps<TPropsSchema>, ComponentProps<TComponent>>] extends [never] ? [SchemaIncompatibleKeys<MaterialSchemaProps<TPropsSchema>, ComponentProps<TComponent>>] extends [never] ? TPropsSchema : never : never;
26
28
  type EnsureComponentCompatibleWithSchema<TComponent extends ComponentType<any>, TPropsSchema extends MaterialPropsSchema> = EnsurePropsSchemaSubset<TComponent, TPropsSchema> extends never ? never : TComponent;
27
- interface DefineMaterialOption<TServerComponent extends ComponentType<any>, TClientComponent extends ComponentType<any>, TPropsSchema extends MaterialPropsSchema, TType extends string = string, TCategory extends MaterialCategory = MaterialCategory> {
29
+ interface DefineMaterialOption<TServerComponent extends ComponentType<any>, TClientComponent extends ComponentType<any>, TPropsSchema extends MaterialPropsSchema, TType extends string = string> {
28
30
  type: TType;
29
31
  name: string;
30
32
  icon: ReactNode;
31
33
  serverComponent: TServerComponent;
32
34
  clientComponent: TClientComponent;
33
35
  propsSchema: EnsurePropsSchemaSubset<TServerComponent | TClientComponent, TPropsSchema>;
34
- category: TCategory;
36
+ category: typeof MATERIAL_CATEGORY[keyof typeof MATERIAL_CATEGORY];
35
37
  }
36
38
  /**
37
39
  * 定义物料,约束propsSchema是server/client component props的子集。
38
40
  * @param option 物料配置
39
41
  * @returns 物料配置
40
42
  */
41
- declare function defineMaterial<TServerComponent extends ComponentType<any>, TClientComponent extends ComponentType<any>, TPropsSchema extends MaterialPropsSchema, const TType extends string, const TCategory extends MaterialCategory>(option: DefineMaterialOption<TServerComponent, TClientComponent, TPropsSchema, TType, TCategory>): DefineMaterialOption<TServerComponent, TClientComponent, TPropsSchema, TType, TCategory>;
42
- interface OverwriteMaterialOption<TServerComponent extends ComponentType<any>, TClientComponent extends ComponentType<any>, TPropsSchema extends MaterialPropsSchema, TCategory extends MaterialCategory = MaterialCategory> {
43
+ declare function defineMaterial<TServerComponent extends ComponentType<any>, TClientComponent extends ComponentType<any>, TPropsSchema extends MaterialPropsSchema, const TType extends string>(option: DefineMaterialOption<TServerComponent, TClientComponent, TPropsSchema, TType>): DefineMaterialOption<TServerComponent, TClientComponent, TPropsSchema, TType>;
44
+ interface OverwriteMaterialOption<TServerComponent extends ComponentType<any>, TClientComponent extends ComponentType<any>, TPropsSchema extends MaterialPropsSchema> {
43
45
  serverComponent?: EnsureComponentCompatibleWithSchema<TServerComponent, TPropsSchema>;
44
46
  clientComponent?: EnsureComponentCompatibleWithSchema<TClientComponent, TPropsSchema>;
45
47
  }
@@ -49,6 +51,6 @@ interface OverwriteMaterialOption<TServerComponent extends ComponentType<any>, T
49
51
  * @param option 重写配置
50
52
  * @returns 重写后的物料配置
51
53
  */
52
- declare function overwriteMaterial<TRawServerComponent extends ComponentType<any>, TRawClientComponent extends ComponentType<any>, TPropsSchema extends MaterialPropsSchema, TType extends string, TCategory extends MaterialCategory, TServerComponent extends ComponentType<any> = TRawServerComponent, TClientComponent extends ComponentType<any> = TRawClientComponent>(rawMaterial: DefineMaterialOption<TRawServerComponent, TRawClientComponent, TPropsSchema, TType, TCategory>, option?: OverwriteMaterialOption<TServerComponent, TClientComponent, TPropsSchema, TCategory>): DefineMaterialOption<TServerComponent, TClientComponent, TPropsSchema, TType, TCategory>;
54
+ declare function overwriteMaterial<TRawServerComponent extends ComponentType<any>, TRawClientComponent extends ComponentType<any>, TPropsSchema extends MaterialPropsSchema, TType extends string, TServerComponent extends ComponentType<any> = TRawServerComponent, TClientComponent extends ComponentType<any> = TRawClientComponent>(rawMaterial: DefineMaterialOption<TRawServerComponent, TRawClientComponent, TPropsSchema, TType>, option?: OverwriteMaterialOption<TServerComponent, TClientComponent, TPropsSchema>): DefineMaterialOption<TServerComponent, TClientComponent, TPropsSchema, TType>;
53
55
  //#endregion
54
- export { DefineMaterialOption, MaterialCategory, defineMaterial, overwriteMaterial };
56
+ export { DefineMaterialOption, defineMaterial, overwriteMaterial };
@@ -1,14 +1,11 @@
1
1
 
2
- import { DefineMaterialOption, MaterialCategory } from "./material.mjs";
2
+ import { DefineMaterialOption } from "./material.mjs";
3
3
 
4
4
  //#region utils/schema/utils.d.ts
5
- type MaterialLike = DefineMaterialOption<any, any, any, string, MaterialCategory>;
5
+ type MaterialLike = DefineMaterialOption<any, any, any, string>;
6
6
  type MaterialMap<TMaterials extends readonly MaterialLike[]> = { [Type in TMaterials[number]['type']]: Extract<TMaterials[number], {
7
7
  type: Type;
8
8
  }> };
9
- type MaterialMapGroupByCategory<TMaterials extends readonly MaterialLike[]> = { [Category in TMaterials[number]['category']]: Extract<TMaterials[number], {
10
- category: Category;
11
- }>[] };
12
9
  /**
13
10
  * 将物料数组转换为 type -> material 的映射。
14
11
  * 如果出现重复 type,会输出警告并以后者覆盖前者。
@@ -16,12 +13,5 @@ type MaterialMapGroupByCategory<TMaterials extends readonly MaterialLike[]> = {
16
13
  * @returns 以 material.type 为 key 的映射
17
14
  */
18
15
  declare function generateMaterialMap<const TMaterials extends readonly MaterialLike[]>(materials: TMaterials): MaterialMap<TMaterials>;
19
- /**
20
- * 将物料数组转换为 category -> material[] 的映射。
21
- * 同一分类下的物料顺序与入参数组保持一致。
22
- * @param materials 通过 defineMaterial 定义的物料数组
23
- * @returns 以 material.category 为 key 的映射
24
- */
25
- declare function generateMaterialMapGroupByCategory<const TMaterials extends readonly MaterialLike[]>(materials: TMaterials): MaterialMapGroupByCategory<TMaterials>;
26
16
  //#endregion
27
- export { MaterialMap, generateMaterialMap, generateMaterialMapGroupByCategory };
17
+ export { MaterialMap, generateMaterialMap };
@@ -1,2 +1,2 @@
1
1
 
2
- function e(e){let t=new Set;return e.reduce((e,n)=>(t.has(n.type)&&console.warn(`[generateMaterialMap] duplicated material type: ${n.type}, the later one will overwrite the previous one.`),t.add(n.type),e[n.type]=n,e),{})}function t(e){return e.reduce((e,t)=>{let n=t.category;return e[n]||(e[n]=[]),e[n].push(t),e},{})}export{e as generateMaterialMap,t as generateMaterialMapGroupByCategory};
2
+ function e(e){let t=new Set;return e.reduce((e,n)=>(t.has(n.type)&&console.warn(`[generateMaterialMap] duplicated material type: ${n.type}, the later one will overwrite the previous one.`),t.add(n.type),e[n.type]=n,e),{})}export{e as generateMaterialMap};
package/dist/utils.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  import { INSPECTOR_META_KEY, InferSchemaProps, MaterialComponentMode, MaterialComponentProps, SchemaHasDefaultValue, defineArrayItemPropSchema, defineCheckboxPropSchema, defineColorPropSchema, defineComponentPropsSchema, defineDatetimePropSchema, defineNumberPropSchema, defineObjectPropSchema, defineSelectEnumPropSchema, defineSelectPropSchema, defineSwitchPropSchema, defineTextPropSchema, defineTextareaPropSchema, defineTimeRangePropSchema, getSchemaDefaultProps, withInspectorMeta } from "./utils/schema/schema.mjs";
3
3
  import { defineMaterial, overwriteMaterial } from "./utils/schema/material.mjs";
4
- import { MaterialMap, generateMaterialMap, generateMaterialMapGroupByCategory } from "./utils/schema/utils.mjs";
4
+ import { MaterialMap, generateMaterialMap } from "./utils/schema/utils.mjs";
5
5
  import "./utils/schema/index.mjs";
6
6
  import { clearMyChannelsFromStorage, loadHiddenChannelIdsFromStorage, loadMyChannelsFromStorage, saveHiddenChannelIdsToStorage } from "./utils/channel-storage.mjs";
7
7
  import { cn } from "./utils/cn.mjs";
@@ -15,8 +15,7 @@ import { HttpClient, HttpError, RequestConfig, RequestMethod, ResponseData, http
15
15
  import { ImageCompressionQualityRule, compressImage, defaultImageCompressionMaxSizeMB, defaultImageCompressionQuality, getImageCompressionQuality, imageCompressionQualityRules } from "./utils/image-compression.mjs";
16
16
  import { components, loadComponent, rewriteComponent } from "./utils/loaders.mjs";
17
17
  import { createInputAndSelectFile, getCoverImage, getImageResolutionFromFile } from "./utils/media.mjs";
18
- import { PASSWORD_ALLOWED_SPECIAL_CHARS, PASSWORD_MAX_LENGTH, PASSWORD_MIN_LENGTH, PasswordValidationResult, PasswordValidationType, getFirstInvalidPasswordChar, getPasswordCharacterTypeCount, getPasswordValidationErrorText, validatePasswordPair } from "./utils/password-validator.mjs";
19
18
  import { PresignedUploadInfo, UploadToS3Options, UploadToS3Result, uploadToS3WithPresignedUrl } from "./utils/s3-uploader.mjs";
20
19
  import { base64ToUint8Array, uint8ArrayToBase64, uint8ArrayToNumberArray } from "./utils/uint8.mjs";
21
20
  import { UploadFileResult, encryptBncBuffer, uploadFile } from "./utils/upload-file.mjs";
22
- export { eventBus as EventBus, HttpClient, HttpError, INSPECTOR_META_KEY, ImageCompressionQualityRule, InferSchemaProps, MaterialComponentMode, MaterialComponentProps, MaterialMap, PASSWORD_ALLOWED_SPECIAL_CHARS, PASSWORD_MAX_LENGTH, PASSWORD_MIN_LENGTH, PasswordValidationResult, PasswordValidationType, PresignedUploadInfo, RequestConfig, RequestMethod, ResponseData, SchemaHasDefaultValue, UploadFileResult, UploadToS3Options, UploadToS3Result, base64ToUint8Array, checkFollowStatus, clearMyChannelsFromStorage, cn, components, compressImage, createInputAndSelectFile, debounceFun, decryptImageToArrayBuffer, decryptImageToUint8Array, decryptImageUrl, defaultImageCompressionMaxSizeMB, defaultImageCompressionQuality, defineArrayItemPropSchema, defineCheckboxPropSchema, defineColorPropSchema, defineComponentPropsSchema, defineDatetimePropSchema, defineMaterial, defineNumberPropSchema, defineObjectPropSchema, defineSelectEnumPropSchema, defineSelectPropSchema, defineSwitchPropSchema, defineTextPropSchema, defineTextareaPropSchema, defineTimeRangePropSchema, disablePageScroll, enablePageScroll, encryptBncBuffer, followUser, formatVideoDuration, generateDynamicSign, generateMaterialMap, generateMaterialMapGroupByCategory, generateUUID, getAppId, getAtUserElement, getCookie, getCoverImage, getCurrentSecondTime, getCurrentUserId, getFirstInvalidPasswordChar, getImageCompressionQuality, getImageResolutionFromFile, getPasswordCharacterTypeCount, getPasswordValidationErrorText, getResUrl, getSchemaDefaultProps, getUserId, guessImageContentTypeFromUrl, hashPassword, httpClient, imageCompressionQualityRules, isClient, isEncryptedImageUrl, isMobileDevice, loadComponent, loadHiddenChannelIdsFromStorage, loadMyChannelsFromStorage, normalizeClassName, numToString, overwriteMaterial, parseResolution, parseTextAtUserIds, pxToVw, randomString, removeCookie, replaceAtUserElement, replaceAtUserElementHtmlStr, rewriteComponent, saveHiddenChannelIdsToStorage, secondToTime, setCookie, stringToNumber, stripHtmlTags, uint8ArrayToBase64, uint8ArrayToNumberArray, unfollowUser, updateUrlParams, uploadFile, uploadToS3WithPresignedUrl, validatePasswordPair, withInspectorMeta };
21
+ export { eventBus as EventBus, HttpClient, HttpError, INSPECTOR_META_KEY, ImageCompressionQualityRule, InferSchemaProps, MaterialComponentMode, MaterialComponentProps, MaterialMap, PresignedUploadInfo, RequestConfig, RequestMethod, ResponseData, SchemaHasDefaultValue, UploadFileResult, UploadToS3Options, UploadToS3Result, base64ToUint8Array, checkFollowStatus, clearMyChannelsFromStorage, cn, components, compressImage, createInputAndSelectFile, debounceFun, decryptImageToArrayBuffer, decryptImageToUint8Array, decryptImageUrl, defaultImageCompressionMaxSizeMB, defaultImageCompressionQuality, defineArrayItemPropSchema, defineCheckboxPropSchema, defineColorPropSchema, defineComponentPropsSchema, defineDatetimePropSchema, defineMaterial, defineNumberPropSchema, defineObjectPropSchema, defineSelectEnumPropSchema, defineSelectPropSchema, defineSwitchPropSchema, defineTextPropSchema, defineTextareaPropSchema, defineTimeRangePropSchema, disablePageScroll, enablePageScroll, encryptBncBuffer, followUser, formatVideoDuration, generateDynamicSign, generateMaterialMap, generateUUID, getAppId, getAtUserElement, getCookie, getCoverImage, getCurrentSecondTime, getCurrentUserId, getImageCompressionQuality, getImageResolutionFromFile, getResUrl, getSchemaDefaultProps, getUserId, guessImageContentTypeFromUrl, hashPassword, httpClient, imageCompressionQualityRules, isClient, isEncryptedImageUrl, isMobileDevice, loadComponent, loadHiddenChannelIdsFromStorage, loadMyChannelsFromStorage, normalizeClassName, numToString, overwriteMaterial, parseResolution, parseTextAtUserIds, pxToVw, randomString, removeCookie, replaceAtUserElement, replaceAtUserElementHtmlStr, rewriteComponent, saveHiddenChannelIdsToStorage, secondToTime, setCookie, stringToNumber, stripHtmlTags, uint8ArrayToBase64, uint8ArrayToNumberArray, unfollowUser, updateUrlParams, uploadFile, uploadToS3WithPresignedUrl, withInspectorMeta };
package/dist/utils.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
 
2
- import{cn as e}from"./utils/cn.mjs";import{clearMyChannelsFromStorage as t,loadHiddenChannelIdsFromStorage as n,loadMyChannelsFromStorage as r,saveHiddenChannelIdsToStorage as i}from"./utils/channel-storage.mjs";import{debounceFun as a,formatVideoDuration as o,generateDynamicSign as s,generateUUID as c,getAtUserElement as l,getCookie as u,getCurrentSecondTime as d,getUserId as f,hashPassword as p,isClient as m,isMobileDevice as h,numToString as g,parseResolution as _,parseTextAtUserIds as v,randomString as y,removeCookie as b,replaceAtUserElement as x,replaceAtUserElementHtmlStr as S,secondToTime as C,setCookie as w,stringToNumber as T,stripHtmlTags as E,updateUrlParams as D}from"./utils/common.mjs";import O from"./utils/get-res-url.mjs";import{decryptImageToArrayBuffer as k,decryptImageToUint8Array as A,decryptImageUrl as j,guessImageContentTypeFromUrl as M,isEncryptedImageUrl as N}from"./utils/decrypt-image-client.mjs";import P from"./utils/event-bus.mjs";import F,{HttpClient as I,HttpError as L}from"./utils/http.mjs";import{checkFollowStatus as R,followUser as z,getAppId as B,getCurrentUserId as V,unfollowUser as H}from"./utils/follow-service.mjs";import{disablePageScroll as U,enablePageScroll as W,normalizeClassName as G,pxToVw as K}from"./utils/helper.mjs";import{compressImage as q,defaultImageCompressionMaxSizeMB as J,defaultImageCompressionQuality as Y,getImageCompressionQuality as X,imageCompressionQualityRules as Z}from"./utils/image-compression.mjs";import{components as Q,loadComponent as $,rewriteComponent as ee}from"./utils/loaders.mjs";import{createInputAndSelectFile as te,getCoverImage as ne,getImageResolutionFromFile as re}from"./utils/media.mjs";import{PASSWORD_ALLOWED_SPECIAL_CHARS as ie,PASSWORD_MAX_LENGTH as ae,PASSWORD_MIN_LENGTH as oe,getFirstInvalidPasswordChar as se,getPasswordCharacterTypeCount as ce,getPasswordValidationErrorText as le,validatePasswordPair as ue}from"./utils/password-validator.mjs";import{uploadToS3WithPresignedUrl as de}from"./utils/s3-uploader.mjs";import{defineMaterial as fe,overwriteMaterial as pe}from"./utils/schema/material.mjs";import{INSPECTOR_META_KEY as me,defineArrayItemPropSchema as he,defineCheckboxPropSchema as ge,defineColorPropSchema as _e,defineComponentPropsSchema as ve,defineDatetimePropSchema as ye,defineNumberPropSchema as be,defineObjectPropSchema as xe,defineSelectEnumPropSchema as Se,defineSelectPropSchema as Ce,defineSwitchPropSchema as we,defineTextPropSchema as Te,defineTextareaPropSchema as Ee,defineTimeRangePropSchema as De,getSchemaDefaultProps as Oe,withInspectorMeta as ke}from"./utils/schema/schema.mjs";import{generateMaterialMap as Ae,generateMaterialMapGroupByCategory as je}from"./utils/schema/utils.mjs";import{base64ToUint8Array as Me,uint8ArrayToBase64 as Ne,uint8ArrayToNumberArray as Pe}from"./utils/uint8.mjs";import{encryptBncBuffer as Fe,uploadFile as Ie}from"./utils/upload-file.mjs";export{P as EventBus,I as HttpClient,L as HttpError,me as INSPECTOR_META_KEY,ie as PASSWORD_ALLOWED_SPECIAL_CHARS,ae as PASSWORD_MAX_LENGTH,oe as PASSWORD_MIN_LENGTH,Me as base64ToUint8Array,R as checkFollowStatus,t as clearMyChannelsFromStorage,e as cn,Q as components,q as compressImage,te as createInputAndSelectFile,a as debounceFun,k as decryptImageToArrayBuffer,A as decryptImageToUint8Array,j as decryptImageUrl,J as defaultImageCompressionMaxSizeMB,Y as defaultImageCompressionQuality,he as defineArrayItemPropSchema,ge as defineCheckboxPropSchema,_e as defineColorPropSchema,ve as defineComponentPropsSchema,ye as defineDatetimePropSchema,fe as defineMaterial,be as defineNumberPropSchema,xe as defineObjectPropSchema,Se as defineSelectEnumPropSchema,Ce as defineSelectPropSchema,we as defineSwitchPropSchema,Te as defineTextPropSchema,Ee as defineTextareaPropSchema,De as defineTimeRangePropSchema,U as disablePageScroll,W as enablePageScroll,Fe as encryptBncBuffer,z as followUser,o as formatVideoDuration,s as generateDynamicSign,Ae as generateMaterialMap,je as generateMaterialMapGroupByCategory,c as generateUUID,B as getAppId,l as getAtUserElement,u as getCookie,ne as getCoverImage,d as getCurrentSecondTime,V as getCurrentUserId,se as getFirstInvalidPasswordChar,X as getImageCompressionQuality,re as getImageResolutionFromFile,ce as getPasswordCharacterTypeCount,le as getPasswordValidationErrorText,O as getResUrl,Oe as getSchemaDefaultProps,f as getUserId,M as guessImageContentTypeFromUrl,p as hashPassword,F as httpClient,Z as imageCompressionQualityRules,m as isClient,N as isEncryptedImageUrl,h as isMobileDevice,$ as loadComponent,n as loadHiddenChannelIdsFromStorage,r as loadMyChannelsFromStorage,G as normalizeClassName,g as numToString,pe as overwriteMaterial,_ as parseResolution,v as parseTextAtUserIds,K as pxToVw,y as randomString,b as removeCookie,x as replaceAtUserElement,S as replaceAtUserElementHtmlStr,ee as rewriteComponent,i as saveHiddenChannelIdsToStorage,C as secondToTime,w as setCookie,T as stringToNumber,E as stripHtmlTags,Ne as uint8ArrayToBase64,Pe as uint8ArrayToNumberArray,H as unfollowUser,D as updateUrlParams,Ie as uploadFile,de as uploadToS3WithPresignedUrl,ue as validatePasswordPair,ke as withInspectorMeta};
2
+ import{cn as e}from"./utils/cn.mjs";import{clearMyChannelsFromStorage as t,loadHiddenChannelIdsFromStorage as n,loadMyChannelsFromStorage as r,saveHiddenChannelIdsToStorage as i}from"./utils/channel-storage.mjs";import{debounceFun as a,formatVideoDuration as o,generateDynamicSign as s,generateUUID as c,getAtUserElement as l,getCookie as u,getCurrentSecondTime as d,getUserId as f,hashPassword as p,isClient as m,isMobileDevice as h,numToString as g,parseResolution as _,parseTextAtUserIds as v,randomString as y,removeCookie as b,replaceAtUserElement as x,replaceAtUserElementHtmlStr as S,secondToTime as C,setCookie as w,stringToNumber as T,stripHtmlTags as E,updateUrlParams as D}from"./utils/common.mjs";import O from"./utils/get-res-url.mjs";import{decryptImageToArrayBuffer as k,decryptImageToUint8Array as A,decryptImageUrl as j,guessImageContentTypeFromUrl as M,isEncryptedImageUrl as N}from"./utils/decrypt-image-client.mjs";import P from"./utils/event-bus.mjs";import F,{HttpClient as I,HttpError as L}from"./utils/http.mjs";import{checkFollowStatus as R,followUser as z,getAppId as B,getCurrentUserId as V,unfollowUser as H}from"./utils/follow-service.mjs";import{disablePageScroll as U,enablePageScroll as W,normalizeClassName as G,pxToVw as K}from"./utils/helper.mjs";import{compressImage as q,defaultImageCompressionMaxSizeMB as J,defaultImageCompressionQuality as Y,getImageCompressionQuality as X,imageCompressionQualityRules as Z}from"./utils/image-compression.mjs";import{components as Q,loadComponent as $,rewriteComponent as ee}from"./utils/loaders.mjs";import{createInputAndSelectFile as te,getCoverImage as ne,getImageResolutionFromFile as re}from"./utils/media.mjs";import{uploadToS3WithPresignedUrl as ie}from"./utils/s3-uploader.mjs";import{defineMaterial as ae,overwriteMaterial as oe}from"./utils/schema/material.mjs";import{INSPECTOR_META_KEY as se,defineArrayItemPropSchema as ce,defineCheckboxPropSchema as le,defineColorPropSchema as ue,defineComponentPropsSchema as de,defineDatetimePropSchema as fe,defineNumberPropSchema as pe,defineObjectPropSchema as me,defineSelectEnumPropSchema as he,defineSelectPropSchema as ge,defineSwitchPropSchema as _e,defineTextPropSchema as ve,defineTextareaPropSchema as ye,defineTimeRangePropSchema as be,getSchemaDefaultProps as xe,withInspectorMeta as Se}from"./utils/schema/schema.mjs";import{generateMaterialMap as Ce}from"./utils/schema/utils.mjs";import{base64ToUint8Array as we,uint8ArrayToBase64 as Te,uint8ArrayToNumberArray as Ee}from"./utils/uint8.mjs";import{encryptBncBuffer as De,uploadFile as Oe}from"./utils/upload-file.mjs";export{P as EventBus,I as HttpClient,L as HttpError,se as INSPECTOR_META_KEY,we as base64ToUint8Array,R as checkFollowStatus,t as clearMyChannelsFromStorage,e as cn,Q as components,q as compressImage,te as createInputAndSelectFile,a as debounceFun,k as decryptImageToArrayBuffer,A as decryptImageToUint8Array,j as decryptImageUrl,J as defaultImageCompressionMaxSizeMB,Y as defaultImageCompressionQuality,ce as defineArrayItemPropSchema,le as defineCheckboxPropSchema,ue as defineColorPropSchema,de as defineComponentPropsSchema,fe as defineDatetimePropSchema,ae as defineMaterial,pe as defineNumberPropSchema,me as defineObjectPropSchema,he as defineSelectEnumPropSchema,ge as defineSelectPropSchema,_e as defineSwitchPropSchema,ve as defineTextPropSchema,ye as defineTextareaPropSchema,be as defineTimeRangePropSchema,U as disablePageScroll,W as enablePageScroll,De as encryptBncBuffer,z as followUser,o as formatVideoDuration,s as generateDynamicSign,Ce as generateMaterialMap,c as generateUUID,B as getAppId,l as getAtUserElement,u as getCookie,ne as getCoverImage,d as getCurrentSecondTime,V as getCurrentUserId,X as getImageCompressionQuality,re as getImageResolutionFromFile,O as getResUrl,xe as getSchemaDefaultProps,f as getUserId,M as guessImageContentTypeFromUrl,p as hashPassword,F as httpClient,Z as imageCompressionQualityRules,m as isClient,N as isEncryptedImageUrl,h as isMobileDevice,$ as loadComponent,n as loadHiddenChannelIdsFromStorage,r as loadMyChannelsFromStorage,G as normalizeClassName,g as numToString,oe as overwriteMaterial,_ as parseResolution,v as parseTextAtUserIds,K as pxToVw,y as randomString,b as removeCookie,x as replaceAtUserElement,S as replaceAtUserElementHtmlStr,ee as rewriteComponent,i as saveHiddenChannelIdsToStorage,C as secondToTime,w as setCookie,T as stringToNumber,E as stripHtmlTags,Te as uint8ArrayToBase64,Ee as uint8ArrayToNumberArray,H as unfollowUser,D as updateUrlParams,Oe as uploadFile,ie as uploadToS3WithPresignedUrl,Se as withInspectorMeta};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@funhub/platform",
3
3
  "type": "module",
4
- "version": "0.1.52",
4
+ "version": "0.1.53",
5
5
  "private": false,
6
6
  "sideEffects": [
7
7
  "**/*.css"
@@ -62,12 +62,9 @@
62
62
  },
63
63
  "./theme.css": "./theme.css"
64
64
  },
65
- "bin": "./bin/index.mjs",
66
65
  "files": [
67
- "bin",
68
66
  "config",
69
67
  "dist",
70
- "templates",
71
68
  "theme.css"
72
69
  ],
73
70
  "scripts": {
@@ -92,8 +89,7 @@
92
89
  "i18n:build": "node scripts/i18n-flat-sync.mjs build",
93
90
  "i18n:watch": "node scripts/i18n-flat-sync.mjs watch",
94
91
  "i18n:check": "node scripts/i18n-flat-sync.mjs check",
95
- "pretest": "pnpm i18n:build",
96
- "init:local": "node ./bin/index.mjs"
92
+ "pretest": "pnpm i18n:build"
97
93
  },
98
94
  "peerDependencies": {
99
95
  "@tanstack/query-core": ">=5",
@@ -111,7 +107,6 @@
111
107
  "@ncdai/react-wheel-picker": "^1.1.0",
112
108
  "@next/bundle-analyzer": "^16.1.6",
113
109
  "browser-image-compression": "^2.0.2",
114
- "cac": "^6.7.14",
115
110
  "class-variance-authority": "^0.7.1",
116
111
  "clsx": "^2.1.1",
117
112
  "crypto": "^1.0.1",
package/bin/index.mjs DELETED
@@ -1,323 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /* eslint-disable no-console */
4
- import { spawn } from 'node:child_process';
5
- import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from 'node:fs';
6
- import path from 'node:path';
7
- import process from 'node:process';
8
- import { fileURLToPath } from 'node:url';
9
- import { cac } from 'cac';
10
-
11
- const currentFilePath = fileURLToPath(import.meta.url);
12
- const packageRoot = path.resolve(path.dirname(currentFilePath), '..');
13
- const templatesRoot = path.join(packageRoot, 'templates');
14
- const platformPackageJson = JSON.parse(readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
15
-
16
- /**
17
- * 获取可用模板列表。
18
- * @returns {Array<{ name: string, title: string, description: string, directory: string }>}
19
- */
20
- function getAvailableTemplates() {
21
- if (!existsSync(templatesRoot)) {
22
- return [];
23
- }
24
-
25
- return readdirSync(templatesRoot)
26
- .map((entryName) => {
27
- const templateDir = path.join(templatesRoot, entryName);
28
- if (!statSync(templateDir).isDirectory()) {
29
- return null;
30
- }
31
-
32
- const metaFilePath = path.join(templateDir, '_meta.json');
33
- if (!existsSync(metaFilePath)) {
34
- return null;
35
- }
36
-
37
- const meta = JSON.parse(readFileSync(metaFilePath, 'utf8'));
38
-
39
- return {
40
- name: entryName,
41
- title: meta.title || entryName,
42
- description: meta.description || '',
43
- directory: templateDir,
44
- };
45
- })
46
- .filter(Boolean);
47
- }
48
-
49
- /**
50
- * 解析默认包管理器。
51
- * @returns {'pnpm' | 'npm' | 'yarn' | 'bun'}
52
- */
53
- function detectPackageManager() {
54
- const userAgent = process.env.npm_config_user_agent || '';
55
-
56
- if (userAgent.startsWith('yarn/')) {
57
- return 'yarn';
58
- }
59
-
60
- if (userAgent.startsWith('bun/')) {
61
- return 'bun';
62
- }
63
-
64
- if (userAgent.startsWith('npm/')) {
65
- return 'npm';
66
- }
67
-
68
- return 'pnpm';
69
- }
70
-
71
- /**
72
- * 根据当前平台返回命令名。
73
- * @param {'pnpm' | 'npm' | 'yarn' | 'bun' | 'git'} command
74
- * @returns {string}
75
- */
76
- function resolveCommand(command) {
77
- return process.platform === 'win32' ? `${command}.cmd` : command;
78
- }
79
-
80
- /**
81
- * 将目录名转换为 npm 包名。
82
- * @param {string} projectName
83
- * @returns {string}
84
- */
85
- function toPackageName(projectName) {
86
- return projectName
87
- .trim()
88
- .toLowerCase()
89
- .replace(/\s+/g, '-')
90
- .replace(/[^a-z0-9-_.~/@]/g, '-')
91
- .replace(/-+/g, '-');
92
- }
93
-
94
- /**
95
- * 校验项目名是否合法。
96
- * @param {string} projectName
97
- */
98
- function validateProjectName(projectName) {
99
- if (!projectName) {
100
- throw new Error('项目名不能为空。');
101
- }
102
-
103
- if (projectName === '.' || projectName === '..') {
104
- return;
105
- }
106
-
107
- if (!/^[\w.-]+$/.test(projectName)) {
108
- throw new Error('项目目录名仅支持字母、数字、点、中划线和下划线。');
109
- }
110
- }
111
-
112
- /**
113
- * 递归遍历目录文件。
114
- * @param {string} targetDir
115
- * @returns {string[]}
116
- */
117
- function collectFiles(targetDir) {
118
- const entries = readdirSync(targetDir, { withFileTypes: true });
119
- const filePaths = [];
120
-
121
- for (const entry of entries) {
122
- const entryPath = path.join(targetDir, entry.name);
123
- if (entry.isDirectory()) {
124
- filePaths.push(...collectFiles(entryPath));
125
- continue;
126
- }
127
- filePaths.push(entryPath);
128
- }
129
-
130
- return filePaths;
131
- }
132
-
133
- /**
134
- * 判断文件是否可按文本方式渲染。
135
- * @param {string} filePath
136
- * @returns {boolean}
137
- */
138
- function isRenderableTextFile(filePath) {
139
- return /\.(?:json|md|tsx?|jsx?|mjs|cjs|css|txt|ya?ml|gitignore)$/i.test(filePath);
140
- }
141
-
142
- /**
143
- * 渲染模板目录中的占位符文件。
144
- * @param {string} targetDir
145
- * @param {Record<string, string>} variables
146
- */
147
- function renderTemplateFiles(targetDir, variables) {
148
- const filePaths = collectFiles(targetDir);
149
-
150
- for (const filePath of filePaths) {
151
- const dirName = path.dirname(filePath);
152
- const baseName = path.basename(filePath);
153
-
154
- if (baseName === '__dot__gitignore') {
155
- renameSync(filePath, path.join(dirName, '.gitignore'));
156
- continue;
157
- }
158
-
159
- if (baseName.endsWith('.template')) {
160
- const nextFilePath = path.join(dirName, baseName.replace(/\.template$/, ''));
161
- renameSync(filePath, nextFilePath);
162
- renderSingleFile(nextFilePath, variables);
163
- continue;
164
- }
165
-
166
- renderSingleFile(filePath, variables);
167
- }
168
- }
169
-
170
- /**
171
- * 渲染单个文本文件。
172
- * @param {string} filePath
173
- * @param {Record<string, string>} variables
174
- */
175
- function renderSingleFile(filePath, variables) {
176
- if (!isRenderableTextFile(filePath)) {
177
- return;
178
- }
179
-
180
- let content = readFileSync(filePath, 'utf8');
181
- for (const [key, value] of Object.entries(variables)) {
182
- content = content.replaceAll(`{{${key}}}`, value);
183
- }
184
- writeFileSync(filePath, content);
185
- }
186
-
187
- /**
188
- * 执行子进程命令。
189
- * @param {string} command
190
- * @param {string[]} args
191
- * @param {string} cwd
192
- * @returns {Promise<void>}
193
- */
194
- function runCommand(command, args, cwd) {
195
- return new Promise((resolve, reject) => {
196
- const child = spawn(resolveCommand(command), args, {
197
- cwd,
198
- stdio: 'inherit',
199
- shell: false,
200
- });
201
-
202
- child.on('close', (code) => {
203
- if (code === 0) {
204
- resolve();
205
- return;
206
- }
207
-
208
- reject(new Error(`${command} ${args.join(' ')} 执行失败,退出码 ${code}`));
209
- });
210
- });
211
- }
212
-
213
- /**
214
- * 获取安装命令。
215
- * @param {'pnpm' | 'npm' | 'yarn' | 'bun'} packageManager
216
- * @returns {{ command: string, args: string[] }}
217
- */
218
- function getInstallCommand(packageManager) {
219
- switch (packageManager) {
220
- case 'npm':
221
- return { command: 'npm', args: ['install'] };
222
- case 'yarn':
223
- return { command: 'yarn', args: [] };
224
- case 'bun':
225
- return { command: 'bun', args: ['install'] };
226
- default:
227
- return { command: 'pnpm', args: ['install'] };
228
- }
229
- }
230
-
231
- /**
232
- * 初始化项目。
233
- * @param {string | undefined} inputName
234
- * @param {{ template?: string, pm?: 'pnpm' | 'npm' | 'yarn' | 'bun', install?: boolean, git?: boolean, force?: boolean }} options
235
- */
236
- async function initProject(inputName, options) {
237
- const templateName = options.template || 'base';
238
- const packageManager = options.pm || detectPackageManager();
239
- const availableTemplates = getAvailableTemplates();
240
- const matchedTemplate = availableTemplates.find(item => item.name === templateName);
241
-
242
- if (!matchedTemplate) {
243
- throw new Error(`未找到模板 ${templateName},可用模板:${availableTemplates.map(item => item.name).join(', ')}`);
244
- }
245
-
246
- const workingDir = process.cwd();
247
- const projectName = inputName || 'funhub-app';
248
- validateProjectName(projectName);
249
-
250
- const targetDir = path.resolve(workingDir, projectName);
251
- const targetExists = existsSync(targetDir);
252
- const targetBaseName = projectName === '.' ? path.basename(workingDir) : path.basename(targetDir);
253
- const packageName = toPackageName(targetBaseName);
254
-
255
- if (targetExists) {
256
- const targetEntries = readdirSync(targetDir);
257
- if (targetEntries.length > 0) {
258
- if (!options.force) {
259
- throw new Error(`目标目录 ${targetDir} 非空,请改用空目录或显式传入 --force。`);
260
- }
261
- rmSync(targetDir, { recursive: true, force: true });
262
- }
263
- }
264
-
265
- mkdirSync(targetDir, { recursive: true });
266
-
267
- const sourceTemplateDir = path.join(matchedTemplate.directory, 'template');
268
- cpSync(sourceTemplateDir, targetDir, { recursive: true });
269
-
270
- renderTemplateFiles(targetDir, {
271
- PROJECT_NAME: targetBaseName,
272
- PACKAGE_NAME: packageName,
273
- PLATFORM_VERSION: platformPackageJson.version,
274
- });
275
-
276
- console.log(`\n已创建 Funhub 项目:${targetBaseName}`);
277
- console.log(`模板:${matchedTemplate.title}`);
278
- console.log(`目录:${targetDir}`);
279
-
280
- if (options.install !== false) {
281
- const installCommand = getInstallCommand(packageManager);
282
- console.log(`\n正在安装依赖(${packageManager})...`);
283
- await runCommand(installCommand.command, installCommand.args, targetDir);
284
- }
285
-
286
- if (options.git !== false) {
287
- console.log('\n正在初始化 Git 仓库...');
288
- await runCommand('git', ['init'], targetDir);
289
- }
290
-
291
- const relativeTargetDir = path.relative(workingDir, targetDir) || '.';
292
- console.log('\n下一步:');
293
- if (relativeTargetDir !== '.') {
294
- console.log(` cd ${relativeTargetDir}`);
295
- }
296
- if (options.install === false) {
297
- const installCommand = getInstallCommand(packageManager);
298
- console.log(` ${installCommand.command} ${installCommand.args.join(' ')}`.trimEnd());
299
- }
300
- console.log(` ${packageManager} dev`);
301
- }
302
-
303
- const cli = cac('@funhub/platform');
304
-
305
- cli
306
- .command('init [project-name]', '初始化一个 Funhub 应用')
307
- .option('--template <template>', '模板名称,默认 base')
308
- .option('--pm <packageManager>', '包管理器,可选 pnpm/npm/yarn/bun')
309
- .option('--no-install', '跳过依赖安装')
310
- .option('--no-git', '跳过 git init')
311
- .option('--force', '强制覆盖非空目录')
312
- .action(async (projectName, options) => {
313
- try {
314
- await initProject(projectName, options);
315
- }
316
- catch (error) {
317
- console.error(`\n❌ ${(error && error.message) || '初始化失败'}`);
318
- process.exit(1);
319
- }
320
- });
321
-
322
- cli.help();
323
- cli.parse();
@@ -1,2 +0,0 @@
1
-
2
- var e=`data:image/png;base64,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`;export{e as default};
@@ -1,10 +0,0 @@
1
-
2
- //#region components/biz/business/home-recommend/variants/home-recommend-grid/defaults/default-props.d.ts
3
- /**
4
- * HomeRecommendGrid 组件默认 Props 配置。
5
- */
6
- declare const defaultProps: {
7
- /** 更多跳转链接(空字符串表示使用默认规则)。 */moreLink: string;
8
- };
9
- //#endregion
10
- export { defaultProps };
@@ -1,2 +0,0 @@
1
-
2
- const e={moreLink:``};export{e as defaultProps};
@@ -1,20 +0,0 @@
1
-
2
- import { BaseComponentProps } from "../../../../../utils/types/component.mjs";
3
- import "../../../../../utils/index.mjs";
4
- import { MaterialComponentMode } from "../../../../../../../utils/schema/schema.mjs";
5
- import "../../../../../../../utils/schema/index.mjs";
6
- import { HomeRecommendData } from "../../../types.mjs";
7
- import * as react_jsx_runtime0 from "react/jsx-runtime";
8
-
9
- //#region components/biz/business/home-recommend/variants/home-recommend-grid/runtime/client.d.ts
10
- /**
11
- * 首页推荐两列宫格布局。
12
- */
13
- declare function HomeRecommendGridClient({
14
- mode,
15
- ...props
16
- }: BaseComponentProps<HomeRecommendData> & {
17
- mode?: MaterialComponentMode;
18
- }): react_jsx_runtime0.JSX.Element;
19
- //#endregion
20
- export { HomeRecommendGridClient };
@@ -1,2 +0,0 @@
1
-
2
- "use client";import e from"../../../shared/home-recommend-base.mjs";import{buildHomeRecommendEditorPreviewData as t}from"../../../shared/home-recommend-preview.mjs";import{useMemo as n}from"react";import{jsx as r}from"react/jsx-runtime";function i({mode:i=`renderer`,...a}){let o=i===`editor`,s=a.props||{},c=n(()=>o?t({variant:`grid`,schemaTitle:s.title,enableInfinite:s.enableInfinite,data:a.data}):a.data,[o,a.data,s.enableInfinite,s.title]);return r(`div`,{className:o?`pointer-events-none`:void 0,children:r(e,{variant:`grid`,mode:i,...a,data:c})})}export{i as default};
@@ -1,2 +0,0 @@
1
-
2
- const e={moreLink:{type:`string`,title:`更多`,description:``,default:``}};export{e as propsSchema};
@@ -1,8 +0,0 @@
1
-
2
- //#region components/biz/business/home-recommend/variants/home-recommend-waterfall/defaults/default-props.d.ts
3
- /**
4
- * HomeRecommendWaterfall 组件默认 Props 配置。
5
- */
6
- declare const defaultProps: {};
7
- //#endregion
8
- export { defaultProps };