@notur/sdk 1.0.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +113 -0
- package/bin/notur-pack.js +189 -0
- package/dist/createExtension.d.ts.map +1 -1
- package/dist/createExtension.js +19 -4
- package/dist/createExtension.js.map +1 -1
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -1
- package/templates/extension.yaml.template +0 -30
package/README.md
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# @notur/sdk
|
|
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.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @notur/sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
bun add @notur/sdk
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Peer dependencies:
|
|
16
|
+
- `react` `^16.14.0`
|
|
17
|
+
- `react-dom` `^16.14.0`
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { createExtension } from '@notur/sdk';
|
|
23
|
+
import AnalyticsWidget from './components/AnalyticsWidget';
|
|
24
|
+
import AnalyticsPage from './pages/AnalyticsPage';
|
|
25
|
+
|
|
26
|
+
createExtension({
|
|
27
|
+
config: { id: 'acme/analytics', name: 'Analytics', version: '1.0.0' },
|
|
28
|
+
slots: [
|
|
29
|
+
{ slot: 'dashboard.widgets', component: AnalyticsWidget, order: 10 },
|
|
30
|
+
],
|
|
31
|
+
routes: [
|
|
32
|
+
{ area: 'server', path: '/analytics', name: 'Analytics', component: AnalyticsPage },
|
|
33
|
+
],
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
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`).
|
|
40
|
+
|
|
41
|
+
## API
|
|
42
|
+
|
|
43
|
+
### `createExtension(definition)`
|
|
44
|
+
|
|
45
|
+
Registers the extension with Notur, wires routes and slots, and runs optional lifecycle hooks.
|
|
46
|
+
|
|
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.
|
|
54
|
+
|
|
55
|
+
### Hooks
|
|
56
|
+
|
|
57
|
+
All hooks are exported from `@notur/sdk`.
|
|
58
|
+
|
|
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.
|
|
67
|
+
|
|
68
|
+
## Packaging Your Extension
|
|
69
|
+
|
|
70
|
+
The SDK includes a CLI tool to package your extension into a `.notur` archive that can be uploaded to the Pterodactyl admin panel.
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# From your extension directory
|
|
74
|
+
npx notur-pack
|
|
75
|
+
|
|
76
|
+
# Or with bun
|
|
77
|
+
bunx notur-pack
|
|
78
|
+
|
|
79
|
+
# Specify a different path
|
|
80
|
+
npx notur-pack /path/to/my-extension
|
|
81
|
+
|
|
82
|
+
# Custom output filename
|
|
83
|
+
npx notur-pack --output my-extension.notur
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
This creates a `.notur` file (tar.gz archive) containing:
|
|
87
|
+
- All extension files (excluding `node_modules`, `.git`, `vendor`, `.idea`, `.vscode`)
|
|
88
|
+
- A `checksums.json` with SHA-256 hashes for integrity verification
|
|
89
|
+
|
|
90
|
+
Upload the resulting `.notur` file to your Pterodactyl admin panel at `/admin/notur/extensions`.
|
|
91
|
+
|
|
92
|
+
## Build
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
bun run build
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
npm run build
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Outputs are written to `dist/`.
|
|
103
|
+
|
|
104
|
+
## Templates
|
|
105
|
+
|
|
106
|
+
The SDK package ships a few templates in `templates/`:
|
|
107
|
+
- `extension.yaml.template` for extension manifests
|
|
108
|
+
- `ServiceProvider.php.template` for backend registration
|
|
109
|
+
- `ExampleComponent.tsx.template` for a starter UI component
|
|
110
|
+
|
|
111
|
+
## License
|
|
112
|
+
|
|
113
|
+
MIT
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* notur-pack - Package a Notur extension into a .notur archive
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* npx notur-pack [path] # Pack extension at path (default: current dir)
|
|
8
|
+
* npx notur-pack --output foo.notur
|
|
9
|
+
* bunx notur-pack
|
|
10
|
+
*
|
|
11
|
+
* A .notur file is a tar.gz archive containing:
|
|
12
|
+
* - All extension files (excluding node_modules, .git, vendor, .idea, .vscode)
|
|
13
|
+
* - A checksums.json with SHA-256 hashes of all included files
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const fs = require('fs');
|
|
17
|
+
const path = require('path');
|
|
18
|
+
const crypto = require('crypto');
|
|
19
|
+
const { execSync } = require('child_process');
|
|
20
|
+
const yaml = require('yaml');
|
|
21
|
+
|
|
22
|
+
const EXCLUDE_PATTERNS = [
|
|
23
|
+
'node_modules',
|
|
24
|
+
'.git',
|
|
25
|
+
'vendor',
|
|
26
|
+
'.idea',
|
|
27
|
+
'.vscode',
|
|
28
|
+
'.DS_Store',
|
|
29
|
+
'checksums.json',
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
function parseArgs() {
|
|
33
|
+
const args = process.argv.slice(2);
|
|
34
|
+
const options = {
|
|
35
|
+
path: '.',
|
|
36
|
+
output: null,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
for (let i = 0; i < args.length; i++) {
|
|
40
|
+
if (args[i] === '--output' || args[i] === '-o') {
|
|
41
|
+
options.output = args[++i];
|
|
42
|
+
} else if (!args[i].startsWith('-')) {
|
|
43
|
+
options.path = args[i];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return options;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function loadManifest(dir) {
|
|
51
|
+
const manifestPath = path.join(dir, 'extension.yaml');
|
|
52
|
+
if (!fs.existsSync(manifestPath)) {
|
|
53
|
+
console.error('Error: extension.yaml not found in', dir);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const content = fs.readFileSync(manifestPath, 'utf8');
|
|
58
|
+
|
|
59
|
+
// Try to parse YAML, fall back to simple regex if yaml package not available
|
|
60
|
+
try {
|
|
61
|
+
const parsed = yaml.parse(content);
|
|
62
|
+
return {
|
|
63
|
+
id: parsed.id,
|
|
64
|
+
version: parsed.version,
|
|
65
|
+
name: parsed.name,
|
|
66
|
+
};
|
|
67
|
+
} catch {
|
|
68
|
+
// Fallback: simple regex parsing
|
|
69
|
+
const idMatch = content.match(/^id:\s*["']?([^"'\n]+)["']?/m);
|
|
70
|
+
const versionMatch = content.match(/^version:\s*["']?([^"'\n]+)["']?/m);
|
|
71
|
+
const nameMatch = content.match(/^name:\s*["']?([^"'\n]+)["']?/m);
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
id: idMatch ? idMatch[1].trim() : null,
|
|
75
|
+
version: versionMatch ? versionMatch[1].trim() : null,
|
|
76
|
+
name: nameMatch ? nameMatch[1].trim() : null,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function shouldExclude(relativePath) {
|
|
82
|
+
for (const pattern of EXCLUDE_PATTERNS) {
|
|
83
|
+
if (relativePath === pattern || relativePath.startsWith(pattern + '/') || relativePath.startsWith(pattern + path.sep)) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function collectFiles(dir, baseDir = dir) {
|
|
91
|
+
const files = [];
|
|
92
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
93
|
+
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
const fullPath = path.join(dir, entry.name);
|
|
96
|
+
const relativePath = path.relative(baseDir, fullPath);
|
|
97
|
+
|
|
98
|
+
if (shouldExclude(relativePath)) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (entry.isDirectory()) {
|
|
103
|
+
files.push(...collectFiles(fullPath, baseDir));
|
|
104
|
+
} else if (entry.isFile()) {
|
|
105
|
+
files.push(relativePath);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return files.sort();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function computeChecksum(filePath) {
|
|
113
|
+
const content = fs.readFileSync(filePath);
|
|
114
|
+
return crypto.createHash('sha256').update(content).digest('hex');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function computeChecksums(dir, files) {
|
|
118
|
+
const checksums = {};
|
|
119
|
+
for (const file of files) {
|
|
120
|
+
const fullPath = path.join(dir, file);
|
|
121
|
+
checksums[file] = computeChecksum(fullPath);
|
|
122
|
+
}
|
|
123
|
+
return checksums;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function pack(sourceDir, outputPath) {
|
|
127
|
+
const resolvedDir = path.resolve(sourceDir);
|
|
128
|
+
|
|
129
|
+
if (!fs.existsSync(resolvedDir)) {
|
|
130
|
+
console.error('Error: Directory does not exist:', resolvedDir);
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const manifest = loadManifest(resolvedDir);
|
|
135
|
+
|
|
136
|
+
if (!manifest.id || !manifest.version) {
|
|
137
|
+
console.error('Error: extension.yaml must contain "id" and "version"');
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
console.log(`Packing ${manifest.name || manifest.id} v${manifest.version}...`);
|
|
142
|
+
|
|
143
|
+
// Collect files and compute checksums
|
|
144
|
+
const files = collectFiles(resolvedDir);
|
|
145
|
+
const checksums = computeChecksums(resolvedDir, files);
|
|
146
|
+
|
|
147
|
+
console.log(` Found ${files.length} files`);
|
|
148
|
+
|
|
149
|
+
// Write checksums.json temporarily
|
|
150
|
+
const checksumsPath = path.join(resolvedDir, 'checksums.json');
|
|
151
|
+
const checksumsExisted = fs.existsSync(checksumsPath);
|
|
152
|
+
fs.writeFileSync(checksumsPath, JSON.stringify(checksums, null, 2) + '\n');
|
|
153
|
+
|
|
154
|
+
// Determine output filename
|
|
155
|
+
const filename = outputPath || `${manifest.id.replace('/', '-')}-${manifest.version}.notur`;
|
|
156
|
+
const outputFullPath = path.resolve(filename);
|
|
157
|
+
|
|
158
|
+
// Build exclude args for tar
|
|
159
|
+
const excludeArgs = EXCLUDE_PATTERNS.map(p => `--exclude='${p}'`).join(' ');
|
|
160
|
+
|
|
161
|
+
try {
|
|
162
|
+
// Create tar.gz archive
|
|
163
|
+
execSync(
|
|
164
|
+
`tar ${excludeArgs} -czvf "${outputFullPath}" .`,
|
|
165
|
+
{ cwd: resolvedDir, stdio: 'pipe' }
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
// Compute archive checksum
|
|
169
|
+
const archiveChecksum = computeChecksum(outputFullPath);
|
|
170
|
+
fs.writeFileSync(
|
|
171
|
+
outputFullPath + '.sha256',
|
|
172
|
+
`${archiveChecksum} ${path.basename(outputFullPath)}\n`
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
console.log(`\nCreated: ${outputFullPath}`);
|
|
176
|
+
console.log(`Checksum: ${archiveChecksum}`);
|
|
177
|
+
console.log(`\nUpload this file to your Pterodactyl admin panel at /admin/notur/extensions`);
|
|
178
|
+
|
|
179
|
+
} finally {
|
|
180
|
+
// Clean up checksums.json if we created it
|
|
181
|
+
if (!checksumsExisted && fs.existsSync(checksumsPath)) {
|
|
182
|
+
fs.unlinkSync(checksumsPath);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Main
|
|
188
|
+
const options = parseArgs();
|
|
189
|
+
pack(options.path, options.output);
|
|
@@ -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,
|
|
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"}
|
package/dist/createExtension.js
CHANGED
|
@@ -20,12 +20,13 @@ import { getNoturApi } from './types';
|
|
|
20
20
|
export function createExtension(definition) {
|
|
21
21
|
const { config, slots = [], routes = [], onInit, onDestroy, cssIsolation } = definition;
|
|
22
22
|
const api = getNoturApi();
|
|
23
|
+
const resolvedConfig = resolveConfig(api, config);
|
|
23
24
|
const resolvedCssIsolation = resolveCssIsolation(api, config.id, cssIsolation);
|
|
24
25
|
// Register the extension
|
|
25
26
|
api.registry.registerExtension({
|
|
26
|
-
id:
|
|
27
|
-
name:
|
|
28
|
-
version:
|
|
27
|
+
id: resolvedConfig.id,
|
|
28
|
+
name: resolvedConfig.name,
|
|
29
|
+
version: resolvedConfig.version,
|
|
29
30
|
slots: slots.map(s => ({ ...s, extensionId: config.id })),
|
|
30
31
|
routes: routes.map(r => ({ ...r, extensionId: config.id })),
|
|
31
32
|
cssIsolation: resolvedCssIsolation,
|
|
@@ -43,7 +44,21 @@ export function createExtension(definition) {
|
|
|
43
44
|
console.error(`[Notur] Extension ${config.id} init error:`, e);
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
|
-
console.log(`[Notur] Extension registered: ${
|
|
47
|
+
console.log(`[Notur] Extension registered: ${resolvedConfig.id} v${resolvedConfig.version}`);
|
|
48
|
+
}
|
|
49
|
+
function resolveConfig(api, config) {
|
|
50
|
+
var _a, _b, _c;
|
|
51
|
+
const manifestEntry = (_a = api.extensions) === null || _a === void 0 ? void 0 : _a.find(ext => ext.id === config.id);
|
|
52
|
+
const name = (_b = config.name) !== null && _b !== void 0 ? _b : manifestEntry === null || manifestEntry === void 0 ? void 0 : manifestEntry.name;
|
|
53
|
+
const version = (_c = config.version) !== null && _c !== void 0 ? _c : manifestEntry === null || manifestEntry === void 0 ? void 0 : manifestEntry.version;
|
|
54
|
+
if (!name || !version) {
|
|
55
|
+
throw new Error(`[Notur] Extension ${config.id} is missing name/version. Provide them in createExtension() or in extension.yaml.`);
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
id: config.id,
|
|
59
|
+
name,
|
|
60
|
+
version,
|
|
61
|
+
};
|
|
47
62
|
}
|
|
48
63
|
function resolveCssIsolation(api, extensionId, local) {
|
|
49
64
|
var _a, _b;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createExtension.js","sourceRoot":"","sources":["../src/createExtension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,eAAe,CAAC,UAA+B;IAC3D,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC;IACxF,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAE1B,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAE/E,yBAAyB;IACzB,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC3B,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"createExtension.js","sourceRoot":"","sources":["../src/createExtension.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export interface ExtensionConfig {
|
|
2
2
|
id: string;
|
|
3
|
-
name
|
|
4
|
-
version
|
|
3
|
+
name?: string;
|
|
4
|
+
version?: string;
|
|
5
5
|
}
|
|
6
6
|
export interface CssIsolationConfig {
|
|
7
7
|
mode: 'root-class';
|
|
@@ -134,6 +134,8 @@ export interface NoturApi {
|
|
|
134
134
|
unregisterExtension: (id: string) => void;
|
|
135
135
|
extensions?: Array<{
|
|
136
136
|
id: string;
|
|
137
|
+
name?: string;
|
|
138
|
+
version?: string;
|
|
137
139
|
bundle?: string;
|
|
138
140
|
styles?: string;
|
|
139
141
|
cssIsolation?: CssIsolationConfig;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@notur/sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "Notur Extension Developer SDK",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
"publishConfig": {
|
|
15
15
|
"access": "public"
|
|
16
16
|
},
|
|
17
|
+
"bin": {
|
|
18
|
+
"notur-pack": "./bin/notur-pack.js"
|
|
19
|
+
},
|
|
17
20
|
"keywords": [
|
|
18
21
|
"notur",
|
|
19
22
|
"pterodactyl",
|
|
@@ -23,6 +26,7 @@
|
|
|
23
26
|
],
|
|
24
27
|
"files": [
|
|
25
28
|
"dist/",
|
|
29
|
+
"bin/",
|
|
26
30
|
"webpack.extension.config.js",
|
|
27
31
|
"templates/"
|
|
28
32
|
],
|
|
@@ -35,6 +39,9 @@
|
|
|
35
39
|
"react": "^16.14.0",
|
|
36
40
|
"react-dom": "^16.14.0"
|
|
37
41
|
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"yaml": "^2.3.0"
|
|
44
|
+
},
|
|
38
45
|
"devDependencies": {
|
|
39
46
|
"typescript": "^5.3.0",
|
|
40
47
|
"@types/react": "^16.14.0",
|
|
@@ -11,33 +11,3 @@ requires:
|
|
|
11
11
|
notur: "^1.0"
|
|
12
12
|
pterodactyl: "^1.11"
|
|
13
13
|
php: "^8.2"
|
|
14
|
-
|
|
15
|
-
capabilities:
|
|
16
|
-
routes: "^1"
|
|
17
|
-
health: "^1"
|
|
18
|
-
schedules: "^1"
|
|
19
|
-
css_isolation: "^1"
|
|
20
|
-
|
|
21
|
-
entrypoint: "{{namespace}}\\{{className}}"
|
|
22
|
-
|
|
23
|
-
autoload:
|
|
24
|
-
psr-4:
|
|
25
|
-
"{{namespace}}\\": "src/"
|
|
26
|
-
|
|
27
|
-
backend:
|
|
28
|
-
routes:
|
|
29
|
-
api-client: "src/routes/api-client.php"
|
|
30
|
-
migrations: "database/migrations"
|
|
31
|
-
permissions: []
|
|
32
|
-
|
|
33
|
-
frontend:
|
|
34
|
-
bundle: "resources/frontend/dist/extension.js"
|
|
35
|
-
css_isolation:
|
|
36
|
-
mode: "root-class"
|
|
37
|
-
slots: {}
|
|
38
|
-
|
|
39
|
-
health:
|
|
40
|
-
checks: []
|
|
41
|
-
|
|
42
|
-
schedules:
|
|
43
|
-
tasks: []
|