@hasna/connectors 1.3.37 → 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/googlebusinessprofile.d.ts +40 -0
- package/dist/.types/src/social/http.d.ts +37 -0
- package/dist/.types/src/social/instagram.d.ts +39 -0
- package/dist/.types/src/social/linkedin.d.ts +29 -0
- package/dist/.types/src/social/pinterest.d.ts +31 -0
- package/dist/.types/src/social/reddit.d.ts +31 -0
- package/dist/.types/src/social/threads.d.ts +40 -0
- package/dist/.types/src/social/tiktok.d.ts +24 -0
- package/dist/.types/src/social/types.d.ts +7 -1
- package/dist/.types/src/social/youtube.d.ts +29 -0
- package/dist/index.js +1 -1
- package/dist/social/index.js +1080 -4
- package/package.json +1 -1
- package/dashboard/dist/assets/index-ClBXkNbL.css +0 -1
- package/dashboard/dist/assets/index-DvfmyAO4.js +0 -284
|
@@ -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,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 GoogleBusinessProfileCredentials {
|
|
4
|
+
accessToken: string;
|
|
5
|
+
accountId?: string;
|
|
6
|
+
locationId?: string;
|
|
7
|
+
}
|
|
8
|
+
/** Google Business Profile `post.create` extras (accountId + locationId required). */
|
|
9
|
+
export interface GoogleBusinessProfilePostExtras {
|
|
10
|
+
accountId?: string;
|
|
11
|
+
locationId?: string;
|
|
12
|
+
/** Call-to-action, e.g. { actionType: "LEARN_MORE", url: "https://..." }. */
|
|
13
|
+
cta?: {
|
|
14
|
+
actionType: string;
|
|
15
|
+
url?: string;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** Google Business Profile `media.upload` extras. */
|
|
19
|
+
export interface GoogleBusinessProfileMediaExtras {
|
|
20
|
+
accountId?: string;
|
|
21
|
+
locationId?: string;
|
|
22
|
+
/** Public URL of the image to attach (GBP media items are created from a URL). */
|
|
23
|
+
sourceUrl?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare class GoogleBusinessProfileAdapter implements SocialAdapter {
|
|
26
|
+
private readonly accessToken;
|
|
27
|
+
private readonly defaultAccountId?;
|
|
28
|
+
private readonly defaultLocationId?;
|
|
29
|
+
private readonly fetchImpl;
|
|
30
|
+
constructor(creds: GoogleBusinessProfileCredentials, fetchImpl?: FetchLike);
|
|
31
|
+
static fromCredentials(creds: GoogleBusinessProfileCredentials, fetchImpl?: FetchLike): GoogleBusinessProfileAdapter;
|
|
32
|
+
private headers;
|
|
33
|
+
private resolveIds;
|
|
34
|
+
accountMe(): Promise<AccountMeResult>;
|
|
35
|
+
postCreate(input: PostCreateInput & GoogleBusinessProfilePostExtras): Promise<PostCreateResult>;
|
|
36
|
+
postDelete(input: PostDeleteInput): Promise<PostDeleteResult>;
|
|
37
|
+
mediaUpload(input: MediaUploadInput & GoogleBusinessProfileMediaExtras): Promise<MediaUploadResult>;
|
|
38
|
+
mentionsList(_input?: MentionsListInput): Promise<MentionsListResult>;
|
|
39
|
+
analyticsPost(_input: AnalyticsPostInput): Promise<AnalyticsPostResult>;
|
|
40
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared, bundle-safe HTTP helper for the stateless social adapters.
|
|
3
|
+
*
|
|
4
|
+
* Provides an injectable `FetchLike` (so tests can mock the network) and a small
|
|
5
|
+
* JSON request helper. Uses only `globalThis.fetch` / `URLSearchParams` / `Buffer`
|
|
6
|
+
* — NO `node:fs`, NO `child_process`, NO db/runner/storage imports.
|
|
7
|
+
*/
|
|
8
|
+
/** Injectable fetch so tests can mock the network without real I/O. */
|
|
9
|
+
export type FetchLike = (input: string, init?: {
|
|
10
|
+
method?: string;
|
|
11
|
+
headers?: Record<string, string>;
|
|
12
|
+
body?: unknown;
|
|
13
|
+
}) => Promise<{
|
|
14
|
+
ok: boolean;
|
|
15
|
+
status: number;
|
|
16
|
+
statusText?: string;
|
|
17
|
+
/** Present on real fetch Responses; some adapters (e.g. resumable uploads) read it. */
|
|
18
|
+
headers?: {
|
|
19
|
+
get(name: string): string | null;
|
|
20
|
+
};
|
|
21
|
+
text(): Promise<string>;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function resolveFetch(fetchImpl?: FetchLike): FetchLike;
|
|
24
|
+
export interface JsonRequestOptions {
|
|
25
|
+
method?: string;
|
|
26
|
+
headers?: Record<string, string>;
|
|
27
|
+
body?: unknown;
|
|
28
|
+
query?: Record<string, string | number | boolean | undefined | null>;
|
|
29
|
+
/** Override how the error message is extracted from a parsed error body. */
|
|
30
|
+
errorLabel?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Perform a JSON request and parse the response. Throws on non-2xx with a useful
|
|
34
|
+
* message. `body` is JSON-serialized for non-GET requests unless it is already a
|
|
35
|
+
* string or FormData.
|
|
36
|
+
*/
|
|
37
|
+
export declare function jsonRequest<T>(fetchImpl: FetchLike, url: string, options?: JsonRequestOptions): Promise<T>;
|
|
@@ -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,29 @@
|
|
|
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 LinkedInCredentials {
|
|
4
|
+
accessToken: string;
|
|
5
|
+
/** Author URN, e.g. "urn:li:person:abc123". Resolved from /me if omitted. */
|
|
6
|
+
authorUrn?: string;
|
|
7
|
+
baseUrl?: string;
|
|
8
|
+
}
|
|
9
|
+
/** LinkedIn `post.create` extras. */
|
|
10
|
+
export interface LinkedInPostExtras {
|
|
11
|
+
/** Visibility: PUBLIC (default) or CONNECTIONS. */
|
|
12
|
+
visibility?: "PUBLIC" | "CONNECTIONS";
|
|
13
|
+
}
|
|
14
|
+
export declare class LinkedInAdapter implements SocialAdapter {
|
|
15
|
+
private readonly accessToken;
|
|
16
|
+
private readonly baseUrl;
|
|
17
|
+
private authorUrn?;
|
|
18
|
+
private readonly fetchImpl;
|
|
19
|
+
constructor(creds: LinkedInCredentials, fetchImpl?: FetchLike);
|
|
20
|
+
static fromCredentials(creds: LinkedInCredentials, fetchImpl?: FetchLike): LinkedInAdapter;
|
|
21
|
+
private headers;
|
|
22
|
+
private resolveAuthorUrn;
|
|
23
|
+
accountMe(): Promise<AccountMeResult>;
|
|
24
|
+
postCreate(input: PostCreateInput & LinkedInPostExtras): Promise<PostCreateResult>;
|
|
25
|
+
postDelete(input: PostDeleteInput): Promise<PostDeleteResult>;
|
|
26
|
+
mediaUpload(input: MediaUploadInput): Promise<MediaUploadResult>;
|
|
27
|
+
mentionsList(_input?: MentionsListInput): Promise<MentionsListResult>;
|
|
28
|
+
analyticsPost(_input: AnalyticsPostInput): Promise<AnalyticsPostResult>;
|
|
29
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
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 PinterestCredentials {
|
|
4
|
+
accessToken: string;
|
|
5
|
+
boardId?: string;
|
|
6
|
+
}
|
|
7
|
+
/** Pinterest `post.create` extras. A pin needs an image: a mediaId or an imageUrl. */
|
|
8
|
+
export interface PinterestPostExtras {
|
|
9
|
+
/** Board to pin to (REQUIRED unless provided via credentials). */
|
|
10
|
+
boardId?: string;
|
|
11
|
+
/** Public image URL (used when no uploaded mediaId is supplied). */
|
|
12
|
+
imageUrl?: string;
|
|
13
|
+
/** Destination link for the pin. */
|
|
14
|
+
link?: string;
|
|
15
|
+
/** Pin title (defaults to undefined; `text` becomes the description). */
|
|
16
|
+
title?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class PinterestAdapter implements SocialAdapter {
|
|
19
|
+
private readonly accessToken;
|
|
20
|
+
private readonly defaultBoardId?;
|
|
21
|
+
private readonly fetchImpl;
|
|
22
|
+
constructor(creds: PinterestCredentials, fetchImpl?: FetchLike);
|
|
23
|
+
static fromCredentials(creds: PinterestCredentials, fetchImpl?: FetchLike): PinterestAdapter;
|
|
24
|
+
private headers;
|
|
25
|
+
accountMe(): Promise<AccountMeResult>;
|
|
26
|
+
postCreate(input: PostCreateInput & PinterestPostExtras): Promise<PostCreateResult>;
|
|
27
|
+
postDelete(input: PostDeleteInput): Promise<PostDeleteResult>;
|
|
28
|
+
mediaUpload(input: MediaUploadInput): Promise<MediaUploadResult>;
|
|
29
|
+
mentionsList(_input?: MentionsListInput): Promise<MentionsListResult>;
|
|
30
|
+
analyticsPost(input: AnalyticsPostInput): Promise<AnalyticsPostResult>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
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 RedditCredentials {
|
|
4
|
+
accessToken: string;
|
|
5
|
+
userAgent?: string;
|
|
6
|
+
}
|
|
7
|
+
/** Reddit `post.create` extras (title + subreddit are required). */
|
|
8
|
+
export interface RedditPostExtras {
|
|
9
|
+
title: string;
|
|
10
|
+
subreddit: string;
|
|
11
|
+
/** "self" (text post, default) or "link" (url post). */
|
|
12
|
+
kind?: "self" | "link";
|
|
13
|
+
/** URL for a `kind: "link"` post. */
|
|
14
|
+
url?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class RedditAdapter implements SocialAdapter {
|
|
17
|
+
private readonly accessToken;
|
|
18
|
+
private readonly userAgent;
|
|
19
|
+
private readonly fetchImpl;
|
|
20
|
+
constructor(creds: RedditCredentials, fetchImpl?: FetchLike);
|
|
21
|
+
static fromCredentials(creds: RedditCredentials, fetchImpl?: FetchLike): RedditAdapter;
|
|
22
|
+
private headers;
|
|
23
|
+
/** Reddit form endpoints want application/x-www-form-urlencoded. */
|
|
24
|
+
private form;
|
|
25
|
+
accountMe(): Promise<AccountMeResult>;
|
|
26
|
+
postCreate(input: PostCreateInput & Partial<RedditPostExtras>): Promise<PostCreateResult>;
|
|
27
|
+
postDelete(input: PostDeleteInput): Promise<PostDeleteResult>;
|
|
28
|
+
mediaUpload(_input: MediaUploadInput): Promise<MediaUploadResult>;
|
|
29
|
+
mentionsList(input?: MentionsListInput): Promise<MentionsListResult>;
|
|
30
|
+
analyticsPost(input: AnalyticsPostInput): Promise<AnalyticsPostResult>;
|
|
31
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
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 TikTokCredentials {
|
|
4
|
+
accessToken: string;
|
|
5
|
+
openId?: string;
|
|
6
|
+
}
|
|
7
|
+
/** TikTok `post.create` extras. */
|
|
8
|
+
export interface TikTokPostExtras {
|
|
9
|
+
/** PUBLIC_TO_EVERYONE (default), MUTUAL_FOLLOW_FRIENDS, SELF_ONLY. */
|
|
10
|
+
privacyLevel?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class TikTokAdapter implements SocialAdapter {
|
|
13
|
+
private readonly accessToken;
|
|
14
|
+
private readonly fetchImpl;
|
|
15
|
+
constructor(creds: TikTokCredentials, fetchImpl?: FetchLike);
|
|
16
|
+
static fromCredentials(creds: TikTokCredentials, fetchImpl?: FetchLike): TikTokAdapter;
|
|
17
|
+
private headers;
|
|
18
|
+
accountMe(): Promise<AccountMeResult>;
|
|
19
|
+
postCreate(input: PostCreateInput & TikTokPostExtras): Promise<PostCreateResult>;
|
|
20
|
+
postDelete(_input: PostDeleteInput): Promise<PostDeleteResult>;
|
|
21
|
+
mediaUpload(input: MediaUploadInput): Promise<MediaUploadResult>;
|
|
22
|
+
mentionsList(_input?: MentionsListInput): Promise<MentionsListResult>;
|
|
23
|
+
analyticsPost(_input: AnalyticsPostInput): Promise<AnalyticsPostResult>;
|
|
24
|
+
}
|
|
@@ -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";
|
|
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 {
|
|
@@ -19,6 +19,12 @@ export interface PostCreateInput {
|
|
|
19
19
|
text: string;
|
|
20
20
|
replyToId?: string;
|
|
21
21
|
mediaIds?: string[];
|
|
22
|
+
/**
|
|
23
|
+
* Network-specific extras (e.g. reddit `title`/`subreddit`, pinterest `boardId`,
|
|
24
|
+
* googlebusinessprofile `accountId`/`locationId`). Each adapter reads the ones it
|
|
25
|
+
* needs; see each adapter's `*PostExtras` interface.
|
|
26
|
+
*/
|
|
27
|
+
[key: string]: unknown;
|
|
22
28
|
}
|
|
23
29
|
export interface PostCreateResult {
|
|
24
30
|
id: string;
|
|
@@ -0,0 +1,29 @@
|
|
|
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 YouTubeCredentials {
|
|
4
|
+
accessToken: string;
|
|
5
|
+
refreshToken?: string;
|
|
6
|
+
clientId?: string;
|
|
7
|
+
clientSecret?: string;
|
|
8
|
+
}
|
|
9
|
+
/** YouTube `post.create` extras. */
|
|
10
|
+
export interface YouTubePostExtras {
|
|
11
|
+
title?: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
privacyStatus?: "public" | "private" | "unlisted";
|
|
14
|
+
/** Numeric category id (default "22" = People & Blogs). */
|
|
15
|
+
categoryId?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class YouTubeAdapter implements SocialAdapter {
|
|
18
|
+
private readonly accessToken;
|
|
19
|
+
private readonly fetchImpl;
|
|
20
|
+
constructor(creds: YouTubeCredentials, fetchImpl?: FetchLike);
|
|
21
|
+
static fromCredentials(creds: YouTubeCredentials, fetchImpl?: FetchLike): YouTubeAdapter;
|
|
22
|
+
private headers;
|
|
23
|
+
accountMe(): Promise<AccountMeResult>;
|
|
24
|
+
postCreate(input: PostCreateInput & YouTubePostExtras): Promise<PostCreateResult>;
|
|
25
|
+
postDelete(input: PostDeleteInput): Promise<PostDeleteResult>;
|
|
26
|
+
mediaUpload(input: MediaUploadInput & YouTubePostExtras): Promise<MediaUploadResult>;
|
|
27
|
+
mentionsList(_input?: MentionsListInput): Promise<MentionsListResult>;
|
|
28
|
+
analyticsPost(input: AnalyticsPostInput): Promise<AnalyticsPostResult>;
|
|
29
|
+
}
|
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: {
|