@docusaurus/remark-plugin-npm2yarn 2.3.1 → 2.4.1

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/README.md CHANGED
@@ -63,3 +63,30 @@ module.exports = {
63
63
  | Property | Type | Default | Description |
64
64
  | --- | --- | --- | --- |
65
65
  | `sync` | `boolean` | `false` | Syncing tab choices (Yarn and npm). See https://docusaurus.io/docs/markdown-features/#syncing-tab-choices for details. |
66
+ | `converters` | `array` | `'yarn'`, `'pnpm'` | The list of converters to use. The order of the converters is important, as the first converter will be used as the default choice. |
67
+
68
+ ## Custom converters
69
+
70
+ In case you want to convert npm commands to something else than `yarn` or `pnpm`, you can use custom converters:
71
+
72
+ ```ts
73
+ type CustomConverter = [name: string, cb: (npmCode: string) => string];
74
+ ```
75
+
76
+ ```ts
77
+ {
78
+ remarkPlugins: [
79
+ [
80
+ require('@docusaurus/remark-plugin-npm2yarn'),
81
+ {
82
+ sync: true,
83
+ converters: [
84
+ 'yarn',
85
+ 'pnpm',
86
+ ['Turbo', (code) => code.replace(/npm/g, 'turbo')],
87
+ ],
88
+ },
89
+ ],
90
+ ];
91
+ }
92
+ ```
package/lib/index.d.ts CHANGED
@@ -5,8 +5,10 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  import type { Plugin } from 'unified';
8
+ declare type CustomConverter = [name: string, cb: (npmCode: string) => string];
8
9
  declare type PluginOptions = {
9
10
  sync?: boolean;
11
+ converters?: (CustomConverter | 'yarn' | 'pnpm')[];
10
12
  };
11
13
  declare const plugin: Plugin<[PluginOptions?]>;
12
14
  export = plugin;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,SAAS,CAAC;AAGpC,aAAK,aAAa,GAAG;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AA8CF,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,CA4BpC,CAAC;AAIF,SAAS,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,SAAS,CAAC;AAGpC,aAAK,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;AAEvE,aAAK,aAAa,GAAG;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,CAAC,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CACpD,CAAC;AAkEF,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,CA4BpC,CAAC;AAIF,SAAS,MAAM,CAAC"}
package/lib/index.js CHANGED
@@ -8,34 +8,38 @@
8
8
  const tslib_1 = require("tslib");
9
9
  const unist_util_visit_1 = tslib_1.__importDefault(require("unist-util-visit"));
10
10
  const npm_to_yarn_1 = tslib_1.__importDefault(require("npm-to-yarn"));
11
- // E.g. global install: 'npm i' -> 'yarn'
12
- const convertNpmToYarn = (npmCode) => (0, npm_to_yarn_1.default)(npmCode, 'yarn');
13
- const transformNode = (node, isSync) => {
14
- const groupIdProp = isSync ? ' groupId="npm2yarn"' : '';
15
- const npmCode = node.value;
16
- const yarnCode = convertNpmToYarn(node.value);
11
+ function createTabItem(code, node, value, label) {
17
12
  return [
18
13
  {
19
14
  type: 'jsx',
20
- value: `<Tabs${groupIdProp}>\n<TabItem value="npm">`,
15
+ value: `<TabItem value="${value}"${label ? ` label="${label}"` : ''}>`,
21
16
  },
22
17
  {
23
18
  type: node.type,
24
19
  lang: node.lang,
25
- value: npmCode,
20
+ value: code,
26
21
  },
27
22
  {
28
23
  type: 'jsx',
29
- value: '</TabItem>\n<TabItem value="yarn" label="Yarn">',
24
+ value: '</TabItem>',
30
25
  },
26
+ ];
27
+ }
28
+ const transformNode = (node, isSync, converters) => {
29
+ const groupIdProp = isSync ? ' groupId="npm2yarn"' : '';
30
+ const npmCode = node.value;
31
+ return [
31
32
  {
32
- type: node.type,
33
- lang: node.lang,
34
- value: yarnCode,
33
+ type: 'jsx',
34
+ value: `<Tabs${groupIdProp}>`,
35
35
  },
36
+ ...createTabItem(npmCode, node, 'npm'),
37
+ ...converters.flatMap((converter) => typeof converter === 'string'
38
+ ? createTabItem((0, npm_to_yarn_1.default)(npmCode, converter), node, converter, converter === 'yarn' ? 'Yarn' : converter)
39
+ : createTabItem(converter[1](npmCode), node, converter[0])),
36
40
  {
37
41
  type: 'jsx',
38
- value: '</TabItem>\n</Tabs>',
42
+ value: '</Tabs>',
39
43
  },
40
44
  ];
41
45
  };
@@ -47,7 +51,7 @@ const nodeForImport = {
47
51
  value: "import Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';",
48
52
  };
49
53
  const plugin = (options = {}) => {
50
- const { sync = false } = options;
54
+ const { sync = false, converters = ['yarn', 'pnpm'] } = options;
51
55
  return (root) => {
52
56
  let transformed = false;
53
57
  let alreadyImported = false;
@@ -60,7 +64,7 @@ const plugin = (options = {}) => {
60
64
  while (index < node.children.length) {
61
65
  const child = node.children[index];
62
66
  if (matchNode(child)) {
63
- const result = transformNode(child, sync);
67
+ const result = transformNode(child, sync, converters);
64
68
  node.children.splice(index, 1, ...result);
65
69
  index += result.length;
66
70
  transformed = true;
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@docusaurus/remark-plugin-npm2yarn",
3
- "version": "2.3.1",
3
+ "version": "2.4.1",
4
4
  "description": "Remark plugin for converting npm commands to Yarn commands as tabs.",
5
5
  "main": "lib/index.js",
6
6
  "publishConfig": {
@@ -17,8 +17,8 @@
17
17
  },
18
18
  "license": "MIT",
19
19
  "dependencies": {
20
- "npm-to-yarn": "^1.0.1",
21
- "tslib": "^2.4.0",
20
+ "npm-to-yarn": "^2.0.0",
21
+ "tslib": "^2.4.1",
22
22
  "unist-util-visit": "^2.0.3"
23
23
  },
24
24
  "devDependencies": {
@@ -30,5 +30,5 @@
30
30
  "engines": {
31
31
  "node": ">=16.14"
32
32
  },
33
- "gitHead": "cf12f21a10f6c5439ff931e61419c4bb03a5a2dc"
33
+ "gitHead": "60e657d8ae5a4a9ed1c2d777f9defd882cc12681"
34
34
  }
package/src/index.ts CHANGED
@@ -11,39 +11,62 @@ import type {Code, Content, Literal} from 'mdast';
11
11
  import type {Plugin} from 'unified';
12
12
  import type {Node, Parent} from 'unist';
13
13
 
14
+ type CustomConverter = [name: string, cb: (npmCode: string) => string];
15
+
14
16
  type PluginOptions = {
15
17
  sync?: boolean;
18
+ converters?: (CustomConverter | 'yarn' | 'pnpm')[];
16
19
  };
17
20
 
18
- // E.g. global install: 'npm i' -> 'yarn'
19
- const convertNpmToYarn = (npmCode: string) => npmToYarn(npmCode, 'yarn');
20
-
21
- const transformNode = (node: Code, isSync: boolean) => {
22
- const groupIdProp = isSync ? ' groupId="npm2yarn"' : '';
23
- const npmCode = node.value;
24
- const yarnCode = convertNpmToYarn(node.value);
21
+ function createTabItem(
22
+ code: string,
23
+ node: Code,
24
+ value: string,
25
+ label?: string,
26
+ ) {
25
27
  return [
26
28
  {
27
29
  type: 'jsx',
28
- value: `<Tabs${groupIdProp}>\n<TabItem value="npm">`,
30
+ value: `<TabItem value="${value}"${label ? ` label="${label}"` : ''}>`,
29
31
  },
30
32
  {
31
33
  type: node.type,
32
34
  lang: node.lang,
33
- value: npmCode,
35
+ value: code,
34
36
  },
35
37
  {
36
38
  type: 'jsx',
37
- value: '</TabItem>\n<TabItem value="yarn" label="Yarn">',
39
+ value: '</TabItem>',
38
40
  },
41
+ ] as Content[];
42
+ }
43
+
44
+ const transformNode = (
45
+ node: Code,
46
+ isSync: boolean,
47
+ converters: (CustomConverter | 'yarn' | 'pnpm')[],
48
+ ) => {
49
+ const groupIdProp = isSync ? ' groupId="npm2yarn"' : '';
50
+ const npmCode = node.value;
51
+ return [
39
52
  {
40
- type: node.type,
41
- lang: node.lang,
42
- value: yarnCode,
53
+ type: 'jsx',
54
+ value: `<Tabs${groupIdProp}>`,
43
55
  },
56
+ ...createTabItem(npmCode, node, 'npm'),
57
+ ...converters.flatMap((converter) =>
58
+ typeof converter === 'string'
59
+ ? createTabItem(
60
+ npmToYarn(npmCode, converter),
61
+ node,
62
+ converter,
63
+ converter === 'yarn' ? 'Yarn' : converter,
64
+ )
65
+ : createTabItem(converter[1](npmCode), node, converter[0]),
66
+ ),
44
67
  {
45
68
  type: 'jsx',
46
- value: '</TabItem>\n</Tabs>',
69
+ value: '</Tabs>',
47
70
  },
48
71
  ] as Content[];
49
72
  };
@@ -60,7 +83,7 @@ const nodeForImport: Literal = {
60
83
  };
61
84
 
62
85
  const plugin: Plugin<[PluginOptions?]> = (options = {}) => {
63
- const {sync = false} = options;
86
+ const {sync = false, converters = ['yarn', 'pnpm']} = options;
64
87
  return (root) => {
65
88
  let transformed = false as boolean;
66
89
  let alreadyImported = false as boolean;
@@ -73,7 +96,7 @@ const plugin: Plugin<[PluginOptions?]> = (options = {}) => {
73
96
  while (index < node.children.length) {
74
97
  const child = node.children[index]!;
75
98
  if (matchNode(child)) {
76
- const result = transformNode(child, sync);
99
+ const result = transformNode(child, sync, converters);
77
100
  node.children.splice(index, 1, ...result);
78
101
  index += result.length;
79
102
  transformed = true;