@meza/adr-tools 2.0.1 → 2.0.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.
- package/.github/renovate.json +1 -3
- package/.github/workflows/ci-pr.yml +29 -8
- package/.github/workflows/ci.yml +14 -12
- package/.github/workflows/security.yml +49 -0
- package/.releaserc.json +10 -4
- package/.yarnrc.yml +8 -0
- package/CHANGELOG.md +7 -0
- package/biome.json +2 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +31 -1
- package/dist/index.test.js.map +1 -1
- package/dist/lib/adr.js +1 -1
- package/dist/lib/adr.js.map +1 -1
- package/dist/lib/adr.test.js +14 -3
- package/dist/lib/adr.test.js.map +1 -1
- package/dist/lib/config.js +3 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/links.js.map +1 -1
- package/dist/lib/manipulator.js.map +1 -1
- package/dist/lib/prompt.js +1 -1
- package/dist/lib/prompt.js.map +1 -1
- package/dist/lib/prompt.test.js +1 -1
- package/dist/lib/prompt.test.js.map +1 -1
- package/dist/lib/template.js.map +1 -1
- package/dist/types/index.d.ts.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/prompt.d.ts +1 -1
- package/dist/types/lib/prompt.d.ts.map +1 -1
- package/dist/types/lib/template.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +37 -38
- package/src/index.test.ts +36 -1
- package/src/index.ts +7 -1
- package/src/lib/adr.test.ts +16 -3
- package/src/lib/adr.ts +7 -6
- package/src/lib/config.ts +3 -2
- package/src/lib/manipulator.ts +6 -6
- package/src/lib/prompt.test.ts +3 -3
- package/src/lib/prompt.ts +2 -2
- package/src/version.ts +1 -1
- package/tests/fake-editor +3 -1
- package/tests/fake-editor.cmd +3 -1
- package/tests/fake-visual +3 -1
- package/tests/fake-visual.cmd +3 -1
- package/tsconfig.json +34 -2
- package/vitest.config.e2e.ts +3 -5
- package/vitest.config.ts +1 -6
package/dist/lib/links.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,WAAW,GAAY,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manipulator.js","sourceRoot":"src/","sources":["lib/manipulator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"manipulator.js","sourceRoot":"src/","sources":["lib/manipulator.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/prompt.js
CHANGED
|
@@ -3,7 +3,7 @@ export const askForClarification = async (searchString, matches) => {
|
|
|
3
3
|
const { default: inquirer } = await import('inquirer');
|
|
4
4
|
const selection = await inquirer.prompt([
|
|
5
5
|
{
|
|
6
|
-
type: '
|
|
6
|
+
type: 'select',
|
|
7
7
|
name: 'target',
|
|
8
8
|
message: `Which file do you want to link to for ${chalk.blue(searchString)}?`,
|
|
9
9
|
choices: matches
|
package/dist/lib/prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"src/","sources":["lib/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,YAAoB,EAAE,OAAiB,EAAE,EAAE;IACnF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"src/","sources":["lib/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,YAAoB,EAAE,OAAiB,EAAE,EAAE;IACnF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAqB;QAC1D;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,yCAAyC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG;YAC7E,OAAO,EAAE,OAAO;SACjB;KACF,CAAC,CAAC;IACH,OAAO,SAAS,CAAC,MAAM,CAAC;AAC1B,CAAC,CAAC"}
|
package/dist/lib/prompt.test.js
CHANGED
|
@@ -18,7 +18,7 @@ describe('The prompt helper', () => {
|
|
|
18
18
|
await askForClarification('this is the search string', randomChoices);
|
|
19
19
|
expect(prompt).toHaveBeenCalledOnce();
|
|
20
20
|
const calledWith = prompt.mock.calls[0][0];
|
|
21
|
-
expect(calledWith[0].type).toEqual('
|
|
21
|
+
expect(calledWith[0].type).toEqual('select');
|
|
22
22
|
expect(calledWith[0].choices).toEqual(randomChoices);
|
|
23
23
|
expect(calledWith[0].message).toMatchInlineSnapshot('"Which file do you want to link to for BLUE[this is the search string]?"');
|
|
24
24
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.test.js","sourceRoot":"src/","sources":["lib/prompt.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,
|
|
1
|
+
{"version":3,"file":"prompt.test.js","sourceRoot":"src/","sources":["lib/prompt.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,QAAsB,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACpB,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACtB,OAAO,EAAE;QACP,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE;YACpB,OAAO,QAAQ,GAAG,GAAG,CAAC;QACxB,CAAC;KACF;CACF,CAAC,CAAC,CAAC;AACJ,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAE5D,MAAM,aAAa,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClG,MAAM,mBAAmB,CAAC,2BAA2B,EAAE,aAAa,CAAC,CAAC;QAEtE,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAe,CAAC;QACzD,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACrD,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,qBAAqB,CACjD,0EAA0E,CAC3E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAE7C,MAAM,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,2BAA2B,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAE3F,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/lib/template.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"src/","sources":["lib/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"src/","sources":["lib/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,YAAqB,EAAmB,EAAE;IACvE,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,MAAM,EAAE,EAAE,uBAAuB,CAAC,EAAE,MAAM,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACnG,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"src/","sources":["index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"src/","sources":["index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIlC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAalE,KAAK,WAAW,GAAG;IACjB,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,QAAQ,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC;IAC7B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAClD,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,cAAc,YAAa,OAAO,SAAS,KAAK,UAE5D,CAAC;AAwGF,eAAO,MAAM,YAAY,UAAU,WAAW,YA4F7C,CAAC;AAEF,eAAO,MAAM,GAAG,2BAAqC,WAAW,qBAI/D,CAAC;AAEF,eAAO,MAAM,WAAW,kDAUvB,CAAC;AAEF,eAAO,MAAM,QAAQ,2BAAgC,WAAW,YAO/D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adr.d.ts","sourceRoot":"src/","sources":["lib/adr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adr.d.ts","sourceRoot":"src/","sources":["lib/adr.ts"],"names":[],"mappings":"AAwEA,KAAK,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAsEvG,eAAO,MAAM,cAAc,aAAc;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,QAyBhF,CAAC;AAEF,UAAU,UAAU;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2GD,eAAO,MAAM,WAAW,aAAoB;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,kBAc9D,CAAC;AAEF,eAAO,MAAM,MAAM,UAAiB,MAAM,WAAW,UAAU,kBAyB9D,CAAC;AAEF,eAAO,MAAM,IAAI,eAAsB,MAAM,kBAQ5C,CAAC;AAEF,eAAO,MAAM,IAAI,WACP,MAAM,QACR,MAAM,UACJ,MAAM,eACD,MAAM,YACT;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,kBAqB9B,CAAC;AAEF,eAAO,MAAM,QAAQ,yBAkBpB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"src/","sources":["lib/config.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,cAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"src/","sources":["lib/config.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,cAAsB,CAAC;AA2B9C,eAAO,MAAM,MAAM,QAAa,OAAO,CAAC,MAAM,CAI7C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"links.d.ts","sourceRoot":"src/","sources":["lib/links.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"src/","sources":["lib/links.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,eAAO,MAAM,oBAAoB,YAAmB,MAAM,sBAGzD,CAAC;AAEF,eAAO,MAAM,cAAc,eAAsB,MAAM,gBAAe,OAAO,KAAW,OAAO,CAAC,WAAW,CAiB1G,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manipulator.d.ts","sourceRoot":"src/","sources":["lib/manipulator.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"manipulator.d.ts","sourceRoot":"src/","sources":["lib/manipulator.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,aAAc,MAAM;;;;;;GAmB5C,CAAC;AAEF,eAAO,MAAM,YAAY,QAAS,MAAM,WAOvC,CAAC;AAEF,eAAO,MAAM,SAAS,aAAc,MAAM,QAAQ,MAAM,WA+BvD,CAAC;AAEF,eAAO,MAAM,UAAU,aAAc,MAAM,QAAQ,MAAM,WA4BxD,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const askForClarification: (searchString: string, matches: string[]) => Promise<
|
|
1
|
+
export declare const askForClarification: (searchString: string, matches: string[]) => Promise<string>;
|
|
2
2
|
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"src/","sources":["lib/prompt.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"src/","sources":["lib/prompt.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,iBAAwB,MAAM,WAAW,MAAM,EAAE,oBAWhF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"src/","sources":["lib/template.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"src/","sources":["lib/template.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,QAAQ,kBAAyB,MAAM,KAAG,OAAO,CAAC,MAAM,CAapE,CAAC"}
|
package/dist/types/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const LIB_VERSION = "2.0.
|
|
1
|
+
export declare const LIB_VERSION = "2.0.3";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const LIB_VERSION = '2.0.
|
|
1
|
+
export const LIB_VERSION = '2.0.3';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meza/adr-tools",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
4
|
"exports": {
|
|
5
5
|
".": {
|
|
6
6
|
"import": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"license": "GPL-3.0",
|
|
16
16
|
"type": "module",
|
|
17
17
|
"types": "dist/index.d.ts",
|
|
18
|
-
"
|
|
18
|
+
"packageManager": "yarn@4.17.1",
|
|
19
19
|
"scripts": {
|
|
20
20
|
"prebuild": "node ./scripts/inject-version.mjs ./src/version.ts",
|
|
21
21
|
"prepack": "node ./scripts/inject-version.mjs ./src/version.ts && tsc && yarn copy ",
|
|
@@ -41,14 +41,14 @@
|
|
|
41
41
|
"release": "semantic-release"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@types/inquirer": "9.0.
|
|
45
|
-
"@types/node": "
|
|
46
|
-
"chalk": "5.
|
|
47
|
-
"commander": "
|
|
48
|
-
"core-js": "3.
|
|
49
|
-
"inquirer": "
|
|
50
|
-
"marked": "
|
|
51
|
-
"open": "
|
|
44
|
+
"@types/inquirer": "9.0.10",
|
|
45
|
+
"@types/node": "24.13.3",
|
|
46
|
+
"chalk": "5.6.2",
|
|
47
|
+
"commander": "15.0.0",
|
|
48
|
+
"core-js": "3.49.0",
|
|
49
|
+
"inquirer": "14.0.2",
|
|
50
|
+
"marked": "18.0.6",
|
|
51
|
+
"open": "11.0.0"
|
|
52
52
|
},
|
|
53
53
|
"commitlint": {
|
|
54
54
|
"extends": [
|
|
@@ -56,41 +56,40 @@
|
|
|
56
56
|
]
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@biomejs/biome": "2.3
|
|
60
|
-
"@commitlint/cli": "
|
|
61
|
-
"@commitlint/config-conventional": "
|
|
62
|
-
"@commitlint/prompt-cli": "
|
|
63
|
-
"@faker-js/faker": "
|
|
64
|
-
"@meza/
|
|
65
|
-
"@meza/
|
|
66
|
-
"@meza/tsconfig-base": "1.1.0",
|
|
59
|
+
"@biomejs/biome": "2.5.3",
|
|
60
|
+
"@commitlint/cli": "21.2.1",
|
|
61
|
+
"@commitlint/config-conventional": "21.2.0",
|
|
62
|
+
"@commitlint/prompt-cli": "21.2.0",
|
|
63
|
+
"@faker-js/faker": "10.5.0",
|
|
64
|
+
"@meza/biome": "1.1.3",
|
|
65
|
+
"@meza/mezas-conventional-changelog": "1.1.0",
|
|
67
66
|
"@ryansonshine/commitizen": "4.2.8",
|
|
68
67
|
"@ryansonshine/cz-conventional-changelog": "3.3.4",
|
|
69
|
-
"@semantic-release/changelog": "
|
|
70
|
-
"@semantic-release/commit-analyzer": "
|
|
71
|
-
"@semantic-release/git": "
|
|
72
|
-
"@semantic-release/github": "
|
|
73
|
-
"@semantic-release/npm": "
|
|
74
|
-
"@semantic-release/release-notes-generator": "
|
|
75
|
-
"@
|
|
76
|
-
"@vitest/
|
|
77
|
-
"
|
|
78
|
-
"conventional-changelog-conventionalcommits": "^9.1.0",
|
|
68
|
+
"@semantic-release/changelog": "6.0.3",
|
|
69
|
+
"@semantic-release/commit-analyzer": "13.0.1",
|
|
70
|
+
"@semantic-release/git": "10.0.1",
|
|
71
|
+
"@semantic-release/github": "12.0.9",
|
|
72
|
+
"@semantic-release/npm": "13.1.5",
|
|
73
|
+
"@semantic-release/release-notes-generator": "14.1.1",
|
|
74
|
+
"@vitest/coverage-v8": "4.1.10",
|
|
75
|
+
"@vitest/ui": "4.1.10",
|
|
76
|
+
"conventional-changelog-conventionalcommits": "10.2.1",
|
|
79
77
|
"copyfiles": "2.4.1",
|
|
80
|
-
"cross-env": "
|
|
78
|
+
"cross-env": "10.1.0",
|
|
81
79
|
"install-deps-postmerge": "2.0.1",
|
|
82
80
|
"is-ci": "4.1.0",
|
|
83
|
-
"lefthook": "2.
|
|
84
|
-
"lint-staged": "
|
|
81
|
+
"lefthook": "2.1.10",
|
|
82
|
+
"lint-staged": "17.0.8",
|
|
85
83
|
"mock-cwd": "1.0.0",
|
|
86
|
-
"npm-run-all2": "
|
|
87
|
-
"rimraf": "6.
|
|
88
|
-
"semantic-release": "
|
|
84
|
+
"npm-run-all2": "9.0.2",
|
|
85
|
+
"rimraf": "6.1.3",
|
|
86
|
+
"semantic-release": "25.0.5",
|
|
87
|
+
"semantic-release-export-data": "1.2.0",
|
|
89
88
|
"ts-node": "10.9.2",
|
|
90
|
-
"tsx": "
|
|
91
|
-
"typescript": "
|
|
92
|
-
"uuid": "
|
|
93
|
-
"vitest": "
|
|
89
|
+
"tsx": "4.23.0",
|
|
90
|
+
"typescript": "7.0.2",
|
|
91
|
+
"uuid": "14.0.1",
|
|
92
|
+
"vitest": "4.1.10",
|
|
94
93
|
"yarn": "1.22.22"
|
|
95
94
|
},
|
|
96
95
|
"repository": {
|
package/src/index.test.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { mkdirSync, mkdtempSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
1
3
|
import path from 'node:path';
|
|
2
4
|
import { pathToFileURL } from 'node:url';
|
|
3
5
|
import chalk from 'chalk';
|
|
4
6
|
import type { Command } from 'commander';
|
|
5
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
7
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
6
8
|
import { buildProgram, defaultOnError, isDirectRun, maybeRun, run } from './index.js';
|
|
7
9
|
|
|
8
10
|
const createDeps = () => {
|
|
@@ -26,6 +28,14 @@ const createDeps = () => {
|
|
|
26
28
|
};
|
|
27
29
|
|
|
28
30
|
describe('adr CLI', () => {
|
|
31
|
+
const tempDirs: string[] = [];
|
|
32
|
+
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
for (const tempDir of tempDirs.splice(0)) {
|
|
35
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
29
39
|
it('wires program metadata', () => {
|
|
30
40
|
const deps = createDeps();
|
|
31
41
|
const program = buildProgram(deps);
|
|
@@ -190,6 +200,21 @@ describe('adr CLI', () => {
|
|
|
190
200
|
expect(isDirectRun(['node'], moduleUrl)).toBe(false);
|
|
191
201
|
});
|
|
192
202
|
|
|
203
|
+
it('returns true when argv[1] is a symlink to the module (npm .bin link)', () => {
|
|
204
|
+
const tempDir = mkdtempSync(path.join(tmpdir(), 'adr-tools-'));
|
|
205
|
+
tempDirs.push(tempDir);
|
|
206
|
+
const distDir = path.join(tempDir, 'dist');
|
|
207
|
+
const binDir = path.join(tempDir, '.bin');
|
|
208
|
+
mkdirSync(distDir, { recursive: true });
|
|
209
|
+
mkdirSync(binDir, { recursive: true });
|
|
210
|
+
const targetPath = path.join(distDir, 'index.js');
|
|
211
|
+
const linkPath = path.join(binDir, 'adr');
|
|
212
|
+
writeFileSync(targetPath, 'export {};\n');
|
|
213
|
+
symlinkSync(targetPath, linkPath);
|
|
214
|
+
const moduleUrl = pathToFileURL(targetPath).href;
|
|
215
|
+
expect(isDirectRun(['node', linkPath], moduleUrl)).toBe(true);
|
|
216
|
+
});
|
|
217
|
+
|
|
193
218
|
it('returns false when maybeRun is not direct', () => {
|
|
194
219
|
const deps = createDeps();
|
|
195
220
|
expect(maybeRun(['node', '/other/entry'], deps)).toBe(false);
|
|
@@ -203,6 +228,16 @@ describe('adr CLI', () => {
|
|
|
203
228
|
expect(deps.listAdrs).toHaveBeenCalled();
|
|
204
229
|
});
|
|
205
230
|
|
|
231
|
+
it('handles rejected direct runs without an unhandled rejection', async () => {
|
|
232
|
+
const deps = createDeps();
|
|
233
|
+
deps.listAdrs.mockRejectedValueOnce(new Error('boom'));
|
|
234
|
+
const indexPath = path.resolve(process.cwd(), 'src/index.ts');
|
|
235
|
+
|
|
236
|
+
expect(maybeRun(['node', indexPath, 'list'], deps)).toBe(true);
|
|
237
|
+
await vi.waitFor(() => expect(deps.listAdrs).toHaveBeenCalled());
|
|
238
|
+
await new Promise<void>((resolve) => setImmediate(resolve));
|
|
239
|
+
});
|
|
240
|
+
|
|
206
241
|
it('formats errors with the default handler', () => {
|
|
207
242
|
const errorHandler = vi.fn();
|
|
208
243
|
const program = { error: errorHandler } as unknown as Command;
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
+
import { realpathSync } from 'node:fs';
|
|
3
4
|
import fs from 'node:fs/promises';
|
|
4
5
|
import * as path from 'node:path';
|
|
5
6
|
import { fileURLToPath } from 'node:url';
|
|
@@ -246,7 +247,12 @@ export const isDirectRun = (argv = process.argv, moduleUrl = import.meta.url) =>
|
|
|
246
247
|
if (!argv[1]) {
|
|
247
248
|
return false;
|
|
248
249
|
}
|
|
249
|
-
|
|
250
|
+
const modulePath = fileURLToPath(moduleUrl);
|
|
251
|
+
try {
|
|
252
|
+
return realpathSync(path.resolve(argv[1])) === modulePath;
|
|
253
|
+
} catch {
|
|
254
|
+
return path.resolve(argv[1]) === modulePath;
|
|
255
|
+
}
|
|
250
256
|
};
|
|
251
257
|
|
|
252
258
|
export const maybeRun = (argv = process.argv, deps?: ProgramDeps) => {
|
package/src/lib/adr.test.ts
CHANGED
|
@@ -2,7 +2,7 @@ import fs from 'fs/promises';
|
|
|
2
2
|
import open from 'open';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
-
import { generateToc, init, link, listAdrs, newAdr } from './adr.js';
|
|
5
|
+
import { chooseOpenPlan, generateToc, init, link, listAdrs, newAdr } from './adr.js';
|
|
6
6
|
import { getDir, workingDir } from './config.js';
|
|
7
7
|
import { findMatchingFilesFor, getLinkDetails } from './links.js';
|
|
8
8
|
import { getTitleFrom, injectLink, supersede } from './manipulator.js';
|
|
@@ -52,6 +52,19 @@ describe('adr helpers', () => {
|
|
|
52
52
|
vi.unstubAllEnvs();
|
|
53
53
|
});
|
|
54
54
|
|
|
55
|
+
it('preserves non-escape backslashes in quoted editor arguments', () => {
|
|
56
|
+
expect(chooseOpenPlan({ openWith: String.raw`code "C:\temp\record.md"` })).toEqual({
|
|
57
|
+
type: 'app',
|
|
58
|
+
name: 'code',
|
|
59
|
+
args: [String.raw`C:\temp\record.md`]
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('falls back to the default opener for an incomplete editor quote', () => {
|
|
64
|
+
vi.stubEnv('EDITOR', '"');
|
|
65
|
+
expect(chooseOpenPlan({ open: true })).toEqual({ type: 'default' });
|
|
66
|
+
});
|
|
67
|
+
|
|
55
68
|
it('generates the toc from adr files', async () => {
|
|
56
69
|
vi.mocked(getDir).mockResolvedValueOnce('/repo/doc/adr');
|
|
57
70
|
mockReaddir.mockResolvedValueOnce(['0001-first.md', 'notes.txt']);
|
|
@@ -143,7 +156,7 @@ describe('adr helpers', () => {
|
|
|
143
156
|
const adrPath = path.resolve('/repo/doc/adr', '0001-example-adr.md');
|
|
144
157
|
expect(open).toHaveBeenCalledWith(adrPath, {
|
|
145
158
|
app: { name: 'code', arguments: ['--wait'] },
|
|
146
|
-
wait:
|
|
159
|
+
wait: process.platform === 'win32'
|
|
147
160
|
});
|
|
148
161
|
});
|
|
149
162
|
|
|
@@ -169,7 +182,7 @@ describe('adr helpers', () => {
|
|
|
169
182
|
await newAdr('Example ADR', { openWith: 'code --wait' });
|
|
170
183
|
expect(open).toHaveBeenCalledWith(path.resolve('/repo/doc/adr', '0001-example-adr.md'), {
|
|
171
184
|
app: { name: 'code', arguments: ['--wait'] },
|
|
172
|
-
wait:
|
|
185
|
+
wait: true
|
|
173
186
|
});
|
|
174
187
|
} finally {
|
|
175
188
|
Object.defineProperty(process, 'platform', { value: originalPlatform });
|
package/src/lib/adr.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
import fs from 'fs/promises';
|
|
4
|
+
import type { Options as OpenOptions } from 'open';
|
|
4
5
|
import { getDir, workingDir } from './config.js';
|
|
5
6
|
import { findMatchingFilesFor, getLinkDetails } from './links.js';
|
|
6
7
|
import { getTitleFrom, injectLink, supersede } from './manipulator.js';
|
|
@@ -71,11 +72,7 @@ const splitCommandLine = (commandLine: string): string[] => {
|
|
|
71
72
|
|
|
72
73
|
type OpenPlan = { type: 'none' } | { type: 'default' } | { type: 'app'; name: string; args: string[] };
|
|
73
74
|
|
|
74
|
-
const openAdr = async (
|
|
75
|
-
adrPath: string,
|
|
76
|
-
options: { app?: { name: string; arguments: string[] }; wait: false },
|
|
77
|
-
openPromise: Promise<typeof import('open')>
|
|
78
|
-
) => {
|
|
75
|
+
const openAdr = async (adrPath: string, options: OpenOptions, openPromise: Promise<typeof import('open')>) => {
|
|
79
76
|
const { default: open } = await openPromise;
|
|
80
77
|
await open(adrPath, options);
|
|
81
78
|
};
|
|
@@ -103,7 +100,11 @@ const openNewAdr = async (openPlan: OpenPlan, adrPath: string, openPromise?: Pro
|
|
|
103
100
|
return;
|
|
104
101
|
}
|
|
105
102
|
|
|
106
|
-
await openAdr(
|
|
103
|
+
await openAdr(
|
|
104
|
+
adrPath,
|
|
105
|
+
{ app: { name: openPlan.name, arguments: openPlan.args }, wait: process.platform === 'win32' },
|
|
106
|
+
openPromise!
|
|
107
|
+
);
|
|
107
108
|
};
|
|
108
109
|
|
|
109
110
|
const equalsIgnoreCase = (a: string, b: string) => a.toLowerCase() === b.toLowerCase();
|
package/src/lib/config.ts
CHANGED
|
@@ -7,13 +7,14 @@ const rootDir = path.parse(process.cwd()).root;
|
|
|
7
7
|
|
|
8
8
|
const findTopLevelDir = async (dir: string): Promise<string> => {
|
|
9
9
|
try {
|
|
10
|
-
|
|
10
|
+
// CLI paths may point anywhere the invoking user can access; OS permissions are the security boundary.
|
|
11
|
+
await fs.access(path.join(dir, '.adr-dir'), constants.F_OK); // nosemgrep: javascript.lang.security.audit.path-traversal.path-join-resolve-traversal.path-join-resolve-traversal
|
|
11
12
|
return dir;
|
|
12
13
|
} catch (_e) {
|
|
13
14
|
if (dir === rootDir) {
|
|
14
15
|
throw new Error('No ADR directory config found');
|
|
15
16
|
}
|
|
16
|
-
const newDir = path.join(dir, '..');
|
|
17
|
+
const newDir = path.join(dir, '..'); // nosemgrep: javascript.lang.security.audit.path-traversal.path-join-resolve-traversal.path-join-resolve-traversal
|
|
17
18
|
return findTopLevelDir(newDir);
|
|
18
19
|
}
|
|
19
20
|
};
|
package/src/lib/manipulator.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { marked } from 'marked';
|
|
1
|
+
import { marked, type Token, type Tokens } from 'marked';
|
|
2
2
|
|
|
3
|
-
const convertToMd = (tokens:
|
|
3
|
+
const convertToMd = (tokens: Token[]) => {
|
|
4
4
|
return tokens.map((token) => token.raw).join('');
|
|
5
5
|
};
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@ export const getLinksFrom = (markdown: string) => {
|
|
|
10
10
|
const links = tokens.filter((token) => token.type === 'paragraph' && linkRegex.test(token.text));
|
|
11
11
|
|
|
12
12
|
return links.map((link) => {
|
|
13
|
-
const linkToken = link as
|
|
13
|
+
const linkToken = link as Tokens.Paragraph;
|
|
14
14
|
const linkMatches = linkToken.text.match(linkRegex);
|
|
15
15
|
if (!linkMatches || linkMatches.length < 3) {
|
|
16
16
|
throw new Error(`Could not parse link from "${linkToken.text}"`);
|
|
@@ -31,7 +31,7 @@ export const getTitleFrom = (adr: string) => {
|
|
|
31
31
|
if (!mainHead) {
|
|
32
32
|
throw new Error('No main heading found');
|
|
33
33
|
}
|
|
34
|
-
return (mainHead as
|
|
34
|
+
return (mainHead as Tokens.Heading).text.trim();
|
|
35
35
|
};
|
|
36
36
|
|
|
37
37
|
export const supersede = (markdown: string, link: string) => {
|
|
@@ -40,7 +40,7 @@ export const supersede = (markdown: string, link: string) => {
|
|
|
40
40
|
if (statusIndex < 0) {
|
|
41
41
|
throw new Error('Could not find status section');
|
|
42
42
|
}
|
|
43
|
-
const statusDepth = (tokens[statusIndex] as
|
|
43
|
+
const statusDepth = (tokens[statusIndex] as Tokens.Heading).depth;
|
|
44
44
|
const followingHeadingIndex = tokens.findIndex(
|
|
45
45
|
(token, index) => token.type === 'heading' && token.depth === statusDepth && index > statusIndex
|
|
46
46
|
);
|
|
@@ -74,7 +74,7 @@ export const injectLink = (markdown: string, link: string) => {
|
|
|
74
74
|
throw new Error('Could not find status section');
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
const statusDepth = (tokens[statusIndex] as
|
|
77
|
+
const statusDepth = (tokens[statusIndex] as Tokens.Heading).depth;
|
|
78
78
|
let followingHeadingIndex = tokens.findIndex(
|
|
79
79
|
(token, index) => token.type === 'heading' && token.depth === statusDepth && index > statusIndex
|
|
80
80
|
);
|
package/src/lib/prompt.test.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { faker } from '@faker-js/faker';
|
|
2
|
-
import inquirer, {
|
|
2
|
+
import inquirer, { Question } from 'inquirer';
|
|
3
3
|
import { describe, expect, it, vi } from 'vitest';
|
|
4
4
|
import { askForClarification } from './prompt.js';
|
|
5
5
|
|
|
@@ -21,8 +21,8 @@ describe('The prompt helper', () => {
|
|
|
21
21
|
|
|
22
22
|
expect(prompt).toHaveBeenCalledOnce();
|
|
23
23
|
const calledWith = prompt.mock.calls[0][0] as Question[];
|
|
24
|
-
expect(calledWith[0].type).toEqual('
|
|
25
|
-
expect(
|
|
24
|
+
expect(calledWith[0].type).toEqual('select');
|
|
25
|
+
expect(calledWith[0].choices).toEqual(randomChoices);
|
|
26
26
|
expect(calledWith[0].message).toMatchInlineSnapshot(
|
|
27
27
|
'"Which file do you want to link to for BLUE[this is the search string]?"'
|
|
28
28
|
);
|
package/src/lib/prompt.ts
CHANGED
|
@@ -2,9 +2,9 @@ import chalk from 'chalk';
|
|
|
2
2
|
|
|
3
3
|
export const askForClarification = async (searchString: string, matches: string[]) => {
|
|
4
4
|
const { default: inquirer } = await import('inquirer');
|
|
5
|
-
const selection = await inquirer.prompt([
|
|
5
|
+
const selection = await inquirer.prompt<{ target: string }>([
|
|
6
6
|
{
|
|
7
|
-
type: '
|
|
7
|
+
type: 'select',
|
|
8
8
|
name: 'target',
|
|
9
9
|
message: `Which file do you want to link to for ${chalk.blue(searchString)}?`,
|
|
10
10
|
choices: matches
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const LIB_VERSION = '2.0.
|
|
1
|
+
export const LIB_VERSION = '2.0.3';
|
package/tests/fake-editor
CHANGED
package/tests/fake-editor.cmd
CHANGED
package/tests/fake-visual
CHANGED
package/tests/fake-visual.cmd
CHANGED
package/tsconfig.json
CHANGED
|
@@ -1,18 +1,50 @@
|
|
|
1
1
|
{
|
|
2
|
-
"extends": "@meza/tsconfig-base",
|
|
3
2
|
"compilerOptions": {
|
|
4
3
|
"target": "ES2020",
|
|
5
4
|
"module": "NodeNext",
|
|
6
5
|
"moduleResolution": "NodeNext",
|
|
6
|
+
"sourceMap": true,
|
|
7
|
+
"incremental": true,
|
|
8
|
+
"allowUnreachableCode": false,
|
|
9
|
+
"allowUnusedLabels": false,
|
|
10
|
+
"strict": true,
|
|
11
|
+
"exactOptionalPropertyTypes": true,
|
|
12
|
+
"noFallthroughCasesInSwitch": true,
|
|
13
|
+
"noImplicitAny": true,
|
|
14
|
+
"noImplicitOverride": true,
|
|
15
|
+
"noImplicitReturns": true,
|
|
16
|
+
"noImplicitThis": true,
|
|
17
|
+
"noPropertyAccessFromIndexSignature": true,
|
|
18
|
+
"noUncheckedIndexedAccess": false,
|
|
19
|
+
"noUnusedLocals": true,
|
|
20
|
+
"noUnusedParameters": true,
|
|
21
|
+
"strictBindCallApply": true,
|
|
22
|
+
"strictFunctionTypes": true,
|
|
23
|
+
"strictNullChecks": true,
|
|
24
|
+
"strictPropertyInitialization": true,
|
|
25
|
+
"useUnknownInCatchVariables": true,
|
|
26
|
+
"allowUmdGlobalAccess": false,
|
|
27
|
+
"resolveJsonModule": true,
|
|
28
|
+
"allowJs": false,
|
|
29
|
+
"checkJs": false,
|
|
30
|
+
"allowSyntheticDefaultImports": true,
|
|
7
31
|
"esModuleInterop": true,
|
|
32
|
+
"forceConsistentCasingInFileNames": true,
|
|
33
|
+
"emitDecoratorMetadata": false,
|
|
34
|
+
"experimentalDecorators": false,
|
|
8
35
|
"emitDeclarationOnly": false,
|
|
36
|
+
"declaration": true,
|
|
37
|
+
"declarationMap": true,
|
|
9
38
|
"skipDefaultLibCheck": true,
|
|
10
39
|
"skipLibCheck": true,
|
|
40
|
+
"preserveSymlinks": true,
|
|
11
41
|
"outDir": "./dist",
|
|
42
|
+
"rootDir": "./src",
|
|
12
43
|
"declarationDir": "./dist/types",
|
|
13
44
|
"isolatedModules": true,
|
|
14
45
|
"sourceRoot": "src",
|
|
15
|
-
"typeRoots": ["./node_modules/@types", "./src/types"]
|
|
46
|
+
"typeRoots": ["./node_modules/@types", "./src/types"],
|
|
47
|
+
"types": ["node"]
|
|
16
48
|
},
|
|
17
49
|
"include": ["src/**/*"],
|
|
18
50
|
"exclude": ["node_modules", "tests/**/*"],
|
package/vitest.config.e2e.ts
CHANGED
|
@@ -6,11 +6,9 @@ export default defineConfig({
|
|
|
6
6
|
testTimeout: 30000,
|
|
7
7
|
hookTimeout: 30000,
|
|
8
8
|
pool: 'threads',
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
},
|
|
9
|
+
fileParallelism: false,
|
|
10
|
+
maxWorkers: 1,
|
|
11
|
+
minWorkers: 1,
|
|
14
12
|
watch: false,
|
|
15
13
|
coverage: {
|
|
16
14
|
reportsDirectory: './reports/coverage/e2e',
|