@fairgarden/distribution 0.1.0-alpha.1 → 0.1.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/Readme.md +3 -3
  2. package/dist/add-module.d.ts +4 -0
  3. package/dist/add-module.d.ts.map +1 -1
  4. package/dist/add-module.js +29 -0
  5. package/dist/add-module.js.map +1 -1
  6. package/dist/calver.d.ts +65 -0
  7. package/dist/calver.d.ts.map +1 -0
  8. package/dist/calver.js +115 -0
  9. package/dist/calver.js.map +1 -0
  10. package/dist/canary.d.ts.map +1 -1
  11. package/dist/canary.js +15 -2
  12. package/dist/canary.js.map +1 -1
  13. package/dist/changelog.d.ts +153 -0
  14. package/dist/changelog.d.ts.map +1 -0
  15. package/dist/changelog.js +359 -0
  16. package/dist/changelog.js.map +1 -0
  17. package/dist/cli.js +356 -12
  18. package/dist/cli.js.map +1 -1
  19. package/dist/extends.d.ts +3 -2
  20. package/dist/extends.d.ts.map +1 -1
  21. package/dist/extends.js +12 -2
  22. package/dist/extends.js.map +1 -1
  23. package/dist/forks.d.ts +116 -0
  24. package/dist/forks.d.ts.map +1 -0
  25. package/dist/forks.js +357 -0
  26. package/dist/forks.js.map +1 -0
  27. package/dist/index.d.ts +7 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +3 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/inherit.d.ts +18 -0
  32. package/dist/inherit.d.ts.map +1 -0
  33. package/dist/inherit.js +84 -0
  34. package/dist/inherit.js.map +1 -0
  35. package/dist/manifest.d.ts +43 -0
  36. package/dist/manifest.d.ts.map +1 -0
  37. package/dist/manifest.js +64 -0
  38. package/dist/manifest.js.map +1 -0
  39. package/dist/policy.d.ts +5 -1
  40. package/dist/policy.d.ts.map +1 -1
  41. package/dist/policy.js +14 -6
  42. package/dist/policy.js.map +1 -1
  43. package/dist/readme.d.ts +2 -0
  44. package/dist/readme.d.ts.map +1 -1
  45. package/dist/readme.js +6 -1
  46. package/dist/readme.js.map +1 -1
  47. package/dist/release.d.ts +37 -1
  48. package/dist/release.d.ts.map +1 -1
  49. package/dist/release.js +107 -7
  50. package/dist/release.js.map +1 -1
  51. package/dist/scaffold.d.ts +3 -5
  52. package/dist/scaffold.d.ts.map +1 -1
  53. package/dist/scaffold.js +116 -64
  54. package/dist/scaffold.js.map +1 -1
  55. package/dist/submodules.d.ts +49 -0
  56. package/dist/submodules.d.ts.map +1 -1
  57. package/dist/submodules.js +94 -4
  58. package/dist/submodules.js.map +1 -1
  59. package/dist/workflows.d.ts +46 -1
  60. package/dist/workflows.d.ts.map +1 -1
  61. package/dist/workflows.js +401 -20
  62. package/dist/workflows.js.map +1 -1
  63. package/package.json +14 -12
package/dist/forks.js ADDED
@@ -0,0 +1,357 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import semver from 'semver';
5
+ import { CHANGELOG, aheadEntry, bumpEntry, crossedReleases, moduleLabel, noteInDistribution, releaseNotesLinks, repositoryLink, shown, topVersion, } from "./changelog.js";
6
+ import { existsSync } from 'node:fs';
7
+ import { describeRemote, toHttps } from "./git-url.js";
8
+ import { UPSTREAM, containsAll, ensureUpstreamRemote, gitmodulesSet, moveTo, setUrl, } from "./submodules.js";
9
+ /**
10
+ * Forking a module, from inside a distribution.
11
+ *
12
+ * A fork is the module checked out from somewhere you can push to, with the
13
+ * repository it came from recorded beside it. You fix or add something there,
14
+ * offer it upstream as a pull request, and meanwhile ship it. Updating works
15
+ * as it does for any module, except that a fork takes upstream's releases by
16
+ * merging them in. Once upstream has everything the fork adds, you can go back
17
+ * to upstream, or keep the fork.
18
+ */
19
+ /** Run git, throwing with what it said when it fails. */
20
+ const run = (cwd, args) => {
21
+ try {
22
+ return execFileSync('git', args, {
23
+ cwd,
24
+ encoding: 'utf8',
25
+ stdio: ['ignore', 'pipe', 'pipe'],
26
+ }).trim();
27
+ }
28
+ catch (cause) {
29
+ const stderr = cause instanceof Error && 'stderr' in cause ? String(cause.stderr).trim() : '';
30
+ throw new Error(`git ${args[0]} failed in ${cwd}${stderr ? `:\n${stderr}` : ''}`, { cause });
31
+ }
32
+ };
33
+ /** Run git, returning undefined rather than throwing when it fails. */
34
+ const attempt = (cwd, args) => {
35
+ try {
36
+ return run(cwd, args);
37
+ }
38
+ catch {
39
+ return undefined;
40
+ }
41
+ };
42
+ /**
43
+ * The branch in a fork that holds everything this distribution pins, named
44
+ * after the distribution.
45
+ *
46
+ * Not the pull request's branch: GitHub deletes that once it is merged, and a
47
+ * pinned commit has to stay fetchable for as long as anything pins it. Not the
48
+ * fork's main either, which is upstream's to follow.
49
+ */
50
+ export const distributionBranch = (root) => {
51
+ let name;
52
+ try {
53
+ name = JSON.parse(readFileSync(path.join(root, 'package.json'), 'utf8')).name;
54
+ }
55
+ catch {
56
+ name = undefined;
57
+ }
58
+ return (typeof name === 'string' ? name : path.basename(root))
59
+ .replace(/^@/, '')
60
+ .replace(/[^A-Za-z0-9._-]+/g, '-');
61
+ };
62
+ /**
63
+ * Put the checked-out commit on the fork's distribution branch, which only
64
+ * moves forward. `to` is the fork's url, or `origin` once it is the fork.
65
+ */
66
+ const pushPinned = (submodule, branch, to = 'origin') => {
67
+ try {
68
+ run(submodule.path, ['push', '--quiet', to, `HEAD:refs/heads/${branch}`]);
69
+ }
70
+ catch (cause) {
71
+ const fork = to === 'origin' ? submodule.url : to;
72
+ throw new Error(`${branch} on ${describeRemote(fork)} has commits that ${submodule.relativePath} does not. ` +
73
+ `Merge them in first, then run this again:\n` +
74
+ ` cd ${submodule.relativePath} && git fetch ${fork} ${branch} && git merge FETCH_HEAD`, { cause });
75
+ }
76
+ };
77
+ /** `https://github.com/acme/id.git` -> `acme/id`; undefined anywhere else. */
78
+ export const githubRepo = (url) => /^https:\/\/github\.com\/([^/]+\/[^/]+?)(?:\.git)?\/?$/i.exec(toHttps(url))?.[1];
79
+ /** The branch a remote's HEAD names, which is where pull requests go. */
80
+ const defaultBranch = (cwd, remote) => {
81
+ const read = () => attempt(cwd, ['symbolic-ref', '--short', `refs/remotes/${remote}/HEAD`])?.replace(`${remote}/`, '');
82
+ const known = read();
83
+ if (known)
84
+ return known;
85
+ attempt(cwd, ['remote', 'set-head', remote, '--auto']);
86
+ return read() ?? 'main';
87
+ };
88
+ /**
89
+ * Check a module out from a fork, keeping where it came from.
90
+ *
91
+ * The fork has to exist already — on GitHub, the Fork button — since creating
92
+ * repositories is not something to do behind anyone's back. Forking a fork
93
+ * keeps the original upstream.
94
+ */
95
+ export const forkModule = (root, submodule, url, { ssh = false, push = true } = {}) => {
96
+ const fork = ssh ? url : toHttps(url);
97
+ const upstream = submodule.upstream ?? submodule.url;
98
+ if (fork === submodule.url) {
99
+ throw new Error(`${submodule.relativePath} is already checked out from ${fork}.`);
100
+ }
101
+ if (fork === upstream) {
102
+ throw new Error(`${fork} is where ${submodule.relativePath} was forked from. ` +
103
+ `Run \`fg-dist unfork ${submodule.name}\` to go back to it.`);
104
+ }
105
+ // Before anything is written: a fork nobody can read is a pin nobody can fetch.
106
+ if (attempt(submodule.path, ['ls-remote', '--heads', fork]) === undefined) {
107
+ throw new Error(`Could not read ${fork}. Fork ${describeRemote(upstream)} there first, then run this again.`);
108
+ }
109
+ // Pushed before anything is recorded, so a refusal leaves the module as it was.
110
+ const branch = distributionBranch(root);
111
+ if (push)
112
+ pushPinned(submodule, branch, fork);
113
+ gitmodulesSet(root, submodule.configName, 'upstream', upstream);
114
+ setUrl(root, submodule, fork);
115
+ run(submodule.path, ['remote', 'set-url', 'origin', fork]);
116
+ ensureUpstreamRemote(submodule.path, upstream);
117
+ attempt(submodule.path, ['fetch', '--quiet', 'origin']);
118
+ attempt(submodule.path, ['fetch', '--quiet', '--tags', UPSTREAM]);
119
+ const { name } = moduleLabel(submodule.path);
120
+ noteInDistribution(root, `\`${name}\` forked to ${repositoryLink(fork)}, from ${repositoryLink(upstream)}`);
121
+ return { url: fork, upstream, rewritten: fork !== url, branch: push ? branch : undefined };
122
+ };
123
+ /** A pull request's title, as GitHub has it. */
124
+ const pullRequestTitle = (cwd, url) => {
125
+ try {
126
+ return (execFileSync('gh', ['pr', 'view', url, '--json', 'title', '--jq', '.title'], {
127
+ cwd,
128
+ encoding: 'utf8',
129
+ stdio: ['ignore', 'pipe', 'ignore'],
130
+ }).trim() || undefined);
131
+ }
132
+ catch {
133
+ return undefined;
134
+ }
135
+ };
136
+ /**
137
+ * The changelog line a pull request still needs, with its link: only the
138
+ * words are left, which are the author's to write. Undefined for a module
139
+ * without a changelog, or one that links the pull request already.
140
+ */
141
+ const changelogLine = (submodule, pullRequest) => {
142
+ const file = path.join(submodule.path, CHANGELOG);
143
+ if (!existsSync(file))
144
+ return undefined;
145
+ const text = readFileSync(file, 'utf8');
146
+ if (text.toLowerCase().includes(pullRequest.replace(/^https?:\/\//, '').toLowerCase()))
147
+ return undefined;
148
+ const version = topVersion(text);
149
+ const number = /\/pull\/(\d+)/.exec(pullRequest)?.[1];
150
+ if (!version || !number)
151
+ return undefined;
152
+ return {
153
+ file: path.join(submodule.relativePath, CHANGELOG),
154
+ version,
155
+ line: `- What this changes, for someone using it ([#${number}](${pullRequest}))`,
156
+ };
157
+ };
158
+ /**
159
+ * Offer what is on the checkout's branch upstream, as a pull request.
160
+ *
161
+ * For a fork the branch goes to the fork and the pull request to upstream; for
162
+ * a module you can push to, both go to its own repository. A fork also moves
163
+ * its distribution branch up to the commit, since that is what is pinned and
164
+ * the pull request's branch is gone once merged.
165
+ */
166
+ export const contribute = (root, submodule, { push = true, base } = {}) => {
167
+ const cwd = submodule.path;
168
+ const branch = attempt(cwd, ['symbolic-ref', '--short', '-q', 'HEAD']);
169
+ if (!branch) {
170
+ throw new Error(`${submodule.relativePath} is not on a branch. Start one for the change:\n` +
171
+ ` cd ${submodule.relativePath} && git switch -c <name>`);
172
+ }
173
+ if ((attempt(cwd, ['status', '--porcelain']) ?? '') !== '') {
174
+ throw new Error(`${submodule.relativePath} has uncommitted changes. Commit them first.`);
175
+ }
176
+ const fork = submodule.upstream;
177
+ const remote = fork ? UPSTREAM : 'origin';
178
+ const repository = fork ?? submodule.url;
179
+ if (fork) {
180
+ ensureUpstreamRemote(cwd, fork);
181
+ attempt(cwd, ['fetch', '--quiet', UPSTREAM]);
182
+ }
183
+ const into = base ?? defaultBranch(cwd, remote);
184
+ if (!fork && branch === into) {
185
+ throw new Error(`${submodule.relativePath} is on ${into} itself. A pull request needs a branch of its own:\n` +
186
+ ` cd ${submodule.relativePath} && git switch -c <name>`);
187
+ }
188
+ const upstreamRepo = githubRepo(repository);
189
+ const ownRepo = githubRepo(submodule.url);
190
+ const head = fork && ownRepo ? `${ownRepo.split('/')[0]}:${branch}` : branch;
191
+ const compare = upstreamRepo
192
+ ? `https://github.com/${upstreamRepo}/compare/${into}...${head}?expand=1`
193
+ : undefined;
194
+ if (!push) {
195
+ return { branch, repository, base: into, pullRequest: undefined, compare, pinnedOn: undefined };
196
+ }
197
+ run(cwd, ['push', '--quiet', '-u', 'origin', branch]);
198
+ const pinnedOn = fork ? distributionBranch(root) : undefined;
199
+ if (pinnedOn)
200
+ pushPinned(submodule, pinnedOn);
201
+ let pullRequest;
202
+ if (upstreamRepo) {
203
+ try {
204
+ const output = execFileSync('gh', ['pr', 'create', '--repo', upstreamRepo, '--base', into, '--head', head, '--fill'], { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
205
+ pullRequest = /https:\/\/\S+/.exec(output)?.[0];
206
+ }
207
+ catch {
208
+ // No gh, not signed in, or one already open: the compare link does the rest.
209
+ pullRequest = undefined;
210
+ }
211
+ }
212
+ // What the change is, in the distribution's changelog: the pull request's
213
+ // title, or without one, what its last commit says. Never the branch's name,
214
+ // which means nothing to anyone reading it.
215
+ const title = (pullRequest && pullRequestTitle(cwd, pullRequest)) ||
216
+ attempt(cwd, ['log', '-1', '--format=%s']) ||
217
+ branch;
218
+ // Linked where it can be read about: its pull request, or else its commit.
219
+ const { name } = moduleLabel(cwd);
220
+ const number = pullRequest && /\/pull\/(\d+)/.exec(pullRequest)?.[1];
221
+ const tip = attempt(cwd, ['rev-parse', 'HEAD']);
222
+ const link = pullRequest && upstreamRepo && number
223
+ ? { text: `${upstreamRepo}#${number}`, url: pullRequest }
224
+ : ownRepo && tip
225
+ ? { text: `${ownRepo}@${tip.slice(0, 7)}`, url: `https://github.com/${ownRepo}/commit/${tip}` }
226
+ : undefined;
227
+ noteInDistribution(root, aheadEntry(name, title, link));
228
+ // The module's own line is written by whoever made the change, and reviewed
229
+ // with it; only its link is known here.
230
+ const changelog = pullRequest ? changelogLine(submodule, pullRequest) : undefined;
231
+ return { branch, repository, base: into, pullRequest, compare, pinnedOn, changelog };
232
+ };
233
+ /**
234
+ * Take an upstream release into a fork: what `bump` does for one.
235
+ *
236
+ * When the release already has everything the fork adds, the fork is simply
237
+ * moved to it — upstream has taken the work, and the fork could be dropped.
238
+ * Otherwise the release is merged into the fork, keeping the fork's changes on
239
+ * top, and pushed to the distribution branch. A merge rather than a rebase, so
240
+ * every commit an older distribution pinned stays in the fork.
241
+ */
242
+ export const integrate = (root, state, tag, { push = true } = {}) => {
243
+ const { submodule } = state;
244
+ const cwd = submodule.path;
245
+ const upstream = submodule.upstream ?? submodule.url;
246
+ const { name } = moduleLabel(cwd);
247
+ const from = state.current ?? state.head.slice(0, 7);
248
+ const releases = crossedReleases(state.available, tag);
249
+ if (containsAll(cwd, `refs/tags/${tag}`, state.head)) {
250
+ moveTo(submodule, tag);
251
+ // The fork may not have the release yet, and it is what is pinned now.
252
+ if (push)
253
+ run(cwd, ['push', '--quiet', 'origin', `refs/tags/${tag}`]);
254
+ noteInDistribution(root, bumpEntry(name, from, tag, upstream, releases, 'which has everything the fork added'));
255
+ return { how: 'moved', pushed: push ? tag : undefined };
256
+ }
257
+ try {
258
+ run(cwd, [
259
+ 'merge',
260
+ '--no-edit',
261
+ '--quiet',
262
+ '-m',
263
+ `Merge ${tag} from ${describeRemote(upstream)}`,
264
+ `refs/tags/${tag}`,
265
+ ]);
266
+ }
267
+ catch (cause) {
268
+ attempt(cwd, ['merge', '--abort']);
269
+ throw new Error(`${tag} does not merge cleanly into ${submodule.relativePath}. Merge it by hand, ` +
270
+ `then push, and commit the new pin:\n cd ${submodule.relativePath} && git merge ${tag}`, { cause });
271
+ }
272
+ const branch = distributionBranch(root);
273
+ if (push)
274
+ pushPinned(submodule, branch);
275
+ noteInDistribution(root, bumpEntry(name, from, tag, upstream, releases, 'merged into the fork'));
276
+ return { how: 'merged', pushed: push ? branch : undefined };
277
+ };
278
+ /** Commits the fork has that `base` does not, for saying what would be lost. */
279
+ const notIn = (cwd, base) => (attempt(cwd, [
280
+ 'log',
281
+ '--no-merges',
282
+ '--cherry-pick',
283
+ '--right-only',
284
+ '--format=%h %s',
285
+ `${base}...HEAD`,
286
+ ]) ?? '')
287
+ .split('\n')
288
+ .filter(Boolean);
289
+ /**
290
+ * Check a forked module out from its upstream again.
291
+ *
292
+ * Only to something that has everything the fork adds, unless forced: going
293
+ * back means the fork's commits stop shipping, and that should be because
294
+ * upstream has them, not by accident. Without `to`, the oldest upstream release
295
+ * from the pinned version on that has them is chosen — going back to upstream
296
+ * is not the moment to upgrade as well.
297
+ */
298
+ export const unforkModule = (root, state, { to, major = false, force = false } = {}) => {
299
+ const { submodule } = state;
300
+ const cwd = submodule.path;
301
+ const upstream = submodule.upstream;
302
+ if (!upstream) {
303
+ throw new Error(`${submodule.relativePath} is not a fork; it is checked out from ${submodule.url}.`);
304
+ }
305
+ if (state.dirty) {
306
+ throw new Error(`${submodule.relativePath} has uncommitted changes. Commit or drop them first.`);
307
+ }
308
+ let target;
309
+ let label;
310
+ if (to) {
311
+ const ref = [`refs/tags/${to}`, `${UPSTREAM}/${to}`, to].find((candidate) => attempt(cwd, ['rev-parse', '--verify', '--quiet', `${candidate}^{commit}`]) !== undefined);
312
+ if (!ref)
313
+ throw new Error(`${to} is not a tag, upstream branch or commit in ${submodule.relativePath}.`);
314
+ const lost = containsAll(cwd, ref, state.head) ? [] : notIn(cwd, ref);
315
+ if (lost.length > 0 && !force) {
316
+ throw new Error(`${to} does not have everything the fork adds:\n${lost.map((line) => ` ${line}`).join('\n')}\n` +
317
+ 'Pass --force to go back anyway and stop shipping them.');
318
+ }
319
+ target = ref;
320
+ label = to;
321
+ }
322
+ else {
323
+ const merged = state.fork?.merged;
324
+ if (!merged) {
325
+ const tip = `${UPSTREAM}/HEAD`;
326
+ const lost = notIn(cwd, attempt(cwd, ['rev-parse', '--verify', '--quiet', tip]) ? tip : 'HEAD');
327
+ throw new Error(`Upstream has not taken everything ${submodule.relativePath} adds yet:\n` +
328
+ `${lost.map((line) => ` ${line}`).join('\n')}\n` +
329
+ 'Keep the fork until it has, or pass --to <tag> --force to go back without them.');
330
+ }
331
+ if (!semver.valid(merged)) {
332
+ throw new Error(`Only ${merged} has everything ${submodule.relativePath} adds, and it is not a release yet. ` +
333
+ `Wait for one, or pass --to ${merged.replace(`${UPSTREAM}/`, '')} to go back to the branch.`);
334
+ }
335
+ if (!major && state.current && semver.major(merged) !== semver.major(state.current)) {
336
+ throw new Error(`The first release with everything ${submodule.relativePath} adds is ${merged}, a major ` +
337
+ 'upgrade. Pass --major to go back to it.');
338
+ }
339
+ target = `refs/tags/${merged}`;
340
+ label = merged;
341
+ }
342
+ const lost = containsAll(cwd, target, state.head) ? [] : notIn(cwd, target);
343
+ run(cwd, ['checkout', '--quiet', `${target}^{commit}`]);
344
+ setUrl(root, submodule, upstream);
345
+ run(cwd, ['remote', 'set-url', 'origin', upstream]);
346
+ gitmodulesSet(root, submodule.configName, 'upstream', undefined);
347
+ attempt(cwd, ['remote', 'remove', UPSTREAM]);
348
+ const { name } = moduleLabel(cwd);
349
+ const notes = semver.valid(label) ? releaseNotesLinks(upstream, crossedReleases(state.available, label)) : '';
350
+ noteInDistribution(root, `\`${name}\` back to ${repositoryLink(upstream)} at ${shown(label)}, ` +
351
+ (lost.length > 0
352
+ ? `leaving behind ${lost.length} commit${lost.length === 1 ? '' : 's'} of the fork's that upstream does not have`
353
+ : 'which has everything the fork added') +
354
+ notes);
355
+ return { url: upstream, to: label };
356
+ };
357
+ //# sourceMappingURL=forks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forks.js","sourceRoot":"","sources":["../src/forks.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -11,4 +11,11 @@ export { assertExtends, describeViolations, findFloorViolations, inspectExtends,
11
11
  export type { Distribution, ExtendsReport, FloorViolation } from './extends.ts';
12
12
  export { buildPolicy, findPolicy, setupTurbo, testPolicy, turboTasks, usePolicy } from './policy.ts';
13
13
  export type { DistributionPolicy } from './policy.ts';
14
+ export { contribute, distributionBranch, forkModule, integrate, unforkModule } from './forks.ts';
15
+ export type { ContributeResult, ForkResult, Integration, UnforkResult } from './forks.ts';
16
+ export type { ForkState } from './submodules.ts';
17
+ export { readPublishedModules, shippedModules, stampModules } from './manifest.ts';
18
+ export type { PublishedModule, PublishedModules } from './manifest.ts';
19
+ export { inherit } from './inherit.ts';
20
+ export type { Inheritance, InheritedModule } from './inherit.ts';
14
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,OAAO,EACP,eAAe,EACf,KAAK,GACN,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACtE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAExE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAC5D,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE7D,OAAO,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,cAAc,EACd,MAAM,EACN,UAAU,EACV,MAAM,GACP,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAE7E,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,UAAU,GACX,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE/E,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACpG,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,OAAO,EACP,eAAe,EACf,KAAK,GACN,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACtE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAExE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAC5D,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE7D,OAAO,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,cAAc,EACd,MAAM,EACN,UAAU,EACV,MAAM,GACP,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAE7E,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,UAAU,GACX,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE/E,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACpG,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAChG,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzF,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAClF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEtE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA"}
package/dist/index.js CHANGED
@@ -5,4 +5,7 @@ export { describeRemote, isSsh, toHttps } from "./git-url.js";
5
5
  export { inspect, isPublic, moveTo, repositoryRoot, setUrl, submodules, target, } from "./submodules.js";
6
6
  export { assertExtends, describeViolations, findFloorViolations, inspectExtends, readDistribution, readParent, } from "./extends.js";
7
7
  export { buildPolicy, findPolicy, setupTurbo, testPolicy, turboTasks, usePolicy } from "./policy.js";
8
+ export { contribute, distributionBranch, forkModule, integrate, unforkModule } from "./forks.js";
9
+ export { readPublishedModules, shippedModules, stampModules } from "./manifest.js";
10
+ export { inherit } from "./inherit.js";
8
11
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,OAAO,EACP,eAAe,EACf,KAAK,GACN,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAGtE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAG5D,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE7D,OAAO,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,cAAc,EACd,MAAM,EACN,UAAU,EACV,MAAM,GACP,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,UAAU,GACX,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,OAAO,EACP,eAAe,EACf,KAAK,GACN,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAGtE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAG5D,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE7D,OAAO,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,cAAc,EACd,MAAM,EACN,UAAU,EACV,MAAM,GACP,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,UAAU,GACX,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGpG,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAIhG,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAGlF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { type PublishedModule } from './manifest.ts';
2
+ export interface InheritedModule extends PublishedModule {
3
+ name: string;
4
+ }
5
+ export interface Inheritance {
6
+ parent: string;
7
+ parentVersion: string;
8
+ /** Added, or with a dry run, what would be. */
9
+ added: InheritedModule[];
10
+ /** Shipped already, at whatever version: `check` and `bump` see to that. */
11
+ shipped: string[];
12
+ /** Something is already where the parent has the module. */
13
+ blocked: InheritedModule[];
14
+ }
15
+ export declare const inherit: (root: string, { dryRun }?: {
16
+ dryRun?: boolean;
17
+ }) => Promise<Inheritance>;
18
+ //# sourceMappingURL=inherit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inherit.d.ts","sourceRoot":"","sources":["../src/inherit.ts"],"names":[],"mappings":"AAMA,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAsB1E,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,+CAA+C;IAC/C,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,4DAA4D;IAC5D,OAAO,EAAE,eAAe,EAAE,CAAA;CAC3B;AAED,eAAO,MAAM,OAAO,GAClB,MAAM,MAAM,EACZ,aAAoB;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,KAC5C,OAAO,CAAC,WAAW,CAqErB,CAAA"}
@@ -0,0 +1,84 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import path from 'node:path';
5
+ import { addModule } from "./add-module.js";
6
+ import { readDistribution } from "./extends.js";
7
+ import { readPublishedModules } from "./manifest.js";
8
+ import { noteInDistribution, repositoryLink } from "./changelog.js";
9
+ import { ensureUpstreamRemote, gitmodulesSet, submodules } from "./submodules.js";
10
+ /**
11
+ * Ship what the distribution this extends ships.
12
+ *
13
+ * An extension starts from its parent: every module the parent's published
14
+ * manifest records, added where the parent has it, from the repository the
15
+ * parent clones it from, at the commit the parent pins. A module the parent
16
+ * ships as a fork comes as the same fork. After that it is the extension's —
17
+ * bumped, forked or moved ahead as it likes, never behind.
18
+ */
19
+ const git = (cwd, args) => {
20
+ try {
21
+ return execFileSync('git', args, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
22
+ }
23
+ catch {
24
+ return undefined;
25
+ }
26
+ };
27
+ export const inherit = async (root, { dryRun = false } = {}) => {
28
+ const own = readDistribution(root);
29
+ if (!own.extends)
30
+ throw new Error(`${own.name} extends nothing, so there is nothing to inherit.`);
31
+ let manifest;
32
+ try {
33
+ const file = createRequire(path.join(root, 'package.json')).resolve(`${own.extends}/package.json`);
34
+ manifest = JSON.parse(readFileSync(file, 'utf8'));
35
+ }
36
+ catch {
37
+ throw new Error(`${own.extends} is not installed, so there is nothing to read. Run pnpm install first.`);
38
+ }
39
+ const published = readPublishedModules(manifest);
40
+ if (!published) {
41
+ throw new Error(`${own.extends}@${manifest.version} does not record where its modules live. ` +
42
+ 'Publish it again with this version of fg-dist, or add them with `fg-dist add-module <url>`.');
43
+ }
44
+ const inheritance = {
45
+ parent: own.extends,
46
+ parentVersion: manifest.version ?? '',
47
+ added: [],
48
+ shipped: [],
49
+ blocked: [],
50
+ };
51
+ for (const [name, module] of Object.entries(published)) {
52
+ if (own.modules[name] !== undefined) {
53
+ inheritance.shipped.push(name);
54
+ continue;
55
+ }
56
+ const target = path.join(root, module.path);
57
+ if (existsSync(target) && readdirSync(target).length > 0) {
58
+ inheritance.blocked.push({ name, ...module });
59
+ continue;
60
+ }
61
+ inheritance.added.push({ name, ...module });
62
+ if (dryRun)
63
+ continue;
64
+ await addModule(root, module.repository, { at: module.path, changelog: false });
65
+ // What the parent pins, which may be past the release its version names.
66
+ if (git(target, ['checkout', '--quiet', module.commit]) === undefined) {
67
+ git(target, ['fetch', '--quiet', 'origin', module.commit]);
68
+ if (git(target, ['checkout', '--quiet', module.commit]) === undefined) {
69
+ throw new Error(`${module.repository} does not have ${module.commit}, which ${own.extends} ships as ${name}.`);
70
+ }
71
+ }
72
+ if (module.upstream) {
73
+ const added = submodules(root).find((submodule) => submodule.relativePath === module.path);
74
+ if (added) {
75
+ gitmodulesSet(root, added.configName, 'upstream', module.upstream);
76
+ ensureUpstreamRemote(target, module.upstream);
77
+ }
78
+ }
79
+ noteInDistribution(root, `\`${name}\` ${module.version} added, as ${own.extends} ships it, from ${repositoryLink(module.repository)}` +
80
+ (module.upstream ? `, a fork of ${repositoryLink(module.upstream)}` : ''));
81
+ }
82
+ return inheritance;
83
+ };
84
+ //# sourceMappingURL=inherit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inherit.js","sourceRoot":"","sources":["../src/inherit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * What a published distribution says it ships.
3
+ *
4
+ * In the repository the submodules are the record, and nothing restates them.
5
+ * A published distribution has no submodules, so its manifest carries them —
6
+ * written into `distribution.modules` as it is published, never committed.
7
+ * That is what an extension is checked against, and what it takes its own
8
+ * modules from.
9
+ */
10
+ export interface PublishedModule {
11
+ version: string;
12
+ /** Where it sits in the distribution, which an extension puts it at too. */
13
+ path: string;
14
+ /** What it is cloned from: the fork, for a module the distribution forked. */
15
+ repository: string;
16
+ /** Where a fork was forked from. */
17
+ upstream?: string;
18
+ /** The commit shipped, which may be ahead of the version's release. */
19
+ commit: string;
20
+ }
21
+ export type PublishedModules = Record<string, PublishedModule>;
22
+ /** What this distribution ships, read from its checkouts. */
23
+ export declare const shippedModules: (root: string) => PublishedModules;
24
+ /**
25
+ * Write what the distribution ships into its manifest, ready to publish.
26
+ *
27
+ * For CI, before `npm publish`: the repository's manifest is left without it,
28
+ * since the submodules already say it.
29
+ */
30
+ export declare const stampModules: (root: string, fields?: {
31
+ version?: string;
32
+ gitSha?: string;
33
+ }) => Promise<PublishedModules>;
34
+ /**
35
+ * The modules a published distribution records, with where each lives, or
36
+ * undefined when it records none: published before this was written down.
37
+ */
38
+ export declare const readPublishedModules: (manifest: {
39
+ distribution?: {
40
+ modules?: unknown;
41
+ };
42
+ }) => PublishedModules | undefined;
43
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAA;IACZ,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAA;IAClB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;AAE9D,6DAA6D;AAC7D,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,gBA2B7C,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,MAAM,EACZ,SAAQ;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,KACjD,OAAO,CAAC,gBAAgB,CAiB1B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,UAAU;IAC7C,YAAY,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CACrC,KAAG,gBAAgB,GAAG,SAWtB,CAAA"}