@carthooks/arcubase-cli 0.1.1 → 0.1.2

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.
@@ -94,6 +94,7 @@ function loadRuntimeEnv(scope, env = process.env) {
94
94
  ARCUBASE_BASE_URL: requiredValue(env, scope, "ARCUBASE_BASE_URL"),
95
95
  ARCUBASE_TENANT_ID: requiredValue(env, scope, "ARCUBASE_TENANT_ID"),
96
96
  ARCUBASE_ACCESS_TOKEN: requiredValue(env, scope, "ARCUBASE_ACCESS_TOKEN"),
97
+ ARCUBASE_HOST: optionalValue(env, scope, "ARCUBASE_HOST"),
97
98
  ARCUBASE_TRACE_ID: optionalValue(env, scope, "ARCUBASE_TRACE_ID"),
98
99
  ARCUBASE_SUBJECT_TYPE: optionalValue(env, scope, "ARCUBASE_SUBJECT_TYPE"),
99
100
  ARCUBASE_SUBJECT_ID: optionalValue(env, scope, "ARCUBASE_SUBJECT_ID"),
@@ -107,6 +108,9 @@ function buildRequestHeaders(env) {
107
108
  Authorization: `Bearer ${env.ARCUBASE_ACCESS_TOKEN}`,
108
109
  "X-Tenant-Id": env.ARCUBASE_TENANT_ID
109
110
  };
111
+ if (env.ARCUBASE_HOST && env.ARCUBASE_HOST.trim() !== "") {
112
+ headers["X-Host"] = env.ARCUBASE_HOST;
113
+ }
110
114
  if (env.ARCUBASE_TRACE_ID) {
111
115
  headers["X-Trace-Id"] = env.ARCUBASE_TRACE_ID;
112
116
  }
@@ -94,6 +94,7 @@ function loadRuntimeEnv(scope, env = process.env) {
94
94
  ARCUBASE_BASE_URL: requiredValue(env, scope, "ARCUBASE_BASE_URL"),
95
95
  ARCUBASE_TENANT_ID: requiredValue(env, scope, "ARCUBASE_TENANT_ID"),
96
96
  ARCUBASE_ACCESS_TOKEN: requiredValue(env, scope, "ARCUBASE_ACCESS_TOKEN"),
97
+ ARCUBASE_HOST: optionalValue(env, scope, "ARCUBASE_HOST"),
97
98
  ARCUBASE_TRACE_ID: optionalValue(env, scope, "ARCUBASE_TRACE_ID"),
98
99
  ARCUBASE_SUBJECT_TYPE: optionalValue(env, scope, "ARCUBASE_SUBJECT_TYPE"),
99
100
  ARCUBASE_SUBJECT_ID: optionalValue(env, scope, "ARCUBASE_SUBJECT_ID"),
@@ -107,6 +108,9 @@ function buildRequestHeaders(env) {
107
108
  Authorization: `Bearer ${env.ARCUBASE_ACCESS_TOKEN}`,
108
109
  "X-Tenant-Id": env.ARCUBASE_TENANT_ID
109
110
  };
111
+ if (env.ARCUBASE_HOST && env.ARCUBASE_HOST.trim() !== "") {
112
+ headers["X-Host"] = env.ARCUBASE_HOST;
113
+ }
110
114
  if (env.ARCUBASE_TRACE_ID) {
111
115
  headers["X-Trace-Id"] = env.ARCUBASE_TRACE_ID;
112
116
  }
@@ -2,6 +2,7 @@ export type RuntimeEnv = {
2
2
  ARCUBASE_BASE_URL: string;
3
3
  ARCUBASE_TENANT_ID: string;
4
4
  ARCUBASE_ACCESS_TOKEN: string;
5
+ ARCUBASE_HOST?: string;
5
6
  ARCUBASE_TRACE_ID?: string;
6
7
  ARCUBASE_SUBJECT_TYPE?: string;
7
8
  ARCUBASE_SUBJECT_ID?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/runtime/env.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,qBAAqB,EAAE,MAAM,CAAA;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,yBAAyB,CAAC,EAAE,MAAM,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,CAAA;AAE9C,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;AAqClD,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,GAAE,QAAsB,GAAG,UAAU,CAU9F"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/runtime/env.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,qBAAqB,EAAE,MAAM,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,yBAAyB,CAAC,EAAE,MAAM,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,CAAA;AAE9C,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;AAqClD,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,GAAE,QAAsB,GAAG,UAAU,CAW9F"}
@@ -34,6 +34,7 @@ export function loadRuntimeEnv(scope, env = process.env) {
34
34
  ARCUBASE_BASE_URL: requiredValue(env, scope, 'ARCUBASE_BASE_URL'),
35
35
  ARCUBASE_TENANT_ID: requiredValue(env, scope, 'ARCUBASE_TENANT_ID'),
36
36
  ARCUBASE_ACCESS_TOKEN: requiredValue(env, scope, 'ARCUBASE_ACCESS_TOKEN'),
37
+ ARCUBASE_HOST: optionalValue(env, scope, 'ARCUBASE_HOST'),
37
38
  ARCUBASE_TRACE_ID: optionalValue(env, scope, 'ARCUBASE_TRACE_ID'),
38
39
  ARCUBASE_SUBJECT_TYPE: optionalValue(env, scope, 'ARCUBASE_SUBJECT_TYPE'),
39
40
  ARCUBASE_SUBJECT_ID: optionalValue(env, scope, 'ARCUBASE_SUBJECT_ID'),
@@ -1,5 +1,5 @@
1
1
  import type { RuntimeEnv } from './env.js';
2
- export declare function buildRequestHeaders(env: Pick<RuntimeEnv, 'ARCUBASE_ACCESS_TOKEN' | 'ARCUBASE_TENANT_ID' | 'ARCUBASE_TRACE_ID'>): Record<string, string>;
2
+ export declare function buildRequestHeaders(env: Pick<RuntimeEnv, 'ARCUBASE_ACCESS_TOKEN' | 'ARCUBASE_TENANT_ID' | 'ARCUBASE_HOST' | 'ARCUBASE_TRACE_ID'>): Record<string, string>;
3
3
  export declare function normalizeExternalEndpoint(endpoint: string): string;
4
4
  export declare function buildURL(baseURL: string, endpoint: string, query?: Record<string, any>): string;
5
5
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/runtime/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,uBAAuB,GAAG,oBAAoB,GAAG,mBAAmB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASvJ;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CASlE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAS/F"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/runtime/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,uBAAuB,GAAG,oBAAoB,GAAG,eAAe,GAAG,mBAAmB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYzK;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CASlE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAS/F"}
@@ -3,6 +3,9 @@ export function buildRequestHeaders(env) {
3
3
  Authorization: `Bearer ${env.ARCUBASE_ACCESS_TOKEN}`,
4
4
  'X-Tenant-Id': env.ARCUBASE_TENANT_ID
5
5
  };
6
+ if (env.ARCUBASE_HOST && env.ARCUBASE_HOST.trim() !== '') {
7
+ headers['X-Host'] = env.ARCUBASE_HOST;
8
+ }
6
9
  if (env.ARCUBASE_TRACE_ID) {
7
10
  headers['X-Trace-Id'] = env.ARCUBASE_TRACE_ID;
8
11
  }
@@ -15,6 +15,7 @@ test('loadRuntimeEnv returns normalized runtime env', () => {
15
15
  ARCUBASE_BASE_URL: 'http://example.com',
16
16
  ARCUBASE_TENANT_ID: 'tenant-1',
17
17
  ARCUBASE_ACCESS_TOKEN: 'token-1',
18
+ ARCUBASE_HOST: undefined,
18
19
  ARCUBASE_TRACE_ID: 'trace-1',
19
20
  ARCUBASE_SUBJECT_TYPE: undefined,
20
21
  ARCUBASE_SUBJECT_ID: undefined,
@@ -26,6 +27,7 @@ test('loadRuntimeEnv accepts admin-prefixed runtime env', () => {
26
27
  ARCUBASE_ADMIN_BASE_URL: ' https://admin.example.com ',
27
28
  ARCUBASE_ADMIN_TENANT_ID: ' tenant-admin ',
28
29
  ARCUBASE_ADMIN_ACCESS_TOKEN: ' token-admin ',
30
+ ARCUBASE_ADMIN_HOST: ' tenant-admin.arcubase.co ',
29
31
  ARCUBASE_ADMIN_SUBJECT_TYPE: ' system_admin ',
30
32
  ARCUBASE_ADMIN_SUBJECT_ID: ' user-admin ',
31
33
  });
@@ -33,6 +35,7 @@ test('loadRuntimeEnv accepts admin-prefixed runtime env', () => {
33
35
  ARCUBASE_BASE_URL: 'https://admin.example.com',
34
36
  ARCUBASE_TENANT_ID: 'tenant-admin',
35
37
  ARCUBASE_ACCESS_TOKEN: 'token-admin',
38
+ ARCUBASE_HOST: 'tenant-admin.arcubase.co',
36
39
  ARCUBASE_TRACE_ID: undefined,
37
40
  ARCUBASE_SUBJECT_TYPE: 'system_admin',
38
41
  ARCUBASE_SUBJECT_ID: 'user-admin',
@@ -44,6 +47,7 @@ test('loadRuntimeEnv accepts user-prefixed runtime env', () => {
44
47
  ARCUBASE_USER_BASE_URL: ' https://user.example.com ',
45
48
  ARCUBASE_USER_TENANT_ID: ' tenant-user ',
46
49
  ARCUBASE_USER_ACCESS_TOKEN: ' token-user ',
50
+ ARCUBASE_USER_HOST: ' tenant-user.arcubase.co ',
47
51
  ARCUBASE_USER_SUBJECT_TYPE: ' service_account ',
48
52
  ARCUBASE_USER_SUBJECT_ID: ' sa-user ',
49
53
  });
@@ -51,6 +55,7 @@ test('loadRuntimeEnv accepts user-prefixed runtime env', () => {
51
55
  ARCUBASE_BASE_URL: 'https://user.example.com',
52
56
  ARCUBASE_TENANT_ID: 'tenant-user',
53
57
  ARCUBASE_ACCESS_TOKEN: 'token-user',
58
+ ARCUBASE_HOST: 'tenant-user.arcubase.co',
54
59
  ARCUBASE_TRACE_ID: undefined,
55
60
  ARCUBASE_SUBJECT_TYPE: 'service_account',
56
61
  ARCUBASE_SUBJECT_ID: 'sa-user',
@@ -9,6 +9,7 @@ const env = {
9
9
  ARCUBASE_BASE_URL: 'https://arcubase.example.com',
10
10
  ARCUBASE_TENANT_ID: 'tenant_1',
11
11
  ARCUBASE_ACCESS_TOKEN: 'tok',
12
+ ARCUBASE_HOST: 'tenant_1.arcubase.co',
12
13
  ARCUBASE_TRACE_ID: '',
13
14
  ARCUBASE_SUBJECT_TYPE: '',
14
15
  ARCUBASE_SUBJECT_ID: '',
@@ -35,10 +36,11 @@ test('admin save entity rejects invalid body file', async () => {
35
36
  });
36
37
  test('admin create entity executes with valid body file', async () => {
37
38
  const bodyFile = tempJSONFile({ name: '订单', parent: 0 });
38
- const out = await executeCLI('admin', ['app', 'create-entity', '--id', 'app_1', '--body-file', bodyFile], env, async (url, init) => new Response(JSON.stringify({ ok: true, url, method: init?.method }), { status: 200 }));
39
+ const out = await executeCLI('admin', ['app', 'create-entity', '--id', 'app_1', '--body-file', bodyFile], env, async (url, init) => new Response(JSON.stringify({ ok: true, url, method: init?.method, host: init?.headers?.['X-Host'] }), { status: 200 }));
39
40
  assert.equal(out.kind, 'result');
40
41
  assert.equal(out.status, 200);
41
42
  assert.equal(out.data.url, 'https://arcubase.example.com/apps/app_1/entities');
43
+ assert.equal(out.data.host, 'tenant_1.arcubase.co');
42
44
  });
43
45
  test('admin api-prefixed command executes against external root path', async () => {
44
46
  const out = await executeCLI('admin', ['app-entity-share', 'get-app-entity-shares', '--app-id', 'app_1'], env, async (url, init) => new Response(JSON.stringify({ ok: true, url, method: init?.method }), { status: 200 }));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carthooks/arcubase-cli",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Arcubase runtime CLI for admin and user command execution",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -2,6 +2,7 @@ export type RuntimeEnv = {
2
2
  ARCUBASE_BASE_URL: string
3
3
  ARCUBASE_TENANT_ID: string
4
4
  ARCUBASE_ACCESS_TOKEN: string
5
+ ARCUBASE_HOST?: string
5
6
  ARCUBASE_TRACE_ID?: string
6
7
  ARCUBASE_SUBJECT_TYPE?: string
7
8
  ARCUBASE_SUBJECT_ID?: string
@@ -52,6 +53,7 @@ export function loadRuntimeEnv(scope: RuntimeEnvScope, env: EnvInput = process.e
52
53
  ARCUBASE_BASE_URL: requiredValue(env, scope, 'ARCUBASE_BASE_URL'),
53
54
  ARCUBASE_TENANT_ID: requiredValue(env, scope, 'ARCUBASE_TENANT_ID'),
54
55
  ARCUBASE_ACCESS_TOKEN: requiredValue(env, scope, 'ARCUBASE_ACCESS_TOKEN'),
56
+ ARCUBASE_HOST: optionalValue(env, scope, 'ARCUBASE_HOST'),
55
57
  ARCUBASE_TRACE_ID: optionalValue(env, scope, 'ARCUBASE_TRACE_ID'),
56
58
  ARCUBASE_SUBJECT_TYPE: optionalValue(env, scope, 'ARCUBASE_SUBJECT_TYPE'),
57
59
  ARCUBASE_SUBJECT_ID: optionalValue(env, scope, 'ARCUBASE_SUBJECT_ID'),
@@ -1,10 +1,13 @@
1
1
  import type { RuntimeEnv } from './env.js'
2
2
 
3
- export function buildRequestHeaders(env: Pick<RuntimeEnv, 'ARCUBASE_ACCESS_TOKEN' | 'ARCUBASE_TENANT_ID' | 'ARCUBASE_TRACE_ID'>): Record<string, string> {
3
+ export function buildRequestHeaders(env: Pick<RuntimeEnv, 'ARCUBASE_ACCESS_TOKEN' | 'ARCUBASE_TENANT_ID' | 'ARCUBASE_HOST' | 'ARCUBASE_TRACE_ID'>): Record<string, string> {
4
4
  const headers: Record<string, string> = {
5
5
  Authorization: `Bearer ${env.ARCUBASE_ACCESS_TOKEN}`,
6
6
  'X-Tenant-Id': env.ARCUBASE_TENANT_ID
7
7
  }
8
+ if (env.ARCUBASE_HOST && env.ARCUBASE_HOST.trim() !== '') {
9
+ headers['X-Host'] = env.ARCUBASE_HOST
10
+ }
8
11
  if (env.ARCUBASE_TRACE_ID) {
9
12
  headers['X-Trace-Id'] = env.ARCUBASE_TRACE_ID
10
13
  }
@@ -19,6 +19,7 @@ test('loadRuntimeEnv returns normalized runtime env', () => {
19
19
  ARCUBASE_BASE_URL: 'http://example.com',
20
20
  ARCUBASE_TENANT_ID: 'tenant-1',
21
21
  ARCUBASE_ACCESS_TOKEN: 'token-1',
22
+ ARCUBASE_HOST: undefined,
22
23
  ARCUBASE_TRACE_ID: 'trace-1',
23
24
  ARCUBASE_SUBJECT_TYPE: undefined,
24
25
  ARCUBASE_SUBJECT_ID: undefined,
@@ -31,6 +32,7 @@ test('loadRuntimeEnv accepts admin-prefixed runtime env', () => {
31
32
  ARCUBASE_ADMIN_BASE_URL: ' https://admin.example.com ',
32
33
  ARCUBASE_ADMIN_TENANT_ID: ' tenant-admin ',
33
34
  ARCUBASE_ADMIN_ACCESS_TOKEN: ' token-admin ',
35
+ ARCUBASE_ADMIN_HOST: ' tenant-admin.arcubase.co ',
34
36
  ARCUBASE_ADMIN_SUBJECT_TYPE: ' system_admin ',
35
37
  ARCUBASE_ADMIN_SUBJECT_ID: ' user-admin ',
36
38
  })
@@ -39,6 +41,7 @@ test('loadRuntimeEnv accepts admin-prefixed runtime env', () => {
39
41
  ARCUBASE_BASE_URL: 'https://admin.example.com',
40
42
  ARCUBASE_TENANT_ID: 'tenant-admin',
41
43
  ARCUBASE_ACCESS_TOKEN: 'token-admin',
44
+ ARCUBASE_HOST: 'tenant-admin.arcubase.co',
42
45
  ARCUBASE_TRACE_ID: undefined,
43
46
  ARCUBASE_SUBJECT_TYPE: 'system_admin',
44
47
  ARCUBASE_SUBJECT_ID: 'user-admin',
@@ -51,6 +54,7 @@ test('loadRuntimeEnv accepts user-prefixed runtime env', () => {
51
54
  ARCUBASE_USER_BASE_URL: ' https://user.example.com ',
52
55
  ARCUBASE_USER_TENANT_ID: ' tenant-user ',
53
56
  ARCUBASE_USER_ACCESS_TOKEN: ' token-user ',
57
+ ARCUBASE_USER_HOST: ' tenant-user.arcubase.co ',
54
58
  ARCUBASE_USER_SUBJECT_TYPE: ' service_account ',
55
59
  ARCUBASE_USER_SUBJECT_ID: ' sa-user ',
56
60
  })
@@ -59,6 +63,7 @@ test('loadRuntimeEnv accepts user-prefixed runtime env', () => {
59
63
  ARCUBASE_BASE_URL: 'https://user.example.com',
60
64
  ARCUBASE_TENANT_ID: 'tenant-user',
61
65
  ARCUBASE_ACCESS_TOKEN: 'token-user',
66
+ ARCUBASE_HOST: 'tenant-user.arcubase.co',
62
67
  ARCUBASE_TRACE_ID: undefined,
63
68
  ARCUBASE_SUBJECT_TYPE: 'service_account',
64
69
  ARCUBASE_SUBJECT_ID: 'sa-user',
@@ -10,6 +10,7 @@ const env = {
10
10
  ARCUBASE_BASE_URL: 'https://arcubase.example.com',
11
11
  ARCUBASE_TENANT_ID: 'tenant_1',
12
12
  ARCUBASE_ACCESS_TOKEN: 'tok',
13
+ ARCUBASE_HOST: 'tenant_1.arcubase.co',
13
14
  ARCUBASE_TRACE_ID: '',
14
15
  ARCUBASE_SUBJECT_TYPE: '',
15
16
  ARCUBASE_SUBJECT_ID: '',
@@ -43,11 +44,12 @@ test('admin create entity executes with valid body file', async () => {
43
44
  'admin',
44
45
  ['app', 'create-entity', '--id', 'app_1', '--body-file', bodyFile],
45
46
  env as any,
46
- async (url, init) => new Response(JSON.stringify({ ok: true, url, method: init?.method }), { status: 200 })
47
+ async (url, init) => new Response(JSON.stringify({ ok: true, url, method: init?.method, host: (init?.headers as Record<string, string>)?.['X-Host'] }), { status: 200 })
47
48
  )
48
49
  assert.equal(out.kind, 'result')
49
50
  assert.equal(out.status, 200)
50
51
  assert.equal(out.data.url, 'https://arcubase.example.com/apps/app_1/entities')
52
+ assert.equal(out.data.host, 'tenant_1.arcubase.co')
51
53
  })
52
54
 
53
55
  test('admin api-prefixed command executes against external root path', async () => {