@notur/sdk 1.1.4 → 1.2.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.
package/README.md CHANGED
@@ -1,20 +1,17 @@
1
1
  # @notur/sdk
2
2
 
3
- Notur Extension Developer SDK. This package provides the runtime helpers and React hooks needed to register Notur extensions, define UI slots and routes, and interact with the Notur bridge at runtime.
3
+ Notur Extension Developer SDK for [Pterodactyl Panel v1](https://github.com/pterodactyl/panel). Provides the runtime API, React hooks, CLI tools, webpack config, and starter templates for building Notur extensions.
4
4
 
5
5
  ## Install
6
6
 
7
7
  ```bash
8
- # Using npm, yarn, pnpm, or bun
9
8
  npm install @notur/sdk
10
9
  # or: yarn add @notur/sdk
11
10
  # or: pnpm add @notur/sdk
12
11
  # or: bun add @notur/sdk
13
12
  ```
14
13
 
15
- Peer dependencies:
16
- - `react` `^16.14.0`
17
- - `react-dom` `^16.14.0`
14
+ Peer dependencies: `react ^16.14.0`, `react-dom ^16.14.0`
18
15
 
19
16
  ## Quick Start
20
17
 
@@ -24,7 +21,7 @@ import AnalyticsWidget from './components/AnalyticsWidget';
24
21
  import AnalyticsPage from './pages/AnalyticsPage';
25
22
 
26
23
  createExtension({
27
- config: { id: 'acme/analytics', name: 'Analytics', version: '1.0.0' },
24
+ id: 'acme/analytics',
28
25
  slots: [
29
26
  { slot: 'dashboard.widgets', component: AnalyticsWidget, order: 10 },
30
27
  ],
@@ -34,104 +31,238 @@ createExtension({
34
31
  });
35
32
  ```
36
33
 
37
- Notes:
38
- - The Notur bridge must be loaded before your bundle. The SDK reads the bridge from `window.__NOTUR__`.
39
- - Extension IDs should be stable and unique (e.g., `vendor/name`).
34
+ Name and version are auto-resolved from `extension.yaml`. The full `config: { id, name, version }` syntax is still supported for backward compatibility.
35
+
36
+ ---
40
37
 
41
38
  ## API
42
39
 
43
40
  ### `createExtension(definition)`
44
41
 
45
- Registers the extension with Notur, wires routes and slots, and runs optional lifecycle hooks.
42
+ Registers the extension with the Notur bridge, wiring slots, routes, and lifecycle hooks.
43
+
44
+ Two calling conventions:
45
+
46
+ ```ts
47
+ // Simplified (recommended) — name/version auto-resolved from extension.yaml:
48
+ createExtension({ id: 'acme/analytics', slots: [...], routes: [...] });
49
+
50
+ // Full (backward compatible):
51
+ createExtension({ config: { id: 'acme/analytics' }, slots: [...], routes: [...] });
52
+ ```
53
+
54
+ **Definition fields:**
46
55
 
47
- Definition fields:
48
- - `config`: `{ id, name, version }`
49
- - `slots`: UI slot registrations (`slot`, `component`, `order`, `when`, etc.)
50
- - `routes`: Panel routes (`area`, `path`, `name`, `component`, `permission`, etc.)
51
- - `cssIsolation`: `true` or `{ mode: 'root-class', className?: string }`
52
- - `onInit`: Called after registration.
53
- - `onDestroy`: Called when the extension is unloaded.
56
+ | Field | Type | Description |
57
+ |-------|------|-------------|
58
+ | `id` | `string` | Extension ID (simplified form) |
59
+ | `config` | `{ id, name?, version? }` | Extension identity (full form) |
60
+ | `slots` | `SlotConfig[]` | UI slot registrations |
61
+ | `routes` | `RouteConfig[]` | Panel route registrations |
62
+ | `cssIsolation` | `boolean \| CssIsolationConfig` | CSS isolation (`true` for defaults, or `{ mode: 'root-class', className? }`) |
63
+ | `onInit` | `() => void` | Called after registration |
64
+ | `onDestroy` | `() => void` | Called when the extension is unloaded |
54
65
 
55
66
  ### Hooks
56
67
 
57
68
  All hooks are exported from `@notur/sdk`.
58
69
 
59
- - `useServerContext()`: Returns server context or `null` when not on a server page.
60
- - `useUserContext()`: Returns user info or `null` while loading.
61
- - `usePermission(permission)`: Checks for a specific extension permission.
62
- - `useExtensionConfig(extensionId, options)`: Loads public settings for the extension.
63
- - `options`: `{ baseUrl?, initial?, pollInterval? }`
64
- - `useNoturEvent(event, handler)`: Subscribe to inter-extension events.
65
- - `useEmitEvent()`: Returns a function to emit inter-extension events.
66
- - `useNavigate({ extensionId })`: Navigate inside your extension namespace.
70
+ | Hook | Description |
71
+ |------|-------------|
72
+ | `useServerContext()` | Returns server context or `null` when not on a server page |
73
+ | `useUserContext()` | Returns user info or `null` while loading |
74
+ | `usePermission(permission)` | Checks a specific extension permission |
75
+ | `useExtensionConfig(extensionId, options?)` | Loads public settings (`options: { baseUrl?, initial?, pollInterval? }`) |
76
+ | `useNoturEvent(event, handler)` | Subscribe to inter-extension events |
77
+ | `useEmitEvent()` | Returns a function to emit inter-extension events |
78
+ | `useNavigate({ extensionId })` | Navigate inside your extension namespace |
79
+
80
+ ### TypeScript Types
81
+
82
+ ```ts
83
+ import type {
84
+ ExtensionConfig,
85
+ ExtensionDefinition,
86
+ SimpleExtensionDefinition,
87
+ SlotConfig,
88
+ RouteConfig,
89
+ NoturApi,
90
+ } from '@notur/sdk';
91
+ ```
92
+
93
+ ---
94
+
95
+ ## CLI Tools
96
+
97
+ The SDK ships two CLI tools, available via `npx`, `yarn dlx`, `pnpm dlx`, or `bunx`.
67
98
 
68
- ## Packaging Your Extension
99
+ ### `notur-pack` Package extensions
69
100
 
70
- The SDK includes a CLI tool to package your extension into a `.notur` archive that can be uploaded to the Pterodactyl admin panel.
101
+ Creates a `.notur` archive (tar.gz) from your extension directory, ready to upload to the Pterodactyl admin panel.
71
102
 
72
103
  ```bash
73
- # From your extension directory (using npx, yarn dlx, pnpm dlx, or bunx)
104
+ # Pack current directory
74
105
  npx notur-pack
75
106
 
76
- # Specify a different path
107
+ # Pack a specific path
77
108
  npx notur-pack /path/to/my-extension
78
109
 
79
110
  # Custom output filename
80
111
  npx notur-pack --output my-extension.notur
112
+ npx notur-pack -o my-extension.notur
81
113
  ```
82
114
 
83
- This creates a `.notur` file (tar.gz archive) containing:
84
- - All extension files (excluding `node_modules`, `.git`, `vendor`, `.idea`, `.vscode`)
85
- - A `checksums.json` with SHA-256 hashes for integrity verification
115
+ The archive includes all extension files (excluding `node_modules`, `.git`, `vendor`, `.idea`, `.vscode`, `.DS_Store`) plus a generated `checksums.json` with SHA-256 hashes for integrity verification.
86
116
 
87
- Upload the resulting `.notur` file to your Pterodactyl admin panel at `/admin/notur/extensions`.
117
+ Output:
118
+ - `vendor-name-1.0.0.notur` — the extension archive
119
+ - `vendor-name-1.0.0.notur.sha256` — SHA-256 checksum file
88
120
 
89
- ## Signing Extensions
121
+ Upload the `.notur` file at `/admin/notur/extensions` in your panel.
90
122
 
91
- The SDK provides tools for Ed25519 signing of extension archives, compatible with the PHP `notur:keygen` and `notur:export --sign` commands.
123
+ #### Signing archives
92
124
 
93
- ### Generating a Keypair
125
+ Sign your archive with Ed25519 for panels that have `require_signatures` enabled. Compatible with the PHP `notur:keygen` / `notur:export --sign` commands.
94
126
 
95
127
  ```bash
96
- npx notur-keygen
128
+ # Sign using environment variable
129
+ NOTUR_SECRET_KEY=<your_secret_key> npx notur-pack --sign
130
+
131
+ # Sign using flag
132
+ npx notur-pack --sign --secret-key <your_secret_key>
97
133
  ```
98
134
 
99
- This generates a new Ed25519 keypair and outputs:
100
- - **Public Key** (64 hex characters) -- Share with panel administrators
101
- - **Secret Key** (128 hex characters) -- Keep private, used for signing
135
+ This additionally produces:
136
+ - `vendor-name-1.0.0.notur.sig` Ed25519 signature (hex-encoded)
102
137
 
103
- ### Signing an Archive
138
+ The `.sig` format is compatible with PHP's `SignatureVerifier::verify()`.
104
139
 
105
- ```bash
106
- # Using environment variable
107
- NOTUR_SECRET_KEY=your_secret_key npx notur-pack --sign
140
+ ### `notur-keygen` — Generate signing keypair
141
+
142
+ Generates a new Ed25519 keypair for extension signing.
108
143
 
109
- # Or with --secret-key flag
110
- npx notur-pack --sign --secret-key your_secret_key
144
+ ```bash
145
+ npx notur-keygen
111
146
  ```
112
147
 
113
- This produces three files:
114
- - `vendor-name-1.0.0.notur` -- The extension archive
115
- - `vendor-name-1.0.0.notur.sha256` -- SHA-256 checksum
116
- - `vendor-name-1.0.0.notur.sig` -- Ed25519 signature (hex-encoded)
148
+ Output:
149
+ - **Public Key** (64 hex chars) — add to your panel config as `NOTUR_PUBLIC_KEY`
150
+ - **Secret Key** (128 hex chars) — keep private, use with `notur-pack --sign`
117
151
 
118
- The `.sig` file format is compatible with PHP's `SignatureVerifier::verify()` and panels with `require_signatures` enabled.
152
+ The output format matches the PHP `php artisan notur:keygen` command.
119
153
 
120
- ## Build
154
+ ---
121
155
 
122
- ```bash
123
- # Using npm, yarn, pnpm, or bun
124
- npm run build
156
+ ## Webpack Config
157
+
158
+ The SDK includes a base webpack configuration that extension developers can import and extend. This handles TypeScript compilation, CSS loading, React externalization, and UMD output format.
159
+
160
+ ```js
161
+ // webpack.config.js
162
+ const base = require('@notur/sdk/webpack.extension.config');
163
+
164
+ module.exports = {
165
+ ...base,
166
+ entry: './resources/frontend/src/index.tsx',
167
+ output: {
168
+ ...base.output,
169
+ filename: 'extension.js',
170
+ path: require('path').resolve(__dirname, 'resources/frontend/dist'),
171
+ },
172
+ };
125
173
  ```
126
174
 
127
- Outputs are written to `dist/`.
175
+ **What the base config provides:**
176
+
177
+ | Setting | Value |
178
+ |---------|-------|
179
+ | Entry | `./src/index.ts` |
180
+ | Output | `dist/bundle.js` (UMD) |
181
+ | Resolve | `.ts`, `.tsx`, `.js`, `.jsx` |
182
+ | Loaders | `ts-loader` for TypeScript, `style-loader`/`css-loader` for CSS |
183
+ | Externals | `react` → `React`, `react-dom` → `ReactDOM`, `@notur/sdk` → `__NOTUR__` |
184
+
185
+ Override `entry` and `output` to match your extension's directory structure.
186
+
187
+ ---
128
188
 
129
189
  ## Templates
130
190
 
131
- The SDK package ships a few templates in `templates/`:
132
- - `extension.yaml.template` for extension manifests
133
- - `ServiceProvider.php.template` for backend registration
134
- - `ExampleComponent.tsx.template` for a starter UI component
191
+ The SDK ships starter templates in `templates/`, used by the PHP `notur:new` scaffolding command. They can also serve as reference when creating extensions manually.
192
+
193
+ ### `extension.yaml.template`
194
+
195
+ Minimal extension manifest with placeholders:
196
+
197
+ ```yaml
198
+ notur: "1.0"
199
+ id: "{{vendor}}/{{name}}"
200
+ name: "{{displayName}}"
201
+ version: "1.0.0"
202
+ description: "{{description}}"
203
+ authors:
204
+ - name: "{{authorName}}"
205
+ license: "MIT"
206
+
207
+ requires:
208
+ notur: "^1.0"
209
+ pterodactyl: "^1.11"
210
+ php: "^8.2"
211
+ ```
212
+
213
+ ### `ServiceProvider.php.template`
214
+
215
+ PHP entrypoint using the `NoturExtension` base class. Metadata (`getId()`, `getName()`, `getVersion()`, `getBasePath()`) is auto-resolved from `extension.yaml` — no boilerplate needed:
216
+
217
+ ```php
218
+ namespace {{namespace}};
219
+
220
+ use Notur\Support\NoturExtension;
221
+ use Notur\Contracts\HasRoutes;
222
+
223
+ class {{className}} extends NoturExtension implements HasRoutes
224
+ {
225
+ public function register(): void { }
226
+ public function boot(): void { }
227
+
228
+ public function getRouteFiles(): array
229
+ {
230
+ return ['api-client' => 'src/routes/api-client.php'];
231
+ }
232
+ }
233
+ ```
234
+
235
+ ### `ExampleComponent.tsx.template`
236
+
237
+ Starter React component with `createExtension()` registration using the simplified syntax:
238
+
239
+ ```tsx
240
+ import * as React from 'react';
241
+ import { createExtension } from '@notur/sdk';
242
+
243
+ const ExampleWidget: React.FC<{ extensionId: string }> = ({ extensionId }) => {
244
+ return (
245
+ <div style={{ padding: '1rem', background: 'var(--notur-bg-secondary)' }}>
246
+ <h3>{{displayName}}</h3>
247
+ <p>Hello from {{vendor}}/{{name}}!</p>
248
+ </div>
249
+ );
250
+ };
251
+
252
+ createExtension({
253
+ id: '{{vendor}}/{{name}}',
254
+ slots: [{ slot: 'dashboard.widgets', component: ExampleWidget, order: 100 }],
255
+ });
256
+ ```
257
+
258
+ ---
259
+
260
+ ## Build
261
+
262
+ ```bash
263
+ npm run build # Compiles TypeScript to dist/
264
+ npm run dev # Watch mode
265
+ ```
135
266
 
136
267
  ## License
137
268
 
File without changes
package/bin/notur-pack.js CHANGED
@@ -18,7 +18,7 @@
18
18
  const fs = require('fs');
19
19
  const path = require('path');
20
20
  const crypto = require('crypto');
21
- const { execSync } = require('child_process');
21
+ const { spawnSync } = require('child_process');
22
22
  const yaml = require('yaml');
23
23
 
24
24
  const EXCLUDE_PATTERNS = [
@@ -38,6 +38,7 @@ function parseArgs() {
38
38
  output: null,
39
39
  sign: false,
40
40
  secretKey: null,
41
+ dryRun: false,
41
42
  };
42
43
 
43
44
  for (let i = 0; i < args.length; i++) {
@@ -47,6 +48,8 @@ function parseArgs() {
47
48
  options.sign = true;
48
49
  } else if (args[i] === '--secret-key') {
49
50
  options.secretKey = args[++i];
51
+ } else if (args[i] === '--dry-run') {
52
+ options.dryRun = true;
50
53
  } else if (!args[i].startsWith('-')) {
51
54
  options.path = args[i];
52
55
  }
@@ -55,6 +58,20 @@ function parseArgs() {
55
58
  return options;
56
59
  }
57
60
 
61
+ function isGnuTarAvailable() {
62
+ const result = spawnSync('tar', ['--version'], {
63
+ stdio: 'pipe',
64
+ encoding: 'utf8',
65
+ });
66
+
67
+ if (result.error || result.status !== 0) {
68
+ return false;
69
+ }
70
+
71
+ const stdout = `${result.stdout || ''}${result.stderr || ''}`;
72
+ return /gnu tar/i.test(stdout);
73
+ }
74
+
58
75
  function loadManifest(dir) {
59
76
  const manifestPath = path.join(dir, 'extension.yaml');
60
77
  if (!fs.existsSync(manifestPath)) {
@@ -188,6 +205,10 @@ async function pack(sourceDir, outputPath, options = {}) {
188
205
 
189
206
  // Collect files and compute checksums
190
207
  const files = collectFiles(resolvedDir);
208
+ if (files.length === 0) {
209
+ console.error('Error: no packageable files found in extension directory.');
210
+ process.exit(1);
211
+ }
191
212
  const checksums = computeChecksums(resolvedDir, files);
192
213
 
193
214
  console.log(` Found ${files.length} files`);
@@ -201,15 +222,46 @@ async function pack(sourceDir, outputPath, options = {}) {
201
222
  const filename = outputPath || `${manifest.id.replace('/', '-')}-${manifest.version}.notur`;
202
223
  const outputFullPath = path.resolve(filename);
203
224
 
204
- // Build exclude args for tar
205
- const excludeArgs = EXCLUDE_PATTERNS.map(p => `--exclude='${p}'`).join(' ');
225
+ // Build safe argument list for tar (no shell interpolation).
226
+ const deterministicArgs = isGnuTarAvailable()
227
+ ? ['--sort=name', '--mtime=UTC 1970-01-01', '--owner=0', '--group=0', '--numeric-owner']
228
+ : [];
229
+
230
+ const tarArgs = [
231
+ ...deterministicArgs,
232
+ ...EXCLUDE_PATTERNS.flatMap(p => ['--exclude', p]),
233
+ '-czf',
234
+ outputFullPath,
235
+ '.',
236
+ ];
237
+
238
+ if (options.dryRun) {
239
+ console.log('\nDry run mode (no archive written).');
240
+ console.log(`Would create: ${outputFullPath}`);
241
+ console.log(`Would include: ${files.length} files`);
242
+ if (deterministicArgs.length > 0) {
243
+ console.log('Deterministic archive mode: enabled (GNU tar flags).');
244
+ } else {
245
+ console.log('Deterministic archive mode: not available (GNU tar not detected).');
246
+ }
247
+ return;
248
+ }
206
249
 
207
250
  try {
208
- // Create tar.gz archive
209
- execSync(
210
- `tar ${excludeArgs} -czvf "${outputFullPath}" .`,
211
- { cwd: resolvedDir, stdio: 'pipe' }
212
- );
251
+ const tarResult = spawnSync('tar', tarArgs, {
252
+ cwd: resolvedDir,
253
+ stdio: 'pipe',
254
+ encoding: 'utf8',
255
+ });
256
+
257
+ if (tarResult.error) {
258
+ throw new Error(`Failed to execute tar: ${tarResult.error.message}`);
259
+ }
260
+
261
+ if (tarResult.status !== 0) {
262
+ const stderr = (tarResult.stderr || '').trim();
263
+ throw new Error(`tar failed with exit code ${tarResult.status}${stderr ? `: ${stderr}` : ''}`);
264
+ }
213
265
 
214
266
  // Compute archive checksum
215
267
  const archiveChecksum = computeChecksum(outputFullPath);
@@ -1,21 +1,29 @@
1
- import { ExtensionDefinition } from './types';
1
+ import { ExtensionDefinition, SimpleExtensionDefinition } from './types';
2
2
  /**
3
3
  * Factory for registering a Notur extension.
4
4
  *
5
- * Usage:
5
+ * Supports two calling conventions:
6
+ *
7
+ * **Simplified** (recommended) — `id` at the top level, name/version auto-resolved from manifest:
6
8
  * ```ts
7
- * import { createExtension } from '@notur/sdk';
9
+ * createExtension({
10
+ * id: 'acme/analytics',
11
+ * slots: [
12
+ * { slot: 'dashboard.widgets', component: AnalyticsWidget, order: 10 },
13
+ * ],
14
+ * });
15
+ * ```
8
16
  *
17
+ * **Full** — explicit config object (backward compatible):
18
+ * ```ts
9
19
  * createExtension({
10
- * config: { id: 'acme/analytics', name: 'Analytics', version: '1.0.0' },
11
- * slots: [
12
- * { slot: 'dashboard.widgets', component: AnalyticsWidget, order: 10 },
13
- * ],
14
- * routes: [
15
- * { area: 'server', path: '/analytics', name: 'Analytics', component: AnalyticsPage },
16
- * ],
20
+ * config: { id: 'acme/analytics', name: 'Analytics', version: '1.0.0' },
21
+ * slots: [
22
+ * { slot: 'dashboard.widgets', component: AnalyticsWidget, order: 10 },
23
+ * ],
17
24
  * });
18
25
  * ```
19
26
  */
20
27
  export declare function createExtension(definition: ExtensionDefinition): void;
28
+ export declare function createExtension(definition: SimpleExtensionDefinition): void;
21
29
  //# sourceMappingURL=createExtension.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createExtension.d.ts","sourceRoot":"","sources":["../src/createExtension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAe,MAAM,SAAS,CAAC;AAE3D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAiCrE"}
1
+ {"version":3,"file":"createExtension.d.ts","sourceRoot":"","sources":["../src/createExtension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAe,MAAM,SAAS,CAAC;AAEtF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAAC;AACvE,wBAAgB,eAAe,CAAC,UAAU,EAAE,yBAAyB,GAAG,IAAI,CAAC"}
@@ -1,25 +1,12 @@
1
1
  import { getNoturApi } from './types';
2
- /**
3
- * Factory for registering a Notur extension.
4
- *
5
- * Usage:
6
- * ```ts
7
- * import { createExtension } from '@notur/sdk';
8
- *
9
- * createExtension({
10
- * config: { id: 'acme/analytics', name: 'Analytics', version: '1.0.0' },
11
- * slots: [
12
- * { slot: 'dashboard.widgets', component: AnalyticsWidget, order: 10 },
13
- * ],
14
- * routes: [
15
- * { area: 'server', path: '/analytics', name: 'Analytics', component: AnalyticsPage },
16
- * ],
17
- * });
18
- * ```
19
- */
20
2
  export function createExtension(definition) {
21
- const { config, slots = [], routes = [], onInit, onDestroy, cssIsolation } = definition;
3
+ // Normalize: if 'id' is at top level (simplified form), wrap in config
4
+ const normalized = isSimpleDefinition(definition)
5
+ ? { ...definition, config: { id: definition.id } }
6
+ : definition;
7
+ const { config, slots = [], routes = [], onInit, onDestroy, cssIsolation } = normalized;
22
8
  const api = getNoturApi();
9
+ warnOnMisconfiguration(config.id, slots, routes);
23
10
  const resolvedConfig = resolveConfig(api, config);
24
11
  const resolvedCssIsolation = resolveCssIsolation(api, config.id, cssIsolation);
25
12
  // Register the extension
@@ -46,6 +33,12 @@ export function createExtension(definition) {
46
33
  }
47
34
  console.log(`[Notur] Extension registered: ${resolvedConfig.id} v${resolvedConfig.version}`);
48
35
  }
36
+ /**
37
+ * Check if the definition uses the simplified form (id at top level).
38
+ */
39
+ function isSimpleDefinition(definition) {
40
+ return 'id' in definition && !('config' in definition);
41
+ }
49
42
  function resolveConfig(api, config) {
50
43
  var _a, _b, _c;
51
44
  const manifestEntry = (_a = api.extensions) === null || _a === void 0 ? void 0 : _a.find(ext => ext.id === config.id);
@@ -77,4 +70,38 @@ function resolveCssIsolation(api, extensionId, local) {
77
70
  }
78
71
  return undefined;
79
72
  }
73
+ function warnOnMisconfiguration(extensionId, slots, routes) {
74
+ if (!/^[a-z0-9-]+\/[a-z0-9-]+$/.test(extensionId)) {
75
+ console.warn(`[Notur SDK] Extension id "${extensionId}" does not match vendor/name format (lowercase, hyphen-safe).`);
76
+ }
77
+ const normalizedSlots = slots !== null && slots !== void 0 ? slots : [];
78
+ const normalizedRoutes = routes !== null && routes !== void 0 ? routes : [];
79
+ const routeKeys = new Set();
80
+ for (const slot of normalizedSlots) {
81
+ if (!slot.slot || typeof slot.slot !== 'string') {
82
+ console.warn(`[Notur SDK] Extension ${extensionId} has a slot registration without a valid slot id.`);
83
+ }
84
+ if (typeof slot.component !== 'function') {
85
+ console.warn(`[Notur SDK] Extension ${extensionId} slot "${slot.slot}" has a non-component value. Expected a React component.`);
86
+ }
87
+ }
88
+ for (const route of normalizedRoutes) {
89
+ if (!route.path.startsWith('/')) {
90
+ console.warn(`[Notur SDK] Extension ${extensionId} route "${route.name}" should start with "/". Received "${route.path}".`);
91
+ }
92
+ if (typeof route.component !== 'function') {
93
+ console.warn(`[Notur SDK] Extension ${extensionId} route "${route.name}" has a non-component value. Expected a React component.`);
94
+ }
95
+ if (route.permission && !route.permission.includes('.')) {
96
+ console.warn(`[Notur SDK] Extension ${extensionId} route "${route.name}" uses permission "${route.permission}" without namespace (recommended: vendor.action).`);
97
+ }
98
+ const routeKey = `${route.area}:${route.path}`;
99
+ if (routeKeys.has(routeKey)) {
100
+ console.warn(`[Notur SDK] Extension ${extensionId} registers duplicate route path "${route.path}" in area "${route.area}".`);
101
+ }
102
+ else {
103
+ routeKeys.add(routeKey);
104
+ }
105
+ }
106
+ }
80
107
  //# sourceMappingURL=createExtension.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createExtension.js","sourceRoot":"","sources":["../src/createExtension.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createExtension.js","sourceRoot":"","sources":["../src/createExtension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface ScopedEventChannel {
2
+ eventName: (name: string) => string;
3
+ emit: (name: string, data?: unknown) => void;
4
+ on: (name: string, callback: (data?: unknown) => void) => () => void;
5
+ }
6
+ /**
7
+ * Create a namespaced inter-extension event channel.
8
+ *
9
+ * This avoids accidental collisions in global event names by scoping
10
+ * all events to `ext:<extensionId>:<event>`.
11
+ */
12
+ export declare function createScopedEventChannel(extensionId: string): ScopedEventChannel;
13
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;CACxE;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,CAchF"}
package/dist/events.js ADDED
@@ -0,0 +1,21 @@
1
+ import { getNoturApi } from './types';
2
+ /**
3
+ * Create a namespaced inter-extension event channel.
4
+ *
5
+ * This avoids accidental collisions in global event names by scoping
6
+ * all events to `ext:<extensionId>:<event>`.
7
+ */
8
+ export function createScopedEventChannel(extensionId) {
9
+ const api = getNoturApi();
10
+ const eventName = (name) => `ext:${extensionId}:${name}`;
11
+ return {
12
+ eventName,
13
+ emit: (name, data) => {
14
+ api.registry.emitEvent(eventName(name), data);
15
+ },
16
+ on: (name, callback) => {
17
+ return api.registry.onEvent(eventName(name), callback);
18
+ },
19
+ };
20
+ }
21
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAQtC;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IACxD,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAE1B,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,OAAO,WAAW,IAAI,IAAI,EAAE,CAAC;IAEzE,OAAO;QACH,SAAS;QACT,IAAI,EAAE,CAAC,IAAY,EAAE,IAAc,EAAQ,EAAE;YACzC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,CAAC;QACD,EAAE,EAAE,CAAC,IAAY,EAAE,QAAkC,EAAgB,EAAE;YACnE,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC3D,CAAC;KACJ,CAAC;AACN,CAAC"}
@@ -18,7 +18,7 @@ export function usePermission(permission) {
18
18
  }
19
19
  // Check permissions array
20
20
  const perms = serverContext.permissions || [];
21
- setHasPermission(perms.includes('*') || perms.includes(permission));
21
+ setHasPermission(perms.indexOf('*') !== -1 || perms.indexOf(permission) !== -1);
22
22
  }, [serverContext, permission]);
23
23
  return hasPermission;
24
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"usePermission.js","sourceRoot":"","sources":["../../src/hooks/usePermission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC5C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE1D,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO;QACX,CAAC;QAED,iBAAiB;QACjB,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YACxB,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO;QACX,CAAC;QAED,0BAA0B;QAC1B,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,IAAI,EAAE,CAAC;QAC9C,gBAAgB,CACZ,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CACpD,CAAC;IACN,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;IAEhC,OAAO,aAAa,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"usePermission.js","sourceRoot":"","sources":["../../src/hooks/usePermission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC5C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE1D,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO;QACX,CAAC;QAED,iBAAiB;QACjB,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YACxB,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO;QACX,CAAC;QAED,0BAA0B;QAC1B,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,IAAI,EAAE,CAAC;QAC9C,gBAAgB,CACZ,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAChE,CAAC;IACN,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;IAEhC,OAAO,aAAa,CAAC;AACzB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  export { createExtension } from './createExtension';
2
2
  export { getNoturApi } from './types';
3
- export type { ExtensionConfig, SlotConfig, RouteConfig, ExtensionDefinition, NoturApi, } from './types';
3
+ export type { ExtensionConfig, SlotConfig, RouteConfig, ExtensionDefinition, SimpleExtensionDefinition, NoturApi, } from './types';
4
4
  export { useServerContext } from './hooks/useServerContext';
5
5
  export { useUserContext } from './hooks/useUserContext';
6
6
  export { usePermission } from './hooks/usePermission';
7
7
  export { useExtensionConfig } from './hooks/useExtensionConfig';
8
8
  export { useNoturEvent, useEmitEvent } from './hooks/useNoturEvent';
9
9
  export { useNavigate } from './hooks/useNavigate';
10
+ export { createScopedEventChannel } from './events';
10
11
  //# 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,QAAQ,GACX,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"}
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,GACX,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"}
package/dist/index.js CHANGED
@@ -6,4 +6,5 @@ export { usePermission } from './hooks/usePermission';
6
6
  export { useExtensionConfig } from './hooks/useExtensionConfig';
7
7
  export { useNoturEvent, useEmitEvent } from './hooks/useNoturEvent';
8
8
  export { useNavigate } from './hooks/useNavigate';
9
+ export { createScopedEventChannel } from './events';
9
10
  //# sourceMappingURL=index.js.map
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;AAQtC,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"}
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;AAStC,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"}
package/dist/types.d.ts CHANGED
@@ -1,6 +1,15 @@
1
+ /**
2
+ * Extension identity configuration.
3
+ *
4
+ * Only `id` is required. `name` and `version` are auto-resolved from
5
+ * the extension.yaml manifest if omitted.
6
+ */
1
7
  export interface ExtensionConfig {
8
+ /** Unique extension identifier in vendor/name format (e.g. "acme/analytics"). */
2
9
  id: string;
10
+ /** Human-readable name. Auto-resolved from extension.yaml if omitted. */
3
11
  name?: string;
12
+ /** Semantic version string. Auto-resolved from extension.yaml if omitted. */
4
13
  version?: string;
5
14
  }
6
15
  export interface CssIsolationConfig {
@@ -51,6 +60,17 @@ export interface RouteConfig {
51
60
  icon?: string;
52
61
  permission?: string;
53
62
  }
63
+ /**
64
+ * Full extension definition passed to `createExtension()`.
65
+ *
66
+ * @example
67
+ * ```ts
68
+ * createExtension({
69
+ * config: { id: 'acme/analytics' },
70
+ * slots: [{ slot: 'dashboard.widgets', component: Widget }],
71
+ * });
72
+ * ```
73
+ */
54
74
  export interface ExtensionDefinition {
55
75
  config: ExtensionConfig;
56
76
  slots?: SlotConfig[];
@@ -59,6 +79,24 @@ export interface ExtensionDefinition {
59
79
  onInit?: () => void;
60
80
  onDestroy?: () => void;
61
81
  }
82
+ /**
83
+ * Simplified extension definition with `id` at the top level.
84
+ *
85
+ * Name and version are auto-resolved from the extension.yaml manifest.
86
+ * This is the recommended format for most extensions.
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * createExtension({
91
+ * id: 'acme/analytics',
92
+ * slots: [{ slot: 'dashboard.widgets', component: Widget }],
93
+ * });
94
+ * ```
95
+ */
96
+ export type SimpleExtensionDefinition = Omit<ExtensionDefinition, 'config'> & {
97
+ /** Unique extension identifier in vendor/name format (e.g. "acme/analytics"). */
98
+ id: string;
99
+ };
62
100
  export interface SlotRegistration {
63
101
  extensionId: string;
64
102
  slot: string;
@@ -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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAuIA;;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":"AA8KA;;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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@notur/sdk",
3
- "version": "1.1.4",
3
+ "version": "1.2.7",
4
4
  "description": "Notur Extension Developer SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -25,11 +25,7 @@ const ExampleWidget: React.FC<{ extensionId: string }> = ({ extensionId }) => {
25
25
  };
26
26
 
27
27
  createExtension({
28
- config: {
29
- id: '{{vendor}}/{{name}}',
30
- name: '{{displayName}}',
31
- version: '1.0.0',
32
- },
28
+ id: '{{vendor}}/{{name}}',
33
29
  slots: [
34
30
  {
35
31
  slot: 'dashboard.widgets',
@@ -4,27 +4,11 @@ declare(strict_types=1);
4
4
 
5
5
  namespace {{namespace}};
6
6
 
7
- use Notur\Contracts\ExtensionInterface;
7
+ use Notur\Support\NoturExtension;
8
8
  use Notur\Contracts\HasRoutes;
9
- use Notur\Contracts\HasFrontendSlots;
10
9
 
11
- class {{className}} implements ExtensionInterface, HasRoutes, HasFrontendSlots
10
+ class {{className}} extends NoturExtension implements HasRoutes
12
11
  {
13
- public function getId(): string
14
- {
15
- return '{{vendor}}/{{name}}';
16
- }
17
-
18
- public function getName(): string
19
- {
20
- return '{{displayName}}';
21
- }
22
-
23
- public function getVersion(): string
24
- {
25
- return '1.0.0';
26
- }
27
-
28
12
  public function register(): void
29
13
  {
30
14
  //
@@ -35,20 +19,10 @@ class {{className}} implements ExtensionInterface, HasRoutes, HasFrontendSlots
35
19
  //
36
20
  }
37
21
 
38
- public function getBasePath(): string
39
- {
40
- return __DIR__ . '/..';
41
- }
42
-
43
22
  public function getRouteFiles(): array
44
23
  {
45
24
  return [
46
25
  'api-client' => 'src/routes/api-client.php',
47
26
  ];
48
27
  }
49
-
50
- public function getFrontendSlots(): array
51
- {
52
- return [];
53
- }
54
28
  }
@@ -45,8 +45,18 @@ module.exports = {
45
45
  ],
46
46
  },
47
47
  externals: {
48
- react: 'React',
49
- 'react-dom': 'ReactDOM',
48
+ react: {
49
+ root: 'React',
50
+ commonjs: 'react',
51
+ commonjs2: 'react',
52
+ amd: 'react',
53
+ },
54
+ 'react-dom': {
55
+ root: 'ReactDOM',
56
+ commonjs: 'react-dom',
57
+ commonjs2: 'react-dom',
58
+ amd: 'react-dom',
59
+ },
50
60
  '@notur/sdk': '__NOTUR__',
51
61
  },
52
62
  };