@builderbot/cli 1.3.15-alpha.9 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/configuration/index.d.ts +11 -0
  2. package/dist/configuration/index.d.ts.map +1 -1
  3. package/dist/index.cjs +29 -0
  4. package/dist/interactive/index.d.ts.map +1 -1
  5. package/dist/starters/apps/base-js-gohighlevel-json/.dockerignore +16 -0
  6. package/dist/starters/apps/base-js-gohighlevel-json/Dockerfile +40 -0
  7. package/dist/starters/apps/base-js-gohighlevel-json/README.md +44 -0
  8. package/dist/starters/apps/base-js-gohighlevel-json/_gitignore +10 -0
  9. package/dist/starters/apps/base-js-gohighlevel-json/assets/sample.png +0 -0
  10. package/dist/starters/apps/base-js-gohighlevel-json/eslint.config.js +23 -0
  11. package/dist/starters/apps/base-js-gohighlevel-json/nodemon.json +9 -0
  12. package/dist/starters/apps/base-js-gohighlevel-json/package.json +25 -0
  13. package/dist/starters/apps/base-js-gohighlevel-json/src/app.js +130 -0
  14. package/dist/starters/apps/base-js-gohighlevel-memory/.dockerignore +16 -0
  15. package/dist/starters/apps/base-js-gohighlevel-memory/Dockerfile +40 -0
  16. package/dist/starters/apps/base-js-gohighlevel-memory/README.md +44 -0
  17. package/dist/starters/apps/base-js-gohighlevel-memory/_gitignore +10 -0
  18. package/dist/starters/apps/base-js-gohighlevel-memory/assets/sample.png +0 -0
  19. package/dist/starters/apps/base-js-gohighlevel-memory/eslint.config.js +23 -0
  20. package/dist/starters/apps/base-js-gohighlevel-memory/nodemon.json +9 -0
  21. package/dist/starters/apps/base-js-gohighlevel-memory/package.json +24 -0
  22. package/dist/starters/apps/base-js-gohighlevel-memory/src/app.js +129 -0
  23. package/dist/starters/apps/base-js-gohighlevel-mongo/.dockerignore +16 -0
  24. package/dist/starters/apps/base-js-gohighlevel-mongo/Dockerfile +40 -0
  25. package/dist/starters/apps/base-js-gohighlevel-mongo/README.md +44 -0
  26. package/dist/starters/apps/base-js-gohighlevel-mongo/_gitignore +10 -0
  27. package/dist/starters/apps/base-js-gohighlevel-mongo/assets/sample.png +0 -0
  28. package/dist/starters/apps/base-js-gohighlevel-mongo/eslint.config.js +23 -0
  29. package/dist/starters/apps/base-js-gohighlevel-mongo/nodemon.json +9 -0
  30. package/dist/starters/apps/base-js-gohighlevel-mongo/package.json +25 -0
  31. package/dist/starters/apps/base-js-gohighlevel-mongo/src/app.js +132 -0
  32. package/dist/starters/apps/base-js-gohighlevel-mysql/.dockerignore +16 -0
  33. package/dist/starters/apps/base-js-gohighlevel-mysql/Dockerfile +40 -0
  34. package/dist/starters/apps/base-js-gohighlevel-mysql/README.md +44 -0
  35. package/dist/starters/apps/base-js-gohighlevel-mysql/_gitignore +10 -0
  36. package/dist/starters/apps/base-js-gohighlevel-mysql/assets/sample.png +0 -0
  37. package/dist/starters/apps/base-js-gohighlevel-mysql/eslint.config.js +23 -0
  38. package/dist/starters/apps/base-js-gohighlevel-mysql/nodemon.json +9 -0
  39. package/dist/starters/apps/base-js-gohighlevel-mysql/package.json +25 -0
  40. package/dist/starters/apps/base-js-gohighlevel-mysql/src/app.js +134 -0
  41. package/dist/starters/apps/base-js-gohighlevel-postgres/.dockerignore +16 -0
  42. package/dist/starters/apps/base-js-gohighlevel-postgres/Dockerfile +40 -0
  43. package/dist/starters/apps/base-js-gohighlevel-postgres/README.md +44 -0
  44. package/dist/starters/apps/base-js-gohighlevel-postgres/_gitignore +10 -0
  45. package/dist/starters/apps/base-js-gohighlevel-postgres/assets/sample.png +0 -0
  46. package/dist/starters/apps/base-js-gohighlevel-postgres/eslint.config.js +23 -0
  47. package/dist/starters/apps/base-js-gohighlevel-postgres/nodemon.json +9 -0
  48. package/dist/starters/apps/base-js-gohighlevel-postgres/package.json +25 -0
  49. package/dist/starters/apps/base-js-gohighlevel-postgres/src/app.js +135 -0
  50. package/dist/starters/apps/base-ts-gohighlevel-json/.dockerignore +16 -0
  51. package/dist/starters/apps/base-ts-gohighlevel-json/Dockerfile +40 -0
  52. package/dist/starters/apps/base-ts-gohighlevel-json/README.md +44 -0
  53. package/dist/starters/apps/base-ts-gohighlevel-json/_gitignore +10 -0
  54. package/dist/starters/apps/base-ts-gohighlevel-json/assets/sample.png +0 -0
  55. package/dist/starters/apps/base-ts-gohighlevel-json/eslint.config.js +25 -0
  56. package/dist/starters/apps/base-ts-gohighlevel-json/nodemon.json +12 -0
  57. package/dist/starters/apps/base-ts-gohighlevel-json/package.json +32 -0
  58. package/dist/starters/apps/base-ts-gohighlevel-json/rollup.config.js +13 -0
  59. package/dist/starters/apps/base-ts-gohighlevel-json/src/app.ts +130 -0
  60. package/dist/starters/apps/base-ts-gohighlevel-json/tsconfig.json +34 -0
  61. package/dist/starters/apps/base-ts-gohighlevel-memory/.dockerignore +16 -0
  62. package/dist/starters/apps/base-ts-gohighlevel-memory/Dockerfile +40 -0
  63. package/dist/starters/apps/base-ts-gohighlevel-memory/README.md +44 -0
  64. package/dist/starters/apps/base-ts-gohighlevel-memory/_gitignore +10 -0
  65. package/dist/starters/apps/base-ts-gohighlevel-memory/assets/sample.png +0 -0
  66. package/dist/starters/apps/base-ts-gohighlevel-memory/eslint.config.js +25 -0
  67. package/dist/starters/apps/base-ts-gohighlevel-memory/nodemon.json +12 -0
  68. package/dist/starters/apps/base-ts-gohighlevel-memory/package.json +31 -0
  69. package/dist/starters/apps/base-ts-gohighlevel-memory/rollup.config.js +13 -0
  70. package/dist/starters/apps/base-ts-gohighlevel-memory/src/app.ts +129 -0
  71. package/dist/starters/apps/base-ts-gohighlevel-memory/tsconfig.json +34 -0
  72. package/dist/starters/apps/base-ts-gohighlevel-mongo/.dockerignore +16 -0
  73. package/dist/starters/apps/base-ts-gohighlevel-mongo/Dockerfile +40 -0
  74. package/dist/starters/apps/base-ts-gohighlevel-mongo/README.md +44 -0
  75. package/dist/starters/apps/base-ts-gohighlevel-mongo/_gitignore +10 -0
  76. package/dist/starters/apps/base-ts-gohighlevel-mongo/assets/sample.png +0 -0
  77. package/dist/starters/apps/base-ts-gohighlevel-mongo/eslint.config.js +25 -0
  78. package/dist/starters/apps/base-ts-gohighlevel-mongo/nodemon.json +12 -0
  79. package/dist/starters/apps/base-ts-gohighlevel-mongo/package.json +32 -0
  80. package/dist/starters/apps/base-ts-gohighlevel-mongo/rollup.config.js +13 -0
  81. package/dist/starters/apps/base-ts-gohighlevel-mongo/src/app.ts +132 -0
  82. package/dist/starters/apps/base-ts-gohighlevel-mongo/tsconfig.json +34 -0
  83. package/dist/starters/apps/base-ts-gohighlevel-mysql/.dockerignore +16 -0
  84. package/dist/starters/apps/base-ts-gohighlevel-mysql/Dockerfile +40 -0
  85. package/dist/starters/apps/base-ts-gohighlevel-mysql/README.md +44 -0
  86. package/dist/starters/apps/base-ts-gohighlevel-mysql/_gitignore +10 -0
  87. package/dist/starters/apps/base-ts-gohighlevel-mysql/assets/sample.png +0 -0
  88. package/dist/starters/apps/base-ts-gohighlevel-mysql/eslint.config.js +25 -0
  89. package/dist/starters/apps/base-ts-gohighlevel-mysql/nodemon.json +12 -0
  90. package/dist/starters/apps/base-ts-gohighlevel-mysql/package.json +32 -0
  91. package/dist/starters/apps/base-ts-gohighlevel-mysql/rollup.config.js +13 -0
  92. package/dist/starters/apps/base-ts-gohighlevel-mysql/src/app.ts +134 -0
  93. package/dist/starters/apps/base-ts-gohighlevel-mysql/tsconfig.json +34 -0
  94. package/dist/starters/apps/base-ts-gohighlevel-postgres/.dockerignore +16 -0
  95. package/dist/starters/apps/base-ts-gohighlevel-postgres/Dockerfile +40 -0
  96. package/dist/starters/apps/base-ts-gohighlevel-postgres/README.md +44 -0
  97. package/dist/starters/apps/base-ts-gohighlevel-postgres/_gitignore +10 -0
  98. package/dist/starters/apps/base-ts-gohighlevel-postgres/assets/sample.png +0 -0
  99. package/dist/starters/apps/base-ts-gohighlevel-postgres/eslint.config.js +25 -0
  100. package/dist/starters/apps/base-ts-gohighlevel-postgres/nodemon.json +12 -0
  101. package/dist/starters/apps/base-ts-gohighlevel-postgres/package.json +32 -0
  102. package/dist/starters/apps/base-ts-gohighlevel-postgres/rollup.config.js +13 -0
  103. package/dist/starters/apps/base-ts-gohighlevel-postgres/src/app.ts +135 -0
  104. package/dist/starters/apps/base-ts-gohighlevel-postgres/tsconfig.json +34 -0
  105. package/dist/starters/apps/base-ts-gupshup-memory/.dockerignore +16 -0
  106. package/dist/starters/apps/base-ts-gupshup-memory/Dockerfile +40 -0
  107. package/dist/starters/apps/base-ts-gupshup-memory/README.md +44 -0
  108. package/dist/starters/apps/base-ts-gupshup-memory/_gitignore +10 -0
  109. package/dist/starters/apps/base-ts-gupshup-memory/assets/sample.png +0 -0
  110. package/dist/starters/apps/base-ts-gupshup-memory/eslint.config.js +25 -0
  111. package/dist/starters/apps/base-ts-gupshup-memory/nodemon.json +12 -0
  112. package/dist/starters/apps/base-ts-gupshup-memory/package.json +31 -0
  113. package/dist/starters/apps/base-ts-gupshup-memory/rollup.config.js +13 -0
  114. package/dist/starters/apps/base-ts-gupshup-memory/src/app.ts +127 -0
  115. package/dist/starters/apps/base-ts-gupshup-memory/tsconfig.json +34 -0
  116. package/package.json +2 -2
@@ -12,7 +12,18 @@ export interface ValueLabel {
12
12
  value: string;
13
13
  label: string;
14
14
  }
15
+ export interface TemplateCombination {
16
+ provider: string;
17
+ language: string;
18
+ database: string;
19
+ }
20
+ export interface TemplateValidationResult {
21
+ pass: boolean;
22
+ message: string;
23
+ }
15
24
  export declare const PROVIDER_LIST: Provider[];
16
25
  export declare const PROVIDER_DATA: ValueLabel[];
26
+ export type ProviderData = ValueLabel;
17
27
  export declare const AVAILABLE_LANGUAGES: ValueLabel[];
28
+ export declare const validateTemplateCombination: ({ provider, language, database, }: TemplateCombination) => TemplateValidationResult;
18
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/configuration/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,MAAM,QAAQ,GAAG,gBAAgB,GAAG,mBAAmB,CAAA;AAE7D,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,aAAa,EAAE,QAAQ,EAYnC,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,UAAU,EAMrC,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,UAAU,EAG3C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/configuration/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,MAAM,QAAQ,GAAG,gBAAgB,GAAG,mBAAmB,CAAA;AAE7D,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,wBAAwB;IACrC,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,aAAa,EAAE,QAAQ,EAcnC,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,UAAU,EAMrC,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAA;AAErC,eAAO,MAAM,mBAAmB,EAAE,UAAU,EAG3C,CAAA;AAMD,eAAO,MAAM,2BAA2B,GAAI,mCAIzC,mBAAmB,KAAG,wBAqBxB,CAAA"}
package/dist/index.cjs CHANGED
@@ -287,6 +287,8 @@ const PROVIDER_LIST = [
287
287
  { value: 'meta', label: 'Meta' },
288
288
  { value: 'facebook-messenger', label: 'Facebook Messenger' },
289
289
  { value: 'instagram', label: 'Instagram' },
290
+ { value: 'gupshup', label: 'Gupshup' },
291
+ { value: 'gohighlevel', label: 'GoHighLevel' },
290
292
  { value: 'email', label: 'Email', hint: 'IMAP/SMTP' },
291
293
  ];
292
294
  const PROVIDER_DATA = [
@@ -300,6 +302,23 @@ const AVAILABLE_LANGUAGES = [
300
302
  { value: 'ts', label: 'TypeScript' },
301
303
  { value: 'js', label: 'JavaScript' },
302
304
  ];
305
+ const GUPSHUP_SUPPORTED_TEMPLATE_COMBINATIONS = [
306
+ { provider: 'gupshup', language: 'ts', database: 'memory' },
307
+ ];
308
+ const validateTemplateCombination = ({ provider, language, database, }) => {
309
+ if (provider !== 'gupshup') {
310
+ return { pass: true, message: '' };
311
+ }
312
+ const pass = GUPSHUP_SUPPORTED_TEMPLATE_COMBINATIONS.some((combo) => combo.provider === provider && combo.language === language && combo.database === database);
313
+ if (pass) {
314
+ return { pass, message: '' };
315
+ }
316
+ const supportedCombinations = GUPSHUP_SUPPORTED_TEMPLATE_COMBINATIONS.map((combo) => `--provider=${combo.provider} --language=${combo.language} --database=${combo.database}`).join('\n');
317
+ return {
318
+ pass,
319
+ message: `Unsupported template combination for provider ${provider}.\nSupported combinations:\n${supportedCombinations}`,
320
+ };
321
+ };
303
322
 
304
323
  var fs = {};
305
324
 
@@ -9518,6 +9537,14 @@ const createApp = async (templateName) => {
9518
9537
  await promises.rename(require$$1.join(pathTemplate, '_gitignore'), require$$1.join(pathTemplate, '.gitignore'));
9519
9538
  return pathTemplate;
9520
9539
  };
9540
+ const validateTemplateSupportOrExit = (provider, language, database) => {
9541
+ const validation = validateTemplateCombination({ provider, language, database });
9542
+ if (validation.pass) {
9543
+ return;
9544
+ }
9545
+ xe(validation.message);
9546
+ process.exit(0);
9547
+ };
9521
9548
  const startInteractive = async (version) => {
9522
9549
  try {
9523
9550
  const stepContinue = await ye({
@@ -9555,6 +9582,7 @@ const startInteractive = async (version) => {
9555
9582
  xe('Operation canceled');
9556
9583
  return process.exit(0);
9557
9584
  }
9585
+ validateTemplateSupportOrExit(stepProvider, stepLanguage, stepDatabase);
9558
9586
  await createBot({
9559
9587
  stepLanguage: stepLanguage,
9560
9588
  stepProvider: stepProvider,
@@ -9630,6 +9658,7 @@ function validateArgs(args) {
9630
9658
  xe(`Invalid language: ${args['language']}`);
9631
9659
  process.exit(0);
9632
9660
  }
9661
+ validateTemplateSupportOrExit(args['provider'], args['language'], args['database']);
9633
9662
  }
9634
9663
  const logError = async (e) => {
9635
9664
  console.log(e);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interactive/index.ts"],"names":[],"mappings":"AAgQA,QAAA,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAanC,CAAA;AAED,OAAO,EAAE,KAAK,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interactive/index.ts"],"names":[],"mappings":"AA8QA,QAAA,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAanC,CAAA;AAED,OAAO,EAAE,KAAK,EAAE,CAAA"}
@@ -0,0 +1,16 @@
1
+ dist/*
2
+ node_modules
3
+ .env
4
+
5
+ *_sessions
6
+ *tokens
7
+ .wwebjs*
8
+
9
+ .git
10
+ .gitignore
11
+ Dockerfile*
12
+ npm-debug.log*
13
+ pnpm-debug.log*
14
+ tests
15
+ docs
16
+ *.md
@@ -0,0 +1,40 @@
1
+ # Image size ~ 400MB
2
+ FROM node:21-alpine3.18 as builder
3
+
4
+ WORKDIR /app
5
+
6
+ RUN corepack enable && corepack prepare pnpm@latest --activate
7
+ ENV PNPM_HOME=/usr/local/bin
8
+
9
+ COPY . .
10
+
11
+ COPY package*.json *-lock.yaml ./
12
+
13
+ RUN apk add --no-cache --virtual .gyp \
14
+ python3 \
15
+ make \
16
+ g++ \
17
+ && apk add --no-cache git \
18
+ && pnpm install \
19
+ && apk del .gyp
20
+
21
+ FROM node:21-alpine3.18 as deploy
22
+
23
+ WORKDIR /app
24
+
25
+ ARG PORT
26
+ ENV PORT $PORT
27
+ EXPOSE $PORT
28
+
29
+ COPY --from=builder /app/assets ./assets
30
+ COPY --from=builder /app/dist ./dist
31
+ COPY --from=builder /app/*.json /app/*-lock.yaml ./
32
+
33
+ RUN corepack enable && corepack prepare pnpm@latest --activate
34
+ ENV PNPM_HOME=/usr/local/bin
35
+
36
+ RUN npm cache clean --force && pnpm install --production --ignore-scripts \
37
+ && addgroup -g 1001 -S nodejs && adduser -S -u 1001 nodejs \
38
+ && rm -rf $PNPM_HOME/.npm $PNPM_HOME/.node-gyp
39
+
40
+ CMD ["npm", "start"]
@@ -0,0 +1,44 @@
1
+ <p align="center">
2
+ <a href="https://builderbot.app/">
3
+ <picture>
4
+ <img src="https://builderbot.app/assets/thumbnail-vector.png" height="80">
5
+ </picture>
6
+ <h2 align="center">BuilderBot</h2>
7
+ </a>
8
+ </p>
9
+
10
+
11
+
12
+ <p align="center">
13
+ <a aria-label="NPM version" href="https://www.npmjs.com/package/@builderbot/bot">
14
+ <img alt="" src="https://img.shields.io/npm/v/@builderbot/bot?color=%2300c200&label=%40bot-whatsapp">
15
+ </a>
16
+ <a aria-label="Join the community on GitHub" href="https://link.codigoencasa.com/DISCORD">
17
+ <img alt="" src="https://img.shields.io/discord/915193197645402142?logo=discord">
18
+ </a>
19
+ </p>
20
+
21
+
22
+ ## Getting Started
23
+
24
+ With this library, you can build automated conversation flows agnostic to the WhatsApp provider, set up automated responses for frequently asked questions, receive and respond to messages automatically, and track interactions with customers. Additionally, you can easily set up triggers to expand functionalities limitlessly.
25
+
26
+ ```
27
+ npm create builderbot@latest
28
+ ```
29
+
30
+
31
+ ## Documentation
32
+
33
+ Visit [builderbot](https://builderbot.app/) to view the full documentation.
34
+
35
+
36
+ ## Official Course
37
+
38
+ If you want to discover all the functions and features offered by the library you can take the course.
39
+ [View Course](https://app.codigoencasa.com/courses/builderbot?refCode=LEIFER)
40
+
41
+
42
+ ## Contact Us
43
+ - [💻 Discord](https://link.codigoencasa.com/DISCORD)
44
+ - [👌 𝕏 (Twitter)](https://twitter.com/leifermendez)
@@ -0,0 +1,10 @@
1
+ dist/*
2
+ node_modules
3
+ .env
4
+
5
+ *_sessions
6
+ *tokens
7
+ .wwebjs*
8
+
9
+ *.log
10
+ *qr.png
@@ -0,0 +1,23 @@
1
+ import builderbot from 'eslint-plugin-builderbot'
2
+
3
+ export default [
4
+ {
5
+ ignores: ['dist/**', 'node_modules/**', 'rollup.config.js'],
6
+ },
7
+ {
8
+ plugins: {
9
+ builderbot,
10
+ },
11
+ languageOptions: {
12
+ ecmaVersion: 'latest',
13
+ sourceType: 'module',
14
+ },
15
+ rules: {
16
+ ...builderbot.configs.recommended.rules,
17
+ '@typescript-eslint/no-explicit-any': 'off',
18
+ '@typescript-eslint/no-unused-vars': 'off',
19
+ '@typescript-eslint/ban-ts-comment': 'off',
20
+ 'no-unsafe-optional-chaining': 'off',
21
+ },
22
+ },
23
+ ]
@@ -0,0 +1,9 @@
1
+ {
2
+ "watch": ["src"],
3
+ "ext": "js",
4
+ "ignore": [
5
+ "**/*.test.js",
6
+ "**/*.spec.js"
7
+ ],
8
+ "delay": "3"
9
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "base-bailey-json",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "src/app.js",
6
+ "type": "module",
7
+ "scripts": {
8
+ "lint": "eslint . --no-ignore",
9
+ "dev": "npm run lint && nodemon --signal SIGKILL ./src/app.js",
10
+ "start": "node ./src/app.js"
11
+ },
12
+ "keywords": [],
13
+ "dependencies": {
14
+ "@builderbot/bot": "latest",
15
+ "@builderbot/provider-gohighlevel": "latest",
16
+ "@builderbot/database-json": "latest"
17
+ },
18
+ "devDependencies": {
19
+ "eslint-plugin-builderbot": "latest",
20
+ "eslint": "^9.39.1",
21
+ "nodemon": "^3.1.11"
22
+ },
23
+ "author": "",
24
+ "license": "ISC"
25
+ }
@@ -0,0 +1,130 @@
1
+ import { join } from 'path'
2
+ import { createBot, createProvider, createFlow, addKeyword, utils } from '@builderbot/bot'
3
+ import { JsonFileDB as Database } from '@builderbot/database-json'
4
+ import { GoHighLevelProvider as Provider } from '@builderbot/provider-gohighlevel'
5
+
6
+ const PORT = process.env.PORT ?? 3008
7
+
8
+ const discordFlow = addKeyword('doc').addAnswer(
9
+ ['You can see the documentation here', '📄 https://builderbot.app/docs \n', 'Do you want to continue? *yes*'].join(
10
+ '\n'
11
+ ),
12
+ { capture: true },
13
+ async (ctx, { gotoFlow, flowDynamic }) => {
14
+ if (ctx.body.toLocaleLowerCase().includes('yes')) {
15
+ return gotoFlow(registerFlow)
16
+ }
17
+ await flowDynamic('Thanks!')
18
+ return
19
+ }
20
+ )
21
+
22
+ const welcomeFlow = addKeyword(['hi', 'hello', 'hola'])
23
+ .addAnswer(`🙌 Hello welcome to this *Chatbot*`)
24
+ .addAnswer(
25
+ [
26
+ 'I share with you the following links of interest about the project',
27
+ '👉 *doc* to view the documentation',
28
+ ].join('\n'),
29
+ { delay: 800, capture: true },
30
+ async (ctx, { fallBack }) => {
31
+ if (!ctx.body.toLocaleLowerCase().includes('doc')) {
32
+ return fallBack('You should type *doc*')
33
+ }
34
+ return
35
+ },
36
+ [discordFlow]
37
+ )
38
+
39
+ const registerFlow = addKeyword(utils.setEvent('REGISTER_FLOW'))
40
+ .addAnswer(`What is your name?`, { capture: true }, async (ctx, { state }) => {
41
+ await state.update({ name: ctx.body })
42
+ })
43
+ .addAnswer('What is your age?', { capture: true }, async (ctx, { state }) => {
44
+ await state.update({ age: ctx.body })
45
+ })
46
+ .addAction(async (_, { flowDynamic, state }) => {
47
+ await flowDynamic(`${state.get('name')}, thanks for your information!: Your age: ${state.get('age')}`)
48
+ })
49
+
50
+ const fullSamplesFlow = addKeyword(['samples', utils.setEvent('SAMPLES')])
51
+ .addAnswer(`💪 I'll send you a lot files...`)
52
+ .addAnswer(`Send image from Local`, { media: join(process.cwd(), 'assets', 'sample.png') })
53
+ .addAnswer(`Send video from URL`, {
54
+ media: 'https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYTJ0ZGdjd2syeXAwMjQ4aWdkcW04OWlqcXI3Ynh1ODkwZ25zZWZ1dCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/LCohAb657pSdHv0Q5h/giphy.mp4',
55
+ })
56
+ .addAnswer(`Send audio from URL`, { media: 'https://cdn.freesound.org/previews/728/728142_11861866-lq.mp3' })
57
+ .addAnswer(`Send file from URL`, {
58
+ media: 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf',
59
+ })
60
+
61
+ const main = async () => {
62
+ const adapterFlow = createFlow([welcomeFlow, registerFlow, fullSamplesFlow])
63
+ const adapterProvider = createProvider(Provider, {
64
+ clientId: process.env.GHL_CLIENT_ID ?? 'YOUR_CLIENT_ID',
65
+ clientSecret: process.env.GHL_CLIENT_SECRET ?? 'YOUR_CLIENT_SECRET',
66
+ locationId: process.env.GHL_LOCATION_ID ?? 'YOUR_LOCATION_ID',
67
+ channelType: 'WhatsApp',
68
+ apiVersion: '2021-07-28'
69
+ })
70
+
71
+ const adapterDB = new Database({ filename: 'db.json' })
72
+
73
+ const { handleCtx, httpServer } = await createBot({
74
+ flow: adapterFlow,
75
+ provider: adapterProvider,
76
+ database: adapterDB,
77
+ })
78
+
79
+ adapterProvider.server.post(
80
+ '/v1/messages',
81
+ handleCtx(async (bot, req, res) => {
82
+ const { number, message, urlMedia } = req.body
83
+ await bot.sendMessage(number, message, { media: urlMedia ?? null })
84
+ return res.end('sended')
85
+ })
86
+ )
87
+
88
+ adapterProvider.server.post(
89
+ '/v1/register',
90
+ handleCtx(async (bot, req, res) => {
91
+ const { number, name } = req.body
92
+ await bot.dispatch('REGISTER_FLOW', { from: number, name })
93
+ return res.end('trigger')
94
+ })
95
+ )
96
+
97
+ adapterProvider.server.post(
98
+ '/v1/samples',
99
+ handleCtx(async (bot, req, res) => {
100
+ const { number, name } = req.body
101
+ await bot.dispatch('SAMPLES', { from: number, name })
102
+ return res.end('trigger')
103
+ })
104
+ )
105
+
106
+ adapterProvider.server.post(
107
+ '/v1/blacklist',
108
+ handleCtx(async (bot, req, res) => {
109
+ const { number, intent } = req.body
110
+ if (intent === 'remove') bot.blacklist.remove(number)
111
+ if (intent === 'add') bot.blacklist.add(number)
112
+
113
+ res.writeHead(200, { 'Content-Type': 'application/json' })
114
+ return res.end(JSON.stringify({ status: 'ok', number, intent }))
115
+ })
116
+ )
117
+
118
+ adapterProvider.server.get(
119
+ '/v1/blacklist/list',
120
+ handleCtx(async (bot, req, res) => {
121
+ const blacklist = bot.blacklist.getList()
122
+ res.writeHead(200, { 'Content-Type': 'application/json' })
123
+ return res.end(JSON.stringify({ status: 'ok', blacklist }))
124
+ })
125
+ )
126
+
127
+ httpServer(+PORT)
128
+ }
129
+
130
+ main()
@@ -0,0 +1,16 @@
1
+ dist/*
2
+ node_modules
3
+ .env
4
+
5
+ *_sessions
6
+ *tokens
7
+ .wwebjs*
8
+
9
+ .git
10
+ .gitignore
11
+ Dockerfile*
12
+ npm-debug.log*
13
+ pnpm-debug.log*
14
+ tests
15
+ docs
16
+ *.md
@@ -0,0 +1,40 @@
1
+ # Image size ~ 400MB
2
+ FROM node:21-alpine3.18 as builder
3
+
4
+ WORKDIR /app
5
+
6
+ RUN corepack enable && corepack prepare pnpm@latest --activate
7
+ ENV PNPM_HOME=/usr/local/bin
8
+
9
+ COPY . .
10
+
11
+ COPY package*.json *-lock.yaml ./
12
+
13
+ RUN apk add --no-cache --virtual .gyp \
14
+ python3 \
15
+ make \
16
+ g++ \
17
+ && apk add --no-cache git \
18
+ && pnpm install \
19
+ && apk del .gyp
20
+
21
+ FROM node:21-alpine3.18 as deploy
22
+
23
+ WORKDIR /app
24
+
25
+ ARG PORT
26
+ ENV PORT $PORT
27
+ EXPOSE $PORT
28
+
29
+ COPY --from=builder /app/assets ./assets
30
+ COPY --from=builder /app/dist ./dist
31
+ COPY --from=builder /app/*.json /app/*-lock.yaml ./
32
+
33
+ RUN corepack enable && corepack prepare pnpm@latest --activate
34
+ ENV PNPM_HOME=/usr/local/bin
35
+
36
+ RUN npm cache clean --force && pnpm install --production --ignore-scripts \
37
+ && addgroup -g 1001 -S nodejs && adduser -S -u 1001 nodejs \
38
+ && rm -rf $PNPM_HOME/.npm $PNPM_HOME/.node-gyp
39
+
40
+ CMD ["npm", "start"]
@@ -0,0 +1,44 @@
1
+ <p align="center">
2
+ <a href="https://builderbot.app/">
3
+ <picture>
4
+ <img src="https://builderbot.app/assets/thumbnail-vector.png" height="80">
5
+ </picture>
6
+ <h2 align="center">BuilderBot</h2>
7
+ </a>
8
+ </p>
9
+
10
+
11
+
12
+ <p align="center">
13
+ <a aria-label="NPM version" href="https://www.npmjs.com/package/@builderbot/bot">
14
+ <img alt="" src="https://img.shields.io/npm/v/@builderbot/bot?color=%2300c200&label=%40bot-whatsapp">
15
+ </a>
16
+ <a aria-label="Join the community on GitHub" href="https://link.codigoencasa.com/DISCORD">
17
+ <img alt="" src="https://img.shields.io/discord/915193197645402142?logo=discord">
18
+ </a>
19
+ </p>
20
+
21
+
22
+ ## Getting Started
23
+
24
+ With this library, you can build automated conversation flows agnostic to the WhatsApp provider, set up automated responses for frequently asked questions, receive and respond to messages automatically, and track interactions with customers. Additionally, you can easily set up triggers to expand functionalities limitlessly.
25
+
26
+ ```
27
+ npm create builderbot@latest
28
+ ```
29
+
30
+
31
+ ## Documentation
32
+
33
+ Visit [builderbot](https://builderbot.app/) to view the full documentation.
34
+
35
+
36
+ ## Official Course
37
+
38
+ If you want to discover all the functions and features offered by the library you can take the course.
39
+ [View Course](https://app.codigoencasa.com/courses/builderbot?refCode=LEIFER)
40
+
41
+
42
+ ## Contact Us
43
+ - [💻 Discord](https://link.codigoencasa.com/DISCORD)
44
+ - [👌 𝕏 (Twitter)](https://twitter.com/leifermendez)
@@ -0,0 +1,10 @@
1
+ dist/*
2
+ node_modules
3
+ .env
4
+
5
+ *_sessions
6
+ *tokens
7
+ .wwebjs*
8
+
9
+ *.log
10
+ *qr.png
@@ -0,0 +1,23 @@
1
+ import builderbot from 'eslint-plugin-builderbot'
2
+
3
+ export default [
4
+ {
5
+ ignores: ['dist/**', 'node_modules/**', 'rollup.config.js'],
6
+ },
7
+ {
8
+ plugins: {
9
+ builderbot,
10
+ },
11
+ languageOptions: {
12
+ ecmaVersion: 'latest',
13
+ sourceType: 'module',
14
+ },
15
+ rules: {
16
+ ...builderbot.configs.recommended.rules,
17
+ '@typescript-eslint/no-explicit-any': 'off',
18
+ '@typescript-eslint/no-unused-vars': 'off',
19
+ '@typescript-eslint/ban-ts-comment': 'off',
20
+ 'no-unsafe-optional-chaining': 'off',
21
+ },
22
+ },
23
+ ]
@@ -0,0 +1,9 @@
1
+ {
2
+ "watch": ["src"],
3
+ "ext": "js",
4
+ "ignore": [
5
+ "**/*.test.js",
6
+ "**/*.spec.js"
7
+ ],
8
+ "delay": "3"
9
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "base-bailey-json",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "src/app.js",
6
+ "type": "module",
7
+ "scripts": {
8
+ "lint": "eslint . --no-ignore",
9
+ "dev": "npm run lint && nodemon --signal SIGKILL ./src/app.js",
10
+ "start": "node ./src/app.js"
11
+ },
12
+ "keywords": [],
13
+ "dependencies": {
14
+ "@builderbot/bot": "latest",
15
+ "@builderbot/provider-gohighlevel": "latest"
16
+ },
17
+ "devDependencies": {
18
+ "eslint-plugin-builderbot": "latest",
19
+ "eslint": "^9.39.1",
20
+ "nodemon": "^3.1.11"
21
+ },
22
+ "author": "",
23
+ "license": "ISC"
24
+ }