@liase/core 1.0.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 (162) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +62 -0
  3. package/dist/ActionContext.d.ts +603 -0
  4. package/dist/ActionContext.d.ts.map +1 -0
  5. package/dist/ActionContext.js +227 -0
  6. package/dist/DomSelection.d.ts +30 -0
  7. package/dist/DomSelection.d.ts.map +1 -0
  8. package/dist/DomSelection.js +60 -0
  9. package/dist/Liase.d.ts +40 -0
  10. package/dist/Liase.d.ts.map +1 -0
  11. package/dist/Liase.js +105 -0
  12. package/dist/LiaseQuery.d.ts +593 -0
  13. package/dist/LiaseQuery.d.ts.map +1 -0
  14. package/dist/LiaseQuery.js +145 -0
  15. package/dist/actionHelpers.d.ts +30 -0
  16. package/dist/actionHelpers.d.ts.map +1 -0
  17. package/dist/actionHelpers.js +73 -0
  18. package/dist/constructorExecution.d.ts +7 -0
  19. package/dist/constructorExecution.d.ts.map +1 -0
  20. package/dist/constructorExecution.js +149 -0
  21. package/dist/generateResponse.d.ts +14 -0
  22. package/dist/generateResponse.d.ts.map +1 -0
  23. package/dist/generateResponse.js +88 -0
  24. package/dist/index.d.ts +13 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +6 -0
  27. package/dist/lib/fetch.d.ts +10 -0
  28. package/dist/lib/fetch.d.ts.map +1 -0
  29. package/dist/lib/fetch.js +68 -0
  30. package/dist/lib/hooks.d.ts +7 -0
  31. package/dist/lib/hooks.d.ts.map +1 -0
  32. package/dist/lib/hooks.js +13 -0
  33. package/dist/lib/networkRequestsCache.d.ts +23 -0
  34. package/dist/lib/networkRequestsCache.d.ts.map +1 -0
  35. package/dist/lib/networkRequestsCache.js +81 -0
  36. package/dist/lib/networkRequestsHistory.d.ts +21 -0
  37. package/dist/lib/networkRequestsHistory.d.ts.map +1 -0
  38. package/dist/lib/networkRequestsHistory.js +119 -0
  39. package/dist/lib/time.d.ts +2 -0
  40. package/dist/lib/time.d.ts.map +1 -0
  41. package/dist/lib/time.js +31 -0
  42. package/dist/lib/utils.d.ts +46 -0
  43. package/dist/lib/utils.d.ts.map +1 -0
  44. package/dist/lib/utils.js +208 -0
  45. package/dist/lib/zod.d.ts +35 -0
  46. package/dist/lib/zod.d.ts.map +1 -0
  47. package/dist/lib/zod.js +290 -0
  48. package/dist/loadUrl.d.ts +45 -0
  49. package/dist/loadUrl.d.ts.map +1 -0
  50. package/dist/loadUrl.js +111 -0
  51. package/dist/plugins/built-in-sources/bluesky/client.d.ts +11 -0
  52. package/dist/plugins/built-in-sources/bluesky/client.d.ts.map +1 -0
  53. package/dist/plugins/built-in-sources/bluesky/client.js +17 -0
  54. package/dist/plugins/built-in-sources/bluesky/index.d.ts +1115 -0
  55. package/dist/plugins/built-in-sources/bluesky/index.d.ts.map +1 -0
  56. package/dist/plugins/built-in-sources/bluesky/index.js +14 -0
  57. package/dist/plugins/built-in-sources/bluesky/requestHandlers/feed.d.ts +378 -0
  58. package/dist/plugins/built-in-sources/bluesky/requestHandlers/feed.d.ts.map +1 -0
  59. package/dist/plugins/built-in-sources/bluesky/requestHandlers/feed.js +77 -0
  60. package/dist/plugins/built-in-sources/bluesky/requestHandlers/mediaSearch.d.ts +390 -0
  61. package/dist/plugins/built-in-sources/bluesky/requestHandlers/mediaSearch.d.ts.map +1 -0
  62. package/dist/plugins/built-in-sources/bluesky/requestHandlers/mediaSearch.js +87 -0
  63. package/dist/plugins/built-in-sources/bluesky/requestHandlers/singleMedia.d.ts +351 -0
  64. package/dist/plugins/built-in-sources/bluesky/requestHandlers/singleMedia.d.ts.map +1 -0
  65. package/dist/plugins/built-in-sources/bluesky/requestHandlers/singleMedia.js +56 -0
  66. package/dist/plugins/built-in-sources/bluesky/shared.d.ts +53 -0
  67. package/dist/plugins/built-in-sources/bluesky/shared.d.ts.map +1 -0
  68. package/dist/plugins/built-in-sources/bluesky/shared.js +127 -0
  69. package/dist/plugins/built-in-sources/bluesky/types.d.ts +488 -0
  70. package/dist/plugins/built-in-sources/bluesky/types.d.ts.map +1 -0
  71. package/dist/plugins/built-in-sources/bluesky/types.js +48 -0
  72. package/dist/plugins/built-in-sources/giphy/index.d.ts +584 -0
  73. package/dist/plugins/built-in-sources/giphy/index.d.ts.map +1 -0
  74. package/dist/plugins/built-in-sources/giphy/index.js +9 -0
  75. package/dist/plugins/built-in-sources/giphy/requestHandlers/mediaSearch.d.ts +310 -0
  76. package/dist/plugins/built-in-sources/giphy/requestHandlers/mediaSearch.d.ts.map +1 -0
  77. package/dist/plugins/built-in-sources/giphy/requestHandlers/mediaSearch.js +71 -0
  78. package/dist/plugins/built-in-sources/giphy/requestHandlers/singleMedia.d.ts +274 -0
  79. package/dist/plugins/built-in-sources/giphy/requestHandlers/singleMedia.d.ts.map +1 -0
  80. package/dist/plugins/built-in-sources/giphy/requestHandlers/singleMedia.js +43 -0
  81. package/dist/plugins/built-in-sources/giphy/shared.d.ts +24 -0
  82. package/dist/plugins/built-in-sources/giphy/shared.d.ts.map +1 -0
  83. package/dist/plugins/built-in-sources/giphy/shared.js +30 -0
  84. package/dist/plugins/built-in-sources/giphy/types.d.ts +398 -0
  85. package/dist/plugins/built-in-sources/giphy/types.d.ts.map +1 -0
  86. package/dist/plugins/built-in-sources/giphy/types.js +46 -0
  87. package/dist/plugins/built-in-sources/index.d.ts +1698 -0
  88. package/dist/plugins/built-in-sources/index.d.ts.map +1 -0
  89. package/dist/plugins/built-in-sources/index.js +5 -0
  90. package/dist/schemas/constructor.d.ts +14 -0
  91. package/dist/schemas/constructor.d.ts.map +1 -0
  92. package/dist/schemas/constructor.js +33 -0
  93. package/dist/schemas/file.d.ts +124 -0
  94. package/dist/schemas/file.d.ts.map +1 -0
  95. package/dist/schemas/file.js +28 -0
  96. package/dist/schemas/finderOptions.d.ts +389 -0
  97. package/dist/schemas/finderOptions.d.ts.map +1 -0
  98. package/dist/schemas/finderOptions.js +7 -0
  99. package/dist/schemas/media.d.ts +433 -0
  100. package/dist/schemas/media.d.ts.map +1 -0
  101. package/dist/schemas/media.js +81 -0
  102. package/dist/schemas/plugin.d.ts +298 -0
  103. package/dist/schemas/plugin.d.ts.map +1 -0
  104. package/dist/schemas/plugin.js +19 -0
  105. package/dist/schemas/primitives.d.ts +4 -0
  106. package/dist/schemas/primitives.d.ts.map +1 -0
  107. package/dist/schemas/primitives.js +11 -0
  108. package/dist/schemas/queryOptions.d.ts +19 -0
  109. package/dist/schemas/queryOptions.d.ts.map +1 -0
  110. package/dist/schemas/queryOptions.js +9 -0
  111. package/dist/schemas/request.d.ts +77 -0
  112. package/dist/schemas/request.d.ts.map +1 -0
  113. package/dist/schemas/request.js +21 -0
  114. package/dist/schemas/requestHandler.d.ts +126 -0
  115. package/dist/schemas/requestHandler.d.ts.map +1 -0
  116. package/dist/schemas/requestHandler.js +26 -0
  117. package/dist/schemas/response.d.ts +4673 -0
  118. package/dist/schemas/response.d.ts.map +1 -0
  119. package/dist/schemas/response.js +51 -0
  120. package/dist/schemas/secrets.d.ts +4 -0
  121. package/dist/schemas/secrets.d.ts.map +1 -0
  122. package/dist/schemas/secrets.js +2 -0
  123. package/dist/schemas/source.d.ts +202 -0
  124. package/dist/schemas/source.d.ts.map +1 -0
  125. package/dist/schemas/source.js +10 -0
  126. package/dist/test/fixtures/currentTimeSource.d.ts +53 -0
  127. package/dist/test/fixtures/currentTimeSource.d.ts.map +1 -0
  128. package/dist/test/fixtures/currentTimeSource.js +76 -0
  129. package/dist/test/fixtures/examplePlugin.d.ts +266 -0
  130. package/dist/test/fixtures/examplePlugin.d.ts.map +1 -0
  131. package/dist/test/fixtures/examplePlugin.js +4 -0
  132. package/dist/test/fixtures/exampleSource.d.ts +265 -0
  133. package/dist/test/fixtures/exampleSource.d.ts.map +1 -0
  134. package/dist/test/fixtures/exampleSource.js +107 -0
  135. package/dist/test/testFiles/internal/caching.test.d.ts +2 -0
  136. package/dist/test/testFiles/internal/caching.test.d.ts.map +1 -0
  137. package/dist/test/testFiles/internal/caching.test.js +116 -0
  138. package/dist/test/testFiles/internal/mediaTypeGuessing.test.d.ts +2 -0
  139. package/dist/test/testFiles/internal/mediaTypeGuessing.test.d.ts.map +1 -0
  140. package/dist/test/testFiles/internal/mediaTypeGuessing.test.js +86 -0
  141. package/dist/test/testFiles/sources/bluesky.test.d.ts +2 -0
  142. package/dist/test/testFiles/sources/bluesky.test.d.ts.map +1 -0
  143. package/dist/test/testFiles/sources/bluesky.test.js +40 -0
  144. package/dist/test/testFiles/sources/exampleSource.test.d.ts +2 -0
  145. package/dist/test/testFiles/sources/exampleSource.test.d.ts.map +1 -0
  146. package/dist/test/testFiles/sources/exampleSource.test.js +27 -0
  147. package/dist/test/testFiles/sources/giphy.test.d.ts +2 -0
  148. package/dist/test/testFiles/sources/giphy.test.d.ts.map +1 -0
  149. package/dist/test/testFiles/sources/giphy.test.js +17 -0
  150. package/dist/test/utils/general.d.ts +3 -0
  151. package/dist/test/utils/general.d.ts.map +1 -0
  152. package/dist/test/utils/general.js +24 -0
  153. package/dist/test/utils/globalSetup.d.ts +3 -0
  154. package/dist/test/utils/globalSetup.d.ts.map +1 -0
  155. package/dist/test/utils/globalSetup.js +12 -0
  156. package/dist/test/utils/vitest.d.ts +551 -0
  157. package/dist/test/utils/vitest.d.ts.map +1 -0
  158. package/dist/test/utils/vitest.js +166 -0
  159. package/dist/types.d.ts +16 -0
  160. package/dist/types.d.ts.map +1 -0
  161. package/dist/types.js +1 -0
  162. package/package.json +67 -0
@@ -0,0 +1,166 @@
1
+ import { createLiaseQuery } from "../../index.js";
2
+ import { getDuplicates, getOrdinal, hasNoDuplicates } from "../../lib/utils.js";
3
+ import { copy } from "copy-anything";
4
+ import deepmerge from "deepmerge";
5
+ import { expect, test } from "vitest";
6
+ import { getSecrets } from "./general.js";
7
+ export function createBasicTestsForRequestHandlers(options) {
8
+ const { source, queries, queriesShared } = options;
9
+ for (const requestHandler of source.requestHandlers) {
10
+ if (!(requestHandler.id in queries)) {
11
+ throw Error(`No query provided for request handler ${requestHandler.id}`);
12
+ }
13
+ const handlerQueries = [queries[requestHandler.id]].flat(1);
14
+ for (const query of handlerQueries) {
15
+ const requestPropsWithoutHandlerDetails = {
16
+ ...query?.request,
17
+ ...queriesShared?.request,
18
+ };
19
+ const request = {
20
+ source: source.id,
21
+ queryType: requestHandler.id,
22
+ ...requestPropsWithoutHandlerDetails,
23
+ };
24
+ const timeout = query.timeout ?? queriesShared?.timeout;
25
+ const formattedQuery = JSON.stringify(requestPropsWithoutHandlerDetails, null, 2).replace(/\n\s*/g, " ");
26
+ const testName = query.testName ??
27
+ queriesShared?.testName ??
28
+ `Run query "${requestHandler.displayName}" with: ${formattedQuery}`;
29
+ const expectError = query.expectError ?? queriesShared?.expectError;
30
+ const skip = query.skip ?? queriesShared?.skip;
31
+ if (skip) {
32
+ const message = typeof skip === "string"
33
+ ? `SKIPPED: ${testName} — ${skip}`
34
+ : `SKIPPED: ${testName}`;
35
+ console.warn(message);
36
+ test.skip(testName, () => { });
37
+ continue;
38
+ }
39
+ test(testName, async () => {
40
+ const beforeCallbacks = [query?.before, queriesShared?.before];
41
+ for (const before of beforeCallbacks) {
42
+ await before?.();
43
+ }
44
+ const numOfPagesToLoad = query.numOfPagesToLoad ?? 1;
45
+ const numOfPagesToExpect = query.numOfPagesToExpect ?? numOfPagesToLoad;
46
+ // biome-ignore lint/suspicious/noExplicitAny: type narrowing helper needs any for constructor check
47
+ const isPlainObject = (value) => value?.constructor === Object || Array.isArray(value);
48
+ const deepMergeOptions = {
49
+ isMergeableObject: isPlainObject,
50
+ };
51
+ const mediaQuery = await createLiaseQuery({
52
+ request,
53
+ queryOptions: deepmerge.all([
54
+ {
55
+ cacheNetworkRequests: "always",
56
+ },
57
+ queriesShared?.queryOptions || {},
58
+ query?.queryOptions || {},
59
+ {
60
+ secrets: {
61
+ ...(await getSecrets(request)),
62
+ },
63
+ },
64
+ ], deepMergeOptions),
65
+ finderOptions: deepmerge.all([queriesShared?.finderOptions || {}, query?.finderOptions || {}], deepMergeOptions),
66
+ });
67
+ const responses = [];
68
+ let customResponseTestExpectedAssertions = 0;
69
+ if (expectError) {
70
+ expect.assertions(1);
71
+ expect(() => mediaQuery.getNext()).rejects.toThrowError(expectError);
72
+ return;
73
+ }
74
+ for (let i = 0; i < numOfPagesToLoad; i++) {
75
+ const response = await mediaQuery.getNext();
76
+ responses.push(response);
77
+ if (i + 1 < numOfPagesToExpect) {
78
+ // If we're expecting more pages then isLastPage should not be "true"
79
+ expect(response?.page?.isLastPage, `Expected to receive another response after ${getOrdinal(i + 1)} but page.isLastPage is set to "true"`).not.toBe(true);
80
+ }
81
+ else if (numOfPagesToExpect < numOfPagesToLoad) {
82
+ // If this is the last expected page of content but we've explicitly requested to load more pages after this
83
+ // assume that this is the last page and thus isLastPage should not be "false"
84
+ expect(response?.page?.isLastPage, `Expected to not receive another response after ${getOrdinal(i + 1)} but page.isLastPage is set to "false"`).not.toBe(false);
85
+ }
86
+ else {
87
+ // It's easy to calculate the number of expected assertions if we include this dummy assertion
88
+ expect(true).toBe(true);
89
+ }
90
+ if (i < numOfPagesToExpect) {
91
+ expect(response, `Expected a response for the ${getOrdinal(i + 1)} request but response was null`).not.toBe(null);
92
+ }
93
+ else {
94
+ expect(response, `Expected null as the response for the ${getOrdinal(i + 1)} request`).toBe(null);
95
+ }
96
+ const customResponseChecks = [
97
+ ...(query?.checkResponse ? [query?.checkResponse] : []),
98
+ ...(queriesShared?.checkResponse
99
+ ? [queriesShared?.checkResponse]
100
+ : []),
101
+ ];
102
+ for (const checkResponse of customResponseChecks) {
103
+ const result = checkResponse(response, {
104
+ message: `The response for the ${getOrdinal(i + 1)} request was not what was expected`,
105
+ pageLoadNum: i,
106
+ });
107
+ customResponseTestExpectedAssertions +=
108
+ typeof result === "number" ? result : 1;
109
+ }
110
+ if (!query.duplicateMediaPossible) {
111
+ const idsOfMedia = (response?.media || [])
112
+ .filter((media) => media)
113
+ .map((media) => media.id);
114
+ expect(idsOfMedia).toSatisfy(hasNoDuplicates, `Media with the same ID appears in single response: ${getDuplicates(idsOfMedia).join(",")}`);
115
+ }
116
+ }
117
+ const customAllResponsesChecks = [
118
+ ...(query?.checkAllResponses ? [query?.checkAllResponses] : []),
119
+ ...(queriesShared?.checkAllResponses
120
+ ? [queriesShared?.checkAllResponses]
121
+ : []),
122
+ ];
123
+ for (const checkAllResponses of customAllResponsesChecks) {
124
+ const result = checkAllResponses(responses, {
125
+ message: "The responses were not as expected",
126
+ });
127
+ customResponseTestExpectedAssertions +=
128
+ typeof result === "number" ? result : 1;
129
+ }
130
+ if (!query.duplicateMediaPossible) {
131
+ const idsOfMedia = responses
132
+ .flatMap((response) => response?.media || [])
133
+ .filter((media) => media)
134
+ .map((media) => media.id);
135
+ expect(idsOfMedia).toSatisfy(hasNoDuplicates, `Media with the same ID appears in multiple responses: ${getDuplicates(idsOfMedia).join(",")}`);
136
+ }
137
+ expect.assertions(numOfPagesToLoad * 2 +
138
+ (query.duplicateMediaPossible ? 0 : numOfPagesToLoad + 1) +
139
+ customResponseTestExpectedAssertions);
140
+ }, timeout);
141
+ }
142
+ }
143
+ }
144
+ // Some values in a response may naturally change over time
145
+ // or be differ based on other factors like a client's ip.
146
+ // This can result in the tests failing due to a response
147
+ // not matching its snapshot even though this difference may
148
+ // not indicate any problem. To avoid this we first normalise
149
+ // any parts of a response which may naturally vary before we
150
+ // snapshot it.
151
+ export function normaliseResponse(response) {
152
+ const clonedResponse = copy(response);
153
+ for (const media of clonedResponse.media || []) {
154
+ if (media.url) {
155
+ const url = new URL(media.url);
156
+ media.url = url.origin + url.pathname;
157
+ }
158
+ for (const file of media?.files || []) {
159
+ if (file.url) {
160
+ const url = new URL(file.url);
161
+ file.url = url.origin + url.pathname;
162
+ }
163
+ }
164
+ }
165
+ return clonedResponse;
166
+ }
@@ -0,0 +1,16 @@
1
+ import type { LiaseHooks } from "./lib/hooks.js";
2
+ import type { QueryOptions } from "./schemas/queryOptions.js";
3
+ import type { GenericRequest } from "./schemas/request.js";
4
+ import type { RequestHandler } from "./schemas/requestHandler.js";
5
+ import type { GenericSecrets } from "./schemas/secrets.js";
6
+ export type ConstructorExecutionContext = {
7
+ request: GenericRequest;
8
+ secrets: GenericSecrets;
9
+ requestHandler: RequestHandler;
10
+ responseDetails: RequestHandler["responses"][0];
11
+ pageFetchLimitReached?: boolean;
12
+ cacheNetworkRequests?: QueryOptions["cacheNetworkRequests"];
13
+ sourceId: string;
14
+ hooks: LiaseHooks;
15
+ };
16
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,oBAAoB,CAAC,EAAE,YAAY,CAAC,sBAAsB,CAAC,CAAC;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;CACnB,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@liase/core",
3
+ "version": "1.0.0",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "description": "The easiest way to programmatically fetch media content details on the internet",
8
+ "main": "dist/index.js",
9
+ "files": [
10
+ "dist/*"
11
+ ],
12
+ "scripts": {
13
+ "build": "rm -rf ./dist && tsc -p ./tsconfig.dist.json && tsc -p test/tsconfig.dist.json && tsc-alias",
14
+ "watch": "tsc -p ./tsconfig.dist.json --watch",
15
+ "lint": "biome check",
16
+ "lint:fix": "biome check --fix",
17
+ "test": "vitest run",
18
+ "test:watch": "vitest watch",
19
+ "preview": "test/preview/start.sh"
20
+ },
21
+ "keywords": [
22
+ "media"
23
+ ],
24
+ "author": "Callum Gare <callum@gare.au>",
25
+ "license": "MIT",
26
+ "type": "module",
27
+ "dependencies": {
28
+ "@atproto/api": "^0.13.19",
29
+ "@refactorjs/http-proxy": "^0.2.14",
30
+ "cacache": "^19.0.1",
31
+ "chalk": "^5.3.0",
32
+ "cheerio": "^1.0.0",
33
+ "commander": "^12.0.0",
34
+ "deepmerge": "^4.3.1",
35
+ "dotenv-flow": "^4.1.0",
36
+ "entities": "^4.5.0",
37
+ "got-scraping": "^4.0.8",
38
+ "json-stable-stringify": "^1.2.1",
39
+ "mime-types": "^2.1.28",
40
+ "open": "^10.1.0",
41
+ "pluralize": "^8.0.0",
42
+ "tsx": "^4.15.9",
43
+ "type-fest": "^4.23.0",
44
+ "zod": "^3.21.4"
45
+ },
46
+ "devDependencies": {
47
+ "@loopback/http-caching-proxy": "^6.0.3",
48
+ "@tsconfig/node21": "^21.0.3",
49
+ "@types/cacache": "^17.0.2",
50
+ "@types/make-fetch-happen": "^10.0.4",
51
+ "@types/mime-types": "^2.1.1",
52
+ "@types/node": "^22.1.0",
53
+ "@types/pluralize": "^0.0.33",
54
+ "copy-anything": "^4.0.2",
55
+ "semantic-release": "^24.0.0",
56
+ "semantic-release-monorepo": "^8.0.2",
57
+ "tsc-alias": "^1.8.8",
58
+ "typescript": "^5.5.3",
59
+ "vitest": "^1.6.0"
60
+ },
61
+ "optionalDependencies": {
62
+ "fsevents": "^2.3.2"
63
+ },
64
+ "overrides": {
65
+ "conventional-changelog-conventionalcommits": ">= 8.0.0"
66
+ }
67
+ }