Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,33 @@
{
"extends": [
"../../../../.eslintrc.base.json"
],
"ignorePatterns": [
"!**/*"
],
"overrides": [
{
"files": [
"*.ts",
"*.tsx",
"*.js",
"*.jsx"
],
"rules": {}
},
{
"files": [
"*.ts",
"*.tsx"
],
"rules": {}
},
{
"files": [
"*.js",
"*.jsx"
],
"rules": {}
}
]
}

View File

@@ -0,0 +1,7 @@
# pieces-nuelink
This library was generated with [Nx](https://nx.dev).
## Building
Run `nx build pieces-nuelink` to build the library.

View File

@@ -0,0 +1,4 @@
{
"name": "@activepieces/piece-nuelink",
"version": "0.0.2"
}

View File

@@ -0,0 +1,65 @@
{
"name": "pieces-nuelink",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/nuelink/src",
"projectType": "library",
"release": {
"version": {
"currentVersionResolver": "git-tag",
"preserveLocalDependencyProtocols": false,
"manifestRootsToUpdate": [
"dist/{projectRoot}"
]
}
},
"tags": [],
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/nuelink",
"tsConfig": "packages/pieces/community/nuelink/tsconfig.lib.json",
"packageJson": "packages/pieces/community/nuelink/package.json",
"main": "packages/pieces/community/nuelink/src/index.ts",
"assets": [
"packages/pieces/community/nuelink/*.md",
{
"input": "packages/pieces/community/nuelink/src/i18n",
"output": "./src/i18n",
"glob": "**/!(i18n.json)"
}
],
"buildableProjectDepsInPackageJsonType": "dependencies",
"updateBuildableProjectDepsInPackageJson": true
},
"dependsOn": [
"^build",
"prebuild"
]
},
"nx-release-publish": {
"options": {
"packageRoot": "dist/{projectRoot}"
}
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": [
"{options.outputFile}"
]
},
"prebuild": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/pieces/community/nuelink",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
}
}

View File

@@ -0,0 +1,17 @@
{
"Please use **Nuelink API Key**.": "Bitte verwenden Sie den **Nuelink API Schlüssel**.",
"Create Post": "Beitrag erstellen",
"Creates a post on nuelink.": "Erstellt einen Beitrag auf nuelink.",
"Caption": "Überschrift",
"Media": "Medien",
"Title": "Titel",
"Alt Text": "Alt Text",
"Share Instagram Reel to Feed": "Instagram-Rollen mit Feed teilen",
"Treat videos as short-form vertical videos": "Videos als kurzformige vertikale Videos behandeln",
"The your post caption here": "Die Beschriftung deines Beitrags hier",
"Enter the media URL here": "Geben Sie hier die Medienadresse ein",
"Enter a title to use for your Reels, videos and/or Pinterest posts.": "Geben Sie einen Titel für Ihre Rollen, Videos und/oder Pinterest Beiträge ein.",
"Enter an alt text for your image or video.": "Geben Sie einen Alt-Text für Ihr Bild oder Video ein.",
"Share your Instagram Reel to your feed as well.": "Teile deine Instagram Rolle auch mit deinem Feed.",
"We will treat the videos imported as short-form vertical videos (Reels, Shorts, Tiktoks etc...).": "Wir behandeln die importierten Videos als kurzformige vertikale Videos (Rollen, Shorts, Tiktoks usw.)."
}

View File

@@ -0,0 +1,17 @@
{
"Please use **Nuelink API Key**.": "Por favor usa **Nuelink API Key**.",
"Create Post": "Crear publicación",
"Creates a post on nuelink.": "Crea una publicación en nuelink.",
"Caption": "Leyenda",
"Media": "Medios",
"Title": "Título",
"Alt Text": "Texto Alt",
"Share Instagram Reel to Feed": "Compartir Instagram Reel para alimentar",
"Treat videos as short-form vertical videos": "Tratar videos como videos verticales de forma corta",
"The your post caption here": "El título de tu post aquí",
"Enter the media URL here": "Introduzca la URL de medios aquí",
"Enter a title to use for your Reels, videos and/or Pinterest posts.": "Introduzca un título para usar en Reels, vídeos y/o publicaciones de Pinterest.",
"Enter an alt text for your image or video.": "Introduzca un texto alternativo para su imagen o vídeo.",
"Share your Instagram Reel to your feed as well.": "Comparte tu Instagram Reel en tu feed también.",
"We will treat the videos imported as short-form vertical videos (Reels, Shorts, Tiktoks etc...).": "Trataremos los videos importados como videos verticales de forma corta (Reels, Shorts, Tiktoks, etc...)."
}

View File

@@ -0,0 +1,17 @@
{
"Please use **Nuelink API Key**.": "Veuillez utiliser la **Clé API Nuelink**.",
"Create Post": "Créer un message",
"Creates a post on nuelink.": "Crée un message sur nuelink.",
"Caption": "Légende",
"Media": "Médias",
"Title": "Titre de la feuille de calcul",
"Alt Text": "Texte Alt",
"Share Instagram Reel to Feed": "Partager Instagram Reel sur Flux",
"Treat videos as short-form vertical videos": "Traiter les vidéos comme des vidéos verticales courtes",
"The your post caption here": "La légende de votre message ici",
"Enter the media URL here": "Entrez l'URL du média ici",
"Enter a title to use for your Reels, videos and/or Pinterest posts.": "Entrez un titre à utiliser pour vos rouleaux, vos vidéos et/ou vos messages Pinterest.",
"Enter an alt text for your image or video.": "Entrez un texte alt pour votre image ou vidéo.",
"Share your Instagram Reel to your feed as well.": "Partagez également votre rouleau Instagram dans votre flux.",
"We will treat the videos imported as short-form vertical videos (Reels, Shorts, Tiktoks etc...).": "Nous traiterons les vidéos importées comme des vidéos verticales courtes (rouleaux, courts, Tiktoks etc...)."
}

View File

@@ -0,0 +1,17 @@
{
"Please use **Nuelink API Key**.": "**Nuelink API Key**を使用してください。",
"Create Post": "投稿を作成",
"Creates a post on nuelink.": "Nuelinkに投稿を作成します。",
"Caption": "図表番号",
"Media": "メディア",
"Title": "タイトル",
"Alt Text": "代替テキスト",
"Share Instagram Reel to Feed": "Instagramのリールを共有してフィードする",
"Treat videos as short-form vertical videos": "動画を縦長の短い動画として扱います",
"The your post caption here": "ここにあなたの投稿の説明",
"Enter the media URL here": "メディア URL をここに入力してください",
"Enter a title to use for your Reels, videos and/or Pinterest posts.": "リール、動画、Pinterest の投稿に使用するタイトルを入力します。",
"Enter an alt text for your image or video.": "画像または動画の代替テキストを入力します。",
"Share your Instagram Reel to your feed as well.": "あなたのInstagramのリールもフィードに共有してください。",
"We will treat the videos imported as short-form vertical videos (Reels, Shorts, Tiktoks etc...).": "インポートされた動画を縦長の動画(リール、ショートパンツ、ティクトークなど)として扱います。"
}

View File

@@ -0,0 +1,17 @@
{
"Please use **Nuelink API Key**.": "Gebruik **Nuelink API Key**.",
"Create Post": "Post aanmaken",
"Creates a post on nuelink.": "Maakt een bericht op nuelink.",
"Caption": "Onderschrift",
"Media": "Medium",
"Title": "Aanspreektitel",
"Alt Text": "Alternatieve tekst",
"Share Instagram Reel to Feed": "Deel Instagram Reel om te Feed",
"Treat videos as short-form vertical videos": "Video's behandelen als verticale kortingsvorm video's",
"The your post caption here": "Het bijschrift van je post hier",
"Enter the media URL here": "Voer de media-URL hier in",
"Enter a title to use for your Reels, videos and/or Pinterest posts.": "Voer een titel in om te gebruiken voor uw Reels, video's en/of Pinterest berichten.",
"Enter an alt text for your image or video.": "Voer een Alt-tekst in voor uw afbeelding of video.",
"Share your Instagram Reel to your feed as well.": "Deel ook uw Instagram Rel met uw feed",
"We will treat the videos imported as short-form vertical videos (Reels, Shorts, Tiktoks etc...).": "We behandelen de geïmporteerde video's als verticale video's (Reels, Kortingen, Tiktoks etc...)."
}

View File

@@ -0,0 +1,17 @@
{
"Please use **Nuelink API Key**.": "Por favor use **Chave de API Nuelin**.",
"Create Post": "Criar publicação",
"Creates a post on nuelink.": "Cria uma postagem na nuelink.",
"Caption": "Legenda",
"Media": "Multimídia",
"Title": "Título",
"Alt Text": "Texto Alternativo",
"Share Instagram Reel to Feed": "Compartilhar Instagram Reel para Feed",
"Treat videos as short-form vertical videos": "Tratar vídeos como vídeos verticais curtos",
"The your post caption here": "Aqui a legenda da sua postagem",
"Enter the media URL here": "Digite a URL de mídia aqui",
"Enter a title to use for your Reels, videos and/or Pinterest posts.": "Digite um título para usar em suas Reels, vídeos e/ou publicações do Pinterest.",
"Enter an alt text for your image or video.": "Digite um texto alternativo para sua imagem ou vídeo.",
"Share your Instagram Reel to your feed as well.": "Compartilhe seu Instagram Reel ao seu feed também.",
"We will treat the videos imported as short-form vertical videos (Reels, Shorts, Tiktoks etc...).": "Trataremos os vídeos importados como vídeos verticais curtos (Reels, Shorts, Tiktoks etc...)."
}

View File

@@ -0,0 +1,17 @@
{
"Please use **Nuelink API Key**.": "Please use **Nuelink API Key**.",
"Create Post": "Create Post",
"Creates a post on nuelink.": "Creates a post on nuelink.",
"Caption": "Caption",
"Media": "Media",
"Title": "Title",
"Alt Text": "Alt Text",
"Share Instagram Reel to Feed": "Share Instagram Reel to Feed",
"Treat videos as short-form vertical videos": "Treat videos as short-form vertical videos",
"The your post caption here": "The your post caption here",
"Enter the media URL here": "Enter the media URL here",
"Enter a title to use for your Reels, videos and/or Pinterest posts.": "Enter a title to use for your Reels, videos and/or Pinterest posts.",
"Enter an alt text for your image or video.": "Enter an alt text for your image or video.",
"Share your Instagram Reel to your feed as well.": "Share your Instagram Reel to your feed as well.",
"We will treat the videos imported as short-form vertical videos (Reels, Shorts, Tiktoks etc...).": "We will treat the videos imported as short-form vertical videos (Reels, Shorts, Tiktoks etc...)."
}

View File

@@ -0,0 +1,17 @@
{
"Please use **Nuelink API Key**.": "Please use **Nuelink API Key**.",
"Create Post": "Create Post",
"Creates a post on nuelink.": "Creates a post on nuelink.",
"Caption": "Caption",
"Media": "Media",
"Title": "标题",
"Alt Text": "Alt Text",
"Share Instagram Reel to Feed": "Share Instagram Reel to Feed",
"Treat videos as short-form vertical videos": "Treat videos as short-form vertical videos",
"The your post caption here": "The your post caption here",
"Enter the media URL here": "Enter the media URL here",
"Enter a title to use for your Reels, videos and/or Pinterest posts.": "Enter a title to use for your Reels, videos and/or Pinterest posts.",
"Enter an alt text for your image or video.": "Enter an alt text for your image or video.",
"Share your Instagram Reel to your feed as well.": "Share your Instagram Reel to your feed as well.",
"We will treat the videos imported as short-form vertical videos (Reels, Shorts, Tiktoks etc...).": "We will treat the videos imported as short-form vertical videos (Reels, Shorts, Tiktoks etc...)."
}

View File

@@ -0,0 +1,21 @@
import { createPiece, PieceAuth } from "@activepieces/pieces-framework";
import { createPost } from "./lib/actions/create-post";
import { PieceCategory } from "@activepieces/shared";
export const nuelinkAuth = PieceAuth.SecretText({
displayName: 'API Key',
required: true,
description: 'Please use **Nuelink API Key**.',
});
export const nuelink = createPiece({
displayName: "Nuelink",
auth: nuelinkAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: "https://cdn.activepieces.com/pieces/nuelink.png",
categories:[PieceCategory.CONTENT_AND_FILES,PieceCategory.MARKETING],
authors: ['AouladLahceneOussama'],
actions: [createPost],
triggers: [],
});

View File

@@ -0,0 +1,65 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { nuelinkAuth } from '../..';
export const createPost = createAction({
// auth: check https://www.activepieces.com/docs/developers/piece-reference/authentication,
name: 'createPost',
auth: nuelinkAuth,
displayName: 'Create Post',
description: 'Creates a post on nuelink.',
props: {
body: Property.LongText({
displayName: 'Caption',
required: true,
description: 'The your post caption here',
}),
media: Property.LongText({
displayName: 'Media',
required: false,
description: 'Enter the media URL here',
}),
title: Property.LongText({
displayName: 'Title',
required: false,
description: 'Enter a title to use for your Reels, videos and/or Pinterest posts.',
}),
altText: Property.LongText({
displayName: 'Alt Text',
required: false,
description: 'Enter an alt text for your image or video.',
}),
shareToFeed: Property.Checkbox({
displayName: 'Share Instagram Reel to Feed',
required: false,
description: 'Share your Instagram Reel to your feed as well.',
defaultValue: false,
}),
postAsShort: Property.Checkbox({
displayName: 'Treat videos as short-form vertical videos',
required: false,
description: 'We will treat the videos imported as short-form vertical videos (Reels, Shorts, Tiktoks etc...).',
defaultValue: false,
}),
},
async run(context) {
const res = await httpClient.sendRequest<string[]>({
method: HttpMethod.POST,
url: 'https://nuelink.com/api/v1/pabbly',
headers: {
Authorization: `Bearer ${context.auth.secret_text}`,
},
body: {
body: context.propsValue.body,
media: context.propsValue.media,
title: context.propsValue.title,
altText: context.propsValue.altText,
shareToFeed: context.propsValue.shareToFeed,
postAsShort: context.propsValue.postAsShort
},
});
return res.body;
},
});

View File

@@ -0,0 +1,19 @@
{
"extends": "../../../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"noPropertyAccessFromIndexSignature": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
}
]
}

View File

@@ -0,0 +1,11 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"outDir": "../../../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"],
"include": ["src/**/*.ts"]
}