@netfoundry/docusaurus-shared 0.0.168

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 (112) hide show
  1. package/dist/components/Alert/Alert.d.ts +8 -0
  2. package/dist/components/Alert/index.d.ts +2 -0
  3. package/dist/components/CodeBlock/CodeBlock.d.ts +9 -0
  4. package/dist/components/CodeBlock/index.d.ts +2 -0
  5. package/dist/components/Common/Common.d.ts +23 -0
  6. package/dist/components/Common/index.d.ts +1 -0
  7. package/dist/components/NetFoundry/Divider/Divider.d.ts +2 -0
  8. package/dist/components/NetFoundry/Divider/index.d.ts +1 -0
  9. package/dist/components/NetFoundry/index.d.ts +1 -0
  10. package/dist/components/NetFoundryFooter/NetFoundryFooter.d.ts +22 -0
  11. package/dist/components/NetFoundryFooter/index.d.ts +1 -0
  12. package/dist/components/NetFoundryHighlight/NetFoundryHighlight.d.ts +6 -0
  13. package/dist/components/NetFoundryHighlight/index.d.ts +2 -0
  14. package/dist/components/NetFoundryHorizontalSection/NetFoundryHorizontalSection.d.ts +8 -0
  15. package/dist/components/NetFoundryHorizontalSection/index.d.ts +2 -0
  16. package/dist/components/NetFoundryLayout/NetFoundryLayout.d.ts +29 -0
  17. package/dist/components/NetFoundryLayout/index.d.ts +1 -0
  18. package/dist/components/NetFoundryNavbarItems/NetFoundryNavbarItems.d.ts +9 -0
  19. package/dist/components/NetFoundryNavbarItems/index.d.ts +2 -0
  20. package/dist/components/OsTabs/OsTabs.d.ts +5 -0
  21. package/dist/components/OsTabs/index.d.ts +2 -0
  22. package/dist/components/StarUs/StarUs.d.ts +6 -0
  23. package/dist/components/StarUs/index.d.ts +2 -0
  24. package/dist/components/index.d.ts +11 -0
  25. package/dist/docusaurus-envhelper.d.ts +15 -0
  26. package/dist/docusaurus-plugins/index.d.ts +7 -0
  27. package/dist/docusaurus-plugins/logger.d.ts +12 -0
  28. package/dist/docusaurus-plugins/remarkCodeSections.d.ts +7 -0
  29. package/dist/docusaurus-plugins/remarkReplaceMetaUrl.d.ts +10 -0
  30. package/dist/docusaurus-plugins/remarkScopedPath.d.ts +12 -0
  31. package/dist/docusaurus-plugins/remarkYamlTable.d.ts +7 -0
  32. package/dist/docusaurus-plugins/remarkYouTube.d.ts +7 -0
  33. package/dist/docusaurus-plugins/timedPlugin.d.ts +5 -0
  34. package/dist/index.cjs +8 -0
  35. package/dist/index.cjs.map +1 -0
  36. package/dist/index.css +1 -0
  37. package/dist/index.d.ts +1 -0
  38. package/dist/index.esm.js +6 -0
  39. package/dist/index.esm.js.map +1 -0
  40. package/dist/node.cjs +80 -0
  41. package/dist/node.cjs.map +1 -0
  42. package/dist/node.d.ts +1 -0
  43. package/dist/node.esm.js +68 -0
  44. package/dist/node.esm.js.map +1 -0
  45. package/dist/plugins.cjs +4643 -0
  46. package/dist/plugins.cjs.map +1 -0
  47. package/dist/plugins.d.ts +1 -0
  48. package/dist/plugins.esm.js +4634 -0
  49. package/dist/plugins.esm.js.map +1 -0
  50. package/dist/ui.cjs +1312 -0
  51. package/dist/ui.cjs.map +1 -0
  52. package/dist/ui.d.ts +2 -0
  53. package/dist/ui.esm.js +1284 -0
  54. package/dist/ui.esm.js.map +1 -0
  55. package/dist/version.cjs +6 -0
  56. package/dist/version.cjs.map +1 -0
  57. package/dist/version.d.ts +1 -0
  58. package/dist/version.esm.js +4 -0
  59. package/dist/version.esm.js.map +1 -0
  60. package/package.json +82 -0
  61. package/src/components/Alert/Alert.module.css +39 -0
  62. package/src/components/Alert/Alert.tsx +24 -0
  63. package/src/components/Alert/index.ts +2 -0
  64. package/src/components/CodeBlock/CodeBlock.module.css +27 -0
  65. package/src/components/CodeBlock/CodeBlock.tsx +32 -0
  66. package/src/components/CodeBlock/index.ts +2 -0
  67. package/src/components/Common/Common.module.css +0 -0
  68. package/src/components/Common/Common.tsx +53 -0
  69. package/src/components/Common/index.ts +1 -0
  70. package/src/components/NetFoundry/Divider/Divider.module.css +23 -0
  71. package/src/components/NetFoundry/Divider/Divider.tsx +20 -0
  72. package/src/components/NetFoundry/Divider/index.ts +1 -0
  73. package/src/components/NetFoundry/index.ts +1 -0
  74. package/src/components/NetFoundryFooter/NetFoundryFooter.tsx +164 -0
  75. package/src/components/NetFoundryFooter/index.ts +1 -0
  76. package/src/components/NetFoundryFooter/styles.module.css +99 -0
  77. package/src/components/NetFoundryHighlight/NetFoundryHighlight.tsx +15 -0
  78. package/src/components/NetFoundryHighlight/index.ts +2 -0
  79. package/src/components/NetFoundryHighlight/styles.module.css +26 -0
  80. package/src/components/NetFoundryHorizontalSection/NetFoundryHorizontalSection.tsx +23 -0
  81. package/src/components/NetFoundryHorizontalSection/index.ts +2 -0
  82. package/src/components/NetFoundryHorizontalSection/styles.module.css +23 -0
  83. package/src/components/NetFoundryLayout/NetFoundryLayout.module.css +6 -0
  84. package/src/components/NetFoundryLayout/NetFoundryLayout.tsx +110 -0
  85. package/src/components/NetFoundryLayout/index.ts +1 -0
  86. package/src/components/NetFoundryNavbarItems/NetFoundryNavbarItems.tsx +22 -0
  87. package/src/components/NetFoundryNavbarItems/index.ts +2 -0
  88. package/src/components/OsTabs/OsTabs.tsx +30 -0
  89. package/src/components/OsTabs/index.ts +2 -0
  90. package/src/components/StarUs/StarUs.tsx +19 -0
  91. package/src/components/StarUs/index.ts +2 -0
  92. package/src/components/StarUs/styles.module.css +6 -0
  93. package/src/components/index.ts +11 -0
  94. package/src/css/layout.css +14 -0
  95. package/src/css/legacy.css +2348 -0
  96. package/src/css/vars-dark.css +7 -0
  97. package/src/css/vars.css +8 -0
  98. package/src/docusaurus-envhelper.ts +105 -0
  99. package/src/docusaurus-plugins/index.ts +7 -0
  100. package/src/docusaurus-plugins/logger.ts +38 -0
  101. package/src/docusaurus-plugins/remarkCodeSections.ts +115 -0
  102. package/src/docusaurus-plugins/remarkReplaceMetaUrl.ts +35 -0
  103. package/src/docusaurus-plugins/remarkScopedPath.ts +70 -0
  104. package/src/docusaurus-plugins/remarkYamlTable.ts +83 -0
  105. package/src/docusaurus-plugins/remarkYouTube.ts +56 -0
  106. package/src/docusaurus-plugins/timedPlugin.ts +22 -0
  107. package/src/global.d.ts +1 -0
  108. package/src/index.ts +3 -0
  109. package/src/node.ts +1 -0
  110. package/src/plugins.ts +1 -0
  111. package/src/ui.ts +2 -0
  112. package/src/version.ts +1 -0
@@ -0,0 +1,7 @@
1
+ html[data-theme="dark"] {
2
+ /*--nf-docs-max-width: 100px;*/
3
+ /*--nf-docs-main-color: pink;*/
4
+ .container {
5
+ /*background: orange;*/
6
+ }
7
+ }
@@ -0,0 +1,8 @@
1
+ :root {
2
+ --ifm-navbar-height: 50px;
3
+ --nf-docs-max-width: 1400px;
4
+ /*--nf-docs-main-color: purple;*/
5
+ .container {
6
+ /*background: sandybrown;*/
7
+ }
8
+ }
@@ -0,0 +1,105 @@
1
+ import type { LoadContext, Plugin } from '@docusaurus/types';
2
+
3
+ // Safe in browser & Node: check globalThis.process only by property access on a known object.
4
+ // 1) Use Node's env if present; 2) else use browser-injected __DOCUSAURUS_ENV__; 3) else {}
5
+ type Env = Record<string, string | undefined>;
6
+ const g: any = typeof globalThis !== "undefined" ? globalThis : {};
7
+
8
+ const RUNTIME_ENV: Env = (() => {
9
+ if (g.process && typeof g.process.env === "object") return g.process.env as Env;
10
+ if (g.__DOCUSAURUS_ENV__) return g.__DOCUSAURUS_ENV__ as Env;
11
+ return {};
12
+ })();
13
+
14
+ const getEnv = (k: string, d?: string) =>
15
+ (RUNTIME_ENV[k] ?? d) as string | undefined;
16
+
17
+ const ORIGIN =
18
+ getEnv("DOCUSAURUS_URL") ||
19
+ (typeof window !== "undefined" ? window.location.origin : "http://localhost");
20
+
21
+ export const DOCUSAURUS_DEBUG = getEnv("DOCUSAURUS_DEBUG") === "true";
22
+ export const DOCUSAURUS_URL = ORIGIN;
23
+ export const DOCUSAURUS_BASE_PATH = getEnv("DOCUSAURUS_BASE_PATH", "/base-url");
24
+ export const DOCUSAURUS_DOCS_PATH = getEnv("DOCUSAURUS_DOCS_PATH", "/docs-path");
25
+ export const DOCUSAURUS_CANONICAL_DOMAIN = getEnv("DOCUSAURUS_CANONICAL_DOMAIN", "canonical.domain.missing.local");
26
+ export const hotjarId = getEnv("ZITI_HOTJAR_APPID", "6443327")!;
27
+
28
+ export function cleanUrl(path: string) {
29
+ return path.replace(/([^:]\/)\/+/g, "$1");
30
+ }
31
+
32
+ export function docUrl(base: string, path: string): string {
33
+ return cleanUrl(`${base}/${path}`);
34
+ }
35
+
36
+ export function absoluteUrl(base: string, path: string): string {
37
+ return cleanUrl(`${base}/${DOCUSAURUS_DOCS_PATH}/${path}`);
38
+ }
39
+
40
+ export function addDocsRedir(base: string, redirectsArr: { to: string; from: string[] }[]) {
41
+ if (getEnv("DEPLOY_ENV") === "kinsta") {
42
+ redirectsArr.push({
43
+ to: docUrl(base, "/learn/introduction/"),
44
+ from: [docUrl(base, "/docs")],
45
+ });
46
+ }
47
+ }
48
+
49
+
50
+
51
+
52
+
53
+ interface HotjarThemeConfig {
54
+ applicationId: string;
55
+ }
56
+
57
+ export function pluginHotjar(context: LoadContext): Plugin {
58
+ const { siteConfig } = context;
59
+ const { themeConfig } = siteConfig;
60
+ const { hotjar } = themeConfig as { hotjar?: HotjarThemeConfig };
61
+
62
+ if (!hotjar) {
63
+ throw new Error(
64
+ `You need to specify 'hotjar' object in 'themeConfig' with 'applicationId' field in it to use docusaurus-plugin-hotjar`,
65
+ );
66
+ }
67
+
68
+ const { applicationId } = hotjar;
69
+
70
+ if (!applicationId) {
71
+ throw new Error(
72
+ 'You specified the `hotjar` object in `themeConfig` but the `applicationId` field was missing. ' +
73
+ 'Please ensure this is not a mistake.',
74
+ );
75
+ }
76
+
77
+ const isProd = process.env.NODE_ENV === 'production';
78
+
79
+ return {
80
+ name: 'docusaurus-plugin-hotjar',
81
+
82
+ injectHtmlTags() {
83
+ console.log(`[hotjar] applicationId = ${applicationId} isProd = ${isProd}`);
84
+ if (!isProd) {
85
+ return {};
86
+ }
87
+
88
+ return {
89
+ headTags: [
90
+ {
91
+ tagName: 'script',
92
+ innerHTML: `(function(h,o,t,j,a,r){
93
+ h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
94
+ h._hjSettings={hjid:${applicationId},hjsv:6};
95
+ a=o.getElementsByTagName('head')[0];
96
+ r=o.createElement('script');r.async=1;
97
+ r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
98
+ a.appendChild(r);
99
+ })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');`,
100
+ },
101
+ ],
102
+ };
103
+ },
104
+ };
105
+ }
@@ -0,0 +1,7 @@
1
+ export * from './logger'
2
+ export * from './remarkYouTube';
3
+ export * from './remarkScopedPath';
4
+ export * from './remarkReplaceMetaUrl'
5
+ export * from './remarkCodeSections'
6
+ export * from './remarkYamlTable'
7
+ export * from './timedPlugin'
@@ -0,0 +1,38 @@
1
+ import { writeFileSync, appendFileSync, existsSync } from 'fs'
2
+ import { join } from 'path'
3
+
4
+ export enum LogLevel {
5
+ Silent = 0,
6
+ Info = 1,
7
+ Debug = 2,
8
+ }
9
+
10
+ const LOG = join(process.cwd(), 'remark-plugins.log')
11
+
12
+ export class Logger {
13
+ constructor(private level: LogLevel, private name: string) {}
14
+ log(msg: unknown, level: LogLevel = LogLevel.Info) {
15
+ if (this.level === LogLevel.Silent) return
16
+ if (level > this.level) return
17
+
18
+ const text = String(msg)
19
+ if (!text.trim()) return
20
+
21
+ const line = `[${this.name}] ${LogLevel[level]} ${text}`
22
+ if (!existsSync(LOG)) writeFileSync(LOG, '')
23
+ appendFileSync(LOG, `[${new Date().toISOString()}] ${line}\n`)
24
+ }
25
+ }
26
+
27
+ export function resolveLogLevel(val: unknown): LogLevel {
28
+ if (typeof val === "number" && LogLevel[val] !== undefined) {
29
+ return val as LogLevel
30
+ }
31
+ if (typeof val === "string") {
32
+ const key = val[0].toUpperCase() + val.slice(1).toLowerCase()
33
+ if (key in LogLevel) {
34
+ return LogLevel[key as keyof typeof LogLevel]
35
+ }
36
+ }
37
+ return LogLevel.Silent
38
+ }
@@ -0,0 +1,115 @@
1
+ import {visit} from "unist-util-visit"
2
+ import type {Plugin} from "unified"
3
+ import type {Node} from "unist"
4
+ import {Logger, LogLevel, resolveLogLevel} from "./logger"
5
+
6
+ interface Options {
7
+ logLevel?: LogLevel
8
+ }
9
+
10
+ export const remarkCodeSections: Plugin<[Options?]> = (options?: Options) => {
11
+ const logger = new Logger(resolveLogLevel(options?.logLevel), "remarkCodeSections")
12
+
13
+ const desc_text = "@desc:"
14
+ const command_text = "@command:"
15
+ const code_text = "@code:"
16
+ const results_text = "@results:"
17
+
18
+ return (tree: Node) => {
19
+ visit(tree, "code", (node: any, index: number, parent: any) => {
20
+ if (!node?.value) return
21
+
22
+ const hasActivator = /@desc:|@command:|@code:|@results:/.test(node.value)
23
+ if (!hasActivator) return
24
+
25
+ logger.log(node, LogLevel.Debug)
26
+ if (node.lang && node.lang.startsWith("example")) {
27
+ const lang = node.lang.replace("example-", "").trim()
28
+ const lines = node.value.split("\n")
29
+ let description = "", command = "", code = "", results = "", codeTitle = ""
30
+ let currentSection = ""
31
+
32
+ lines.forEach((line: string) => {
33
+ if (line.startsWith(desc_text)) {
34
+ currentSection = "description"
35
+ description = line.replace(desc_text, "").trim()
36
+ } else if (line.startsWith(command_text)) {
37
+ currentSection = "command"
38
+ command = line.replace(command_text, "").trim()
39
+ } else if (line.startsWith(code_text)) {
40
+ currentSection = "code"
41
+ codeTitle = line.replace(code_text, "").trim()
42
+ } else if (line.startsWith(results_text)) {
43
+ currentSection = "results"
44
+ results = line.replace(results_text, "").trim()
45
+ } else {
46
+ if (currentSection === "description") description += `\n${line}`
47
+ else if (currentSection === "command") command += `\n${line}`
48
+ else if (currentSection === "code") code += `\n${line}`
49
+ else if (currentSection === "results") results += `\n${line}`
50
+ }
51
+ })
52
+
53
+ const divWrapper = {
54
+ type: "div",
55
+ data: { hName: "div", hProperties: { className: "code-section" } },
56
+ children: [] as any[],
57
+ }
58
+
59
+ if (description) {
60
+ const descDiv = {
61
+ type: "div",
62
+ data: { hName: "div", hProperties: { className: "code-section-desc" } },
63
+ children: [] as any[],
64
+ }
65
+ descDiv.children.push(
66
+ { type: "paragraph", children: [{ type: "strong", children: [{ type: "text", value: "Description:" }] }] },
67
+ { type: "paragraph", children: [{ type: "text", value: description.trim() }], data: { hProperties: { style: "padding-bottom: 10px;" } } },
68
+ )
69
+ divWrapper.children.push(descDiv)
70
+ }
71
+
72
+ if (command) {
73
+ const cmdDiv = {
74
+ type: "div",
75
+ data: { hName: "div", hProperties: { className: "code-section-command" } },
76
+ children: [] as any[],
77
+ }
78
+ cmdDiv.children.push(
79
+ { type: "paragraph", children: [{ type: "strong", children: [{ type: "text", value: "Command:" }] }] },
80
+ { type: "code", lang: "sh", value: command.trim() },
81
+ )
82
+ divWrapper.children.push(cmdDiv)
83
+ }
84
+
85
+ if (code) {
86
+ const codeDiv = {
87
+ type: "div",
88
+ data: { hName: "div", hProperties: { className: "code-section-code" } },
89
+ children: [] as any[],
90
+ }
91
+ codeDiv.children.push(
92
+ { type: "paragraph", children: [{ type: "strong", children: [{ type: "text", value: codeTitle }] }] },
93
+ { type: "code", lang, value: code.trim() },
94
+ )
95
+ divWrapper.children.push(codeDiv)
96
+ }
97
+
98
+ if (results) {
99
+ const resultsDiv = {
100
+ type: "div",
101
+ data: { hName: "div", hProperties: { className: "code-section-results" } },
102
+ children: [] as any[],
103
+ }
104
+ resultsDiv.children.push(
105
+ { type: "paragraph", children: [{ type: "strong", children: [{ type: "text", value: "Results:" }] }] },
106
+ { type: "code", lang: "buttonless", value: results.trim() },
107
+ )
108
+ divWrapper.children.push(resultsDiv)
109
+ }
110
+
111
+ parent.children.splice(index, 1, divWrapper)
112
+ }
113
+ })
114
+ }
115
+ }
@@ -0,0 +1,35 @@
1
+ import { Plugin } from 'unified'
2
+ import { visit } from 'unist-util-visit'
3
+ import { Root } from 'mdast'
4
+ import {Logger, LogLevel, resolveLogLevel} from './logger'
5
+
6
+ console.log("🦖 remarkReplaceMetaUrl plugin loaded")
7
+
8
+ interface Options {
9
+ from: string
10
+ to: string
11
+ logLevel?: LogLevel
12
+ }
13
+
14
+ export const remarkReplaceMetaUrl: Plugin<[Options], Root> = (options?: Options) => {
15
+ const { from = '', to = '', logLevel = LogLevel.Silent } = options ?? {}
16
+ const logger = new Logger(resolveLogLevel(options?.logLevel), 'remarkReplaceMetaUrl')
17
+
18
+ logger.log(`initialized: replacing "${from}" → "${to}"`)
19
+
20
+ return (tree: Root) => {
21
+ visit(tree, 'mdxJsxFlowElement', (node: any) => {
22
+ if (node.name === 'meta' && Array.isArray(node.attributes)) {
23
+ for (const attr of node.attributes) {
24
+ if (attr.name === 'content' && typeof attr.value === 'string' && attr.value.includes(from)) {
25
+ const newVal = attr.value.replace(from, to)
26
+ logger.log(`rewriting: "${attr.value}" → "${newVal}"`, LogLevel.Info)
27
+ attr.value = newVal
28
+ }
29
+ }
30
+ }
31
+ })
32
+ }
33
+ }
34
+
35
+ export default remarkReplaceMetaUrl
@@ -0,0 +1,70 @@
1
+ import { Plugin } from 'unified'
2
+ import { visit } from 'unist-util-visit'
3
+ import { Image, Link } from 'mdast'
4
+ import { MdxJsxFlowElement, MdxjsEsm } from 'mdast-util-mdx'
5
+ import {Logger, LogLevel, resolveLogLevel} from './logger'
6
+
7
+ console.log("🦖 remarkScopedPath plugin module loaded")
8
+
9
+ interface ScopedPathOptions {
10
+ from: string
11
+ to: string
12
+ }
13
+ interface Options {
14
+ mappings: ScopedPathOptions[]
15
+ logLevel?: LogLevel
16
+ }
17
+
18
+ export const remarkScopedPath: Plugin<[Options]> = (options?: Options) => {
19
+ const { mappings = [], logLevel = LogLevel.Silent } = options ?? {}
20
+ const logger = new Logger(resolveLogLevel(options?.logLevel), 'remarkScopedPath')
21
+
22
+ logger.log(`initialized with ${mappings.length} mappings`)
23
+
24
+ return (tree, file) => {
25
+ const filePath = file?.path || file?.history?.slice(-1)[0] || 'unknown'
26
+ logger.log(`processing file: ${filePath}`, LogLevel.Debug)
27
+
28
+ const rewrite = (val: string, from: string, to: string, ctx: string) => {
29
+ if (val.startsWith(from)) {
30
+ const newVal = val.replace(from, to)
31
+ logger.log(`🔄 ${ctx} ${val} → ${newVal}`, LogLevel.Info)
32
+ return newVal
33
+ }
34
+ return val
35
+ }
36
+
37
+ visit(tree, 'image', (node: Image) => {
38
+ for (const { from, to } of mappings) node.url = rewrite(node.url, from, to, 'img')
39
+ })
40
+
41
+ visit(tree, 'link', (node: Link) => {
42
+ for (const { from, to } of mappings) node.url = rewrite(node.url, from, to, 'link')
43
+ })
44
+
45
+ visit(tree, 'mdxJsxFlowElement', (node: MdxJsxFlowElement) => {
46
+ node.attributes?.forEach(attr => {
47
+ if (attr.type === 'mdxJsxAttribute' && typeof attr.value === 'string') {
48
+ for (const { from, to } of mappings)
49
+ attr.value = rewrite(attr.value, from, to, `jsx <${node.name}> ${attr.name}:`)
50
+ }
51
+ })
52
+ })
53
+
54
+ visit(tree, 'mdxjsEsm', (node: MdxjsEsm) => {
55
+ for (const { from, to } of mappings) {
56
+ const re = new RegExp(`(['"])${from}/`, 'g')
57
+ const newVal = node.value.replace(re, `$1${to}/`)
58
+ if (newVal !== node.value) {
59
+ logger.log(
60
+ `esm rewrite (${from} → ${to}):\n--- before ---\n${node.value}\n--- after ---\n${newVal}`,
61
+ LogLevel.Info
62
+ )
63
+ node.value = newVal
64
+ }
65
+ }
66
+ })
67
+
68
+ logger.log(` `, LogLevel.Debug)
69
+ }
70
+ }
@@ -0,0 +1,83 @@
1
+ import { Plugin } from 'unified'
2
+ import { visit } from 'unist-util-visit'
3
+ import yaml from 'js-yaml'
4
+ import { Parent } from 'unist'
5
+ import { Literal } from 'unist'
6
+ import {Logger, LogLevel, resolveLogLevel} from './logger'
7
+
8
+ console.log("🦖 remarkYamlTable plugin module loaded")
9
+
10
+ interface Code extends Literal {
11
+ type: 'code'
12
+ lang?: string
13
+ value: string
14
+ }
15
+
16
+ interface TableCell {
17
+ type: 'tableCell'
18
+ children: { type: 'text'; value: string }[]
19
+ }
20
+
21
+ interface TableRow {
22
+ type: 'tableRow'
23
+ children: TableCell[]
24
+ }
25
+
26
+ interface Table {
27
+ type: 'table'
28
+ align: (null | 'left' | 'right' | 'center')[]
29
+ children: TableRow[]
30
+ }
31
+
32
+ interface Options {
33
+ logLevel?: LogLevel
34
+ }
35
+
36
+ export const remarkYamlTable: Plugin<[Options]> = (options?: Options) => {
37
+ const { logLevel = LogLevel.Silent } = options ?? {}
38
+ const logger = new Logger(resolveLogLevel(options?.logLevel), 'remarkYamlTable')
39
+
40
+ logger.log('initialized')
41
+
42
+ return (tree) => {
43
+ visit(tree, 'code', (node: Code, index: number | undefined, parent: Parent | undefined) => {
44
+ if (!parent || index === undefined) return
45
+ if (node.lang === 'yaml-table') {
46
+ try {
47
+ const data = yaml.load(node.value)
48
+ if (Array.isArray(data) && data.length > 0 && typeof data[0] === 'object') {
49
+ const headers = Object.keys(data[0] as Record<string, unknown>)
50
+
51
+ const tableRows: TableRow[] = (data as Record<string, unknown>[]).map((row) => ({
52
+ type: 'tableRow',
53
+ children: headers.map<TableCell>((header) => ({
54
+ type: 'tableCell',
55
+ children: [{ type: 'text', value: String(row[header] ?? '') }],
56
+ })),
57
+ }))
58
+
59
+ const tableNode: Table = {
60
+ type: 'table',
61
+ align: headers.map(() => null),
62
+ children: [
63
+ {
64
+ type: 'tableRow',
65
+ children: headers.map<TableCell>((header) => ({
66
+ type: 'tableCell',
67
+ children: [{ type: 'text', value: header }],
68
+ })),
69
+ },
70
+ ...tableRows,
71
+ ],
72
+ }
73
+
74
+ parent.children[index] = tableNode
75
+ logger.log(`generated table with ${headers.length} columns and ${data.length} rows`, LogLevel.Info)
76
+ }
77
+ } catch (error) {
78
+ logger.log(`YAML parsing error: ${(error as Error).message}`, LogLevel.Info)
79
+ }
80
+ }
81
+ })
82
+ }
83
+ }
@@ -0,0 +1,56 @@
1
+ import type { Plugin } from 'unified'
2
+ import { visit } from 'unist-util-visit'
3
+ import type { Node } from 'unist'
4
+ import {Logger, LogLevel, resolveLogLevel} from './logger'
5
+
6
+ console.log("🦖 remarkYouTube plugin module loaded")
7
+
8
+ interface YouTubeOptions {
9
+ logLevel?: LogLevel
10
+ }
11
+
12
+ export const remarkYouTube: Plugin<[YouTubeOptions]> = (options?: YouTubeOptions) => {
13
+ const { logLevel = LogLevel.Silent } = options ?? {}
14
+ const logger = new Logger(resolveLogLevel(options?.logLevel), 'remarkYouTube')
15
+
16
+ logger.log('initialized')
17
+
18
+ return (tree: Node) => {
19
+ visit(tree, ['link', 'text'], (node: any, index: number | undefined, parent: any) => {
20
+ if (!parent || typeof index !== 'number') return
21
+ let raw = node.url || node.value || ''
22
+ let ytUrl = raw.trim()
23
+
24
+ const hashnodeMatch = ytUrl.match(/^%\[(.+)\]$/)
25
+ if (hashnodeMatch) {
26
+ ytUrl = hashnodeMatch[1]
27
+ logger.log(`hashnode-style embed detected: ${ytUrl}`, LogLevel.Info)
28
+ }
29
+
30
+ const m =
31
+ ytUrl.match(/youtube\.com\/watch\?v=([A-Za-z0-9_-]+)/) ||
32
+ ytUrl.match(/youtu\.be\/([A-Za-z0-9_-]+)/) ||
33
+ ytUrl.match(/youtube-nocookie\.com\/watch\?v=([A-Za-z0-9_-]+)/)
34
+
35
+ if (m) {
36
+ logger.log(`rewriting YouTube URL: ${ytUrl} → videoId=${m[1]}`, LogLevel.Debug)
37
+ parent.children.splice(index, 1, {
38
+ type: 'mdxJsxFlowElement',
39
+ name: 'LiteYouTubeEmbed',
40
+ attributes: [
41
+ { type: 'mdxJsxAttribute', name: 'id', value: m[1] },
42
+ { type: 'mdxJsxAttribute', name: 'title', value: 'YouTube video' },
43
+ ],
44
+ })
45
+ }
46
+ })
47
+
48
+ visit(tree, 'text', (node: any, index: number | undefined, parent: any) => {
49
+ if (!parent || typeof index !== 'number') return
50
+ if (node.value.trim() === '%[' || node.value.trim() === ']') {
51
+ logger.log(`stripping hashnode bracket artifact: ${node.value}`, LogLevel.Debug)
52
+ parent.children.splice(index, 1)
53
+ }
54
+ })
55
+ }
56
+ }
@@ -0,0 +1,22 @@
1
+ import { Plugin } from "unified"
2
+ import {Logger, LogLevel, resolveLogLevel} from './logger'
3
+
4
+ export function timedPlugin<T extends Plugin>(
5
+ name: string,
6
+ plugin: T,
7
+ opts: { logLevel?: LogLevel } = {}
8
+ ): T {
9
+ const { logLevel = LogLevel.Info } = opts
10
+ const logger = new Logger(resolveLogLevel(opts?.logLevel), name)
11
+
12
+ return ((...args: any[]) => {
13
+ const instance = (plugin as any)(...args)
14
+ return (tree: any, file: any) => {
15
+ const start = Date.now()
16
+ const res = instance(tree, file)
17
+ const dur = Date.now() - start
18
+ logger.log(`⏱ finished in ${dur}ms`)
19
+ return res
20
+ }
21
+ }) as any
22
+ }
@@ -0,0 +1 @@
1
+ declare module '*.module.css';
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ // src/index.ts
2
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
3
+ export const version: string = require('../package.json').version;
package/src/node.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './docusaurus-envhelper';
package/src/plugins.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './docusaurus-plugins'
package/src/ui.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './components';
2
+ export * from './docusaurus-envhelper'
package/src/version.ts ADDED
@@ -0,0 +1 @@
1
+ export const version = '0.0.168';