@nocobase/server 2.0.0-alpha.3 → 2.0.0-alpha.31

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.
@@ -109,6 +109,10 @@ const _AesEncryptor = class _AesEncryptor {
109
109
  return appKeyPath;
110
110
  }
111
111
  static async create(app) {
112
+ if (process.env.APP_AES_SECRET_KEY) {
113
+ const key2 = Buffer.from(process.env.APP_AES_SECRET_KEY, "hex");
114
+ return new _AesEncryptor(key2);
115
+ }
112
116
  const KEY_PATH = process.env.APP_AES_SECRET_KEY_PATH;
113
117
  const keyPath = KEY_PATH ? (0, import_path.resolve)(process.cwd(), KEY_PATH) : await this.getKeyPath(app.name);
114
118
  const key = await _AesEncryptor.getOrGenerateKey(keyPath);
@@ -14,6 +14,7 @@ export declare class AppCommand extends Command {
14
14
  auth(): this;
15
15
  preload(): this;
16
16
  hasCommand(name: string): boolean;
17
+ findCommand(name: string): any;
17
18
  isHandleByIPCServer(): boolean;
18
19
  createCommand(name?: string): AppCommand;
19
20
  parseHandleByIPCServer(argv: any, parseOptions?: any): Boolean;
@@ -51,6 +51,9 @@ const _AppCommand = class _AppCommand extends import_commander.Command {
51
51
  const names = this.commands.map((c) => c.name());
52
52
  return names.includes(name);
53
53
  }
54
+ findCommand(name) {
55
+ return this._findCommand(name);
56
+ }
54
57
  isHandleByIPCServer() {
55
58
  return this._handleByIPCServer;
56
59
  }
@@ -61,6 +61,8 @@ export declare class AppSupervisor extends EventEmitter implements AsyncEmitter
61
61
  touchApp(appName: string): void;
62
62
  addApp(app: Application): Application<import("./application").DefaultState, import("./application").DefaultContext>;
63
63
  getAppsNames(): Promise<string[]>;
64
+ startApp(appName: string): Promise<void>;
65
+ stopApp(appName: string): Promise<void>;
64
66
  removeApp(appName: string): Promise<void>;
65
67
  subApps(): Application<import("./application").DefaultState, import("./application").DefaultContext>[];
66
68
  on(eventName: string | symbol, listener: (...args: any[]) => void): this;
@@ -179,12 +179,25 @@ const _AppSupervisor = class _AppSupervisor extends import_events.EventEmitter {
179
179
  const apps = Object.values(this.apps);
180
180
  return apps.map((app) => app.name);
181
181
  }
182
+ async startApp(appName) {
183
+ const appInstance = await _AppSupervisor.getInstance().getApp(appName);
184
+ await appInstance.runCommand("start", "--quickstart");
185
+ }
186
+ async stopApp(appName) {
187
+ if (!this.apps[appName]) {
188
+ console.log(`app ${appName} not exists`);
189
+ return;
190
+ }
191
+ await this.apps[appName].runCommand("stop");
192
+ this.apps[appName] = null;
193
+ }
182
194
  async removeApp(appName) {
183
195
  if (!this.apps[appName]) {
184
196
  console.log(`app ${appName} not exists`);
185
197
  return;
186
198
  }
187
199
  await this.apps[appName].runCommand("destroy");
200
+ this.apps[appName] = null;
188
201
  }
189
202
  subApps() {
190
203
  return Object.values(this.apps).filter((app) => app.name !== "main");
@@ -33,11 +33,11 @@ import { PubSubManager, PubSubManagerOptions } from './pub-sub-manager';
33
33
  import { SyncMessageManager } from './sync-message-manager';
34
34
  import AesEncryptor from './aes-encryptor';
35
35
  import { AuditManager } from './audit-manager';
36
+ import { BackgroundJobManager, BackgroundJobManagerOptions } from './background-job-manager';
36
37
  import { Environment } from './environment';
37
- import { ServiceContainer } from './service-container';
38
38
  import { EventQueue, EventQueueOptions } from './event-queue';
39
- import { BackgroundJobManager, BackgroundJobManagerOptions } from './background-job-manager';
40
39
  import { RedisConfig, RedisConnectionManager } from './redis-connection-manager';
40
+ import { ServiceContainer } from './service-container';
41
41
  import { WorkerIdAllocator } from './worker-id-allocator';
42
42
  export type PluginType = string | typeof Plugin;
43
43
  export type PluginConfiguration = PluginType | [PluginType, any];
@@ -193,6 +193,7 @@ export declare class Application<StateT = DefaultState, ContextT = DefaultContex
193
193
  backgroundJobManager: BackgroundJobManager;
194
194
  constructor(options: ApplicationOptions);
195
195
  private static staticCommands;
196
+ static registerStaticCommand(callback: (app: Application) => void): void;
196
197
  static addCommand(callback: (app: Application) => void): void;
197
198
  private _sqlLogger;
198
199
  get instanceId(): number;
@@ -219,7 +220,7 @@ export declare class Application<StateT = DefaultState, ContextT = DefaultContex
219
220
  get environment(): Environment;
220
221
  protected _cronJobManager: CronJobManager;
221
222
  get cronJobManager(): CronJobManager;
222
- get mainDataSource(): SequelizeDataSource;
223
+ get mainDataSource(): SequelizeDataSource<import("@nocobase/data-source-manager").DatabaseIntrospector>;
223
224
  get db(): Database;
224
225
  get resourceManager(): import("@nocobase/resourcer").ResourceManager;
225
226
  /**
@@ -50,8 +50,8 @@ var import_database = __toESM(require("@nocobase/database"));
50
50
  var import_logger = require("@nocobase/logger");
51
51
  var import_telemetry = require("@nocobase/telemetry");
52
52
  var import_lock_manager = require("@nocobase/lock-manager");
53
- var import_utils = require("@nocobase/utils");
54
53
  var import_snowflake_id = require("@nocobase/snowflake-id");
54
+ var import_utils = require("@nocobase/utils");
55
55
  var import_crypto = require("crypto");
56
56
  var import_glob = __toESM(require("glob"));
57
57
  var import_koa = __toESM(require("koa"));
@@ -80,13 +80,13 @@ var import_package = __toESM(require("../package.json"));
80
80
  var import_available_action = require("./acl/available-action");
81
81
  var import_aes_encryptor = __toESM(require("./aes-encryptor"));
82
82
  var import_audit_manager = require("./audit-manager");
83
+ var import_background_job_manager = require("./background-job-manager");
83
84
  var import_environment = require("./environment");
84
- var import_service_container = require("./service-container");
85
85
  var import_event_queue = require("./event-queue");
86
- var import_background_job_manager = require("./background-job-manager");
87
86
  var import_redis_connection_manager = require("./redis-connection-manager");
88
- var import_worker_id_allocator = require("./worker-id-allocator");
87
+ var import_service_container = require("./service-container");
89
88
  var import_snowflake_id_field = require("./snowflake-id-field");
89
+ var import_worker_id_allocator = require("./worker-id-allocator");
90
90
  const _Application = class _Application extends import_koa.default {
91
91
  constructor(options) {
92
92
  super();
@@ -143,6 +143,9 @@ const _Application = class _Application extends import_koa.default {
143
143
  lockManager;
144
144
  eventQueue;
145
145
  backgroundJobManager;
146
+ static registerStaticCommand(callback) {
147
+ this.staticCommands.push(callback);
148
+ }
146
149
  static addCommand(callback) {
147
150
  this.staticCommands.push(callback);
148
151
  }
@@ -777,6 +780,12 @@ const _Application = class _Application extends import_koa.default {
777
780
  }
778
781
  async upgrade(options = {}) {
779
782
  this.log.info("upgrading...");
783
+ const pkgVersion = this.getPackageVersion();
784
+ const appVersion = await this.version.get();
785
+ if (process.env.SKIP_SAME_VERSION_UPGRADE === "true" && pkgVersion === appVersion) {
786
+ this.log.info(`app is already the latest version (${appVersion})`);
787
+ return;
788
+ }
780
789
  await this.reInit();
781
790
  const migrator1 = await this.loadCoreMigrations();
782
791
  await migrator1.beforeLoad.up();
@@ -948,7 +957,7 @@ const _Application = class _Application extends import_koa.default {
948
957
  }
949
958
  }
950
959
  });
951
- this._dataSourceManager.use(this._authManager.middleware(), { tag: "auth" });
960
+ this._dataSourceManager.use(this._authManager.middleware(), { tag: "auth", before: "default" });
952
961
  this._dataSourceManager.use(import_validate_filter_params.default, { tag: "validate-filter-params", before: ["auth"] });
953
962
  this._dataSourceManager.use(import_middlewares.parseVariables, {
954
963
  group: "parseVariables",
@@ -38,6 +38,17 @@ var pm_default = /* @__PURE__ */ __name((app) => {
38
38
  pm.command("create").argument("plugin").option("--force-recreate").action(async (plugin, options) => {
39
39
  await app.pm.create(plugin, options);
40
40
  });
41
+ pm.command("pull").arguments("<packageNames...>").option("--registry [registry]").option("--auth-token [authToken]").option("--version [version]").action(async (packageNames, options, cli) => {
42
+ try {
43
+ let name = packageNames;
44
+ if (Array.isArray(packageNames) && packageNames.length === 1) {
45
+ name = packageNames[0];
46
+ }
47
+ await app.pm.pull(name, { ...options });
48
+ } catch (error) {
49
+ throw new import_plugin_command_error.PluginCommandError(`Failed to pull plugin`, { cause: error });
50
+ }
51
+ });
41
52
  pm.command("add").ipc().preload().arguments("<packageNames...>").option("--registry [registry]").option("--auth-token [authToken]").option("--version [version]").action(async (packageNames, options, cli) => {
42
53
  try {
43
54
  let name = packageNames;
@@ -202,7 +202,15 @@ const _Gateway = class _Gateway extends import_events.EventEmitter {
202
202
  res.end(JSON.stringify({ error }));
203
203
  }
204
204
  responseErrorWithCode(code, res, options) {
205
+ const log = this.getLogger(options.appName, res);
205
206
  const error = (0, import_errors.applyErrorWithArgs)((0, import_errors.getErrorWithCode)(code), options);
207
+ log.error(error.message, {
208
+ method: "responseErrorWithCode",
209
+ code,
210
+ error,
211
+ statusCode: res.statusCode,
212
+ appName: options.appName
213
+ });
206
214
  this.responseError(res, error);
207
215
  }
208
216
  async requestHandler(req, res) {
package/lib/index.d.ts CHANGED
@@ -22,6 +22,7 @@ export * from './event-queue';
22
22
  export * from './background-job-manager';
23
23
  export * from './worker-id-allocator';
24
24
  export * from './redis-connection-manager';
25
+ export * from './main-data-source';
25
26
  export declare const OFFICIAL_PLUGIN_PREFIX = "@nocobase/plugin-";
26
27
  export { appendToBuiltInPlugins, findAllPlugins, findBuiltInPlugins, findLocalPlugins, packageNameTrim, } from './plugin-manager/findPackageNames';
27
28
  export { runPluginStaticImports } from './run-plugin-static-imports';
package/lib/index.js CHANGED
@@ -64,6 +64,7 @@ __reExport(src_exports, require("./event-queue"), module.exports);
64
64
  __reExport(src_exports, require("./background-job-manager"), module.exports);
65
65
  __reExport(src_exports, require("./worker-id-allocator"), module.exports);
66
66
  __reExport(src_exports, require("./redis-connection-manager"), module.exports);
67
+ __reExport(src_exports, require("./main-data-source"), module.exports);
67
68
  var import_findPackageNames = require("./plugin-manager/findPackageNames");
68
69
  var import_run_plugin_static_imports = require("./run-plugin-static-imports");
69
70
  const OFFICIAL_PLUGIN_PREFIX = "@nocobase/plugin-";
@@ -90,5 +91,6 @@ const OFFICIAL_PLUGIN_PREFIX = "@nocobase/plugin-";
90
91
  ...require("./event-queue"),
91
92
  ...require("./background-job-manager"),
92
93
  ...require("./worker-id-allocator"),
93
- ...require("./redis-connection-manager")
94
+ ...require("./redis-connection-manager"),
95
+ ...require("./main-data-source")
94
96
  });
@@ -138,7 +138,7 @@ const _Locale = class _Locale {
138
138
  if (!packageName) {
139
139
  continue;
140
140
  }
141
- const res = (0, import_resource.getResource)(packageName, lang);
141
+ const res = await (0, import_resource.getResource)(packageName, lang);
142
142
  if (res) {
143
143
  resources[packageName] = { ...res };
144
144
  if (packageName.includes(import__.OFFICIAL_PLUGIN_PREFIX)) {
@@ -40,7 +40,7 @@ __export(resource_exports, {
40
40
  getResource: () => getResource
41
41
  });
42
42
  module.exports = __toCommonJS(resource_exports);
43
- var import_utils = require("@nocobase/utils");
43
+ var import_promises = __toESM(require("fs/promises"));
44
44
  const arr2obj = /* @__PURE__ */ __name((items) => {
45
45
  const obj = {};
46
46
  for (const item of items) {
@@ -48,7 +48,7 @@ const arr2obj = /* @__PURE__ */ __name((items) => {
48
48
  }
49
49
  return obj;
50
50
  }, "arr2obj");
51
- const getResource = /* @__PURE__ */ __name((packageName, lang, isPlugin = true) => {
51
+ const getResource = /* @__PURE__ */ __name(async (packageName, lang, isPlugin = true) => {
52
52
  const resources = [];
53
53
  const prefixes = [isPlugin ? "dist" : "lib"];
54
54
  if (process.env.APP_ENV !== "production") {
@@ -70,13 +70,10 @@ const getResource = /* @__PURE__ */ __name((packageName, lang, isPlugin = true)
70
70
  }
71
71
  for (const prefix of prefixes) {
72
72
  try {
73
- const file = `${packageName}/${prefix}/locale/${lang}`;
73
+ const file = `${packageName}/${prefix}/locale/${lang}.json`;
74
74
  const f = require.resolve(file);
75
- if (process.env.APP_ENV !== "production") {
76
- delete require.cache[f];
77
- }
78
- const resource = (0, import_utils.requireModule)(file);
79
- resources.push(resource);
75
+ const resource = await import_promises.default.readFile(f, "utf8");
76
+ resources.push(JSON.parse(resource));
80
77
  } catch (error) {
81
78
  }
82
79
  if (resources.length) {
@@ -84,7 +81,7 @@ const getResource = /* @__PURE__ */ __name((packageName, lang, isPlugin = true)
84
81
  }
85
82
  }
86
83
  if (resources.length === 0 && lang.replace("-", "_") !== lang) {
87
- return getResource(packageName, lang.replace("-", "_"));
84
+ return await getResource(packageName, lang.replace("-", "_"));
88
85
  }
89
86
  return arr2obj(resources);
90
87
  }, "getResource");
@@ -6,7 +6,18 @@
6
6
  * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
+ import { Context } from '@nocobase/actions';
9
10
  import { DataSourceOptions, SequelizeDataSource } from '@nocobase/data-source-manager';
11
+ type MainDataSourceStatus = 'loaded' | 'loading';
10
12
  export declare class MainDataSource extends SequelizeDataSource {
13
+ status: MainDataSourceStatus;
11
14
  init(options?: DataSourceOptions): void;
15
+ readTables(): Promise<{
16
+ name: string;
17
+ }[]>;
18
+ private tables2Collections;
19
+ loadTables(ctx: Context, tables: string[]): Promise<void>;
20
+ private getLoadedCollections;
21
+ syncFieldsFromDatabase(ctx: any, collectionNames?: string[]): Promise<void>;
12
22
  }
23
+ export {};
@@ -32,6 +32,7 @@ __export(main_data_source_exports, {
32
32
  module.exports = __toCommonJS(main_data_source_exports);
33
33
  var import_data_source_manager = require("@nocobase/data-source-manager");
34
34
  const _MainDataSource = class _MainDataSource extends import_data_source_manager.SequelizeDataSource {
35
+ status = "loaded";
35
36
  init(options = {}) {
36
37
  const { acl, resourceManager, database } = options;
37
38
  this.acl = acl;
@@ -48,6 +49,133 @@ const _MainDataSource = class _MainDataSource extends import_data_source_manager
48
49
  this.resourceManager.use(this.acl.middleware(), { group: "acl", after: "auth" });
49
50
  }
50
51
  }
52
+ async readTables() {
53
+ const allTables = await this.introspector.getTableList();
54
+ const existsCollections = this.collectionManager.db.collections;
55
+ const existsTables = Array.from(existsCollections.values()).map(
56
+ (collection) => collection.model.tableName
57
+ );
58
+ const diffTables = allTables.filter((table) => !existsTables.includes(table));
59
+ return diffTables.map((name) => ({ name }));
60
+ }
61
+ async tables2Collections(tableNames) {
62
+ const db = this.collectionManager.db;
63
+ const results = await Promise.all(
64
+ tableNames.map(async (tableName) => {
65
+ let tableInfo;
66
+ if (typeof tableName === "string") {
67
+ tableInfo = { tableName };
68
+ if (db.options.schema) {
69
+ tableInfo.schema = db.options.schema;
70
+ }
71
+ } else {
72
+ tableInfo = tableName;
73
+ }
74
+ try {
75
+ return await this.introspector.getCollection({ tableInfo });
76
+ } catch (e) {
77
+ if (e.message.includes("No description found for")) {
78
+ return null;
79
+ }
80
+ throw e;
81
+ }
82
+ })
83
+ );
84
+ return results.filter(Boolean);
85
+ }
86
+ async loadTables(ctx, tables) {
87
+ const repo = this.collectionManager.db.getRepository("collections");
88
+ const existsCollections = this.collectionManager.db.collections;
89
+ const existsTables = Array.from(existsCollections.values()).map(
90
+ (collection) => collection.model.tableName
91
+ );
92
+ const toAddTables = tables.filter((table) => !existsTables.includes(table));
93
+ if (toAddTables.length) {
94
+ try {
95
+ this.status = "loading";
96
+ const results = await this.tables2Collections(toAddTables);
97
+ const values = results.map((result) => ({
98
+ ...result,
99
+ underscored: false
100
+ }));
101
+ await repo.create({ values, context: ctx });
102
+ } catch (e) {
103
+ throw e;
104
+ } finally {
105
+ this.status = "loaded";
106
+ }
107
+ }
108
+ }
109
+ async getLoadedCollections(filter) {
110
+ const db = this.collectionManager.db;
111
+ const loadedCollections = await db.getRepository("collections").find({
112
+ appends: ["fields"],
113
+ filter: {
114
+ hidden: false,
115
+ ...filter
116
+ }
117
+ });
118
+ const collections = loadedCollections.filter((collection) => {
119
+ var _a;
120
+ return ((_a = collection.options) == null ? void 0 : _a.from) !== "db2cm";
121
+ });
122
+ const loadedData = {};
123
+ for (const collection of collections) {
124
+ const c = db.getCollection(collection.name);
125
+ loadedData[c.tableName()] = {
126
+ ...collection.toJSON(),
127
+ fields: collection.fields.map((field) => {
128
+ const f = c.getField(field.name);
129
+ return {
130
+ columnName: f == null ? void 0 : f.columnName(),
131
+ ...field.toJSON()
132
+ };
133
+ })
134
+ };
135
+ }
136
+ return loadedData;
137
+ }
138
+ async syncFieldsFromDatabase(ctx, collectionNames) {
139
+ let filter = {};
140
+ if (collectionNames == null ? void 0 : collectionNames.length) {
141
+ filter = {
142
+ name: collectionNames
143
+ };
144
+ }
145
+ const db = this.collectionManager.db;
146
+ const loadedCollections = await this.getLoadedCollections(filter);
147
+ const tableNames = Object.values(loadedCollections).map(({ name }) => {
148
+ const collection = db.getCollection(name);
149
+ return collection.getTableNameWithSchema();
150
+ });
151
+ let collections = [];
152
+ try {
153
+ collections = await this.tables2Collections(tableNames);
154
+ } catch (err) {
155
+ ctx.log.error(err);
156
+ }
157
+ const toLoadCollections = this.mergeWithLoadedCollections(collections, loadedCollections);
158
+ for (const values of toLoadCollections) {
159
+ const existsFields = loadedCollections[values.tableName].fields;
160
+ const deletedFields = existsFields.filter((field) => !values.fields.find((f) => f.name === field.name));
161
+ await db.sequelize.transaction(async (transaction) => {
162
+ for (const field of deletedFields) {
163
+ await db.getRepository("fields").destroy({
164
+ filterByTk: field.key,
165
+ context: ctx,
166
+ transaction
167
+ });
168
+ }
169
+ await db.getRepository("collections").update({
170
+ filterByTk: values.name,
171
+ values,
172
+ updateAssociationValues: ["fields"],
173
+ context: ctx,
174
+ transaction
175
+ });
176
+ });
177
+ }
178
+ }
51
179
  };
52
180
  __name(_MainDataSource, "MainDataSource");
53
181
  let MainDataSource = _MainDataSource;
@@ -126,12 +126,7 @@ const traverseJSON = /* @__PURE__ */ __name((data, options) => {
126
126
  include: subInclude
127
127
  });
128
128
  } else if (field.type === "belongsTo") {
129
- result[key] = traverseJSON(data[key], {
130
- collection: collection.db.getCollection(field.target),
131
- // exclude: [field.foreignKey],
132
- include: subInclude,
133
- excludePk: false
134
- });
129
+ result[key] = data[key];
135
130
  } else if (field.type === "belongsToMany") {
136
131
  result[key] = traverseBelongsToMany(data[key], {
137
132
  collection: collection.db.getCollection(field.target),
@@ -82,9 +82,7 @@ const _update_primary_keys_default = class _update_primary_keys_default extends
82
82
  } else {
83
83
  await queryInterface.changeColumn(tableName, "id", {
84
84
  type: import_sequelize.DataTypes.BIGINT,
85
- primaryKey: true,
86
- allowNull: false,
87
- autoIncrement: false
85
+ allowNull: false
88
86
  });
89
87
  }
90
88
  }
@@ -112,6 +112,7 @@ export declare class PluginManager {
112
112
  removeDir?: boolean;
113
113
  force?: boolean;
114
114
  }): Promise<void>;
115
+ pull(urlOrName: string | string[], options?: PluginData, emitStartedEvent?: boolean): Promise<void>;
115
116
  /**
116
117
  * @internal
117
118
  */
@@ -90,7 +90,7 @@ const _PluginManager = class _PluginManager {
90
90
  namespace: "core/pm",
91
91
  directory: (0, import_path.resolve)(__dirname, "../migrations")
92
92
  });
93
- this.app.resourcer.use(import_middleware.uploadMiddleware);
93
+ this.app.resourceManager.use(import_middleware.uploadMiddleware, { tag: "upload", after: "acl" });
94
94
  }
95
95
  /**
96
96
  * @internal
@@ -718,6 +718,41 @@ const _PluginManager = class _PluginManager {
718
718
  await removeDir();
719
719
  }
720
720
  }
721
+ async pull(urlOrName, options, emitStartedEvent = true) {
722
+ if (Array.isArray(urlOrName)) {
723
+ for (const packageName of urlOrName) {
724
+ await this.addViaCLI(packageName, import_lodash.default.omit(options, "name"), false);
725
+ }
726
+ return;
727
+ }
728
+ if ((0, import_utils.isURL)(urlOrName)) {
729
+ await this.addByCompressedFileUrl(
730
+ {
731
+ ...options,
732
+ compressedFileUrl: urlOrName
733
+ },
734
+ emitStartedEvent
735
+ );
736
+ } else if (await import_fs_extra.default.exists(urlOrName)) {
737
+ await this.addByCompressedFileUrl(
738
+ {
739
+ ...options,
740
+ compressedFileUrl: urlOrName
741
+ },
742
+ emitStartedEvent
743
+ );
744
+ } else if (options == null ? void 0 : options.registry) {
745
+ const { name, packageName } = await _PluginManager.parseName(urlOrName);
746
+ options["name"] = name;
747
+ await this.addByNpm(
748
+ {
749
+ ...options,
750
+ packageName
751
+ },
752
+ emitStartedEvent
753
+ );
754
+ }
755
+ }
721
756
  /**
722
757
  * @internal
723
758
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocobase/server",
3
- "version": "2.0.0-alpha.3",
3
+ "version": "2.0.0-alpha.31",
4
4
  "main": "lib/index.js",
5
5
  "types": "./lib/index.d.ts",
6
6
  "license": "AGPL-3.0",
@@ -10,20 +10,20 @@
10
10
  "@koa/cors": "^5.0.0",
11
11
  "@koa/multer": "^3.1.0",
12
12
  "@koa/router": "^13.1.0",
13
- "@nocobase/acl": "2.0.0-alpha.3",
14
- "@nocobase/actions": "2.0.0-alpha.3",
15
- "@nocobase/auth": "2.0.0-alpha.3",
16
- "@nocobase/cache": "2.0.0-alpha.3",
17
- "@nocobase/data-source-manager": "2.0.0-alpha.3",
18
- "@nocobase/database": "2.0.0-alpha.3",
19
- "@nocobase/evaluators": "2.0.0-alpha.3",
20
- "@nocobase/lock-manager": "2.0.0-alpha.3",
21
- "@nocobase/logger": "2.0.0-alpha.3",
22
- "@nocobase/resourcer": "2.0.0-alpha.3",
23
- "@nocobase/sdk": "2.0.0-alpha.3",
24
- "@nocobase/snowflake-id": "2.0.0-alpha.3",
25
- "@nocobase/telemetry": "2.0.0-alpha.3",
26
- "@nocobase/utils": "2.0.0-alpha.3",
13
+ "@nocobase/acl": "2.0.0-alpha.31",
14
+ "@nocobase/actions": "2.0.0-alpha.31",
15
+ "@nocobase/auth": "2.0.0-alpha.31",
16
+ "@nocobase/cache": "2.0.0-alpha.31",
17
+ "@nocobase/data-source-manager": "2.0.0-alpha.31",
18
+ "@nocobase/database": "2.0.0-alpha.31",
19
+ "@nocobase/evaluators": "2.0.0-alpha.31",
20
+ "@nocobase/lock-manager": "2.0.0-alpha.31",
21
+ "@nocobase/logger": "2.0.0-alpha.31",
22
+ "@nocobase/resourcer": "2.0.0-alpha.31",
23
+ "@nocobase/sdk": "2.0.0-alpha.31",
24
+ "@nocobase/snowflake-id": "2.0.0-alpha.31",
25
+ "@nocobase/telemetry": "2.0.0-alpha.31",
26
+ "@nocobase/utils": "2.0.0-alpha.31",
27
27
  "@types/decompress": "4.2.7",
28
28
  "@types/ini": "^1.3.31",
29
29
  "@types/koa-send": "^4.1.3",
@@ -59,5 +59,5 @@
59
59
  "@types/serve-handler": "^6.1.1",
60
60
  "@types/ws": "^8.5.5"
61
61
  },
62
- "gitHead": "8efc23aa78058d871e98a91419f3c4a61762cc15"
62
+ "gitHead": "1ccdc0a8af73f6c2e3e83df75741947a5a8c1984"
63
63
  }