docusaurus-roles-plugin 1.0.0-beta.1 → 1.0.0-beta.2
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.cjs +7 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/package.json +9 -1
- package/src/theme/BlogSidebar/index.tsx +4 -4
package/dist/index.cjs
CHANGED
|
@@ -80,6 +80,12 @@ function createDeferred() {
|
|
|
80
80
|
});
|
|
81
81
|
return { promise, resolve, reject };
|
|
82
82
|
}
|
|
83
|
+
function withTimeout(p, ms) {
|
|
84
|
+
return Promise.race([
|
|
85
|
+
p,
|
|
86
|
+
new Promise((res) => setTimeout(() => res("timeout"), ms))
|
|
87
|
+
]);
|
|
88
|
+
}
|
|
83
89
|
var blogRolesReady = createDeferred();
|
|
84
90
|
var setRolesByPermaLink = (blogPosts) => {
|
|
85
91
|
blogRolesReady = createDeferred();
|
|
@@ -100,7 +106,7 @@ function pluginRoles(_context, options) {
|
|
|
100
106
|
return import_path.default.resolve(__dirname, "../src/theme");
|
|
101
107
|
},
|
|
102
108
|
async contentLoaded({ actions }) {
|
|
103
|
-
await blogRolesReady.promise;
|
|
109
|
+
await withTimeout(blogRolesReady.promise, 5e3);
|
|
104
110
|
actions.setGlobalData({
|
|
105
111
|
rolesByPermalink,
|
|
106
112
|
unauthorizedBehavior: options.unauthorizedBehavior ?? "notFound",
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/options.ts"],"sourcesContent":["import path from \"path\";\nimport type { LoadContext, Plugin } from \"@docusaurus/types\";\nimport {\n getRoleRequirements,\n type RolesPluginOptions,\n type RoleEntry,\n} from \"./options\";\nimport { BlogPost, ProcessBlogPostsFn } from \"@docusaurus/plugin-content-blog\";\nimport {\n SidebarItemsGeneratorDoc,\n SidebarItemsGeneratorOption,\n} from \"@docusaurus/plugin-content-docs/src/sidebars/types.js\";\n\nexport { RolesPluginOptions } from \"./options\";\n\n/**\n * Used to apply FrontMatter required_roles and required_roles_mode to\n * sidebar_custom_props.required_roles and sidebar_custom_props.required_roles_mode.\n *\n * Should use protectDocSidebar for simple use cases.\n *\n * @param docs - The docs to transform.\n */\nexport const addDocSidebarCustomProps = (docs: SidebarItemsGeneratorDoc[]) => {\n for (const doc of docs) {\n const roles = doc.frontMatter.required_roles;\n if (!roles) continue;\n\n const props = (doc.frontMatter.sidebar_custom_props ??= {});\n props.required_roles = roles;\n props.required_roles_mode = doc.frontMatter.required_roles_mode;\n }\n};\n\n/**\n * Used to protect docs sidebar is a plug and play for sidebarItemsGenerator\n */\nexport const protectDocSidebar: SidebarItemsGeneratorOption = async ({\n defaultSidebarItemsGenerator,\n ...args\n}) => {\n addDocSidebarCustomProps(args.docs);\n\n return defaultSidebarItemsGenerator(args);\n};\n\nlet rolesByPermalink: RoleEntry[] = [];\n\nfunction createDeferred<T>() {\n let resolve!: (value: T) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nlet blogRolesReady = createDeferred<void>();\n\n/**\n * Used to set rolesByPermalink which is used by overriden BlogSidebar\n * to protect blog sidebar.\n */\nexport const setRolesByPermaLink = (blogPosts: BlogPost[]) => {\n blogRolesReady = createDeferred<void>();\n\n rolesByPermalink = blogPosts.map((bp) => ({\n permalink: bp.metadata.permalink,\n ...getRoleRequirements(bp.metadata.frontMatter),\n }));\n\n blogRolesReady.resolve();\n};\n\n/**\n * Used to protect blog sidebar is a plug and play for processBlogPosts.\n */\nexport const protectBlogSidebar: ProcessBlogPostsFn = async ({ blogPosts }) => {\n setRolesByPermaLink(blogPosts);\n return blogPosts;\n};\n\nexport default function pluginRoles(\n _context: LoadContext,\n options: RolesPluginOptions,\n): Plugin {\n return {\n name: \"docusaurus-roles-plugin\",\n\n getThemePath() {\n return path.resolve(__dirname, \"../src/theme\");\n },\n\n async contentLoaded({ actions }) {\n await blogRolesReady.promise;\n\n actions.setGlobalData({\n rolesByPermalink,\n unauthorizedBehavior: options.unauthorizedBehavior ?? \"notFound\",\n redirectTo: options.redirectTo ?? \"/access-denied\",\n });\n },\n };\n}\n","export type UnauthorizedBehavior = \"forbidden\" | \"redirect\";\n\nexport type RolesPluginOptions = {\n unauthorizedBehavior?: UnauthorizedBehavior;\n redirectTo?: string; // default '/access-denied'\n};\n\nexport type InternalRolesPluginOptions = {\n rolesByPermalink: RoleEntry[];\n} & RolesPluginOptions;\n\nexport type RolesMode = \"all\" | \"any\";\n\nexport type RoleRequirements = {\n requiredRoles: string[];\n requiredRolesMode: RolesMode;\n};\n\nexport type RoleFrontMatter = {\n required_roles?: string[];\n required_roles_mode?: RolesMode;\n};\n\nexport type RoleEntry = RoleRequirements & {\n permalink: string;\n};\n\nexport function getRoleFrontMatter(frontMatter: unknown): RoleFrontMatter {\n if (!frontMatter || typeof frontMatter !== \"object\") return {};\n return frontMatter as RoleFrontMatter;\n}\n\nexport function getRoleRequirements(frontMatter: unknown): RoleRequirements {\n const roleFrontMatter = getRoleFrontMatter(frontMatter);\n return {\n requiredRoles: roleFrontMatter.required_roles ?? [],\n requiredRolesMode: roleFrontMatter.required_roles_mode ?? \"all\",\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;;;AC2BV,SAAS,mBAAmB,aAAuC;AACxE,MAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU,QAAO,CAAC;AAC7D,SAAO;AACT;AAEO,SAAS,oBAAoB,aAAwC;AAC1E,QAAM,kBAAkB,mBAAmB,WAAW;AACtD,SAAO;AAAA,IACL,eAAe,gBAAgB,kBAAkB,CAAC;AAAA,IAClD,mBAAmB,gBAAgB,uBAAuB;AAAA,EAC5D;AACF;;;ADfO,IAAM,2BAA2B,CAAC,SAAqC;AAvB9E;AAwBE,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,IAAI,YAAY;AAC9B,QAAI,CAAC,MAAO;AAEZ,UAAM,SAAS,SAAI,aAAY,yBAAhB,GAAgB,uBAAyB,CAAC;AACzD,UAAM,iBAAiB;AACvB,UAAM,sBAAsB,IAAI,YAAY;AAAA,EAC9C;AACF;AAKO,IAAM,oBAAiD,OAAO;AAAA,EACnE;AAAA,EACA,GAAG;AACL,MAAM;AACJ,2BAAyB,KAAK,IAAI;AAElC,SAAO,6BAA6B,IAAI;AAC1C;AAEA,IAAI,mBAAgC,CAAC;AAErC,SAAS,iBAAoB;AAC3B,MAAI;AACJ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAW,CAAC,KAAK,QAAQ;AAC3C,cAAU;AACV,aAAS;AAAA,EACX,CAAC;AACD,SAAO,EAAE,SAAS,SAAS,OAAO;AACpC;AAEA,IAAI,iBAAiB,eAAqB;AAMnC,IAAM,sBAAsB,CAAC,cAA0B;AAC5D,mBAAiB,eAAqB;AAEtC,qBAAmB,UAAU,IAAI,CAAC,QAAQ;AAAA,IACxC,WAAW,GAAG,SAAS;AAAA,IACvB,GAAG,oBAAoB,GAAG,SAAS,WAAW;AAAA,EAChD,EAAE;AAEF,iBAAe,QAAQ;AACzB;AAKO,IAAM,qBAAyC,OAAO,EAAE,UAAU,MAAM;AAC7E,sBAAoB,SAAS;AAC7B,SAAO;AACT;AAEe,SAAR,YACL,UACA,SACQ;AACR,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,eAAe;AACb,aAAO,YAAAA,QAAK,QAAQ,WAAW,cAAc;AAAA,IAC/C;AAAA,IAEA,MAAM,cAAc,EAAE,QAAQ,GAAG;AAC/B,YAAM,eAAe;
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/options.ts"],"sourcesContent":["import path from \"path\";\nimport type { LoadContext, Plugin } from \"@docusaurus/types\";\nimport {\n getRoleRequirements,\n type RolesPluginOptions,\n type RoleEntry,\n} from \"./options\";\nimport { BlogPost, ProcessBlogPostsFn } from \"@docusaurus/plugin-content-blog\";\nimport {\n SidebarItemsGeneratorDoc,\n SidebarItemsGeneratorOption,\n} from \"@docusaurus/plugin-content-docs/src/sidebars/types.js\";\n\nexport { RolesPluginOptions } from \"./options\";\n\n/**\n * Used to apply FrontMatter required_roles and required_roles_mode to\n * sidebar_custom_props.required_roles and sidebar_custom_props.required_roles_mode.\n *\n * Should use protectDocSidebar for simple use cases.\n *\n * @param docs - The docs to transform.\n */\nexport const addDocSidebarCustomProps = (docs: SidebarItemsGeneratorDoc[]) => {\n for (const doc of docs) {\n const roles = doc.frontMatter.required_roles;\n if (!roles) continue;\n\n const props = (doc.frontMatter.sidebar_custom_props ??= {});\n props.required_roles = roles;\n props.required_roles_mode = doc.frontMatter.required_roles_mode;\n }\n};\n\n/**\n * Used to protect docs sidebar is a plug and play for sidebarItemsGenerator\n */\nexport const protectDocSidebar: SidebarItemsGeneratorOption = async ({\n defaultSidebarItemsGenerator,\n ...args\n}) => {\n addDocSidebarCustomProps(args.docs);\n\n return defaultSidebarItemsGenerator(args);\n};\n\nlet rolesByPermalink: RoleEntry[] = [];\n\nfunction createDeferred<T>() {\n let resolve!: (value: T) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nfunction withTimeout<T>(p: Promise<T>, ms: number): Promise<T | \"timeout\"> {\n return Promise.race([\n p,\n new Promise<\"timeout\">((res) => setTimeout(() => res(\"timeout\"), ms)),\n ]);\n}\n\nlet blogRolesReady = createDeferred<void>();\n\n/**\n * Used to set rolesByPermalink which is used by overriden BlogSidebar\n * to protect blog sidebar.\n */\nexport const setRolesByPermaLink = (blogPosts: BlogPost[]) => {\n blogRolesReady = createDeferred<void>();\n\n rolesByPermalink = blogPosts.map((bp) => ({\n permalink: bp.metadata.permalink,\n ...getRoleRequirements(bp.metadata.frontMatter),\n }));\n\n blogRolesReady.resolve();\n};\n\n/**\n * Used to protect blog sidebar is a plug and play for processBlogPosts.\n */\nexport const protectBlogSidebar: ProcessBlogPostsFn = async ({ blogPosts }) => {\n setRolesByPermaLink(blogPosts);\n return blogPosts;\n};\n\nexport default function pluginRoles(\n _context: LoadContext,\n options: RolesPluginOptions,\n): Plugin {\n return {\n name: \"docusaurus-roles-plugin\",\n\n getThemePath() {\n return path.resolve(__dirname, \"../src/theme\");\n },\n\n async contentLoaded({ actions }) {\n await withTimeout(blogRolesReady.promise, 5000);\n\n actions.setGlobalData({\n rolesByPermalink,\n unauthorizedBehavior: options.unauthorizedBehavior ?? \"notFound\",\n redirectTo: options.redirectTo ?? \"/access-denied\",\n });\n },\n };\n}\n","export type UnauthorizedBehavior = \"forbidden\" | \"redirect\";\n\nexport type RolesPluginOptions = {\n unauthorizedBehavior?: UnauthorizedBehavior;\n redirectTo?: string; // default '/access-denied'\n};\n\nexport type InternalRolesPluginOptions = {\n rolesByPermalink: RoleEntry[];\n} & RolesPluginOptions;\n\nexport type RolesMode = \"all\" | \"any\";\n\nexport type RoleRequirements = {\n requiredRoles: string[];\n requiredRolesMode: RolesMode;\n};\n\nexport type RoleFrontMatter = {\n required_roles?: string[];\n required_roles_mode?: RolesMode;\n};\n\nexport type RoleEntry = RoleRequirements & {\n permalink: string;\n};\n\nexport function getRoleFrontMatter(frontMatter: unknown): RoleFrontMatter {\n if (!frontMatter || typeof frontMatter !== \"object\") return {};\n return frontMatter as RoleFrontMatter;\n}\n\nexport function getRoleRequirements(frontMatter: unknown): RoleRequirements {\n const roleFrontMatter = getRoleFrontMatter(frontMatter);\n return {\n requiredRoles: roleFrontMatter.required_roles ?? [],\n requiredRolesMode: roleFrontMatter.required_roles_mode ?? \"all\",\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;;;AC2BV,SAAS,mBAAmB,aAAuC;AACxE,MAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU,QAAO,CAAC;AAC7D,SAAO;AACT;AAEO,SAAS,oBAAoB,aAAwC;AAC1E,QAAM,kBAAkB,mBAAmB,WAAW;AACtD,SAAO;AAAA,IACL,eAAe,gBAAgB,kBAAkB,CAAC;AAAA,IAClD,mBAAmB,gBAAgB,uBAAuB;AAAA,EAC5D;AACF;;;ADfO,IAAM,2BAA2B,CAAC,SAAqC;AAvB9E;AAwBE,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,IAAI,YAAY;AAC9B,QAAI,CAAC,MAAO;AAEZ,UAAM,SAAS,SAAI,aAAY,yBAAhB,GAAgB,uBAAyB,CAAC;AACzD,UAAM,iBAAiB;AACvB,UAAM,sBAAsB,IAAI,YAAY;AAAA,EAC9C;AACF;AAKO,IAAM,oBAAiD,OAAO;AAAA,EACnE;AAAA,EACA,GAAG;AACL,MAAM;AACJ,2BAAyB,KAAK,IAAI;AAElC,SAAO,6BAA6B,IAAI;AAC1C;AAEA,IAAI,mBAAgC,CAAC;AAErC,SAAS,iBAAoB;AAC3B,MAAI;AACJ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAW,CAAC,KAAK,QAAQ;AAC3C,cAAU;AACV,aAAS;AAAA,EACX,CAAC;AACD,SAAO,EAAE,SAAS,SAAS,OAAO;AACpC;AAEA,SAAS,YAAe,GAAe,IAAoC;AACzE,SAAO,QAAQ,KAAK;AAAA,IAClB;AAAA,IACA,IAAI,QAAmB,CAAC,QAAQ,WAAW,MAAM,IAAI,SAAS,GAAG,EAAE,CAAC;AAAA,EACtE,CAAC;AACH;AAEA,IAAI,iBAAiB,eAAqB;AAMnC,IAAM,sBAAsB,CAAC,cAA0B;AAC5D,mBAAiB,eAAqB;AAEtC,qBAAmB,UAAU,IAAI,CAAC,QAAQ;AAAA,IACxC,WAAW,GAAG,SAAS;AAAA,IACvB,GAAG,oBAAoB,GAAG,SAAS,WAAW;AAAA,EAChD,EAAE;AAEF,iBAAe,QAAQ;AACzB;AAKO,IAAM,qBAAyC,OAAO,EAAE,UAAU,MAAM;AAC7E,sBAAoB,SAAS;AAC7B,SAAO;AACT;AAEe,SAAR,YACL,UACA,SACQ;AACR,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,eAAe;AACb,aAAO,YAAAA,QAAK,QAAQ,WAAW,cAAc;AAAA,IAC/C;AAAA,IAEA,MAAM,cAAc,EAAE,QAAQ,GAAG;AAC/B,YAAM,YAAY,eAAe,SAAS,GAAI;AAE9C,cAAQ,cAAc;AAAA,QACpB;AAAA,QACA,sBAAsB,QAAQ,wBAAwB;AAAA,QACtD,YAAY,QAAQ,cAAc;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":["path"]}
|
package/dist/index.js
CHANGED
|
@@ -42,6 +42,12 @@ function createDeferred() {
|
|
|
42
42
|
});
|
|
43
43
|
return { promise, resolve, reject };
|
|
44
44
|
}
|
|
45
|
+
function withTimeout(p, ms) {
|
|
46
|
+
return Promise.race([
|
|
47
|
+
p,
|
|
48
|
+
new Promise((res) => setTimeout(() => res("timeout"), ms))
|
|
49
|
+
]);
|
|
50
|
+
}
|
|
45
51
|
var blogRolesReady = createDeferred();
|
|
46
52
|
var setRolesByPermaLink = (blogPosts) => {
|
|
47
53
|
blogRolesReady = createDeferred();
|
|
@@ -62,7 +68,7 @@ function pluginRoles(_context, options) {
|
|
|
62
68
|
return path.resolve(__dirname, "../src/theme");
|
|
63
69
|
},
|
|
64
70
|
async contentLoaded({ actions }) {
|
|
65
|
-
await blogRolesReady.promise;
|
|
71
|
+
await withTimeout(blogRolesReady.promise, 5e3);
|
|
66
72
|
actions.setGlobalData({
|
|
67
73
|
rolesByPermalink,
|
|
68
74
|
unauthorizedBehavior: options.unauthorizedBehavior ?? "notFound",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/options.ts"],"sourcesContent":["import path from \"path\";\nimport type { LoadContext, Plugin } from \"@docusaurus/types\";\nimport {\n getRoleRequirements,\n type RolesPluginOptions,\n type RoleEntry,\n} from \"./options\";\nimport { BlogPost, ProcessBlogPostsFn } from \"@docusaurus/plugin-content-blog\";\nimport {\n SidebarItemsGeneratorDoc,\n SidebarItemsGeneratorOption,\n} from \"@docusaurus/plugin-content-docs/src/sidebars/types.js\";\n\nexport { RolesPluginOptions } from \"./options\";\n\n/**\n * Used to apply FrontMatter required_roles and required_roles_mode to\n * sidebar_custom_props.required_roles and sidebar_custom_props.required_roles_mode.\n *\n * Should use protectDocSidebar for simple use cases.\n *\n * @param docs - The docs to transform.\n */\nexport const addDocSidebarCustomProps = (docs: SidebarItemsGeneratorDoc[]) => {\n for (const doc of docs) {\n const roles = doc.frontMatter.required_roles;\n if (!roles) continue;\n\n const props = (doc.frontMatter.sidebar_custom_props ??= {});\n props.required_roles = roles;\n props.required_roles_mode = doc.frontMatter.required_roles_mode;\n }\n};\n\n/**\n * Used to protect docs sidebar is a plug and play for sidebarItemsGenerator\n */\nexport const protectDocSidebar: SidebarItemsGeneratorOption = async ({\n defaultSidebarItemsGenerator,\n ...args\n}) => {\n addDocSidebarCustomProps(args.docs);\n\n return defaultSidebarItemsGenerator(args);\n};\n\nlet rolesByPermalink: RoleEntry[] = [];\n\nfunction createDeferred<T>() {\n let resolve!: (value: T) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nlet blogRolesReady = createDeferred<void>();\n\n/**\n * Used to set rolesByPermalink which is used by overriden BlogSidebar\n * to protect blog sidebar.\n */\nexport const setRolesByPermaLink = (blogPosts: BlogPost[]) => {\n blogRolesReady = createDeferred<void>();\n\n rolesByPermalink = blogPosts.map((bp) => ({\n permalink: bp.metadata.permalink,\n ...getRoleRequirements(bp.metadata.frontMatter),\n }));\n\n blogRolesReady.resolve();\n};\n\n/**\n * Used to protect blog sidebar is a plug and play for processBlogPosts.\n */\nexport const protectBlogSidebar: ProcessBlogPostsFn = async ({ blogPosts }) => {\n setRolesByPermaLink(blogPosts);\n return blogPosts;\n};\n\nexport default function pluginRoles(\n _context: LoadContext,\n options: RolesPluginOptions,\n): Plugin {\n return {\n name: \"docusaurus-roles-plugin\",\n\n getThemePath() {\n return path.resolve(__dirname, \"../src/theme\");\n },\n\n async contentLoaded({ actions }) {\n await blogRolesReady.promise;\n\n actions.setGlobalData({\n rolesByPermalink,\n unauthorizedBehavior: options.unauthorizedBehavior ?? \"notFound\",\n redirectTo: options.redirectTo ?? \"/access-denied\",\n });\n },\n };\n}\n","export type UnauthorizedBehavior = \"forbidden\" | \"redirect\";\n\nexport type RolesPluginOptions = {\n unauthorizedBehavior?: UnauthorizedBehavior;\n redirectTo?: string; // default '/access-denied'\n};\n\nexport type InternalRolesPluginOptions = {\n rolesByPermalink: RoleEntry[];\n} & RolesPluginOptions;\n\nexport type RolesMode = \"all\" | \"any\";\n\nexport type RoleRequirements = {\n requiredRoles: string[];\n requiredRolesMode: RolesMode;\n};\n\nexport type RoleFrontMatter = {\n required_roles?: string[];\n required_roles_mode?: RolesMode;\n};\n\nexport type RoleEntry = RoleRequirements & {\n permalink: string;\n};\n\nexport function getRoleFrontMatter(frontMatter: unknown): RoleFrontMatter {\n if (!frontMatter || typeof frontMatter !== \"object\") return {};\n return frontMatter as RoleFrontMatter;\n}\n\nexport function getRoleRequirements(frontMatter: unknown): RoleRequirements {\n const roleFrontMatter = getRoleFrontMatter(frontMatter);\n return {\n requiredRoles: roleFrontMatter.required_roles ?? [],\n requiredRolesMode: roleFrontMatter.required_roles_mode ?? \"all\",\n };\n}\n"],"mappings":";AAAA,OAAO,UAAU;;;AC2BV,SAAS,mBAAmB,aAAuC;AACxE,MAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU,QAAO,CAAC;AAC7D,SAAO;AACT;AAEO,SAAS,oBAAoB,aAAwC;AAC1E,QAAM,kBAAkB,mBAAmB,WAAW;AACtD,SAAO;AAAA,IACL,eAAe,gBAAgB,kBAAkB,CAAC;AAAA,IAClD,mBAAmB,gBAAgB,uBAAuB;AAAA,EAC5D;AACF;;;ADfO,IAAM,2BAA2B,CAAC,SAAqC;AAvB9E;AAwBE,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,IAAI,YAAY;AAC9B,QAAI,CAAC,MAAO;AAEZ,UAAM,SAAS,SAAI,aAAY,yBAAhB,GAAgB,uBAAyB,CAAC;AACzD,UAAM,iBAAiB;AACvB,UAAM,sBAAsB,IAAI,YAAY;AAAA,EAC9C;AACF;AAKO,IAAM,oBAAiD,OAAO;AAAA,EACnE;AAAA,EACA,GAAG;AACL,MAAM;AACJ,2BAAyB,KAAK,IAAI;AAElC,SAAO,6BAA6B,IAAI;AAC1C;AAEA,IAAI,mBAAgC,CAAC;AAErC,SAAS,iBAAoB;AAC3B,MAAI;AACJ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAW,CAAC,KAAK,QAAQ;AAC3C,cAAU;AACV,aAAS;AAAA,EACX,CAAC;AACD,SAAO,EAAE,SAAS,SAAS,OAAO;AACpC;AAEA,IAAI,iBAAiB,eAAqB;AAMnC,IAAM,sBAAsB,CAAC,cAA0B;AAC5D,mBAAiB,eAAqB;AAEtC,qBAAmB,UAAU,IAAI,CAAC,QAAQ;AAAA,IACxC,WAAW,GAAG,SAAS;AAAA,IACvB,GAAG,oBAAoB,GAAG,SAAS,WAAW;AAAA,EAChD,EAAE;AAEF,iBAAe,QAAQ;AACzB;AAKO,IAAM,qBAAyC,OAAO,EAAE,UAAU,MAAM;AAC7E,sBAAoB,SAAS;AAC7B,SAAO;AACT;AAEe,SAAR,YACL,UACA,SACQ;AACR,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,eAAe;AACb,aAAO,KAAK,QAAQ,WAAW,cAAc;AAAA,IAC/C;AAAA,IAEA,MAAM,cAAc,EAAE,QAAQ,GAAG;AAC/B,YAAM,eAAe;
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/options.ts"],"sourcesContent":["import path from \"path\";\nimport type { LoadContext, Plugin } from \"@docusaurus/types\";\nimport {\n getRoleRequirements,\n type RolesPluginOptions,\n type RoleEntry,\n} from \"./options\";\nimport { BlogPost, ProcessBlogPostsFn } from \"@docusaurus/plugin-content-blog\";\nimport {\n SidebarItemsGeneratorDoc,\n SidebarItemsGeneratorOption,\n} from \"@docusaurus/plugin-content-docs/src/sidebars/types.js\";\n\nexport { RolesPluginOptions } from \"./options\";\n\n/**\n * Used to apply FrontMatter required_roles and required_roles_mode to\n * sidebar_custom_props.required_roles and sidebar_custom_props.required_roles_mode.\n *\n * Should use protectDocSidebar for simple use cases.\n *\n * @param docs - The docs to transform.\n */\nexport const addDocSidebarCustomProps = (docs: SidebarItemsGeneratorDoc[]) => {\n for (const doc of docs) {\n const roles = doc.frontMatter.required_roles;\n if (!roles) continue;\n\n const props = (doc.frontMatter.sidebar_custom_props ??= {});\n props.required_roles = roles;\n props.required_roles_mode = doc.frontMatter.required_roles_mode;\n }\n};\n\n/**\n * Used to protect docs sidebar is a plug and play for sidebarItemsGenerator\n */\nexport const protectDocSidebar: SidebarItemsGeneratorOption = async ({\n defaultSidebarItemsGenerator,\n ...args\n}) => {\n addDocSidebarCustomProps(args.docs);\n\n return defaultSidebarItemsGenerator(args);\n};\n\nlet rolesByPermalink: RoleEntry[] = [];\n\nfunction createDeferred<T>() {\n let resolve!: (value: T) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nfunction withTimeout<T>(p: Promise<T>, ms: number): Promise<T | \"timeout\"> {\n return Promise.race([\n p,\n new Promise<\"timeout\">((res) => setTimeout(() => res(\"timeout\"), ms)),\n ]);\n}\n\nlet blogRolesReady = createDeferred<void>();\n\n/**\n * Used to set rolesByPermalink which is used by overriden BlogSidebar\n * to protect blog sidebar.\n */\nexport const setRolesByPermaLink = (blogPosts: BlogPost[]) => {\n blogRolesReady = createDeferred<void>();\n\n rolesByPermalink = blogPosts.map((bp) => ({\n permalink: bp.metadata.permalink,\n ...getRoleRequirements(bp.metadata.frontMatter),\n }));\n\n blogRolesReady.resolve();\n};\n\n/**\n * Used to protect blog sidebar is a plug and play for processBlogPosts.\n */\nexport const protectBlogSidebar: ProcessBlogPostsFn = async ({ blogPosts }) => {\n setRolesByPermaLink(blogPosts);\n return blogPosts;\n};\n\nexport default function pluginRoles(\n _context: LoadContext,\n options: RolesPluginOptions,\n): Plugin {\n return {\n name: \"docusaurus-roles-plugin\",\n\n getThemePath() {\n return path.resolve(__dirname, \"../src/theme\");\n },\n\n async contentLoaded({ actions }) {\n await withTimeout(blogRolesReady.promise, 5000);\n\n actions.setGlobalData({\n rolesByPermalink,\n unauthorizedBehavior: options.unauthorizedBehavior ?? \"notFound\",\n redirectTo: options.redirectTo ?? \"/access-denied\",\n });\n },\n };\n}\n","export type UnauthorizedBehavior = \"forbidden\" | \"redirect\";\n\nexport type RolesPluginOptions = {\n unauthorizedBehavior?: UnauthorizedBehavior;\n redirectTo?: string; // default '/access-denied'\n};\n\nexport type InternalRolesPluginOptions = {\n rolesByPermalink: RoleEntry[];\n} & RolesPluginOptions;\n\nexport type RolesMode = \"all\" | \"any\";\n\nexport type RoleRequirements = {\n requiredRoles: string[];\n requiredRolesMode: RolesMode;\n};\n\nexport type RoleFrontMatter = {\n required_roles?: string[];\n required_roles_mode?: RolesMode;\n};\n\nexport type RoleEntry = RoleRequirements & {\n permalink: string;\n};\n\nexport function getRoleFrontMatter(frontMatter: unknown): RoleFrontMatter {\n if (!frontMatter || typeof frontMatter !== \"object\") return {};\n return frontMatter as RoleFrontMatter;\n}\n\nexport function getRoleRequirements(frontMatter: unknown): RoleRequirements {\n const roleFrontMatter = getRoleFrontMatter(frontMatter);\n return {\n requiredRoles: roleFrontMatter.required_roles ?? [],\n requiredRolesMode: roleFrontMatter.required_roles_mode ?? \"all\",\n };\n}\n"],"mappings":";AAAA,OAAO,UAAU;;;AC2BV,SAAS,mBAAmB,aAAuC;AACxE,MAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU,QAAO,CAAC;AAC7D,SAAO;AACT;AAEO,SAAS,oBAAoB,aAAwC;AAC1E,QAAM,kBAAkB,mBAAmB,WAAW;AACtD,SAAO;AAAA,IACL,eAAe,gBAAgB,kBAAkB,CAAC;AAAA,IAClD,mBAAmB,gBAAgB,uBAAuB;AAAA,EAC5D;AACF;;;ADfO,IAAM,2BAA2B,CAAC,SAAqC;AAvB9E;AAwBE,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,IAAI,YAAY;AAC9B,QAAI,CAAC,MAAO;AAEZ,UAAM,SAAS,SAAI,aAAY,yBAAhB,GAAgB,uBAAyB,CAAC;AACzD,UAAM,iBAAiB;AACvB,UAAM,sBAAsB,IAAI,YAAY;AAAA,EAC9C;AACF;AAKO,IAAM,oBAAiD,OAAO;AAAA,EACnE;AAAA,EACA,GAAG;AACL,MAAM;AACJ,2BAAyB,KAAK,IAAI;AAElC,SAAO,6BAA6B,IAAI;AAC1C;AAEA,IAAI,mBAAgC,CAAC;AAErC,SAAS,iBAAoB;AAC3B,MAAI;AACJ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAW,CAAC,KAAK,QAAQ;AAC3C,cAAU;AACV,aAAS;AAAA,EACX,CAAC;AACD,SAAO,EAAE,SAAS,SAAS,OAAO;AACpC;AAEA,SAAS,YAAe,GAAe,IAAoC;AACzE,SAAO,QAAQ,KAAK;AAAA,IAClB;AAAA,IACA,IAAI,QAAmB,CAAC,QAAQ,WAAW,MAAM,IAAI,SAAS,GAAG,EAAE,CAAC;AAAA,EACtE,CAAC;AACH;AAEA,IAAI,iBAAiB,eAAqB;AAMnC,IAAM,sBAAsB,CAAC,cAA0B;AAC5D,mBAAiB,eAAqB;AAEtC,qBAAmB,UAAU,IAAI,CAAC,QAAQ;AAAA,IACxC,WAAW,GAAG,SAAS;AAAA,IACvB,GAAG,oBAAoB,GAAG,SAAS,WAAW;AAAA,EAChD,EAAE;AAEF,iBAAe,QAAQ;AACzB;AAKO,IAAM,qBAAyC,OAAO,EAAE,UAAU,MAAM;AAC7E,sBAAoB,SAAS;AAC7B,SAAO;AACT;AAEe,SAAR,YACL,UACA,SACQ;AACR,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,eAAe;AACb,aAAO,KAAK,QAAQ,WAAW,cAAc;AAAA,IAC/C;AAAA,IAEA,MAAM,cAAc,EAAE,QAAQ,GAAG;AAC/B,YAAM,YAAY,eAAe,SAAS,GAAI;AAE9C,cAAQ,cAAc;AAAA,QACpB;AAAA,QACA,sBAAsB,QAAQ,wBAAwB;AAAA,QACtD,YAAY,QAAQ,cAAc;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "docusaurus-roles-plugin",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.2",
|
|
4
4
|
"description": "Role-based gating for Docusaurus docs/blog via React context + front matter",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/NicholasMata/docusaurus-roles-plugin.git"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/NicholasMata/docusaurus-roles-plugin",
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/NicholasMata/docusaurus-roles-plugin/issues"
|
|
12
|
+
},
|
|
5
13
|
"license": "MIT",
|
|
6
14
|
"type": "module",
|
|
7
15
|
"main": "dist/index.cjs",
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { usePluginData } from "@docusaurus/useGlobalData";
|
|
2
2
|
import BlogSidebar, { type Props } from "@theme-init/BlogSidebar";
|
|
3
3
|
import { isAllowed, useRoles } from "docusaurus-roles-plugin/runtime";
|
|
4
|
-
import { type
|
|
4
|
+
import { type InternalRolesPluginOptions } from "../../options";
|
|
5
5
|
|
|
6
6
|
export default function BlogSidebarWrapper({ sidebar, ...props }: Props) {
|
|
7
|
-
const plugin = usePluginData(
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
const plugin = usePluginData(
|
|
8
|
+
"docusaurus-roles-plugin",
|
|
9
|
+
) as InternalRolesPluginOptions;
|
|
10
10
|
const { roles } = useRoles();
|
|
11
11
|
if (sidebar) {
|
|
12
12
|
sidebar.items = sidebar.items.filter((i) => {
|