@inlang/sdk
Advanced tools
Comparing version 0.19.0 to 0.20.0
@@ -1,9 +0,8 @@ | ||
import type { InlangProject, InstalledMessageLintRule } from "./api.js"; | ||
import type { InlangProject, InstalledMessageLintRule, MessageQueryApi } from "./api.js"; | ||
import type { ProjectSettings } from "@inlang/project-settings"; | ||
import type { resolveModules } from "./resolve-modules/index.js"; | ||
import type { Message } from "./versionedInterfaces.js"; | ||
/** | ||
* Creates a reactive query API for messages. | ||
*/ | ||
export declare function createMessageLintReportsQuery(messages: () => Array<Message> | undefined, settings: () => ProjectSettings, installedMessageLintRules: () => Array<InstalledMessageLintRule>, resolvedModules: () => Awaited<ReturnType<typeof resolveModules>> | undefined): InlangProject["query"]["messageLintReports"]; | ||
export declare function createMessageLintReportsQuery(messagesQuery: MessageQueryApi, settings: () => ProjectSettings, installedMessageLintRules: () => Array<InstalledMessageLintRule>, resolvedModules: () => Awaited<ReturnType<typeof resolveModules>> | undefined, hasWatcher: boolean): InlangProject["query"]["messageLintReports"]; | ||
//# sourceMappingURL=createMessageLintReportsQuery.d.ts.map |
@@ -1,32 +0,53 @@ | ||
import { createEffect } from "./reactivity/solid.js"; | ||
import { createSubscribable } from "./loadProject.js"; | ||
import { lintSingleMessage } from "./lint/index.js"; | ||
import { ReactiveMap } from "./reactivity/map.js"; | ||
import { debounce } from "throttle-debounce"; | ||
import { createEffect } from "./reactivity/solid.js"; | ||
/** | ||
* Creates a reactive query API for messages. | ||
*/ | ||
export function createMessageLintReportsQuery(messages, settings, installedMessageLintRules, resolvedModules) { | ||
export function createMessageLintReportsQuery(messagesQuery, settings, installedMessageLintRules, resolvedModules, hasWatcher) { | ||
// @ts-expect-error | ||
const index = new ReactiveMap(); | ||
const modules = resolvedModules(); | ||
const rulesArray = modules?.messageLintRules; | ||
const messageLintRuleLevels = Object.fromEntries(installedMessageLintRules().map((rule) => [rule.id, rule.level])); | ||
const settingsObject = () => { | ||
return { | ||
...settings(), | ||
messageLintRuleLevels, | ||
}; | ||
}; | ||
const messages = messagesQuery.getAll(); | ||
createEffect(() => { | ||
const modules = resolvedModules(); | ||
const _messages = messages(); | ||
const _settings = settings(); | ||
if (_messages && _settings && modules) { | ||
// index.clear() | ||
for (const message of _messages) { | ||
// TODO: only lint changed messages and update arrays selectively | ||
lintSingleMessage({ | ||
rules: modules.messageLintRules, | ||
settings: { | ||
..._settings, | ||
messageLintRuleLevels: Object.fromEntries(installedMessageLintRules().map((rule) => [rule.id, rule.level])), | ||
}, | ||
messages: _messages, | ||
message: message, | ||
}).then((report) => { | ||
if (report.errors.length === 0 && | ||
JSON.stringify(index.get(message.id)) !== JSON.stringify(report.data)) { | ||
index.set(message.id, report.data || []); | ||
if (rulesArray) { | ||
for (const messageId of messagesQuery.includedMessageIds()) { | ||
createEffect(() => { | ||
const message = messagesQuery.get({ where: { id: messageId } }); | ||
if (hasWatcher) { | ||
lintSingleMessage({ | ||
rules: rulesArray, | ||
settings: settingsObject(), | ||
messages: messages, | ||
message: message, | ||
}).then((report) => { | ||
if (report.errors.length === 0 && index.get(messageId) !== report.data) { | ||
index.set(messageId, report.data); | ||
} | ||
}); | ||
} | ||
else { | ||
debounce(500, (message) => { | ||
lintSingleMessage({ | ||
rules: rulesArray, | ||
settings: settingsObject(), | ||
messages: messages, | ||
message: message, | ||
}).then((report) => { | ||
if (report.errors.length === 0 && index.get(messageId) !== report.data) { | ||
index.set(messageId, report.data); | ||
} | ||
}); | ||
}, { atBegin: false })(message); | ||
} | ||
}); | ||
@@ -33,0 +54,0 @@ } |
@@ -9,2 +9,3 @@ /** | ||
export { loadProject } from "./loadProject.js"; | ||
export { listProjects } from "./listProjects.js"; | ||
export { solidAdapter, type InlangProjectWithSolidAdapter } from "./adapter/solidAdapter.js"; | ||
@@ -11,0 +12,0 @@ export { createMessagesQuery } from "./createMessagesQuery.js"; |
@@ -8,2 +8,3 @@ /** | ||
export { loadProject } from "./loadProject.js"; | ||
export { listProjects } from "./listProjects.js"; | ||
export { solidAdapter } from "./adapter/solidAdapter.js"; | ||
@@ -10,0 +11,0 @@ export { createMessagesQuery } from "./createMessagesQuery.js"; |
import type { InlangProject, Subscribable } from "./api.js"; | ||
import { type ImportFunction } from "./resolve-modules/index.js"; | ||
import { type NodeishFilesystem } from "@lix-js/fs"; | ||
import type { Repository } from "@lix-js/client"; | ||
/** | ||
@@ -16,2 +17,3 @@ * Creates an inlang instance. | ||
projectPath: string; | ||
repo?: Repository | undefined; | ||
nodeishFs: NodeishFilesystem; | ||
@@ -18,0 +20,0 @@ _import?: ImportFunction | undefined; |
@@ -16,2 +16,3 @@ import { resolveModules } from "./resolve-modules/index.js"; | ||
import { maybeMigrateToDirectory } from "./migrations/migrateToDirectory.js"; | ||
import { generateProjectId } from "./generateProjectId.js"; | ||
const settingsCompiler = TypeCompiler.Compile(ProjectSettings); | ||
@@ -43,2 +44,3 @@ /** | ||
// -- load project ------------------------------------------------------ | ||
let idError; | ||
return await createRoot(async () => { | ||
@@ -50,5 +52,31 @@ const [initialized, markInitAsComplete, markInitAsFailed] = createAwaitable(); | ||
}); | ||
let projectId; | ||
try { | ||
projectId = await nodeishFs.readFile(projectPath + "/project_id", { | ||
encoding: "utf-8", | ||
}); | ||
} | ||
catch (error) { | ||
// @ts-ignore | ||
if (error.code === "ENOENT") { | ||
if (args.repo) { | ||
projectId = await generateProjectId(args.repo, projectPath); | ||
if (projectId) { | ||
await nodeishFs.writeFile(projectPath + "/project_id", projectId); | ||
} | ||
} | ||
} | ||
else { | ||
idError = error; | ||
} | ||
} | ||
// -- settings ------------------------------------------------------------ | ||
const [settings, _setSettings] = createSignal(); | ||
createEffect(() => { | ||
// TODO: | ||
// if (projectId) { | ||
// telemetryBrowser.group("project", projectId, { | ||
// name: projectId, | ||
// }) | ||
// } | ||
loadSettings({ settingsFilePath: projectPath + "/settings.json", nodeishFs }) | ||
@@ -59,3 +87,3 @@ .then((settings) => { | ||
const project_settings = settings; | ||
args._capture?.("SDK used settings", { project_settings }); | ||
args._capture?.("SDK used settings", { project_settings, group: projectId }); | ||
}) | ||
@@ -97,7 +125,6 @@ .catch((err) => { | ||
createEffect(() => (settingsValue = settings())); // workaround to not run effects twice (e.g. settings change + modules change) (I'm sure there exists a solid way of doing this, but I haven't found it yet) | ||
// please don't use this as source of truth, use the query instead | ||
// needed for granular linting | ||
const [messages, setMessages] = createSignal(); | ||
createEffect(() => { | ||
const conf = settings(); | ||
if (!conf) | ||
return; | ||
const _resolvedModules = resolvedModules(); | ||
@@ -156,4 +183,6 @@ if (!_resolvedModules) | ||
const initializeError = await initialized.catch((error) => error); | ||
const abortController = new AbortController(); | ||
const hasWatcher = nodeishFs.watch("/", { signal: abortController.signal }) !== undefined; | ||
const messagesQuery = createMessagesQuery(() => messages() || []); | ||
const lintReportsQuery = createMessageLintReportsQuery(messages, settings, installedMessageLintRules, resolvedModules); | ||
const lintReportsQuery = createMessageLintReportsQuery(messagesQuery, settings, installedMessageLintRules, resolvedModules, hasWatcher); | ||
const debouncedSave = skipFirst(debounce(500, async (newMessages) => { | ||
@@ -176,3 +205,3 @@ try { | ||
JSON.stringify(newMessages) !== JSON.stringify(messages()) && | ||
nodeishFs.watch("/", { signal: abortController.signal }) === undefined) { | ||
nodeishFs.watch("/", { signal: abortController.signal }) !== undefined) { | ||
setMessages(newMessages); | ||
@@ -191,2 +220,3 @@ } | ||
...(initializeError ? [initializeError] : []), | ||
...(idError ? [idError] : []), | ||
...(resolvedModules() ? resolvedModules().errors : []), | ||
@@ -193,0 +223,0 @@ // have a query error exposed |
@@ -8,2 +8,3 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ | ||
import { tryCatch } from "@inlang/result"; | ||
import { mockRepo } from "@lix-js/client"; | ||
// ------------------------------------------------------------------------------------------------ | ||
@@ -126,2 +127,50 @@ const getValue = (subscribable) => { | ||
}); | ||
it("should generate projectId on missing projectid", async () => { | ||
const repo = await mockRepo(); | ||
const existing = await repo.nodeishFs | ||
.readFile("/project.inlang/project_id", { | ||
encoding: "utf-8", | ||
}) | ||
.catch((error) => { | ||
return { error }; | ||
}); | ||
// @ts-ignore | ||
expect(existing.error.code).toBe("ENOENT"); | ||
const result = await tryCatch(() => loadProject({ | ||
projectPath: "/project.inlang", | ||
nodeishFs: repo.nodeishFs, | ||
repo, | ||
_import, | ||
})); | ||
const newId = await repo.nodeishFs | ||
.readFile("/project.inlang/project_id", { | ||
encoding: "utf-8", | ||
}) | ||
.catch((error) => { | ||
return { error }; | ||
}); | ||
expect(newId).toBe("7cd6c2b7cf12febf99496408917123fdfe158b6bc442914f5fb42aa74346bd50"); | ||
expect(result.error).toBeUndefined(); | ||
expect(result.data).toBeDefined(); | ||
}); | ||
it("should reuse projectId on existing projectid", async () => { | ||
const repo = await mockRepo(); | ||
repo.nodeishFs.writeFile("/project.inlang/project_id", "testId"); | ||
const result = await tryCatch(() => loadProject({ | ||
projectPath: "/project.inlang", | ||
nodeishFs: repo.nodeishFs, | ||
repo, | ||
_import, | ||
})); | ||
const newId = await repo.nodeishFs | ||
.readFile("/project.inlang/project_id", { | ||
encoding: "utf-8", | ||
}) | ||
.catch((error) => { | ||
return { error }; | ||
}); | ||
expect(newId).toBe("testId"); | ||
expect(result.error).toBeUndefined(); | ||
expect(result.data).toBeDefined(); | ||
}); | ||
it("should resolve from a windows path", async () => { | ||
@@ -128,0 +177,0 @@ const fs = createNodeishMemoryFs(); |
{ | ||
"name": "@inlang/sdk", | ||
"type": "module", | ||
"version": "0.19.0", | ||
"version": "0.20.0", | ||
"license": "Apache-2.0", | ||
@@ -24,16 +24,17 @@ "publishConfig": { | ||
"@sinclair/typebox": "^0.31.17", | ||
"dedent": "1.5.1", | ||
"deepmerge-ts": "^5.1.0", | ||
"solid-js": "1.6.12", | ||
"throttle-debounce": "5.0.0", | ||
"dedent": "1.5.1", | ||
"throttle-debounce": "^5.0.0", | ||
"@inlang/json-types": "1.1.0", | ||
"@inlang/message": "2.0.0", | ||
"@inlang/language-tag": "1.2.0", | ||
"@inlang/message-lint-rule": "1.4.0", | ||
"@inlang/translatable": "1.2.0", | ||
"@inlang/plugin": "2.4.0", | ||
"@inlang/module": "1.2.0", | ||
"@inlang/language-tag": "1.2.0", | ||
"@inlang/message": "2.0.0", | ||
"@inlang/plugin": "2.4.0", | ||
"@inlang/project-settings": "2.2.0", | ||
"@inlang/result": "1.1.0", | ||
"@inlang/project-settings": "2.2.0", | ||
"@lix-js/fs": "0.4.0" | ||
"@lix-js/fs": "0.4.0", | ||
"@lix-js/client": "0.2.0", | ||
"@inlang/translatable": "1.2.0" | ||
}, | ||
@@ -40,0 +41,0 @@ "devDependencies": { |
@@ -16,2 +16,2 @@ Developer-first localization infrastructure that is built on git. Your git repository is the single source of truth for localization for collaboration and automation. | ||
The core module bundles "sdk" modules that depend on each other and is everything one needs to build [plugins](https://inlang.com/documentation/plugin) or entire [apps](https://inlang.com/documentation/develop-app) on inlang. | ||
The core module bundles "sdk" modules that depend on each other and is everything one needs to build [plugins](https://inlang.com/documentation/plugin) or entire [apps](https://inlang.com/documentation/build-app) on inlang. |
@@ -1,4 +0,8 @@ | ||
import { createEffect } from "./reactivity/solid.js" | ||
import { createSubscribable } from "./loadProject.js" | ||
import type { InlangProject, InstalledMessageLintRule, MessageLintReportsQueryApi } from "./api.js" | ||
import type { | ||
InlangProject, | ||
InstalledMessageLintRule, | ||
MessageLintReportsQueryApi, | ||
MessageQueryApi, | ||
} from "./api.js" | ||
import type { ProjectSettings } from "@inlang/project-settings" | ||
@@ -9,2 +13,4 @@ import type { resolveModules } from "./resolve-modules/index.js" | ||
import { ReactiveMap } from "./reactivity/map.js" | ||
import { debounce } from "throttle-debounce" | ||
import { createEffect } from "./reactivity/solid.js" | ||
@@ -15,6 +21,7 @@ /** | ||
export function createMessageLintReportsQuery( | ||
messages: () => Array<Message> | undefined, | ||
messagesQuery: MessageQueryApi, | ||
settings: () => ProjectSettings, | ||
installedMessageLintRules: () => Array<InstalledMessageLintRule>, | ||
resolvedModules: () => Awaited<ReturnType<typeof resolveModules>> | undefined | ||
resolvedModules: () => Awaited<ReturnType<typeof resolveModules>> | undefined, | ||
hasWatcher: boolean | ||
): InlangProject["query"]["messageLintReports"] { | ||
@@ -24,28 +31,50 @@ // @ts-expect-error | ||
createEffect(() => { | ||
const modules = resolvedModules() | ||
const _messages = messages() | ||
const _settings = settings() | ||
const modules = resolvedModules() | ||
if (_messages && _settings && modules) { | ||
// index.clear() | ||
for (const message of _messages) { | ||
// TODO: only lint changed messages and update arrays selectively | ||
const rulesArray = modules?.messageLintRules | ||
const messageLintRuleLevels = Object.fromEntries( | ||
installedMessageLintRules().map((rule) => [rule.id, rule.level]) | ||
) | ||
const settingsObject = () => { | ||
return { | ||
...settings(), | ||
messageLintRuleLevels, | ||
} | ||
} | ||
lintSingleMessage({ | ||
rules: modules.messageLintRules, | ||
settings: { | ||
..._settings, | ||
messageLintRuleLevels: Object.fromEntries( | ||
installedMessageLintRules().map((rule) => [rule.id, rule.level]) | ||
), | ||
}, | ||
messages: _messages, | ||
message: message, | ||
}).then((report) => { | ||
if ( | ||
report.errors.length === 0 && | ||
JSON.stringify(index.get(message.id)) !== JSON.stringify(report.data) | ||
) { | ||
index.set(message.id, report.data || []) | ||
const messages = messagesQuery.getAll() as Message[] | ||
createEffect(() => { | ||
if (rulesArray) { | ||
for (const messageId of messagesQuery.includedMessageIds()) { | ||
createEffect(() => { | ||
const message = messagesQuery.get({ where: { id: messageId } }) | ||
if (hasWatcher) { | ||
lintSingleMessage({ | ||
rules: rulesArray, | ||
settings: settingsObject(), | ||
messages: messages, | ||
message: message, | ||
}).then((report) => { | ||
if (report.errors.length === 0 && index.get(messageId) !== report.data) { | ||
index.set(messageId, report.data) | ||
} | ||
}) | ||
} else { | ||
debounce( | ||
500, | ||
(message) => { | ||
lintSingleMessage({ | ||
rules: rulesArray, | ||
settings: settingsObject(), | ||
messages: messages, | ||
message: message, | ||
}).then((report) => { | ||
if (report.errors.length === 0 && index.get(messageId) !== report.data) { | ||
index.set(messageId, report.data) | ||
} | ||
}) | ||
}, | ||
{ atBegin: false } | ||
)(message) | ||
} | ||
@@ -52,0 +81,0 @@ }) |
@@ -16,2 +16,3 @@ /** | ||
export { loadProject } from "./loadProject.js" | ||
export { listProjects } from "./listProjects.js" | ||
export { solidAdapter, type InlangProjectWithSolidAdapter } from "./adapter/solidAdapter.js" | ||
@@ -18,0 +19,0 @@ export { createMessagesQuery } from "./createMessagesQuery.js" |
@@ -22,2 +22,3 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ | ||
import { tryCatch } from "@inlang/result" | ||
import { mockRepo } from "@lix-js/client" | ||
@@ -163,2 +164,67 @@ // ------------------------------------------------------------------------------------------------ | ||
it("should generate projectId on missing projectid", async () => { | ||
const repo = await mockRepo() | ||
const existing = await repo.nodeishFs | ||
.readFile("/project.inlang/project_id", { | ||
encoding: "utf-8", | ||
}) | ||
.catch((error) => { | ||
return { error } | ||
}) | ||
// @ts-ignore | ||
expect(existing.error.code).toBe("ENOENT") | ||
const result = await tryCatch(() => | ||
loadProject({ | ||
projectPath: "/project.inlang", | ||
nodeishFs: repo.nodeishFs, | ||
repo, | ||
_import, | ||
}) | ||
) | ||
const newId = await repo.nodeishFs | ||
.readFile("/project.inlang/project_id", { | ||
encoding: "utf-8", | ||
}) | ||
.catch((error) => { | ||
return { error } | ||
}) | ||
expect(newId).toBe("7cd6c2b7cf12febf99496408917123fdfe158b6bc442914f5fb42aa74346bd50") | ||
expect(result.error).toBeUndefined() | ||
expect(result.data).toBeDefined() | ||
}) | ||
it("should reuse projectId on existing projectid", async () => { | ||
const repo = await mockRepo() | ||
repo.nodeishFs.writeFile("/project.inlang/project_id", "testId") | ||
const result = await tryCatch(() => | ||
loadProject({ | ||
projectPath: "/project.inlang", | ||
nodeishFs: repo.nodeishFs, | ||
repo, | ||
_import, | ||
}) | ||
) | ||
const newId = await repo.nodeishFs | ||
.readFile("/project.inlang/project_id", { | ||
encoding: "utf-8", | ||
}) | ||
.catch((error) => { | ||
return { error } | ||
}) | ||
expect(newId).toBe("testId") | ||
expect(result.error).toBeUndefined() | ||
expect(result.data).toBeDefined() | ||
}) | ||
it("should resolve from a windows path", async () => { | ||
@@ -696,3 +762,2 @@ const fs = createNodeishMemoryFs() | ||
}, | ||
{ | ||
@@ -699,0 +764,0 @@ languageTag: "de", |
@@ -30,2 +30,4 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ | ||
import { maybeMigrateToDirectory } from "./migrations/migrateToDirectory.js" | ||
import type { Repository } from "@lix-js/client" | ||
import { generateProjectId } from "./generateProjectId.js" | ||
@@ -46,2 +48,3 @@ const settingsCompiler = TypeCompiler.Compile(ProjectSettings) | ||
projectPath: string | ||
repo?: Repository | ||
nodeishFs: NodeishFilesystem | ||
@@ -75,2 +78,3 @@ _import?: ImportFunction | ||
// -- load project ------------------------------------------------------ | ||
let idError: Error | undefined | ||
return await createRoot(async () => { | ||
@@ -83,2 +87,22 @@ const [initialized, markInitAsComplete, markInitAsFailed] = createAwaitable() | ||
let projectId: string | undefined | ||
try { | ||
projectId = await nodeishFs.readFile(projectPath + "/project_id", { | ||
encoding: "utf-8", | ||
}) | ||
} catch (error) { | ||
// @ts-ignore | ||
if (error.code === "ENOENT") { | ||
if (args.repo) { | ||
projectId = await generateProjectId(args.repo, projectPath) | ||
if (projectId) { | ||
await nodeishFs.writeFile(projectPath + "/project_id", projectId) | ||
} | ||
} | ||
} else { | ||
idError = error as Error | ||
} | ||
} | ||
// -- settings ------------------------------------------------------------ | ||
@@ -88,2 +112,9 @@ | ||
createEffect(() => { | ||
// TODO: | ||
// if (projectId) { | ||
// telemetryBrowser.group("project", projectId, { | ||
// name: projectId, | ||
// }) | ||
// } | ||
loadSettings({ settingsFilePath: projectPath + "/settings.json", nodeishFs }) | ||
@@ -94,3 +125,3 @@ .then((settings) => { | ||
const project_settings = settings | ||
args._capture?.("SDK used settings", { project_settings }) | ||
args._capture?.("SDK used settings", { project_settings, group: projectId }) | ||
}) | ||
@@ -146,8 +177,7 @@ .catch((err) => { | ||
// please don't use this as source of truth, use the query instead | ||
// needed for granular linting | ||
const [messages, setMessages] = createSignal<Message[]>() | ||
createEffect(() => { | ||
const conf = settings() | ||
if (!conf) return | ||
const _resolvedModules = resolvedModules() | ||
@@ -220,8 +250,12 @@ if (!_resolvedModules) return | ||
const abortController = new AbortController() | ||
const hasWatcher = nodeishFs.watch("/", { signal: abortController.signal }) !== undefined | ||
const messagesQuery = createMessagesQuery(() => messages() || []) | ||
const lintReportsQuery = createMessageLintReportsQuery( | ||
messages, | ||
messagesQuery, | ||
settings as () => ProjectSettings, | ||
installedMessageLintRules, | ||
resolvedModules | ||
resolvedModules, | ||
hasWatcher | ||
) | ||
@@ -249,3 +283,3 @@ | ||
JSON.stringify(newMessages) !== JSON.stringify(messages()) && | ||
nodeishFs.watch("/", { signal: abortController.signal }) === undefined | ||
nodeishFs.watch("/", { signal: abortController.signal }) !== undefined | ||
) { | ||
@@ -270,2 +304,3 @@ setMessages(newMessages) | ||
...(initializeError ? [initializeError] : []), | ||
...(idError ? [idError] : []), | ||
...(resolvedModules() ? resolvedModules()!.errors : []), | ||
@@ -272,0 +307,0 @@ // have a query error exposed |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
414357
230
10622
16
+ Added@lix-js/client@0.2.0
+ Added@lix-js/client@0.2.0(transitive)
+ Added@octokit/app@14.1.0(transitive)
+ Added@octokit/auth-app@6.1.3(transitive)
+ Added@octokit/auth-oauth-app@7.1.0(transitive)
+ Added@octokit/auth-oauth-device@6.1.0(transitive)
+ Added@octokit/auth-oauth-user@4.1.0(transitive)
+ Added@octokit/auth-token@4.0.0(transitive)
+ Added@octokit/auth-unauthenticated@5.0.1(transitive)
+ Added@octokit/core@5.2.0(transitive)
+ Added@octokit/endpoint@9.0.6(transitive)
+ Added@octokit/graphql@7.1.1(transitive)
+ Added@octokit/oauth-app@6.1.0(transitive)
+ Added@octokit/oauth-authorization-url@6.0.2(transitive)
+ Added@octokit/oauth-methods@4.1.0(transitive)
+ Added@octokit/openapi-types@18.1.120.0.023.0.1(transitive)
+ Added@octokit/plugin-paginate-graphql@4.0.1(transitive)
+ Added@octokit/plugin-paginate-rest@8.0.09.2.2(transitive)
+ Added@octokit/plugin-rest-endpoint-methods@9.0.0(transitive)
+ Added@octokit/plugin-retry@6.1.0(transitive)
+ Added@octokit/plugin-throttling@7.0.0(transitive)
+ Added@octokit/request@8.4.1(transitive)
+ Added@octokit/request-error@5.1.1(transitive)
+ Added@octokit/types@11.1.012.6.013.8.0(transitive)
+ Added@octokit/webhooks@12.3.1(transitive)
+ Added@octokit/webhooks-methods@4.1.0(transitive)
+ Added@octokit/webhooks-types@7.6.1(transitive)
+ Added@types/aws-lambda@8.10.147(transitive)
+ Added@types/btoa-lite@1.0.2(transitive)
+ Added@types/jsonwebtoken@9.0.9(transitive)
+ Added@types/ms@2.1.0(transitive)
+ Added@types/node@22.13.5(transitive)
+ Added@wolfy1339/lru-cache@11.0.2-patch.1(transitive)
+ Addedaggregate-error@3.1.0(transitive)
+ Addedasync-lock@1.4.1(transitive)
+ Addedbefore-after-hook@2.2.3(transitive)
+ Addedbottleneck@2.19.5(transitive)
+ Addedbtoa-lite@1.0.0(transitive)
+ Addedbuffer-equal-constant-time@1.0.1(transitive)
+ Addedclean-git-ref@2.0.1(transitive)
+ Addedclean-stack@2.2.0(transitive)
+ Addedcrc-32@1.2.2(transitive)
+ Addeddecompress-response@6.0.0(transitive)
+ Addeddeprecation@2.3.1(transitive)
+ Addeddiff3@0.0.3(transitive)
+ Addedecdsa-sig-formatter@1.0.11(transitive)
+ Addedignore@5.3.2(transitive)
+ Addedindent-string@4.0.0(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedisomorphic-git@1.24.5(transitive)
+ Addedjsonwebtoken@9.0.2(transitive)
+ Addedjwa@1.4.1(transitive)
+ Addedjws@3.2.2(transitive)
+ Addedlodash.includes@4.3.0(transitive)
+ Addedlodash.isboolean@3.0.3(transitive)
+ Addedlodash.isinteger@4.0.4(transitive)
+ Addedlodash.isnumber@3.0.3(transitive)
+ Addedlodash.isplainobject@4.0.6(transitive)
+ Addedlodash.isstring@4.0.1(transitive)
+ Addedlodash.once@4.1.1(transitive)
+ Addedmimic-response@3.1.0(transitive)
+ Addedminimist@1.2.8(transitive)
+ Addedminimisted@2.0.1(transitive)
+ Addedms@2.1.3(transitive)
+ Addedoctokit@3.1.0(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedpako@1.0.11(transitive)
+ Addedpify@4.0.1(transitive)
+ Addedreadable-stream@3.6.2(transitive)
+ Addedsafe-buffer@5.2.1(transitive)
+ Addedsemver@7.7.1(transitive)
+ Addedseroval@0.5.1(transitive)
+ Addedsha.js@2.4.11(transitive)
+ Addedsimple-concat@1.0.1(transitive)
+ Addedsimple-get@4.0.1(transitive)
+ Addedsolid-js@1.7.11(transitive)
+ Addedstring_decoder@1.3.0(transitive)
+ Addedthrottle-debounce@5.0.2(transitive)
+ Addedundici-types@6.20.0(transitive)
+ Addeduniversal-github-app-jwt@1.2.0(transitive)
+ Addeduniversal-user-agent@6.0.1(transitive)
+ Addedutil-deprecate@1.0.2(transitive)
+ Addedwrappy@1.0.2(transitive)
- Removedthrottle-debounce@5.0.0(transitive)
Updatedthrottle-debounce@^5.0.0