@plyaz/types 1.15.1 → 1.15.3

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.
@@ -71,9 +71,9 @@ var formCampaignSchema = /* @__PURE__ */ __name(({ maxFunding }) => zod.z.object
71
71
  message: "components.CreateCampaign.Form.errors.fundingRange" /* FundingRange */
72
72
  }
73
73
  ),
74
- instagramHandle: zod.z.string().max(30, "components.CreateCampaign.Form.errors.instagramMax" /* InstagramMax */).regex(/^@?[a-zA-Z0-9._]{1,30}$/, "components.CreateCampaign.Form.errors.instagramInvalid" /* InstagramInvalid */).optional(),
75
- tiktokHandle: zod.z.string().max(24, "components.CreateCampaign.Form.errors.tiktokMax" /* TiktokMax */).regex(/^@?[a-zA-Z0-9._]{1,24}$/, "components.CreateCampaign.Form.errors.tiktokInvalid" /* TiktokInvalid */).optional(),
76
- youtubeHandle: zod.z.string().max(50, "components.CreateCampaign.Form.errors.youtubeMax" /* YoutubeMax */).regex(/^@?[a-zA-Z0-9._]{1,50}$/, "components.CreateCampaign.Form.errors.youtubeInvalid" /* YoutubeInvalid */).optional()
74
+ instagramHandle: zod.z.string().max(30, "components.CreateCampaign.Form.errors.instagramMax" /* InstagramMax */).regex(/^$|^@?(?!.*\.\.)(?!.*\.$)[a-zA-Z0-9._]{1,30}$/, "components.CreateCampaign.Form.errors.instagramInvalid" /* InstagramInvalid */).optional(),
75
+ tiktokHandle: zod.z.string().max(24, "components.CreateCampaign.Form.errors.tiktokMax" /* TiktokMax */).regex(/^$|^@?[a-zA-Z0-9][a-zA-Z0-9._]{1,23}$/, "components.CreateCampaign.Form.errors.tiktokInvalid" /* TiktokInvalid */).optional(),
76
+ youtubeHandle: zod.z.string().max(50, "components.CreateCampaign.Form.errors.youtubeMax" /* YoutubeMax */).regex(/^$|^@[a-zA-Z0-9][a-zA-Z0-9._-]{1,28}[a-zA-Z0-9]$/, "components.CreateCampaign.Form.errors.youtubeInvalid" /* YoutubeInvalid */).optional()
77
77
  }), "formCampaignSchema");
78
78
 
79
79
  exports.CREATE_CAMPAIGN_ERRORS = CREATE_CAMPAIGN_ERRORS;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/campaign/enums.ts","../../src/campaign/schemas.ts"],"names":["CREATE_CAMPAIGN_ERRORS","z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Enum containing error message keys for campaign creation form validation.\n * Contains localized error message keys that map to translation strings.\n */\nexport enum CREATE_CAMPAIGN_ERRORS {\n /** Error when campaign title is required but not provided */\n TitleRequired = 'components.CreateCampaign.Form.errors.titleRequired',\n /** Error when campaign title exceeds maximum length */\n TitleMax = 'components.CreateCampaign.Form.errors.titleMax',\n /** Error when campaign subtitle is required but not provided */\n SubtitleRequired = 'components.CreateCampaign.Form.errors.subtitleRequired',\n /** Error when campaign subtitle exceeds maximum length */\n SubtitleMax = 'components.CreateCampaign.Form.errors.subtitleMax',\n /** Error when campaign image is required but not provided */\n CampaignImageRequired = 'components.CreateCampaign.Form.errors.campaignImageRequired',\n /** Error when start date is required but not provided */\n StartDateRequired = 'components.CreateCampaign.Form.errors.startDateRequired',\n /** Error when start date format is invalid */\n StartDateInvalid = 'components.CreateCampaign.Form.errors.startDateInvalid',\n /** Error when start date is not in the future */\n StartDateFuture = 'components.CreateCampaign.Form.errors.startDateFuture',\n /** Error when campaign duration is required but not selected */\n DurationRequired = 'components.CreateCampaign.Form.errors.durationRequired',\n /** Error when campaign story is required but not provided */\n StoryRequired = 'components.CreateCampaign.Form.errors.storyRequired',\n /** Error when campaign story exceeds maximum length */\n StoryMax = 'components.CreateCampaign.Form.errors.storyMax',\n /** Error when video URL is from an unsupported provider */\n VideoInvalidProvider = 'components.CreateCampaign.Form.errors.videoInvalidProvider',\n /** Error when funding target is required but not provided */\n FundingRequired = 'components.CreateCampaign.Form.errors.fundingRequired',\n /** Error when funding target is outside allowed range */\n FundingRange = 'components.CreateCampaign.Form.errors.fundingRange',\n /** Error when Instagram handle exceeds maximum length */\n InstagramMax = 'components.CreateCampaign.Form.errors.instagramMax',\n /** Error when Instagram handle format is invalid */\n InstagramInvalid = 'components.CreateCampaign.Form.errors.instagramInvalid',\n /** Error when TikTok handle exceeds maximum length */\n TiktokMax = 'components.CreateCampaign.Form.errors.tiktokMax',\n /** Error when TikTok handle format is invalid */\n TiktokInvalid = 'components.CreateCampaign.Form.errors.tiktokInvalid',\n /** Error when YouTube handle exceeds maximum length */\n YoutubeMax = 'components.CreateCampaign.Form.errors.youtubeMax',\n /** Error when YouTube handle format is invalid */\n YoutubeInvalid = 'components.CreateCampaign.Form.errors.youtubeInvalid',\n}\n\n/**\n * Type representing all possible error keys for campaign creation form validation\n */\nexport type CreateCampaignErrorKey = keyof typeof CREATE_CAMPAIGN_ERRORS;\n","/* eslint-disable no-magic-numbers */\nimport { z } from 'zod';\n\nimport { CREATE_CAMPAIGN_ERRORS as ERR } from './enums';\n\n/**\n * Zod schema for campaign creation form validation.\n * Validates all required fields for creating a new campaign including:\n * - Basic info (title, subtitle, image)\n * - Timeline (start date, duration)\n * - Content (story, video highlight)\n * - Funding target\n * - Social media handles\n *\n * @param config - Configuration object\n * @param config.maxFunding - Maximum funding amount allowed for campaigns\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type, @typescript-eslint/explicit-module-boundary-types\nexport const formCampaignSchema = ({ maxFunding }: { maxFunding: number }) =>\n z.object({\n title: z.string().min(1, ERR.TitleRequired).max(60, ERR.TitleMax),\n subtitle: z.string().min(1, ERR.SubtitleRequired).max(200, ERR.SubtitleMax),\n campaignImage: z.any().refine(val => val instanceof File, {\n message: ERR.CampaignImageRequired,\n }),\n startDate: z\n .date({\n error: ERR.StartDateRequired,\n })\n .refine(date => date instanceof Date && !isNaN(date.getTime()), {\n message: ERR.StartDateInvalid,\n })\n .refine(date => date >= new Date(), {\n message: ERR.StartDateFuture,\n }),\n duration: z\n .union([z.literal(30), z.literal(60), z.literal(90)])\n .nullable()\n .refine(val => val !== null, {\n message: ERR.DurationRequired,\n }),\n story: z.string().min(1, ERR.StoryRequired).max(10000, ERR.StoryMax),\n videoHighlight: z\n .string()\n .refine(\n url => {\n if (!url || url.trim() === '') return true;\n try {\n const urlObj = new URL(url);\n const hostname = urlObj.hostname.toLowerCase();\n return (\n hostname.includes('youtube.com') ||\n hostname.includes('youtu.be') ||\n hostname.includes('tiktok.com') ||\n hostname.includes('vimeo.com')\n );\n } catch {\n return false;\n }\n },\n {\n message: ERR.VideoInvalidProvider,\n }\n )\n .optional(),\n fundingTarget: z\n .string()\n .min(1, ERR.FundingRequired)\n .refine(\n val => {\n const num = Number.parseFloat(val ?? '');\n return !isNaN(num) && num > 0 && num <= maxFunding;\n },\n {\n message: ERR.FundingRange,\n }\n ),\n instagramHandle: z\n .string()\n .max(30, ERR.InstagramMax)\n .regex(/^@?[a-zA-Z0-9._]{1,30}$/, ERR.InstagramInvalid)\n .optional(),\n tiktokHandle: z\n .string()\n .max(24, ERR.TiktokMax)\n .regex(/^@?[a-zA-Z0-9._]{1,24}$/, ERR.TiktokInvalid)\n .optional(),\n youtubeHandle: z\n .string()\n .max(50, ERR.YoutubeMax)\n .regex(/^@?[a-zA-Z0-9._]{1,50}$/, ERR.YoutubeInvalid)\n .optional(),\n });\n"]}
1
+ {"version":3,"sources":["../../src/campaign/enums.ts","../../src/campaign/schemas.ts"],"names":["CREATE_CAMPAIGN_ERRORS","z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Enum containing error message keys for campaign creation form validation.\n * Contains localized error message keys that map to translation strings.\n */\nexport enum CREATE_CAMPAIGN_ERRORS {\n /** Error when campaign title is required but not provided */\n TitleRequired = 'components.CreateCampaign.Form.errors.titleRequired',\n /** Error when campaign title exceeds maximum length */\n TitleMax = 'components.CreateCampaign.Form.errors.titleMax',\n /** Error when campaign subtitle is required but not provided */\n SubtitleRequired = 'components.CreateCampaign.Form.errors.subtitleRequired',\n /** Error when campaign subtitle exceeds maximum length */\n SubtitleMax = 'components.CreateCampaign.Form.errors.subtitleMax',\n /** Error when campaign image is required but not provided */\n CampaignImageRequired = 'components.CreateCampaign.Form.errors.campaignImageRequired',\n /** Error when start date is required but not provided */\n StartDateRequired = 'components.CreateCampaign.Form.errors.startDateRequired',\n /** Error when start date format is invalid */\n StartDateInvalid = 'components.CreateCampaign.Form.errors.startDateInvalid',\n /** Error when start date is not in the future */\n StartDateFuture = 'components.CreateCampaign.Form.errors.startDateFuture',\n /** Error when campaign duration is required but not selected */\n DurationRequired = 'components.CreateCampaign.Form.errors.durationRequired',\n /** Error when campaign story is required but not provided */\n StoryRequired = 'components.CreateCampaign.Form.errors.storyRequired',\n /** Error when campaign story exceeds maximum length */\n StoryMax = 'components.CreateCampaign.Form.errors.storyMax',\n /** Error when video URL is from an unsupported provider */\n VideoInvalidProvider = 'components.CreateCampaign.Form.errors.videoInvalidProvider',\n /** Error when funding target is required but not provided */\n FundingRequired = 'components.CreateCampaign.Form.errors.fundingRequired',\n /** Error when funding target is outside allowed range */\n FundingRange = 'components.CreateCampaign.Form.errors.fundingRange',\n /** Error when Instagram handle exceeds maximum length */\n InstagramMax = 'components.CreateCampaign.Form.errors.instagramMax',\n /** Error when Instagram handle format is invalid */\n InstagramInvalid = 'components.CreateCampaign.Form.errors.instagramInvalid',\n /** Error when TikTok handle exceeds maximum length */\n TiktokMax = 'components.CreateCampaign.Form.errors.tiktokMax',\n /** Error when TikTok handle format is invalid */\n TiktokInvalid = 'components.CreateCampaign.Form.errors.tiktokInvalid',\n /** Error when YouTube handle exceeds maximum length */\n YoutubeMax = 'components.CreateCampaign.Form.errors.youtubeMax',\n /** Error when YouTube handle format is invalid */\n YoutubeInvalid = 'components.CreateCampaign.Form.errors.youtubeInvalid',\n}\n\n/**\n * Type representing all possible error keys for campaign creation form validation\n */\nexport type CreateCampaignErrorKey = keyof typeof CREATE_CAMPAIGN_ERRORS;\n","/* eslint-disable no-magic-numbers */\nimport { z } from 'zod';\n\nimport { CREATE_CAMPAIGN_ERRORS as ERR } from './enums';\n\n/**\n * Zod schema for campaign creation form validation.\n * Validates all required fields for creating a new campaign including:\n * - Basic info (title, subtitle, image)\n * - Timeline (start date, duration)\n * - Content (story, video highlight)\n * - Funding target\n * - Social media handles\n *\n * @param config - Configuration object\n * @param config.maxFunding - Maximum funding amount allowed for campaigns\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type, @typescript-eslint/explicit-module-boundary-types\nexport const formCampaignSchema = ({ maxFunding }: { maxFunding: number }) =>\n z.object({\n title: z.string().min(1, ERR.TitleRequired).max(60, ERR.TitleMax),\n subtitle: z.string().min(1, ERR.SubtitleRequired).max(200, ERR.SubtitleMax),\n campaignImage: z.any().refine(val => val instanceof File, {\n message: ERR.CampaignImageRequired,\n }),\n startDate: z\n .date({\n error: ERR.StartDateRequired,\n })\n .refine(date => date instanceof Date && !isNaN(date.getTime()), {\n message: ERR.StartDateInvalid,\n })\n .refine(date => date >= new Date(), {\n message: ERR.StartDateFuture,\n }),\n duration: z\n .union([z.literal(30), z.literal(60), z.literal(90)])\n .nullable()\n .refine(val => val !== null, {\n message: ERR.DurationRequired,\n }),\n story: z.string().min(1, ERR.StoryRequired).max(10000, ERR.StoryMax),\n videoHighlight: z\n .string()\n .refine(\n url => {\n if (!url || url.trim() === '') return true;\n try {\n const urlObj = new URL(url);\n const hostname = urlObj.hostname.toLowerCase();\n return (\n hostname.includes('youtube.com') ||\n hostname.includes('youtu.be') ||\n hostname.includes('tiktok.com') ||\n hostname.includes('vimeo.com')\n );\n } catch {\n return false;\n }\n },\n {\n message: ERR.VideoInvalidProvider,\n }\n )\n .optional(),\n fundingTarget: z\n .string()\n .min(1, ERR.FundingRequired)\n .refine(\n val => {\n const num = Number.parseFloat(val ?? '');\n return !isNaN(num) && num > 0 && num <= maxFunding;\n },\n {\n message: ERR.FundingRange,\n }\n ),\n instagramHandle: z\n .string()\n .max(30, ERR.InstagramMax)\n .regex(/^$|^@?(?!.*\\.\\.)(?!.*\\.$)[a-zA-Z0-9._]{1,30}$/, ERR.InstagramInvalid)\n .optional(),\n tiktokHandle: z\n .string()\n .max(24, ERR.TiktokMax)\n .regex(/^$|^@?[a-zA-Z0-9][a-zA-Z0-9._]{1,23}$/, ERR.TiktokInvalid)\n .optional(),\n youtubeHandle: z\n .string()\n .max(50, ERR.YoutubeMax)\n .regex(/^$|^@[a-zA-Z0-9][a-zA-Z0-9._-]{1,28}[a-zA-Z0-9]$/, ERR.YoutubeInvalid)\n .optional(),\n });\n"]}
@@ -69,9 +69,9 @@ var formCampaignSchema = /* @__PURE__ */ __name(({ maxFunding }) => z.object({
69
69
  message: "components.CreateCampaign.Form.errors.fundingRange" /* FundingRange */
70
70
  }
71
71
  ),
72
- instagramHandle: z.string().max(30, "components.CreateCampaign.Form.errors.instagramMax" /* InstagramMax */).regex(/^@?[a-zA-Z0-9._]{1,30}$/, "components.CreateCampaign.Form.errors.instagramInvalid" /* InstagramInvalid */).optional(),
73
- tiktokHandle: z.string().max(24, "components.CreateCampaign.Form.errors.tiktokMax" /* TiktokMax */).regex(/^@?[a-zA-Z0-9._]{1,24}$/, "components.CreateCampaign.Form.errors.tiktokInvalid" /* TiktokInvalid */).optional(),
74
- youtubeHandle: z.string().max(50, "components.CreateCampaign.Form.errors.youtubeMax" /* YoutubeMax */).regex(/^@?[a-zA-Z0-9._]{1,50}$/, "components.CreateCampaign.Form.errors.youtubeInvalid" /* YoutubeInvalid */).optional()
72
+ instagramHandle: z.string().max(30, "components.CreateCampaign.Form.errors.instagramMax" /* InstagramMax */).regex(/^$|^@?(?!.*\.\.)(?!.*\.$)[a-zA-Z0-9._]{1,30}$/, "components.CreateCampaign.Form.errors.instagramInvalid" /* InstagramInvalid */).optional(),
73
+ tiktokHandle: z.string().max(24, "components.CreateCampaign.Form.errors.tiktokMax" /* TiktokMax */).regex(/^$|^@?[a-zA-Z0-9][a-zA-Z0-9._]{1,23}$/, "components.CreateCampaign.Form.errors.tiktokInvalid" /* TiktokInvalid */).optional(),
74
+ youtubeHandle: z.string().max(50, "components.CreateCampaign.Form.errors.youtubeMax" /* YoutubeMax */).regex(/^$|^@[a-zA-Z0-9][a-zA-Z0-9._-]{1,28}[a-zA-Z0-9]$/, "components.CreateCampaign.Form.errors.youtubeInvalid" /* YoutubeInvalid */).optional()
75
75
  }), "formCampaignSchema");
76
76
 
77
77
  export { CREATE_CAMPAIGN_ERRORS, formCampaignSchema };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/campaign/enums.ts","../../src/campaign/schemas.ts"],"names":["CREATE_CAMPAIGN_ERRORS"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Enum containing error message keys for campaign creation form validation.\n * Contains localized error message keys that map to translation strings.\n */\nexport enum CREATE_CAMPAIGN_ERRORS {\n /** Error when campaign title is required but not provided */\n TitleRequired = 'components.CreateCampaign.Form.errors.titleRequired',\n /** Error when campaign title exceeds maximum length */\n TitleMax = 'components.CreateCampaign.Form.errors.titleMax',\n /** Error when campaign subtitle is required but not provided */\n SubtitleRequired = 'components.CreateCampaign.Form.errors.subtitleRequired',\n /** Error when campaign subtitle exceeds maximum length */\n SubtitleMax = 'components.CreateCampaign.Form.errors.subtitleMax',\n /** Error when campaign image is required but not provided */\n CampaignImageRequired = 'components.CreateCampaign.Form.errors.campaignImageRequired',\n /** Error when start date is required but not provided */\n StartDateRequired = 'components.CreateCampaign.Form.errors.startDateRequired',\n /** Error when start date format is invalid */\n StartDateInvalid = 'components.CreateCampaign.Form.errors.startDateInvalid',\n /** Error when start date is not in the future */\n StartDateFuture = 'components.CreateCampaign.Form.errors.startDateFuture',\n /** Error when campaign duration is required but not selected */\n DurationRequired = 'components.CreateCampaign.Form.errors.durationRequired',\n /** Error when campaign story is required but not provided */\n StoryRequired = 'components.CreateCampaign.Form.errors.storyRequired',\n /** Error when campaign story exceeds maximum length */\n StoryMax = 'components.CreateCampaign.Form.errors.storyMax',\n /** Error when video URL is from an unsupported provider */\n VideoInvalidProvider = 'components.CreateCampaign.Form.errors.videoInvalidProvider',\n /** Error when funding target is required but not provided */\n FundingRequired = 'components.CreateCampaign.Form.errors.fundingRequired',\n /** Error when funding target is outside allowed range */\n FundingRange = 'components.CreateCampaign.Form.errors.fundingRange',\n /** Error when Instagram handle exceeds maximum length */\n InstagramMax = 'components.CreateCampaign.Form.errors.instagramMax',\n /** Error when Instagram handle format is invalid */\n InstagramInvalid = 'components.CreateCampaign.Form.errors.instagramInvalid',\n /** Error when TikTok handle exceeds maximum length */\n TiktokMax = 'components.CreateCampaign.Form.errors.tiktokMax',\n /** Error when TikTok handle format is invalid */\n TiktokInvalid = 'components.CreateCampaign.Form.errors.tiktokInvalid',\n /** Error when YouTube handle exceeds maximum length */\n YoutubeMax = 'components.CreateCampaign.Form.errors.youtubeMax',\n /** Error when YouTube handle format is invalid */\n YoutubeInvalid = 'components.CreateCampaign.Form.errors.youtubeInvalid',\n}\n\n/**\n * Type representing all possible error keys for campaign creation form validation\n */\nexport type CreateCampaignErrorKey = keyof typeof CREATE_CAMPAIGN_ERRORS;\n","/* eslint-disable no-magic-numbers */\nimport { z } from 'zod';\n\nimport { CREATE_CAMPAIGN_ERRORS as ERR } from './enums';\n\n/**\n * Zod schema for campaign creation form validation.\n * Validates all required fields for creating a new campaign including:\n * - Basic info (title, subtitle, image)\n * - Timeline (start date, duration)\n * - Content (story, video highlight)\n * - Funding target\n * - Social media handles\n *\n * @param config - Configuration object\n * @param config.maxFunding - Maximum funding amount allowed for campaigns\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type, @typescript-eslint/explicit-module-boundary-types\nexport const formCampaignSchema = ({ maxFunding }: { maxFunding: number }) =>\n z.object({\n title: z.string().min(1, ERR.TitleRequired).max(60, ERR.TitleMax),\n subtitle: z.string().min(1, ERR.SubtitleRequired).max(200, ERR.SubtitleMax),\n campaignImage: z.any().refine(val => val instanceof File, {\n message: ERR.CampaignImageRequired,\n }),\n startDate: z\n .date({\n error: ERR.StartDateRequired,\n })\n .refine(date => date instanceof Date && !isNaN(date.getTime()), {\n message: ERR.StartDateInvalid,\n })\n .refine(date => date >= new Date(), {\n message: ERR.StartDateFuture,\n }),\n duration: z\n .union([z.literal(30), z.literal(60), z.literal(90)])\n .nullable()\n .refine(val => val !== null, {\n message: ERR.DurationRequired,\n }),\n story: z.string().min(1, ERR.StoryRequired).max(10000, ERR.StoryMax),\n videoHighlight: z\n .string()\n .refine(\n url => {\n if (!url || url.trim() === '') return true;\n try {\n const urlObj = new URL(url);\n const hostname = urlObj.hostname.toLowerCase();\n return (\n hostname.includes('youtube.com') ||\n hostname.includes('youtu.be') ||\n hostname.includes('tiktok.com') ||\n hostname.includes('vimeo.com')\n );\n } catch {\n return false;\n }\n },\n {\n message: ERR.VideoInvalidProvider,\n }\n )\n .optional(),\n fundingTarget: z\n .string()\n .min(1, ERR.FundingRequired)\n .refine(\n val => {\n const num = Number.parseFloat(val ?? '');\n return !isNaN(num) && num > 0 && num <= maxFunding;\n },\n {\n message: ERR.FundingRange,\n }\n ),\n instagramHandle: z\n .string()\n .max(30, ERR.InstagramMax)\n .regex(/^@?[a-zA-Z0-9._]{1,30}$/, ERR.InstagramInvalid)\n .optional(),\n tiktokHandle: z\n .string()\n .max(24, ERR.TiktokMax)\n .regex(/^@?[a-zA-Z0-9._]{1,24}$/, ERR.TiktokInvalid)\n .optional(),\n youtubeHandle: z\n .string()\n .max(50, ERR.YoutubeMax)\n .regex(/^@?[a-zA-Z0-9._]{1,50}$/, ERR.YoutubeInvalid)\n .optional(),\n });\n"]}
1
+ {"version":3,"sources":["../../src/campaign/enums.ts","../../src/campaign/schemas.ts"],"names":["CREATE_CAMPAIGN_ERRORS"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Enum containing error message keys for campaign creation form validation.\n * Contains localized error message keys that map to translation strings.\n */\nexport enum CREATE_CAMPAIGN_ERRORS {\n /** Error when campaign title is required but not provided */\n TitleRequired = 'components.CreateCampaign.Form.errors.titleRequired',\n /** Error when campaign title exceeds maximum length */\n TitleMax = 'components.CreateCampaign.Form.errors.titleMax',\n /** Error when campaign subtitle is required but not provided */\n SubtitleRequired = 'components.CreateCampaign.Form.errors.subtitleRequired',\n /** Error when campaign subtitle exceeds maximum length */\n SubtitleMax = 'components.CreateCampaign.Form.errors.subtitleMax',\n /** Error when campaign image is required but not provided */\n CampaignImageRequired = 'components.CreateCampaign.Form.errors.campaignImageRequired',\n /** Error when start date is required but not provided */\n StartDateRequired = 'components.CreateCampaign.Form.errors.startDateRequired',\n /** Error when start date format is invalid */\n StartDateInvalid = 'components.CreateCampaign.Form.errors.startDateInvalid',\n /** Error when start date is not in the future */\n StartDateFuture = 'components.CreateCampaign.Form.errors.startDateFuture',\n /** Error when campaign duration is required but not selected */\n DurationRequired = 'components.CreateCampaign.Form.errors.durationRequired',\n /** Error when campaign story is required but not provided */\n StoryRequired = 'components.CreateCampaign.Form.errors.storyRequired',\n /** Error when campaign story exceeds maximum length */\n StoryMax = 'components.CreateCampaign.Form.errors.storyMax',\n /** Error when video URL is from an unsupported provider */\n VideoInvalidProvider = 'components.CreateCampaign.Form.errors.videoInvalidProvider',\n /** Error when funding target is required but not provided */\n FundingRequired = 'components.CreateCampaign.Form.errors.fundingRequired',\n /** Error when funding target is outside allowed range */\n FundingRange = 'components.CreateCampaign.Form.errors.fundingRange',\n /** Error when Instagram handle exceeds maximum length */\n InstagramMax = 'components.CreateCampaign.Form.errors.instagramMax',\n /** Error when Instagram handle format is invalid */\n InstagramInvalid = 'components.CreateCampaign.Form.errors.instagramInvalid',\n /** Error when TikTok handle exceeds maximum length */\n TiktokMax = 'components.CreateCampaign.Form.errors.tiktokMax',\n /** Error when TikTok handle format is invalid */\n TiktokInvalid = 'components.CreateCampaign.Form.errors.tiktokInvalid',\n /** Error when YouTube handle exceeds maximum length */\n YoutubeMax = 'components.CreateCampaign.Form.errors.youtubeMax',\n /** Error when YouTube handle format is invalid */\n YoutubeInvalid = 'components.CreateCampaign.Form.errors.youtubeInvalid',\n}\n\n/**\n * Type representing all possible error keys for campaign creation form validation\n */\nexport type CreateCampaignErrorKey = keyof typeof CREATE_CAMPAIGN_ERRORS;\n","/* eslint-disable no-magic-numbers */\nimport { z } from 'zod';\n\nimport { CREATE_CAMPAIGN_ERRORS as ERR } from './enums';\n\n/**\n * Zod schema for campaign creation form validation.\n * Validates all required fields for creating a new campaign including:\n * - Basic info (title, subtitle, image)\n * - Timeline (start date, duration)\n * - Content (story, video highlight)\n * - Funding target\n * - Social media handles\n *\n * @param config - Configuration object\n * @param config.maxFunding - Maximum funding amount allowed for campaigns\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type, @typescript-eslint/explicit-module-boundary-types\nexport const formCampaignSchema = ({ maxFunding }: { maxFunding: number }) =>\n z.object({\n title: z.string().min(1, ERR.TitleRequired).max(60, ERR.TitleMax),\n subtitle: z.string().min(1, ERR.SubtitleRequired).max(200, ERR.SubtitleMax),\n campaignImage: z.any().refine(val => val instanceof File, {\n message: ERR.CampaignImageRequired,\n }),\n startDate: z\n .date({\n error: ERR.StartDateRequired,\n })\n .refine(date => date instanceof Date && !isNaN(date.getTime()), {\n message: ERR.StartDateInvalid,\n })\n .refine(date => date >= new Date(), {\n message: ERR.StartDateFuture,\n }),\n duration: z\n .union([z.literal(30), z.literal(60), z.literal(90)])\n .nullable()\n .refine(val => val !== null, {\n message: ERR.DurationRequired,\n }),\n story: z.string().min(1, ERR.StoryRequired).max(10000, ERR.StoryMax),\n videoHighlight: z\n .string()\n .refine(\n url => {\n if (!url || url.trim() === '') return true;\n try {\n const urlObj = new URL(url);\n const hostname = urlObj.hostname.toLowerCase();\n return (\n hostname.includes('youtube.com') ||\n hostname.includes('youtu.be') ||\n hostname.includes('tiktok.com') ||\n hostname.includes('vimeo.com')\n );\n } catch {\n return false;\n }\n },\n {\n message: ERR.VideoInvalidProvider,\n }\n )\n .optional(),\n fundingTarget: z\n .string()\n .min(1, ERR.FundingRequired)\n .refine(\n val => {\n const num = Number.parseFloat(val ?? '');\n return !isNaN(num) && num > 0 && num <= maxFunding;\n },\n {\n message: ERR.FundingRange,\n }\n ),\n instagramHandle: z\n .string()\n .max(30, ERR.InstagramMax)\n .regex(/^$|^@?(?!.*\\.\\.)(?!.*\\.$)[a-zA-Z0-9._]{1,30}$/, ERR.InstagramInvalid)\n .optional(),\n tiktokHandle: z\n .string()\n .max(24, ERR.TiktokMax)\n .regex(/^$|^@?[a-zA-Z0-9][a-zA-Z0-9._]{1,23}$/, ERR.TiktokInvalid)\n .optional(),\n youtubeHandle: z\n .string()\n .max(50, ERR.YoutubeMax)\n .regex(/^$|^@[a-zA-Z0-9][a-zA-Z0-9._-]{1,28}[a-zA-Z0-9]$/, ERR.YoutubeInvalid)\n .optional(),\n });\n"]}
@@ -4,7 +4,7 @@ import type { USER_TYPE } from '../payments';
4
4
  /**
5
5
  * Type inferred from the campaign form schema for form validation
6
6
  */
7
- export type FormCampaignInput = z.infer<typeof formCampaignSchema>;
7
+ export type FormCampaignData = z.infer<ReturnType<typeof formCampaignSchema>>;
8
8
  /**
9
9
  * Represents a single data item in the campaign overview
10
10
  */
@@ -26,7 +26,7 @@ export interface OverviewData {
26
26
  /**
27
27
  * Campaign form data structure containing all required fields for campaign creation
28
28
  */
29
- export interface FormData {
29
+ export interface FormCampaignDataInterface {
30
30
  /** Campaign title */
31
31
  title: string;
32
32
  /** Campaign subtitle/description */
@@ -454,8 +454,8 @@ export declare const PAYMENT_ERROR_CODES: {
454
454
  PAYMENT_EVENT_LIFECYCLE_FAILURE: string;
455
455
  };
456
456
  /** Database-specific error codes
457
- * Subset of ERROR_CODES for database operations
458
- */
457
+ * Subset of ERROR_CODES for database operations
458
+ */
459
459
  export declare const DATABASE_ERROR_CODES: {
460
460
  readonly ACCESS_DENIED: "DB_ACCESS_DENIED";
461
461
  readonly CONFIG_REQUIRED: "DB_CONFIG_REQUIRED";