@friggframework/api-module-pipedrive 1.0.1-v1-alpha.5 → 2.1.0-canary.56.2dc58f9.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.
package/LICENSE.md CHANGED
@@ -2,8 +2,15 @@ MIT License
2
2
 
3
3
  Copyright (c) 2022 Left Hook Inc.
4
4
 
5
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
6
+ documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
7
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
8
+ persons to whom the Software is furnished to do so, subject to the following conditions:
6
9
 
7
- The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software.
10
+ The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or
11
+ substantial portions of the Software.
8
12
 
9
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
14
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
15
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # pipedrive
2
-
3
- This is the API Module for pipedrive that allows the [Frigg](https://friggframework.org) code to talk to the pipedrive API.
2
+
3
+ This is the API Module for pipedrive that allows the [Frigg](https://friggframework.org) code to talk to the pipedrive
4
+ API.
4
5
 
5
6
  Read more on the [Frigg documentation site](https://docs.friggframework.org/api-modules/list/pipedrive
@@ -1,9 +1,11 @@
1
1
  {
2
- "name": "pipedrive",
3
- "label": "PipeDrive CRM",
4
- "productUrl": "https://pipedrive.com",
5
- "apiDocs": "https://developer.pipedrive.com",
6
- "logoUrl": "https://friggframework.org/assets/img/pipedrive.jpeg",
7
- "categories": ["Sales"],
8
- "description": "Pipedrive"
2
+ "name": "pipedrive",
3
+ "label": "PipeDrive CRM",
4
+ "productUrl": "https://pipedrive.com",
5
+ "apiDocs": "https://developer.pipedrive.com",
6
+ "logoUrl": "https://friggframework.org/assets/img/pipedrive-icon.png",
7
+ "categories": [
8
+ "Sales"
9
+ ],
10
+ "description": "Pipedrive"
9
11
  }
package/dist/api.d.ts ADDED
@@ -0,0 +1,59 @@
1
+ import { OAuth2Requester } from '@friggframework/core';
2
+ import { OAuth2RequesterOptions, ActivityParams, ListActivitiesParams, ListDealsParams, ListPersonsParams, GetPersonParams, PipedriveResponse, PipedriveUser, PipedriveTokenResponse } from './types';
3
+ export declare class Api extends OAuth2Requester {
4
+ companyDomain: string | null;
5
+ URLs: {
6
+ activities: string;
7
+ activityFields: string;
8
+ activityById: (activityId: string | number) => string;
9
+ getUser: string;
10
+ users: string;
11
+ deals: string;
12
+ persons: string;
13
+ personById: (personId: string | number) => string;
14
+ };
15
+ constructor(params: OAuth2RequesterOptions);
16
+ /**
17
+ * Sets OAuth tokens and captures the Pipedrive company domain
18
+ * @param params - Token response from OAuth provider
19
+ * @param params.api_domain - The Pipedrive company-specific API domain (e.g., 'https://company.pipedrive.com')
20
+ * @returns Token response
21
+ */
22
+ setTokens(params: PipedriveTokenResponse): Promise<PipedriveTokenResponse>;
23
+ /**
24
+ * Sets the company domain and updates the base URL for API requests
25
+ * @param companyDomain - The Pipedrive company domain (e.g., 'https://company.pipedrive.com' or 'company.pipedrive.com')
26
+ */
27
+ setCompanyDomain(companyDomain: string): Promise<void>;
28
+ /**
29
+ * List deals with v2 API support
30
+ * @param params - Query parameters for filtering and pagination
31
+ * @returns Response with deal data array and pagination cursor
32
+ */
33
+ listDeals(params?: ListDealsParams): Promise<PipedriveResponse>;
34
+ listActivityFields(): Promise<PipedriveResponse>;
35
+ /**
36
+ * List activities with v2 API support
37
+ * @param params - Query parameters for filtering and pagination
38
+ * @returns Response with activity data array and pagination cursor
39
+ */
40
+ listActivities(params?: ListActivitiesParams): Promise<PipedriveResponse>;
41
+ deleteActivity(activityId: string | number): Promise<PipedriveResponse>;
42
+ updateActivity(activityId: string | number, task: Partial<ActivityParams>): Promise<PipedriveResponse>;
43
+ createActivity(params: ActivityParams): Promise<PipedriveResponse>;
44
+ getUser(): Promise<PipedriveUser>;
45
+ listUsers(): Promise<PipedriveResponse>;
46
+ /**
47
+ * List persons with v2 API support
48
+ * @param params - Query parameters for filtering and pagination
49
+ * @returns Response with person data array and pagination cursor
50
+ */
51
+ listPersons(params?: ListPersonsParams): Promise<PipedriveResponse>;
52
+ /**
53
+ * Get a single person by ID
54
+ * @param personId - The ID of the person to retrieve
55
+ * @param params - Query parameters for additional fields
56
+ * @returns Response with person data
57
+ */
58
+ getPerson(personId: string | number, params?: GetPersonParams): Promise<PipedriveResponse>;
59
+ }
package/dist/api.js ADDED
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Api = void 0;
4
+ const core_1 = require("@friggframework/core");
5
+ class Api extends core_1.OAuth2Requester {
6
+ constructor(params) {
7
+ super(params);
8
+ this.companyDomain = (0, core_1.get)(params, 'companyDomain', null);
9
+ if (this.companyDomain) {
10
+ this.baseUrl = `${this.companyDomain}/api`;
11
+ }
12
+ this.URLs = {
13
+ activities: '/v2/activities',
14
+ activityFields: '/v1/activityFields',
15
+ activityById: (activityId) => `/v2/activities/${activityId}`,
16
+ getUser: '/v1/users/me',
17
+ users: '/v1/users',
18
+ deals: '/v2/deals',
19
+ persons: '/v2/persons',
20
+ personById: (personId) => `/v2/persons/${personId}`,
21
+ };
22
+ this.authorizationUri = encodeURI(`https://oauth.pipedrive.com/oauth/authorize?client_id=${this.client_id}&redirect_uri=${this.redirect_uri}&response_type=code&scope=${this.scope}`);
23
+ this.tokenUri = 'https://oauth.pipedrive.com/oauth/token';
24
+ }
25
+ /**
26
+ * Sets OAuth tokens and captures the Pipedrive company domain
27
+ * @param params - Token response from OAuth provider
28
+ * @param params.api_domain - The Pipedrive company-specific API domain (e.g., 'https://company.pipedrive.com')
29
+ * @returns Token response
30
+ */
31
+ async setTokens(params) {
32
+ if (params.api_domain) {
33
+ await this.setCompanyDomain(params.api_domain);
34
+ }
35
+ else if (!this.companyDomain) {
36
+ throw new Error('Pipedrive api_domain not provided in token response');
37
+ }
38
+ return super.setTokens(params);
39
+ }
40
+ /**
41
+ * Sets the company domain and updates the base URL for API requests
42
+ * @param companyDomain - The Pipedrive company domain (e.g., 'https://company.pipedrive.com' or 'company.pipedrive.com')
43
+ */
44
+ async setCompanyDomain(companyDomain) {
45
+ if (!companyDomain) {
46
+ throw new Error('Company domain is required for Pipedrive API');
47
+ }
48
+ const formattedDomain = companyDomain.startsWith('http')
49
+ ? companyDomain
50
+ : `https://${companyDomain}`;
51
+ this.companyDomain = formattedDomain;
52
+ this.baseUrl = `${this.companyDomain}/api`;
53
+ }
54
+ // ************************** Deals **********************************
55
+ /**
56
+ * List deals with v2 API support
57
+ * @param params - Query parameters for filtering and pagination
58
+ * @returns Response with deal data array and pagination cursor
59
+ */
60
+ async listDeals(params) {
61
+ const options = {
62
+ url: this.baseUrl + this.URLs.deals,
63
+ };
64
+ if (params && Object.keys(params).length > 0) {
65
+ options.query = params;
66
+ }
67
+ return this._get(options);
68
+ }
69
+ // ************************** Activities **********************************
70
+ async listActivityFields() {
71
+ const options = {
72
+ url: this.baseUrl + this.URLs.activityFields,
73
+ };
74
+ return this._get(options);
75
+ }
76
+ /**
77
+ * List activities with v2 API support
78
+ * @param params - Query parameters for filtering and pagination
79
+ * @returns Response with activity data array and pagination cursor
80
+ */
81
+ async listActivities(params) {
82
+ const options = {
83
+ url: this.baseUrl + this.URLs.activities,
84
+ };
85
+ if (params && Object.keys(params).length > 0) {
86
+ options.query = params;
87
+ }
88
+ return this._get(options);
89
+ }
90
+ async deleteActivity(activityId) {
91
+ const options = {
92
+ url: this.baseUrl + this.URLs.activityById(activityId),
93
+ };
94
+ return this._delete(options);
95
+ }
96
+ async updateActivity(activityId, task) {
97
+ const options = {
98
+ url: this.baseUrl + this.URLs.activityById(activityId),
99
+ body: task,
100
+ };
101
+ return this._patch(options);
102
+ }
103
+ async createActivity(params) {
104
+ const dealId = (0, core_1.get)(params, 'dealId', null);
105
+ const subject = (0, core_1.get)(params, 'subject');
106
+ const type = (0, core_1.get)(params, 'type');
107
+ const options = {
108
+ url: this.baseUrl + this.URLs.activities,
109
+ body: { ...params },
110
+ headers: {
111
+ 'Content-Type': 'application/json',
112
+ },
113
+ };
114
+ return this._post(options);
115
+ }
116
+ // ************************** Users **********************************
117
+ async getUser() {
118
+ const options = {
119
+ url: this.baseUrl + this.URLs.getUser,
120
+ };
121
+ return this._get(options);
122
+ }
123
+ async listUsers() {
124
+ const options = {
125
+ url: this.baseUrl + this.URLs.users,
126
+ };
127
+ return this._get(options);
128
+ }
129
+ // ************************** Persons **********************************
130
+ /**
131
+ * List persons with v2 API support
132
+ * @param params - Query parameters for filtering and pagination
133
+ * @returns Response with person data array and pagination cursor
134
+ */
135
+ async listPersons(params) {
136
+ const options = {
137
+ url: this.baseUrl + this.URLs.persons,
138
+ };
139
+ if (params && Object.keys(params).length > 0) {
140
+ options.query = params;
141
+ }
142
+ return this._get(options);
143
+ }
144
+ /**
145
+ * Get a single person by ID
146
+ * @param personId - The ID of the person to retrieve
147
+ * @param params - Query parameters for additional fields
148
+ * @returns Response with person data
149
+ */
150
+ async getPerson(personId, params) {
151
+ const options = {
152
+ url: this.baseUrl + this.URLs.personById(personId),
153
+ };
154
+ if (params && Object.keys(params).length > 0) {
155
+ options.query = params;
156
+ }
157
+ return this._get(options);
158
+ }
159
+ }
160
+ exports.Api = Api;
@@ -0,0 +1,4 @@
1
+ import 'dotenv/config';
2
+ import { FriggModuleAuthDefinition } from '@friggframework/core';
3
+ declare const Definition: FriggModuleAuthDefinition;
4
+ export { Definition };
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Definition = void 0;
7
+ require("dotenv/config");
8
+ const api_1 = require("./api");
9
+ const core_1 = require("@friggframework/core");
10
+ const defaultConfig_json_1 = __importDefault(require("../defaultConfig.json"));
11
+ const Definition = {
12
+ API: api_1.Api,
13
+ getName: () => defaultConfig_json_1.default.name,
14
+ moduleName: defaultConfig_json_1.default.name,
15
+ modelName: 'Pipedrive',
16
+ requiredAuthMethods: {
17
+ getToken: async (api, params) => {
18
+ const code = (0, core_1.get)(params.data, 'code', '');
19
+ if (!code) {
20
+ throw new Error('Authorization code is required');
21
+ }
22
+ return api.getTokenFromCode(code);
23
+ },
24
+ getEntityDetails: async (api, callbackParams, tokenResponse, userId) => {
25
+ try {
26
+ const userProfile = await api.getUser();
27
+ if (!userProfile || !userProfile.data) {
28
+ throw new Error(`Pipedrive /v1/users/me failed to return valid user info. Response: ${JSON.stringify(userProfile)}`);
29
+ }
30
+ return {
31
+ identifiers: {
32
+ externalId: String(userProfile.data.company_id),
33
+ user: userId
34
+ },
35
+ details: {
36
+ name: userProfile.data.company_name || 'Unknown Company'
37
+ },
38
+ };
39
+ }
40
+ catch (error) {
41
+ throw new Error(`Failed to get Pipedrive entity details: ${error.message}`);
42
+ }
43
+ },
44
+ apiPropertiesToPersist: {
45
+ credential: [
46
+ 'access_token',
47
+ 'refresh_token',
48
+ 'companyDomain'
49
+ ],
50
+ entity: [],
51
+ },
52
+ getCredentialDetails: async (api, userId) => {
53
+ try {
54
+ const userProfile = await api.getUser();
55
+ if (!userProfile || !userProfile.data) {
56
+ throw new Error(`Pipedrive /v1/users/me failed to return valid user info. Response: ${JSON.stringify(userProfile)}`);
57
+ }
58
+ return {
59
+ identifiers: {
60
+ externalId: String(userProfile.data.id),
61
+ user: userId
62
+ },
63
+ details: {}
64
+ };
65
+ }
66
+ catch (error) {
67
+ throw new Error(`Failed to get Pipedrive credential details: ${error.message}`);
68
+ }
69
+ },
70
+ testAuthRequest: async (api) => api.getUser(),
71
+ },
72
+ env: {
73
+ client_id: process.env.PIPEDRIVE_CLIENT_ID,
74
+ client_secret: process.env.PIPEDRIVE_CLIENT_SECRET,
75
+ scope: process.env.PIPEDRIVE_SCOPE,
76
+ redirect_uri: `${process.env.REDIRECT_URI}/pipedrive`,
77
+ }
78
+ };
79
+ exports.Definition = Definition;
@@ -0,0 +1,5 @@
1
+ import { Api } from './api';
2
+ import { Definition } from './definition';
3
+ export { Api, Definition };
4
+ export { Api as PipedriveAPI };
5
+ export default Definition;
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PipedriveAPI = exports.Definition = exports.Api = void 0;
4
+ const api_1 = require("./api");
5
+ Object.defineProperty(exports, "Api", { enumerable: true, get: function () { return api_1.Api; } });
6
+ Object.defineProperty(exports, "PipedriveAPI", { enumerable: true, get: function () { return api_1.Api; } });
7
+ const definition_1 = require("./definition");
8
+ Object.defineProperty(exports, "Definition", { enumerable: true, get: function () { return definition_1.Definition; } });
9
+ exports.default = definition_1.Definition;
package/package.json CHANGED
@@ -1,23 +1,33 @@
1
1
  {
2
- "version": "1.0.1-v1-alpha.5",
3
- "name": "@friggframework/api-module-pipedrive",
4
- "prettier": "@friggframework/prettier-config",
5
- "description": "",
6
- "main": "index.js",
7
- "scripts": {
8
- "lint:fix": "prettier --write --loglevel error . && eslint . --fix",
9
- "test": "jest"
10
- },
11
- "author": "",
12
- "license": "MIT",
13
- "devDependencies": {
14
- "eslint": "^8.22.0",
15
- "jest": "^28.1.3",
16
- "prettier": "^2.7.1",
17
- "sinon": "^14.0.0"
18
- },
19
- "dependencies": {
20
- "@friggframework/core": "1.0.1-v1-alpha.5"
21
- },
22
- "gitHead": "866cdecac7b599ec734f8772a5774112da1e8f7a"
2
+ "name": "@friggframework/api-module-pipedrive",
3
+ "version": "2.1.0-canary.56.2dc58f9.0",
4
+ "license": "MIT",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc -p tsconfig.json",
9
+ "prepare": "npm run build",
10
+ "test": "vitest run",
11
+ "test:watch": "vitest",
12
+ "lint": "eslint ."
13
+ },
14
+ "files": [
15
+ "dist/**/*",
16
+ "defaultConfig.json",
17
+ "README.md",
18
+ "LICENSE.md"
19
+ ],
20
+ "dependencies": {
21
+ "@friggframework/core": "^2.0.0",
22
+ "dotenv": "^16.0.0"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^20.8.0",
26
+ "typescript": "^5.4.0",
27
+ "vitest": "^1.0.0"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "gitHead": "2dc58f950aad42005d2a4d536615fff6420f6a1d"
23
33
  }
package/.eslintrc.json DELETED
@@ -1,3 +0,0 @@
1
- {
2
- "extends": "@friggframework/eslint-config"
3
- }
package/CHANGELOG.md DELETED
@@ -1,171 +0,0 @@
1
- # v0.9.0 (Wed Sep 06 2023)
2
-
3
- #### 🐛 Bug Fix
4
-
5
- - Bump independent versions \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
6
-
7
- #### Authors: 1
8
-
9
- - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
10
-
11
- ---
12
-
13
- # v0.8.26 (Thu Jun 08 2023)
14
-
15
- #### 🐛 Bug Fix
16
-
17
- - Bump independent versions \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
18
-
19
- #### Authors: 1
20
-
21
- - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
22
-
23
- ---
24
-
25
- # v0.8.25 (Thu May 25 2023)
26
-
27
- #### 🐛 Bug Fix
28
-
29
- - Bump independent versions \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
30
-
31
- #### Authors: 1
32
-
33
- - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
34
-
35
- ---
36
-
37
- # v0.8.24 (Tue Apr 04 2023)
38
-
39
- #### 🐛 Bug Fix
40
-
41
- - Bump independent versions \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
42
-
43
- #### Authors: 1
44
-
45
- - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
46
-
47
- ---
48
-
49
- # v0.8.23 (Tue Feb 21 2023)
50
-
51
- #### 🐛 Bug Fix
52
-
53
- - Merge branch 'main' into hubspot-updates ([@seanspeaks](https://github.com/seanspeaks))
54
- - Bump independent versions \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
55
-
56
- #### Authors: 1
57
-
58
- - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
59
-
60
- ---
61
-
62
- # v0.8.21 (Tue Jan 31 2023)
63
-
64
- #### 🐛 Bug Fix
65
-
66
- - Bump independent versions \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
67
-
68
- #### Authors: 1
69
-
70
- - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
71
-
72
- ---
73
-
74
- # v0.8.19 (Wed Jan 11 2023)
75
-
76
- #### 🐛 Bug Fix
77
-
78
- - Bump independent versions \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
79
-
80
- #### Authors: 1
81
-
82
- - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
83
-
84
- ---
85
-
86
- # v0.8.18 (Tue Jan 10 2023)
87
-
88
- :tada: This release contains work from a new contributor! :tada:
89
-
90
- Thank you, Jonathan O'Donnell ([@joncodo](https://github.com/joncodo)), for all your work!
91
-
92
- #### 🐛 Bug Fix
93
-
94
- - Merge branch 'main' of github.com:friggframework/frigg into doc-updates ([@joncodo](https://github.com/joncodo))
95
- - Bump independent versions \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
96
-
97
- #### Authors: 2
98
-
99
- - Jonathan O'Donnell ([@joncodo](https://github.com/joncodo))
100
- - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
101
-
102
- ---
103
-
104
- # v0.8.17 (Mon Jan 09 2023)
105
-
106
- #### 🐛 Bug Fix
107
-
108
- - Merge remote-tracking branch 'origin/main' into gitbook-updates [#48](https://github.com/friggframework/frigg/pull/48) ([@seanspeaks](https://github.com/seanspeaks))
109
- - Bump independent versions \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
110
- - A lot of changes all rolled into one [#21](https://github.com/friggframework/frigg/pull/21) ([@seanspeaks](https://github.com/seanspeaks))
111
- - Updated API modules with support for sls offline, and made sure optional chaining with discriminators was in place ([@seanspeaks](https://github.com/seanspeaks))
112
- - Fixing dependencies across all API Modules ([@seanspeaks](https://github.com/seanspeaks))
113
- - More import issues (Exports are named objects, imports needed to object destructure) ([@seanspeaks](https://github.com/seanspeaks))
114
- - Updates to API Modules for proper export/imports ([@seanspeaks](https://github.com/seanspeaks))
115
- - Merge remote-tracking branch 'origin/main' into simplify-mongoose-models ([@seanspeaks](https://github.com/seanspeaks))
116
- - Update all api modules to use module-plugin models ([@seanspeaks](https://github.com/seanspeaks))
117
- - Add READMEs for all packages and api-modules [#20](https://github.com/friggframework/frigg/pull/20) ([@seanspeaks](https://github.com/seanspeaks))
118
- - Add READMEs for all packages and api-modules ([@seanspeaks](https://github.com/seanspeaks))
119
-
120
- #### ⚠️ Pushed to `main`
121
-
122
- - Merge branch 'main' into gitbook-updates ([@seanspeaks](https://github.com/seanspeaks))
123
- - Finish initial formatting and publishing of all modules ([@seanspeaks](https://github.com/seanspeaks))
124
-
125
- #### Authors: 1
126
-
127
- - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
128
-
129
- ---
130
-
131
- # v0.8.14 (Tue Dec 06 2022)
132
-
133
- #### 🐛 Bug Fix
134
-
135
- - fix modules to @friggframework [#74](https://github.com/friggframework/frigg/pull/74) ([@sheehantoufiq](https://github.com/sheehantoufiq))
136
- - Bump independent versions \[skip ci\] ([@seanspeaks](https://github.com/seanspeaks))
137
-
138
- #### Authors: 2
139
-
140
- - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
141
- - Sheehan Toufiq Khan ([@sheehantoufiq](https://github.com/sheehantoufiq))
142
-
143
- ---
144
-
145
- # v0.8.11 (Mon Sep 19 2022)
146
-
147
- #### 🐛 Bug Fix
148
-
149
- - Test environment setup for all modules [#49](https://github.com/friggframework/frigg/pull/49) ([@seanspeaks](https://github.com/seanspeaks))
150
- - Test environment setup for all modules ([@seanspeaks](https://github.com/seanspeaks))
151
- - Merge remote-tracking branch 'origin/main' into gitbook-updates [#48](https://github.com/friggframework/frigg/pull/48) ([@seanspeaks](https://github.com/seanspeaks))
152
-
153
- #### Authors: 1
154
-
155
- - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))
156
-
157
- ---
158
-
159
- # v0.8.10 (Thu Sep 01 2022)
160
-
161
- #### 🐛 Bug Fix
162
-
163
- - version bumped to address tag issue [#43](https://github.com/friggframework/frigg/pull/43) ([@seanspeaks](https://github.com/seanspeaks))
164
- - version bumped ([@seanspeaks](https://github.com/seanspeaks))
165
- - Publish ([@seanspeaks](https://github.com/seanspeaks))
166
- - Add nx and licenses [#37](https://github.com/friggframework/frigg/pull/37) ([@seanspeaks](https://github.com/seanspeaks))
167
- - MIT to all packages ([@seanspeaks](https://github.com/seanspeaks))
168
-
169
- #### Authors: 1
170
-
171
- - Sean Matthews ([@seanspeaks](https://github.com/seanspeaks))