@notur/sdk 1.2.0 → 1.2.8
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 +191 -60
- package/bin/notur-pack.js +60 -8
- package/dist/createExtension.d.ts +18 -10
- package/dist/createExtension.d.ts.map +1 -1
- package/dist/createExtension.js +46 -19
- package/dist/createExtension.js.map +1 -1
- package/dist/events.d.ts +13 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +21 -0
- package/dist/events.js.map +1 -0
- package/dist/hooks/usePermission.js +1 -1
- package/dist/hooks/usePermission.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/templates/ExampleComponent.tsx.template +1 -5
- package/templates/ServiceProvider.php.template +2 -28
- package/webpack.extension.config.js +12 -2
package/README.md
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
# @notur/sdk
|
|
2
2
|
|
|
3
|
-
Notur Extension Developer SDK
|
|
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
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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,
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
99
|
+
### `notur-pack` — Package extensions
|
|
69
100
|
|
|
70
|
-
|
|
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
|
-
#
|
|
104
|
+
# Pack current directory
|
|
74
105
|
npx notur-pack
|
|
75
106
|
|
|
76
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
121
|
+
Upload the `.notur` file at `/admin/notur/extensions` in your panel.
|
|
90
122
|
|
|
91
|
-
|
|
123
|
+
#### Signing archives
|
|
92
124
|
|
|
93
|
-
|
|
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
|
-
|
|
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
|
|
100
|
-
-
|
|
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
|
-
|
|
138
|
+
The `.sig` format is compatible with PHP's `SignatureVerifier::verify()`.
|
|
104
139
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
140
|
+
### `notur-keygen` — Generate signing keypair
|
|
141
|
+
|
|
142
|
+
Generates a new Ed25519 keypair for extension signing.
|
|
108
143
|
|
|
109
|
-
|
|
110
|
-
npx notur-
|
|
144
|
+
```bash
|
|
145
|
+
npx notur-keygen
|
|
111
146
|
```
|
|
112
147
|
|
|
113
|
-
|
|
114
|
-
-
|
|
115
|
-
- `
|
|
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
|
|
152
|
+
The output format matches the PHP `php artisan notur:keygen` command.
|
|
119
153
|
|
|
120
|
-
|
|
154
|
+
---
|
|
121
155
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
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
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
|
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 {
|
|
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
|
|
205
|
-
const
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
*
|
|
5
|
+
* Supports two calling conventions:
|
|
6
|
+
*
|
|
7
|
+
* **Simplified** (recommended) — `id` at the top level, name/version auto-resolved from manifest:
|
|
6
8
|
* ```ts
|
|
7
|
-
*
|
|
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
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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;
|
|
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"}
|
package/dist/createExtension.js
CHANGED
|
@@ -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
|
-
|
|
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":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"createExtension.js","sourceRoot":"","sources":["../src/createExtension.ts"],"names":[],"mappings":"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"}
|
package/dist/events.d.ts
ADDED
|
@@ -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.
|
|
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,
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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":"
|
|
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
|
@@ -25,11 +25,7 @@ const ExampleWidget: React.FC<{ extensionId: string }> = ({ extensionId }) => {
|
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
createExtension({
|
|
28
|
-
|
|
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\
|
|
7
|
+
use Notur\Support\NoturExtension;
|
|
8
8
|
use Notur\Contracts\HasRoutes;
|
|
9
|
-
use Notur\Contracts\HasFrontendSlots;
|
|
10
9
|
|
|
11
|
-
class {{className}} implements
|
|
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:
|
|
49
|
-
|
|
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
|
};
|