@hasna/connectors 1.3.38 → 1.3.39
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/bin/index.js +1 -1
- package/bin/mcp.js +1 -1
- package/bin/serve.js +1 -1
- package/dashboard/dist/assets/index-BFt8iLcN.js +284 -0
- package/dashboard/dist/assets/index-CSrRAjU9.css +1 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/.types/src/social/facebook.d.ts +30 -0
- package/dist/.types/src/social/instagram.d.ts +39 -0
- package/dist/.types/src/social/threads.d.ts +40 -0
- package/dist/.types/src/social/types.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/social/index.js +306 -2
- package/package.json +1 -1
- package/dashboard/dist/assets/index-CUbp3qRv.js +0 -284
- package/dashboard/dist/assets/index-ClBXkNbL.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-950:oklch(27.9% .077 45.635);--color-green-50:oklch(98.2% .018 155.826);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-950:oklch(26.2% .051 172.552);--color-blue-500:oklch(62.3% .214 259.815);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-950:oklch(25.7% .09 281.288);--color-purple-500:oklch(62.7% .265 303.9);--color-gray-300:oklch(87.2% .01 258.338);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-lg:32rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--leading-relaxed:1.625;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border)}body{background-color:var(--background);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.top-4{top:calc(var(--spacing) * 4)}.top-\[50\%\]{top:50%}.right-4{right:calc(var(--spacing) * 4)}.right-6{right:calc(var(--spacing) * 6)}.bottom-6{bottom:calc(var(--spacing) * 6)}.left-2{left:calc(var(--spacing) * 2)}.left-\[50\%\]{left:50%}.z-50{z-index:50}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.mt-1{margin-top:var(--spacing)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.-ml-3{margin-left:calc(var(--spacing) * -3)}.ml-1{margin-left:var(--spacing)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.table{display:table}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-14{height:calc(var(--spacing) * 14)}.h-24{height:calc(var(--spacing) * 24)}.h-px{height:1px}.max-h-\[85vh\]{max-height:85vh}.min-h-screen{min-height:100vh}.w-16{width:calc(var(--spacing) * 16)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-lg{max-width:var(--container-lg)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-\[8rem\]{min-width:8rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.rotate-0{rotate:0deg}.rotate-90{rotate:90deg}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.auto-rows-min{grid-auto-rows:min-content}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-amber-300{border-color:var(--color-amber-300)}.border-border{border-color:var(--border)}.border-gray-300{border-color:var(--color-gray-300)}.border-green-200{border-color:var(--color-green-200)}.border-green-300{border-color:var(--color-green-300)}.border-input{border-color:var(--input)}.border-muted-foreground\/20{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.border-muted-foreground\/20{border-color:color-mix(in oklab,var(--muted-foreground) 20%,transparent)}}.border-orange-300{border-color:var(--color-orange-300)}.border-red-200{border-color:var(--color-red-200)}.border-transparent{border-color:#0000}.bg-amber-100{background-color:var(--color-amber-100)}.bg-background{background-color:var(--background)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-500{background-color:var(--color-green-500)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-muted{background-color:var(--muted)}.bg-muted-foreground\/30{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/30{background-color:color-mix(in oklab,var(--muted-foreground) 30%,transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-red-50{background-color:var(--color-red-50)}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-6{padding:calc(var(--spacing) * 6)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.whitespace-nowrap{white-space:nowrap}.text-amber-700{color:var(--color-amber-700)}.text-blue-500{color:var(--color-blue-500)}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground{color:var(--foreground)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-indigo-700{color:var(--color-indigo-700)}.text-muted-foreground,.text-muted-foreground\/60{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,var(--muted-foreground) 60%,transparent)}}.text-orange-600{color:var(--color-orange-600)}.text-orange-700{color:var(--color-orange-700)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-purple-500{color:var(--color-purple-500)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-800{color:var(--color-red-800)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.underline-offset-4{text-underline-offset:4px}.accent-primary{accent-color:var(--primary)}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}@media(hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary) 80%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-destructive:hover{color:var(--destructive)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[inset\]\:pl-8[data-inset]{padding-left:calc(var(--spacing) * 8)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:.15s ease-in exit}.data-\[state\=open\]\:animate-in[data-state=open]{animation:.2s ease-out enter}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--accent-foreground)}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:text-left{text-align:left}}@media(min-width:48rem){.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media(prefers-color-scheme:dark){.dark\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:-rotate-90{rotate:-90deg}.dark\:rotate-0{rotate:0deg}.dark\:border-amber-800{border-color:var(--color-amber-800)}.dark\:border-green-800{border-color:var(--color-green-800)}.dark\:border-green-900{border-color:var(--color-green-900)}.dark\:border-input{border-color:var(--input)}.dark\:border-orange-800{border-color:var(--color-orange-800)}.dark\:border-red-900{border-color:var(--color-red-900)}.dark\:bg-amber-950{background-color:var(--color-amber-950)}.dark\:bg-destructive\/60{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60{background-color:color-mix(in oklab,var(--destructive) 60%,transparent)}}.dark\:bg-emerald-950{background-color:var(--color-emerald-950)}.dark\:bg-green-950{background-color:var(--color-green-950)}.dark\:bg-indigo-950{background-color:var(--color-indigo-950)}.dark\:bg-input\/30{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30{background-color:color-mix(in oklab,var(--input) 30%,transparent)}}.dark\:bg-red-950{background-color:var(--color-red-950)}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-emerald-300{color:var(--color-emerald-300)}.dark\:text-green-200{color:var(--color-green-200)}.dark\:text-green-400{color:var(--color-green-400)}.dark\:text-indigo-300{color:var(--color-indigo-300)}.dark\:text-orange-400{color:var(--color-orange-400)}.dark\:text-red-200{color:var(--color-red-200)}.dark\:text-red-400{color:var(--color-red-400)}@media(hover:hover){.dark\:hover\:bg-accent\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,var(--accent) 50%,transparent)}}.dark\:hover\:bg-input\/50:hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:hover{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}@keyframes enter{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes exit{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.95)}}:root{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(96.5% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(96.5% 0 0);--muted-foreground:oklch(55.6% 0 0);--accent:oklch(96.5% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.1% 0 0);--input:oklch(92.1% 0 0);--ring:oklch(70.8% 0 0)}.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(17.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(17.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(98.5% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(39.6% .141 25.723);--border:oklch(26.9% 0 0);--input:oklch(26.9% 0 0);--ring:oklch(43.9% 0 0)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>Hasna Connectors</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-BFt8iLcN.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CSrRAjU9.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type FetchLike } from "./http";
|
|
2
|
+
import type { AccountMeResult, AnalyticsPostInput, AnalyticsPostResult, MediaUploadInput, MediaUploadResult, MentionsListInput, MentionsListResult, PostCreateInput, PostCreateResult, PostDeleteInput, PostDeleteResult, SocialAdapter } from "./types";
|
|
3
|
+
export interface FacebookCredentials {
|
|
4
|
+
/** Page access token. */
|
|
5
|
+
accessToken: string;
|
|
6
|
+
/** Target Facebook Page id. */
|
|
7
|
+
pageId: string;
|
|
8
|
+
/** Override the Graph API base (e.g. a pinned version host). */
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
}
|
|
11
|
+
/** Facebook `post.create` extras. */
|
|
12
|
+
export interface FacebookPostExtras {
|
|
13
|
+
/** Optional link URL attached to the feed post. */
|
|
14
|
+
link?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class FacebookAdapter implements SocialAdapter {
|
|
17
|
+
private readonly accessToken;
|
|
18
|
+
private readonly pageId;
|
|
19
|
+
private readonly baseUrl;
|
|
20
|
+
private readonly fetchImpl;
|
|
21
|
+
constructor(creds: FacebookCredentials, fetchImpl?: FetchLike);
|
|
22
|
+
static fromCredentials(creds: FacebookCredentials, fetchImpl?: FetchLike): FacebookAdapter;
|
|
23
|
+
private auth;
|
|
24
|
+
accountMe(): Promise<AccountMeResult>;
|
|
25
|
+
postCreate(input: PostCreateInput & FacebookPostExtras): Promise<PostCreateResult>;
|
|
26
|
+
postDelete(input: PostDeleteInput): Promise<PostDeleteResult>;
|
|
27
|
+
mediaUpload(input: MediaUploadInput): Promise<MediaUploadResult>;
|
|
28
|
+
mentionsList(_input?: MentionsListInput): Promise<MentionsListResult>;
|
|
29
|
+
analyticsPost(input: AnalyticsPostInput): Promise<AnalyticsPostResult>;
|
|
30
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type FetchLike } from "./http";
|
|
2
|
+
import type { AccountMeResult, AnalyticsPostInput, AnalyticsPostResult, MediaUploadInput, MediaUploadResult, MentionsListInput, MentionsListResult, PostCreateInput, PostCreateResult, PostDeleteInput, PostDeleteResult, SocialAdapter } from "./types";
|
|
3
|
+
export interface InstagramCredentials {
|
|
4
|
+
/** Long-lived user access token with instagram_content_publish. */
|
|
5
|
+
accessToken: string;
|
|
6
|
+
/** IG user id (the IG-Business account id). */
|
|
7
|
+
igUserId: string;
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
/** Instagram `media.upload` extras (IG uploads from a public URL, not bytes). */
|
|
11
|
+
export interface InstagramMediaExtras {
|
|
12
|
+
/** Public URL of the image to build a container from. */
|
|
13
|
+
sourceUrl?: string;
|
|
14
|
+
/** Caption for the resulting container. */
|
|
15
|
+
caption?: string;
|
|
16
|
+
}
|
|
17
|
+
/** Instagram `post.create` extras. */
|
|
18
|
+
export interface InstagramPostExtras {
|
|
19
|
+
/** Public image URL to publish (when no prebuilt container `mediaIds` is given). */
|
|
20
|
+
imageUrl?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare class InstagramAdapter implements SocialAdapter {
|
|
23
|
+
private readonly accessToken;
|
|
24
|
+
private readonly igUserId;
|
|
25
|
+
private readonly baseUrl;
|
|
26
|
+
private readonly fetchImpl;
|
|
27
|
+
constructor(creds: InstagramCredentials, fetchImpl?: FetchLike);
|
|
28
|
+
static fromCredentials(creds: InstagramCredentials, fetchImpl?: FetchLike): InstagramAdapter;
|
|
29
|
+
private form;
|
|
30
|
+
private postForm;
|
|
31
|
+
/** Create a media container from a public image URL; returns its creation id. */
|
|
32
|
+
private createContainer;
|
|
33
|
+
accountMe(): Promise<AccountMeResult>;
|
|
34
|
+
postCreate(input: PostCreateInput & InstagramPostExtras): Promise<PostCreateResult>;
|
|
35
|
+
postDelete(_input: PostDeleteInput): Promise<PostDeleteResult>;
|
|
36
|
+
mediaUpload(input: MediaUploadInput & InstagramMediaExtras): Promise<MediaUploadResult>;
|
|
37
|
+
mentionsList(_input?: MentionsListInput): Promise<MentionsListResult>;
|
|
38
|
+
analyticsPost(input: AnalyticsPostInput): Promise<AnalyticsPostResult>;
|
|
39
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type FetchLike } from "./http";
|
|
2
|
+
import type { AccountMeResult, AnalyticsPostInput, AnalyticsPostResult, MediaUploadInput, MediaUploadResult, MentionsListInput, MentionsListResult, PostCreateInput, PostCreateResult, PostDeleteInput, PostDeleteResult, SocialAdapter } from "./types";
|
|
3
|
+
export interface ThreadsCredentials {
|
|
4
|
+
/** Threads user access token. */
|
|
5
|
+
accessToken: string;
|
|
6
|
+
/** Threads user id. */
|
|
7
|
+
userId: string;
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
/** Threads `post.create` extras. */
|
|
11
|
+
export interface ThreadsPostExtras {
|
|
12
|
+
/** Id of an existing thread to reply to (enables reply chaining). */
|
|
13
|
+
replyToId?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Threads `media.upload` extras. */
|
|
16
|
+
export interface ThreadsMediaExtras {
|
|
17
|
+
/** Public URL of the image to build an IMAGE container from. */
|
|
18
|
+
sourceUrl?: string;
|
|
19
|
+
/** Public URL of the video to build a VIDEO container from. */
|
|
20
|
+
videoUrl?: string;
|
|
21
|
+
/** Caption / text for the media container. */
|
|
22
|
+
text?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class ThreadsAdapter implements SocialAdapter {
|
|
25
|
+
private readonly accessToken;
|
|
26
|
+
private readonly userId;
|
|
27
|
+
private readonly baseUrl;
|
|
28
|
+
private readonly fetchImpl;
|
|
29
|
+
private cachedUsername?;
|
|
30
|
+
constructor(creds: ThreadsCredentials, fetchImpl?: FetchLike);
|
|
31
|
+
static fromCredentials(creds: ThreadsCredentials, fetchImpl?: FetchLike): ThreadsAdapter;
|
|
32
|
+
private form;
|
|
33
|
+
private postForm;
|
|
34
|
+
accountMe(): Promise<AccountMeResult>;
|
|
35
|
+
postCreate(input: PostCreateInput & ThreadsPostExtras): Promise<PostCreateResult>;
|
|
36
|
+
postDelete(input: PostDeleteInput): Promise<PostDeleteResult>;
|
|
37
|
+
mediaUpload(input: MediaUploadInput & ThreadsMediaExtras): Promise<MediaUploadResult>;
|
|
38
|
+
mentionsList(input?: MentionsListInput): Promise<MentionsListResult>;
|
|
39
|
+
analyticsPost(input: AnalyticsPostInput): Promise<AnalyticsPostResult>;
|
|
40
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* entry point stays bundle-safe (no fs/db/runner imports).
|
|
7
7
|
*/
|
|
8
8
|
/** Slugs supported by this deliverable. */
|
|
9
|
-
export type SocialConnectorSlug = "x" | "mastodon" | "bluesky" | "linkedin" | "reddit" | "tiktok" | "youtube" | "pinterest" | "googlebusinessprofile";
|
|
9
|
+
export type SocialConnectorSlug = "x" | "mastodon" | "bluesky" | "linkedin" | "reddit" | "tiktok" | "youtube" | "pinterest" | "googlebusinessprofile" | "facebook" | "instagram" | "threads";
|
|
10
10
|
/** Normalized operation names. */
|
|
11
11
|
export type SocialOperation = "account.me" | "post.create" | "post.delete" | "media.upload" | "mentions.list" | "analytics.post";
|
|
12
12
|
export interface AccountMeResult {
|
package/dist/index.js
CHANGED
|
@@ -5764,7 +5764,7 @@ function extractGoogleError(body) {
|
|
|
5764
5764
|
// package.json
|
|
5765
5765
|
var package_default = {
|
|
5766
5766
|
name: "@hasna/connectors",
|
|
5767
|
-
version: "1.3.
|
|
5767
|
+
version: "1.3.38",
|
|
5768
5768
|
description: "Open source connector library - Install API connectors with a single command",
|
|
5769
5769
|
type: "module",
|
|
5770
5770
|
bin: {
|
package/dist/social/index.js
CHANGED
|
@@ -2203,6 +2203,298 @@ class GoogleBusinessProfileAdapter {
|
|
|
2203
2203
|
}
|
|
2204
2204
|
}
|
|
2205
2205
|
|
|
2206
|
+
// src/social/facebook.ts
|
|
2207
|
+
var DEFAULT_BASE2 = "https://graph.facebook.com/v19.0";
|
|
2208
|
+
|
|
2209
|
+
class FacebookAdapter {
|
|
2210
|
+
accessToken;
|
|
2211
|
+
pageId;
|
|
2212
|
+
baseUrl;
|
|
2213
|
+
fetchImpl;
|
|
2214
|
+
constructor(creds, fetchImpl) {
|
|
2215
|
+
if (!creds || !creds.accessToken) {
|
|
2216
|
+
throw new Error("facebook credentials require `accessToken`");
|
|
2217
|
+
}
|
|
2218
|
+
if (!creds.pageId) {
|
|
2219
|
+
throw new Error("facebook credentials require `pageId`");
|
|
2220
|
+
}
|
|
2221
|
+
this.accessToken = creds.accessToken;
|
|
2222
|
+
this.pageId = creds.pageId;
|
|
2223
|
+
this.baseUrl = (creds.baseUrl ?? DEFAULT_BASE2).replace(/\/+$/, "");
|
|
2224
|
+
this.fetchImpl = resolveFetch(fetchImpl);
|
|
2225
|
+
}
|
|
2226
|
+
static fromCredentials(creds, fetchImpl) {
|
|
2227
|
+
return new FacebookAdapter(creds, fetchImpl);
|
|
2228
|
+
}
|
|
2229
|
+
auth() {
|
|
2230
|
+
return { access_token: this.accessToken };
|
|
2231
|
+
}
|
|
2232
|
+
async accountMe() {
|
|
2233
|
+
const me = await jsonRequest(this.fetchImpl, `${this.baseUrl}/${encodeURIComponent(this.pageId)}`, { query: { fields: "id,name,link", ...this.auth() }, errorLabel: "Facebook" });
|
|
2234
|
+
return {
|
|
2235
|
+
id: me.id,
|
|
2236
|
+
displayName: me.name,
|
|
2237
|
+
url: me.link
|
|
2238
|
+
};
|
|
2239
|
+
}
|
|
2240
|
+
async postCreate(input) {
|
|
2241
|
+
const body = { access_token: this.accessToken };
|
|
2242
|
+
if (input.text)
|
|
2243
|
+
body.message = input.text;
|
|
2244
|
+
if (input.link)
|
|
2245
|
+
body.link = input.link;
|
|
2246
|
+
if (input.mediaIds && input.mediaIds.length > 0) {
|
|
2247
|
+
body.attached_media = JSON.stringify(input.mediaIds.map((id2) => ({ media_fbid: id2 })));
|
|
2248
|
+
}
|
|
2249
|
+
const res = await jsonRequest(this.fetchImpl, `${this.baseUrl}/${encodeURIComponent(this.pageId)}/feed`, { method: "POST", body: new URLSearchParams(body).toString(), headers: { "Content-Type": "application/x-www-form-urlencoded" }, errorLabel: "Facebook" });
|
|
2250
|
+
const id = res.post_id ?? res.id;
|
|
2251
|
+
return { id, url: `https://facebook.com/${id}` };
|
|
2252
|
+
}
|
|
2253
|
+
async postDelete(input) {
|
|
2254
|
+
await jsonRequest(this.fetchImpl, `${this.baseUrl}/${encodeURIComponent(input.id)}`, { method: "DELETE", query: this.auth(), errorLabel: "Facebook" });
|
|
2255
|
+
return { id: input.id, deleted: true };
|
|
2256
|
+
}
|
|
2257
|
+
async mediaUpload(input) {
|
|
2258
|
+
const buffer = decodeBase64(input.dataBase64);
|
|
2259
|
+
const bytes = Uint8Array.from(buffer);
|
|
2260
|
+
const form = new FormData;
|
|
2261
|
+
form.append("access_token", this.accessToken);
|
|
2262
|
+
form.append("published", "false");
|
|
2263
|
+
form.append("source", new Blob([bytes], { type: input.mimeType }), "upload");
|
|
2264
|
+
const res = await jsonRequest(this.fetchImpl, `${this.baseUrl}/${encodeURIComponent(this.pageId)}/photos`, { method: "POST", body: form, errorLabel: "Facebook" });
|
|
2265
|
+
return { mediaId: res.id };
|
|
2266
|
+
}
|
|
2267
|
+
async mentionsList(_input = {}) {
|
|
2268
|
+
throw new ConnectorOperationNotSupported("facebook", "mentions.list (Page mentions require the deprecated/limited tagged edge; not modeled)");
|
|
2269
|
+
}
|
|
2270
|
+
async analyticsPost(input) {
|
|
2271
|
+
const res = await jsonRequest(this.fetchImpl, `${this.baseUrl}/${encodeURIComponent(input.id)}`, {
|
|
2272
|
+
query: { fields: "likes.summary(true),comments.summary(true),shares", ...this.auth() },
|
|
2273
|
+
errorLabel: "Facebook"
|
|
2274
|
+
});
|
|
2275
|
+
const metrics = {
|
|
2276
|
+
likes: res.likes?.summary?.total_count ?? 0,
|
|
2277
|
+
comments: res.comments?.summary?.total_count ?? 0,
|
|
2278
|
+
shares: res.shares?.count ?? 0
|
|
2279
|
+
};
|
|
2280
|
+
return { metrics };
|
|
2281
|
+
}
|
|
2282
|
+
}
|
|
2283
|
+
|
|
2284
|
+
// src/social/instagram.ts
|
|
2285
|
+
var DEFAULT_BASE3 = "https://graph.facebook.com/v19.0";
|
|
2286
|
+
|
|
2287
|
+
class InstagramAdapter {
|
|
2288
|
+
accessToken;
|
|
2289
|
+
igUserId;
|
|
2290
|
+
baseUrl;
|
|
2291
|
+
fetchImpl;
|
|
2292
|
+
constructor(creds, fetchImpl) {
|
|
2293
|
+
if (!creds || !creds.accessToken) {
|
|
2294
|
+
throw new Error("instagram credentials require `accessToken`");
|
|
2295
|
+
}
|
|
2296
|
+
if (!creds.igUserId) {
|
|
2297
|
+
throw new Error("instagram credentials require `igUserId`");
|
|
2298
|
+
}
|
|
2299
|
+
this.accessToken = creds.accessToken;
|
|
2300
|
+
this.igUserId = creds.igUserId;
|
|
2301
|
+
this.baseUrl = (creds.baseUrl ?? DEFAULT_BASE3).replace(/\/+$/, "");
|
|
2302
|
+
this.fetchImpl = resolveFetch(fetchImpl);
|
|
2303
|
+
}
|
|
2304
|
+
static fromCredentials(creds, fetchImpl) {
|
|
2305
|
+
return new InstagramAdapter(creds, fetchImpl);
|
|
2306
|
+
}
|
|
2307
|
+
form(fields) {
|
|
2308
|
+
const params = new URLSearchParams;
|
|
2309
|
+
params.append("access_token", this.accessToken);
|
|
2310
|
+
for (const [k, v] of Object.entries(fields)) {
|
|
2311
|
+
if (v !== undefined && v !== "")
|
|
2312
|
+
params.append(k, v);
|
|
2313
|
+
}
|
|
2314
|
+
return params.toString();
|
|
2315
|
+
}
|
|
2316
|
+
postForm(path, fields) {
|
|
2317
|
+
return jsonRequest(this.fetchImpl, `${this.baseUrl}/${path}`, {
|
|
2318
|
+
method: "POST",
|
|
2319
|
+
body: this.form(fields),
|
|
2320
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
2321
|
+
errorLabel: "Instagram"
|
|
2322
|
+
});
|
|
2323
|
+
}
|
|
2324
|
+
async createContainer(imageUrl, caption) {
|
|
2325
|
+
const res = await this.postForm(`${encodeURIComponent(this.igUserId)}/media`, {
|
|
2326
|
+
image_url: imageUrl,
|
|
2327
|
+
caption
|
|
2328
|
+
});
|
|
2329
|
+
return res.id;
|
|
2330
|
+
}
|
|
2331
|
+
async accountMe() {
|
|
2332
|
+
const me = await jsonRequest(this.fetchImpl, `${this.baseUrl}/${encodeURIComponent(this.igUserId)}`, { query: { fields: "id,username", access_token: this.accessToken }, errorLabel: "Instagram" });
|
|
2333
|
+
return {
|
|
2334
|
+
id: me.id,
|
|
2335
|
+
username: me.username,
|
|
2336
|
+
url: me.username ? `https://www.instagram.com/${me.username}/` : undefined
|
|
2337
|
+
};
|
|
2338
|
+
}
|
|
2339
|
+
async postCreate(input) {
|
|
2340
|
+
let creationId = input.mediaIds?.[0];
|
|
2341
|
+
if (!creationId) {
|
|
2342
|
+
if (!input.imageUrl) {
|
|
2343
|
+
throw new ConnectorOperationNotSupported("instagram", "post.create requires an image or video (provide `imageUrl` or a `mediaIds` container)");
|
|
2344
|
+
}
|
|
2345
|
+
creationId = await this.createContainer(input.imageUrl, input.text);
|
|
2346
|
+
}
|
|
2347
|
+
const published = await this.postForm(`${encodeURIComponent(this.igUserId)}/media_publish`, { creation_id: creationId });
|
|
2348
|
+
return {
|
|
2349
|
+
id: published.id,
|
|
2350
|
+
url: `https://www.instagram.com/p/${published.id}/`
|
|
2351
|
+
};
|
|
2352
|
+
}
|
|
2353
|
+
async postDelete(_input) {
|
|
2354
|
+
throw new ConnectorOperationNotSupported("instagram", "post.delete (the Instagram Graph API cannot delete published media)");
|
|
2355
|
+
}
|
|
2356
|
+
async mediaUpload(input) {
|
|
2357
|
+
if (!input.sourceUrl) {
|
|
2358
|
+
throw new ConnectorOperationNotSupported("instagram", "media.upload requires a public `sourceUrl` (IG builds containers from a URL, not raw bytes)");
|
|
2359
|
+
}
|
|
2360
|
+
const creationId = await this.createContainer(input.sourceUrl, input.caption);
|
|
2361
|
+
return { mediaId: creationId };
|
|
2362
|
+
}
|
|
2363
|
+
async mentionsList(_input = {}) {
|
|
2364
|
+
throw new ConnectorOperationNotSupported("instagram", "mentions.list (tagged/mentioned media require the dedicated mentions edge; not modeled)");
|
|
2365
|
+
}
|
|
2366
|
+
async analyticsPost(input) {
|
|
2367
|
+
const res = await jsonRequest(this.fetchImpl, `${this.baseUrl}/${encodeURIComponent(input.id)}/insights`, {
|
|
2368
|
+
query: { metric: "impressions,reach,likes,comments,saved", access_token: this.accessToken },
|
|
2369
|
+
errorLabel: "Instagram"
|
|
2370
|
+
});
|
|
2371
|
+
const metrics = {};
|
|
2372
|
+
for (const m of res.data ?? []) {
|
|
2373
|
+
const v = m.values?.[0]?.value;
|
|
2374
|
+
if (typeof v === "number")
|
|
2375
|
+
metrics[m.name] = v;
|
|
2376
|
+
}
|
|
2377
|
+
return { metrics };
|
|
2378
|
+
}
|
|
2379
|
+
}
|
|
2380
|
+
|
|
2381
|
+
// src/social/threads.ts
|
|
2382
|
+
var DEFAULT_BASE4 = "https://graph.threads.net/v1.0";
|
|
2383
|
+
|
|
2384
|
+
class ThreadsAdapter {
|
|
2385
|
+
accessToken;
|
|
2386
|
+
userId;
|
|
2387
|
+
baseUrl;
|
|
2388
|
+
fetchImpl;
|
|
2389
|
+
cachedUsername;
|
|
2390
|
+
constructor(creds, fetchImpl) {
|
|
2391
|
+
if (!creds || !creds.accessToken) {
|
|
2392
|
+
throw new Error("threads credentials require `accessToken`");
|
|
2393
|
+
}
|
|
2394
|
+
if (!creds.userId) {
|
|
2395
|
+
throw new Error("threads credentials require `userId`");
|
|
2396
|
+
}
|
|
2397
|
+
this.accessToken = creds.accessToken;
|
|
2398
|
+
this.userId = creds.userId;
|
|
2399
|
+
this.baseUrl = (creds.baseUrl ?? DEFAULT_BASE4).replace(/\/+$/, "");
|
|
2400
|
+
this.fetchImpl = resolveFetch(fetchImpl);
|
|
2401
|
+
}
|
|
2402
|
+
static fromCredentials(creds, fetchImpl) {
|
|
2403
|
+
return new ThreadsAdapter(creds, fetchImpl);
|
|
2404
|
+
}
|
|
2405
|
+
form(fields) {
|
|
2406
|
+
const params = new URLSearchParams;
|
|
2407
|
+
params.append("access_token", this.accessToken);
|
|
2408
|
+
for (const [k, v] of Object.entries(fields)) {
|
|
2409
|
+
if (v !== undefined && v !== "")
|
|
2410
|
+
params.append(k, v);
|
|
2411
|
+
}
|
|
2412
|
+
return params.toString();
|
|
2413
|
+
}
|
|
2414
|
+
postForm(path, fields) {
|
|
2415
|
+
return jsonRequest(this.fetchImpl, `${this.baseUrl}/${path}`, {
|
|
2416
|
+
method: "POST",
|
|
2417
|
+
body: this.form(fields),
|
|
2418
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
2419
|
+
errorLabel: "Threads"
|
|
2420
|
+
});
|
|
2421
|
+
}
|
|
2422
|
+
async accountMe() {
|
|
2423
|
+
const me = await jsonRequest(this.fetchImpl, `${this.baseUrl}/${encodeURIComponent(this.userId)}`, { query: { fields: "id,username", access_token: this.accessToken }, errorLabel: "Threads" });
|
|
2424
|
+
this.cachedUsername = me.username;
|
|
2425
|
+
return {
|
|
2426
|
+
id: me.id,
|
|
2427
|
+
username: me.username,
|
|
2428
|
+
url: me.username ? `https://www.threads.net/@${me.username}` : undefined
|
|
2429
|
+
};
|
|
2430
|
+
}
|
|
2431
|
+
async postCreate(input) {
|
|
2432
|
+
let creationId = input.mediaIds?.[0];
|
|
2433
|
+
if (!creationId) {
|
|
2434
|
+
const container = await this.postForm(`${encodeURIComponent(this.userId)}/threads`, { media_type: "TEXT", text: input.text, reply_to_id: input.replyToId });
|
|
2435
|
+
creationId = container.id;
|
|
2436
|
+
}
|
|
2437
|
+
const published = await this.postForm(`${encodeURIComponent(this.userId)}/threads_publish`, { creation_id: creationId });
|
|
2438
|
+
const url = this.cachedUsername ? `https://www.threads.net/@${this.cachedUsername}/post/${published.id}` : undefined;
|
|
2439
|
+
return { id: published.id, url };
|
|
2440
|
+
}
|
|
2441
|
+
async postDelete(input) {
|
|
2442
|
+
await jsonRequest(this.fetchImpl, `${this.baseUrl}/${encodeURIComponent(input.id)}`, {
|
|
2443
|
+
method: "DELETE",
|
|
2444
|
+
query: { access_token: this.accessToken },
|
|
2445
|
+
errorLabel: "Threads"
|
|
2446
|
+
});
|
|
2447
|
+
return { id: input.id, deleted: true };
|
|
2448
|
+
}
|
|
2449
|
+
async mediaUpload(input) {
|
|
2450
|
+
let fields;
|
|
2451
|
+
if (input.sourceUrl) {
|
|
2452
|
+
fields = { media_type: "IMAGE", image_url: input.sourceUrl, text: input.text };
|
|
2453
|
+
} else if (input.videoUrl) {
|
|
2454
|
+
fields = { media_type: "VIDEO", video_url: input.videoUrl, text: input.text };
|
|
2455
|
+
} else {
|
|
2456
|
+
throw new ConnectorOperationNotSupported("threads", "media.upload requires a public `sourceUrl` (image) or `videoUrl` (video)");
|
|
2457
|
+
}
|
|
2458
|
+
const container = await this.postForm(`${encodeURIComponent(this.userId)}/threads`, fields);
|
|
2459
|
+
return { mediaId: container.id };
|
|
2460
|
+
}
|
|
2461
|
+
async mentionsList(input = {}) {
|
|
2462
|
+
let res;
|
|
2463
|
+
try {
|
|
2464
|
+
res = await jsonRequest(this.fetchImpl, `${this.baseUrl}/${encodeURIComponent(this.userId)}/mentions`, {
|
|
2465
|
+
query: {
|
|
2466
|
+
fields: "id,text,username,timestamp",
|
|
2467
|
+
limit: input.limit !== undefined ? String(input.limit) : undefined,
|
|
2468
|
+
access_token: this.accessToken
|
|
2469
|
+
},
|
|
2470
|
+
errorLabel: "Threads"
|
|
2471
|
+
});
|
|
2472
|
+
} catch {
|
|
2473
|
+
throw new ConnectorOperationNotSupported("threads", "mentions.list (the Threads mentions edge is not available for this account)");
|
|
2474
|
+
}
|
|
2475
|
+
const items = (res.data ?? []).map((m) => ({
|
|
2476
|
+
id: m.id,
|
|
2477
|
+
text: m.text ?? "",
|
|
2478
|
+
authorHandle: m.username,
|
|
2479
|
+
createdAt: m.timestamp
|
|
2480
|
+
}));
|
|
2481
|
+
return { items };
|
|
2482
|
+
}
|
|
2483
|
+
async analyticsPost(input) {
|
|
2484
|
+
const res = await jsonRequest(this.fetchImpl, `${this.baseUrl}/${encodeURIComponent(input.id)}/insights`, {
|
|
2485
|
+
query: { metric: "views,likes,replies,reposts,quotes", access_token: this.accessToken },
|
|
2486
|
+
errorLabel: "Threads"
|
|
2487
|
+
});
|
|
2488
|
+
const metrics = {};
|
|
2489
|
+
for (const m of res.data ?? []) {
|
|
2490
|
+
const v = m.values?.[0]?.value;
|
|
2491
|
+
if (typeof v === "number")
|
|
2492
|
+
metrics[m.name] = v;
|
|
2493
|
+
}
|
|
2494
|
+
return { metrics };
|
|
2495
|
+
}
|
|
2496
|
+
}
|
|
2497
|
+
|
|
2206
2498
|
// src/social/index.ts
|
|
2207
2499
|
var SUPPORTED_CONNECTORS = [
|
|
2208
2500
|
"x",
|
|
@@ -2213,7 +2505,10 @@ var SUPPORTED_CONNECTORS = [
|
|
|
2213
2505
|
"tiktok",
|
|
2214
2506
|
"youtube",
|
|
2215
2507
|
"pinterest",
|
|
2216
|
-
"googlebusinessprofile"
|
|
2508
|
+
"googlebusinessprofile",
|
|
2509
|
+
"facebook",
|
|
2510
|
+
"instagram",
|
|
2511
|
+
"threads"
|
|
2217
2512
|
];
|
|
2218
2513
|
var ALL_OPS = [
|
|
2219
2514
|
"account.me",
|
|
@@ -2232,7 +2527,10 @@ var SUPPORTED_OPERATIONS = {
|
|
|
2232
2527
|
tiktok: ["account.me", "post.create", "media.upload"],
|
|
2233
2528
|
youtube: ["account.me", "post.create", "post.delete", "media.upload", "analytics.post"],
|
|
2234
2529
|
pinterest: ["account.me", "post.create", "post.delete", "media.upload", "analytics.post"],
|
|
2235
|
-
googlebusinessprofile: ["account.me", "post.create", "post.delete", "media.upload"]
|
|
2530
|
+
googlebusinessprofile: ["account.me", "post.create", "post.delete", "media.upload"],
|
|
2531
|
+
facebook: ["account.me", "post.create", "post.delete", "media.upload", "analytics.post"],
|
|
2532
|
+
instagram: ["account.me", "post.create", "media.upload", "analytics.post"],
|
|
2533
|
+
threads: ["account.me", "post.create", "post.delete", "media.upload", "mentions.list", "analytics.post"]
|
|
2236
2534
|
};
|
|
2237
2535
|
function listSocialConnectors() {
|
|
2238
2536
|
return [...SUPPORTED_CONNECTORS];
|
|
@@ -2264,6 +2562,12 @@ function buildAdapter(connector, credentials) {
|
|
|
2264
2562
|
return PinterestAdapter.fromCredentials(credentials);
|
|
2265
2563
|
case "googlebusinessprofile":
|
|
2266
2564
|
return GoogleBusinessProfileAdapter.fromCredentials(credentials);
|
|
2565
|
+
case "facebook":
|
|
2566
|
+
return FacebookAdapter.fromCredentials(credentials);
|
|
2567
|
+
case "instagram":
|
|
2568
|
+
return InstagramAdapter.fromCredentials(credentials);
|
|
2569
|
+
case "threads":
|
|
2570
|
+
return ThreadsAdapter.fromCredentials(credentials);
|
|
2267
2571
|
default:
|
|
2268
2572
|
throw new ConnectorOperationNotSupported(connector, "*");
|
|
2269
2573
|
}
|