@classytic/social 0.1.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.
Files changed (121) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/LICENSE +21 -0
  3. package/README.md +368 -0
  4. package/dist/base-Bw7e52V8.mjs +246 -0
  5. package/dist/base-Bw7e52V8.mjs.map +1 -0
  6. package/dist/base-DBtKFiSX.d.mts +226 -0
  7. package/dist/base-DBtKFiSX.d.mts.map +1 -0
  8. package/dist/chunk-DQk6qfdC.mjs +18 -0
  9. package/dist/client/index.d.mts +44 -0
  10. package/dist/client/index.d.mts.map +1 -0
  11. package/dist/client/index.mjs +154 -0
  12. package/dist/client/index.mjs.map +1 -0
  13. package/dist/common/index.d.mts +3 -0
  14. package/dist/common/index.mjs +7 -0
  15. package/dist/contracts-Cdwa4zlg.d.mts +121 -0
  16. package/dist/contracts-Cdwa4zlg.d.mts.map +1 -0
  17. package/dist/contracts-lCa069IK.mjs +221 -0
  18. package/dist/contracts-lCa069IK.mjs.map +1 -0
  19. package/dist/env-Bl0cwwjC.mjs +955 -0
  20. package/dist/env-Bl0cwwjC.mjs.map +1 -0
  21. package/dist/env-DxOZHf0p.d.mts +394 -0
  22. package/dist/env-DxOZHf0p.d.mts.map +1 -0
  23. package/dist/errors-Cm6LeKf7.mjs +32 -0
  24. package/dist/errors-Cm6LeKf7.mjs.map +1 -0
  25. package/dist/facebook-l_4CghaA.mjs +95 -0
  26. package/dist/facebook-l_4CghaA.mjs.map +1 -0
  27. package/dist/http-DpcLSR1M.mjs +197 -0
  28. package/dist/http-DpcLSR1M.mjs.map +1 -0
  29. package/dist/index.d.mts +42 -0
  30. package/dist/index.d.mts.map +1 -0
  31. package/dist/index.mjs +71 -0
  32. package/dist/index.mjs.map +1 -0
  33. package/dist/instagram-BGaeUFU2.mjs +90 -0
  34. package/dist/instagram-BGaeUFU2.mjs.map +1 -0
  35. package/dist/linkedin-70whtVKa.mjs +101 -0
  36. package/dist/linkedin-70whtVKa.mjs.map +1 -0
  37. package/dist/meta-D3vcJU1c.mjs +126 -0
  38. package/dist/meta-D3vcJU1c.mjs.map +1 -0
  39. package/dist/pkce-jq5II68b.mjs +72 -0
  40. package/dist/pkce-jq5II68b.mjs.map +1 -0
  41. package/dist/polling-DZ1apXtA.mjs +25 -0
  42. package/dist/polling-DZ1apXtA.mjs.map +1 -0
  43. package/dist/providers/facebook.d.mts +135 -0
  44. package/dist/providers/facebook.d.mts.map +1 -0
  45. package/dist/providers/facebook.mjs +450 -0
  46. package/dist/providers/facebook.mjs.map +1 -0
  47. package/dist/providers/instagram.d.mts +122 -0
  48. package/dist/providers/instagram.d.mts.map +1 -0
  49. package/dist/providers/instagram.mjs +496 -0
  50. package/dist/providers/instagram.mjs.map +1 -0
  51. package/dist/providers/linkedin.d.mts +145 -0
  52. package/dist/providers/linkedin.d.mts.map +1 -0
  53. package/dist/providers/linkedin.mjs +574 -0
  54. package/dist/providers/linkedin.mjs.map +1 -0
  55. package/dist/providers/reddit.d.mts +102 -0
  56. package/dist/providers/reddit.d.mts.map +1 -0
  57. package/dist/providers/reddit.mjs +657 -0
  58. package/dist/providers/reddit.mjs.map +1 -0
  59. package/dist/providers/telegram.d.mts +139 -0
  60. package/dist/providers/telegram.d.mts.map +1 -0
  61. package/dist/providers/telegram.mjs +517 -0
  62. package/dist/providers/telegram.mjs.map +1 -0
  63. package/dist/providers/tiktok.d.mts +116 -0
  64. package/dist/providers/tiktok.d.mts.map +1 -0
  65. package/dist/providers/tiktok.mjs +676 -0
  66. package/dist/providers/tiktok.mjs.map +1 -0
  67. package/dist/providers/twitter.d.mts +150 -0
  68. package/dist/providers/twitter.d.mts.map +1 -0
  69. package/dist/providers/twitter.mjs +628 -0
  70. package/dist/providers/twitter.mjs.map +1 -0
  71. package/dist/providers/whatsapp.d.mts +79 -0
  72. package/dist/providers/whatsapp.d.mts.map +1 -0
  73. package/dist/providers/whatsapp.mjs +376 -0
  74. package/dist/providers/whatsapp.mjs.map +1 -0
  75. package/dist/providers/youtube.d.mts +153 -0
  76. package/dist/providers/youtube.d.mts.map +1 -0
  77. package/dist/providers/youtube.mjs +902 -0
  78. package/dist/providers/youtube.mjs.map +1 -0
  79. package/dist/reddit-B10kS4Se.mjs +126 -0
  80. package/dist/reddit-B10kS4Se.mjs.map +1 -0
  81. package/dist/schemas/index.d.mts +819 -0
  82. package/dist/schemas/index.d.mts.map +1 -0
  83. package/dist/schemas/index.mjs +31 -0
  84. package/dist/schemas/index.mjs.map +1 -0
  85. package/dist/security-BXhfebWm.d.mts +338 -0
  86. package/dist/security-BXhfebWm.d.mts.map +1 -0
  87. package/dist/shared-Fvc6xQku.mjs +100 -0
  88. package/dist/shared-Fvc6xQku.mjs.map +1 -0
  89. package/dist/telegram-FaUHpZgB.mjs +107 -0
  90. package/dist/telegram-FaUHpZgB.mjs.map +1 -0
  91. package/dist/tiktok-B_bMk4G-.mjs +94 -0
  92. package/dist/tiktok-B_bMk4G-.mjs.map +1 -0
  93. package/dist/twitter-BC22zfuc.mjs +98 -0
  94. package/dist/twitter-BC22zfuc.mjs.map +1 -0
  95. package/dist/types-BFE4psYI.d.mts +102 -0
  96. package/dist/types-BFE4psYI.d.mts.map +1 -0
  97. package/dist/types-Bv27tcT0.d.mts +230 -0
  98. package/dist/types-Bv27tcT0.d.mts.map +1 -0
  99. package/dist/types-BwkKyqpi.d.mts +253 -0
  100. package/dist/types-BwkKyqpi.d.mts.map +1 -0
  101. package/dist/types-CJrHMDV9.mjs +27 -0
  102. package/dist/types-CJrHMDV9.mjs.map +1 -0
  103. package/dist/types-ClbVc2rc.d.mts +117 -0
  104. package/dist/types-ClbVc2rc.d.mts.map +1 -0
  105. package/dist/types-D91N16Ym.d.mts +242 -0
  106. package/dist/types-D91N16Ym.d.mts.map +1 -0
  107. package/dist/types-DfLp_ibQ.d.mts +178 -0
  108. package/dist/types-DfLp_ibQ.d.mts.map +1 -0
  109. package/dist/types-DfjDgEoJ.d.mts +88 -0
  110. package/dist/types-DfjDgEoJ.d.mts.map +1 -0
  111. package/dist/types-Dp5Z9VBr.mjs +23 -0
  112. package/dist/types-Dp5Z9VBr.mjs.map +1 -0
  113. package/dist/types-hriBJTsU.d.mts +129 -0
  114. package/dist/types-hriBJTsU.d.mts.map +1 -0
  115. package/dist/types-rn6UuLL8.d.mts +184 -0
  116. package/dist/types-rn6UuLL8.d.mts.map +1 -0
  117. package/dist/whatsapp-CFp7ryR4.mjs +101 -0
  118. package/dist/whatsapp-CFp7ryR4.mjs.map +1 -0
  119. package/dist/youtube-Bs0fdY7H.mjs +98 -0
  120. package/dist/youtube-Bs0fdY7H.mjs.map +1 -0
  121. package/package.json +148 -0
@@ -0,0 +1,101 @@
1
+ import { t as __exportAll } from "./chunk-DQk6qfdC.mjs";
2
+ import { r as NonEmptyString } from "./shared-Fvc6xQku.mjs";
3
+ import { z } from "zod";
4
+
5
+ //#region src/schemas/whatsapp.ts
6
+ /**
7
+ * WhatsApp Business zod v4 schemas.
8
+ */
9
+ var whatsapp_exports = /* @__PURE__ */ __exportAll({
10
+ WhatsAppCreateTemplateSchema: () => WhatsAppCreateTemplateSchema,
11
+ WhatsAppCredentialsSchema: () => WhatsAppCredentialsSchema,
12
+ WhatsAppMediaMessageSchema: () => WhatsAppMediaMessageSchema,
13
+ WhatsAppTemplateCategory: () => WhatsAppTemplateCategory,
14
+ WhatsAppTemplateMessageSchema: () => WhatsAppTemplateMessageSchema,
15
+ WhatsAppTextMessageSchema: () => WhatsAppTextMessageSchema,
16
+ whatsappCapabilities: () => whatsappCapabilities,
17
+ whatsappInfo: () => whatsappInfo
18
+ });
19
+ const WhatsAppCredentialsSchema = z.object({
20
+ accessToken: NonEmptyString.describe("Permanent System User access token"),
21
+ businessAccountId: NonEmptyString.describe("WhatsApp Business Account ID"),
22
+ phoneNumberId: NonEmptyString.optional().describe("Phone number ID (sender)")
23
+ });
24
+ const E164 = z.string().regex(/^\+?[1-9]\d{6,14}$/, "Phone must be E.164 format");
25
+ const WhatsAppTextMessageSchema = z.object({
26
+ to: E164,
27
+ body: z.string().min(1).max(4096),
28
+ previewUrl: z.boolean().optional()
29
+ });
30
+ const WhatsAppTemplateMessageSchema = z.object({
31
+ to: E164,
32
+ templateName: NonEmptyString,
33
+ languageCode: z.string().min(2).max(8).default("en_US"),
34
+ components: z.array(z.looseObject({
35
+ type: z.enum([
36
+ "header",
37
+ "body",
38
+ "button",
39
+ "footer"
40
+ ]),
41
+ parameters: z.array(z.unknown()).optional()
42
+ })).optional()
43
+ });
44
+ const WhatsAppMediaMessageSchema = z.object({
45
+ to: E164,
46
+ type: z.enum([
47
+ "image",
48
+ "video",
49
+ "audio",
50
+ "document"
51
+ ]),
52
+ link: z.url().optional(),
53
+ id: z.string().optional(),
54
+ caption: z.string().max(1024).optional()
55
+ }).refine((d) => d.link || d.id, { message: "Provide either `link` (public URL) or `id` (uploaded media ID)" });
56
+ const WhatsAppTemplateCategory = z.enum([
57
+ "MARKETING",
58
+ "UTILITY",
59
+ "AUTHENTICATION"
60
+ ]);
61
+ const WhatsAppCreateTemplateSchema = z.object({
62
+ name: z.string().regex(/^[a-z0-9_]+$/, "Name must be lowercase letters, digits, and underscores"),
63
+ category: WhatsAppTemplateCategory,
64
+ languageCode: z.string().min(2).max(8),
65
+ components: z.array(z.looseObject({
66
+ type: z.enum([
67
+ "HEADER",
68
+ "BODY",
69
+ "FOOTER",
70
+ "BUTTONS"
71
+ ]),
72
+ text: z.string().optional()
73
+ }))
74
+ });
75
+ const whatsappCapabilities = {
76
+ auth: "token",
77
+ posting: false,
78
+ upload: false,
79
+ messaging: true,
80
+ scheduling: false,
81
+ deletion: false,
82
+ listing: false,
83
+ analytics: false,
84
+ environments: false,
85
+ pkce: false
86
+ };
87
+ const whatsappInfo = {
88
+ name: "whatsapp",
89
+ displayName: "WhatsApp Business",
90
+ scopes: [],
91
+ rateLimits: { tiers: [
92
+ 1e3,
93
+ 1e4,
94
+ 1e5
95
+ ] },
96
+ docsUrl: "https://developers.facebook.com/docs/whatsapp/cloud-api"
97
+ };
98
+
99
+ //#endregion
100
+ export { whatsapp_exports as i, whatsappCapabilities as n, whatsappInfo as r, WhatsAppCredentialsSchema as t };
101
+ //# sourceMappingURL=whatsapp-CFp7ryR4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp-CFp7ryR4.mjs","names":[],"sources":["../src/schemas/whatsapp.ts"],"sourcesContent":["/**\n * WhatsApp Business zod v4 schemas.\n */\n\nimport { z } from 'zod';\nimport type { ProviderCapabilities } from '../common/contracts.js';\nimport { NonEmptyString } from './shared.js';\n\n// ─── Credentials ────────────────────────────────────────────────────────────\n\nexport const WhatsAppCredentialsSchema = z.object({\n accessToken: NonEmptyString.describe('Permanent System User access token'),\n businessAccountId: NonEmptyString.describe('WhatsApp Business Account ID'),\n phoneNumberId: NonEmptyString.optional().describe('Phone number ID (sender)'),\n});\nexport type WhatsAppCredentialsInput = z.infer<typeof WhatsAppCredentialsSchema>;\n\n// ─── E.164 phone number ────────────────────────────────────────────────────\n\nconst E164 = z.string().regex(/^\\+?[1-9]\\d{6,14}$/, 'Phone must be E.164 format');\n\n// ─── Send message ───────────────────────────────────────────────────────────\n\nexport const WhatsAppTextMessageSchema = z.object({\n to: E164,\n body: z.string().min(1).max(4096),\n previewUrl: z.boolean().optional(),\n});\n\nexport const WhatsAppTemplateMessageSchema = z.object({\n to: E164,\n templateName: NonEmptyString,\n languageCode: z.string().min(2).max(8).default('en_US'),\n components: z.array(z.looseObject({\n type: z.enum(['header', 'body', 'button', 'footer']),\n parameters: z.array(z.unknown()).optional(),\n })).optional(),\n});\n\nexport const WhatsAppMediaMessageSchema = z.object({\n to: E164,\n type: z.enum(['image', 'video', 'audio', 'document']),\n link: z.url().optional(),\n id: z.string().optional(),\n caption: z.string().max(1024).optional(),\n}).refine(d => d.link || d.id, {\n message: 'Provide either `link` (public URL) or `id` (uploaded media ID)',\n});\n\n// ─── Templates ──────────────────────────────────────────────────────────────\n\nexport const WhatsAppTemplateCategory = z.enum(['MARKETING', 'UTILITY', 'AUTHENTICATION']);\n\nexport const WhatsAppCreateTemplateSchema = z.object({\n name: z.string().regex(/^[a-z0-9_]+$/, 'Name must be lowercase letters, digits, and underscores'),\n category: WhatsAppTemplateCategory,\n languageCode: z.string().min(2).max(8),\n components: z.array(z.looseObject({\n type: z.enum(['HEADER', 'BODY', 'FOOTER', 'BUTTONS']),\n text: z.string().optional(),\n })),\n});\n\n// ─── Capabilities ───────────────────────────────────────────────────────────\n\nexport const whatsappCapabilities: ProviderCapabilities = {\n auth: 'token',\n posting: false,\n upload: false,\n messaging: true,\n scheduling: false,\n deletion: false,\n listing: false,\n analytics: false,\n environments: false,\n pkce: false,\n};\n\nexport const whatsappInfo = {\n name: 'whatsapp' as const,\n displayName: 'WhatsApp Business',\n scopes: [],\n /** WhatsApp messaging tiers: 1k → 10k → 100k → unlimited 24h conversations. */\n rateLimits: { tiers: [1000, 10_000, 100_000] },\n docsUrl: 'https://developers.facebook.com/docs/whatsapp/cloud-api',\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAUA,MAAa,4BAA4B,EAAE,OAAO;CAChD,aAAa,eAAe,SAAS,qCAAqC;CAC1E,mBAAmB,eAAe,SAAS,+BAA+B;CAC1E,eAAe,eAAe,UAAU,CAAC,SAAS,2BAA2B;CAC9E,CAAC;AAKF,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,sBAAsB,6BAA6B;AAIjF,MAAa,4BAA4B,EAAE,OAAO;CAChD,IAAI;CACJ,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK;CACjC,YAAY,EAAE,SAAS,CAAC,UAAU;CACnC,CAAC;AAEF,MAAa,gCAAgC,EAAE,OAAO;CACpD,IAAI;CACJ,cAAc;CACd,cAAc,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,QAAQ;CACvD,YAAY,EAAE,MAAM,EAAE,YAAY;EAChC,MAAM,EAAE,KAAK;GAAC;GAAU;GAAQ;GAAU;GAAS,CAAC;EACpD,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,UAAU;EAC5C,CAAC,CAAC,CAAC,UAAU;CACf,CAAC;AAEF,MAAa,6BAA6B,EAAE,OAAO;CACjD,IAAI;CACJ,MAAM,EAAE,KAAK;EAAC;EAAS;EAAS;EAAS;EAAW,CAAC;CACrD,MAAM,EAAE,KAAK,CAAC,UAAU;CACxB,IAAI,EAAE,QAAQ,CAAC,UAAU;CACzB,SAAS,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,UAAU;CACzC,CAAC,CAAC,QAAO,MAAK,EAAE,QAAQ,EAAE,IAAI,EAC7B,SAAS,kEACV,CAAC;AAIF,MAAa,2BAA2B,EAAE,KAAK;CAAC;CAAa;CAAW;CAAiB,CAAC;AAE1F,MAAa,+BAA+B,EAAE,OAAO;CACnD,MAAM,EAAE,QAAQ,CAAC,MAAM,gBAAgB,0DAA0D;CACjG,UAAU;CACV,cAAc,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE;CACtC,YAAY,EAAE,MAAM,EAAE,YAAY;EAChC,MAAM,EAAE,KAAK;GAAC;GAAU;GAAQ;GAAU;GAAU,CAAC;EACrD,MAAM,EAAE,QAAQ,CAAC,UAAU;EAC5B,CAAC,CAAC;CACJ,CAAC;AAIF,MAAa,uBAA6C;CACxD,MAAM;CACN,SAAS;CACT,QAAQ;CACR,WAAW;CACX,YAAY;CACZ,UAAU;CACV,SAAS;CACT,WAAW;CACX,cAAc;CACd,MAAM;CACP;AAED,MAAa,eAAe;CAC1B,MAAM;CACN,aAAa;CACb,QAAQ,EAAE;CAEV,YAAY,EAAE,OAAO;EAAC;EAAM;EAAQ;EAAQ,EAAE;CAC9C,SAAS;CACV"}
@@ -0,0 +1,98 @@
1
+ import { t as __exportAll } from "./chunk-DQk6qfdC.mjs";
2
+ import { i as OAuthTokensSchema, r as NonEmptyString } from "./shared-Fvc6xQku.mjs";
3
+ import { z } from "zod";
4
+
5
+ //#region src/schemas/youtube.ts
6
+ /**
7
+ * YouTube zod v4 schemas.
8
+ *
9
+ * Authoritative source for YouTube credentials, upload params, and capabilities.
10
+ * Consumers (e.g., `@classytic/arc`) use these to render forms, validate input,
11
+ * and generate API contracts.
12
+ */
13
+ var youtube_exports = /* @__PURE__ */ __exportAll({
14
+ YouTubeCredentialDataSchema: () => YouTubeCredentialDataSchema,
15
+ YouTubeCredentialsSchema: () => YouTubeCredentialsSchema,
16
+ YouTubeListVideosSchema: () => YouTubeListVideosSchema,
17
+ YouTubePrivacy: () => YouTubePrivacy,
18
+ YouTubeUpdateVideoSchema: () => YouTubeUpdateVideoSchema,
19
+ YouTubeUploadParamsSchema: () => YouTubeUploadParamsSchema,
20
+ youtubeCapabilities: () => youtubeCapabilities,
21
+ youtubeInfo: () => youtubeInfo
22
+ });
23
+ const YouTubeCredentialsSchema = z.object({
24
+ clientId: NonEmptyString.describe("Google Cloud OAuth 2.0 Client ID"),
25
+ clientSecret: NonEmptyString.describe("Google Cloud OAuth 2.0 Client Secret"),
26
+ redirectUri: z.url().optional().describe("OAuth redirect URI override")
27
+ });
28
+ const YouTubeCredentialDataSchema = YouTubeCredentialsSchema.extend({ oauthTokenData: z.union([z.string(), OAuthTokensSchema]).optional() });
29
+ const YouTubePrivacy = z.enum([
30
+ "public",
31
+ "unlisted",
32
+ "private"
33
+ ]);
34
+ const YouTubeUploadParamsSchema = z.object({
35
+ filePath: z.string().min(1).optional().describe("Local file path (server-side only)"),
36
+ videoUrl: z.url().optional().describe("Public URL to a downloadable video"),
37
+ title: z.string().min(1).max(100).describe("Video title (≤100 characters)"),
38
+ description: z.string().max(5e3).optional().describe("Video description (≤5000 characters)"),
39
+ tags: z.array(z.string()).max(500).optional().describe("Up to 500 free-form tags"),
40
+ privacy: YouTubePrivacy.optional().default("private"),
41
+ categoryId: z.string().optional().describe("YouTube category ID (e.g., \"22\" for People & Blogs)"),
42
+ publishAt: z.iso.datetime().optional().describe("Schedule publication time (ISO 8601)"),
43
+ thumbnailUrl: z.url().optional().describe("Public URL of a thumbnail image")
44
+ }).refine((d) => d.filePath || d.videoUrl, {
45
+ message: "Provide either filePath or videoUrl",
46
+ path: ["filePath"]
47
+ });
48
+ const YouTubeUpdateVideoSchema = z.object({
49
+ title: z.string().min(1).max(100).optional(),
50
+ description: z.string().max(5e3).optional(),
51
+ tags: z.array(z.string()).max(500).optional(),
52
+ privacy: YouTubePrivacy.optional(),
53
+ categoryId: z.string().optional()
54
+ });
55
+ const YouTubeListVideosSchema = z.object({
56
+ maxResults: z.number().int().min(1).max(50).optional().default(10),
57
+ order: z.enum([
58
+ "date",
59
+ "rating",
60
+ "relevance",
61
+ "title",
62
+ "viewCount"
63
+ ]).optional(),
64
+ pageToken: z.string().optional(),
65
+ publishedAfter: z.iso.datetime().optional(),
66
+ publishedBefore: z.iso.datetime().optional()
67
+ });
68
+ const youtubeCapabilities = {
69
+ auth: "oauth2",
70
+ posting: false,
71
+ upload: true,
72
+ messaging: false,
73
+ scheduling: true,
74
+ deletion: true,
75
+ listing: true,
76
+ analytics: false,
77
+ environments: false,
78
+ pkce: false
79
+ };
80
+ const youtubeInfo = {
81
+ name: "youtube",
82
+ displayName: "YouTube",
83
+ scopes: [
84
+ "https://www.googleapis.com/auth/youtube.upload",
85
+ "https://www.googleapis.com/auth/youtube",
86
+ "https://www.googleapis.com/auth/userinfo.profile"
87
+ ],
88
+ rateLimits: { perDayQuotaUnits: 1e4 },
89
+ fileLimits: { video: {
90
+ maxSizeBytes: 256 * 1024 ** 3,
91
+ maxDurationSec: 12 * 3600
92
+ } },
93
+ docsUrl: "https://developers.google.com/youtube/v3"
94
+ };
95
+
96
+ //#endregion
97
+ export { youtube_exports as i, youtubeCapabilities as n, youtubeInfo as r, YouTubeCredentialsSchema as t };
98
+ //# sourceMappingURL=youtube-Bs0fdY7H.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"youtube-Bs0fdY7H.mjs","names":[],"sources":["../src/schemas/youtube.ts"],"sourcesContent":["/**\n * YouTube zod v4 schemas.\n *\n * Authoritative source for YouTube credentials, upload params, and capabilities.\n * Consumers (e.g., `@classytic/arc`) use these to render forms, validate input,\n * and generate API contracts.\n */\n\nimport { z } from 'zod';\nimport type { ProviderCapabilities } from '../common/contracts.js';\nimport { NonEmptyString, OAuthTokensSchema, PrivacyLevel } from './shared.js';\n\n// ─── Credentials ────────────────────────────────────────────────────────────\n\nexport const YouTubeCredentialsSchema = z.object({\n clientId: NonEmptyString.describe('Google Cloud OAuth 2.0 Client ID'),\n clientSecret: NonEmptyString.describe('Google Cloud OAuth 2.0 Client Secret'),\n redirectUri: z.url().optional().describe('OAuth redirect URI override'),\n});\nexport type YouTubeCredentialsInput = z.infer<typeof YouTubeCredentialsSchema>;\n\nexport const YouTubeCredentialDataSchema = YouTubeCredentialsSchema.extend({\n oauthTokenData: z.union([z.string(), OAuthTokensSchema]).optional(),\n});\n\n// ─── Upload params ──────────────────────────────────────────────────────────\n\nexport const YouTubePrivacy = z.enum(['public', 'unlisted', 'private']);\n\nexport const YouTubeUploadParamsSchema = z.object({\n filePath: z.string().min(1).optional().describe('Local file path (server-side only)'),\n videoUrl: z.url().optional().describe('Public URL to a downloadable video'),\n title: z.string().min(1).max(100).describe('Video title (≤100 characters)'),\n description: z.string().max(5000).optional().describe('Video description (≤5000 characters)'),\n tags: z.array(z.string()).max(500).optional().describe('Up to 500 free-form tags'),\n privacy: YouTubePrivacy.optional().default('private'),\n categoryId: z.string().optional().describe('YouTube category ID (e.g., \"22\" for People & Blogs)'),\n publishAt: z.iso.datetime().optional().describe('Schedule publication time (ISO 8601)'),\n thumbnailUrl: z.url().optional().describe('Public URL of a thumbnail image'),\n}).refine(d => d.filePath || d.videoUrl, {\n message: 'Provide either filePath or videoUrl',\n path: ['filePath'],\n});\nexport type YouTubeUploadParamsInput = z.infer<typeof YouTubeUploadParamsSchema>;\n\n// ─── Update params ──────────────────────────────────────────────────────────\n\nexport const YouTubeUpdateVideoSchema = z.object({\n title: z.string().min(1).max(100).optional(),\n description: z.string().max(5000).optional(),\n tags: z.array(z.string()).max(500).optional(),\n privacy: YouTubePrivacy.optional(),\n categoryId: z.string().optional(),\n});\n\n// ─── List options ───────────────────────────────────────────────────────────\n\nexport const YouTubeListVideosSchema = z.object({\n maxResults: z.number().int().min(1).max(50).optional().default(10),\n order: z.enum(['date', 'rating', 'relevance', 'title', 'viewCount']).optional(),\n pageToken: z.string().optional(),\n publishedAfter: z.iso.datetime().optional(),\n publishedBefore: z.iso.datetime().optional(),\n});\n\n// ─── Capabilities ───────────────────────────────────────────────────────────\n\nexport const youtubeCapabilities: ProviderCapabilities = {\n auth: 'oauth2',\n posting: false,\n upload: true,\n messaging: false,\n scheduling: true,\n deletion: true,\n listing: true,\n analytics: false,\n environments: false,\n pkce: false,\n};\n\n// ─── Provider info ──────────────────────────────────────────────────────────\n\nexport const youtubeInfo = {\n name: 'youtube' as const,\n displayName: 'YouTube',\n scopes: [\n 'https://www.googleapis.com/auth/youtube.upload',\n 'https://www.googleapis.com/auth/youtube',\n 'https://www.googleapis.com/auth/userinfo.profile',\n ],\n /** Per-day quota units; reads ≈1, uploads ≈1600. */\n rateLimits: { perDayQuotaUnits: 10_000 },\n fileLimits: {\n video: { maxSizeBytes: 256 * 1024 ** 3, maxDurationSec: 12 * 3600 },\n },\n docsUrl: 'https://developers.google.com/youtube/v3',\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAcA,MAAa,2BAA2B,EAAE,OAAO;CAC/C,UAAU,eAAe,SAAS,mCAAmC;CACrE,cAAc,eAAe,SAAS,uCAAuC;CAC7E,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,8BAA8B;CACxE,CAAC;AAGF,MAAa,8BAA8B,yBAAyB,OAAO,EACzE,gBAAgB,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC,UAAU,EACpE,CAAC;AAIF,MAAa,iBAAiB,EAAE,KAAK;CAAC;CAAU;CAAY;CAAU,CAAC;AAEvE,MAAa,4BAA4B,EAAE,OAAO;CAChD,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,qCAAqC;CACrF,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,qCAAqC;CAC3E,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,SAAS,gCAAgC;CAC3E,aAAa,EAAE,QAAQ,CAAC,IAAI,IAAK,CAAC,UAAU,CAAC,SAAS,uCAAuC;CAC7F,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,2BAA2B;CAClF,SAAS,eAAe,UAAU,CAAC,QAAQ,UAAU;CACrD,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,wDAAsD;CACjG,WAAW,EAAE,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,uCAAuC;CACvF,cAAc,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,kCAAkC;CAC7E,CAAC,CAAC,QAAO,MAAK,EAAE,YAAY,EAAE,UAAU;CACvC,SAAS;CACT,MAAM,CAAC,WAAW;CACnB,CAAC;AAKF,MAAa,2BAA2B,EAAE,OAAO;CAC/C,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU;CAC5C,aAAa,EAAE,QAAQ,CAAC,IAAI,IAAK,CAAC,UAAU;CAC5C,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU;CAC7C,SAAS,eAAe,UAAU;CAClC,YAAY,EAAE,QAAQ,CAAC,UAAU;CAClC,CAAC;AAIF,MAAa,0BAA0B,EAAE,OAAO;CAC9C,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,GAAG;CAClE,OAAO,EAAE,KAAK;EAAC;EAAQ;EAAU;EAAa;EAAS;EAAY,CAAC,CAAC,UAAU;CAC/E,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,gBAAgB,EAAE,IAAI,UAAU,CAAC,UAAU;CAC3C,iBAAiB,EAAE,IAAI,UAAU,CAAC,UAAU;CAC7C,CAAC;AAIF,MAAa,sBAA4C;CACvD,MAAM;CACN,SAAS;CACT,QAAQ;CACR,WAAW;CACX,YAAY;CACZ,UAAU;CACV,SAAS;CACT,WAAW;CACX,cAAc;CACd,MAAM;CACP;AAID,MAAa,cAAc;CACzB,MAAM;CACN,aAAa;CACb,QAAQ;EACN;EACA;EACA;EACD;CAED,YAAY,EAAE,kBAAkB,KAAQ;CACxC,YAAY,EACV,OAAO;EAAE,cAAc,MAAM,QAAQ;EAAG,gBAAgB,KAAK;EAAM,EACpE;CACD,SAAS;CACV"}
package/package.json ADDED
@@ -0,0 +1,148 @@
1
+ {
2
+ "name": "@classytic/social",
3
+ "version": "0.1.0",
4
+ "description": "Unified social media provider SDK — YouTube, TikTok, Instagram, Facebook, LinkedIn, Telegram, WhatsApp, Twitter/X, Reddit. OAuth, video upload, publishing, scheduling.",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "main": "./dist/index.mjs",
8
+ "module": "./dist/index.mjs",
9
+ "types": "./dist/index.d.mts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.mts",
13
+ "import": "./dist/index.mjs"
14
+ },
15
+ "./common": {
16
+ "types": "./dist/common/index.d.mts",
17
+ "import": "./dist/common/index.mjs"
18
+ },
19
+ "./schemas": {
20
+ "types": "./dist/schemas/index.d.mts",
21
+ "import": "./dist/schemas/index.mjs"
22
+ },
23
+ "./client": {
24
+ "types": "./dist/client/index.d.mts",
25
+ "import": "./dist/client/index.mjs"
26
+ },
27
+ "./youtube": {
28
+ "types": "./dist/providers/youtube.d.mts",
29
+ "import": "./dist/providers/youtube.mjs"
30
+ },
31
+ "./tiktok": {
32
+ "types": "./dist/providers/tiktok.d.mts",
33
+ "import": "./dist/providers/tiktok.mjs"
34
+ },
35
+ "./instagram": {
36
+ "types": "./dist/providers/instagram.d.mts",
37
+ "import": "./dist/providers/instagram.mjs"
38
+ },
39
+ "./facebook": {
40
+ "types": "./dist/providers/facebook.d.mts",
41
+ "import": "./dist/providers/facebook.mjs"
42
+ },
43
+ "./linkedin": {
44
+ "types": "./dist/providers/linkedin.d.mts",
45
+ "import": "./dist/providers/linkedin.mjs"
46
+ },
47
+ "./telegram": {
48
+ "types": "./dist/providers/telegram.d.mts",
49
+ "import": "./dist/providers/telegram.mjs"
50
+ },
51
+ "./whatsapp": {
52
+ "types": "./dist/providers/whatsapp.d.mts",
53
+ "import": "./dist/providers/whatsapp.mjs"
54
+ },
55
+ "./twitter": {
56
+ "types": "./dist/providers/twitter.d.mts",
57
+ "import": "./dist/providers/twitter.mjs"
58
+ },
59
+ "./reddit": {
60
+ "types": "./dist/providers/reddit.d.mts",
61
+ "import": "./dist/providers/reddit.mjs"
62
+ },
63
+ "./package.json": "./package.json"
64
+ },
65
+ "files": [
66
+ "dist",
67
+ "README.md",
68
+ "CHANGELOG.md",
69
+ "LICENSE"
70
+ ],
71
+ "scripts": {
72
+ "build": "tsdown",
73
+ "dev": "tsdown --watch",
74
+ "typecheck": "tsc --noEmit",
75
+ "typecheck:examples": "tsc --noEmit -p examples/tsconfig.json",
76
+ "prepublishOnly": "npm run build && npm run typecheck",
77
+ "publish:dry": "npm publish --dry-run --access public",
78
+ "publish:npm": "npm publish --access public",
79
+ "push": "classytic-push",
80
+ "release": "npm run build && npm run typecheck && npm publish --access public",
81
+ "release:patch": "npm version patch && npm run release",
82
+ "release:minor": "npm version minor && npm run release",
83
+ "release:major": "npm version major && npm run release",
84
+ "test": "vitest run",
85
+ "test:watch": "vitest",
86
+ "test:coverage": "vitest run --coverage"
87
+ },
88
+ "keywords": [
89
+ "social-media",
90
+ "youtube",
91
+ "tiktok",
92
+ "instagram",
93
+ "facebook",
94
+ "linkedin",
95
+ "telegram",
96
+ "whatsapp",
97
+ "twitter",
98
+ "reddit",
99
+ "oauth",
100
+ "video-upload",
101
+ "social-api",
102
+ "mcp",
103
+ "ai-agent",
104
+ "publishing",
105
+ "scheduling"
106
+ ],
107
+ "author": "Classytic <classytic.dev@gmail.com> (https://github.com/classytic)",
108
+ "contributors": [
109
+ "Sadman Chowdhury (https://github.com/siam923)"
110
+ ],
111
+ "license": "MIT",
112
+ "repository": {
113
+ "type": "git",
114
+ "url": "git+https://github.com/classytic/social.git"
115
+ },
116
+ "homepage": "https://github.com/classytic/social#readme",
117
+ "bugs": {
118
+ "url": "https://github.com/classytic/social/issues"
119
+ },
120
+ "peerDependencies": {
121
+ "googleapis": ">=140.0.0"
122
+ },
123
+ "peerDependenciesMeta": {
124
+ "googleapis": {
125
+ "optional": true
126
+ }
127
+ },
128
+ "devDependencies": {
129
+ "@arethetypeswrong/core": "^0.18.2",
130
+ "@classytic/dev-tools": "^0.2.0",
131
+ "@types/node": "^22.10.0",
132
+ "@vitest/coverage-v8": "^3.2.4",
133
+ "googleapis": "^171.4.0",
134
+ "publint": "^0.3.17",
135
+ "tsdown": "^0.20.3",
136
+ "typescript": "^5.7.2",
137
+ "vitest": "^3.0.0"
138
+ },
139
+ "engines": {
140
+ "node": ">=20.0.0"
141
+ },
142
+ "publishConfig": {
143
+ "access": "public"
144
+ },
145
+ "dependencies": {
146
+ "zod": "^4.4.3"
147
+ }
148
+ }