UNPKG

@restnfeel/agentc-starter-kit

Version:

한국어 기업용 CMS 모듈 - Task Master AI와 함께 빠르게 웹사이트를 구현할 수 있는 재사용 가능한 컴포넌트 시스템

375 lines (329 loc) 10.5 kB
import { TemplateBase } from "../base-template"; import { BaseTemplate, BaseComponent, ComponentType, ServiceTier, TemplateContext, } from "../../../types/template-system"; /** * Plus 티어 템플릿 클래스 * 모든 기능이 포함된 프리미엄 티어 템플릿 */ export class PlusTemplate extends TemplateBase { constructor(template: BaseTemplate) { super(template); this.template.tier = ServiceTier.PLUS; this.initializePlusFeatures(); } /** * Plus tier 허용 컴포넌트 타입 */ private static readonly ALLOWED_COMPONENTS: ComponentType[] = [ ComponentType.HEADER, ComponentType.HERO, ComponentType.ABOUT, ComponentType.SERVICES, ComponentType.TESTIMONIALS, ComponentType.TEAM, ComponentType.CONTACT, ComponentType.FOOTER, ComponentType.BLOG, // Plus tier exclusive ComponentType.NEWSLETTER, // Plus tier exclusive ComponentType.SOCIAL, // Plus tier exclusive ]; /** * Plus tier 전용 고급 기능 */ private static readonly PLUS_FEATURES = [ "white-label", "multi-language", "e-commerce-integration", "advanced-analytics", "custom-domains", "api-integration", "automation", "priority-support", ]; /** * 컴포넌트 props 생성 */ protected createComponentProps( component: BaseComponent, context: TemplateContext ): Record<string, unknown> { // Plus tier 기본 props const baseProps = { id: component.id, type: component.type, title: component.title, description: component.description, settings: component.settings, context: context, }; // Plus tier 고급 기능 추가 return { ...baseProps, isPlusFeature: true, customizationLevel: "advanced", theme: this.template.globalSettings.theme || {}, tier: ServiceTier.PLUS, advancedSettings: this.template.globalSettings.customProperties || {}, }; } /** * 컴포넌트 추가 시 Plus tier 제한 검증 */ public override addComponent(component: BaseComponent): boolean { // Plus tier는 모든 컴포넌트 허용 if (!PlusTemplate.ALLOWED_COMPONENTS.includes(component.type)) { throw new Error( `Plus tier에서 지원하지 않는 컴포넌트입니다: ${component.type}` ); } // 최대 컴포넌트 수 제한 없음 (Plus tier) this.template.components.push(component); return true; } /** * Plus tier 고급 기능 활성화 */ private enableAdvancedFeature(featureName: string): void { if (!this.template.globalSettings.customProperties) { this.template.globalSettings.customProperties = {}; } if (!this.template.globalSettings.customProperties.features) { this.template.globalSettings.customProperties.features = []; } const features = this.template.globalSettings.customProperties .features as string[]; if (!features.includes(featureName)) { features.push(featureName); } } /** * 화이트 라벨링 설정 */ public configureWhiteLabel(config: { hidePoweredBy: boolean; customBranding?: { logo?: string; companyName?: string; primaryColor?: string; }; }): void { this.enableAdvancedFeature("white-label"); if (!this.template.globalSettings.customProperties) { this.template.globalSettings.customProperties = {}; } this.template.globalSettings.customProperties.whiteLabel = config; } /** * 다국어 지원 설정 */ public configureMultiLanguage( languages: string[], defaultLanguage: string ): void { this.enableAdvancedFeature("multi-language"); if (!this.template.globalSettings.customProperties) { this.template.globalSettings.customProperties = {}; } this.template.globalSettings.customProperties.i18n = { supportedLanguages: languages, defaultLanguage, enabled: true, }; } /** * 전자상거래 통합 설정 */ public configureECommerce(config: { provider: "shopify" | "woocommerce" | "stripe"; apiKey: string; enablePayments: boolean; currency: string; }): void { this.enableAdvancedFeature("e-commerce-integration"); if (!this.template.globalSettings.customProperties) { this.template.globalSettings.customProperties = {}; } this.template.globalSettings.customProperties.ecommerce = config; } /** * 고급 분석 설정 */ public configureAdvancedAnalytics(config: { googleAnalyticsId?: string; facebookPixelId?: string; customTracking?: boolean; heatmaps?: boolean; userRecording?: boolean; }): void { this.enableAdvancedFeature("advanced-analytics"); if (!this.template.globalSettings.customProperties) { this.template.globalSettings.customProperties = {}; } const existingAnalytics = this.template.globalSettings.customProperties.analytics || {}; this.template.globalSettings.customProperties.analytics = { ...existingAnalytics, ...config, }; } /** * Plus tier 검증 */ public override validate(): { isValid: boolean; errors: string[] } { const baseValidation = super.validate(); const errors = [...baseValidation.errors]; // Plus tier specific validations const componentCount = this.template.components.length; // Plus tier는 컴포넌트 수 제한 없음, 하지만 권장 사항 확인 if (componentCount > 15) { errors.push( "Plus tier에서도 성능을 위해 15개 이하의 컴포넌트를 권장합니다." ); } // Plus tier 전용 컴포넌트 확인 const hasTeam = this.template.components.some( (c) => c.type === ComponentType.TEAM ); if (!hasTeam) { errors.push( "Plus tier에서는 고급 기능 활용을 위해 Team 컴포넌트 사용을 권장합니다." ); } // 고급 기능 사용 권장 const features = (this.template.globalSettings.customProperties?.features as string[]) || []; const advancedFeaturesUsed = features.filter((f) => PlusTemplate.PLUS_FEATURES.includes(f) ).length; if (advancedFeaturesUsed === 0) { errors.push( "Plus tier의 고급 기능을 활용해보세요. (화이트라벨, 다국어 지원 등)" ); } return { isValid: errors.length === 0, errors, }; } /** * 다운그레이드 시 경고사항 반환 */ public getDowngradeWarnings(targetTier: ServiceTier): { removedComponents: ComponentType[]; disabledFeatures: string[]; dataLoss: string[]; } { const removedComponents: ComponentType[] = []; const disabledFeatures: string[] = []; const dataLoss: string[] = []; if (targetTier === ServiceTier.STARTER) { // Starter tier로 다운그레이드 const starterAllowed = [ ComponentType.HEADER, ComponentType.HERO, ComponentType.CONTACT, ComponentType.FOOTER, ]; removedComponents.push( ...this.template.components .map((c) => c.type) .filter((type) => !starterAllowed.includes(type)) ); disabledFeatures.push(...PlusTemplate.PLUS_FEATURES); dataLoss.push("모든 고급 설정", "커스텀 브랜딩", "다국어 콘텐츠"); } else if (targetTier === ServiceTier.STANDARD) { // Standard tier로 다운그레이드 const standardAllowed = [ ComponentType.HEADER, ComponentType.HERO, ComponentType.ABOUT, ComponentType.SERVICES, ComponentType.TESTIMONIALS, ComponentType.CONTACT, ComponentType.FOOTER, ]; removedComponents.push( ...this.template.components .map((c) => c.type) .filter((type) => !standardAllowed.includes(type)) ); // Plus tier 전용 기능 사용 시 경고 const features = (this.template.globalSettings.customProperties?.features as string[]) || []; const plusFeatures = features.filter((f) => PlusTemplate.PLUS_FEATURES.includes(f) ); disabledFeatures.push(...plusFeatures); dataLoss.push("화이트라벨 설정", "고급 분석", "전자상거래 통합"); } return { removedComponents, disabledFeatures, dataLoss, }; } /** * Plus tier 성능 분석 */ public getPerformanceAnalysis(): { score: number; recommendations: string[]; advancedFeatures: number; integrations: number; } { const features = (this.template.globalSettings.customProperties?.features as string[]) || []; const advancedFeatures = features.filter((f) => PlusTemplate.PLUS_FEATURES.includes(f) ).length; const customProps = this.template.globalSettings.customProperties || {}; const integrations = [ customProps.analytics, customProps.ecommerce, customProps.i18n, ].filter(Boolean).length; // 성능 점수 계산 (컴포넌트 수와 기능 수 기반) const componentCount = this.template.components.length; const baseScore = Math.max(0, 100 - componentCount * 2); const featureBonus = Math.min(20, advancedFeatures * 5); const integrationBonus = Math.min(15, integrations * 5); const score = Math.min(100, baseScore + featureBonus + integrationBonus); const recommendations: string[] = []; if (componentCount > 12) { recommendations.push("컴포넌트 수를 줄여 로딩 속도를 개선하세요"); } if (advancedFeatures < 2) { recommendations.push("Plus tier 고급 기능을 더 활용해보세요"); } if (integrations === 0) { recommendations.push("외부 서비스 통합을 고려해보세요"); } return { score, recommendations, advancedFeatures, integrations, }; } /** * Plus tier 초기화 */ private initializePlusFeatures(): void { if (!this.template.globalSettings.customProperties) { this.template.globalSettings.customProperties = {}; } // Plus tier 기본 설정 this.template.globalSettings.customProperties.tier = ServiceTier.PLUS; this.template.globalSettings.customProperties.maxComponents = -1; // 무제한 this.template.globalSettings.customProperties.advancedCustomization = true; this.template.globalSettings.customProperties.prioritySupport = true; } }