@altano/remark-mdx-toc-with-slugs 3.0.2 → 4.0.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/dist/index.d.ts +14 -11
- package/dist/index.js +43 -43
- package/dist/index.js.map +1 -0
- package/package.json +12 -11
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { RemarkMdxTocOptions, TocEntry } from "@altano/remark-mdx-toc";
|
|
2
|
+
import { Plugin } from "unified";
|
|
3
|
+
|
|
4
|
+
//#region src/index.d.ts
|
|
5
|
+
type TableOfContentsEntry = TocEntry & {
|
|
6
|
+
slug: string;
|
|
7
|
+
children: TableOfContentsEntry[];
|
|
6
8
|
};
|
|
7
|
-
|
|
9
|
+
type RemarkMdxTocWithSlugsOptions = RemarkMdxTocOptions;
|
|
8
10
|
/**
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
* Remark plugin that, given a tree that has had remark-mdx-toc run over it
|
|
12
|
+
* already, the toc data will be enhanced to have auto-generated slugs for every
|
|
13
|
+
* heading. This uses github-slugger
|
|
14
|
+
*/
|
|
13
15
|
declare const remarkMdxTocWithSlugs: Plugin<[RemarkMdxTocWithSlugsOptions?]>;
|
|
14
|
-
|
|
16
|
+
//#endregion
|
|
17
|
+
export { RemarkMdxTocWithSlugsOptions, TableOfContentsEntry, remarkMdxTocWithSlugs as default };
|
|
15
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
1
1
|
import { generate } from "astring";
|
|
2
2
|
import { valueToEstree } from "estree-util-value-to-estree";
|
|
3
|
-
import { EXIT, visit
|
|
3
|
+
import { EXIT, visit } from "estree-util-visit";
|
|
4
4
|
import GithubSlugger from "github-slugger";
|
|
5
5
|
import remarkMdxToc from "@altano/remark-mdx-toc";
|
|
6
|
-
import { visit } from "unist-util-visit";
|
|
6
|
+
import { visit as visit$1 } from "unist-util-visit";
|
|
7
|
+
|
|
8
|
+
//#region src/index.ts
|
|
7
9
|
function sluggifyTocEntries(entries, headingSlugger = new GithubSlugger()) {
|
|
8
|
-
|
|
10
|
+
return entries.map((entry) => sluggifyTocEntry(entry, headingSlugger));
|
|
9
11
|
}
|
|
10
12
|
function sluggifyTocEntry(entry, headingSlugger) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
return {
|
|
14
|
+
...entry,
|
|
15
|
+
slug: headingSlugger.slug(entry.value),
|
|
16
|
+
children: sluggifyTocEntries(entry.children, headingSlugger)
|
|
17
|
+
};
|
|
16
18
|
}
|
|
17
19
|
function assertMdxjsEsmNode(node) {
|
|
18
|
-
|
|
19
|
-
throw new Error(`Node was unexpected type: ${node.type}`);
|
|
20
|
-
}
|
|
20
|
+
if (node.type !== "mdxjsEsm") throw new Error(`Node was unexpected type: ${node.type}`);
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Remark plugin that, given a tree that has had remark-mdx-toc run over it
|
|
24
|
+
* already, the toc data will be enhanced to have auto-generated slugs for every
|
|
25
|
+
* heading. This uses github-slugger
|
|
26
|
+
*/
|
|
22
27
|
const remarkMdxTocWithSlugs = function(options = {}) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
return;
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
};
|
|
51
|
-
};
|
|
52
|
-
var index_default = remarkMdxTocWithSlugs;
|
|
53
|
-
export {
|
|
54
|
-
index_default as default
|
|
28
|
+
const mdxTocTransformer = remarkMdxToc.call(this, options);
|
|
29
|
+
const name = options.name ?? "toc";
|
|
30
|
+
return function mdxTocWithSlugsTransformer(ast, ...args) {
|
|
31
|
+
const result = mdxTocTransformer(ast, ...args);
|
|
32
|
+
if (result instanceof Promise) throw new Error(`Wasn't expected remark-mdx-toc to be an async plugin`);
|
|
33
|
+
const mdast = ast;
|
|
34
|
+
visit$1(mdast, ["mdxjsEsm"], (mdxNode) => {
|
|
35
|
+
assertMdxjsEsmNode(mdxNode);
|
|
36
|
+
const estree = mdxNode.data?.estree;
|
|
37
|
+
if (estree) visit(estree, (esNode) => {
|
|
38
|
+
if (esNode.type === "VariableDeclarator" && esNode.id.type === "Identifier" && esNode.id.name === name && esNode.init) {
|
|
39
|
+
const tocExportString = generate(esNode.init);
|
|
40
|
+
const toc = JSON.parse(tocExportString);
|
|
41
|
+
const tocWithSlugs = sluggifyTocEntries(toc);
|
|
42
|
+
const newTree = valueToEstree(tocWithSlugs);
|
|
43
|
+
if (newTree.type === "ArrayExpression") esNode.init = newTree;
|
|
44
|
+
return EXIT;
|
|
45
|
+
}
|
|
46
|
+
return;
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
};
|
|
55
50
|
};
|
|
51
|
+
var src_default = remarkMdxTocWithSlugs;
|
|
52
|
+
|
|
53
|
+
//#endregion
|
|
54
|
+
export { src_default as default };
|
|
55
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["entries: TocEntry[]","entry: TocEntry","headingSlugger: GithubSlugger","node: Node","remarkMdxTocWithSlugs: Plugin<[RemarkMdxTocWithSlugsOptions?]>"],"sources":["../src/index.ts"],"sourcesContent":["import { generate } from \"astring\";\nimport { valueToEstree } from \"estree-util-value-to-estree\";\nimport { EXIT, visit as estreeVisit } from \"estree-util-visit\";\nimport GithubSlugger from \"github-slugger\";\nimport remarkMdxToc from \"@altano/remark-mdx-toc\";\nimport { visit } from \"unist-util-visit\";\n\nimport type { RemarkMdxTocOptions, TocEntry } from \"@altano/remark-mdx-toc\";\nimport type { Plugin, Processor } from \"unified\";\nimport type { MdxjsEsm } from \"mdast-util-mdxjs-esm\";\nimport type { Node } from \"unist\";\n\nexport type TableOfContentsEntry = TocEntry & {\n slug: string;\n children: TableOfContentsEntry[];\n};\n\nfunction sluggifyTocEntries(\n entries: TocEntry[],\n headingSlugger = new GithubSlugger(),\n): TableOfContentsEntry[] {\n return entries.map((entry) => sluggifyTocEntry(entry, headingSlugger));\n}\n\nfunction sluggifyTocEntry(\n entry: TocEntry,\n headingSlugger: GithubSlugger,\n): TableOfContentsEntry {\n return {\n ...entry,\n slug: headingSlugger.slug(entry.value),\n children: sluggifyTocEntries(entry.children, headingSlugger),\n };\n}\n\nexport type RemarkMdxTocWithSlugsOptions = RemarkMdxTocOptions;\n\nfunction assertMdxjsEsmNode(node: Node): asserts node is MdxjsEsm {\n if (node.type !== \"mdxjsEsm\") {\n throw new Error(`Node was unexpected type: ${node.type}`);\n }\n}\n\n/**\n * Remark plugin that, given a tree that has had remark-mdx-toc run over it\n * already, the toc data will be enhanced to have auto-generated slugs for every\n * heading. This uses github-slugger\n */\nconst remarkMdxTocWithSlugs: Plugin<[RemarkMdxTocWithSlugsOptions?]> =\n function (this: Processor, options = {}) {\n const mdxTocTransformer = remarkMdxToc.call(this, options);\n\n const name = options.name ?? \"toc\"; // mirrors remark-mdx-toc\n\n return function mdxTocWithSlugsTransformer(ast, ...args): void {\n // Delegate to remark-mdx-toc to create the table of contents\n const result = mdxTocTransformer(ast, ...args);\n if (result instanceof Promise) {\n throw new Error(`Wasn't expected remark-mdx-toc to be an async plugin`);\n }\n\n const mdast = ast;\n\n // visit all esm nodes in the mdx\n visit(mdast, [\"mdxjsEsm\"], (mdxNode) => {\n assertMdxjsEsmNode(mdxNode);\n // visit all nodes in the estree\n const estree = mdxNode.data?.estree;\n if (estree) {\n estreeVisit(estree, (esNode) => {\n if (\n esNode.type === \"VariableDeclarator\" &&\n esNode.id.type === \"Identifier\" &&\n esNode.id.name === name &&\n esNode.init\n ) {\n // we found the \"toc\" variable declarator\n\n // It's easier to be wasteful and do our transformations in JS,\n // instead of directly on the tree, and then convert it back to a\n // tree.\n const tocExportString = generate(esNode.init);\n const toc = JSON.parse(tocExportString) as TocEntry[];\n\n // Add slugs to the toc\n const tocWithSlugs = sluggifyTocEntries(toc);\n\n // Overwrite the existing toc export with ours\n const newTree = valueToEstree(tocWithSlugs);\n\n if (newTree.type === \"ArrayExpression\") {\n esNode.init = newTree;\n }\n\n // We out\n return EXIT;\n }\n\n return;\n });\n }\n });\n };\n };\n\nexport default remarkMdxTocWithSlugs;\n"],"mappings":";;;;;;;;AAiBA,SAAS,mBACPA,SACA,iBAAiB,IAAI,iBACG;AACxB,QAAO,QAAQ,IAAI,CAAC,UAAU,iBAAiB,OAAO,eAAe,CAAC;AACvE;AAED,SAAS,iBACPC,OACAC,gBACsB;AACtB,QAAO;EACL,GAAG;EACH,MAAM,eAAe,KAAK,MAAM,MAAM;EACtC,UAAU,mBAAmB,MAAM,UAAU,eAAe;CAC7D;AACF;AAID,SAAS,mBAAmBC,MAAsC;AAChE,KAAI,KAAK,SAAS,WAChB,OAAM,IAAI,OAAO,4BAA4B,KAAK,KAAK;AAE1D;;;;;;AAOD,MAAMC,wBACJ,SAA2B,UAAU,CAAE,GAAE;CACvC,MAAM,oBAAoB,aAAa,KAAK,MAAM,QAAQ;CAE1D,MAAM,OAAO,QAAQ,QAAQ;AAE7B,QAAO,SAAS,2BAA2B,KAAK,GAAG,MAAY;EAE7D,MAAM,SAAS,kBAAkB,KAAK,GAAG,KAAK;AAC9C,MAAI,kBAAkB,QACpB,OAAM,IAAI,OAAO;EAGnB,MAAM,QAAQ;AAGd,UAAM,OAAO,CAAC,UAAW,GAAE,CAAC,YAAY;AACtC,sBAAmB,QAAQ;GAE3B,MAAM,SAAS,QAAQ,MAAM;AAC7B,OAAI,OACF,OAAY,QAAQ,CAAC,WAAW;AAC9B,QACE,OAAO,SAAS,wBAChB,OAAO,GAAG,SAAS,gBACnB,OAAO,GAAG,SAAS,QACnB,OAAO,MACP;KAMA,MAAM,kBAAkB,SAAS,OAAO,KAAK;KAC7C,MAAM,MAAM,KAAK,MAAM,gBAAgB;KAGvC,MAAM,eAAe,mBAAmB,IAAI;KAG5C,MAAM,UAAU,cAAc,aAAa;AAE3C,SAAI,QAAQ,SAAS,kBACnB,QAAO,OAAO;AAIhB,YAAO;IACR;AAED;GACD,EAAC;EAEL,EAAC;CACH;AACF;AAEH,kBAAe"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@altano/remark-mdx-toc-with-slugs",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"description": "A remark plugin to generate a table of contents (including slugs) and convert it into MDX export",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mdx",
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"types": "./dist/index.d.ts",
|
|
28
28
|
"files": [
|
|
29
29
|
"dist/**/*.js",
|
|
30
|
+
"dist/**/*.js.map",
|
|
30
31
|
"dist/**/*.d.ts"
|
|
31
32
|
],
|
|
32
33
|
"dependencies": {
|
|
@@ -37,29 +38,29 @@
|
|
|
37
38
|
"mdast-util-mdxjs-esm": "^2.0.1",
|
|
38
39
|
"unified": "^11.0.5",
|
|
39
40
|
"unist-util-visit": "^5.0.0",
|
|
40
|
-
"@altano/remark-mdx-toc": "
|
|
41
|
+
"@altano/remark-mdx-toc": "1.0.1"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
43
44
|
"@arethetypeswrong/cli": "^0.17.4",
|
|
44
45
|
"@types/node": "^22.13.10",
|
|
45
46
|
"@types/unist": "^3.0.3",
|
|
46
|
-
"@vitest/coverage-v8": "^3.1.
|
|
47
|
+
"@vitest/coverage-v8": "^3.1.4",
|
|
47
48
|
"depcheck": "^1.4.7",
|
|
48
49
|
"prettier": "^3.5.3",
|
|
50
|
+
"tsdown": "^0.12.9",
|
|
49
51
|
"typescript": "^5.8.2",
|
|
50
|
-
"vite": "^6.2.
|
|
51
|
-
"vitest": "^3.1.
|
|
52
|
-
"@altano/
|
|
53
|
-
"@altano/remark-plugin-test-util": "0.0.
|
|
54
|
-
"@altano/
|
|
55
|
-
"@altano/tsconfig": "0.0.
|
|
52
|
+
"vite": "^6.2.6",
|
|
53
|
+
"vitest": "^3.1.4",
|
|
54
|
+
"@altano/build-config": "0.0.1",
|
|
55
|
+
"@altano/remark-plugin-test-util": "0.0.1",
|
|
56
|
+
"@altano/testing": "0.0.1",
|
|
57
|
+
"@altano/tsconfig": "0.0.1"
|
|
56
58
|
},
|
|
57
59
|
"publishConfig": {
|
|
58
60
|
"access": "public"
|
|
59
61
|
},
|
|
60
62
|
"scripts": {
|
|
61
|
-
"build": "
|
|
62
|
-
"build:types": "tsc --project tsconfig.declarations.json",
|
|
63
|
+
"build": "tsdown --config ../build-config/tsdown.config.browser.ts",
|
|
63
64
|
"check:exports": "attw --pack . --profile esm-only --quiet",
|
|
64
65
|
"check:types:src": "tsc --noEmit",
|
|
65
66
|
"check:types:test": "tsc --noEmit --project ./tests/tsconfig.json",
|