@jsbot-tellus/core 2.0.3 → 2.1.0
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 +13 -17
- package/dist/app.js +12 -40
- package/dist/app.js.map +1 -1
- package/dist/core/config/schema.d.ts +0 -2
- package/dist/core/config/schema.d.ts.map +1 -1
- package/dist/core/config/schema.js +0 -1
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/dispatch/command.d.ts +24 -2
- package/dist/core/dispatch/command.d.ts.map +1 -1
- package/dist/core/dispatch/command.js +297 -60
- package/dist/core/dispatch/command.js.map +1 -1
- package/dist/core/dispatch/router.d.ts +17 -3
- package/dist/core/dispatch/router.d.ts.map +1 -1
- package/dist/core/dispatch/router.js +38 -2
- package/dist/core/dispatch/router.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/plugin/command-params.d.ts +15 -0
- package/dist/core/plugin/command-params.d.ts.map +1 -0
- package/dist/core/plugin/command-params.js +427 -0
- package/dist/core/plugin/command-params.js.map +1 -0
- package/dist/core/plugin/context.d.ts.map +1 -1
- package/dist/core/plugin/context.js +27 -0
- package/dist/core/plugin/context.js.map +1 -1
- package/dist/core/plugin/install-dir.d.ts +6 -9
- package/dist/core/plugin/install-dir.d.ts.map +1 -1
- package/dist/core/plugin/install-dir.js +99 -79
- package/dist/core/plugin/install-dir.js.map +1 -1
- package/dist/core/plugin/install-validate.d.ts +2 -1
- package/dist/core/plugin/install-validate.d.ts.map +1 -1
- package/dist/core/plugin/install-validate.js +25 -17
- package/dist/core/plugin/install-validate.js.map +1 -1
- package/dist/core/plugin/installer.d.ts +3 -3
- package/dist/core/plugin/installer.d.ts.map +1 -1
- package/dist/core/plugin/installer.js +143 -140
- package/dist/core/plugin/installer.js.map +1 -1
- package/dist/core/plugin/loader.d.ts +1 -0
- package/dist/core/plugin/loader.d.ts.map +1 -1
- package/dist/core/plugin/loader.js +24 -2
- package/dist/core/plugin/loader.js.map +1 -1
- package/dist/core/plugin/types.d.ts +11 -3
- package/dist/core/plugin/types.d.ts.map +1 -1
- package/dist/core/plugin/types.js.map +1 -1
- package/dist/plugins/admin/index.d.ts.map +1 -1
- package/dist/plugins/admin/index.js +119 -86
- package/dist/plugins/admin/index.js.map +1 -1
- package/dist/plugins/core/index.d.ts.map +1 -1
- package/dist/plugins/core/index.js +4 -1
- package/dist/plugins/core/index.js.map +1 -1
- package/docs/architecture.md +22 -24
- package/docs/configuration.md +19 -23
- package/docs/feature-parity.md +4 -4
- package/docs/migration.md +13 -13
- package/docs/plugin-api.md +156 -26
- package/docs/plugin-development.md +390 -0
- package/docs/release.md +2 -2
- package/examples/plugins/hello/README.md +10 -5
- package/examples/plugins/hello/index.js +3 -6
- package/package.json +2 -1
- package/src/app.ts +16 -55
- package/src/core/config/schema.ts +0 -1
- package/src/core/dispatch/command.ts +474 -70
- package/src/core/dispatch/router.ts +77 -3
- package/src/core/index.ts +2 -0
- package/src/core/plugin/command-params.ts +595 -0
- package/src/core/plugin/context.ts +47 -2
- package/src/core/plugin/install-dir.ts +117 -111
- package/src/core/plugin/install-validate.ts +36 -34
- package/src/core/plugin/installer.ts +228 -184
- package/src/core/plugin/loader.ts +36 -2
- package/src/core/plugin/types.ts +23 -3
- package/src/plugins/admin/index.ts +302 -233
- package/src/plugins/core/index.ts +5 -1
- package/dist/core/plugin/installed.d.ts +0 -9
- package/dist/core/plugin/installed.d.ts.map +0 -1
- package/dist/core/plugin/installed.js +0 -113
- package/dist/core/plugin/installed.js.map +0 -1
- package/src/core/plugin/installed.ts +0 -165
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { join } from 'node:path';
|
|
2
|
-
import { pathToFileURL } from 'node:url';
|
|
3
|
-
import { collectPluginExports } from './exports.js';
|
|
4
|
-
import { CORE_PACKAGE_NAME, ensureCoreLink, packageDir, pathExists, readDependencies, readJsonFile, } from './install-dir.js';
|
|
5
|
-
let importSequence = 0;
|
|
6
|
-
function pickCondition(value) {
|
|
7
|
-
if (typeof value === 'string')
|
|
8
|
-
return value;
|
|
9
|
-
if (Array.isArray(value)) {
|
|
10
|
-
for (const item of value) {
|
|
11
|
-
const found = pickCondition(item);
|
|
12
|
-
if (found !== undefined)
|
|
13
|
-
return found;
|
|
14
|
-
}
|
|
15
|
-
return undefined;
|
|
16
|
-
}
|
|
17
|
-
if (typeof value !== 'object' || value === null)
|
|
18
|
-
return undefined;
|
|
19
|
-
const record = value;
|
|
20
|
-
for (const key of ['import', 'node', 'default', 'require']) {
|
|
21
|
-
if (key in record) {
|
|
22
|
-
const found = pickCondition(record[key]);
|
|
23
|
-
if (found !== undefined)
|
|
24
|
-
return found;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
for (const [key, item] of Object.entries(record)) {
|
|
28
|
-
if (key === 'types' ||
|
|
29
|
-
key === 'browser' ||
|
|
30
|
-
key === 'deno' ||
|
|
31
|
-
key === 'react-native') {
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
const found = pickCondition(item);
|
|
35
|
-
if (found !== undefined)
|
|
36
|
-
return found;
|
|
37
|
-
}
|
|
38
|
-
return undefined;
|
|
39
|
-
}
|
|
40
|
-
export function packageEntry(directory, manifest) {
|
|
41
|
-
const exportsValue = manifest['exports'];
|
|
42
|
-
let entry;
|
|
43
|
-
if (exportsValue !== undefined) {
|
|
44
|
-
if (typeof exportsValue === 'object' &&
|
|
45
|
-
exportsValue !== null &&
|
|
46
|
-
!Array.isArray(exportsValue)) {
|
|
47
|
-
const record = exportsValue;
|
|
48
|
-
if ('.' in record) {
|
|
49
|
-
entry = pickCondition(record['.']);
|
|
50
|
-
}
|
|
51
|
-
else if (Object.keys(record).some((key) => !key.startsWith('.'))) {
|
|
52
|
-
entry = pickCondition(record);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
entry = pickCondition(exportsValue);
|
|
57
|
-
}
|
|
58
|
-
if (entry === undefined) {
|
|
59
|
-
throw new Error('package.json 的 exports 没有定义根入口');
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
else if (typeof manifest['main'] === 'string') {
|
|
63
|
-
entry = manifest['main'];
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
entry = './index.js';
|
|
67
|
-
}
|
|
68
|
-
return join(directory, entry);
|
|
69
|
-
}
|
|
70
|
-
export async function loadInstalledPlugins(directory, logger) {
|
|
71
|
-
const result = {
|
|
72
|
-
plugins: [],
|
|
73
|
-
byPackage: new Map(),
|
|
74
|
-
};
|
|
75
|
-
if (!(await pathExists(join(directory, 'package.json')))) {
|
|
76
|
-
return result;
|
|
77
|
-
}
|
|
78
|
-
await ensureCoreLink(directory);
|
|
79
|
-
const dependencies = await readDependencies(directory);
|
|
80
|
-
const names = Object.keys(dependencies)
|
|
81
|
-
.filter((name) => name !== CORE_PACKAGE_NAME)
|
|
82
|
-
.sort();
|
|
83
|
-
for (const name of names) {
|
|
84
|
-
const location = packageDir(directory, name);
|
|
85
|
-
const manifest = await readJsonFile(join(location, 'package.json'));
|
|
86
|
-
if (typeof manifest !== 'object' || manifest === null) {
|
|
87
|
-
logger.warn(`installed plugin package missing: ${name}`);
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
let plugins;
|
|
91
|
-
try {
|
|
92
|
-
const entry = packageEntry(location, manifest);
|
|
93
|
-
const imported = await import(`${pathToFileURL(entry).href}?jsbot=${importSequence++}`);
|
|
94
|
-
plugins = collectPluginExports(imported, entry, {
|
|
95
|
-
onInvalid: (message) => {
|
|
96
|
-
logger.warn(`${name}: ${message}`);
|
|
97
|
-
},
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
catch (error) {
|
|
101
|
-
logger.error(`failed to load installed plugin package: ${name}`, error);
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
if (plugins.length === 0) {
|
|
105
|
-
logger.warn(`installed package exported no plugin: ${name}`);
|
|
106
|
-
continue;
|
|
107
|
-
}
|
|
108
|
-
result.byPackage.set(name, plugins.map((plugin) => plugin.manifest.id));
|
|
109
|
-
result.plugins.push(...plugins);
|
|
110
|
-
}
|
|
111
|
-
return result;
|
|
112
|
-
}
|
|
113
|
-
//# sourceMappingURL=installed.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"installed.js","sourceRoot":"","sources":["../../../src/core/plugin/installed.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { join } from 'node:path'
|
|
2
|
-
import { pathToFileURL } from 'node:url'
|
|
3
|
-
import type { Logger } from '../logging/logger.js'
|
|
4
|
-
import { collectPluginExports } from './exports.js'
|
|
5
|
-
import {
|
|
6
|
-
CORE_PACKAGE_NAME,
|
|
7
|
-
ensureCoreLink,
|
|
8
|
-
packageDir,
|
|
9
|
-
pathExists,
|
|
10
|
-
readDependencies,
|
|
11
|
-
readJsonFile,
|
|
12
|
-
} from './install-dir.js'
|
|
13
|
-
import type { AnyPluginDefinition } from './types.js'
|
|
14
|
-
|
|
15
|
-
export interface LoadedInstalledPlugins {
|
|
16
|
-
plugins: AnyPluginDefinition[]
|
|
17
|
-
byPackage: Map<string, string[]>
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
let importSequence = 0
|
|
21
|
-
|
|
22
|
-
function pickCondition(value: unknown): string | undefined {
|
|
23
|
-
if (typeof value === 'string') return value
|
|
24
|
-
|
|
25
|
-
if (Array.isArray(value)) {
|
|
26
|
-
for (const item of value) {
|
|
27
|
-
const found = pickCondition(item)
|
|
28
|
-
if (found !== undefined) return found
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return undefined
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
if (typeof value !== 'object' || value === null) return undefined
|
|
35
|
-
|
|
36
|
-
const record = value as Record<string, unknown>
|
|
37
|
-
|
|
38
|
-
for (const key of ['import', 'node', 'default', 'require']) {
|
|
39
|
-
if (key in record) {
|
|
40
|
-
const found = pickCondition(record[key])
|
|
41
|
-
if (found !== undefined) return found
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
for (const [key, item] of Object.entries(record)) {
|
|
46
|
-
if (
|
|
47
|
-
key === 'types' ||
|
|
48
|
-
key === 'browser' ||
|
|
49
|
-
key === 'deno' ||
|
|
50
|
-
key === 'react-native'
|
|
51
|
-
) {
|
|
52
|
-
continue
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const found = pickCondition(item)
|
|
56
|
-
if (found !== undefined) return found
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return undefined
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export function packageEntry(
|
|
63
|
-
directory: string,
|
|
64
|
-
manifest: Record<string, unknown>
|
|
65
|
-
): string {
|
|
66
|
-
const exportsValue = manifest['exports']
|
|
67
|
-
let entry: string | undefined
|
|
68
|
-
|
|
69
|
-
if (exportsValue !== undefined) {
|
|
70
|
-
if (
|
|
71
|
-
typeof exportsValue === 'object' &&
|
|
72
|
-
exportsValue !== null &&
|
|
73
|
-
!Array.isArray(exportsValue)
|
|
74
|
-
) {
|
|
75
|
-
const record = exportsValue as Record<string, unknown>
|
|
76
|
-
|
|
77
|
-
if ('.' in record) {
|
|
78
|
-
entry = pickCondition(record['.'])
|
|
79
|
-
} else if (
|
|
80
|
-
Object.keys(record).some((key) => !key.startsWith('.'))
|
|
81
|
-
) {
|
|
82
|
-
entry = pickCondition(record)
|
|
83
|
-
}
|
|
84
|
-
} else {
|
|
85
|
-
entry = pickCondition(exportsValue)
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (entry === undefined) {
|
|
89
|
-
throw new Error('package.json 的 exports 没有定义根入口')
|
|
90
|
-
}
|
|
91
|
-
} else if (typeof manifest['main'] === 'string') {
|
|
92
|
-
entry = manifest['main']
|
|
93
|
-
} else {
|
|
94
|
-
entry = './index.js'
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return join(directory, entry)
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export async function loadInstalledPlugins(
|
|
101
|
-
directory: string,
|
|
102
|
-
logger: Logger
|
|
103
|
-
): Promise<LoadedInstalledPlugins> {
|
|
104
|
-
const result: LoadedInstalledPlugins = {
|
|
105
|
-
plugins: [],
|
|
106
|
-
byPackage: new Map(),
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (!(await pathExists(join(directory, 'package.json')))) {
|
|
110
|
-
return result
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
await ensureCoreLink(directory)
|
|
114
|
-
|
|
115
|
-
const dependencies = await readDependencies(directory)
|
|
116
|
-
const names = Object.keys(dependencies)
|
|
117
|
-
.filter((name) => name !== CORE_PACKAGE_NAME)
|
|
118
|
-
.sort()
|
|
119
|
-
|
|
120
|
-
for (const name of names) {
|
|
121
|
-
const location = packageDir(directory, name)
|
|
122
|
-
const manifest = await readJsonFile(join(location, 'package.json'))
|
|
123
|
-
|
|
124
|
-
if (typeof manifest !== 'object' || manifest === null) {
|
|
125
|
-
logger.warn(`installed plugin package missing: ${name}`)
|
|
126
|
-
continue
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
let plugins: AnyPluginDefinition[]
|
|
130
|
-
|
|
131
|
-
try {
|
|
132
|
-
const entry = packageEntry(
|
|
133
|
-
location,
|
|
134
|
-
manifest as Record<string, unknown>
|
|
135
|
-
)
|
|
136
|
-
const imported: unknown = await import(
|
|
137
|
-
`${pathToFileURL(entry).href}?jsbot=${importSequence++}`
|
|
138
|
-
)
|
|
139
|
-
plugins = collectPluginExports(imported, entry, {
|
|
140
|
-
onInvalid: (message) => {
|
|
141
|
-
logger.warn(`${name}: ${message}`)
|
|
142
|
-
},
|
|
143
|
-
})
|
|
144
|
-
} catch (error) {
|
|
145
|
-
logger.error(
|
|
146
|
-
`failed to load installed plugin package: ${name}`,
|
|
147
|
-
error
|
|
148
|
-
)
|
|
149
|
-
continue
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
if (plugins.length === 0) {
|
|
153
|
-
logger.warn(`installed package exported no plugin: ${name}`)
|
|
154
|
-
continue
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
result.byPackage.set(
|
|
158
|
-
name,
|
|
159
|
-
plugins.map((plugin) => plugin.manifest.id)
|
|
160
|
-
)
|
|
161
|
-
result.plugins.push(...plugins)
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
return result
|
|
165
|
-
}
|