@nocobase/cli 2.2.0-beta.7 → 2.2.0-beta.9

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 (34) hide show
  1. package/assets/env-proxy/nginx/app.conf.tpl +23 -0
  2. package/assets/env-proxy/nginx/nocobase.conf.tpl +5 -0
  3. package/assets/env-proxy/nginx/snippets/dist-location.conf +5 -0
  4. package/assets/env-proxy/nginx/snippets/gzip.conf +17 -0
  5. package/assets/env-proxy/nginx/snippets/log-format-http.conf +13 -0
  6. package/assets/env-proxy/nginx/snippets/maps-http.conf +14 -0
  7. package/assets/env-proxy/nginx/snippets/mime-types.conf +98 -0
  8. package/assets/env-proxy/nginx/snippets/proxy-location.conf +18 -0
  9. package/assets/env-proxy/nginx/snippets/spa-location.conf +6 -0
  10. package/assets/env-proxy/nginx/snippets/uploads-location.conf +21 -0
  11. package/dist/commands/app/start.js +4 -1
  12. package/dist/commands/install.js +53 -138
  13. package/dist/commands/proxy/caddy/generate.js +93 -7
  14. package/dist/commands/proxy/nginx/generate.js +98 -7
  15. package/dist/commands/revision/create.js +1 -1
  16. package/dist/commands/self/update.js +2 -2
  17. package/dist/commands/source/download.js +16 -12
  18. package/dist/lib/app-managed-resources.js +3 -4
  19. package/dist/lib/auth-store.js +82 -6
  20. package/dist/lib/cli-config.js +71 -1
  21. package/dist/lib/docker-image.js +94 -6
  22. package/dist/lib/env-auth.js +291 -45
  23. package/dist/lib/env-config.js +5 -0
  24. package/dist/lib/env-proxy-config.js +48 -0
  25. package/dist/lib/env-proxy.js +164 -58
  26. package/dist/lib/prompt-validators.js +1 -1
  27. package/dist/lib/proxy-caddy.js +77 -9
  28. package/dist/lib/proxy-nginx.js +71 -11
  29. package/dist/lib/run-npm.js +4 -0
  30. package/dist/lib/self-manager.js +251 -46
  31. package/dist/lib/startup-update.js +1 -1
  32. package/dist/locale/en-US.json +2 -2
  33. package/dist/locale/zh-CN.json +2 -2
  34. package/package.json +3 -2
@@ -9,6 +9,7 @@
9
9
  import { loadExactAuthConfig, saveAuthConfig } from './auth-store.js';
10
10
  import { resolveCliHomeRoot, resolveDefaultConfigScope } from './cli-home.js';
11
11
  import { CLI_LOCALE_FLAG_OPTIONS, normalizeCliLocale, resolveCliLocale } from './cli-locale.js';
12
+ import { DEFAULT_NB_IMAGE_REGISTRY, DEFAULT_NB_IMAGE_VARIANT, NB_IMAGE_REGISTRY_OPTIONS, NB_IMAGE_VARIANT_OPTIONS, normalizeNbImageRegistry, normalizeNbImageVariant, } from './docker-image.js';
12
13
  export const DEFAULT_LICENSE_PKG_URL = 'https://pkg.nocobase.com/';
13
14
  export const DEFAULT_DOCKER_NETWORK = 'nocobase';
14
15
  export const DEFAULT_DOCKER_CONTAINER_PREFIX = 'nb';
@@ -16,6 +17,7 @@ export const DEFAULT_DOCKER_BIN = 'docker';
16
17
  export const DEFAULT_CADDY_BIN = 'caddy';
17
18
  export const DEFAULT_GIT_BIN = 'git';
18
19
  export const DEFAULT_NGINX_BIN = 'nginx';
20
+ export const DEFAULT_PNPM_BIN = 'pnpm';
19
21
  export const PROXY_PROVIDER_OPTIONS = ['nginx', 'caddy'];
20
22
  export const DEFAULT_PROXY_PROVIDER = 'nginx';
21
23
  export const NGINX_PROXY_DRIVER_OPTIONS = ['local', 'docker'];
@@ -36,10 +38,13 @@ export const SUPPORTED_CLI_CONFIG_KEYS = [
36
38
  'license.pkg-url',
37
39
  'docker.network',
38
40
  'docker.container-prefix',
41
+ 'nb-image-registry',
42
+ 'nb-image-variant',
39
43
  'bin.docker',
40
44
  'bin.caddy',
41
45
  'bin.git',
42
46
  'bin.nginx',
47
+ 'bin.pnpm',
43
48
  'proxy.nb-cli-root',
44
49
  'proxy.caddy-driver',
45
50
  'proxy.nginx-driver',
@@ -127,7 +132,11 @@ function pruneSettings(config) {
127
132
  delete config.settings?.license;
128
133
  }
129
134
  const docker = config.settings?.docker;
130
- if (docker && !trimValue(docker.network) && !trimValue(docker.containerPrefix)) {
135
+ if (docker &&
136
+ !trimValue(docker.network) &&
137
+ !trimValue(docker.containerPrefix) &&
138
+ !trimValue(docker.nbImageRegistry) &&
139
+ !trimValue(docker.nbImageVariant)) {
131
140
  delete config.settings?.docker;
132
141
  }
133
142
  const bin = config.settings?.bin;
@@ -136,6 +145,7 @@ function pruneSettings(config) {
136
145
  !trimValue(bin.caddy) &&
137
146
  !trimValue(bin.git) &&
138
147
  !trimValue(bin.nginx) &&
148
+ !trimValue(bin.pnpm) &&
139
149
  !trimValue(bin.yarn)) {
140
150
  delete config.settings?.bin;
141
151
  }
@@ -179,6 +189,10 @@ export function getExplicitCliConfigValue(config, key) {
179
189
  return trimValue(config.settings?.docker?.network);
180
190
  case 'docker.container-prefix':
181
191
  return trimValue(config.settings?.docker?.containerPrefix);
192
+ case 'nb-image-registry':
193
+ return normalizeNbImageRegistry(config.settings?.docker?.nbImageRegistry);
194
+ case 'nb-image-variant':
195
+ return normalizeNbImageVariant(config.settings?.docker?.nbImageVariant);
182
196
  case 'bin.docker':
183
197
  return trimValue(config.settings?.bin?.docker);
184
198
  case 'bin.caddy':
@@ -187,6 +201,8 @@ export function getExplicitCliConfigValue(config, key) {
187
201
  return trimValue(config.settings?.bin?.git);
188
202
  case 'bin.nginx':
189
203
  return trimValue(config.settings?.bin?.nginx);
204
+ case 'bin.pnpm':
205
+ return trimValue(config.settings?.bin?.pnpm);
190
206
  case 'proxy.nb-cli-root':
191
207
  return trimValue(config.settings?.proxy?.nbCliRoot);
192
208
  case 'proxy.caddy-driver':
@@ -225,6 +241,10 @@ export function getEffectiveCliConfigValue(config, key) {
225
241
  return trimValue(config.name) || DEFAULT_DOCKER_NETWORK;
226
242
  case 'docker.container-prefix':
227
243
  return trimValue(config.name) || DEFAULT_DOCKER_CONTAINER_PREFIX;
244
+ case 'nb-image-registry':
245
+ return explicit ?? DEFAULT_NB_IMAGE_REGISTRY;
246
+ case 'nb-image-variant':
247
+ return explicit ?? DEFAULT_NB_IMAGE_VARIANT;
228
248
  case 'bin.docker':
229
249
  return DEFAULT_DOCKER_BIN;
230
250
  case 'bin.caddy':
@@ -233,6 +253,8 @@ export function getEffectiveCliConfigValue(config, key) {
233
253
  return DEFAULT_GIT_BIN;
234
254
  case 'bin.nginx':
235
255
  return DEFAULT_NGINX_BIN;
256
+ case 'bin.pnpm':
257
+ return DEFAULT_PNPM_BIN;
236
258
  case 'proxy.nb-cli-root':
237
259
  return explicit ?? resolveCliHomeRoot();
238
260
  case 'proxy.caddy-driver':
@@ -298,6 +320,20 @@ export function normalizeCliConfigValue(key, value) {
298
320
  }
299
321
  return driver;
300
322
  }
323
+ if (key === 'nb-image-registry') {
324
+ const registry = normalizeNbImageRegistry(normalized);
325
+ if (!registry) {
326
+ throw new Error(`Config key "${key}" must be one of: ${NB_IMAGE_REGISTRY_OPTIONS.join(', ')}`);
327
+ }
328
+ return registry;
329
+ }
330
+ if (key === 'nb-image-variant') {
331
+ const variant = normalizeNbImageVariant(normalized);
332
+ if (!variant) {
333
+ throw new Error(`Config key "${key}" must be one of: ${NB_IMAGE_VARIANT_OPTIONS.join(', ')}`);
334
+ }
335
+ return variant;
336
+ }
301
337
  return normalized;
302
338
  }
303
339
  export async function loadCliConfig(options = {}) {
@@ -363,6 +399,18 @@ export async function setCliConfigValue(key, value, options = {}) {
363
399
  containerPrefix: normalized,
364
400
  };
365
401
  break;
402
+ case 'nb-image-registry':
403
+ config.settings.docker = {
404
+ ...(config.settings.docker ?? {}),
405
+ nbImageRegistry: normalized,
406
+ };
407
+ break;
408
+ case 'nb-image-variant':
409
+ config.settings.docker = {
410
+ ...(config.settings.docker ?? {}),
411
+ nbImageVariant: normalized,
412
+ };
413
+ break;
366
414
  case 'bin.docker':
367
415
  config.settings.bin = {
368
416
  ...(config.settings.bin ?? {}),
@@ -387,6 +435,12 @@ export async function setCliConfigValue(key, value, options = {}) {
387
435
  nginx: normalized,
388
436
  };
389
437
  break;
438
+ case 'bin.pnpm':
439
+ config.settings.bin = {
440
+ ...(config.settings.bin ?? {}),
441
+ pnpm: normalized,
442
+ };
443
+ break;
390
444
  case 'proxy.nb-cli-root':
391
445
  config.settings.proxy = {
392
446
  ...(config.settings.proxy ?? {}),
@@ -476,6 +530,16 @@ export async function deleteCliConfigValue(key, options = {}) {
476
530
  delete config.settings.docker.containerPrefix;
477
531
  }
478
532
  break;
533
+ case 'nb-image-registry':
534
+ if (config.settings.docker) {
535
+ delete config.settings.docker.nbImageRegistry;
536
+ }
537
+ break;
538
+ case 'nb-image-variant':
539
+ if (config.settings.docker) {
540
+ delete config.settings.docker.nbImageVariant;
541
+ }
542
+ break;
479
543
  case 'bin.docker':
480
544
  if (config.settings.bin) {
481
545
  delete config.settings.bin.docker;
@@ -496,6 +560,11 @@ export async function deleteCliConfigValue(key, options = {}) {
496
560
  delete config.settings.bin.nginx;
497
561
  }
498
562
  break;
563
+ case 'bin.pnpm':
564
+ if (config.settings.bin) {
565
+ delete config.settings.bin.pnpm;
566
+ }
567
+ break;
499
568
  case 'proxy.nb-cli-root':
500
569
  if (config.settings.proxy) {
501
570
  delete config.settings.proxy.nbCliRoot;
@@ -556,6 +625,7 @@ const CONFIGURABLE_COMMAND_KEYS = {
556
625
  caddy: 'bin.caddy',
557
626
  git: 'bin.git',
558
627
  nginx: 'bin.nginx',
628
+ pnpm: 'bin.pnpm',
559
629
  yarn: 'bin.yarn',
560
630
  };
561
631
  export function isConfigurableCommandName(value) {
@@ -9,7 +9,30 @@
9
9
  export const DEFAULT_DOCKER_REGISTRY = 'nocobase/nocobase';
10
10
  export const DEFAULT_DOCKER_REGISTRY_ZH_CN = 'registry.cn-shanghai.aliyuncs.com/nocobase/nocobase';
11
11
  export const DEFAULT_DOCKER_VERSION = 'alpha';
12
+ export const NB_IMAGE_REGISTRY_OPTIONS = ['dockerhub', 'aliyun'];
13
+ export const DEFAULT_NB_IMAGE_REGISTRY = 'dockerhub';
14
+ export const NB_IMAGE_VARIANT_OPTIONS = ['standard', 'no-nginx', 'full', 'full-no-nginx'];
15
+ export const DEFAULT_NB_IMAGE_VARIANT = 'full';
12
16
  export const DOCKER_IMAGE_FULL_SUFFIX = '-full';
17
+ export const DOCKER_IMAGE_NO_NGINX_SUFFIX = '-no-nginx';
18
+ export const DOCKER_IMAGE_FULL_NO_NGINX_SUFFIX = '-full-no-nginx';
19
+ export const DEFAULT_KINGBASE_IMAGE = 'registry.cn-shanghai.aliyuncs.com/nocobase/kingbase:v009r001c001b0030_single_x86';
20
+ const OFFICIAL_DOCKER_REGISTRY_REPOSITORIES = {
21
+ dockerhub: DEFAULT_DOCKER_REGISTRY,
22
+ aliyun: DEFAULT_DOCKER_REGISTRY_ZH_CN,
23
+ };
24
+ const DEFAULT_BUILTIN_DB_IMAGES = {
25
+ postgres: 'postgres:16',
26
+ mysql: 'mysql:8',
27
+ mariadb: 'mariadb:11',
28
+ kingbase: DEFAULT_KINGBASE_IMAGE,
29
+ };
30
+ const ALIYUN_BUILTIN_DB_IMAGES = {
31
+ postgres: 'registry.cn-shanghai.aliyuncs.com/nocobase/postgres:16',
32
+ mysql: 'registry.cn-shanghai.aliyuncs.com/nocobase/mysql:8',
33
+ mariadb: 'registry.cn-shanghai.aliyuncs.com/nocobase/mariadb:11',
34
+ kingbase: DEFAULT_KINGBASE_IMAGE,
35
+ };
13
36
  const OFFICIAL_FULL_IMAGE_REGISTRIES = new Set([
14
37
  DEFAULT_DOCKER_REGISTRY,
15
38
  DEFAULT_DOCKER_REGISTRY_ZH_CN,
@@ -17,21 +40,86 @@ const OFFICIAL_FULL_IMAGE_REGISTRIES = new Set([
17
40
  function trimValue(value) {
18
41
  return String(value ?? '').trim();
19
42
  }
43
+ export function normalizeNbImageRegistry(value) {
44
+ const normalized = trimValue(value);
45
+ if (!normalized) {
46
+ return undefined;
47
+ }
48
+ return NB_IMAGE_REGISTRY_OPTIONS.includes(normalized)
49
+ ? normalized
50
+ : undefined;
51
+ }
52
+ export function normalizeNbImageVariant(value) {
53
+ const normalized = trimValue(value);
54
+ if (!normalized) {
55
+ return undefined;
56
+ }
57
+ return NB_IMAGE_VARIANT_OPTIONS.includes(normalized)
58
+ ? normalized
59
+ : undefined;
60
+ }
61
+ export function resolveOfficialDockerRegistry(value) {
62
+ const registry = normalizeNbImageRegistry(value) ?? DEFAULT_NB_IMAGE_REGISTRY;
63
+ return OFFICIAL_DOCKER_REGISTRY_REPOSITORIES[registry];
64
+ }
65
+ export function inferNbImageRegistryFromRepository(value) {
66
+ const repository = trimValue(value);
67
+ return Object.entries(OFFICIAL_DOCKER_REGISTRY_REPOSITORIES).find(([, candidate]) => candidate === repository)?.[0];
68
+ }
69
+ function hasKnownVariantSuffix(tag) {
70
+ return (tag.endsWith(DOCKER_IMAGE_FULL_NO_NGINX_SUFFIX) ||
71
+ tag.endsWith(DOCKER_IMAGE_NO_NGINX_SUFFIX) ||
72
+ tag.endsWith(DOCKER_IMAGE_FULL_SUFFIX));
73
+ }
20
74
  export function shouldUseFullDockerImageTag(registry) {
21
75
  return OFFICIAL_FULL_IMAGE_REGISTRIES.has(trimValue(registry));
22
76
  }
23
- export function normalizeDockerImageTag(registry, version) {
77
+ export function normalizeDockerImageTag(registry, version, options) {
24
78
  const tag = trimValue(version) || DEFAULT_DOCKER_VERSION;
25
- if (!shouldUseFullDockerImageTag(registry)) {
79
+ if (hasKnownVariantSuffix(tag)) {
26
80
  return tag;
27
81
  }
28
- return tag.endsWith(DOCKER_IMAGE_FULL_SUFFIX)
29
- ? tag
30
- : `${tag}${DOCKER_IMAGE_FULL_SUFFIX}`;
82
+ const explicitVariant = normalizeNbImageVariant(options?.variant) ?? normalizeNbImageVariant(options?.defaultVariant);
83
+ const inferredVariant = shouldUseFullDockerImageTag(registry) ? DEFAULT_NB_IMAGE_VARIANT : 'standard';
84
+ const variant = explicitVariant ?? inferredVariant;
85
+ switch (variant) {
86
+ case 'standard':
87
+ return tag;
88
+ case 'no-nginx':
89
+ return `${tag}${DOCKER_IMAGE_NO_NGINX_SUFFIX}`;
90
+ case 'full':
91
+ return `${tag}${DOCKER_IMAGE_FULL_SUFFIX}`;
92
+ case 'full-no-nginx':
93
+ return `${tag}${DOCKER_IMAGE_FULL_NO_NGINX_SUFFIX}`;
94
+ }
31
95
  }
32
96
  export function resolveDockerImageRef(registry, version, options) {
33
97
  const resolvedRegistry = trimValue(registry) || options?.defaultRegistry || DEFAULT_DOCKER_REGISTRY;
34
98
  const rawVersion = trimValue(version) || options?.defaultVersion || DEFAULT_DOCKER_VERSION;
35
- const normalizedTag = normalizeDockerImageTag(resolvedRegistry, rawVersion);
99
+ const normalizedTag = normalizeDockerImageTag(resolvedRegistry, rawVersion, {
100
+ variant: options?.variant,
101
+ defaultVariant: options?.defaultVariant,
102
+ });
36
103
  return `${resolvedRegistry}:${normalizedTag}`;
37
104
  }
105
+ function extractDockerImageTag(imageRef) {
106
+ const ref = trimValue(imageRef);
107
+ const lastSlashIndex = ref.lastIndexOf('/');
108
+ const lastColonIndex = ref.lastIndexOf(':');
109
+ if (lastColonIndex <= lastSlashIndex) {
110
+ return undefined;
111
+ }
112
+ return ref.slice(lastColonIndex + 1) || undefined;
113
+ }
114
+ export function resolveDockerImageContainerPort(imageRef) {
115
+ const tag = extractDockerImageTag(imageRef);
116
+ return tag?.endsWith(DOCKER_IMAGE_NO_NGINX_SUFFIX) ? '13000' : '80';
117
+ }
118
+ export function resolveBuiltinDbImage(dbDialect, options) {
119
+ const dialect = trimValue(dbDialect) || 'postgres';
120
+ const configuredRegistry = normalizeNbImageRegistry(options?.registry) ??
121
+ inferNbImageRegistryFromRepository(options?.registry) ??
122
+ DEFAULT_NB_IMAGE_REGISTRY;
123
+ const defaults = configuredRegistry === 'aliyun' ? ALIYUN_BUILTIN_DB_IMAGES : DEFAULT_BUILTIN_DB_IMAGES;
124
+ return defaults[dialect] ?? defaults.postgres;
125
+ }