@businessflow/reviews 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,141 @@
1
+ interface Review {
2
+ id: string | number;
3
+ reviewerName: string;
4
+ reviewerEmail?: string;
5
+ reviewerTitle?: string;
6
+ reviewerCompany?: string;
7
+ reviewerAvatar?: string;
8
+ rating: number;
9
+ content?: string;
10
+ createdAt: string | Date;
11
+ updatedAt?: string | Date;
12
+ featured?: boolean;
13
+ approved?: boolean;
14
+ metadata?: Record<string, any>;
15
+ }
16
+ interface ReviewFormData {
17
+ reviewerName: string;
18
+ reviewerEmail: string;
19
+ reviewerTitle?: string;
20
+ reviewerCompany?: string;
21
+ rating: number;
22
+ content?: string;
23
+ [key: string]: any;
24
+ }
25
+ interface ReviewApiResponse {
26
+ success: boolean;
27
+ message?: string;
28
+ reviewId?: string | number;
29
+ status?: 'pending' | 'approved' | 'rejected';
30
+ data?: any;
31
+ }
32
+ interface ReviewSubmissionConfig {
33
+ endpoint: string;
34
+ method?: 'POST' | 'PUT';
35
+ headers?: Record<string, string>;
36
+ maxRetries?: number;
37
+ timeout?: number;
38
+ transformRequest?: (data: ReviewFormData) => any;
39
+ transformResponse?: (response: any) => ReviewApiResponse;
40
+ onSuccess?: (response: ReviewApiResponse) => void;
41
+ onError?: (error: Error) => void;
42
+ }
43
+ interface ReviewFetchConfig {
44
+ endpoint: string;
45
+ method?: 'GET';
46
+ headers?: Record<string, string>;
47
+ maxRetries?: number;
48
+ timeout?: number;
49
+ params?: {
50
+ limit?: number;
51
+ offset?: number;
52
+ featured?: boolean;
53
+ minRating?: number;
54
+ sortBy?: 'date' | 'rating' | 'name';
55
+ sortOrder?: 'asc' | 'desc';
56
+ };
57
+ transformResponse?: (response: any) => Review[];
58
+ onError?: (error: Error) => void;
59
+ }
60
+ interface ReviewFieldConfig {
61
+ show?: boolean;
62
+ required?: boolean;
63
+ label?: string;
64
+ type?: string;
65
+ placeholder?: string;
66
+ validation?: ValidationRule[];
67
+ }
68
+ interface ReviewFormConfig {
69
+ fields?: {
70
+ reviewerName?: ReviewFieldConfig;
71
+ reviewerEmail?: ReviewFieldConfig;
72
+ reviewerTitle?: ReviewFieldConfig;
73
+ reviewerCompany?: ReviewFieldConfig;
74
+ rating?: ReviewFieldConfig;
75
+ content?: ReviewFieldConfig;
76
+ [key: string]: ReviewFieldConfig | undefined;
77
+ };
78
+ recaptcha?: {
79
+ siteKey: string;
80
+ action?: string;
81
+ };
82
+ styling?: {
83
+ className?: string;
84
+ fieldClassName?: string;
85
+ buttonClassName?: string;
86
+ errorClassName?: string;
87
+ starClassName?: string;
88
+ };
89
+ }
90
+ interface TestimonialDisplayConfig {
91
+ limit?: number;
92
+ showRating?: boolean;
93
+ showDate?: boolean;
94
+ showAvatar?: boolean;
95
+ showCompany?: boolean;
96
+ showTitle?: boolean;
97
+ layout?: 'grid' | 'list' | 'slider';
98
+ columns?: number;
99
+ autoRefresh?: boolean;
100
+ refreshInterval?: number;
101
+ styling?: {
102
+ containerClassName?: string;
103
+ cardClassName?: string;
104
+ headerClassName?: string;
105
+ contentClassName?: string;
106
+ ratingClassName?: string;
107
+ };
108
+ }
109
+ interface ValidationRule {
110
+ type: 'required' | 'email' | 'minLength' | 'maxLength' | 'pattern' | 'custom' | 'rating';
111
+ value?: string | number;
112
+ message?: string;
113
+ validator?: (value: any) => boolean | string;
114
+ }
115
+ interface ValidationErrors {
116
+ [field: string]: string;
117
+ }
118
+ interface ReviewHandlerConfig {
119
+ onFetch?: (params?: any) => Promise<Review[]>;
120
+ onSubmit?: (data: ReviewFormData) => Promise<ReviewApiResponse>;
121
+ recaptcha?: {
122
+ secretKey: string;
123
+ minimumScore?: number;
124
+ };
125
+ validation?: {
126
+ [field: string]: ValidationRule[];
127
+ };
128
+ onSuccess?: (data: ReviewFormData, response: ReviewApiResponse) => Promise<void>;
129
+ onError?: (data: ReviewFormData, error: Error) => Promise<void>;
130
+ rateLimiter?: (request: Request) => Promise<boolean>;
131
+ }
132
+ interface StarRatingProps {
133
+ rating: number;
134
+ maxRating?: number;
135
+ editable?: boolean;
136
+ onChange?: (rating: number) => void;
137
+ size?: 'small' | 'medium' | 'large';
138
+ className?: string;
139
+ }
140
+
141
+ export type { Review, ReviewApiResponse, ReviewFetchConfig, ReviewFieldConfig, ReviewFormConfig, ReviewFormData, ReviewHandlerConfig, ReviewSubmissionConfig, StarRatingProps, TestimonialDisplayConfig, ValidationErrors, ValidationRule };
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+
16
+ // src/types/index.ts
17
+ var index_exports = {};
18
+ module.exports = __toCommonJS(index_exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["// Generic review/testimonial data\nexport interface Review {\n id: string | number;\n reviewerName: string;\n reviewerEmail?: string;\n reviewerTitle?: string;\n reviewerCompany?: string;\n reviewerAvatar?: string;\n rating: number; // 1-5 stars\n content?: string;\n createdAt: string | Date;\n updatedAt?: string | Date;\n featured?: boolean;\n approved?: boolean;\n metadata?: Record<string, any>;\n}\n\n// Form data for submitting a new review\nexport interface ReviewFormData {\n reviewerName: string;\n reviewerEmail: string;\n reviewerTitle?: string;\n reviewerCompany?: string;\n rating: number;\n content?: string;\n [key: string]: any; // Allow additional fields\n}\n\n// Generic API response for review operations\nexport interface ReviewApiResponse {\n success: boolean;\n message?: string;\n reviewId?: string | number;\n status?: 'pending' | 'approved' | 'rejected';\n data?: any;\n}\n\n// Configuration for review submission\nexport interface ReviewSubmissionConfig {\n endpoint: string;\n method?: 'POST' | 'PUT';\n headers?: Record<string, string>;\n maxRetries?: number;\n timeout?: number; // in milliseconds\n transformRequest?: (data: ReviewFormData) => any;\n transformResponse?: (response: any) => ReviewApiResponse;\n onSuccess?: (response: ReviewApiResponse) => void;\n onError?: (error: Error) => void;\n}\n\n// Configuration for fetching reviews\nexport interface ReviewFetchConfig {\n endpoint: string;\n method?: 'GET';\n headers?: Record<string, string>;\n maxRetries?: number;\n timeout?: number; // in milliseconds\n params?: {\n limit?: number;\n offset?: number;\n featured?: boolean;\n minRating?: number;\n sortBy?: 'date' | 'rating' | 'name';\n sortOrder?: 'asc' | 'desc';\n };\n transformResponse?: (response: any) => Review[];\n onError?: (error: Error) => void;\n}\n\n// Form field configuration for reviews\nexport interface ReviewFieldConfig {\n show?: boolean;\n required?: boolean;\n label?: string;\n type?: string;\n placeholder?: string;\n validation?: ValidationRule[];\n}\n\n// Review form configuration\nexport interface ReviewFormConfig {\n fields?: {\n reviewerName?: ReviewFieldConfig;\n reviewerEmail?: ReviewFieldConfig;\n reviewerTitle?: ReviewFieldConfig;\n reviewerCompany?: ReviewFieldConfig;\n rating?: ReviewFieldConfig;\n content?: ReviewFieldConfig;\n [key: string]: ReviewFieldConfig | undefined;\n };\n recaptcha?: {\n siteKey: string;\n action?: string;\n };\n styling?: {\n className?: string;\n fieldClassName?: string;\n buttonClassName?: string;\n errorClassName?: string;\n starClassName?: string;\n };\n}\n\n// Display configuration for testimonials\nexport interface TestimonialDisplayConfig {\n limit?: number;\n showRating?: boolean;\n showDate?: boolean;\n showAvatar?: boolean;\n showCompany?: boolean;\n showTitle?: boolean;\n layout?: 'grid' | 'list' | 'slider';\n columns?: number;\n autoRefresh?: boolean;\n refreshInterval?: number; // in milliseconds\n styling?: {\n containerClassName?: string;\n cardClassName?: string;\n headerClassName?: string;\n contentClassName?: string;\n ratingClassName?: string;\n };\n}\n\n// Validation\nexport interface ValidationRule {\n type: 'required' | 'email' | 'minLength' | 'maxLength' | 'pattern' | 'custom' | 'rating';\n value?: string | number;\n message?: string;\n validator?: (value: any) => boolean | string;\n}\n\nexport interface ValidationErrors {\n [field: string]: string;\n}\n\n// Server-side handler configuration\nexport interface ReviewHandlerConfig {\n // User-provided functions\n onFetch?: (params?: any) => Promise<Review[]>;\n onSubmit?: (data: ReviewFormData) => Promise<ReviewApiResponse>;\n \n // Optional reCAPTCHA verification\n recaptcha?: {\n secretKey: string;\n minimumScore?: number;\n };\n \n // Optional validation\n validation?: {\n [field: string]: ValidationRule[];\n };\n \n // Optional logging/monitoring\n onSuccess?: (data: ReviewFormData, response: ReviewApiResponse) => Promise<void>;\n onError?: (data: ReviewFormData, error: Error) => Promise<void>;\n \n // Optional rate limiting (user implements)\n rateLimiter?: (request: Request) => Promise<boolean>;\n}\n\n// Star rating component props\nexport interface StarRatingProps {\n rating: number;\n maxRating?: number;\n editable?: boolean;\n onChange?: (rating: number) => void;\n size?: 'small' | 'medium' | 'large';\n className?: string;\n}"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json ADDED
@@ -0,0 +1,104 @@
1
+ {
2
+ "name": "@businessflow/reviews",
3
+ "version": "1.0.0",
4
+ "description": "Generic review and testimonial management utilities with customizable display components",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.esm.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "require": "./dist/index.js",
12
+ "import": "./dist/index.esm.js"
13
+ },
14
+ "./client": {
15
+ "types": "./dist/client/index.d.ts",
16
+ "require": "./dist/client/index.js",
17
+ "import": "./dist/client/index.esm.js"
18
+ },
19
+ "./server": {
20
+ "types": "./dist/server/index.d.ts",
21
+ "require": "./dist/server/index.js",
22
+ "import": "./dist/server/index.esm.js"
23
+ },
24
+ "./react": {
25
+ "types": "./dist/react/index.d.ts",
26
+ "require": "./dist/react/index.js",
27
+ "import": "./dist/react/index.esm.js"
28
+ },
29
+ "./types": {
30
+ "types": "./dist/types/index.d.ts"
31
+ }
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "README.md",
36
+ "LICENSE"
37
+ ],
38
+ "scripts": {
39
+ "build": "tsup",
40
+ "dev": "tsup --watch",
41
+ "test": "vitest",
42
+ "test:watch": "vitest --watch",
43
+ "test:ui": "vitest --ui",
44
+ "typecheck": "tsc --noEmit",
45
+ "lint": "eslint src --ext .ts,.tsx",
46
+ "lint:fix": "eslint src --ext .ts,.tsx --fix",
47
+ "prepublishOnly": "npm run build && npm run typecheck"
48
+ },
49
+ "keywords": [
50
+ "reviews",
51
+ "testimonials",
52
+ "ratings",
53
+ "feedback",
54
+ "nextjs",
55
+ "react",
56
+ "typescript"
57
+ ],
58
+ "author": "BusinessFlow",
59
+ "license": "MIT",
60
+ "repository": {
61
+ "type": "git",
62
+ "url": "git+https://github.com/businessflow/reviews.git"
63
+ },
64
+ "bugs": {
65
+ "url": "https://github.com/businessflow/reviews/issues"
66
+ },
67
+ "homepage": "https://github.com/businessflow/reviews#readme",
68
+ "peerDependencies": {
69
+ "react": ">=16.8.0",
70
+ "react-dom": ">=16.8.0",
71
+ "next": ">=13.0.0"
72
+ },
73
+ "peerDependenciesMeta": {
74
+ "react": {
75
+ "optional": true
76
+ },
77
+ "react-dom": {
78
+ "optional": true
79
+ },
80
+ "next": {
81
+ "optional": true
82
+ }
83
+ },
84
+ "dependencies": {
85
+ "tslib": "^2.6.2"
86
+ },
87
+ "devDependencies": {
88
+ "@types/node": "^20.10.0",
89
+ "@types/react": "^18.2.42",
90
+ "@types/react-dom": "^18.2.17",
91
+ "@typescript-eslint/eslint-plugin": "^6.13.1",
92
+ "@typescript-eslint/parser": "^6.13.1",
93
+ "@vitest/ui": "^1.0.4",
94
+ "eslint": "^8.55.0",
95
+ "eslint-config-prettier": "^9.1.0",
96
+ "eslint-plugin-react": "^7.33.2",
97
+ "eslint-plugin-react-hooks": "^4.6.0",
98
+ "next": "^15.0.0",
99
+ "prettier": "^3.1.0",
100
+ "tsup": "^8.0.1",
101
+ "typescript": "^5.3.2",
102
+ "vitest": "^1.0.4"
103
+ }
104
+ }