@meza/adr-tools 1.0.10 → 1.0.11
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/.gitattributes +40 -0
- package/.github/renovate.json +5 -0
- package/.github/workflows/ci-pr.yml +44 -0
- package/.github/workflows/ci.yml +19 -20
- package/.github/workflows/sync-deps-to-main.yml +25 -0
- package/.github/workflows/sync-to-deps.yml +26 -0
- package/.releaserc.json +2 -7
- package/CHANGELOG.md +69 -0
- package/LICENSE +674 -0
- package/README.md +64 -5
- package/biome.json +148 -0
- package/dist/index.js +52 -82
- package/dist/index.js.map +1 -1
- package/dist/lib/adr.js +99 -125
- package/dist/lib/adr.js.map +1 -1
- package/dist/lib/config.js +20 -37
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/links.js +8 -25
- package/dist/lib/links.js.map +1 -1
- package/dist/lib/links.test.js +35 -64
- package/dist/lib/links.test.js.map +1 -1
- package/dist/lib/manipulator.js +22 -23
- package/dist/lib/manipulator.js.map +1 -1
- package/dist/lib/manipulator.test.js +59 -63
- package/dist/lib/manipulator.test.js.map +1 -1
- package/dist/lib/numbering.js +9 -48
- package/dist/lib/numbering.js.map +1 -1
- package/dist/lib/numbering.test.js +27 -44
- package/dist/lib/numbering.test.js.map +1 -1
- package/dist/lib/prompt.js +14 -0
- package/dist/lib/prompt.js.map +1 -0
- package/dist/lib/prompt.test.js +33 -0
- package/dist/lib/prompt.test.js.map +1 -0
- package/dist/lib/template.js +13 -26
- package/dist/lib/template.js.map +1 -1
- package/dist/types/lib/adr.d.ts.map +1 -1
- package/dist/types/lib/config.d.ts.map +1 -1
- package/dist/types/lib/links.d.ts.map +1 -1
- package/dist/types/lib/manipulator.d.ts.map +1 -1
- package/dist/types/lib/numbering.d.ts.map +1 -1
- package/dist/types/lib/prompt.d.ts +2 -0
- package/dist/types/lib/prompt.d.ts.map +1 -0
- package/dist/types/lib/prompt.test.d.ts +2 -0
- package/dist/types/lib/prompt.test.d.ts.map +1 -0
- package/dist/types/lib/template.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/version.js +1 -4
- package/dist/version.js.map +1 -1
- package/doc/adr/.adr-sequence.lock +1 -0
- package/doc/adr/decisions.md +3 -0
- package/package.json +73 -47
- package/src/index.ts +52 -27
- package/src/lib/adr.ts +67 -72
- package/src/lib/config.ts +3 -3
- package/src/lib/links.test.ts +8 -24
- package/src/lib/links.ts +2 -2
- package/src/lib/manipulator.test.ts +44 -47
- package/src/lib/manipulator.ts +22 -10
- package/src/lib/numbering.test.ts +5 -9
- package/src/lib/numbering.ts +4 -5
- package/src/lib/prompt.test.ts +42 -0
- package/src/lib/prompt.ts +14 -0
- package/src/lib/template.ts +7 -3
- package/src/version.ts +1 -1
- package/tests/.adr-dir +1 -0
- package/tests/__snapshots__/generate-graph.e2e.test.ts.snap +23 -23
- package/tests/__snapshots__/init-adr-repository.e2e.test.ts.snap +1 -1
- package/tests/__snapshots__/linking-records.e2e.test.ts.snap +1 -1
- package/tests/__snapshots__/new-adr.e2e.test.ts.snap +1 -1
- package/tests/__snapshots__/superseding-records.e2e.test.ts.snap +1 -1
- package/tests/__snapshots__/toc-prefixing.e2e.test.ts.snap +1 -1
- package/tests/__snapshots__/use-template-override.e2e.test.ts.snap +1 -1
- package/tests/edit-on-create.e2e.test.ts +17 -12
- package/tests/funny-characters.e2e.test.ts +28 -21
- package/tests/generate-graph.e2e.test.ts +21 -13
- package/tests/init-adr-repository.e2e.test.ts +12 -8
- package/tests/linking-records.e2e.test.ts +21 -14
- package/tests/list-adrs.e2e.test.ts +23 -18
- package/tests/new-adr.e2e.test.ts +15 -12
- package/tests/superseding-records.e2e.test.ts +16 -11
- package/tests/toc-prefixing.e2e.test.ts +15 -11
- package/tests/use-template-override.e2e.test.ts +18 -10
- package/tests/work-form-other-directories.e2e.test.ts +14 -12
- package/tsconfig.json +9 -8
- package/vitest.config.e2e.ts +13 -0
- package/vitest.config.ts +8 -1
- package/.eslintignore +0 -2
- package/.eslintrc.json +0 -23
- package/.github/dependabot.yml +0 -14
- package/.github/workflows/auto-merge.yml +0 -14
- package/doc/adr/0001-record-architecture-decisions.md +0 -21
- package/doc/adr/0002-using-heavy-e2e-tests.md +0 -20
- /package/src/{environment.d.ts → types/environment.d.ts} +0 -0
package/dist/lib/adr.js
CHANGED
|
@@ -1,39 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.listAdrs = exports.link = exports.init = exports.newAdr = exports.generateToc = void 0;
|
|
16
|
-
const numbering_1 = require("./numbering");
|
|
17
|
-
const template_1 = require("./template");
|
|
18
|
-
const promises_1 = __importDefault(require("fs/promises"));
|
|
19
|
-
const path_1 = __importDefault(require("path"));
|
|
20
|
-
const config_1 = require("./config");
|
|
21
|
-
const inquirer_1 = require("inquirer");
|
|
22
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
23
|
-
const manipulator_1 = require("./manipulator");
|
|
24
|
-
const links_1 = require("./links");
|
|
25
|
-
const node_child_process_1 = __importDefault(require("node:child_process"));
|
|
26
|
-
const askForClarification = (searchString, matches) => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
-
const selection = yield (0, inquirer_1.prompt)([
|
|
28
|
-
{
|
|
29
|
-
type: 'list',
|
|
30
|
-
name: 'target',
|
|
31
|
-
message: `Which file do you want to link to for ${chalk_1.default.blue(searchString)}?`,
|
|
32
|
-
choices: matches
|
|
33
|
-
}
|
|
34
|
-
]);
|
|
35
|
-
return selection.target;
|
|
36
|
-
});
|
|
1
|
+
import childProcess from 'node:child_process';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import fs from 'fs/promises';
|
|
5
|
+
import { getDir, workingDir } from './config.js';
|
|
6
|
+
import { findMatchingFilesFor, getLinkDetails } from './links.js';
|
|
7
|
+
import { getTitleFrom, injectLink, supersede } from './manipulator.js';
|
|
8
|
+
import { newNumber } from './numbering.js';
|
|
9
|
+
import { askForClarification } from './prompt.js';
|
|
10
|
+
import { template } from './template.js';
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
37
12
|
// eslint-disable-next-line no-unused-vars
|
|
38
13
|
var LinkType;
|
|
39
14
|
(function (LinkType) {
|
|
@@ -42,33 +17,33 @@ var LinkType;
|
|
|
42
17
|
// eslint-disable-next-line no-unused-vars
|
|
43
18
|
LinkType["SUPERSEDE"] = "supersede";
|
|
44
19
|
})(LinkType || (LinkType = {}));
|
|
45
|
-
const actuallyLink = (task) =>
|
|
46
|
-
const linkedFile =
|
|
47
|
-
const newAdrContent =
|
|
48
|
-
const oldAdrContent =
|
|
49
|
-
const oldTitle =
|
|
50
|
-
const newTitle =
|
|
20
|
+
const actuallyLink = async (task) => {
|
|
21
|
+
const linkedFile = path.join(await getDir(), task.targetPath);
|
|
22
|
+
const newAdrContent = await fs.readFile(task.sourcePath, 'utf8');
|
|
23
|
+
const oldAdrContent = await fs.readFile(linkedFile, 'utf8');
|
|
24
|
+
const oldTitle = getTitleFrom(oldAdrContent);
|
|
25
|
+
const newTitle = getTitleFrom(newAdrContent);
|
|
51
26
|
let dirtyOld = '', dirtyNew = '';
|
|
52
27
|
switch (task.type) {
|
|
53
28
|
case LinkType.LINK:
|
|
54
|
-
dirtyOld =
|
|
55
|
-
dirtyNew =
|
|
29
|
+
dirtyOld = injectLink(oldAdrContent, `${task.reverseLink} [${newTitle}](${path.relative(await getDir(), task.sourcePath)})`);
|
|
30
|
+
dirtyNew = injectLink(newAdrContent, `${task.link} [${oldTitle}](${task.targetPath})`);
|
|
56
31
|
break;
|
|
57
32
|
case LinkType.SUPERSEDE:
|
|
58
|
-
dirtyOld =
|
|
59
|
-
dirtyNew =
|
|
33
|
+
dirtyOld = supersede(oldAdrContent, `${task.reverseLink} [${newTitle}](${path.relative(await getDir(), task.sourcePath)})`);
|
|
34
|
+
dirtyNew = injectLink(newAdrContent, `${task.link} [${oldTitle}](${task.targetPath})`);
|
|
60
35
|
break;
|
|
61
36
|
default:
|
|
62
37
|
break;
|
|
63
38
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
const processSupersedes = (sourcePath, supersedes = [], suppressPrompts = false) =>
|
|
39
|
+
await fs.writeFile(linkedFile, dirtyOld);
|
|
40
|
+
await fs.writeFile(task.sourcePath, dirtyNew);
|
|
41
|
+
};
|
|
42
|
+
const processSupersedes = async (sourcePath, supersedes = [], suppressPrompts = false) => {
|
|
68
43
|
if (supersedes.length === 0) {
|
|
69
44
|
return;
|
|
70
45
|
}
|
|
71
|
-
const supersedeStrings =
|
|
46
|
+
const supersedeStrings = await Promise.all(supersedes.map((link) => getLinkDetails(link, true)));
|
|
72
47
|
for (const targetDetails of supersedeStrings) {
|
|
73
48
|
const task = {
|
|
74
49
|
type: LinkType.SUPERSEDE,
|
|
@@ -79,21 +54,19 @@ const processSupersedes = (sourcePath, supersedes = [], suppressPrompts = false)
|
|
|
79
54
|
};
|
|
80
55
|
if (targetDetails.matches.length > 1) {
|
|
81
56
|
if (suppressPrompts) {
|
|
82
|
-
throw new Error(`Multiple files match the search pattern for "${targetDetails.original}".\n`
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
task.targetPath = yield askForClarification(targetDetails.original, targetDetails.matches);
|
|
57
|
+
throw new Error(`Multiple files match the search pattern for "${targetDetails.original}".\n` +
|
|
58
|
+
'Please specify which file you want to targetDetails to more or remove the -q or --quiet options from the command line.');
|
|
87
59
|
}
|
|
60
|
+
task.targetPath = await askForClarification(targetDetails.original, targetDetails.matches);
|
|
88
61
|
}
|
|
89
|
-
|
|
62
|
+
await actuallyLink(task);
|
|
90
63
|
}
|
|
91
|
-
}
|
|
92
|
-
const injectLinksTo = (sourcePath, links = [], suppressPrompts = false) =>
|
|
64
|
+
};
|
|
65
|
+
const injectLinksTo = async (sourcePath, links = [], suppressPrompts = false) => {
|
|
93
66
|
if (links.length === 0) {
|
|
94
67
|
return;
|
|
95
68
|
}
|
|
96
|
-
const linkStrings =
|
|
69
|
+
const linkStrings = await Promise.all(links.map((link) => getLinkDetails(link)));
|
|
97
70
|
for (const targetDetails of linkStrings) {
|
|
98
71
|
const task = {
|
|
99
72
|
type: LinkType.LINK,
|
|
@@ -104,100 +77,101 @@ const injectLinksTo = (sourcePath, links = [], suppressPrompts = false) => __awa
|
|
|
104
77
|
};
|
|
105
78
|
if (targetDetails.matches.length > 1) {
|
|
106
79
|
if (suppressPrompts) {
|
|
107
|
-
throw new Error(`Multiple files match the search pattern for "${targetDetails.original}".\n`
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
task.targetPath = yield askForClarification(targetDetails.original, targetDetails.matches);
|
|
80
|
+
throw new Error(`Multiple files match the search pattern for "${targetDetails.original}".\n` +
|
|
81
|
+
'Please specify which file you want to targetDetails to more or remove the -q or --quiet options from the command line.');
|
|
112
82
|
}
|
|
83
|
+
task.targetPath = await askForClarification(targetDetails.original, targetDetails.matches);
|
|
113
84
|
}
|
|
114
|
-
|
|
85
|
+
await actuallyLink(task);
|
|
115
86
|
}
|
|
116
|
-
}
|
|
87
|
+
};
|
|
117
88
|
//Generate a table of contents for the adr directory
|
|
118
|
-
const generateToc = (options) =>
|
|
119
|
-
const adrDir =
|
|
120
|
-
const files =
|
|
89
|
+
export const generateToc = async (options) => {
|
|
90
|
+
const adrDir = await getDir();
|
|
91
|
+
const files = await fs.readdir(adrDir);
|
|
121
92
|
const toc = files.filter((file) => file.match(/^\d{4}-.*\.md$/));
|
|
122
|
-
const titles = toc.map((file) =>
|
|
123
|
-
const title =
|
|
124
|
-
return `- [${title}](${
|
|
125
|
-
})
|
|
126
|
-
const resolvedTitles =
|
|
127
|
-
const tocFile =
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const
|
|
132
|
-
const
|
|
133
|
-
const
|
|
134
|
-
const
|
|
135
|
-
|
|
93
|
+
const titles = toc.map(async (file) => {
|
|
94
|
+
const title = getTitleFrom(await fs.readFile(path.join(adrDir, file), 'utf8'));
|
|
95
|
+
return `- [${title}](${options?.prefix || ''}${file})`;
|
|
96
|
+
});
|
|
97
|
+
const resolvedTitles = await Promise.all(titles);
|
|
98
|
+
const tocFile = path.resolve(path.join(adrDir, 'decisions.md'));
|
|
99
|
+
await fs.writeFile(tocFile, `# Table of Contents\n\n${resolvedTitles.join('\n')}`);
|
|
100
|
+
};
|
|
101
|
+
export const newAdr = async (title, config) => {
|
|
102
|
+
const newNum = await newNumber();
|
|
103
|
+
const formattedDate = config?.date || new Date().toISOString().split('T')[0] || 'ERROR';
|
|
104
|
+
const tpl = await template(config?.template);
|
|
105
|
+
const adr = tpl
|
|
106
|
+
.replace('DATE', formattedDate)
|
|
107
|
+
.replace('TITLE', title)
|
|
108
|
+
.replace('NUMBER', newNum.toString())
|
|
109
|
+
.replace('STATUS', 'Accepted');
|
|
136
110
|
const paddedNumber = newNum.toString().padStart(4, '0');
|
|
137
|
-
const cleansedTitle = title
|
|
111
|
+
const cleansedTitle = title
|
|
112
|
+
.toLowerCase()
|
|
113
|
+
.replace(/\W/g, '-')
|
|
114
|
+
.replace(/^(.*)\W$/, '$1')
|
|
115
|
+
.replace(/^\W(.*)$/, '$1');
|
|
138
116
|
const fileName = `${paddedNumber}-${cleansedTitle}.md`;
|
|
139
|
-
const adrDirectory =
|
|
140
|
-
const adrPath =
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const newAdrPath = path_1.default.relative((0, config_1.workingDir)(), adrPath);
|
|
117
|
+
const adrDirectory = await getDir();
|
|
118
|
+
const adrPath = path.resolve(path.join(adrDirectory, fileName));
|
|
119
|
+
await fs.writeFile(adrPath, adr);
|
|
120
|
+
await fs.writeFile(path.resolve(adrDirectory, '.adr-sequence.lock'), newNum.toString());
|
|
121
|
+
await processSupersedes(adrPath, config?.supersedes, config?.suppressPrompts);
|
|
122
|
+
await injectLinksTo(adrPath, config?.links, config?.suppressPrompts);
|
|
123
|
+
await generateToc();
|
|
147
124
|
if (process.env.VISUAL) {
|
|
148
|
-
|
|
125
|
+
await childProcess.spawn(process.env.VISUAL, [adrPath], {
|
|
149
126
|
stdio: 'inherit',
|
|
150
127
|
shell: true
|
|
151
128
|
});
|
|
152
129
|
return;
|
|
153
130
|
}
|
|
154
131
|
if (process.env.EDITOR) {
|
|
155
|
-
|
|
132
|
+
await childProcess.spawn(process.env.EDITOR, [adrPath], {
|
|
156
133
|
stdio: 'inherit',
|
|
157
134
|
shell: true
|
|
158
135
|
});
|
|
159
136
|
return;
|
|
160
137
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
yield promises_1.default.writeFile(path_1.default.join((0, config_1.workingDir)(), '.adr-dir'), path_1.default.relative((0, config_1.workingDir)(), dir));
|
|
168
|
-
yield (0, exports.newAdr)('Record Architecture Decisions', {
|
|
138
|
+
};
|
|
139
|
+
export const init = async (directory) => {
|
|
140
|
+
const dir = directory || (await getDir());
|
|
141
|
+
await fs.mkdir(dir, { recursive: true });
|
|
142
|
+
await fs.writeFile(path.join(workingDir(), '.adr-dir'), path.relative(workingDir(), dir));
|
|
143
|
+
await newAdr('Record Architecture Decisions', {
|
|
169
144
|
date: process.env.ADR_DATE,
|
|
170
|
-
template:
|
|
145
|
+
template: path.resolve(path.dirname(__filename), '../templates/init.md')
|
|
171
146
|
});
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
const found = yield (0, links_1.findMatchingFilesFor)(pattern);
|
|
147
|
+
};
|
|
148
|
+
export const link = async (source, link, target, reverseLink, options) => {
|
|
149
|
+
const getFor = async (pattern) => {
|
|
150
|
+
const found = await findMatchingFilesFor(pattern);
|
|
177
151
|
if (found.length === 1) {
|
|
178
152
|
return found[0];
|
|
179
153
|
}
|
|
180
|
-
if (options
|
|
181
|
-
throw new Error(`Multiple files match the search pattern for "${pattern}".\n`
|
|
182
|
-
|
|
154
|
+
if (options?.quiet) {
|
|
155
|
+
throw new Error(`Multiple files match the search pattern for "${pattern}".\n` +
|
|
156
|
+
'Please specify which file you want to targetDetails to more or remove the -q or --quiet options from the command line.');
|
|
183
157
|
}
|
|
184
158
|
return askForClarification(pattern, found);
|
|
185
|
-
}
|
|
186
|
-
const sourceFile =
|
|
187
|
-
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
const
|
|
191
|
-
const
|
|
192
|
-
const
|
|
193
|
-
|
|
159
|
+
};
|
|
160
|
+
const sourceFile = await getFor(source);
|
|
161
|
+
await injectLinksTo(path.resolve(await getDir(), sourceFile), [`${target}:${link}:${reverseLink}`]);
|
|
162
|
+
};
|
|
163
|
+
export const listAdrs = async () => {
|
|
164
|
+
const dir = await getDir();
|
|
165
|
+
const files = await fs.readdir(dir);
|
|
166
|
+
const toc = files
|
|
167
|
+
.map((f) => {
|
|
194
168
|
const adrFile = f.match(/^0*(\d+)-.*$/);
|
|
195
169
|
if (adrFile) {
|
|
196
|
-
return
|
|
170
|
+
return path.resolve(dir, adrFile[0]);
|
|
197
171
|
}
|
|
198
172
|
return '';
|
|
199
|
-
})
|
|
173
|
+
})
|
|
174
|
+
.filter((f) => f !== '');
|
|
200
175
|
return toc;
|
|
201
|
-
}
|
|
202
|
-
exports.listAdrs = listAdrs;
|
|
176
|
+
};
|
|
203
177
|
//# sourceMappingURL=adr.js.map
|
package/dist/lib/adr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adr.js","sourceRoot":"src/","sources":["lib/adr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adr.js","sourceRoot":"src/","sources":["lib/adr.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.js
CHANGED
|
@@ -1,50 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.getDir = exports.workingDir = void 0;
|
|
16
|
-
const promises_1 = __importDefault(require("fs/promises"));
|
|
17
|
-
const fs_1 = require("fs");
|
|
18
|
-
const path_1 = __importDefault(require("path"));
|
|
19
|
-
const workingDir = () => process.cwd();
|
|
20
|
-
exports.workingDir = workingDir;
|
|
21
|
-
const findTopLevelDir = (dir) => __awaiter(void 0, void 0, void 0, function* () {
|
|
1
|
+
import { constants } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import fs from 'fs/promises';
|
|
4
|
+
export const workingDir = () => process.cwd();
|
|
5
|
+
const findTopLevelDir = async (dir) => {
|
|
22
6
|
try {
|
|
23
|
-
|
|
7
|
+
await fs.access(path.join(dir, '.adr-dir'), constants.F_OK);
|
|
24
8
|
return dir;
|
|
25
9
|
}
|
|
26
|
-
catch (
|
|
10
|
+
catch (_e) {
|
|
27
11
|
if (dir === '/') {
|
|
28
12
|
throw new Error('No ADR directory config found');
|
|
29
13
|
}
|
|
30
|
-
const newDir =
|
|
14
|
+
const newDir = path.join(dir, '..');
|
|
31
15
|
return findTopLevelDir(newDir);
|
|
32
16
|
}
|
|
33
|
-
}
|
|
34
|
-
const getDirPath = () =>
|
|
17
|
+
};
|
|
18
|
+
const getDirPath = async () => {
|
|
35
19
|
try {
|
|
36
|
-
const configDir =
|
|
37
|
-
const configFile =
|
|
38
|
-
return
|
|
20
|
+
const configDir = await findTopLevelDir(workingDir());
|
|
21
|
+
const configFile = await fs.readFile(path.join(configDir, '.adr-dir'), 'utf8');
|
|
22
|
+
return path.relative(workingDir(), path.join(configDir, configFile.trim()));
|
|
39
23
|
}
|
|
40
|
-
catch (
|
|
41
|
-
return
|
|
24
|
+
catch (_e) {
|
|
25
|
+
return path.resolve(path.join(workingDir(), 'doc/adr'));
|
|
42
26
|
}
|
|
43
|
-
}
|
|
44
|
-
const getDir = () =>
|
|
45
|
-
const dir =
|
|
46
|
-
|
|
27
|
+
};
|
|
28
|
+
export const getDir = async () => {
|
|
29
|
+
const dir = await getDirPath();
|
|
30
|
+
await fs.mkdir(dir, { recursive: true });
|
|
47
31
|
return dir;
|
|
48
|
-
}
|
|
49
|
-
exports.getDir = getDir;
|
|
32
|
+
};
|
|
50
33
|
//# sourceMappingURL=config.js.map
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"src/","sources":["lib/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"src/","sources":["lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAE7B,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;AAE9C,MAAM,eAAe,GAAG,KAAK,EAAE,GAAW,EAAmB,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5D,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpC,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,KAAK,IAAqB,EAAE;IAC7C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,IAAqB,EAAE;IAChD,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;IAC/B,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
|
package/dist/lib/links.js
CHANGED
|
@@ -1,26 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import { getDir } from './config.js';
|
|
3
|
+
export const findMatchingFilesFor = async (pattern) => {
|
|
4
|
+
const files = await fs.readdir(await getDir());
|
|
5
|
+
return files.filter((file) => file.includes(pattern));
|
|
10
6
|
};
|
|
11
|
-
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.getLinkDetails = exports.findMatchingFilesFor = void 0;
|
|
16
|
-
const promises_1 = __importDefault(require("fs/promises"));
|
|
17
|
-
const config_1 = require("./config");
|
|
18
|
-
const findMatchingFilesFor = (pattern) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
-
const files = yield promises_1.default.readdir(yield (0, config_1.getDir)());
|
|
20
|
-
return files.filter(file => file.includes(pattern));
|
|
21
|
-
});
|
|
22
|
-
exports.findMatchingFilesFor = findMatchingFilesFor;
|
|
23
|
-
const getLinkDetails = (linkString, isSupersede = false) => __awaiter(void 0, void 0, void 0, function* () {
|
|
7
|
+
export const getLinkDetails = async (linkString, isSupersede = false) => {
|
|
24
8
|
const parts = linkString.split(':');
|
|
25
9
|
const pattern = parts[0];
|
|
26
10
|
let link = 'Supersedes';
|
|
@@ -29,7 +13,7 @@ const getLinkDetails = (linkString, isSupersede = false) => __awaiter(void 0, vo
|
|
|
29
13
|
link = parts[1];
|
|
30
14
|
reverseLink = parts[2];
|
|
31
15
|
}
|
|
32
|
-
const files =
|
|
16
|
+
const files = await findMatchingFilesFor(pattern);
|
|
33
17
|
return {
|
|
34
18
|
pattern: pattern,
|
|
35
19
|
original: linkString,
|
|
@@ -37,6 +21,5 @@ const getLinkDetails = (linkString, isSupersede = false) => __awaiter(void 0, vo
|
|
|
37
21
|
reverseLink: reverseLink,
|
|
38
22
|
matches: files
|
|
39
23
|
};
|
|
40
|
-
}
|
|
41
|
-
exports.getLinkDetails = getLinkDetails;
|
|
24
|
+
};
|
|
42
25
|
//# sourceMappingURL=links.js.map
|
package/dist/lib/links.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"links.js","sourceRoot":"src/","sources":["lib/links.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"src/","sources":["lib/links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAUrC,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE;IAC5D,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,UAAkB,EAAE,cAAuB,KAAK,EAAwB,EAAE;IAC7G,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,IAAI,GAAG,YAAY,CAAC;IACxB,IAAI,WAAW,GAAG,eAAe,CAAC;IAClC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAChB,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAClD,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,WAAW;QACxB,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/lib/links.test.js
CHANGED
|
@@ -1,94 +1,65 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
+
import { getDir } from './config.js';
|
|
4
|
+
import { getLinkDetails } from './links.js';
|
|
5
|
+
vi.mock('./config.js');
|
|
6
|
+
vi.mock('fs/promises');
|
|
7
|
+
describe('The link lib', () => {
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
vi.resetAllMocks();
|
|
9
10
|
});
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const vitest_1 = require("vitest");
|
|
16
|
-
const promises_1 = __importDefault(require("fs/promises"));
|
|
17
|
-
const config_1 = require("./config");
|
|
18
|
-
const links_1 = require("./links");
|
|
19
|
-
vitest_1.vi.mock('./config');
|
|
20
|
-
vitest_1.vi.mock('fs/promises');
|
|
21
|
-
(0, vitest_1.describe)('The link lib', () => {
|
|
22
|
-
(0, vitest_1.afterEach)(() => {
|
|
23
|
-
vitest_1.vi.resetAllMocks();
|
|
24
|
-
});
|
|
25
|
-
(0, vitest_1.it)('does not care if there are no matches', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
26
|
-
vitest_1.vi.mocked(config_1.getDir).mockResolvedValueOnce('/');
|
|
27
|
-
vitest_1.vi.mocked(promises_1.default.readdir).mockResolvedValueOnce([]);
|
|
11
|
+
it('does not care if there are no matches', async () => {
|
|
12
|
+
vi.mocked(getDir).mockResolvedValueOnce('/');
|
|
13
|
+
vi.mocked(fs.readdir).mockResolvedValueOnce([]);
|
|
28
14
|
const linkString = '1:overrides:overriden by';
|
|
29
|
-
const response =
|
|
30
|
-
|
|
15
|
+
const response = await getLinkDetails(linkString);
|
|
16
|
+
expect(response).toEqual({
|
|
31
17
|
pattern: '1',
|
|
32
18
|
original: '1:overrides:overriden by',
|
|
33
19
|
link: 'overrides',
|
|
34
20
|
reverseLink: 'overriden by',
|
|
35
21
|
matches: []
|
|
36
22
|
});
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
'1-one',
|
|
42
|
-
'1-two',
|
|
43
|
-
'1-three'
|
|
44
|
-
]);
|
|
23
|
+
});
|
|
24
|
+
it('does handles multiple matches', async () => {
|
|
25
|
+
vi.mocked(getDir).mockResolvedValueOnce('/');
|
|
26
|
+
vi.mocked(fs.readdir).mockResolvedValueOnce(['1-one', '1-two', '1-three']);
|
|
45
27
|
const linkString = '1:overrides:overriden by';
|
|
46
|
-
const response =
|
|
47
|
-
|
|
28
|
+
const response = await getLinkDetails(linkString);
|
|
29
|
+
expect(response).toEqual({
|
|
48
30
|
pattern: '1',
|
|
49
31
|
original: '1:overrides:overriden by',
|
|
50
32
|
link: 'overrides',
|
|
51
33
|
reverseLink: 'overriden by',
|
|
52
|
-
matches: [
|
|
53
|
-
'1-one',
|
|
54
|
-
'1-two',
|
|
55
|
-
'1-three'
|
|
56
|
-
]
|
|
34
|
+
matches: ['1-one', '1-two', '1-three']
|
|
57
35
|
});
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
'on1e',
|
|
63
|
-
'1-two',
|
|
64
|
-
'three'
|
|
65
|
-
]);
|
|
36
|
+
});
|
|
37
|
+
it('returns only files that match the pattern', async () => {
|
|
38
|
+
vi.mocked(getDir).mockResolvedValueOnce('/');
|
|
39
|
+
vi.mocked(fs.readdir).mockResolvedValueOnce(['on1e', '1-two', 'three']);
|
|
66
40
|
const linkString = '1:overrides:overriden by';
|
|
67
|
-
const response =
|
|
68
|
-
|
|
41
|
+
const response = await getLinkDetails(linkString);
|
|
42
|
+
expect(response).toEqual({
|
|
69
43
|
pattern: '1',
|
|
70
44
|
original: '1:overrides:overriden by',
|
|
71
45
|
link: 'overrides',
|
|
72
46
|
reverseLink: 'overriden by',
|
|
73
|
-
matches: [
|
|
74
|
-
'on1e',
|
|
75
|
-
'1-two'
|
|
76
|
-
]
|
|
47
|
+
matches: ['on1e', '1-two']
|
|
77
48
|
});
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
49
|
+
});
|
|
50
|
+
it('handles superseding', async () => {
|
|
51
|
+
vi.mocked(getDir).mockResolvedValueOnce('/');
|
|
52
|
+
vi.mocked(fs.readdir).mockResolvedValueOnce([]);
|
|
82
53
|
const linkString = '1';
|
|
83
54
|
const supersede = true;
|
|
84
|
-
const response =
|
|
85
|
-
|
|
55
|
+
const response = await getLinkDetails(linkString, supersede);
|
|
56
|
+
expect(response).toEqual({
|
|
86
57
|
pattern: '1',
|
|
87
58
|
original: '1',
|
|
88
59
|
link: 'Supersedes',
|
|
89
60
|
reverseLink: 'Superseded by',
|
|
90
61
|
matches: []
|
|
91
62
|
});
|
|
92
|
-
})
|
|
63
|
+
});
|
|
93
64
|
});
|
|
94
65
|
//# sourceMappingURL=links.test.js.map
|