gitgrip 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +211 -0
- package/actions/cross-repo-sync/action.yml +55 -0
- package/assets/banner.svg +73 -0
- package/assets/icon.svg +30 -0
- package/assets/logo-dark.svg +36 -0
- package/assets/logo.svg +36 -0
- package/dist/commands/add.d.ts +9 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +80 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/bench.d.ts +12 -0
- package/dist/commands/bench.d.ts.map +1 -0
- package/dist/commands/bench.js +136 -0
- package/dist/commands/bench.js.map +1 -0
- package/dist/commands/branch.d.ts +15 -0
- package/dist/commands/branch.d.ts.map +1 -0
- package/dist/commands/branch.js +159 -0
- package/dist/commands/branch.js.map +1 -0
- package/dist/commands/checkout.d.ts +10 -0
- package/dist/commands/checkout.d.ts.map +1 -0
- package/dist/commands/checkout.js +85 -0
- package/dist/commands/checkout.js.map +1 -0
- package/dist/commands/commit.d.ts +10 -0
- package/dist/commands/commit.d.ts.map +1 -0
- package/dist/commands/commit.js +94 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/diff.d.ts +11 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +105 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/env.d.ts +8 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +35 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/forall.d.ts +13 -0
- package/dist/commands/forall.d.ts.map +1 -0
- package/dist/commands/forall.js +116 -0
- package/dist/commands/forall.js.map +1 -0
- package/dist/commands/init.d.ts +15 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +106 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.d.ts +11 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +205 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/migrate.d.ts +17 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +180 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/pr/create.d.ts +13 -0
- package/dist/commands/pr/create.d.ts.map +1 -0
- package/dist/commands/pr/create.js +202 -0
- package/dist/commands/pr/create.js.map +1 -0
- package/dist/commands/pr/index.d.ts +4 -0
- package/dist/commands/pr/index.d.ts.map +1 -0
- package/dist/commands/pr/index.js +4 -0
- package/dist/commands/pr/index.js.map +1 -0
- package/dist/commands/pr/merge.d.ts +11 -0
- package/dist/commands/pr/merge.d.ts.map +1 -0
- package/dist/commands/pr/merge.js +168 -0
- package/dist/commands/pr/merge.js.map +1 -0
- package/dist/commands/pr/status.d.ts +9 -0
- package/dist/commands/pr/status.d.ts.map +1 -0
- package/dist/commands/pr/status.js +139 -0
- package/dist/commands/pr/status.js.map +1 -0
- package/dist/commands/push.d.ts +10 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +101 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/run.d.ts +8 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +75 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +201 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +13 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +183 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +352 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__bench__/files.bench.d.ts +2 -0
- package/dist/lib/__bench__/files.bench.d.ts.map +1 -0
- package/dist/lib/__bench__/files.bench.js +52 -0
- package/dist/lib/__bench__/files.bench.js.map +1 -0
- package/dist/lib/__bench__/manifest.bench.d.ts +2 -0
- package/dist/lib/__bench__/manifest.bench.d.ts.map +1 -0
- package/dist/lib/__bench__/manifest.bench.js +74 -0
- package/dist/lib/__bench__/manifest.bench.js.map +1 -0
- package/dist/lib/files.d.ts +84 -0
- package/dist/lib/files.d.ts.map +1 -0
- package/dist/lib/files.js +492 -0
- package/dist/lib/files.js.map +1 -0
- package/dist/lib/git.d.ts +125 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +370 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/github.d.ts +92 -0
- package/dist/lib/github.d.ts.map +1 -0
- package/dist/lib/github.js +284 -0
- package/dist/lib/github.js.map +1 -0
- package/dist/lib/hooks.d.ts +19 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +63 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/linker.d.ts +56 -0
- package/dist/lib/linker.d.ts.map +1 -0
- package/dist/lib/linker.js +185 -0
- package/dist/lib/linker.js.map +1 -0
- package/dist/lib/manifest.d.ts +73 -0
- package/dist/lib/manifest.d.ts.map +1 -0
- package/dist/lib/manifest.js +400 -0
- package/dist/lib/manifest.js.map +1 -0
- package/dist/lib/scripts.d.ts +26 -0
- package/dist/lib/scripts.d.ts.map +1 -0
- package/dist/lib/scripts.js +123 -0
- package/dist/lib/scripts.js.map +1 -0
- package/dist/lib/timing.d.ts +100 -0
- package/dist/lib/timing.d.ts.map +1 -0
- package/dist/lib/timing.js +293 -0
- package/dist/lib/timing.js.map +1 -0
- package/dist/types.d.ts +312 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { Octokit } from '@octokit/rest';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
let octokitInstance = null;
|
|
4
|
+
/**
|
|
5
|
+
* Get GitHub token from environment or gh CLI
|
|
6
|
+
*/
|
|
7
|
+
export function getGitHubToken() {
|
|
8
|
+
// Try environment variable first
|
|
9
|
+
if (process.env.GITHUB_TOKEN) {
|
|
10
|
+
return process.env.GITHUB_TOKEN;
|
|
11
|
+
}
|
|
12
|
+
// Try gh CLI
|
|
13
|
+
try {
|
|
14
|
+
const token = execSync('gh auth token', { encoding: 'utf-8' }).trim();
|
|
15
|
+
if (token) {
|
|
16
|
+
return token;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// gh CLI not available or not authenticated
|
|
21
|
+
}
|
|
22
|
+
throw new Error('GitHub token not found. Set GITHUB_TOKEN environment variable or run "gh auth login"');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get or create Octokit instance
|
|
26
|
+
*/
|
|
27
|
+
export function getOctokit() {
|
|
28
|
+
if (!octokitInstance) {
|
|
29
|
+
const token = getGitHubToken();
|
|
30
|
+
octokitInstance = new Octokit({ auth: token });
|
|
31
|
+
}
|
|
32
|
+
return octokitInstance;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a pull request
|
|
36
|
+
*/
|
|
37
|
+
export async function createPullRequest(owner, repo, head, base, title, body, draft = false) {
|
|
38
|
+
const octokit = getOctokit();
|
|
39
|
+
const response = await octokit.pulls.create({
|
|
40
|
+
owner,
|
|
41
|
+
repo,
|
|
42
|
+
head,
|
|
43
|
+
base,
|
|
44
|
+
title,
|
|
45
|
+
body,
|
|
46
|
+
draft,
|
|
47
|
+
});
|
|
48
|
+
return {
|
|
49
|
+
number: response.data.number,
|
|
50
|
+
url: response.data.html_url,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Update a pull request body
|
|
55
|
+
*/
|
|
56
|
+
export async function updatePullRequestBody(owner, repo, pullNumber, body) {
|
|
57
|
+
const octokit = getOctokit();
|
|
58
|
+
await octokit.pulls.update({
|
|
59
|
+
owner,
|
|
60
|
+
repo,
|
|
61
|
+
pull_number: pullNumber,
|
|
62
|
+
body,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get pull request details
|
|
67
|
+
*/
|
|
68
|
+
export async function getPullRequest(owner, repo, pullNumber) {
|
|
69
|
+
const octokit = getOctokit();
|
|
70
|
+
const response = await octokit.pulls.get({
|
|
71
|
+
owner,
|
|
72
|
+
repo,
|
|
73
|
+
pull_number: pullNumber,
|
|
74
|
+
});
|
|
75
|
+
return {
|
|
76
|
+
number: response.data.number,
|
|
77
|
+
url: response.data.html_url,
|
|
78
|
+
title: response.data.title,
|
|
79
|
+
body: response.data.body ?? '',
|
|
80
|
+
state: response.data.state,
|
|
81
|
+
merged: response.data.merged,
|
|
82
|
+
mergeable: response.data.mergeable,
|
|
83
|
+
head: {
|
|
84
|
+
ref: response.data.head.ref,
|
|
85
|
+
sha: response.data.head.sha,
|
|
86
|
+
},
|
|
87
|
+
base: {
|
|
88
|
+
ref: response.data.base.ref,
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get reviews for a pull request
|
|
94
|
+
*/
|
|
95
|
+
export async function getPullRequestReviews(owner, repo, pullNumber) {
|
|
96
|
+
const octokit = getOctokit();
|
|
97
|
+
const response = await octokit.pulls.listReviews({
|
|
98
|
+
owner,
|
|
99
|
+
repo,
|
|
100
|
+
pull_number: pullNumber,
|
|
101
|
+
});
|
|
102
|
+
return response.data.map((review) => ({
|
|
103
|
+
state: review.state,
|
|
104
|
+
user: review.user?.login ?? 'unknown',
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Check if a PR is approved
|
|
109
|
+
*/
|
|
110
|
+
export async function isPullRequestApproved(owner, repo, pullNumber) {
|
|
111
|
+
const reviews = await getPullRequestReviews(owner, repo, pullNumber);
|
|
112
|
+
// Consider approved if at least one APPROVED review and no CHANGES_REQUESTED
|
|
113
|
+
const hasApproval = reviews.some((r) => r.state === 'APPROVED');
|
|
114
|
+
const hasChangesRequested = reviews.some((r) => r.state === 'CHANGES_REQUESTED');
|
|
115
|
+
return hasApproval && !hasChangesRequested;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get combined status checks for a PR
|
|
119
|
+
*/
|
|
120
|
+
export async function getStatusChecks(owner, repo, ref) {
|
|
121
|
+
const octokit = getOctokit();
|
|
122
|
+
const response = await octokit.repos.getCombinedStatusForRef({
|
|
123
|
+
owner,
|
|
124
|
+
repo,
|
|
125
|
+
ref,
|
|
126
|
+
});
|
|
127
|
+
return {
|
|
128
|
+
state: response.data.state,
|
|
129
|
+
statuses: response.data.statuses.map((s) => ({
|
|
130
|
+
context: s.context,
|
|
131
|
+
state: s.state,
|
|
132
|
+
})),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Merge a pull request
|
|
137
|
+
*/
|
|
138
|
+
export async function mergePullRequest(owner, repo, pullNumber, options = {}) {
|
|
139
|
+
const octokit = getOctokit();
|
|
140
|
+
const mergeMethod = options.method ?? 'merge';
|
|
141
|
+
try {
|
|
142
|
+
await octokit.pulls.merge({
|
|
143
|
+
owner,
|
|
144
|
+
repo,
|
|
145
|
+
pull_number: pullNumber,
|
|
146
|
+
merge_method: mergeMethod,
|
|
147
|
+
});
|
|
148
|
+
// Delete branch if requested
|
|
149
|
+
if (options.deleteBranch) {
|
|
150
|
+
const pr = await getPullRequest(owner, repo, pullNumber);
|
|
151
|
+
try {
|
|
152
|
+
await octokit.git.deleteRef({
|
|
153
|
+
owner,
|
|
154
|
+
repo,
|
|
155
|
+
ref: `heads/${pr.head.ref}`,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Branch deletion failure is not critical
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get full linked PR information
|
|
170
|
+
*/
|
|
171
|
+
export async function getLinkedPRInfo(owner, repo, pullNumber, repoName) {
|
|
172
|
+
const pr = await getPullRequest(owner, repo, pullNumber);
|
|
173
|
+
const approved = await isPullRequestApproved(owner, repo, pullNumber);
|
|
174
|
+
const checks = await getStatusChecks(owner, repo, pr.head.sha);
|
|
175
|
+
let state;
|
|
176
|
+
if (pr.merged) {
|
|
177
|
+
state = 'merged';
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
state = pr.state;
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
repoName,
|
|
184
|
+
owner,
|
|
185
|
+
repo,
|
|
186
|
+
number: pr.number,
|
|
187
|
+
url: pr.url,
|
|
188
|
+
state,
|
|
189
|
+
approved,
|
|
190
|
+
checksPass: checks.state === 'success',
|
|
191
|
+
mergeable: pr.mergeable ?? false,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Find PRs with a specific branch name
|
|
196
|
+
*/
|
|
197
|
+
export async function findPRByBranch(owner, repo, branch) {
|
|
198
|
+
const octokit = getOctokit();
|
|
199
|
+
const response = await octokit.pulls.list({
|
|
200
|
+
owner,
|
|
201
|
+
repo,
|
|
202
|
+
head: `${owner}:${branch}`,
|
|
203
|
+
state: 'open',
|
|
204
|
+
});
|
|
205
|
+
if (response.data.length > 0) {
|
|
206
|
+
return {
|
|
207
|
+
number: response.data[0].number,
|
|
208
|
+
url: response.data[0].html_url,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Create PRs for all repos with changes
|
|
215
|
+
*/
|
|
216
|
+
export async function createLinkedPRs(repos, branchName, options, manifestPRNumber) {
|
|
217
|
+
const linkedPRs = [];
|
|
218
|
+
for (const repo of repos) {
|
|
219
|
+
// Check if PR already exists
|
|
220
|
+
const existing = await findPRByBranch(repo.owner, repo.repo, branchName);
|
|
221
|
+
if (existing) {
|
|
222
|
+
const info = await getLinkedPRInfo(repo.owner, repo.repo, existing.number, repo.name);
|
|
223
|
+
linkedPRs.push(info);
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
// Create title with manifest reference if available
|
|
227
|
+
const title = manifestPRNumber
|
|
228
|
+
? `[manifest#${manifestPRNumber}] ${options.title}`
|
|
229
|
+
: options.title;
|
|
230
|
+
// Create body with cross-reference
|
|
231
|
+
let body = options.body ?? '';
|
|
232
|
+
if (manifestPRNumber) {
|
|
233
|
+
body = `Part of manifest PR #${manifestPRNumber}\n\n${body}`;
|
|
234
|
+
}
|
|
235
|
+
const pr = await createPullRequest(repo.owner, repo.repo, branchName, options.base ?? repo.default_branch, title, body, options.draft);
|
|
236
|
+
const info = await getLinkedPRInfo(repo.owner, repo.repo, pr.number, repo.name);
|
|
237
|
+
linkedPRs.push(info);
|
|
238
|
+
}
|
|
239
|
+
return linkedPRs;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Generate manifest PR body with linked PR table
|
|
243
|
+
*/
|
|
244
|
+
export function generateManifestPRBody(title, linkedPRs, additionalBody) {
|
|
245
|
+
const prTable = linkedPRs
|
|
246
|
+
.map((pr) => {
|
|
247
|
+
const statusIcon = pr.state === 'merged' ? ':white_check_mark:' : pr.state === 'open' ? ':hourglass:' : ':x:';
|
|
248
|
+
const approvalIcon = pr.approved ? ':white_check_mark:' : ':hourglass:';
|
|
249
|
+
const checksIcon = pr.checksPass ? ':white_check_mark:' : ':hourglass:';
|
|
250
|
+
return `| ${pr.repoName} | [#${pr.number}](${pr.url}) | ${statusIcon} ${pr.state} | ${approvalIcon} | ${checksIcon} |`;
|
|
251
|
+
})
|
|
252
|
+
.join('\n');
|
|
253
|
+
const prLinks = linkedPRs.map((pr) => `${pr.repoName}#${pr.number}`).join(',');
|
|
254
|
+
return `## Cross-Repository PR
|
|
255
|
+
|
|
256
|
+
${additionalBody ?? ''}
|
|
257
|
+
|
|
258
|
+
### Linked Pull Requests
|
|
259
|
+
|
|
260
|
+
| Repository | PR | Status | Approved | Checks |
|
|
261
|
+
|------------|-----|--------|----------|--------|
|
|
262
|
+
${prTable}
|
|
263
|
+
|
|
264
|
+
**Merge Policy:** All-or-nothing - all linked PRs must be approved before merge.
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
<!-- codi-repo:links:${prLinks} -->
|
|
268
|
+
`;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Parse linked PRs from manifest PR body
|
|
272
|
+
*/
|
|
273
|
+
export function parseLinkedPRsFromBody(body) {
|
|
274
|
+
const match = body.match(/<!-- codi-repo:links:(.+?) -->/);
|
|
275
|
+
if (!match) {
|
|
276
|
+
return [];
|
|
277
|
+
}
|
|
278
|
+
const links = match[1].split(',');
|
|
279
|
+
return links.map((link) => {
|
|
280
|
+
const [repoName, numStr] = link.split('#');
|
|
281
|
+
return { repoName, number: parseInt(numStr, 10) };
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/lib/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { HookCommand } from '../types.js';
|
|
2
|
+
export interface HookResult {
|
|
3
|
+
command: string;
|
|
4
|
+
cwd: string;
|
|
5
|
+
success: boolean;
|
|
6
|
+
exitCode: number | null;
|
|
7
|
+
stdout: string;
|
|
8
|
+
stderr: string;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Run a single hook command
|
|
13
|
+
*/
|
|
14
|
+
export declare function runHookCommand(hook: HookCommand, rootDir: string, env?: Record<string, string>): Promise<HookResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Run a list of hook commands sequentially
|
|
17
|
+
*/
|
|
18
|
+
export declare function runHooks(hooks: HookCommand[], rootDir: string, env?: Record<string, string>): Promise<HookResult[]>;
|
|
19
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,UAAU,CAAC,CA+CrB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,UAAU,EAAE,CAAC,CAcvB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Run a single hook command
|
|
5
|
+
*/
|
|
6
|
+
export async function runHookCommand(hook, rootDir, env) {
|
|
7
|
+
const cwd = hook.cwd ? resolve(rootDir, hook.cwd) : rootDir;
|
|
8
|
+
return new Promise((resolvePromise) => {
|
|
9
|
+
const proc = spawn(hook.command, [], {
|
|
10
|
+
cwd,
|
|
11
|
+
shell: true,
|
|
12
|
+
env: {
|
|
13
|
+
...process.env,
|
|
14
|
+
...env,
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
let stdout = '';
|
|
18
|
+
let stderr = '';
|
|
19
|
+
proc.stdout?.on('data', (data) => {
|
|
20
|
+
stdout += data.toString();
|
|
21
|
+
});
|
|
22
|
+
proc.stderr?.on('data', (data) => {
|
|
23
|
+
stderr += data.toString();
|
|
24
|
+
});
|
|
25
|
+
proc.on('close', (exitCode) => {
|
|
26
|
+
resolvePromise({
|
|
27
|
+
command: hook.command,
|
|
28
|
+
cwd,
|
|
29
|
+
success: exitCode === 0,
|
|
30
|
+
exitCode,
|
|
31
|
+
stdout,
|
|
32
|
+
stderr,
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
proc.on('error', (error) => {
|
|
36
|
+
resolvePromise({
|
|
37
|
+
command: hook.command,
|
|
38
|
+
cwd,
|
|
39
|
+
success: false,
|
|
40
|
+
exitCode: null,
|
|
41
|
+
stdout,
|
|
42
|
+
stderr,
|
|
43
|
+
error: error.message,
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Run a list of hook commands sequentially
|
|
50
|
+
*/
|
|
51
|
+
export async function runHooks(hooks, rootDir, env) {
|
|
52
|
+
const results = [];
|
|
53
|
+
for (const hook of hooks) {
|
|
54
|
+
const result = await runHookCommand(hook, rootDir, env);
|
|
55
|
+
results.push(result);
|
|
56
|
+
// Stop on first failure
|
|
57
|
+
if (!result.success) {
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return results;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAa/B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAiB,EACjB,OAAe,EACf,GAA4B;IAE5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAE5D,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE;YACnC,GAAG;YACH,KAAK,EAAE,IAAI;YACX,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,GAAG,GAAG;aACP;SACF,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC5B,cAAc,CAAC;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,GAAG;gBACH,OAAO,EAAE,QAAQ,KAAK,CAAC;gBACvB,QAAQ;gBACR,MAAM;gBACN,MAAM;aACP,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACzB,cAAc,CAAC;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,GAAG;gBACH,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,IAAI;gBACd,MAAM;gBACN,MAAM;gBACN,KAAK,EAAE,KAAK,CAAC,OAAO;aACrB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAAoB,EACpB,OAAe,EACf,GAA4B;IAE5B,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,wBAAwB;QACxB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { LinkedPR, ManifestPR, RepoInfo } from '../types.js';
|
|
2
|
+
import type { Manifest } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Link a branch to a manifest PR in state
|
|
5
|
+
*/
|
|
6
|
+
export declare function linkBranchToManifestPR(rootDir: string, branchName: string, manifestPRNumber: number): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Save linked PRs for a manifest PR
|
|
9
|
+
*/
|
|
10
|
+
export declare function saveLinkedPRs(rootDir: string, manifestPRNumber: number, linkedPRs: LinkedPR[]): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Get the manifest PR number for a branch
|
|
13
|
+
*/
|
|
14
|
+
export declare function getManifestPRForBranch(rootDir: string, branchName: string): Promise<number | undefined>;
|
|
15
|
+
/**
|
|
16
|
+
* Get linked PRs for a manifest PR from state
|
|
17
|
+
*/
|
|
18
|
+
export declare function getLinkedPRsFromState(rootDir: string, manifestPRNumber: number): Promise<LinkedPR[] | undefined>;
|
|
19
|
+
/**
|
|
20
|
+
* Refresh linked PR status from GitHub
|
|
21
|
+
*/
|
|
22
|
+
export declare function refreshLinkedPRStatus(manifest: Manifest, rootDir: string, linkedPRs: LinkedPR[]): Promise<LinkedPR[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Get full manifest PR info with refreshed linked PR status
|
|
25
|
+
*/
|
|
26
|
+
export declare function getManifestPRInfo(manifest: Manifest, rootDir: string, manifestOwner: string, manifestRepo: string, manifestPRNumber: number): Promise<ManifestPR>;
|
|
27
|
+
/**
|
|
28
|
+
* Update manifest PR body with current linked PR status
|
|
29
|
+
*/
|
|
30
|
+
export declare function syncManifestPRBody(manifest: Manifest, rootDir: string, manifestOwner: string, manifestRepo: string, manifestPRNumber: number): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Merge all linked PRs in order, then merge manifest PR
|
|
33
|
+
*/
|
|
34
|
+
export declare function mergeAllLinkedPRs(manifest: Manifest, rootDir: string, manifestOwner: string, manifestRepo: string, manifestPRNumber: number, options?: {
|
|
35
|
+
method?: 'merge' | 'squash' | 'rebase';
|
|
36
|
+
deleteBranch?: boolean;
|
|
37
|
+
}): Promise<{
|
|
38
|
+
success: boolean;
|
|
39
|
+
mergedPRs: {
|
|
40
|
+
repoName: string;
|
|
41
|
+
number: number;
|
|
42
|
+
}[];
|
|
43
|
+
failedPR?: {
|
|
44
|
+
repoName: string;
|
|
45
|
+
number: number;
|
|
46
|
+
error: string;
|
|
47
|
+
};
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* Check if all linked PRs are in sync (same branch name exists)
|
|
51
|
+
*/
|
|
52
|
+
export declare function checkBranchSync(repos: RepoInfo[], branchName: string): Promise<{
|
|
53
|
+
inSync: boolean;
|
|
54
|
+
missing: string[];
|
|
55
|
+
}>;
|
|
56
|
+
//# sourceMappingURL=linker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linker.d.ts","sourceRoot":"","sources":["../../src/lib/linker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAa,MAAM,aAAa,CAAC;AAW7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAG7B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,CAGjC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAerB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,UAAU,CAAC,CAmDrB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/E,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClD,QAAQ,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAChE,CAAC,CA4ED;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,QAAQ,EAAE,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAgBjD"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { getLinkedPRInfo, getPullRequest, updatePullRequestBody, generateManifestPRBody, parseLinkedPRsFromBody, mergePullRequest, } from './github.js';
|
|
2
|
+
import { loadState, saveState, getAllRepoInfo } from './manifest.js';
|
|
3
|
+
/**
|
|
4
|
+
* Link a branch to a manifest PR in state
|
|
5
|
+
*/
|
|
6
|
+
export async function linkBranchToManifestPR(rootDir, branchName, manifestPRNumber) {
|
|
7
|
+
const state = await loadState(rootDir);
|
|
8
|
+
state.branchToPR[branchName] = manifestPRNumber;
|
|
9
|
+
state.currentManifestPR = manifestPRNumber;
|
|
10
|
+
await saveState(rootDir, state);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Save linked PRs for a manifest PR
|
|
14
|
+
*/
|
|
15
|
+
export async function saveLinkedPRs(rootDir, manifestPRNumber, linkedPRs) {
|
|
16
|
+
const state = await loadState(rootDir);
|
|
17
|
+
state.prLinks[manifestPRNumber] = linkedPRs;
|
|
18
|
+
await saveState(rootDir, state);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get the manifest PR number for a branch
|
|
22
|
+
*/
|
|
23
|
+
export async function getManifestPRForBranch(rootDir, branchName) {
|
|
24
|
+
const state = await loadState(rootDir);
|
|
25
|
+
return state.branchToPR[branchName];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get linked PRs for a manifest PR from state
|
|
29
|
+
*/
|
|
30
|
+
export async function getLinkedPRsFromState(rootDir, manifestPRNumber) {
|
|
31
|
+
const state = await loadState(rootDir);
|
|
32
|
+
return state.prLinks[manifestPRNumber];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Refresh linked PR status from GitHub
|
|
36
|
+
*/
|
|
37
|
+
export async function refreshLinkedPRStatus(manifest, rootDir, linkedPRs) {
|
|
38
|
+
const repos = getAllRepoInfo(manifest, rootDir);
|
|
39
|
+
const repoMap = new Map(repos.map((r) => [r.name, r]));
|
|
40
|
+
const refreshed = await Promise.all(linkedPRs.map(async (pr) => {
|
|
41
|
+
const repoInfo = repoMap.get(pr.repoName);
|
|
42
|
+
if (!repoInfo) {
|
|
43
|
+
return pr; // Keep old info if repo not found
|
|
44
|
+
}
|
|
45
|
+
return getLinkedPRInfo(repoInfo.owner, repoInfo.repo, pr.number, pr.repoName);
|
|
46
|
+
}));
|
|
47
|
+
return refreshed;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get full manifest PR info with refreshed linked PR status
|
|
51
|
+
*/
|
|
52
|
+
export async function getManifestPRInfo(manifest, rootDir, manifestOwner, manifestRepo, manifestPRNumber) {
|
|
53
|
+
const pr = await getPullRequest(manifestOwner, manifestRepo, manifestPRNumber);
|
|
54
|
+
// Parse linked PRs from body
|
|
55
|
+
const parsedLinks = parseLinkedPRsFromBody(pr.body);
|
|
56
|
+
const repos = getAllRepoInfo(manifest, rootDir);
|
|
57
|
+
const repoMap = new Map(repos.map((r) => [r.name, r]));
|
|
58
|
+
// Get fresh status for each linked PR
|
|
59
|
+
const linkedPRs = await Promise.all(parsedLinks.map(async ({ repoName, number }) => {
|
|
60
|
+
const repoInfo = repoMap.get(repoName);
|
|
61
|
+
if (!repoInfo) {
|
|
62
|
+
// Return placeholder if repo not in manifest
|
|
63
|
+
return {
|
|
64
|
+
repoName,
|
|
65
|
+
owner: '',
|
|
66
|
+
repo: '',
|
|
67
|
+
number,
|
|
68
|
+
url: '',
|
|
69
|
+
state: 'closed',
|
|
70
|
+
approved: false,
|
|
71
|
+
checksPass: false,
|
|
72
|
+
mergeable: false,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return getLinkedPRInfo(repoInfo.owner, repoInfo.repo, number, repoName);
|
|
76
|
+
}));
|
|
77
|
+
// Determine overall state
|
|
78
|
+
let state;
|
|
79
|
+
if (pr.merged) {
|
|
80
|
+
state = 'merged';
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
state = pr.state;
|
|
84
|
+
}
|
|
85
|
+
// Check if ready to merge (all linked PRs approved and checks pass)
|
|
86
|
+
const readyToMerge = state === 'open' &&
|
|
87
|
+
linkedPRs.every((p) => p.approved && p.checksPass && p.mergeable && p.state === 'open');
|
|
88
|
+
return {
|
|
89
|
+
number: pr.number,
|
|
90
|
+
url: pr.url,
|
|
91
|
+
title: pr.title,
|
|
92
|
+
linkedPRs,
|
|
93
|
+
state,
|
|
94
|
+
readyToMerge,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Update manifest PR body with current linked PR status
|
|
99
|
+
*/
|
|
100
|
+
export async function syncManifestPRBody(manifest, rootDir, manifestOwner, manifestRepo, manifestPRNumber) {
|
|
101
|
+
const manifestPR = await getManifestPRInfo(manifest, rootDir, manifestOwner, manifestRepo, manifestPRNumber);
|
|
102
|
+
// Get original PR for title
|
|
103
|
+
const pr = await getPullRequest(manifestOwner, manifestRepo, manifestPRNumber);
|
|
104
|
+
// Generate updated body
|
|
105
|
+
const newBody = generateManifestPRBody(pr.title, manifestPR.linkedPRs);
|
|
106
|
+
// Update PR
|
|
107
|
+
await updatePullRequestBody(manifestOwner, manifestRepo, manifestPRNumber, newBody);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Merge all linked PRs in order, then merge manifest PR
|
|
111
|
+
*/
|
|
112
|
+
export async function mergeAllLinkedPRs(manifest, rootDir, manifestOwner, manifestRepo, manifestPRNumber, options = {}) {
|
|
113
|
+
const manifestPR = await getManifestPRInfo(manifest, rootDir, manifestOwner, manifestRepo, manifestPRNumber);
|
|
114
|
+
if (!manifestPR.readyToMerge) {
|
|
115
|
+
const notReady = manifestPR.linkedPRs.find((p) => !p.approved || !p.checksPass || !p.mergeable || p.state !== 'open');
|
|
116
|
+
return {
|
|
117
|
+
success: false,
|
|
118
|
+
mergedPRs: [],
|
|
119
|
+
failedPR: notReady
|
|
120
|
+
? {
|
|
121
|
+
repoName: notReady.repoName,
|
|
122
|
+
number: notReady.number,
|
|
123
|
+
error: !notReady.approved
|
|
124
|
+
? 'Not approved'
|
|
125
|
+
: !notReady.checksPass
|
|
126
|
+
? 'Checks not passing'
|
|
127
|
+
: !notReady.mergeable
|
|
128
|
+
? 'Not mergeable'
|
|
129
|
+
: 'PR not open',
|
|
130
|
+
}
|
|
131
|
+
: undefined,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const mergedPRs = [];
|
|
135
|
+
// Merge each linked PR
|
|
136
|
+
for (const linkedPR of manifestPR.linkedPRs) {
|
|
137
|
+
const merged = await mergePullRequest(linkedPR.owner, linkedPR.repo, linkedPR.number, options);
|
|
138
|
+
if (!merged) {
|
|
139
|
+
return {
|
|
140
|
+
success: false,
|
|
141
|
+
mergedPRs,
|
|
142
|
+
failedPR: {
|
|
143
|
+
repoName: linkedPR.repoName,
|
|
144
|
+
number: linkedPR.number,
|
|
145
|
+
error: 'Merge failed',
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
mergedPRs.push({ repoName: linkedPR.repoName, number: linkedPR.number });
|
|
150
|
+
}
|
|
151
|
+
// Merge manifest PR
|
|
152
|
+
const manifestMerged = await mergePullRequest(manifestOwner, manifestRepo, manifestPRNumber, options);
|
|
153
|
+
if (!manifestMerged) {
|
|
154
|
+
return {
|
|
155
|
+
success: false,
|
|
156
|
+
mergedPRs,
|
|
157
|
+
failedPR: {
|
|
158
|
+
repoName: 'manifest',
|
|
159
|
+
number: manifestPRNumber,
|
|
160
|
+
error: 'Manifest PR merge failed',
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
mergedPRs.push({ repoName: 'manifest', number: manifestPRNumber });
|
|
165
|
+
return {
|
|
166
|
+
success: true,
|
|
167
|
+
mergedPRs,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Check if all linked PRs are in sync (same branch name exists)
|
|
172
|
+
*/
|
|
173
|
+
export async function checkBranchSync(repos, branchName) {
|
|
174
|
+
const { branchExists } = await import('./git.js');
|
|
175
|
+
const results = await Promise.all(repos.map(async (repo) => {
|
|
176
|
+
const exists = await branchExists(repo.absolutePath, branchName);
|
|
177
|
+
return { name: repo.name, exists };
|
|
178
|
+
}));
|
|
179
|
+
const missing = results.filter((r) => !r.exists).map((r) => r.name);
|
|
180
|
+
return {
|
|
181
|
+
inSync: missing.length === 0,
|
|
182
|
+
missing,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=linker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linker.js","sourceRoot":"","sources":["../../src/lib/linker.ts"],"names":[],"mappings":"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"}
|