@erode-app/core 0.6.0-beta.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/dist/adapters/adapter-factory.d.ts +3 -0
- package/dist/adapters/adapter-factory.d.ts.map +1 -0
- package/dist/adapters/adapter-factory.js +19 -0
- package/dist/adapters/adapter-factory.js.map +1 -0
- package/dist/adapters/adapter-metadata.d.ts +12 -0
- package/dist/adapters/adapter-metadata.d.ts.map +1 -0
- package/dist/adapters/adapter-metadata.js +2 -0
- package/dist/adapters/adapter-metadata.js.map +1 -0
- package/dist/adapters/architecture-adapter.d.ts +42 -0
- package/dist/adapters/architecture-adapter.d.ts.map +1 -0
- package/dist/adapters/architecture-adapter.js +2 -0
- package/dist/adapters/architecture-adapter.js.map +1 -0
- package/dist/adapters/architecture-types.d.ts +32 -0
- package/dist/adapters/architecture-types.d.ts.map +1 -0
- package/dist/adapters/architecture-types.js +2 -0
- package/dist/adapters/architecture-types.js.map +1 -0
- package/dist/adapters/base-patcher.d.ts +38 -0
- package/dist/adapters/base-patcher.d.ts.map +1 -0
- package/dist/adapters/base-patcher.js +266 -0
- package/dist/adapters/base-patcher.js.map +1 -0
- package/dist/adapters/dsl-validation.d.ts +2 -0
- package/dist/adapters/dsl-validation.d.ts.map +1 -0
- package/dist/adapters/dsl-validation.js +24 -0
- package/dist/adapters/dsl-validation.js.map +1 -0
- package/dist/adapters/likec4/adapter.d.ts +37 -0
- package/dist/adapters/likec4/adapter.d.ts.map +1 -0
- package/dist/adapters/likec4/adapter.js +302 -0
- package/dist/adapters/likec4/adapter.js.map +1 -0
- package/dist/adapters/likec4/dsl-validator.d.ts +3 -0
- package/dist/adapters/likec4/dsl-validator.d.ts.map +1 -0
- package/dist/adapters/likec4/dsl-validator.js +22 -0
- package/dist/adapters/likec4/dsl-validator.js.map +1 -0
- package/dist/adapters/likec4/index.d.ts +2 -0
- package/dist/adapters/likec4/index.d.ts.map +1 -0
- package/dist/adapters/likec4/index.js +2 -0
- package/dist/adapters/likec4/index.js.map +1 -0
- package/dist/adapters/likec4/likec4-types.d.ts +7 -0
- package/dist/adapters/likec4/likec4-types.d.ts.map +1 -0
- package/dist/adapters/likec4/likec4-types.js +2 -0
- package/dist/adapters/likec4/likec4-types.js.map +1 -0
- package/dist/adapters/likec4/metadata.d.ts +3 -0
- package/dist/adapters/likec4/metadata.d.ts.map +1 -0
- package/dist/adapters/likec4/metadata.js +30 -0
- package/dist/adapters/likec4/metadata.js.map +1 -0
- package/dist/adapters/likec4/patcher.d.ts +15 -0
- package/dist/adapters/likec4/patcher.d.ts.map +1 -0
- package/dist/adapters/likec4/patcher.js +69 -0
- package/dist/adapters/likec4/patcher.js.map +1 -0
- package/dist/adapters/likec4/version-check.d.ts +11 -0
- package/dist/adapters/likec4/version-check.d.ts.map +1 -0
- package/dist/adapters/likec4/version-check.js +75 -0
- package/dist/adapters/likec4/version-check.js.map +1 -0
- package/dist/adapters/model-patcher.d.ts +49 -0
- package/dist/adapters/model-patcher.d.ts.map +1 -0
- package/dist/adapters/model-patcher.js +15 -0
- package/dist/adapters/model-patcher.js.map +1 -0
- package/dist/adapters/structurizr/adapter.d.ts +39 -0
- package/dist/adapters/structurizr/adapter.d.ts.map +1 -0
- package/dist/adapters/structurizr/adapter.js +372 -0
- package/dist/adapters/structurizr/adapter.js.map +1 -0
- package/dist/adapters/structurizr/dsl-validator.d.ts +3 -0
- package/dist/adapters/structurizr/dsl-validator.d.ts.map +1 -0
- package/dist/adapters/structurizr/dsl-validator.js +26 -0
- package/dist/adapters/structurizr/dsl-validator.js.map +1 -0
- package/dist/adapters/structurizr/index.d.ts +2 -0
- package/dist/adapters/structurizr/index.d.ts.map +1 -0
- package/dist/adapters/structurizr/index.js +2 -0
- package/dist/adapters/structurizr/index.js.map +1 -0
- package/dist/adapters/structurizr/metadata.d.ts +3 -0
- package/dist/adapters/structurizr/metadata.d.ts.map +1 -0
- package/dist/adapters/structurizr/metadata.js +35 -0
- package/dist/adapters/structurizr/metadata.js.map +1 -0
- package/dist/adapters/structurizr/patcher.d.ts +15 -0
- package/dist/adapters/structurizr/patcher.d.ts.map +1 -0
- package/dist/adapters/structurizr/patcher.js +53 -0
- package/dist/adapters/structurizr/patcher.js.map +1 -0
- package/dist/adapters/structurizr/structurizr-cli.d.ts +2 -0
- package/dist/adapters/structurizr/structurizr-cli.d.ts.map +1 -0
- package/dist/adapters/structurizr/structurizr-cli.js +91 -0
- package/dist/adapters/structurizr/structurizr-cli.js.map +1 -0
- package/dist/adapters/structurizr/structurizr-types.d.ts +3 -0
- package/dist/adapters/structurizr/structurizr-types.d.ts.map +1 -0
- package/dist/adapters/structurizr/structurizr-types.js +2 -0
- package/dist/adapters/structurizr/structurizr-types.js.map +1 -0
- package/dist/adapters/url-utils.d.ts +3 -0
- package/dist/adapters/url-utils.d.ts.map +1 -0
- package/dist/adapters/url-utils.js +53 -0
- package/dist/adapters/url-utils.js.map +1 -0
- package/dist/analysis/analysis-types.d.ts +152 -0
- package/dist/analysis/analysis-types.d.ts.map +1 -0
- package/dist/analysis/analysis-types.js +2 -0
- package/dist/analysis/analysis-types.js.map +1 -0
- package/dist/analysis/prompt-builder.d.ts +27 -0
- package/dist/analysis/prompt-builder.d.ts.map +1 -0
- package/dist/analysis/prompt-builder.js +159 -0
- package/dist/analysis/prompt-builder.js.map +1 -0
- package/dist/analysis/prompt-variables.d.ts +72 -0
- package/dist/analysis/prompt-variables.d.ts.map +1 -0
- package/dist/analysis/prompt-variables.js +2 -0
- package/dist/analysis/prompt-variables.js.map +1 -0
- package/dist/analysis/prompts/component-selection.md +50 -0
- package/dist/analysis/prompts/dependency-extraction.md +219 -0
- package/dist/analysis/prompts/drift-analysis.md +154 -0
- package/dist/analysis/prompts/model-patch.md +29 -0
- package/dist/analysis/section-formatters.d.ts +54 -0
- package/dist/analysis/section-formatters.d.ts.map +1 -0
- package/dist/analysis/section-formatters.js +95 -0
- package/dist/analysis/section-formatters.js.map +1 -0
- package/dist/analysis/template-engine.d.ts +11 -0
- package/dist/analysis/template-engine.d.ts.map +1 -0
- package/dist/analysis/template-engine.js +64 -0
- package/dist/analysis/template-engine.js.map +1 -0
- package/dist/ci-entry.d.ts +3 -0
- package/dist/ci-entry.d.ts.map +1 -0
- package/dist/ci-entry.js +67 -0
- package/dist/ci-entry.js.map +1 -0
- package/dist/errors.d.ts +60 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +134 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/output/ci-output.d.ts +13 -0
- package/dist/output/ci-output.d.ts.map +1 -0
- package/dist/output/ci-output.js +106 -0
- package/dist/output/ci-output.js.map +1 -0
- package/dist/output/structured-output.d.ts +89 -0
- package/dist/output/structured-output.d.ts.map +1 -0
- package/dist/output/structured-output.js +2 -0
- package/dist/output/structured-output.js.map +1 -0
- package/dist/output.d.ts +73 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +304 -0
- package/dist/output.js.map +1 -0
- package/dist/pipelines/analyze.d.ts +35 -0
- package/dist/pipelines/analyze.d.ts.map +1 -0
- package/dist/pipelines/analyze.js +316 -0
- package/dist/pipelines/analyze.js.map +1 -0
- package/dist/pipelines/check.d.ts +48 -0
- package/dist/pipelines/check.d.ts.map +1 -0
- package/dist/pipelines/check.js +218 -0
- package/dist/pipelines/check.js.map +1 -0
- package/dist/pipelines/components.d.ts +8 -0
- package/dist/pipelines/components.d.ts.map +1 -0
- package/dist/pipelines/components.js +14 -0
- package/dist/pipelines/components.js.map +1 -0
- package/dist/pipelines/connections.d.ts +34 -0
- package/dist/pipelines/connections.d.ts.map +1 -0
- package/dist/pipelines/connections.js +53 -0
- package/dist/pipelines/connections.js.map +1 -0
- package/dist/pipelines/pr-creation.d.ts +30 -0
- package/dist/pipelines/pr-creation.d.ts.map +1 -0
- package/dist/pipelines/pr-creation.js +26 -0
- package/dist/pipelines/pr-creation.js.map +1 -0
- package/dist/pipelines/progress.d.ts +23 -0
- package/dist/pipelines/progress.d.ts.map +1 -0
- package/dist/pipelines/progress.js +22 -0
- package/dist/pipelines/progress.js.map +1 -0
- package/dist/pipelines/publish.d.ts +39 -0
- package/dist/pipelines/publish.d.ts.map +1 -0
- package/dist/pipelines/publish.js +125 -0
- package/dist/pipelines/publish.js.map +1 -0
- package/dist/pipelines/validate.d.ts +24 -0
- package/dist/pipelines/validate.d.ts.map +1 -0
- package/dist/pipelines/validate.js +79 -0
- package/dist/pipelines/validate.js.map +1 -0
- package/dist/platforms/bitbucket/api-client.d.ts +21 -0
- package/dist/platforms/bitbucket/api-client.d.ts.map +1 -0
- package/dist/platforms/bitbucket/api-client.js +98 -0
- package/dist/platforms/bitbucket/api-client.js.map +1 -0
- package/dist/platforms/bitbucket/index.d.ts +3 -0
- package/dist/platforms/bitbucket/index.d.ts.map +1 -0
- package/dist/platforms/bitbucket/index.js +3 -0
- package/dist/platforms/bitbucket/index.js.map +1 -0
- package/dist/platforms/bitbucket/reader.d.ts +9 -0
- package/dist/platforms/bitbucket/reader.d.ts.map +1 -0
- package/dist/platforms/bitbucket/reader.js +119 -0
- package/dist/platforms/bitbucket/reader.js.map +1 -0
- package/dist/platforms/bitbucket/writer.d.ts +15 -0
- package/dist/platforms/bitbucket/writer.d.ts.map +1 -0
- package/dist/platforms/bitbucket/writer.js +172 -0
- package/dist/platforms/bitbucket/writer.js.map +1 -0
- package/dist/platforms/github/index.d.ts +3 -0
- package/dist/platforms/github/index.d.ts.map +1 -0
- package/dist/platforms/github/index.js +3 -0
- package/dist/platforms/github/index.js.map +1 -0
- package/dist/platforms/github/reader.d.ts +9 -0
- package/dist/platforms/github/reader.d.ts.map +1 -0
- package/dist/platforms/github/reader.js +141 -0
- package/dist/platforms/github/reader.js.map +1 -0
- package/dist/platforms/github/writer.d.ts +15 -0
- package/dist/platforms/github/writer.d.ts.map +1 -0
- package/dist/platforms/github/writer.js +225 -0
- package/dist/platforms/github/writer.js.map +1 -0
- package/dist/platforms/gitlab/index.d.ts +3 -0
- package/dist/platforms/gitlab/index.d.ts.map +1 -0
- package/dist/platforms/gitlab/index.js +3 -0
- package/dist/platforms/gitlab/index.js.map +1 -0
- package/dist/platforms/gitlab/reader.d.ts +9 -0
- package/dist/platforms/gitlab/reader.d.ts.map +1 -0
- package/dist/platforms/gitlab/reader.js +136 -0
- package/dist/platforms/gitlab/reader.js.map +1 -0
- package/dist/platforms/gitlab/writer.d.ts +14 -0
- package/dist/platforms/gitlab/writer.d.ts.map +1 -0
- package/dist/platforms/gitlab/writer.js +130 -0
- package/dist/platforms/gitlab/writer.js.map +1 -0
- package/dist/platforms/platform-factory.d.ts +7 -0
- package/dist/platforms/platform-factory.d.ts.map +1 -0
- package/dist/platforms/platform-factory.js +53 -0
- package/dist/platforms/platform-factory.js.map +1 -0
- package/dist/platforms/platform-utils.d.ts +12 -0
- package/dist/platforms/platform-utils.d.ts.map +1 -0
- package/dist/platforms/platform-utils.js +48 -0
- package/dist/platforms/platform-utils.js.map +1 -0
- package/dist/platforms/source-platform.d.ts +117 -0
- package/dist/platforms/source-platform.d.ts.map +1 -0
- package/dist/platforms/source-platform.js +2 -0
- package/dist/platforms/source-platform.js.map +1 -0
- package/dist/providers/ai-provider.d.ts +23 -0
- package/dist/providers/ai-provider.d.ts.map +1 -0
- package/dist/providers/ai-provider.js +2 -0
- package/dist/providers/ai-provider.js.map +1 -0
- package/dist/providers/analysis-phase.d.ts +13 -0
- package/dist/providers/analysis-phase.d.ts.map +1 -0
- package/dist/providers/analysis-phase.js +14 -0
- package/dist/providers/analysis-phase.js.map +1 -0
- package/dist/providers/anthropic/models.d.ts +5 -0
- package/dist/providers/anthropic/models.d.ts.map +1 -0
- package/dist/providers/anthropic/models.js +5 -0
- package/dist/providers/anthropic/models.js.map +1 -0
- package/dist/providers/anthropic/provider.d.ts +12 -0
- package/dist/providers/anthropic/provider.d.ts.map +1 -0
- package/dist/providers/anthropic/provider.js +47 -0
- package/dist/providers/anthropic/provider.js.map +1 -0
- package/dist/providers/base-provider.d.ts +34 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +100 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/gemini/models.d.ts +5 -0
- package/dist/providers/gemini/models.d.ts.map +1 -0
- package/dist/providers/gemini/models.js +5 -0
- package/dist/providers/gemini/models.js.map +1 -0
- package/dist/providers/gemini/provider.d.ts +12 -0
- package/dist/providers/gemini/provider.d.ts.map +1 -0
- package/dist/providers/gemini/provider.js +42 -0
- package/dist/providers/gemini/provider.js.map +1 -0
- package/dist/providers/openai/models.d.ts +5 -0
- package/dist/providers/openai/models.d.ts.map +1 -0
- package/dist/providers/openai/models.js +5 -0
- package/dist/providers/openai/models.js.map +1 -0
- package/dist/providers/openai/provider.d.ts +12 -0
- package/dist/providers/openai/provider.d.ts.map +1 -0
- package/dist/providers/openai/provider.js +49 -0
- package/dist/providers/openai/provider.js.map +1 -0
- package/dist/providers/provider-factory.d.ts +3 -0
- package/dist/providers/provider-factory.d.ts.map +1 -0
- package/dist/providers/provider-factory.js +45 -0
- package/dist/providers/provider-factory.js.map +1 -0
- package/dist/schemas/bitbucket-api.schema.d.ts +52 -0
- package/dist/schemas/bitbucket-api.schema.d.ts.map +1 -0
- package/dist/schemas/bitbucket-api.schema.js +50 -0
- package/dist/schemas/bitbucket-api.schema.js.map +1 -0
- package/dist/schemas/common.schema.d.ts +46 -0
- package/dist/schemas/common.schema.d.ts.map +1 -0
- package/dist/schemas/common.schema.js +67 -0
- package/dist/schemas/common.schema.js.map +1 -0
- package/dist/schemas/dependency-extraction.schema.d.ts +17 -0
- package/dist/schemas/dependency-extraction.schema.d.ts.map +1 -0
- package/dist/schemas/dependency-extraction.schema.js +13 -0
- package/dist/schemas/dependency-extraction.schema.js.map +1 -0
- package/dist/schemas/drift-analysis.schema.d.ts +40 -0
- package/dist/schemas/drift-analysis.schema.d.ts.map +1 -0
- package/dist/schemas/drift-analysis.schema.js +15 -0
- package/dist/schemas/drift-analysis.schema.js.map +1 -0
- package/dist/schemas/gitlab-api.schema.d.ts +33 -0
- package/dist/schemas/gitlab-api.schema.d.ts.map +1 -0
- package/dist/schemas/gitlab-api.schema.js +33 -0
- package/dist/schemas/gitlab-api.schema.js.map +1 -0
- package/dist/schemas/likec4.schema.d.ts +26 -0
- package/dist/schemas/likec4.schema.d.ts.map +1 -0
- package/dist/schemas/likec4.schema.js +23 -0
- package/dist/schemas/likec4.schema.js.map +1 -0
- package/dist/schemas/package.schema.d.ts +5 -0
- package/dist/schemas/package.schema.d.ts.map +1 -0
- package/dist/schemas/package.schema.js +5 -0
- package/dist/schemas/package.schema.js.map +1 -0
- package/dist/schemas/source-platform.schema.d.ts +56 -0
- package/dist/schemas/source-platform.schema.d.ts.map +1 -0
- package/dist/schemas/source-platform.schema.js +49 -0
- package/dist/schemas/source-platform.schema.js.map +1 -0
- package/dist/schemas/structurizr.schema.d.ts +234 -0
- package/dist/schemas/structurizr.schema.d.ts.map +1 -0
- package/dist/schemas/structurizr.schema.js +54 -0
- package/dist/schemas/structurizr.schema.js.map +1 -0
- package/dist/skip-patterns +62 -0
- package/dist/utils/config.d.ts +156 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +267 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/error-utils.d.ts +2 -0
- package/dist/utils/error-utils.d.ts.map +1 -0
- package/dist/utils/error-utils.js +6 -0
- package/dist/utils/error-utils.js.map +1 -0
- package/dist/utils/git-diff.d.ts +35 -0
- package/dist/utils/git-diff.d.ts.map +1 -0
- package/dist/utils/git-diff.js +114 -0
- package/dist/utils/git-diff.js.map +1 -0
- package/dist/utils/model-source.d.ts +30 -0
- package/dist/utils/model-source.d.ts.map +1 -0
- package/dist/utils/model-source.js +167 -0
- package/dist/utils/model-source.js.map +1 -0
- package/dist/utils/retry.d.ts +9 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +51 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/skip-patterns.d.ts +7 -0
- package/dist/utils/skip-patterns.d.ts.map +1 -0
- package/dist/utils/skip-patterns.js +35 -0
- package/dist/utils/skip-patterns.js.map +1 -0
- package/dist/utils/validation.d.ts +4 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +37 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Gitlab } from '@gitbeaker/rest';
|
|
2
|
+
import { CONFIG, ENV_VAR_NAMES, RC_FILENAME } from '../../utils/config.js';
|
|
3
|
+
import { ErodeError, ErrorCode } from '../../errors.js';
|
|
4
|
+
import { wrapPlatformError } from '../platform-utils.js';
|
|
5
|
+
export class GitLabWriter {
|
|
6
|
+
api;
|
|
7
|
+
projectPath;
|
|
8
|
+
constructor(targetOwner, targetRepo) {
|
|
9
|
+
const token = CONFIG.gitlab.token;
|
|
10
|
+
if (!token) {
|
|
11
|
+
throw new ErodeError('A GitLab token is needed to create merge requests', ErrorCode.AUTH_KEY_MISSING, `Provide ${ENV_VAR_NAMES.gitlabToken} in your environment or ${RC_FILENAME} to create merge requests.`);
|
|
12
|
+
}
|
|
13
|
+
this.api = new Gitlab({ token, host: CONFIG.gitlab.baseUrl });
|
|
14
|
+
this.projectPath = `${targetOwner}/${targetRepo}`;
|
|
15
|
+
}
|
|
16
|
+
async createOrUpdateChangeRequest(options) {
|
|
17
|
+
try {
|
|
18
|
+
const { branchName, title, body, fileChanges, baseBranch = 'main', draft = true } = options;
|
|
19
|
+
let branchExists = false;
|
|
20
|
+
try {
|
|
21
|
+
await this.api.Branches.show(this.projectPath, branchName);
|
|
22
|
+
branchExists = true;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Branch doesn't exist
|
|
26
|
+
}
|
|
27
|
+
if (!branchExists) {
|
|
28
|
+
await this.api.Branches.create(this.projectPath, branchName, baseBranch);
|
|
29
|
+
}
|
|
30
|
+
// Create commit with file changes.
|
|
31
|
+
// On a new branch, files don't exist yet → 'create'.
|
|
32
|
+
// On an existing branch, erode overwrites the same files → 'update'.
|
|
33
|
+
// Mixed scenarios (some new, some existing) are not supported by this batch approach.
|
|
34
|
+
if (fileChanges.length > 0) {
|
|
35
|
+
const actions = fileChanges.map((file) => ({
|
|
36
|
+
action: branchExists ? 'update' : 'create',
|
|
37
|
+
filePath: file.path,
|
|
38
|
+
content: file.content,
|
|
39
|
+
}));
|
|
40
|
+
await this.api.Commits.create(this.projectPath, branchName, title, actions);
|
|
41
|
+
}
|
|
42
|
+
const existingMrs = (await this.api.MergeRequests.all({
|
|
43
|
+
projectId: this.projectPath,
|
|
44
|
+
sourceBranch: branchName,
|
|
45
|
+
state: 'opened',
|
|
46
|
+
}));
|
|
47
|
+
const existingMr = existingMrs[0];
|
|
48
|
+
if (existingMr) {
|
|
49
|
+
await this.api.MergeRequests.edit(this.projectPath, existingMr.iid, {
|
|
50
|
+
title,
|
|
51
|
+
description: body,
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
url: existingMr.web_url,
|
|
55
|
+
number: existingMr.iid,
|
|
56
|
+
action: 'updated',
|
|
57
|
+
branch: branchName,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Create new MR — prefix title with "Draft: " for draft MRs
|
|
61
|
+
const mrTitle = draft ? `Draft: ${title}` : title;
|
|
62
|
+
const mr = (await this.api.MergeRequests.create(this.projectPath, branchName, baseBranch, mrTitle, { description: body }));
|
|
63
|
+
return {
|
|
64
|
+
url: mr.web_url,
|
|
65
|
+
number: mr.iid,
|
|
66
|
+
action: 'created',
|
|
67
|
+
branch: branchName,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
wrapPlatformError(error, 'gitlab', 'Could not create or update merge request');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async commentOnChangeRequest(ref, body, options) {
|
|
75
|
+
const owner = ref.platformId.owner;
|
|
76
|
+
const repo = ref.platformId.repo;
|
|
77
|
+
const projectPath = `${owner}/${repo}`;
|
|
78
|
+
try {
|
|
79
|
+
if (options?.upsertMarker) {
|
|
80
|
+
const existingId = await this.findNoteByMarker(projectPath, ref.number, options.upsertMarker);
|
|
81
|
+
if (existingId) {
|
|
82
|
+
await this.api.MergeRequestNotes.edit(projectPath, ref.number, existingId, { body });
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
await this.api.MergeRequestNotes.create(projectPath, ref.number, body);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
wrapPlatformError(error, 'gitlab', 'Could not comment on merge request');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async deleteComment(ref, marker) {
|
|
93
|
+
const owner = ref.platformId.owner;
|
|
94
|
+
const repo = ref.platformId.repo;
|
|
95
|
+
const projectPath = `${owner}/${repo}`;
|
|
96
|
+
try {
|
|
97
|
+
const existingId = await this.findNoteByMarker(projectPath, ref.number, marker);
|
|
98
|
+
if (existingId) {
|
|
99
|
+
await this.api.MergeRequestNotes.remove(projectPath, ref.number, existingId);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
wrapPlatformError(error, 'gitlab', 'Could not remove comment from merge request');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async closeChangeRequest(branchName) {
|
|
107
|
+
try {
|
|
108
|
+
const mrs = (await this.api.MergeRequests.all({
|
|
109
|
+
projectId: this.projectPath,
|
|
110
|
+
sourceBranch: branchName,
|
|
111
|
+
state: 'opened',
|
|
112
|
+
}));
|
|
113
|
+
const mr = mrs[0];
|
|
114
|
+
if (!mr)
|
|
115
|
+
return;
|
|
116
|
+
await this.api.MergeRequests.edit(this.projectPath, mr.iid, {
|
|
117
|
+
stateEvent: 'close',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
wrapPlatformError(error, 'gitlab', 'Could not close merge request');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async findNoteByMarker(projectPath, mrIid, marker) {
|
|
125
|
+
const notes = (await this.api.MergeRequestNotes.all(projectPath, mrIid));
|
|
126
|
+
const match = notes.find((n) => n.body.includes(marker));
|
|
127
|
+
return match?.id;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/platforms/gitlab/writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SourcePlatformReader, SourcePlatformWriter } from './source-platform.js';
|
|
2
|
+
type Platform = 'github' | 'gitlab' | 'bitbucket';
|
|
3
|
+
export declare function detectPlatform(url: string): Platform;
|
|
4
|
+
export declare function createPlatformReader(url: string, token?: string): SourcePlatformReader;
|
|
5
|
+
export declare function createPlatformWriter(repositoryUrl: string, targetOwner: string, targetRepo: string): SourcePlatformWriter;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=platform-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-factory.d.ts","sourceRoot":"","sources":["../../src/platforms/platform-factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAKvF,KAAK,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAElD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAyBpD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAkBtF;AAED,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,oBAAoB,CAkBtB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { ErodeError, ErrorCode } from '../errors.js';
|
|
2
|
+
import { GitHubReader, GitHubWriter } from './github/index.js';
|
|
3
|
+
import { GitLabReader, GitLabWriter } from './gitlab/index.js';
|
|
4
|
+
import { BitbucketReader, BitbucketWriter } from './bitbucket/index.js';
|
|
5
|
+
export function detectPlatform(url) {
|
|
6
|
+
try {
|
|
7
|
+
const parsed = new URL(url);
|
|
8
|
+
if (parsed.hostname === 'github.com' || parsed.hostname === 'www.github.com') {
|
|
9
|
+
return 'github';
|
|
10
|
+
}
|
|
11
|
+
if (parsed.hostname === 'gitlab.com' || parsed.hostname === 'www.gitlab.com') {
|
|
12
|
+
return 'gitlab';
|
|
13
|
+
}
|
|
14
|
+
if (parsed.hostname === 'bitbucket.org' || parsed.hostname === 'www.bitbucket.org') {
|
|
15
|
+
return 'bitbucket';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new ErodeError(`Unrecognized URL: ${url}`, ErrorCode.PLATFORM_INVALID_URL, `Unrecognized URL: ${url}`);
|
|
20
|
+
}
|
|
21
|
+
throw new ErodeError(`Unsupported platform for URL: ${url}. Only GitHub, GitLab, and Bitbucket are supported.`, ErrorCode.PLATFORM_INVALID_URL, `Unsupported platform for URL: ${url}. Only GitHub, GitLab, and Bitbucket are supported.`);
|
|
22
|
+
}
|
|
23
|
+
export function createPlatformReader(url, token) {
|
|
24
|
+
const platform = detectPlatform(url);
|
|
25
|
+
switch (platform) {
|
|
26
|
+
case 'github':
|
|
27
|
+
return new GitHubReader(token);
|
|
28
|
+
case 'gitlab':
|
|
29
|
+
return new GitLabReader(token);
|
|
30
|
+
case 'bitbucket':
|
|
31
|
+
return new BitbucketReader(token);
|
|
32
|
+
default: {
|
|
33
|
+
const _exhaustive = platform;
|
|
34
|
+
throw new ErodeError(`Unsupported platform: ${String(_exhaustive)}`, ErrorCode.PLATFORM_INVALID_URL, `Unsupported platform. Supported platforms: GitHub, GitLab, Bitbucket.`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function createPlatformWriter(repositoryUrl, targetOwner, targetRepo) {
|
|
39
|
+
const platform = detectPlatform(repositoryUrl);
|
|
40
|
+
switch (platform) {
|
|
41
|
+
case 'github':
|
|
42
|
+
return new GitHubWriter(targetOwner, targetRepo);
|
|
43
|
+
case 'gitlab':
|
|
44
|
+
return new GitLabWriter(targetOwner, targetRepo);
|
|
45
|
+
case 'bitbucket':
|
|
46
|
+
return new BitbucketWriter(targetOwner, targetRepo);
|
|
47
|
+
default: {
|
|
48
|
+
const _exhaustive = platform;
|
|
49
|
+
throw new ErodeError(`Unsupported platform: ${String(_exhaustive)}`, ErrorCode.PLATFORM_INVALID_URL, `Unsupported platform. Supported platforms: GitHub, GitLab, Bitbucket.`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=platform-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-factory.js","sourceRoot":"","sources":["../../src/platforms/platform-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAIxE,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,YAAY,IAAI,MAAM,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;YAC7E,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,YAAY,IAAI,MAAM,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;YAC7E,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,eAAe,IAAI,MAAM,CAAC,QAAQ,KAAK,mBAAmB,EAAE,CAAC;YACnF,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,UAAU,CAClB,qBAAqB,GAAG,EAAE,EAC1B,SAAS,CAAC,oBAAoB,EAC9B,qBAAqB,GAAG,EAAE,CAC3B,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,UAAU,CAClB,iCAAiC,GAAG,qDAAqD,EACzF,SAAS,CAAC,oBAAoB,EAC9B,iCAAiC,GAAG,qDAAqD,CAC1F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,KAAc;IAC9D,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACrC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,KAAK,QAAQ;YACX,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,KAAK,WAAW;YACd,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,QAAQ,CAAC;YACpC,MAAM,IAAI,UAAU,CAClB,yBAAyB,MAAM,CAAC,WAAW,CAAC,EAAE,EAC9C,SAAS,CAAC,oBAAoB,EAC9B,uEAAuE,CACxE,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,aAAqB,EACrB,WAAmB,EACnB,UAAkB;IAElB,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC/C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACnD,KAAK,QAAQ;YACX,OAAO,IAAI,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACnD,KAAK,WAAW;YACd,OAAO,IAAI,eAAe,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,QAAQ,CAAC;YACpC,MAAM,IAAI,UAAU,CAClB,yBAAyB,MAAM,CAAC,WAAW,CAAC,EAAE,EAC9C,SAAS,CAAC,oBAAoB,EAC9B,uEAAuE,CACxE,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ChangeRequestFile } from './source-platform.js';
|
|
2
|
+
interface TruncationResult {
|
|
3
|
+
files: ChangeRequestFile[];
|
|
4
|
+
wasTruncated: boolean;
|
|
5
|
+
truncationReason?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function applyDiffTruncation(files: ChangeRequestFile[], totalLines: number): TruncationResult;
|
|
8
|
+
export declare function sanitizeErrorMessage(message: string): string;
|
|
9
|
+
export declare function isTransientError(error: unknown): boolean;
|
|
10
|
+
export declare function wrapPlatformError(error: unknown, provider: string, operation: string): never;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=platform-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-utils.d.ts","sourceRoot":"","sources":["../../src/platforms/platform-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAK9D,UAAU,gBAAgB;IACxB,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EAAE,EAC1B,UAAU,EAAE,MAAM,GACjB,gBAAgB,CAkBlB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAW5D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAIxD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,CAU5F"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { CONFIG } from '../utils/config.js';
|
|
2
|
+
import { ErodeError, ApiError } from '../errors.js';
|
|
3
|
+
import { extractStatusCode } from '../utils/error-utils.js';
|
|
4
|
+
export function applyDiffTruncation(files, totalLines) {
|
|
5
|
+
const totalFiles = files.length;
|
|
6
|
+
if (totalFiles > CONFIG.constraints.maxFilesPerDiff) {
|
|
7
|
+
return {
|
|
8
|
+
files: files.slice(0, CONFIG.constraints.maxFilesPerDiff),
|
|
9
|
+
wasTruncated: true,
|
|
10
|
+
truncationReason: `Diff surpassed the ${String(CONFIG.constraints.maxFilesPerDiff)}-file limit (${String(totalFiles)} files found). Only the first ${String(CONFIG.constraints.maxFilesPerDiff)} files were analyzed.`,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
if (totalLines > CONFIG.constraints.maxLinesPerDiff) {
|
|
14
|
+
return {
|
|
15
|
+
files,
|
|
16
|
+
wasTruncated: true,
|
|
17
|
+
truncationReason: `Diff surpassed the ${String(CONFIG.constraints.maxLinesPerDiff)}-line limit (${String(totalLines)} lines found). Analysis may be partial.`,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return { files, wasTruncated: false };
|
|
21
|
+
}
|
|
22
|
+
export function sanitizeErrorMessage(message) {
|
|
23
|
+
if (/<[a-z/!][^>]*>/i.test(message)) {
|
|
24
|
+
let cleaned = message;
|
|
25
|
+
let prev;
|
|
26
|
+
do {
|
|
27
|
+
prev = cleaned;
|
|
28
|
+
cleaned = cleaned.replace(/<[^>]*>/g, '');
|
|
29
|
+
} while (cleaned !== prev);
|
|
30
|
+
return cleaned.replace(/\s+/g, ' ').trim().slice(0, 200);
|
|
31
|
+
}
|
|
32
|
+
return message;
|
|
33
|
+
}
|
|
34
|
+
export function isTransientError(error) {
|
|
35
|
+
if (!(error instanceof Error))
|
|
36
|
+
return false;
|
|
37
|
+
const status = extractStatusCode(error);
|
|
38
|
+
return status !== undefined && status >= 500;
|
|
39
|
+
}
|
|
40
|
+
export function wrapPlatformError(error, provider, operation) {
|
|
41
|
+
if (error instanceof ErodeError)
|
|
42
|
+
throw error;
|
|
43
|
+
if (error instanceof Error) {
|
|
44
|
+
throw new ApiError(`${operation}: ${sanitizeErrorMessage(error.message)}`, extractStatusCode(error), { provider });
|
|
45
|
+
}
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=platform-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-utils.js","sourceRoot":"","sources":["../../src/platforms/platform-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAQ5D,MAAM,UAAU,mBAAmB,CACjC,KAA0B,EAC1B,UAAkB;IAElB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAEhC,IAAI,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;QACpD,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC;YACzD,YAAY,EAAE,IAAI;YAClB,gBAAgB,EAAE,sBAAsB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,gBAAgB,MAAM,CAAC,UAAU,CAAC,iCAAiC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,uBAAuB;SACvN,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;QACpD,OAAO;YACL,KAAK;YACL,YAAY,EAAE,IAAI;YAClB,gBAAgB,EAAE,sBAAsB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,gBAAgB,MAAM,CAAC,UAAU,CAAC,yCAAyC;SAC9J,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,IAAI,OAAO,GAAG,OAAO,CAAC;QACtB,IAAI,IAAY,CAAC;QACjB,GAAG,CAAC;YACF,IAAI,GAAG,OAAO,CAAC;YACf,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC,QAAQ,OAAO,KAAK,IAAI,EAAE;QAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,GAAG,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAE,QAAgB,EAAE,SAAiB;IACnF,IAAI,KAAK,YAAY,UAAU;QAAE,MAAM,KAAK,CAAC;IAC7C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,IAAI,QAAQ,CAChB,GAAG,SAAS,KAAK,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EACtD,iBAAiB,CAAC,KAAK,CAAC,EACxB,EAAE,QAAQ,EAAE,CACb,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
export interface CommitStats {
|
|
2
|
+
total: number;
|
|
3
|
+
additions: number;
|
|
4
|
+
deletions: number;
|
|
5
|
+
}
|
|
6
|
+
/** Platform-specific identifiers for the repository. */
|
|
7
|
+
export interface PlatformId {
|
|
8
|
+
owner: string;
|
|
9
|
+
repo: string;
|
|
10
|
+
}
|
|
11
|
+
/** Platform-agnostic reference to a change request (PR/MR). */
|
|
12
|
+
export interface ChangeRequestRef {
|
|
13
|
+
/** The change request number (universal across platforms). */
|
|
14
|
+
number: number;
|
|
15
|
+
/** The full URL of the change request. */
|
|
16
|
+
url: string;
|
|
17
|
+
/** The repository URL derived from the change request URL. */
|
|
18
|
+
repositoryUrl: string;
|
|
19
|
+
/**
|
|
20
|
+
* Platform-specific identifiers. Only the platform's own implementation
|
|
21
|
+
* should access these fields.
|
|
22
|
+
* - GitHub: { owner: string, repo: string }
|
|
23
|
+
* - GitLab: { owner: string (namespace/group path), repo: string (project name) }
|
|
24
|
+
* - Bitbucket: { owner: string (workspace), repo: string (repo slug) }
|
|
25
|
+
*/
|
|
26
|
+
platformId: PlatformId;
|
|
27
|
+
}
|
|
28
|
+
/** A file changed in a change request. */
|
|
29
|
+
export interface ChangeRequestFile {
|
|
30
|
+
filename: string;
|
|
31
|
+
status: string;
|
|
32
|
+
additions: number;
|
|
33
|
+
deletions: number;
|
|
34
|
+
changes: number;
|
|
35
|
+
patch?: string;
|
|
36
|
+
}
|
|
37
|
+
/** Data returned when fetching a change request. */
|
|
38
|
+
export interface ChangeRequestData {
|
|
39
|
+
number: number;
|
|
40
|
+
title: string;
|
|
41
|
+
body: string | null;
|
|
42
|
+
state: string;
|
|
43
|
+
author: {
|
|
44
|
+
login: string;
|
|
45
|
+
name?: string;
|
|
46
|
+
};
|
|
47
|
+
base: {
|
|
48
|
+
ref: string;
|
|
49
|
+
sha: string;
|
|
50
|
+
};
|
|
51
|
+
head: {
|
|
52
|
+
ref: string;
|
|
53
|
+
sha: string;
|
|
54
|
+
};
|
|
55
|
+
commits: number;
|
|
56
|
+
additions: number;
|
|
57
|
+
deletions: number;
|
|
58
|
+
changed_files: number;
|
|
59
|
+
files: ChangeRequestFile[];
|
|
60
|
+
diff: string;
|
|
61
|
+
stats: CommitStats;
|
|
62
|
+
wasTruncated?: boolean;
|
|
63
|
+
truncationReason?: string;
|
|
64
|
+
}
|
|
65
|
+
/** A commit within a change request. */
|
|
66
|
+
export interface ChangeRequestCommit {
|
|
67
|
+
sha: string;
|
|
68
|
+
message: string;
|
|
69
|
+
author: {
|
|
70
|
+
name: string;
|
|
71
|
+
email: string;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/** A file to create or update in a change request. */
|
|
75
|
+
export interface ChangeRequestFileWrite {
|
|
76
|
+
path: string;
|
|
77
|
+
content: string;
|
|
78
|
+
}
|
|
79
|
+
/** Options for creating or updating a change request. */
|
|
80
|
+
export interface CreateOrUpdateChangeRequestOptions {
|
|
81
|
+
branchName: string;
|
|
82
|
+
title: string;
|
|
83
|
+
body: string;
|
|
84
|
+
fileChanges: ChangeRequestFileWrite[];
|
|
85
|
+
baseBranch?: string;
|
|
86
|
+
draft?: boolean;
|
|
87
|
+
}
|
|
88
|
+
/** Result of a change request write operation. */
|
|
89
|
+
export interface ChangeRequestResult {
|
|
90
|
+
url: string;
|
|
91
|
+
number: number;
|
|
92
|
+
action: 'created' | 'updated';
|
|
93
|
+
branch: string;
|
|
94
|
+
}
|
|
95
|
+
/** Reads change request data from a source platform. */
|
|
96
|
+
export interface SourcePlatformReader {
|
|
97
|
+
/** Parse a change request URL into a platform-agnostic reference. */
|
|
98
|
+
parseChangeRequestUrl(url: string): ChangeRequestRef;
|
|
99
|
+
/** Fetch full change request data. */
|
|
100
|
+
fetchChangeRequest(ref: ChangeRequestRef): Promise<ChangeRequestData>;
|
|
101
|
+
/** Fetch commits for a change request. */
|
|
102
|
+
fetchChangeRequestCommits(ref: ChangeRequestRef): Promise<ChangeRequestCommit[]>;
|
|
103
|
+
}
|
|
104
|
+
/** Writes change requests and comments on a source platform. */
|
|
105
|
+
export interface SourcePlatformWriter {
|
|
106
|
+
/** Create or update a change request with file changes. */
|
|
107
|
+
createOrUpdateChangeRequest(options: CreateOrUpdateChangeRequestOptions): Promise<ChangeRequestResult>;
|
|
108
|
+
/** Comment on an existing change request. When upsertMarker is provided, updates an existing comment containing the marker instead of creating a new one. */
|
|
109
|
+
commentOnChangeRequest(ref: ChangeRequestRef, body: string, options?: {
|
|
110
|
+
upsertMarker?: string;
|
|
111
|
+
}): Promise<void>;
|
|
112
|
+
/** Delete a comment containing the given marker string. No-op if no matching comment exists. */
|
|
113
|
+
deleteComment(ref: ChangeRequestRef, marker: string): Promise<void>;
|
|
114
|
+
/** Close an open change request by its source branch name. No-op if none exists. */
|
|
115
|
+
closeChangeRequest(branchName: string): Promise<void>;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=source-platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-platform.d.ts","sourceRoot":"","sources":["../../src/platforms/source-platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-platform.js","sourceRoot":"","sources":["../../src/platforms/source-platform.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { DependencyExtractionPromptData, ComponentSelectionPromptData, DriftAnalysisPromptData, DriftAnalysisResult } from '../analysis/analysis-types.js';
|
|
2
|
+
import type { DependencyExtractionResult } from '../schemas/dependency-extraction.schema.js';
|
|
3
|
+
/** Provider interface for AI-powered architectural analysis. */
|
|
4
|
+
export interface AIProvider {
|
|
5
|
+
/**
|
|
6
|
+
* Select the most relevant component from candidates based on changed files.
|
|
7
|
+
* @returns The selected component ID, or null if no match is found.
|
|
8
|
+
*/
|
|
9
|
+
selectComponent?(data: ComponentSelectionPromptData): Promise<string | null>;
|
|
10
|
+
/** Extract architectural dependency changes from a git diff. */
|
|
11
|
+
extractDependencies(data: DependencyExtractionPromptData): Promise<DependencyExtractionResult>;
|
|
12
|
+
/** Analyze a change request for architectural drift violations. */
|
|
13
|
+
analyzeDrift(data: DriftAnalysisPromptData): Promise<DriftAnalysisResult>;
|
|
14
|
+
/**
|
|
15
|
+
* Insert lines into an existing model file using a fast model.
|
|
16
|
+
* @param fileContent - The current content of the model file
|
|
17
|
+
* @param linesToInsert - DSL lines to insert into the file
|
|
18
|
+
* @param modelFormat - The model format (e.g., "likec4", "structurizr")
|
|
19
|
+
* @returns The complete modified file content
|
|
20
|
+
*/
|
|
21
|
+
patchModel?(fileContent: string, linesToInsert: string[], modelFormat: string): Promise<string>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=ai-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-provider.d.ts","sourceRoot":"","sources":["../../src/providers/ai-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,8BAA8B,EAC9B,4BAA4B,EAC5B,uBAAuB,EACvB,mBAAmB,EACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AAE7F,gEAAgE;AAChE,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,eAAe,CAAC,CAAC,IAAI,EAAE,4BAA4B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE7E,gEAAgE;IAChE,mBAAmB,CAAC,IAAI,EAAE,8BAA8B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAE/F,mEAAmE;IACnE,YAAY,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAE1E;;;;;;OAMG;IACH,UAAU,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACjG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-provider.js","sourceRoot":"","sources":["../../src/providers/ai-provider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analysis phase definitions (provider-agnostic)
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Analysis phases where AI models are used
|
|
6
|
+
*/
|
|
7
|
+
export declare enum AnalysisPhase {
|
|
8
|
+
COMPONENT_RESOLUTION = "component-resolution",
|
|
9
|
+
DEPENDENCY_SCAN = "dependency-scan",
|
|
10
|
+
CHANGE_ANALYSIS = "change-analysis",
|
|
11
|
+
MODEL_UPDATE = "model-update"
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=analysis-phase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis-phase.d.ts","sourceRoot":"","sources":["../../src/providers/analysis-phase.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,oBAAY,aAAa;IACvB,oBAAoB,yBAAyB;IAC7C,eAAe,oBAAoB;IACnC,eAAe,oBAAoB;IACnC,YAAY,iBAAiB;CAC9B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analysis phase definitions (provider-agnostic)
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Analysis phases where AI models are used
|
|
6
|
+
*/
|
|
7
|
+
export var AnalysisPhase;
|
|
8
|
+
(function (AnalysisPhase) {
|
|
9
|
+
AnalysisPhase["COMPONENT_RESOLUTION"] = "component-resolution";
|
|
10
|
+
AnalysisPhase["DEPENDENCY_SCAN"] = "dependency-scan";
|
|
11
|
+
AnalysisPhase["CHANGE_ANALYSIS"] = "change-analysis";
|
|
12
|
+
AnalysisPhase["MODEL_UPDATE"] = "model-update";
|
|
13
|
+
})(AnalysisPhase || (AnalysisPhase = {}));
|
|
14
|
+
//# sourceMappingURL=analysis-phase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis-phase.js","sourceRoot":"","sources":["../../src/providers/analysis-phase.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,8DAA6C,CAAA;IAC7C,oDAAmC,CAAA;IACnC,oDAAmC,CAAA;IACnC,8CAA6B,CAAA;AAC/B,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/models.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB;;;CAGnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/providers/anthropic/models.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,2BAA2B;IACjC,QAAQ,EAAE,4BAA4B;CAC9B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseProvider } from '../base-provider.js';
|
|
2
|
+
import type { AnalysisPhase } from '../analysis-phase.js';
|
|
3
|
+
export declare class AnthropicProvider extends BaseProvider {
|
|
4
|
+
private readonly client;
|
|
5
|
+
constructor(config: {
|
|
6
|
+
apiKey: string;
|
|
7
|
+
fastModel?: string;
|
|
8
|
+
advancedModel?: string;
|
|
9
|
+
});
|
|
10
|
+
protected callModel(model: string, prompt: string, phase: AnalysisPhase, maxTokens: number): Promise<string>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAEvB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE;cAelE,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC;CA+CnB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import { BaseProvider } from '../base-provider.js';
|
|
3
|
+
import { ApiError, ErodeError, ErrorCode } from '../../errors.js';
|
|
4
|
+
import { ENV_VAR_NAMES, RC_FILENAME } from '../../utils/config.js';
|
|
5
|
+
import { ANTHROPIC_MODELS } from './models.js';
|
|
6
|
+
export class AnthropicProvider extends BaseProvider {
|
|
7
|
+
client;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
if (!config.apiKey) {
|
|
10
|
+
throw new ErodeError('An Anthropic API key is needed', ErrorCode.AUTH_KEY_MISSING, `No Anthropic API key found. Set ${ENV_VAR_NAMES.anthropicApiKey} in your environment or ${RC_FILENAME}.`);
|
|
11
|
+
}
|
|
12
|
+
super({
|
|
13
|
+
fastModel: config.fastModel ?? ANTHROPIC_MODELS.FAST,
|
|
14
|
+
advancedModel: config.advancedModel ?? ANTHROPIC_MODELS.ADVANCED,
|
|
15
|
+
});
|
|
16
|
+
this.client = new Anthropic({ apiKey: config.apiKey });
|
|
17
|
+
}
|
|
18
|
+
async callModel(model, prompt, phase, maxTokens) {
|
|
19
|
+
try {
|
|
20
|
+
const response = await this.client.messages.create({
|
|
21
|
+
model,
|
|
22
|
+
max_tokens: maxTokens,
|
|
23
|
+
messages: [{ role: 'user', content: prompt }],
|
|
24
|
+
});
|
|
25
|
+
if (response.stop_reason === 'refusal') {
|
|
26
|
+
throw new ErodeError('Anthropic safety filters blocked the response', ErrorCode.PROVIDER_SAFETY_BLOCK, 'Content was blocked by the AI provider safety filters. Try simplifying the input.', { model, phase });
|
|
27
|
+
}
|
|
28
|
+
const textBlock = response.content.find((b) => b.type === 'text');
|
|
29
|
+
const text = textBlock && 'text' in textBlock ? textBlock.text : undefined;
|
|
30
|
+
if (!text) {
|
|
31
|
+
throw new ErodeError('Anthropic returned an empty response', ErrorCode.PROVIDER_INVALID_RESPONSE, 'The Anthropic API returned no content', { model, phase });
|
|
32
|
+
}
|
|
33
|
+
// Check for truncation
|
|
34
|
+
if (response.stop_reason === 'max_tokens') {
|
|
35
|
+
throw new ErodeError('Anthropic response was cut short (max_tokens reached)', ErrorCode.PROVIDER_INVALID_RESPONSE, 'The AI response was truncated. The output may be partial.', { model, phase, maxTokens });
|
|
36
|
+
}
|
|
37
|
+
return text;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (error instanceof ErodeError) {
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
throw ApiError.fromAnthropicError(error);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/anthropic/provider.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IAChC,MAAM,CAAY;IAEnC,YAAY,MAAsE;QAChF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,UAAU,CAClB,gCAAgC,EAChC,SAAS,CAAC,gBAAgB,EAC1B,mCAAmC,aAAa,CAAC,eAAe,2BAA2B,WAAW,GAAG,CAC1G,CAAC;QACJ,CAAC;QACD,KAAK,CAAC;YACJ,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,gBAAgB,CAAC,IAAI;YACpD,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,gBAAgB,CAAC,QAAQ;SACjE,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC;IAES,KAAK,CAAC,SAAS,CACvB,KAAa,EACb,MAAc,EACd,KAAoB,EACpB,SAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACjD,KAAK;gBACL,UAAU,EAAE,SAAS;gBACrB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;aAC9C,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBACvC,MAAM,IAAI,UAAU,CAClB,+CAA+C,EAC/C,SAAS,CAAC,qBAAqB,EAC/B,mFAAmF,EACnF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YAClE,MAAM,IAAI,GAAG,SAAS,IAAI,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAE3E,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,UAAU,CAClB,sCAAsC,EACtC,SAAS,CAAC,yBAAyB,EACnC,uCAAuC,EACvC,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;YACJ,CAAC;YAED,uBAAuB;YACvB,IAAI,QAAQ,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;gBAC1C,MAAM,IAAI,UAAU,CAClB,uDAAuD,EACvD,SAAS,CAAC,yBAAyB,EACnC,2DAA2D,EAC3D,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAC5B,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;gBAChC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AIProvider } from './ai-provider.js';
|
|
2
|
+
import type { DependencyExtractionPromptData, ComponentSelectionPromptData, DriftAnalysisPromptData, DriftAnalysisResult } from '../analysis/analysis-types.js';
|
|
3
|
+
import type { DependencyExtractionResult } from '../schemas/dependency-extraction.schema.js';
|
|
4
|
+
import { AnalysisPhase } from './analysis-phase.js';
|
|
5
|
+
/**
|
|
6
|
+
* Abstract base class for AI providers.
|
|
7
|
+
*
|
|
8
|
+
* Subclasses only need to implement `callModel` with the provider-specific SDK call.
|
|
9
|
+
* All shared pipeline logic (prompt building, retry, JSON extraction, validation) lives here.
|
|
10
|
+
*/
|
|
11
|
+
export declare abstract class BaseProvider implements AIProvider {
|
|
12
|
+
protected readonly fastModel: string;
|
|
13
|
+
protected readonly advancedModel: string;
|
|
14
|
+
constructor(config: {
|
|
15
|
+
fastModel: string;
|
|
16
|
+
advancedModel: string;
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Make a single AI model call using the provider-specific SDK.
|
|
20
|
+
* @param model - The model identifier to use
|
|
21
|
+
* @param prompt - The prompt text to send
|
|
22
|
+
* @param phase - The analysis phase (for error context)
|
|
23
|
+
* @param maxTokens - Maximum tokens for the response (some providers may ignore this)
|
|
24
|
+
* @returns The text content of the model response
|
|
25
|
+
*/
|
|
26
|
+
protected abstract callModel(model: string, prompt: string, phase: AnalysisPhase, maxTokens: number): Promise<string>;
|
|
27
|
+
selectComponent(data: ComponentSelectionPromptData): Promise<string | null>;
|
|
28
|
+
extractDependencies(data: DependencyExtractionPromptData): Promise<DependencyExtractionResult>;
|
|
29
|
+
analyzeDrift(data: DriftAnalysisPromptData): Promise<DriftAnalysisResult>;
|
|
30
|
+
patchModel(fileContent: string, linesToInsert: string[], modelFormat: string): Promise<string>;
|
|
31
|
+
private executeStage;
|
|
32
|
+
private isRetryableError;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=base-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-provider.d.ts","sourceRoot":"","sources":["../../src/providers/base-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EACV,8BAA8B,EAC9B,4BAA4B,EAC5B,uBAAuB,EACvB,mBAAmB,EACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AAO7F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AASpD;;;;;GAKG;AACH,8BAAsB,YAAa,YAAW,UAAU;IACtD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IACrC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBAE7B,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;IAKhE;;;;;;;OAOG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC;IAEZ,eAAe,CAAC,IAAI,EAAE,4BAA4B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAsB3E,mBAAmB,CACvB,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC,0BAA0B,CAAC;IAWhC,YAAY,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkBzE,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;YAmBJ,YAAY;IAmC1B,OAAO,CAAC,gBAAgB;CAGzB"}
|