@zhin.js/scaffold-wizard 1.1.1 → 1.1.3
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 +5 -0
- package/lib/apply.d.ts +1 -1
- package/lib/apply.d.ts.map +1 -1
- package/lib/apply.js +7 -0
- package/lib/apply.js.map +1 -1
- package/lib/database-definitions.d.ts +28 -0
- package/lib/database-definitions.d.ts.map +1 -0
- package/lib/database-definitions.js +290 -0
- package/lib/database-definitions.js.map +1 -0
- package/lib/database.d.ts.map +1 -1
- package/lib/database.js +69 -51
- package/lib/database.js.map +1 -1
- package/lib/decisions.d.ts +16 -0
- package/lib/decisions.d.ts.map +1 -0
- package/lib/decisions.js +140 -0
- package/lib/decisions.js.map +1 -0
- package/lib/env.d.ts +6 -0
- package/lib/env.d.ts.map +1 -1
- package/lib/env.js +51 -0
- package/lib/env.js.map +1 -1
- package/lib/index.d.ts +7 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -3
- package/lib/index.js.map +1 -1
- package/lib/types.d.ts +3 -2
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +6 -8
- package/lib/types.js.map +1 -1
- package/lib/zhin-stack-deps.d.ts +8 -7
- package/lib/zhin-stack-deps.d.ts.map +1 -1
- package/lib/zhin-stack-deps.js +15 -10
- package/lib/zhin-stack-deps.js.map +1 -1
- package/package.json +2 -2
- package/src/apply.ts +8 -1
- package/src/database-definitions.ts +336 -0
- package/src/database.ts +77 -52
- package/src/decisions.ts +132 -0
- package/src/env.ts +52 -0
- package/src/index.ts +22 -3
- package/src/stack-versions.generated.json +0 -1
- package/src/types.ts +12 -9
- package/src/zhin-stack-deps.ts +15 -10
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/index.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
export { DATABASE_PACKAGES } from './types.js';
|
|
1
|
+
export { DATABASE_DRIVER_VERSIONS, DATABASE_PACKAGES } from './types.js';
|
|
2
|
+
export { DATABASE_DIALECT_DEFINITIONS, databaseChoiceLabel, getDatabaseDialectDefinition, validateDatabaseConfig, } from './database-definitions.js';
|
|
2
3
|
export { ADAPTERS, findAdapterByPackage, configureAdapters, buildFieldBasedInstanceConfig, generateAdapterEnvVars, collectAdapterPluginConfigs, collectAdapterPluginManifest, getAdapterDependencies, getAdapterSetupNotes, } from './adapter.js';
|
|
3
4
|
export { ADAPTERS_DOCS_URL, ADAPTERS_INDEX_URL, ADAPTERS_ESSENTIALS_URL, adapterDocsUrl, } from './adapter-configurers.js';
|
|
4
5
|
export { configureAI, generateAIEnvVars, generateAIConfigYaml, generateAIConfigJSON, RECOMMENDED_AI_DEFAULTS, } from './ai.js';
|
|
5
6
|
export { configureDatabaseOptions } from './database.js';
|
|
6
|
-
export { formatEnvValue, mergeEnvText, generateDatabaseEnvVars, } from './env.js';
|
|
7
|
+
export { formatEnvValue, mergeEnvText, generateDatabaseEnvExample, generateDatabaseEnvVars, } from './env.js';
|
|
7
8
|
export { AI_STACK_VERSIONS, MCP_SDK_VERSION, getAIDependencies, listAIDependencyNames, formatAIDependencyHint, isAiEnabledInConfig, resolveAgentProviderFromConfig, getRequiredAIDependenciesForConfig, diagnoseAIDependencies, formatAIDependencyFixCommand, packagesNeedingAiStackFix, findOutdatedAiStackInPackageJson, findInstalledAiStackIncompatibilities, ensureDatabaseForAI, ensureDatabaseForAdapters, } from './project-deps.js';
|
|
8
|
-
export { ZHIN_STACK_VERSIONS, DEFAULT_CREATE_BOT_HTTP_PORT,
|
|
9
|
+
export { ZHIN_STACK_VERSIONS, DEFAULT_CREATE_BOT_HTTP_PORT, CREATE_BOT_PACKAGE_MANAGER, getCreateBotBaseDependencies, getCreateBotPnpmWorkspaceConfig, getRequiredZhinDependenciesForConfig, diagnoseZhinStackDependencies, formatZhinStackFixCommand, packagesNeedingZhinStackFix, findOutdatedZhinStackInPackageJson, findInstalledZhinStackIncompatibilities, } from './zhin-stack-deps.js';
|
|
9
10
|
export { SPEECH_PACKAGE, HTML_RENDERER_PACKAGE, ADAPTERS_PREFER_HTML_IMAGE, diagnoseOptionalPeers, formatOptionalPeerFixCommand, getOptionalPeerDependencies, } from './optional-peers.js';
|
|
10
11
|
export { diagnoseUpgradeToL4, getUpgradeToL4Dependencies, } from './upgrade-l4.js';
|
|
11
12
|
export { loadProjectConfig, createProjectConfigPlan, renderProjectConfigPatch, applyProjectConfigPlan, migrateAiLegacyConfig, diagnoseConsoleConfig, applyConsoleConfigFixes, packageToInstanceKey, } from './project-config-plan.js';
|
|
12
13
|
export { applyDatabaseToConfig, applyAdaptersToConfig, applyAIToConfig, appendWizardEnvVars, collectWizardDependencies, collectWizardFeatures, mergeDependenciesIntoPackageJson, mergeFeaturesIntoPackageJson, mergePluginManifestIntoPackageJson, finalizeWizardOptions, applyWizardOptionsToConfig, clonePluginConfigurationMap, materializeDatabaseConfig, buildRuntimeConfigDocument, serializeRuntimeConfig, } from './apply.js';
|
|
14
|
+
export { TYPESAFE_DECISION_PACKAGE, configureTypeSafeDecisions, applyTypeSafeDecisionsToConfig, saveTypeSafeSetupDependencies, diagnoseDecisionConfig, } from './decisions.js';
|
|
13
15
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACnB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AASnC,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,6BAA6B,EAC7B,sBAAsB,EACtB,2BAA2B,EAC3B,4BAA4B,EAC5B,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,EACL,cAAc,EACd,YAAY,EACZ,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,8BAA8B,EAC9B,kCAAkC,EAClC,sBAAsB,EACtB,4BAA4B,EAC5B,yBAAyB,EACzB,gCAAgC,EAChC,qCAAqC,EACrC,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,mBAAmB,EACnB,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,EAC5B,+BAA+B,EAC/B,oCAAoC,EACpC,6BAA6B,EAC7B,yBAAyB,EACzB,2BAA2B,EAC3B,kCAAkC,EAClC,uCAAuC,GACxC,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AASlC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,gCAAgC,EAChC,4BAA4B,EAC5B,kCAAkC,EAClC,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,yBAAyB,EAAE,0BAA0B,EAAE,8BAA8B,EACrF,6BAA6B,EAAE,sBAAsB,GACtD,MAAM,gBAAgB,CAAC"}
|
package/lib/types.d.ts
CHANGED
|
@@ -16,8 +16,9 @@ export interface InitOptions {
|
|
|
16
16
|
devSkills?: boolean;
|
|
17
17
|
}
|
|
18
18
|
export interface DatabaseConfig {
|
|
19
|
-
dialect: 'sqlite' | 'mysql' | 'pg' | 'mongodb' | 'redis';
|
|
19
|
+
dialect: 'sqlite' | 'mysql' | 'pg' | 'mongodb' | 'redis' | 'memory';
|
|
20
20
|
[key: string]: any;
|
|
21
21
|
}
|
|
22
|
-
export declare const DATABASE_PACKAGES: Record<DatabaseConfig[
|
|
22
|
+
export declare const DATABASE_PACKAGES: Readonly<Record<DatabaseConfig["dialect"], string | undefined>>;
|
|
23
|
+
export declare const DATABASE_DRIVER_VERSIONS: Readonly<Record<string, string>>;
|
|
23
24
|
//# sourceMappingURL=types.d.ts.map
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGvD,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,SAAS,GAAG,gBAAgB,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAGD,eAAO,MAAM,iBAAiB,EAExB,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAEtE,eAAO,MAAM,wBAAwB,EAI/B,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC"}
|
package/lib/types.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
redis: 'redis'
|
|
8
|
-
};
|
|
1
|
+
import { DATABASE_DIALECT_DEFINITIONS } from './database-definitions.js';
|
|
2
|
+
// 数据库驱动映射(SQLite / Memory 使用内置实现,无需额外安装)
|
|
3
|
+
export const DATABASE_PACKAGES = Object.freeze(Object.fromEntries(DATABASE_DIALECT_DEFINITIONS.map((definition) => [definition.dialect, definition.driver?.package])));
|
|
4
|
+
export const DATABASE_DRIVER_VERSIONS = Object.freeze(Object.fromEntries(DATABASE_DIALECT_DEFINITIONS.flatMap((definition) => definition.driver
|
|
5
|
+
? [[definition.driver.package, definition.driver.version]]
|
|
6
|
+
: [])));
|
|
9
7
|
//# sourceMappingURL=types.js.map
|
package/lib/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":"AAEA,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAwBzE,yCAAyC;AACzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAC/D,4BAA4B,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CACnG,CAAoE,CAAC;AAEtE,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CACtE,4BAA4B,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM;IACpE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAU,CAAC;IACnE,CAAC,CAAC,EAAE,CAAC,CACR,CAAqC,CAAC"}
|
package/lib/zhin-stack-deps.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type PackageJsonLike } from './project-deps.js';
|
|
2
2
|
/**
|
|
3
|
-
* User project dependency policy: scaffolded
|
|
4
|
-
*
|
|
3
|
+
* User project dependency policy: scaffolded Zhin packages intentionally float to latest.
|
|
4
|
+
* Database drivers use the live-tested ranges declared by the database definitions.
|
|
5
|
+
* WARNING: `latest` is not reproducible; pin Zhin package versions for production.
|
|
5
6
|
*/
|
|
6
7
|
export declare const ZHIN_STACK_VERSIONS: {
|
|
7
8
|
readonly 'zhin.js': "latest";
|
|
@@ -22,7 +23,7 @@ export declare const ZHIN_STACK_VERSIONS: {
|
|
|
22
23
|
readonly '@zhin.js/tool': "latest";
|
|
23
24
|
readonly '@zhin.js/client': "latest";
|
|
24
25
|
readonly '@zhin.js/contract': "latest";
|
|
25
|
-
readonly '@zhin.js/
|
|
26
|
+
readonly '@zhin.js/components': "latest";
|
|
26
27
|
readonly '@zhin.js/speech': "latest";
|
|
27
28
|
readonly '@zhin.js/html-renderer': "latest";
|
|
28
29
|
readonly '@zhin.js/mcp': "latest";
|
|
@@ -50,10 +51,10 @@ export declare const ZHIN_STACK_VERSIONS: {
|
|
|
50
51
|
export type ZhinStackPackage = keyof typeof ZHIN_STACK_VERSIONS;
|
|
51
52
|
/** create-zhin / minimal-bot 默认 Host 端口(避免与常见 8086 占用冲突) */
|
|
52
53
|
export declare const DEFAULT_CREATE_BOT_HTTP_PORT = 8068;
|
|
53
|
-
/** create-zhin
|
|
54
|
-
export declare const
|
|
55
|
-
/** create-zhin 生成项目的 pnpm
|
|
56
|
-
export declare function
|
|
54
|
+
/** create-zhin 生成项目固定使用的 pnpm 版本。 */
|
|
55
|
+
export declare const CREATE_BOT_PACKAGE_MANAGER = "pnpm@11.27.1";
|
|
56
|
+
/** create-zhin 生成项目的 pnpm-workspace.yaml 配置。 */
|
|
57
|
+
export declare function getCreateBotPnpmWorkspaceConfig(): Record<string, unknown>;
|
|
57
58
|
/**
|
|
58
59
|
* create-zhin-app Plugin Runtime 骨架 production 依赖(不含适配器 / AI / 数据库驱动)。
|
|
59
60
|
* Stable Features(adapter/command/component/middleware)由 `@zhin.js/core` 的 `package.json#zhin.features` 继承;创作面 API 经 `zhin.js/*` 便利入口。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zhin-stack-deps.d.ts","sourceRoot":"","sources":["../src/zhin-stack-deps.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsF,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE7I
|
|
1
|
+
{"version":3,"file":"zhin-stack-deps.d.ts","sourceRoot":"","sources":["../src/zhin-stack-deps.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsF,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE7I;;;;GAIG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CtB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,mBAAmB,CAAC;AA0DhE,4DAA4D;AAC5D,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,qCAAqC;AACrC,eAAO,MAAM,0BAA0B,iBAAiB,CAAC;AAEzD,gDAAgD;AAChD,wBAAgB,+BAA+B,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKrE;AAED,oDAAoD;AACpD,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB5G;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,kCAAkC,CAChD,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,EAAE,CAYV;AAED,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,wBAAwB,EAAE,CA0B5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,qBAAqB,EAAE,wBAAwB,EAAE,CAAC;IAClD,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,kBAAkB,GAAG,MAAM,EAAE,CASnF;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,CAAC,EAAE,eAAe,GACpB,kBAAkB,CAkBpB;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAItG"}
|
package/lib/zhin-stack-deps.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
2
|
import fs from 'fs-extra';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
-
import { DATABASE_PACKAGES } from './types.js';
|
|
4
|
+
import { DATABASE_DRIVER_VERSIONS, DATABASE_PACKAGES } from './types.js';
|
|
5
5
|
import { findMissingPackageDependencies, findUnresolvedPackageInstalls, isAiEnabledInConfig } from './project-deps.js';
|
|
6
6
|
/**
|
|
7
|
-
* User project dependency policy: scaffolded
|
|
8
|
-
*
|
|
7
|
+
* User project dependency policy: scaffolded Zhin packages intentionally float to latest.
|
|
8
|
+
* Database drivers use the live-tested ranges declared by the database definitions.
|
|
9
|
+
* WARNING: `latest` is not reproducible; pin Zhin package versions for production.
|
|
9
10
|
*/
|
|
10
11
|
export const ZHIN_STACK_VERSIONS = {
|
|
11
12
|
'zhin.js': 'latest',
|
|
@@ -26,7 +27,7 @@ export const ZHIN_STACK_VERSIONS = {
|
|
|
26
27
|
'@zhin.js/tool': 'latest',
|
|
27
28
|
'@zhin.js/client': 'latest',
|
|
28
29
|
'@zhin.js/contract': 'latest',
|
|
29
|
-
'@zhin.js/
|
|
30
|
+
'@zhin.js/components': 'latest',
|
|
30
31
|
'@zhin.js/speech': 'latest',
|
|
31
32
|
'@zhin.js/html-renderer': 'latest',
|
|
32
33
|
'@zhin.js/mcp': 'latest',
|
|
@@ -109,12 +110,16 @@ function resolveStackVersion(packageName) {
|
|
|
109
110
|
}
|
|
110
111
|
/** create-zhin / minimal-bot 默认 Host 端口(避免与常见 8086 占用冲突) */
|
|
111
112
|
export const DEFAULT_CREATE_BOT_HTTP_PORT = 8068;
|
|
112
|
-
/** create-zhin
|
|
113
|
-
export const
|
|
114
|
-
/** create-zhin 生成项目的 pnpm
|
|
115
|
-
export function
|
|
113
|
+
/** create-zhin 生成项目固定使用的 pnpm 版本。 */
|
|
114
|
+
export const CREATE_BOT_PACKAGE_MANAGER = 'pnpm@11.27.1';
|
|
115
|
+
/** create-zhin 生成项目的 pnpm-workspace.yaml 配置。 */
|
|
116
|
+
export function getCreateBotPnpmWorkspaceConfig() {
|
|
116
117
|
return {
|
|
117
|
-
|
|
118
|
+
packages: ['.', 'plugins/*', 'packages/*'],
|
|
119
|
+
strictPeerDependencies: false,
|
|
120
|
+
allowBuilds: {
|
|
121
|
+
esbuild: true,
|
|
122
|
+
},
|
|
118
123
|
};
|
|
119
124
|
}
|
|
120
125
|
/**
|
|
@@ -138,7 +143,7 @@ export function getRequiredZhinDependenciesForConfig(config) {
|
|
|
138
143
|
const dialect = String(database.dialect ?? '');
|
|
139
144
|
const driver = DATABASE_PACKAGES[dialect];
|
|
140
145
|
if (driver) {
|
|
141
|
-
deps[driver] =
|
|
146
|
+
deps[driver] = DATABASE_DRIVER_VERSIONS[driver];
|
|
142
147
|
}
|
|
143
148
|
}
|
|
144
149
|
return deps;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zhin-stack-deps.js","sourceRoot":"","sources":["../src/zhin-stack-deps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"zhin-stack-deps.js","sourceRoot":"","sources":["../src/zhin-stack-deps.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/scaffold-wizard",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "Shared interactive scaffold wizard for create-zhin-app and @zhin.js/cli",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"inquirer": "^14.0.2",
|
|
23
23
|
"qrcode": "^1.5.4",
|
|
24
24
|
"yaml": "^2.9.0",
|
|
25
|
-
"@zhin.js/plugin-runtime": "1.1.
|
|
25
|
+
"@zhin.js/plugin-runtime": "1.1.12"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/fs-extra": "^11.0.4",
|
package/src/apply.ts
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
} from './adapter.js';
|
|
12
12
|
import { generateAIEnvVars, materializeAIConfig } from './ai.js';
|
|
13
13
|
import { generateDatabaseEnvVars, mergeEnvText } from './env.js';
|
|
14
|
+
import { getDatabaseDialectDefinition } from './database-definitions.js';
|
|
14
15
|
import { ensureDatabaseForAdapters, ensureDatabaseForAI, getAIDependencies } from './project-deps.js';
|
|
15
16
|
import { DEFAULT_CREATE_BOT_HTTP_PORT, ZHIN_STACK_VERSIONS } from './zhin-stack-deps.js';
|
|
16
17
|
|
|
@@ -141,10 +142,14 @@ export async function appendWizardEnvVars(
|
|
|
141
142
|
}
|
|
142
143
|
|
|
143
144
|
export function collectWizardDependencies(
|
|
144
|
-
options: Pick<InitOptions, 'adapters' | 'ai'>,
|
|
145
|
+
options: Pick<InitOptions, 'adapters' | 'ai' | 'database'>,
|
|
145
146
|
): Record<string, string> {
|
|
147
|
+
const databaseDriver = options.database
|
|
148
|
+
? getDatabaseDialectDefinition(options.database.dialect)?.driver
|
|
149
|
+
: undefined;
|
|
146
150
|
return {
|
|
147
151
|
...(options.adapters ? getAdapterDependencies(options.adapters) : {}),
|
|
152
|
+
...(databaseDriver ? { [databaseDriver.package]: databaseDriver.version } : {}),
|
|
148
153
|
...getAIDependencies(options.ai),
|
|
149
154
|
// AI authoring conventions(与 create-zhin 路径对齐)
|
|
150
155
|
...(options.ai?.enabled ? {
|
|
@@ -260,6 +265,8 @@ export function materializeDatabaseConfig(config: DatabaseConfig): Record<string
|
|
|
260
265
|
password: '${REDIS_PASSWORD}',
|
|
261
266
|
database: '${REDIS_DB}',
|
|
262
267
|
};
|
|
268
|
+
case 'memory':
|
|
269
|
+
return { dialect: 'memory' };
|
|
263
270
|
case 'sqlite':
|
|
264
271
|
default: {
|
|
265
272
|
const sqlite: Record<string, unknown> = { dialect: 'sqlite' };
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import type { DatabaseConfig } from './types.js';
|
|
2
|
+
|
|
3
|
+
export type DatabaseDialect = DatabaseConfig['dialect'];
|
|
4
|
+
|
|
5
|
+
export interface DatabaseDriverDefinition {
|
|
6
|
+
readonly package: string;
|
|
7
|
+
readonly version: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface DatabaseDialectDefinition {
|
|
11
|
+
readonly dialect: DatabaseDialect;
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly description: string;
|
|
14
|
+
/** Concrete service version covered by the repository's live acceptance tests. */
|
|
15
|
+
readonly verifiedServer: string;
|
|
16
|
+
readonly driver?: DatabaseDriverDefinition;
|
|
17
|
+
readonly schema: Readonly<Record<string, unknown>>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
type SchemaIssueKind = 'env_missing' | 'invalid';
|
|
21
|
+
|
|
22
|
+
export interface DatabaseSchemaIssue {
|
|
23
|
+
readonly kind: SchemaIssueKind;
|
|
24
|
+
readonly path: string;
|
|
25
|
+
readonly message: string;
|
|
26
|
+
readonly envKey?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const text = (defaultValue?: string, extras: Record<string, unknown> = {}) => ({
|
|
30
|
+
type: 'string',
|
|
31
|
+
minLength: 1,
|
|
32
|
+
...(defaultValue === undefined ? {} : { default: defaultValue }),
|
|
33
|
+
...extras,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const port = (defaultValue: number) => ({
|
|
37
|
+
type: 'integer',
|
|
38
|
+
minimum: 1,
|
|
39
|
+
maximum: 65535,
|
|
40
|
+
default: defaultValue,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
export const DATABASE_DIALECT_DEFINITIONS: readonly DatabaseDialectDefinition[] = Object.freeze([
|
|
44
|
+
{
|
|
45
|
+
dialect: 'sqlite',
|
|
46
|
+
name: 'SQLite',
|
|
47
|
+
description: '推荐,零配置,适合单机 Bot',
|
|
48
|
+
verifiedServer: 'Node.js 内置 node:sqlite(Node.js 22.5+)',
|
|
49
|
+
schema: {
|
|
50
|
+
type: 'object',
|
|
51
|
+
additionalProperties: true,
|
|
52
|
+
required: ['dialect'],
|
|
53
|
+
properties: {
|
|
54
|
+
dialect: { const: 'sqlite' },
|
|
55
|
+
filename: text('./data/bot.db'),
|
|
56
|
+
mode: { type: 'string', enum: ['wal', 'delete', 'memory'], default: 'wal' },
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
dialect: 'mysql',
|
|
62
|
+
name: 'MySQL',
|
|
63
|
+
description: '关系型数据库',
|
|
64
|
+
verifiedServer: 'MySQL 8.4 LTS',
|
|
65
|
+
driver: { package: 'mysql2', version: '^3.23.2' },
|
|
66
|
+
schema: {
|
|
67
|
+
type: 'object',
|
|
68
|
+
additionalProperties: true,
|
|
69
|
+
required: ['dialect'],
|
|
70
|
+
properties: {
|
|
71
|
+
dialect: { const: 'mysql' },
|
|
72
|
+
host: text('127.0.0.1'),
|
|
73
|
+
port: port(3306),
|
|
74
|
+
user: text('root'),
|
|
75
|
+
password: { type: 'string' },
|
|
76
|
+
database: text('zhin_bot'),
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
dialect: 'pg',
|
|
82
|
+
name: 'PostgreSQL',
|
|
83
|
+
description: '关系型数据库,方言名为 pg',
|
|
84
|
+
verifiedServer: 'PostgreSQL 17',
|
|
85
|
+
driver: { package: 'pg', version: '^8.22.0' },
|
|
86
|
+
schema: {
|
|
87
|
+
type: 'object',
|
|
88
|
+
additionalProperties: true,
|
|
89
|
+
required: ['dialect'],
|
|
90
|
+
properties: {
|
|
91
|
+
dialect: { const: 'pg' },
|
|
92
|
+
host: text('127.0.0.1'),
|
|
93
|
+
port: port(5432),
|
|
94
|
+
user: text('postgres'),
|
|
95
|
+
password: { type: 'string' },
|
|
96
|
+
database: text('zhin_bot'),
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
dialect: 'mongodb',
|
|
102
|
+
name: 'MongoDB',
|
|
103
|
+
description: '文档数据库',
|
|
104
|
+
verifiedServer: 'MongoDB 8',
|
|
105
|
+
driver: { package: 'mongodb', version: '^7.5.0' },
|
|
106
|
+
schema: {
|
|
107
|
+
type: 'object',
|
|
108
|
+
additionalProperties: true,
|
|
109
|
+
required: ['dialect', 'url', 'dbName'],
|
|
110
|
+
properties: {
|
|
111
|
+
dialect: { const: 'mongodb' },
|
|
112
|
+
url: text('mongodb://127.0.0.1:27017', { pattern: '^mongodb(?:\\+srv)?://' }),
|
|
113
|
+
dbName: text('zhin_bot'),
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
dialect: 'redis',
|
|
119
|
+
name: 'Redis',
|
|
120
|
+
description: '键值数据库',
|
|
121
|
+
verifiedServer: 'Redis 8',
|
|
122
|
+
driver: { package: 'redis', version: '^6.1.0' },
|
|
123
|
+
schema: {
|
|
124
|
+
type: 'object',
|
|
125
|
+
additionalProperties: true,
|
|
126
|
+
required: ['dialect'],
|
|
127
|
+
properties: {
|
|
128
|
+
dialect: { const: 'redis' },
|
|
129
|
+
socket: {
|
|
130
|
+
type: 'object',
|
|
131
|
+
additionalProperties: true,
|
|
132
|
+
required: ['host', 'port'],
|
|
133
|
+
properties: {
|
|
134
|
+
host: text('127.0.0.1'),
|
|
135
|
+
port: port(6379),
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
password: { type: 'string' },
|
|
139
|
+
database: { type: 'integer', minimum: 0, default: 0 },
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
dialect: 'memory',
|
|
145
|
+
name: 'Memory',
|
|
146
|
+
description: '仅进程内,适合测试,不持久化',
|
|
147
|
+
verifiedServer: 'Zhin 内置实现',
|
|
148
|
+
schema: {
|
|
149
|
+
type: 'object',
|
|
150
|
+
additionalProperties: false,
|
|
151
|
+
required: ['dialect'],
|
|
152
|
+
properties: { dialect: { const: 'memory' } },
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
]);
|
|
156
|
+
|
|
157
|
+
const definitions = new Map(DATABASE_DIALECT_DEFINITIONS.map((definition) => [definition.dialect, definition]));
|
|
158
|
+
|
|
159
|
+
export function getDatabaseDialectDefinition(dialect: string): DatabaseDialectDefinition | undefined {
|
|
160
|
+
return definitions.get(dialect as DatabaseDialect);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function databaseChoiceLabel(definition: DatabaseDialectDefinition): string {
|
|
164
|
+
const driver = definition.driver
|
|
165
|
+
? `;驱动 ${definition.driver.package} ${definition.driver.version}`
|
|
166
|
+
: '';
|
|
167
|
+
return `${definition.name}(${definition.description};当前支持/实机验证 ${definition.verifiedServer}${driver})`;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function expandEnvReferences(
|
|
171
|
+
input: string,
|
|
172
|
+
path: string,
|
|
173
|
+
env: Readonly<Record<string, string | undefined>>,
|
|
174
|
+
issues: DatabaseSchemaIssue[],
|
|
175
|
+
): string {
|
|
176
|
+
let output = '';
|
|
177
|
+
let index = 0;
|
|
178
|
+
while (index < input.length) {
|
|
179
|
+
const start = input.indexOf('${', index);
|
|
180
|
+
if (start < 0) break;
|
|
181
|
+
let cursor = start + 2;
|
|
182
|
+
const first = input[cursor];
|
|
183
|
+
if (first === undefined || !isEnvKeyStart(first)) {
|
|
184
|
+
output += input.slice(index, start + 1);
|
|
185
|
+
index = start + 1;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
cursor += 1;
|
|
189
|
+
while (cursor < input.length && isEnvKeyCharacter(input[cursor]!)) cursor += 1;
|
|
190
|
+
const key = input.slice(start + 2, cursor);
|
|
191
|
+
let fallback: string | undefined;
|
|
192
|
+
if (input[cursor] === ':' && (input[cursor + 1] === '-' || input[cursor + 1] === '=')) {
|
|
193
|
+
const close = input.indexOf('}', cursor + 2);
|
|
194
|
+
if (close < 0) {
|
|
195
|
+
output += input.slice(index, start + 1);
|
|
196
|
+
index = start + 1;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
fallback = input.slice(cursor + 2, close);
|
|
200
|
+
cursor = close;
|
|
201
|
+
}
|
|
202
|
+
if (input[cursor] !== '}') {
|
|
203
|
+
output += input.slice(index, start + 1);
|
|
204
|
+
index = start + 1;
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
output += input.slice(index, start);
|
|
208
|
+
const resolved = env[key];
|
|
209
|
+
if ((resolved === undefined || resolved === '') && fallback !== undefined) {
|
|
210
|
+
output += fallback;
|
|
211
|
+
} else if (resolved === undefined) {
|
|
212
|
+
issues.push({
|
|
213
|
+
kind: 'env_missing',
|
|
214
|
+
path,
|
|
215
|
+
envKey: key,
|
|
216
|
+
message: `环境变量 ${key} 未设置(${path})`,
|
|
217
|
+
});
|
|
218
|
+
} else {
|
|
219
|
+
output += resolved;
|
|
220
|
+
}
|
|
221
|
+
index = cursor + 1;
|
|
222
|
+
}
|
|
223
|
+
return output + input.slice(index);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function isEnvKeyStart(character: string): boolean {
|
|
227
|
+
return (character >= 'A' && character <= 'Z')
|
|
228
|
+
|| (character >= 'a' && character <= 'z')
|
|
229
|
+
|| character === '_';
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function isEnvKeyCharacter(character: string): boolean {
|
|
233
|
+
return isEnvKeyStart(character) || (character >= '0' && character <= '9');
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function validateValue(
|
|
237
|
+
schema: Record<string, unknown>,
|
|
238
|
+
rawValue: unknown,
|
|
239
|
+
path: string,
|
|
240
|
+
env: Readonly<Record<string, string | undefined>>,
|
|
241
|
+
issues: DatabaseSchemaIssue[],
|
|
242
|
+
): void {
|
|
243
|
+
let value = rawValue;
|
|
244
|
+
if (typeof value === 'string') {
|
|
245
|
+
const before = issues.length;
|
|
246
|
+
value = expandEnvReferences(value, path, env, issues);
|
|
247
|
+
if (issues.length > before) return;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if ('const' in schema && value !== schema.const) {
|
|
251
|
+
issues.push({ kind: 'invalid', path, message: `${path} 必须是 ${JSON.stringify(schema.const)}` });
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
const type = schema.type;
|
|
255
|
+
if (type === 'object') {
|
|
256
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
257
|
+
issues.push({ kind: 'invalid', path, message: `${path} 必须是对象` });
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const record = value as Record<string, unknown>;
|
|
261
|
+
const properties = (schema.properties ?? {}) as Record<string, Record<string, unknown>>;
|
|
262
|
+
if (schema.additionalProperties === false) {
|
|
263
|
+
for (const key of Object.keys(record)) {
|
|
264
|
+
if (!(key in properties)) {
|
|
265
|
+
issues.push({ kind: 'invalid', path: `${path}.${key}`, message: `${path}.${key} 不是受支持的配置项` });
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
for (const required of (schema.required ?? []) as string[]) {
|
|
270
|
+
if (!(required in record) || record[required] === undefined || record[required] === null) {
|
|
271
|
+
issues.push({ kind: 'invalid', path: `${path}.${required}`, message: `${path}.${required} 不能为空` });
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
for (const [key, propertySchema] of Object.entries(properties)) {
|
|
275
|
+
if (record[key] !== undefined) validateValue(propertySchema, record[key], `${path}.${key}`, env, issues);
|
|
276
|
+
}
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
if (type === 'string') {
|
|
280
|
+
if (typeof value !== 'string') {
|
|
281
|
+
issues.push({ kind: 'invalid', path, message: `${path} 必须是字符串` });
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (typeof schema.minLength === 'number' && value.length < schema.minLength) {
|
|
285
|
+
issues.push({ kind: 'invalid', path, message: `${path} 不能为空` });
|
|
286
|
+
}
|
|
287
|
+
if (typeof schema.pattern === 'string' && !new RegExp(schema.pattern, 'u').test(value)) {
|
|
288
|
+
issues.push({ kind: 'invalid', path, message: `${path} 格式无效` });
|
|
289
|
+
}
|
|
290
|
+
if (Array.isArray(schema.enum) && !schema.enum.includes(value)) {
|
|
291
|
+
issues.push({ kind: 'invalid', path, message: `${path} 必须是 ${schema.enum.join('、')} 之一` });
|
|
292
|
+
}
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
if (type === 'integer') {
|
|
296
|
+
const numeric = typeof value === 'number'
|
|
297
|
+
? value
|
|
298
|
+
: typeof value === 'string' && /^\d+$/u.test(value.trim())
|
|
299
|
+
? Number(value.trim())
|
|
300
|
+
: Number.NaN;
|
|
301
|
+
if (!Number.isInteger(numeric)) {
|
|
302
|
+
issues.push({ kind: 'invalid', path, message: `${path} 必须是整数` });
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (typeof schema.minimum === 'number' && numeric < schema.minimum) {
|
|
306
|
+
issues.push({ kind: 'invalid', path, message: `${path} 不能小于 ${schema.minimum}` });
|
|
307
|
+
}
|
|
308
|
+
if (typeof schema.maximum === 'number' && numeric > schema.maximum) {
|
|
309
|
+
issues.push({ kind: 'invalid', path, message: `${path} 不能大于 ${schema.maximum}` });
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export function validateDatabaseConfig(
|
|
315
|
+
config: unknown,
|
|
316
|
+
env: Readonly<Record<string, string | undefined>> = {},
|
|
317
|
+
): readonly DatabaseSchemaIssue[] {
|
|
318
|
+
if (!config || typeof config !== 'object' || Array.isArray(config)) {
|
|
319
|
+
return [{ kind: 'invalid', path: 'database', message: 'database 必须是对象' }];
|
|
320
|
+
}
|
|
321
|
+
const dialect = (config as Record<string, unknown>).dialect;
|
|
322
|
+
if (typeof dialect !== 'string') {
|
|
323
|
+
return [{ kind: 'invalid', path: 'database.dialect', message: 'database.dialect 不能为空' }];
|
|
324
|
+
}
|
|
325
|
+
const definition = getDatabaseDialectDefinition(dialect);
|
|
326
|
+
if (!definition) {
|
|
327
|
+
return [{
|
|
328
|
+
kind: 'invalid',
|
|
329
|
+
path: 'database.dialect',
|
|
330
|
+
message: `不支持的数据库方言 ${JSON.stringify(dialect)}`,
|
|
331
|
+
}];
|
|
332
|
+
}
|
|
333
|
+
const issues: DatabaseSchemaIssue[] = [];
|
|
334
|
+
validateValue(definition.schema as Record<string, unknown>, config, 'database', env, issues);
|
|
335
|
+
return Object.freeze(issues);
|
|
336
|
+
}
|