@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.
- package/README.md +0 -13
- package/dist/biz.d.mts +8 -10
- package/dist/biz.mjs +1 -1
- package/dist/components/biz/business/banner/variants/basic-banner/material.d.mts +1 -1
- package/dist/components/biz/business/banner-carousel/material.d.mts +1 -1
- package/dist/components/biz/business/channel-list/material.d.mts +1 -1
- package/dist/components/biz/business/detail/materials/registry.d.mts +7 -6
- package/dist/components/biz/business/detail/materials/runtime-context-provider.mjs +2 -0
- package/dist/components/biz/business/detail/materials/video-detail-actions/client.d.mts +0 -2
- package/dist/components/biz/business/detail/materials/video-detail-actions/client.mjs +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-actions/material.d.mts +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-actions/schema.d.mts +1 -5
- package/dist/components/biz/business/detail/materials/video-detail-info/client.d.mts +0 -4
- package/dist/components/biz/business/detail/materials/video-detail-info/client.mjs +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-info/material.d.mts +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-info/schema.d.mts +1 -7
- package/dist/components/biz/business/detail/materials/video-detail-info-title/client.d.mts +0 -1
- package/dist/components/biz/business/detail/materials/video-detail-info-title/client.mjs +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-info-title/material.d.mts +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-info-title/schema.d.mts +1 -4
- package/dist/components/biz/business/detail/materials/video-detail-info-title-tags-episodes/client.d.mts +0 -3
- package/dist/components/biz/business/detail/materials/video-detail-info-title-tags-episodes/client.mjs +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-info-title-tags-episodes/material.d.mts +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-info-title-tags-episodes/schema.d.mts +1 -6
- package/dist/components/biz/business/detail/materials/video-detail-player/client.d.mts +0 -3
- package/dist/components/biz/business/detail/materials/video-detail-player/client.mjs +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-player/material.d.mts +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-player/schema.d.mts +1 -6
- package/dist/components/biz/business/detail/materials/video-detail-recommend/client.d.mts +1 -2
- package/dist/components/biz/business/detail/materials/video-detail-recommend/client.mjs +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-recommend/material.d.mts +2 -1
- package/dist/components/biz/business/detail/materials/video-detail-recommend/schema.d.mts +2 -3
- package/dist/components/biz/business/detail/materials/video-detail-recommend/schema.mjs +1 -1
- package/dist/components/biz/business/detail/materials/video-detail-recommend/utils.mjs +1 -1
- package/dist/components/biz/business/floating-ball/material.d.mts +1 -1
- package/dist/components/biz/business/header-search/header-avatar-icon/material.d.mts +1 -1
- package/dist/components/biz/business/header-search/header-avatar-logo-search/material.d.mts +1 -1
- package/dist/components/biz/business/header-search/header-avatar-logo-search-icon/material.d.mts +1 -1
- package/dist/components/biz/business/header-search/header-logo-search/material.d.mts +1 -1
- package/dist/components/biz/business/header-search/header-search/material.d.mts +1 -1
- package/dist/components/biz/business/home-recommend/index.d.mts +4 -6
- package/dist/components/biz/business/home-recommend/shared/home-recommend-base.mjs +1 -1
- package/dist/components/biz/business/home-recommend/shared/home-recommend-default-config.mjs +2 -0
- package/dist/components/biz/business/home-recommend/shared/home-recommend-feed-mode.mjs +2 -0
- package/dist/components/biz/business/home-recommend/shared/home-recommend-preview.mjs +1 -1
- package/dist/components/biz/business/home-recommend/shared/home-recommend-server-data.mjs +2 -0
- package/dist/components/biz/business/home-recommend/shared/home-recommend-video-detail.mjs +2 -0
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/index.d.mts +2 -3
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/index.mjs +1 -1
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/inspector-schema.d.mts +35 -1
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/inspector-schema.mjs +1 -1
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/material.d.mts +29 -3
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/material.mjs +1 -1
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/runtime/prefetch-client.d.mts +27 -0
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/runtime/prefetch-client.mjs +2 -0
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/schema/index.mjs +1 -1
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/server.d.mts +3 -6
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/server.mjs +1 -1
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/index.d.mts +2 -3
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/index.mjs +1 -1
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/inspector-schema.d.mts +30 -2
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/inspector-schema.mjs +1 -1
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/material.d.mts +26 -4
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/material.mjs +1 -1
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/runtime/prefetch-client.d.mts +27 -0
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/runtime/prefetch-client.mjs +2 -0
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/schema/index.mjs +1 -1
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/server.d.mts +3 -6
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/server.mjs +1 -1
- package/dist/components/biz/business/index.d.mts +11 -13
- package/dist/components/biz/business/large-feature-grid/card-item.mjs +1 -1
- package/dist/components/biz/business/large-feature-grid/material.d.mts +2 -2
- package/dist/components/biz/business/marquee/material.d.mts +1 -1
- package/dist/components/biz/business/profile/profile-header/material.d.mts +2 -2
- package/dist/components/biz/business/profile/profile-header/user-profile-avatar.mjs +1 -1
- package/dist/components/biz/business/profile/profile-header/user-profile-cover-background.mjs +1 -1
- package/dist/components/biz/business/profile/profile-main/material.d.mts +1 -1
- package/dist/components/biz/business/search-history/material.d.mts +1 -1
- package/dist/components/biz/business/search-input/material.d.mts +1 -1
- package/dist/components/biz/business/shortcut-grid/material.d.mts +1 -1
- package/dist/components/biz/business/tab-bar/material.d.mts +2 -2
- package/dist/components/biz/business/tab-bar/schema.d.mts +1 -1
- package/dist/components/biz/business/text-recommend/material.d.mts +1 -1
- package/dist/components/biz/business/video-horizontal-list/material.d.mts +1 -1
- package/dist/components/biz/example/button/material.d.mts +1 -1
- package/dist/components/biz/example/button/material.mjs +1 -1
- package/dist/components/biz/utils/transformers/data.mjs +1 -1
- package/dist/components/common/cards/mini-three-card.mjs +1 -1
- package/dist/components/pages/(follow)/_components/follow-button/index.mjs +1 -1
- package/dist/components/pages/login/password.mjs +1 -1
- package/dist/components/pages/login/register.mjs +1 -1
- package/dist/components/pages/login/reset-password.mjs +1 -1
- package/dist/components/pages/login/verify.mjs +1 -1
- package/dist/components/pages/search-result/page-client.mjs +1 -1
- package/dist/components/pages/search-result/search-all.mjs +1 -1
- package/dist/components/pages/search-result/search-tab.mjs +1 -1
- package/dist/components/pages/search-result/search-user.mjs +1 -1
- package/dist/components/pages/search-result/search-video.mjs +1 -1
- package/dist/components/pages/settings/_components/reset-password-drawer.mjs +1 -1
- package/dist/components/pages/settings/_components/settings.mjs +1 -1
- package/dist/components/pages/video-detail/video-detail-client.mjs +1 -1
- package/dist/components/ui/badge.d.mts +1 -1
- package/dist/components/ui/button.d.mts +1 -1
- package/dist/components/ui/image.d.mts +4 -4
- package/dist/i18n/locales/en.mjs +1 -1
- package/dist/i18n/locales/zh-CN.mjs +1 -1
- package/dist/service/content-batch-get-video-detail.d.mts +21 -0
- package/dist/service/content-batch-get-video-detail.mjs +2 -0
- package/dist/service.d.mts +2 -1
- package/dist/service.mjs +1 -1
- package/dist/utils/schema/index.d.mts +1 -1
- package/dist/utils/schema/material.d.mts +9 -7
- package/dist/utils/schema/utils.d.mts +3 -13
- package/dist/utils/schema/utils.mjs +1 -1
- package/dist/utils.d.mts +2 -3
- package/dist/utils.mjs +1 -1
- package/package.json +2 -7
- package/bin/index.mjs +0 -323
- package/dist/assets/images/user/default_avatar.mjs +0 -2
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/defaults/default-props.d.mts +0 -10
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/defaults/default-props.mjs +0 -2
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/runtime/client.d.mts +0 -20
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/runtime/client.mjs +0 -2
- package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/schema/props.schema.mjs +0 -2
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/defaults/default-props.d.mts +0 -8
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/defaults/default-props.mjs +0 -2
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/runtime/client.d.mts +0 -20
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/runtime/client.mjs +0 -2
- package/dist/components/biz/business/home-recommend/variants/home-recommend-waterfall/schema/props.schema.mjs +0 -2
- package/dist/utils/password-validator.d.mts +0 -28
- package/dist/utils/password-validator.mjs +0 -2
- package/templates/base/_meta.json +0 -4
- package/templates/base/template/README.md.template +0 -32
- package/templates/base/template/__dot__gitignore +0 -6
- package/templates/base/template/app/[locale]/layout.tsx.template +0 -36
- package/templates/base/template/app/[locale]/page.tsx.template +0 -24
- package/templates/base/template/app/globals.css +0 -26
- package/templates/base/template/app/layout.tsx.template +0 -38
- package/templates/base/template/eslint.config.mjs.template +0 -68
- package/templates/base/template/i18n/request.ts.template +0 -3
- package/templates/base/template/next-env.d.ts.template +0 -4
- package/templates/base/template/next.config.ts.template +0 -21
- package/templates/base/template/package.json.template +0 -37
- package/templates/base/template/postcss.config.js.template +0 -18
- package/templates/base/template/proxy.ts.template +0 -18
- package/templates/base/template/tailwind.config.cjs.template +0 -13
- 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
|
|
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:
|
|
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
|
|
42
|
-
interface OverwriteMaterialOption<TServerComponent extends ComponentType<any>, TClientComponent extends ComponentType<any>, TPropsSchema extends MaterialPropsSchema
|
|
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,
|
|
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,
|
|
56
|
+
export { DefineMaterialOption, defineMaterial, overwriteMaterial };
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
|
|
2
|
-
import { DefineMaterialOption
|
|
2
|
+
import { DefineMaterialOption } from "./material.mjs";
|
|
3
3
|
|
|
4
4
|
//#region utils/schema/utils.d.ts
|
|
5
|
-
type MaterialLike = DefineMaterialOption<any, any, any, string
|
|
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
|
|
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),{})}
|
|
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
|
|
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,
|
|
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{
|
|
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.
|
|
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,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 };
|
package/dist/components/biz/business/home-recommend/variants/home-recommend-grid/runtime/client.mjs
DELETED
|
@@ -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};
|