@notur/sdk 1.4.5 → 1.4.7

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 (51) hide show
  1. package/README.md +136 -1
  2. package/bin/notur-create.js +586 -0
  3. package/bin/notur-doctor.js +123 -0
  4. package/bin/notur-pack.js +13 -7
  5. package/bin/notur-push.js +331 -0
  6. package/bin/notur-sync.js +199 -0
  7. package/bin/notur-validate.js +200 -0
  8. package/bin/notur.js +46 -0
  9. package/dist/events.d.ts +10 -0
  10. package/dist/events.d.ts.map +1 -1
  11. package/dist/events.js +7 -0
  12. package/dist/events.js.map +1 -1
  13. package/dist/hooks/useExtensionConfig.d.ts +23 -4
  14. package/dist/hooks/useExtensionConfig.d.ts.map +1 -1
  15. package/dist/hooks/useExtensionConfig.js +8 -1
  16. package/dist/hooks/useExtensionConfig.js.map +1 -1
  17. package/dist/hooks/useNavigate.d.ts +27 -6
  18. package/dist/hooks/useNavigate.d.ts.map +1 -1
  19. package/dist/hooks/useNavigate.js +11 -2
  20. package/dist/hooks/useNavigate.js.map +1 -1
  21. package/dist/hooks/useNoturEvent.d.ts +12 -0
  22. package/dist/hooks/useNoturEvent.d.ts.map +1 -1
  23. package/dist/hooks/useNoturEvent.js +12 -0
  24. package/dist/hooks/useNoturEvent.js.map +1 -1
  25. package/dist/hooks/usePermission.d.ts +10 -1
  26. package/dist/hooks/usePermission.d.ts.map +1 -1
  27. package/dist/hooks/usePermission.js +10 -1
  28. package/dist/hooks/usePermission.js.map +1 -1
  29. package/dist/hooks/useServerContext.d.ts +18 -3
  30. package/dist/hooks/useServerContext.d.ts.map +1 -1
  31. package/dist/hooks/useServerContext.js +8 -1
  32. package/dist/hooks/useServerContext.js.map +1 -1
  33. package/dist/hooks/useUserContext.d.ts +10 -2
  34. package/dist/hooks/useUserContext.d.ts.map +1 -1
  35. package/dist/hooks/useUserContext.js +2 -0
  36. package/dist/hooks/useUserContext.js.map +1 -1
  37. package/dist/index.d.ts +6 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/types.d.ts +179 -20
  41. package/dist/types.d.ts.map +1 -1
  42. package/dist/types.js +6 -1
  43. package/dist/types.js.map +1 -1
  44. package/examples/red-button/.env.example +2 -0
  45. package/examples/red-button/README.md +30 -0
  46. package/examples/red-button/extension.yaml +9 -0
  47. package/examples/red-button/package.json +29 -0
  48. package/examples/red-button/resources/frontend/src/index.tsx +32 -0
  49. package/examples/red-button/tsconfig.json +13 -0
  50. package/examples/red-button/webpack.config.js +17 -0
  51. package/package.json +11 -3
@@ -1,12 +1,20 @@
1
- interface UserContext {
1
+ /**
2
+ * Current Pterodactyl user metadata returned by `useUserContext()`.
3
+ */
4
+ export interface UserContext {
5
+ /** User UUID. */
2
6
  uuid: string;
7
+ /** Username shown in the panel. */
3
8
  username: string;
9
+ /** User email address. */
4
10
  email: string;
11
+ /** True when the user is a root/admin user. */
5
12
  isAdmin: boolean;
6
13
  }
7
14
  /**
8
15
  * Hook to access the current user context from the Pterodactyl panel.
16
+ *
17
+ * Returns `null` while loading or when the user cannot be resolved.
9
18
  */
10
19
  export declare function useUserContext(): UserContext | null;
11
- export {};
12
20
  //# sourceMappingURL=useUserContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useUserContext.d.ts","sourceRoot":"","sources":["../../src/hooks/useUserContext.ts"],"names":[],"mappings":"AAEA,UAAU,WAAW;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAiDnD"}
1
+ {"version":3,"file":"useUserContext.d.ts","sourceRoot":"","sources":["../../src/hooks/useUserContext.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAiDnD"}
@@ -1,6 +1,8 @@
1
1
  import { useState, useEffect } from 'react';
2
2
  /**
3
3
  * Hook to access the current user context from the Pterodactyl panel.
4
+ *
5
+ * Returns `null` while loading or when the user cannot be resolved.
4
6
  */
5
7
  export function useUserContext() {
6
8
  const [user, setUser] = useState(null);
@@ -1 +1 @@
1
- {"version":3,"file":"useUserContext.js","sourceRoot":"","sources":["../../src/hooks/useUserContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAS5C;;GAEG;AACH,MAAM,UAAU,cAAc;IAC1B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IAE3D,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,8CAA8C;QAC9C,MAAM,UAAU,GAAI,MAAc,CAAC,eAAe,CAAC;QACnD,IAAI,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,UAAU,CAAC,CAAC;YACpB,OAAO;QACX,CAAC;QAED,2BAA2B;QAC3B,KAAK,CAAC,qBAAqB,EAAE;YACzB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,WAAW,EAAE,aAAa;SAC7B,CAAC;aACG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACnB,IAAI,CAAC,IAAI,CAAC,EAAE;YACT,IAAI,SAAS;gBAAE,OAAO;YACtB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,OAAO,CAAC;oBACJ,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;oBAC1B,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ;oBAClC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK;oBAC5B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,KAAK;iBAC1C,CAAC,CAAC;YACP,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;;YACX,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAI,MAAc,CAAC,SAAS,CAAC;YACxC,IAAI,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;gBAC7B,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;oBAC1B,WAAW,EAAE,cAAc;oBAC3B,OAAO,EAAE,gCAAgC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,KAAI,MAAM,CAAC,GAAG,CAAC,EAAE;oBACtE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACjC,CAAC,CAAC;gBACH,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBACxC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;gBAC9E,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;QAEP,OAAO,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,IAAI,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"useUserContext.js","sourceRoot":"","sources":["../../src/hooks/useUserContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAgB5C;;;;GAIG;AACH,MAAM,UAAU,cAAc;IAC1B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IAE3D,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,8CAA8C;QAC9C,MAAM,UAAU,GAAI,MAAc,CAAC,eAAe,CAAC;QACnD,IAAI,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,UAAU,CAAC,CAAC;YACpB,OAAO;QACX,CAAC;QAED,2BAA2B;QAC3B,KAAK,CAAC,qBAAqB,EAAE;YACzB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,WAAW,EAAE,aAAa;SAC7B,CAAC;aACG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACnB,IAAI,CAAC,IAAI,CAAC,EAAE;YACT,IAAI,SAAS;gBAAE,OAAO;YACtB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,OAAO,CAAC;oBACJ,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;oBAC1B,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ;oBAClC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK;oBAC5B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,KAAK;iBAC1C,CAAC,CAAC;YACP,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;;YACX,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAI,MAAc,CAAC,SAAS,CAAC;YACxC,IAAI,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,WAAW,0CAAE,MAAM,EAAE,CAAC;gBAC7B,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;oBAC1B,WAAW,EAAE,cAAc;oBAC3B,OAAO,EAAE,gCAAgC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,KAAI,MAAM,CAAC,GAAG,CAAC,EAAE;oBACtE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACjC,CAAC,CAAC;gBACH,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBACxC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;gBAC9E,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;QAEP,OAAO,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,IAAI,CAAC;AAChB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,11 +1,16 @@
1
1
  export { createExtension } from './createExtension';
2
2
  export { getNoturApi } from './types';
3
- export type { ExtensionConfig, SlotConfig, RouteConfig, ExtensionDefinition, SimpleExtensionDefinition, NoturApi, SlotComponentProps, } from './types';
3
+ export type { ExtensionConfig, CssIsolationConfig, SlotId, RouteArea, SlotRenderContext, SlotRenderWhen, SlotRenderCondition, SlotConfig, RouteConfig, ExtensionDefinition, SimpleExtensionDefinition, SlotRegistration, RouteRegistration, NoturApi, SlotComponentProps, } from './types';
4
4
  export { useServerContext } from './hooks/useServerContext';
5
+ export type { ServerContext } from './hooks/useServerContext';
5
6
  export { useUserContext } from './hooks/useUserContext';
7
+ export type { UserContext } from './hooks/useUserContext';
6
8
  export { usePermission } from './hooks/usePermission';
7
9
  export { useExtensionConfig } from './hooks/useExtensionConfig';
10
+ export type { UseExtensionConfigOptions, ExtensionConfigState } from './hooks/useExtensionConfig';
8
11
  export { useNoturEvent, useEmitEvent } from './hooks/useNoturEvent';
9
12
  export { useNavigate } from './hooks/useNavigate';
13
+ export type { UseNavigateOptions, NavigateOptions, NavigateFunction } from './hooks/useNavigate';
10
14
  export { createScopedEventChannel } from './events';
15
+ export type { ScopedEventChannel } from './events';
11
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EACR,eAAe,EACf,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,yBAAyB,EACzB,QAAQ,EACR,kBAAkB,GACrB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EACR,eAAe,EACf,kBAAkB,EAClB,MAAM,EACN,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,kBAAkB,GACrB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,YAAY,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClG,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AACpD,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAUtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAkBtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,127 +1,272 @@
1
+ /**
2
+ * Known frontend slot IDs provided by the Notur bridge.
3
+ *
4
+ * Slot IDs are stable mount points patched into the Pterodactyl UI. Use these
5
+ * strings in `SlotConfig.slot` to render React components in a specific panel
6
+ * location.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * createExtension({
11
+ * id: 'acme/red-button',
12
+ * slots: [{ slot: 'server.header', component: RedButton }],
13
+ * });
14
+ * ```
15
+ */
16
+ export type SlotId = 'navbar' | 'navbar.left' | 'navbar.before' | 'navbar.after' | 'server.subnav' | 'server.subnav.before' | 'server.subnav.after' | 'server.header' | 'server.page' | 'server.footer' | 'server.terminal.buttons' | 'server.console.header' | 'server.console.info.before' | 'server.console.info.after' | 'server.console.sidebar' | 'server.console.command' | 'server.console.footer' | 'server.files.actions' | 'server.files.header' | 'server.files.footer' | 'server.files.dropdown' | 'server.files.edit.before' | 'server.files.edit.after' | 'server.databases.before' | 'server.databases.after' | 'server.schedules.before' | 'server.schedules.after' | 'server.schedules.edit.before' | 'server.schedules.edit.after' | 'server.users.before' | 'server.users.after' | 'server.backups.before' | 'server.backups.after' | 'server.backups.dropdown' | 'server.network.before' | 'server.network.after' | 'server.startup.before' | 'server.startup.after' | 'server.settings.before' | 'server.settings.after' | 'dashboard.header' | 'dashboard.widgets' | 'dashboard.serverlist.before' | 'dashboard.serverlist.after' | 'dashboard.serverrow.name.before' | 'dashboard.serverrow.name.after' | 'dashboard.serverrow.description.before' | 'dashboard.serverrow.description.after' | 'dashboard.serverrow.limits' | 'dashboard.footer' | 'dashboard.page' | 'account.header' | 'account.page' | 'account.footer' | 'account.subnav' | 'account.subnav.before' | 'account.subnav.after' | 'account.overview.before' | 'account.overview.after' | 'account.api.before' | 'account.api.after' | 'account.ssh.before' | 'account.ssh.after' | 'auth.container.before' | 'auth.container.after';
17
+ /**
18
+ * Panel route area for extension pages.
19
+ *
20
+ * Routes are scoped by area so pages are mounted in the correct Pterodactyl
21
+ * router surface and navigation context.
22
+ */
23
+ export type RouteArea = 'server' | 'dashboard' | 'account';
1
24
  /**
2
25
  * Extension identity configuration.
3
26
  *
4
- * Only `id` is required. `name` and `version` are auto-resolved from
5
- * the extension.yaml manifest if omitted.
27
+ * Only `id` is required for most extensions. `name` and `version` are normally
28
+ * resolved from `extension.yaml`, which is injected into the bridge runtime by
29
+ * the Notur PHP package.
6
30
  */
7
31
  export interface ExtensionConfig {
8
- /** Unique extension identifier in vendor/name format (e.g. "acme/analytics"). */
32
+ /** Unique extension identifier in vendor/name format, for example `acme/analytics`. */
9
33
  id: string;
10
- /** Human-readable name. Auto-resolved from extension.yaml if omitted. */
34
+ /** Human-readable display name. Omit this when it is present in `extension.yaml`. */
11
35
  name?: string;
12
- /** Semantic version string. Auto-resolved from extension.yaml if omitted. */
36
+ /** Semantic version string. Omit this when it is present in `extension.yaml`. */
13
37
  version?: string;
14
38
  }
39
+ /**
40
+ * CSS isolation options for components rendered by this extension.
41
+ *
42
+ * Root-class isolation wraps rendered slot/route components in a stable class so
43
+ * extension CSS can be scoped without Shadow DOM.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * createExtension({
48
+ * id: 'acme/theme-tools',
49
+ * cssIsolation: { mode: 'root-class', className: 'notur-ext--theme-tools' },
50
+ * });
51
+ * ```
52
+ */
15
53
  export interface CssIsolationConfig {
54
+ /** Isolation strategy. Currently only root class wrapping is supported. */
16
55
  mode: 'root-class';
56
+ /** Optional class name. If omitted, the bridge derives one from the extension id. */
17
57
  className?: string;
18
58
  }
59
+ /**
60
+ * Runtime context passed to `when` predicate functions for conditional slot rendering.
61
+ */
19
62
  export interface SlotRenderContext {
63
+ /** Current `window.location.pathname`, for example `/server/abc123`. */
20
64
  path: string;
65
+ /** High-level panel area inferred from the current path. */
21
66
  area: 'server' | 'dashboard' | 'account' | 'admin' | 'auth' | 'other';
67
+ /** True when the current URL is a server-scoped page. */
22
68
  isServer: boolean;
69
+ /** True when the current URL is the dashboard area. */
23
70
  isDashboard: boolean;
71
+ /** True when the current URL is an account page. */
24
72
  isAccount: boolean;
73
+ /** True when the current URL is an admin page. */
25
74
  isAdmin: boolean;
75
+ /** True when the current URL is an auth/login page. */
26
76
  isAuth: boolean;
77
+ /** Current server permission list when available, otherwise `null`. */
27
78
  permissions: string[] | null;
28
79
  }
80
+ /**
81
+ * Declarative conditions that decide whether a slot registration should render.
82
+ *
83
+ * All provided conditions must match. Use this to keep a component limited to
84
+ * specific panel areas, paths, or permissions.
85
+ *
86
+ * @example
87
+ * ```ts
88
+ * { slot: 'server.header', component: Button, when: { server: true } }
89
+ * { slot: 'server.files.actions', component: Tool, when: { pathIncludes: '/files' } }
90
+ * ```
91
+ */
29
92
  export interface SlotRenderWhen {
93
+ /** Render only in one panel area. */
30
94
  area?: SlotRenderContext['area'];
95
+ /** Render only in one of several panel areas. */
31
96
  areas?: Array<SlotRenderContext['area']>;
97
+ /** Alias for `pathStartsWith`; render when the current path starts with this value. */
32
98
  path?: string | string[];
99
+ /** Render when the current path starts with one of these prefixes. */
33
100
  pathStartsWith?: string | string[];
101
+ /** Render when the current path contains one of these fragments. */
34
102
  pathIncludes?: string | string[];
103
+ /** Render when the current path matches this regular expression. */
35
104
  pathMatches?: string | RegExp;
105
+ /** Require one of these server permissions. `*` grants access. */
36
106
  permission?: string | string[];
107
+ /** Render only when `context.isServer` equals this value. */
37
108
  server?: boolean;
109
+ /** Render only when `context.isDashboard` equals this value. */
38
110
  dashboard?: boolean;
111
+ /** Render only when `context.isAccount` equals this value. */
39
112
  account?: boolean;
113
+ /** Render only when `context.isAdmin` equals this value. */
40
114
  admin?: boolean;
115
+ /** Render only when `context.isAuth` equals this value. */
41
116
  auth?: boolean;
42
117
  }
118
+ /**
119
+ * Conditional render rule for a slot registration.
120
+ *
121
+ * - `false` disables rendering.
122
+ * - an object uses declarative path/area/permission checks.
123
+ * - a function receives `SlotRenderContext` for custom logic.
124
+ */
43
125
  export type SlotRenderCondition = boolean | SlotRenderWhen | ((context: SlotRenderContext) => boolean);
126
+ /**
127
+ * Register a React component into a Notur frontend slot.
128
+ */
44
129
  export interface SlotConfig {
45
- slot: string;
130
+ /** Slot mount point. Known values autocomplete through `SlotId`; custom strings are accepted for forward compatibility. */
131
+ slot: SlotId | (string & {});
132
+ /** React component rendered into the slot. Receives at least `{ extensionId }` plus any `props`. */
46
133
  component: React.ComponentType<any>;
134
+ /** Sort order within the same priority. Lower values render first. Defaults to `0`. */
47
135
  order?: number;
136
+ /** Priority across registrations. Higher values render before lower values. Defaults to `0`. */
48
137
  priority?: number;
138
+ /** Optional label used by navigation-style slots such as `server.subnav`. */
49
139
  label?: string;
140
+ /** Optional icon name used by navigation-style slots when the bridge supports icons. */
50
141
  icon?: string;
142
+ /** Server permission required to render this slot. Checked against current server permissions when available. */
51
143
  permission?: string;
144
+ /** Static props merged into the component props every time it renders. */
52
145
  props?: Record<string, any>;
146
+ /** Optional condition controlling whether the component renders for the current page/context. */
53
147
  when?: SlotRenderCondition;
54
148
  }
149
+ /**
150
+ * Register a full React page inside a Notur route area.
151
+ *
152
+ * Route paths are extension-local. A server route with `path: '/analytics'` is
153
+ * mounted under the extension namespace rather than replacing Pterodactyl's
154
+ * built-in routes.
155
+ */
55
156
  export interface RouteConfig {
56
- area: 'server' | 'dashboard' | 'account';
157
+ /** Panel area where the route belongs. */
158
+ area: RouteArea;
159
+ /** Extension-local path. Must start with `/`, for example `/analytics`. */
57
160
  path: string;
161
+ /** Display name used by navigation/debug tooling. */
58
162
  name: string;
163
+ /** React page component rendered for this route. */
59
164
  component: React.ComponentType<any>;
165
+ /** Optional icon name for navigation entries. */
60
166
  icon?: string;
167
+ /** Optional permission required before showing or using the route. */
61
168
  permission?: string;
62
169
  }
63
170
  /**
64
171
  * Full extension definition passed to `createExtension()`.
65
172
  *
173
+ * Most new extensions should use the simpler top-level `id` form instead.
174
+ *
66
175
  * @example
67
176
  * ```ts
68
177
  * createExtension({
69
- * config: { id: 'acme/analytics' },
70
- * slots: [{ slot: 'dashboard.widgets', component: Widget }],
178
+ * config: { id: 'acme/analytics' },
179
+ * slots: [{ slot: 'dashboard.widgets', component: Widget }],
71
180
  * });
72
181
  * ```
73
182
  */
74
183
  export interface ExtensionDefinition {
184
+ /** Extension identity. `id` must match `extension.yaml`. */
75
185
  config: ExtensionConfig;
186
+ /** Components to render into existing Pterodactyl UI slots. */
76
187
  slots?: SlotConfig[];
188
+ /** Full extension pages to register in supported panel areas. */
77
189
  routes?: RouteConfig[];
190
+ /** Enable or configure root-class CSS isolation for this extension. */
78
191
  cssIsolation?: CssIsolationConfig | boolean;
192
+ /** Called after registration succeeds. Keep this lightweight. */
79
193
  onInit?: () => void;
194
+ /** Called when the bridge unregisters this extension. Use it for cleanup. */
80
195
  onDestroy?: () => void;
81
196
  }
82
197
  /**
83
198
  * Simplified extension definition with `id` at the top level.
84
199
  *
85
- * Name and version are auto-resolved from the extension.yaml manifest.
86
- * This is the recommended format for most extensions.
200
+ * Name and version are auto-resolved from `extension.yaml`. This is the
201
+ * recommended format for most extensions.
87
202
  *
88
203
  * @example
89
204
  * ```ts
90
205
  * createExtension({
91
- * id: 'acme/analytics',
92
- * slots: [{ slot: 'dashboard.widgets', component: Widget }],
206
+ * id: 'acme/analytics',
207
+ * slots: [{ slot: 'dashboard.widgets', component: Widget }],
93
208
  * });
94
209
  * ```
95
210
  */
96
211
  export type SimpleExtensionDefinition = Omit<ExtensionDefinition, 'config'> & {
97
- /** Unique extension identifier in vendor/name format (e.g. "acme/analytics"). */
212
+ /** Unique extension identifier in vendor/name format, for example `acme/analytics`. */
98
213
  id: string;
99
214
  };
215
+ /** Internal registration shape stored by the bridge registry after a slot is registered. */
100
216
  export interface SlotRegistration {
217
+ /** Extension that owns this registration. */
101
218
  extensionId: string;
102
- slot: string;
219
+ /** Slot mount point. */
220
+ slot: SlotId | (string & {});
221
+ /** Component rendered by the bridge. */
103
222
  component: React.ComponentType<any>;
223
+ /** Sort order within priority. */
104
224
  order?: number;
225
+ /** Higher priority renders earlier. */
105
226
  priority?: number;
227
+ /** Navigation label for nav slots. */
106
228
  label?: string;
229
+ /** Navigation icon for nav slots. */
107
230
  icon?: string;
231
+ /** Required permission, if any. */
108
232
  permission?: string;
233
+ /** CSS isolation wrapper class resolved by the bridge. */
109
234
  scopeClass?: string;
235
+ /** Static props passed into the component. */
110
236
  props?: Record<string, any>;
237
+ /** Conditional render rule. */
111
238
  when?: SlotRenderCondition;
112
239
  }
240
+ /** Internal registration shape stored by the bridge registry after a route is registered. */
113
241
  export interface RouteRegistration {
242
+ /** Extension that owns this route. */
114
243
  extensionId: string;
115
- area: 'server' | 'dashboard' | 'account';
244
+ /** Panel area where the route belongs. */
245
+ area: RouteArea;
246
+ /** Extension-local route path. */
116
247
  path: string;
248
+ /** Display name. */
117
249
  name: string;
250
+ /** Route page component. */
118
251
  component: React.ComponentType<any>;
252
+ /** Optional navigation icon. */
119
253
  icon?: string;
254
+ /** Optional permission requirement. */
120
255
  permission?: string;
256
+ /** CSS isolation wrapper class resolved by the bridge. */
121
257
  scopeClass?: string;
122
258
  }
259
+ /**
260
+ * Low-level Notur bridge API exposed on `window.__NOTUR__`.
261
+ *
262
+ * Most extensions should use `createExtension()` and hooks instead of calling
263
+ * this directly. It is exported as an escape hatch for advanced integrations and
264
+ * debugging tools.
265
+ */
123
266
  export interface NoturApi {
267
+ /** Notur bridge/runtime version. */
124
268
  version: string;
269
+ /** Runtime registry for slots, routes, themes, lifecycle callbacks, and events. */
125
270
  registry: {
126
271
  registerSlot: (registration: Omit<SlotRegistration, 'extensionId'> & {
127
272
  extensionId?: string;
@@ -149,6 +294,7 @@ export interface NoturApi {
149
294
  emitEvent: (event: string, data?: unknown) => void;
150
295
  onEvent: (event: string, callback: (data?: unknown) => void) => () => void;
151
296
  };
297
+ /** Bridge-provided hooks for advanced consumers. Prefer direct SDK hook exports. */
152
298
  hooks: {
153
299
  useSlot: (slotId: string) => SlotRegistration[];
154
300
  useExtensionApi: (options: {
@@ -168,8 +314,11 @@ export interface NoturApi {
168
314
  useExtensionState: <T extends Record<string, any>>(extensionId: string, initialState: T) => [T, (partial: Partial<T>) => void, () => void];
169
315
  useNoturTheme: () => Record<string, string>;
170
316
  };
317
+ /** Bridge slot constants. */
171
318
  SLOT_IDS: Record<string, string>;
319
+ /** Unregister an extension by id. Mostly useful for development tooling. */
172
320
  unregisterExtension: (id: string) => void;
321
+ /** Enabled extension metadata injected by the PHP runtime. */
173
322
  extensions?: Array<{
174
323
  id: string;
175
324
  name?: string;
@@ -181,19 +330,29 @@ export interface NoturApi {
181
330
  }
182
331
  /**
183
332
  * Base props received by components registered in Notur slots.
184
- * Extension developers can use this to type their slot components:
333
+ *
334
+ * Extend this interface for your own static props:
185
335
  *
186
336
  * ```tsx
187
- * import { SlotComponentProps } from '@notur/sdk';
188
- * const MyWidget: React.FC<SlotComponentProps> = ({ extensionId }) => { ... };
337
+ * import type { SlotComponentProps } from '@notur/sdk';
338
+ *
339
+ * type Props = SlotComponentProps & { label: string };
340
+ * const MyWidget: React.FC<Props> = ({ extensionId, label }) => <button>{label}</button>;
189
341
  * ```
190
342
  */
191
343
  export interface SlotComponentProps {
344
+ /** Owning extension id, for example `acme/red-button`. */
192
345
  extensionId: string;
346
+ /** Additional props supplied by `SlotConfig.props` or the bridge. */
193
347
  [key: string]: any;
194
348
  }
195
349
  /**
196
- * Get the Notur API from the window global.
350
+ * Get the Notur API from the browser global.
351
+ *
352
+ * This is an advanced escape hatch. Use `createExtension()` and exported hooks
353
+ * for normal extension development.
354
+ *
355
+ * @throws If the Notur bridge runtime has not loaded yet.
197
356
  */
198
357
  export declare function getNoturApi(): NoturApi;
199
358
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -1,5 +1,10 @@
1
1
  /**
2
- * Get the Notur API from the window global.
2
+ * Get the Notur API from the browser global.
3
+ *
4
+ * This is an advanced escape hatch. Use `createExtension()` and exported hooks
5
+ * for normal extension development.
6
+ *
7
+ * @throws If the Notur bridge runtime has not loaded yet.
3
8
  */
4
9
  export function getNoturApi() {
5
10
  const api = window.__NOTUR__;
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA4LA;;GAEG;AACH,MAAM,UAAU,WAAW;IACvB,MAAM,GAAG,GAAI,MAAc,CAAC,SAAS,CAAC;IACtC,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAyZA;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW;IACvB,MAAM,GAAG,GAAI,MAAc,CAAC,SAAS,CAAC;IACtC,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ NOTUR_HOST=https://panel.example.com
2
+ NOTUR_PUSH_KEY=notur_xxx
@@ -0,0 +1,30 @@
1
+ # Red Button Example
2
+
3
+ A minimal Notur frontend extension that renders a red button in the server header.
4
+
5
+ ## Local Build
6
+
7
+ ```bash
8
+ npm install
9
+ npm run build
10
+ ```
11
+
12
+ ## Package
13
+
14
+ ```bash
15
+ npx notur-pack
16
+ ```
17
+
18
+ ## Push To A Remote Panel
19
+
20
+ Create `.env` from `.env.example`, then run:
21
+
22
+ ```bash
23
+ npm run push
24
+ ```
25
+
26
+ The remote panel must have Notur remote push enabled:
27
+
28
+ ```bash
29
+ php artisan notur:remote-key
30
+ ```
@@ -0,0 +1,9 @@
1
+ notur: "1.0"
2
+ id: "acme/red-button"
3
+ name: "Red Button"
4
+ version: "1.0.0"
5
+ description: "Adds a red button to the server header"
6
+ license: "MIT"
7
+
8
+ frontend:
9
+ bundle: "resources/frontend/dist/extension.js"
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "acme-red-button",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "build": "webpack-cli --mode production --config webpack.config.js",
7
+ "dev": "webpack-cli --mode development --watch --config webpack.config.js",
8
+ "pack": "notur-pack",
9
+ "push": "notur-push",
10
+ "sync": "notur-sync",
11
+ "validate": "notur-validate",
12
+ "doctor": "notur-doctor"
13
+ },
14
+ "peerDependencies": {
15
+ "react": "^16.14.0",
16
+ "react-dom": "^16.14.0"
17
+ },
18
+ "devDependencies": {
19
+ "@notur/sdk": "^1.4.7",
20
+ "@types/react": "^16.14.0",
21
+ "@types/react-dom": "^16.9.0",
22
+ "react": "^16.14.0",
23
+ "react-dom": "^16.14.0",
24
+ "ts-loader": "^9.5.0",
25
+ "typescript": "^5.3.0",
26
+ "webpack": "^5.90.0",
27
+ "webpack-cli": "^6.0.0"
28
+ }
29
+ }
@@ -0,0 +1,32 @@
1
+ import * as React from 'react';
2
+ import { createExtension } from '@notur/sdk';
3
+
4
+ const RedButton: React.FC = () => {
5
+ return (
6
+ <button
7
+ style={{
8
+ background: '#dc2626',
9
+ color: '#fff',
10
+ border: 0,
11
+ borderRadius: '6px',
12
+ padding: '8px 12px',
13
+ fontWeight: 600,
14
+ cursor: 'pointer',
15
+ }}
16
+ onClick={() => alert('Hello from Notur')}
17
+ >
18
+ Red Button
19
+ </button>
20
+ );
21
+ };
22
+
23
+ createExtension({
24
+ id: 'acme/red-button',
25
+ slots: [
26
+ {
27
+ slot: 'server.header',
28
+ component: RedButton,
29
+ order: 10,
30
+ },
31
+ ],
32
+ });
@@ -0,0 +1,13 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2019",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Node",
6
+ "jsx": "react",
7
+ "strict": true,
8
+ "esModuleInterop": true,
9
+ "skipLibCheck": true,
10
+ "forceConsistentCasingInFileNames": true
11
+ },
12
+ "include": ["resources/frontend/src/**/*"]
13
+ }
@@ -0,0 +1,17 @@
1
+ const path = require('path');
2
+ const base = require('@notur/sdk/webpack.extension.config');
3
+
4
+ module.exports = {
5
+ ...base,
6
+ entry: './resources/frontend/src/index.tsx',
7
+ output: {
8
+ ...base.output,
9
+ filename: 'extension.js',
10
+ path: path.resolve(__dirname, 'resources/frontend/dist'),
11
+ library: {
12
+ ...base.output.library,
13
+ name: '__NOTUR_EXT_AcmeRedButton__',
14
+ type: 'umd',
15
+ },
16
+ },
17
+ };