@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.
Files changed (78) hide show
  1. package/README.md +13 -17
  2. package/dist/app.js +12 -40
  3. package/dist/app.js.map +1 -1
  4. package/dist/core/config/schema.d.ts +0 -2
  5. package/dist/core/config/schema.d.ts.map +1 -1
  6. package/dist/core/config/schema.js +0 -1
  7. package/dist/core/config/schema.js.map +1 -1
  8. package/dist/core/dispatch/command.d.ts +24 -2
  9. package/dist/core/dispatch/command.d.ts.map +1 -1
  10. package/dist/core/dispatch/command.js +297 -60
  11. package/dist/core/dispatch/command.js.map +1 -1
  12. package/dist/core/dispatch/router.d.ts +17 -3
  13. package/dist/core/dispatch/router.d.ts.map +1 -1
  14. package/dist/core/dispatch/router.js +38 -2
  15. package/dist/core/dispatch/router.js.map +1 -1
  16. package/dist/core/index.d.ts +1 -1
  17. package/dist/core/index.d.ts.map +1 -1
  18. package/dist/core/plugin/command-params.d.ts +15 -0
  19. package/dist/core/plugin/command-params.d.ts.map +1 -0
  20. package/dist/core/plugin/command-params.js +427 -0
  21. package/dist/core/plugin/command-params.js.map +1 -0
  22. package/dist/core/plugin/context.d.ts.map +1 -1
  23. package/dist/core/plugin/context.js +27 -0
  24. package/dist/core/plugin/context.js.map +1 -1
  25. package/dist/core/plugin/install-dir.d.ts +6 -9
  26. package/dist/core/plugin/install-dir.d.ts.map +1 -1
  27. package/dist/core/plugin/install-dir.js +99 -79
  28. package/dist/core/plugin/install-dir.js.map +1 -1
  29. package/dist/core/plugin/install-validate.d.ts +2 -1
  30. package/dist/core/plugin/install-validate.d.ts.map +1 -1
  31. package/dist/core/plugin/install-validate.js +25 -17
  32. package/dist/core/plugin/install-validate.js.map +1 -1
  33. package/dist/core/plugin/installer.d.ts +3 -3
  34. package/dist/core/plugin/installer.d.ts.map +1 -1
  35. package/dist/core/plugin/installer.js +143 -140
  36. package/dist/core/plugin/installer.js.map +1 -1
  37. package/dist/core/plugin/loader.d.ts +1 -0
  38. package/dist/core/plugin/loader.d.ts.map +1 -1
  39. package/dist/core/plugin/loader.js +24 -2
  40. package/dist/core/plugin/loader.js.map +1 -1
  41. package/dist/core/plugin/types.d.ts +11 -3
  42. package/dist/core/plugin/types.d.ts.map +1 -1
  43. package/dist/core/plugin/types.js.map +1 -1
  44. package/dist/plugins/admin/index.d.ts.map +1 -1
  45. package/dist/plugins/admin/index.js +119 -86
  46. package/dist/plugins/admin/index.js.map +1 -1
  47. package/dist/plugins/core/index.d.ts.map +1 -1
  48. package/dist/plugins/core/index.js +4 -1
  49. package/dist/plugins/core/index.js.map +1 -1
  50. package/docs/architecture.md +22 -24
  51. package/docs/configuration.md +19 -23
  52. package/docs/feature-parity.md +4 -4
  53. package/docs/migration.md +13 -13
  54. package/docs/plugin-api.md +156 -26
  55. package/docs/plugin-development.md +390 -0
  56. package/docs/release.md +2 -2
  57. package/examples/plugins/hello/README.md +10 -5
  58. package/examples/plugins/hello/index.js +3 -6
  59. package/package.json +2 -1
  60. package/src/app.ts +16 -55
  61. package/src/core/config/schema.ts +0 -1
  62. package/src/core/dispatch/command.ts +474 -70
  63. package/src/core/dispatch/router.ts +77 -3
  64. package/src/core/index.ts +2 -0
  65. package/src/core/plugin/command-params.ts +595 -0
  66. package/src/core/plugin/context.ts +47 -2
  67. package/src/core/plugin/install-dir.ts +117 -111
  68. package/src/core/plugin/install-validate.ts +36 -34
  69. package/src/core/plugin/installer.ts +228 -184
  70. package/src/core/plugin/loader.ts +36 -2
  71. package/src/core/plugin/types.ts +23 -3
  72. package/src/plugins/admin/index.ts +302 -233
  73. package/src/plugins/core/index.ts +5 -1
  74. package/dist/core/plugin/installed.d.ts +0 -9
  75. package/dist/core/plugin/installed.d.ts.map +0 -1
  76. package/dist/core/plugin/installed.js +0 -113
  77. package/dist/core/plugin/installed.js.map +0 -1
  78. 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
- }