@downcity/city 0.2.17 → 0.2.25

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 (164) hide show
  1. package/README.md +33 -16
  2. package/bin/city/admin/index.d.ts +36 -0
  3. package/bin/city/admin/index.d.ts.map +1 -0
  4. package/bin/city/admin/index.js +85 -0
  5. package/bin/city/admin/index.js.map +1 -0
  6. package/bin/city/admin/types.d.ts +41 -0
  7. package/bin/city/admin/types.d.ts.map +1 -0
  8. package/bin/city/admin/types.js +5 -0
  9. package/bin/city/admin/types.js.map +1 -0
  10. package/bin/city/city.d.ts +73 -0
  11. package/bin/city/city.d.ts.map +1 -0
  12. package/bin/city/city.js +116 -0
  13. package/bin/city/city.js.map +1 -0
  14. package/bin/city/http.d.ts +55 -0
  15. package/bin/city/http.d.ts.map +1 -0
  16. package/bin/city/http.js +78 -0
  17. package/bin/city/http.js.map +1 -0
  18. package/bin/city/index.d.ts +20 -0
  19. package/bin/city/index.d.ts.map +1 -0
  20. package/bin/city/index.js +14 -0
  21. package/bin/city/index.js.map +1 -0
  22. package/bin/city/invoker/ai/index.d.ts +126 -0
  23. package/bin/city/invoker/ai/index.d.ts.map +1 -0
  24. package/bin/city/invoker/ai/index.js +247 -0
  25. package/bin/city/invoker/ai/index.js.map +1 -0
  26. package/bin/city/invoker/ai/stream.d.ts +8 -0
  27. package/bin/city/invoker/ai/stream.d.ts.map +1 -0
  28. package/bin/city/invoker/ai/stream.js +17 -0
  29. package/bin/city/invoker/ai/stream.js.map +1 -0
  30. package/bin/city/invoker/ai/types.d.ts +14 -0
  31. package/bin/city/invoker/ai/types.d.ts.map +1 -0
  32. package/bin/city/invoker/ai/types.js +9 -0
  33. package/bin/city/invoker/ai/types.js.map +1 -0
  34. package/bin/city/invoker/balance/index.d.ts +76 -0
  35. package/bin/city/invoker/balance/index.d.ts.map +1 -0
  36. package/bin/city/invoker/balance/index.js +137 -0
  37. package/bin/city/invoker/balance/index.js.map +1 -0
  38. package/bin/city/invoker/balance/types.d.ts +324 -0
  39. package/bin/city/invoker/balance/types.d.ts.map +1 -0
  40. package/bin/city/invoker/balance/types.js +9 -0
  41. package/bin/city/invoker/balance/types.js.map +1 -0
  42. package/bin/city/invoker/env/index.d.ts +33 -0
  43. package/bin/city/invoker/env/index.d.ts.map +1 -0
  44. package/bin/city/invoker/env/index.js +53 -0
  45. package/bin/city/invoker/env/index.js.map +1 -0
  46. package/bin/city/invoker/env/types.d.ts +57 -0
  47. package/bin/city/invoker/env/types.d.ts.map +1 -0
  48. package/bin/city/invoker/env/types.js +5 -0
  49. package/bin/city/invoker/env/types.js.map +1 -0
  50. package/bin/city/invoker/invoker.d.ts +44 -0
  51. package/bin/city/invoker/invoker.d.ts.map +1 -0
  52. package/bin/city/invoker/invoker.js +87 -0
  53. package/bin/city/invoker/invoker.js.map +1 -0
  54. package/bin/city/invoker/payment/index.d.ts +69 -0
  55. package/bin/city/invoker/payment/index.d.ts.map +1 -0
  56. package/bin/city/invoker/payment/index.js +110 -0
  57. package/bin/city/invoker/payment/index.js.map +1 -0
  58. package/bin/city/invoker/payment/types.d.ts +66 -0
  59. package/bin/city/invoker/payment/types.d.ts.map +1 -0
  60. package/bin/city/invoker/payment/types.js +10 -0
  61. package/bin/city/invoker/payment/types.js.map +1 -0
  62. package/bin/city/invoker/towns/index.d.ts +46 -0
  63. package/bin/city/invoker/towns/index.d.ts.map +1 -0
  64. package/bin/city/invoker/towns/index.js +73 -0
  65. package/bin/city/invoker/towns/index.js.map +1 -0
  66. package/bin/city/invoker/towns/types.d.ts +46 -0
  67. package/bin/city/invoker/towns/types.d.ts.map +1 -0
  68. package/bin/city/invoker/towns/types.js +5 -0
  69. package/bin/city/invoker/towns/types.js.map +1 -0
  70. package/bin/city/types/city.d.ts +71 -0
  71. package/bin/city/types/city.d.ts.map +1 -0
  72. package/bin/city/types/city.js +8 -0
  73. package/bin/city/types/city.js.map +1 -0
  74. package/bin/city/user/index.d.ts +27 -0
  75. package/bin/city/user/index.d.ts.map +1 -0
  76. package/bin/city/user/index.js +100 -0
  77. package/bin/city/user/index.js.map +1 -0
  78. package/bin/city/user/types.d.ts +49 -0
  79. package/bin/city/user/types.d.ts.map +1 -0
  80. package/bin/city/user/types.js +5 -0
  81. package/bin/city/user/types.js.map +1 -0
  82. package/bin/core/auth/authenticator.d.ts +6 -6
  83. package/bin/core/auth/authenticator.d.ts.map +1 -1
  84. package/bin/core/auth/authenticator.js +11 -11
  85. package/bin/core/auth/authenticator.js.map +1 -1
  86. package/bin/core/auth/token-signer.js +4 -4
  87. package/bin/core/auth/token-signer.js.map +1 -1
  88. package/bin/core/auth/types.d.ts +7 -7
  89. package/bin/core/auth/types.d.ts.map +1 -1
  90. package/bin/core/base/base-init.d.ts +5 -5
  91. package/bin/core/base/base-init.d.ts.map +1 -1
  92. package/bin/core/base/base-init.js +8 -8
  93. package/bin/core/base/base-init.js.map +1 -1
  94. package/bin/core/base/base-instruction.js +1 -1
  95. package/bin/core/base/base-instruction.js.map +1 -1
  96. package/bin/core/base/base-router.d.ts +2 -2
  97. package/bin/core/base/base-router.d.ts.map +1 -1
  98. package/bin/core/base/base-router.js +15 -15
  99. package/bin/core/base/base-router.js.map +1 -1
  100. package/bin/core/base/base-runtime.d.ts +3 -3
  101. package/bin/core/base/base-runtime.d.ts.map +1 -1
  102. package/bin/core/base/base-runtime.js +4 -4
  103. package/bin/core/base/base-runtime.js.map +1 -1
  104. package/bin/core/base/base.d.ts +8 -8
  105. package/bin/core/base/base.d.ts.map +1 -1
  106. package/bin/core/base/base.js +10 -10
  107. package/bin/core/base/base.js.map +1 -1
  108. package/bin/core/runtime.d.ts +4 -4
  109. package/bin/core/runtime.d.ts.map +1 -1
  110. package/bin/core/runtime.js +1 -1
  111. package/bin/core/types.d.ts +3 -3
  112. package/bin/core/types.d.ts.map +1 -1
  113. package/bin/index.d.ts +25 -5
  114. package/bin/index.d.ts.map +1 -1
  115. package/bin/index.js +18 -7
  116. package/bin/index.js.map +1 -1
  117. package/bin/service/ai/openai-compatible-provider.d.ts +1 -1
  118. package/bin/service/ai/openai-compatible-provider.js +2 -2
  119. package/bin/service/ai/openai-compatible-provider.js.map +1 -1
  120. package/bin/service/ai/provider.d.ts +1 -1
  121. package/bin/service/ai/provider.js +1 -1
  122. package/bin/service/ai/types.d.ts +1 -1
  123. package/bin/service/installable-service.d.ts +3 -3
  124. package/bin/service/installable-service.d.ts.map +1 -1
  125. package/bin/service/installable-service.js +1 -1
  126. package/bin/service/installable-service.js.map +1 -1
  127. package/bin/service/instruction.js +7 -7
  128. package/bin/service/instruction.js.map +1 -1
  129. package/bin/service/service.d.ts +5 -5
  130. package/bin/service/service.d.ts.map +1 -1
  131. package/bin/service/service.js +1 -1
  132. package/bin/service/service.js.map +1 -1
  133. package/bin/service/{studios → towns}/schema.d.ts +23 -23
  134. package/bin/service/towns/schema.d.ts.map +1 -0
  135. package/bin/service/towns/schema.js +60 -0
  136. package/bin/service/towns/schema.js.map +1 -0
  137. package/bin/service/towns/town-store.d.ts +17 -0
  138. package/bin/service/towns/town-store.d.ts.map +1 -0
  139. package/bin/service/towns/town-store.js +49 -0
  140. package/bin/service/towns/town-store.js.map +1 -0
  141. package/bin/service/towns/towns-service.d.ts +15 -0
  142. package/bin/service/towns/towns-service.d.ts.map +1 -0
  143. package/bin/service/towns/towns-service.js +54 -0
  144. package/bin/service/towns/towns-service.js.map +1 -0
  145. package/bin/service/towns/types.d.ts +51 -0
  146. package/bin/service/towns/types.d.ts.map +1 -0
  147. package/bin/service/towns/types.js +7 -0
  148. package/bin/service/towns/types.js.map +1 -0
  149. package/package.json +9 -8
  150. package/bin/service/studios/schema.d.ts.map +0 -1
  151. package/bin/service/studios/schema.js +0 -60
  152. package/bin/service/studios/schema.js.map +0 -1
  153. package/bin/service/studios/studio-store.d.ts +0 -17
  154. package/bin/service/studios/studio-store.d.ts.map +0 -1
  155. package/bin/service/studios/studio-store.js +0 -49
  156. package/bin/service/studios/studio-store.js.map +0 -1
  157. package/bin/service/studios/studios-service.d.ts +0 -15
  158. package/bin/service/studios/studios-service.d.ts.map +0 -1
  159. package/bin/service/studios/studios-service.js +0 -51
  160. package/bin/service/studios/studios-service.js.map +0 -1
  161. package/bin/service/studios/types.d.ts +0 -51
  162. package/bin/service/studios/types.d.ts.map +0 -1
  163. package/bin/service/studios/types.js +0 -7
  164. package/bin/service/studios/types.js.map +0 -1
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Service / Action 调用器。
3
+ *
4
+ * client.service("ai").action("text").invoke({ prompt: "hello" })
5
+ * → POST /v1/ai/text
6
+ *
7
+ * 如果设置了 town_id,自动注入到 POST body。
8
+ * GET Action 则支持通过第二个参数传 query。
9
+ */
10
+ import type { RequestInitLike } from "../http.js";
11
+ type Requester = <T>(path: string, init: RequestInitLike) => Promise<T>;
12
+ /**
13
+ * Action 调用器。
14
+ */
15
+ export declare class ActionClient {
16
+ private readonly req;
17
+ private readonly url;
18
+ /** 当前 Town ID,自动注入到 POST body */
19
+ private readonly town_id?;
20
+ constructor(req: Requester, url: string,
21
+ /** 当前 Town ID,自动注入到 POST body */
22
+ town_id?: string | undefined);
23
+ /** POST 执行 Action */
24
+ invoke<T = unknown>(input?: Record<string, unknown>): Promise<T>;
25
+ }
26
+ /**
27
+ * Service 调用器。
28
+ */
29
+ export declare class ServiceClient {
30
+ private readonly req;
31
+ private readonly prefix;
32
+ private readonly serviceId;
33
+ /** 当前 Town ID,透传给 ActionClient */
34
+ private readonly town_id?;
35
+ constructor(req: Requester, prefix: string, serviceId: string,
36
+ /** 当前 Town ID,透传给 ActionClient */
37
+ town_id?: string | undefined);
38
+ /** 获取 Action 调用器 */
39
+ action(name: string): ActionClient;
40
+ /** GET 调用 Action(用于 method="GET" 的 action) */
41
+ get<T = unknown>(name: string, query?: Record<string, unknown>): Promise<T>;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=invoker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoker.d.ts","sourceRoot":"","sources":["../../../src/city/invoker/invoker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,KAAK,SAAS,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAExE;;GAEG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAHR,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,MAAM;IAC5B,iCAAiC;IAChB,OAAO,CAAC,EAAE,MAAM,YAAA;IAGnC,qBAAqB;IACrB,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAOrE;AAED;;GAEG;AACH,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,kCAAkC;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAJR,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM;IAClC,kCAAkC;IACjB,OAAO,CAAC,EAAE,MAAM,YAAA;IAGnC,oBAAoB;IACpB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;IAMlC,8CAA8C;IAC9C,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAK5E"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Service / Action 调用器。
3
+ *
4
+ * client.service("ai").action("text").invoke({ prompt: "hello" })
5
+ * → POST /v1/ai/text
6
+ *
7
+ * 如果设置了 town_id,自动注入到 POST body。
8
+ * GET Action 则支持通过第二个参数传 query。
9
+ */
10
+ /**
11
+ * Action 调用器。
12
+ */
13
+ export class ActionClient {
14
+ req;
15
+ url;
16
+ town_id;
17
+ constructor(req, url,
18
+ /** 当前 Town ID,自动注入到 POST body */
19
+ town_id) {
20
+ this.req = req;
21
+ this.url = url;
22
+ this.town_id = town_id;
23
+ }
24
+ /** POST 执行 Action */
25
+ invoke(input = {}) {
26
+ const body = this.town_id ? { ...input, town_id: this.town_id } : input;
27
+ return this.req(this.url, {
28
+ method: "POST",
29
+ body: JSON.stringify(body),
30
+ });
31
+ }
32
+ }
33
+ /**
34
+ * Service 调用器。
35
+ */
36
+ export class ServiceClient {
37
+ req;
38
+ prefix;
39
+ serviceId;
40
+ town_id;
41
+ constructor(req, prefix, serviceId,
42
+ /** 当前 Town ID,透传给 ActionClient */
43
+ town_id) {
44
+ this.req = req;
45
+ this.prefix = prefix;
46
+ this.serviceId = serviceId;
47
+ this.town_id = town_id;
48
+ }
49
+ /** 获取 Action 调用器 */
50
+ action(name) {
51
+ const id = normalizeName(name);
52
+ const url = `${this.prefix}/${encodeURIComponent(this.serviceId)}/${id}`;
53
+ return new ActionClient(this.req, url, this.town_id);
54
+ }
55
+ /** GET 调用 Action(用于 method="GET" 的 action) */
56
+ get(name, query) {
57
+ const id = normalizeName(name);
58
+ const url = withQuery(`${this.prefix}/${encodeURIComponent(this.serviceId)}/${id}`, query);
59
+ return this.req(url, { method: "GET" });
60
+ }
61
+ }
62
+ function normalizeName(value) {
63
+ const s = String(value ?? "").trim().replace(/^\/+/, "");
64
+ if (!s)
65
+ throw new TypeError("name is required");
66
+ return s;
67
+ }
68
+ /**
69
+ * 为 GET action 构造 query string。
70
+ *
71
+ * 关键说明(中文)
72
+ * - 统一由 SDK 负责 query 拼接,业务侧不再手写 `foo?bar=baz`
73
+ * - `undefined` / `null` 会被忽略,避免产生无意义参数
74
+ */
75
+ function withQuery(url, query) {
76
+ if (!query)
77
+ return url;
78
+ const search = new URLSearchParams();
79
+ for (const [key, value] of Object.entries(query)) {
80
+ if (value === undefined || value === null)
81
+ continue;
82
+ search.set(key, String(value));
83
+ }
84
+ const qs = search.toString();
85
+ return qs ? `${url}?${qs}` : url;
86
+ }
87
+ //# sourceMappingURL=invoker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoker.js","sourceRoot":"","sources":["../../../src/city/invoker/invoker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Payment 用户端调用器。
3
+ *
4
+ * 关键说明(中文)
5
+ * - `client.payment.methods()` 统一读取支付方式目录
6
+ * - `client.payment.method("stripe").invoke(...)` 会自动解析目标 service / action
7
+ * - 前端不再手写 `payment.stripe` 或 `checkout/create`
8
+ */
9
+ import type { RequestInitLike } from "../../http.js";
10
+ import { ServiceClient } from "../invoker.js";
11
+ import type { UserPaymentMethod } from "./types.js";
12
+ type Requester = <T>(path: string, init: RequestInitLike) => Promise<T>;
13
+ type ServiceFactory = (name: string) => ServiceClient;
14
+ /**
15
+ * Payment 调用器。
16
+ */
17
+ export declare class PaymentInvoker {
18
+ private readonly req;
19
+ private readonly service;
20
+ private readonly hasUserToken;
21
+ constructor(opts: {
22
+ requestJSON: Requester;
23
+ service: ServiceFactory;
24
+ hasUserToken: () => boolean;
25
+ });
26
+ /**
27
+ * 读取当前 City 暴露的支付方式列表。
28
+ */
29
+ methods(): Promise<UserPaymentMethod[]>;
30
+ /**
31
+ * 获取单个支付方式句柄。
32
+ */
33
+ method(id: string): PaymentMethodHandle;
34
+ /**
35
+ * 读取单个支付方式定义。
36
+ */
37
+ readMethod(id: string): Promise<UserPaymentMethod>;
38
+ /**
39
+ * 按支付方式定义自动分发到具体 service / action。
40
+ */
41
+ invokeMethod<T = unknown>(id: string, input?: Record<string, unknown>): Promise<T>;
42
+ /**
43
+ * 使用已解析的支付方式定义执行具体动作。
44
+ */
45
+ executeMethod<T = unknown>(method: UserPaymentMethod, input?: Record<string, unknown>): Promise<T>;
46
+ private dispatchMethod;
47
+ }
48
+ /**
49
+ * 单个支付方式句柄。
50
+ */
51
+ export declare class PaymentMethodHandle {
52
+ private readonly payment;
53
+ /**
54
+ * 支付方式唯一标识。
55
+ */
56
+ readonly id: string;
57
+ private definitionPromise?;
58
+ constructor(payment: PaymentInvoker, id: string);
59
+ /**
60
+ * 读取当前支付方式定义。
61
+ */
62
+ describe(): Promise<UserPaymentMethod>;
63
+ /**
64
+ * 发起当前支付方式对应的具体动作。
65
+ */
66
+ invoke<T = unknown>(input?: Record<string, unknown>): Promise<T>;
67
+ }
68
+ export {};
69
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/city/invoker/payment/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD,KAAK,SAAS,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AACxE,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,CAAC;AAEtD;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;gBAEjC,IAAI,EAAE;QAChB,WAAW,EAAE,SAAS,CAAC;QACvB,OAAO,EAAE,cAAc,CAAC;QACxB,YAAY,EAAE,MAAM,OAAO,CAAC;KAC7B;IAMD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAO7C;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,mBAAmB;IAIvC;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAUxD;;OAEG;IACG,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5B,EAAE,EAAE,MAAM,EACV,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAClC,OAAO,CAAC,CAAC,CAAC;IAKb;;OAEG;IACH,aAAa,CAAC,CAAC,GAAG,OAAO,EACvB,MAAM,EAAE,iBAAiB,EACzB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAClC,OAAO,CAAC,CAAC,CAAC;IAIb,OAAO,CAAC,cAAc;CAevB;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAS5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,OAAO,CAAC,iBAAiB,CAAC,CAA6B;gBAGpC,OAAO,EAAE,cAAc,EACxC,EAAE,EAAE,MAAM;IAKZ;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAOtC;;OAEG;IACG,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAI3E"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Payment 用户端调用器。
3
+ *
4
+ * 关键说明(中文)
5
+ * - `client.payment.methods()` 统一读取支付方式目录
6
+ * - `client.payment.method("stripe").invoke(...)` 会自动解析目标 service / action
7
+ * - 前端不再手写 `payment.stripe` 或 `checkout/create`
8
+ */
9
+ const PREFIX = "/v1/payment";
10
+ /**
11
+ * Payment 调用器。
12
+ */
13
+ export class PaymentInvoker {
14
+ req;
15
+ service;
16
+ hasUserToken;
17
+ constructor(opts) {
18
+ this.req = opts.requestJSON;
19
+ this.service = opts.service;
20
+ this.hasUserToken = opts.hasUserToken;
21
+ }
22
+ /**
23
+ * 读取当前 City 暴露的支付方式列表。
24
+ */
25
+ async methods() {
26
+ const body = await this.req(`${PREFIX}/methods`, {
27
+ method: "GET",
28
+ });
29
+ return body.items;
30
+ }
31
+ /**
32
+ * 获取单个支付方式句柄。
33
+ */
34
+ method(id) {
35
+ return new PaymentMethodHandle(this, normalizeMethodId(id));
36
+ }
37
+ /**
38
+ * 读取单个支付方式定义。
39
+ */
40
+ async readMethod(id) {
41
+ const methodId = normalizeMethodId(id);
42
+ const methods = await this.methods();
43
+ const method = methods.find((item) => item.id === methodId);
44
+ if (!method) {
45
+ throw new Error(`payment method "${methodId}" is not available`);
46
+ }
47
+ return method;
48
+ }
49
+ /**
50
+ * 按支付方式定义自动分发到具体 service / action。
51
+ */
52
+ async invokeMethod(id, input = {}) {
53
+ const method = await this.readMethod(id);
54
+ return this.executeMethod(method, input);
55
+ }
56
+ /**
57
+ * 使用已解析的支付方式定义执行具体动作。
58
+ */
59
+ executeMethod(method, input = {}) {
60
+ return this.dispatchMethod(method, input);
61
+ }
62
+ dispatchMethod(method, input = {}) {
63
+ if (!method.enabled) {
64
+ const reason = method.reason ? `: ${method.reason}` : "";
65
+ throw new Error(`payment method "${method.id}" is disabled${reason}`);
66
+ }
67
+ if (method.requires_user && !this.hasUserToken()) {
68
+ throw new TypeError(`user_token is required for payment method "${method.id}"`);
69
+ }
70
+ return this.service(method.service).action(method.action).invoke(input);
71
+ }
72
+ }
73
+ /**
74
+ * 单个支付方式句柄。
75
+ */
76
+ export class PaymentMethodHandle {
77
+ payment;
78
+ /**
79
+ * 支付方式唯一标识。
80
+ */
81
+ id;
82
+ definitionPromise;
83
+ constructor(payment, id) {
84
+ this.payment = payment;
85
+ this.id = id;
86
+ }
87
+ /**
88
+ * 读取当前支付方式定义。
89
+ */
90
+ describe() {
91
+ if (!this.definitionPromise) {
92
+ this.definitionPromise = this.payment.readMethod(this.id);
93
+ }
94
+ return this.definitionPromise;
95
+ }
96
+ /**
97
+ * 发起当前支付方式对应的具体动作。
98
+ */
99
+ async invoke(input = {}) {
100
+ const method = await this.describe();
101
+ return this.payment.executeMethod(method, input);
102
+ }
103
+ }
104
+ function normalizeMethodId(value) {
105
+ const id = String(value ?? "").trim();
106
+ if (!id)
107
+ throw new TypeError("payment method id is required");
108
+ return id;
109
+ }
110
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/city/invoker/payment/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Payment 调用器对外类型。
3
+ *
4
+ * 关键说明(中文)
5
+ * - `payment` 是统一支付入口,负责告诉前端“当前有哪些支付方式”
6
+ * - 具体执行动作仍然落到具体 service / action,例如 `payment.stripe`
7
+ * - client 侧通过 typed invoker 屏蔽 service / action 的拼接细节
8
+ */
9
+ /**
10
+ * 支付方式模式。
11
+ */
12
+ export type UserPaymentMethodType = "checkout";
13
+ /**
14
+ * 支付方式不可用原因。
15
+ */
16
+ export type UserPaymentMethodReason = "not_configured" | "not_supported";
17
+ /**
18
+ * 单个支付方式定义。
19
+ */
20
+ export interface UserPaymentMethod {
21
+ /**
22
+ * 支付方式唯一标识。
23
+ *
24
+ * 例如:`stripe`
25
+ */
26
+ id: string;
27
+ /**
28
+ * 当前支付方式模式。
29
+ *
30
+ * 当前版本统一为 `checkout`,表示需要先创建支付会话,再跳转到第三方支付页。
31
+ */
32
+ type: UserPaymentMethodType;
33
+ /**
34
+ * 当前 City 是否已真正开放该支付方式。
35
+ */
36
+ enabled: boolean;
37
+ /**
38
+ * 展示给终端用户的支付方式名称。
39
+ */
40
+ label: string;
41
+ /**
42
+ * 发起支付时应调用的 service id。
43
+ *
44
+ * 例如:`payment.stripe`
45
+ */
46
+ service: string;
47
+ /**
48
+ * 发起支付时应调用的 action id。
49
+ *
50
+ * 例如:`checkout/create`
51
+ */
52
+ action: string;
53
+ /**
54
+ * 当前支付方式是否要求用户先处于登录态。
55
+ */
56
+ requires_user: boolean;
57
+ /**
58
+ * 当前支付方式默认结算币种。
59
+ */
60
+ currency: string;
61
+ /**
62
+ * 当前支付方式未启用时的原因。
63
+ */
64
+ reason?: UserPaymentMethodReason;
65
+ }
66
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/city/invoker/payment/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;;;OAIG;IACH,IAAI,EAAE,qBAAqB,CAAC;IAE5B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,MAAM,CAAC,EAAE,uBAAuB,CAAC;CAClC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Payment 调用器对外类型。
3
+ *
4
+ * 关键说明(中文)
5
+ * - `payment` 是统一支付入口,负责告诉前端“当前有哪些支付方式”
6
+ * - 具体执行动作仍然落到具体 service / action,例如 `payment.stripe`
7
+ * - client 侧通过 typed invoker 屏蔽 service / action 的拼接细节
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/city/invoker/payment/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Towns Service 调用器(对应 core service/towns/towns-service.ts TownsService)。
3
+ *
4
+ * 管理端操作:Town CRUD + Token 签发。
5
+ */
6
+ import type { RequestInitLike } from "../../http.js";
7
+ import type { Town, TownCreateInput, TokenApplyInput, TokenApplyResult } from "./types.js";
8
+ /**
9
+ * Town 和 Token 管理调用器。
10
+ *
11
+ * 通过 Admin City .towns 访问:
12
+ * ```ts
13
+ * await admin.towns.list();
14
+ * await admin.towns.create({ name: "My App" });
15
+ * await admin.towns.tokens.apply({ town_id, user_id });
16
+ * ```
17
+ */
18
+ export declare class TownsInvoker {
19
+ /** Token 签发 */
20
+ readonly tokens: TokenInvoker;
21
+ private readonly req;
22
+ constructor(opts: {
23
+ requestJSON: <T>(path: string, init: RequestInitLike) => Promise<T>;
24
+ });
25
+ /** 列出 Town */
26
+ list(): Promise<Town[]>;
27
+ /** 创建 */
28
+ create(input: TownCreateInput): Promise<Town>;
29
+ /** 暂停 */
30
+ pause(town_id: string): Promise<Town>;
31
+ /** 激活 */
32
+ activate(town_id: string): Promise<Town>;
33
+ /** 删除 */
34
+ remove(town_id: string): Promise<unknown>;
35
+ }
36
+ /** Token 签发调用器 */
37
+ declare class TokenInvoker {
38
+ private readonly req;
39
+ constructor(opts: {
40
+ requestJSON: <T>(path: string, init: RequestInitLike) => Promise<T>;
41
+ });
42
+ /** 签发 user_token */
43
+ apply(input: TokenApplyInput): Promise<TokenApplyResult>;
44
+ }
45
+ export {};
46
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/city/invoker/towns/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI3F;;;;;;;;;GASG;AACH,qBAAa,YAAY;IACvB,eAAe;IACf,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAE9B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyD;gBAEjE,IAAI,EAAE;QAChB,WAAW,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;KACrE;IAKD,cAAc;IACR,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAK7B,SAAS;IACT,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C,SAAS;IACT,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrC,SAAS;IACT,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC,SAAS;IACT,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAM1C;AAED,kBAAkB;AAClB,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyD;gBAEjE,IAAI,EAAE;QAChB,WAAW,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;KACrE;IAID,oBAAoB;IACpB,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAMzD"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Towns Service 调用器(对应 core service/towns/towns-service.ts TownsService)。
3
+ *
4
+ * 管理端操作:Town CRUD + Token 签发。
5
+ */
6
+ const PREFIX = "/v1/towns";
7
+ /**
8
+ * Town 和 Token 管理调用器。
9
+ *
10
+ * 通过 Admin City .towns 访问:
11
+ * ```ts
12
+ * await admin.towns.list();
13
+ * await admin.towns.create({ name: "My App" });
14
+ * await admin.towns.tokens.apply({ town_id, user_id });
15
+ * ```
16
+ */
17
+ export class TownsInvoker {
18
+ /** Token 签发 */
19
+ tokens;
20
+ req;
21
+ constructor(opts) {
22
+ this.req = opts.requestJSON;
23
+ this.tokens = new TokenInvoker(opts);
24
+ }
25
+ /** 列出 Town */
26
+ async list() {
27
+ const body = await this.req(`${PREFIX}/list`, { method: "GET" });
28
+ return body.items;
29
+ }
30
+ /** 创建 */
31
+ create(input) {
32
+ return this.req(`${PREFIX}/create`, {
33
+ method: "POST",
34
+ body: JSON.stringify(input),
35
+ });
36
+ }
37
+ /** 暂停 */
38
+ pause(town_id) {
39
+ return this.req(`${PREFIX}/pause`, {
40
+ method: "POST",
41
+ body: JSON.stringify({ town_id }),
42
+ });
43
+ }
44
+ /** 激活 */
45
+ activate(town_id) {
46
+ return this.req(`${PREFIX}/activate`, {
47
+ method: "POST",
48
+ body: JSON.stringify({ town_id }),
49
+ });
50
+ }
51
+ /** 删除 */
52
+ remove(town_id) {
53
+ return this.req(`${PREFIX}/remove`, {
54
+ method: "POST",
55
+ body: JSON.stringify({ town_id }),
56
+ });
57
+ }
58
+ }
59
+ /** Token 签发调用器 */
60
+ class TokenInvoker {
61
+ req;
62
+ constructor(opts) {
63
+ this.req = opts.requestJSON;
64
+ }
65
+ /** 签发 user_token */
66
+ apply(input) {
67
+ return this.req(`${PREFIX}/tokens/apply`, {
68
+ method: "POST",
69
+ body: JSON.stringify(input),
70
+ });
71
+ }
72
+ }
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/city/invoker/towns/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,MAAM,GAAG,WAAW,CAAC;AAE3B;;;;;;;;;GASG;AACH,MAAM,OAAO,YAAY;IACvB,eAAe;IACN,MAAM,CAAe;IAEb,GAAG,CAAyD;IAE7E,YAAY,IAEX;QACC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,cAAc;IACd,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAoB,GAAG,MAAM,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,SAAS;IACT,MAAM,CAAC,KAAsB;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,SAAS,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,SAAS;IACT,KAAK,CAAC,OAAe;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,QAAQ,EAAE;YACjC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,SAAS;IACT,QAAQ,CAAC,OAAe;QACtB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,WAAW,EAAE;YACpC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,SAAS;IACT,MAAM,CAAC,OAAe;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,SAAS,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;CACF;AAED,kBAAkB;AAClB,MAAM,YAAY;IACC,GAAG,CAAyD;IAE7E,YAAY,IAEX;QACC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;IAC9B,CAAC;IAED,oBAAoB;IACpB,KAAK,CAAC,KAAsB;QAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,eAAe,EAAE;YACxC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Town / Token 类型(对应 core service/towns/types.ts + core/auth/types.ts)。
3
+ */
4
+ /** Town 记录 */
5
+ export interface Town {
6
+ /** Town 的唯一 ID,User City 请求会使用它绑定访问边界。 */
7
+ town_id: string;
8
+ /** Town 的展示名称,便于管理端识别不同产品或场景。 */
9
+ name: string;
10
+ /** Town 当前状态,paused 状态会阻止用户侧继续调用。 */
11
+ status: "active" | "paused";
12
+ /** Town 创建时间,使用 ISO 字符串。 */
13
+ created_at: string;
14
+ /** Town 最后更新时间,使用 ISO 字符串。 */
15
+ updated_at: string;
16
+ }
17
+ /** 创建 Town 的输入 */
18
+ export interface TownCreateInput {
19
+ /** Town 的展示名称。 */
20
+ name: string;
21
+ /** 可选自定义 Town ID;不传时由 City 自动生成。 */
22
+ town_id?: string;
23
+ }
24
+ /** 签发 token 的输入 */
25
+ export interface TokenApplyInput {
26
+ /** token 绑定的 Town ID。 */
27
+ town_id: string;
28
+ /** token 绑定的业务用户 ID。 */
29
+ user_id: string;
30
+ /** 写入 token payload 的业务元数据。 */
31
+ metadata?: Record<string, unknown>;
32
+ /** token 有效期,可传毫秒数或可解析的时长字符串。 */
33
+ ttl?: string | number;
34
+ }
35
+ /** token 签发结果 */
36
+ export interface TokenApplyResult {
37
+ /** 可交给 User City 使用的 token */
38
+ user_token: string;
39
+ /** token 所属 Town ID */
40
+ town_id: string;
41
+ /** token 所属用户 ID */
42
+ user_id: string;
43
+ /** token 过期时间;未设置 ttl 时省略 */
44
+ expires_at?: string;
45
+ }
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/city/invoker/towns/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc;AACd,MAAM,WAAW,IAAI;IACnB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAEhB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IAEb,qCAAqC;IACrC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAE5B,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IAEnB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,kBAAkB;AAClB,MAAM,WAAW,eAAe;IAC9B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IAEb,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,mBAAmB;AACnB,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAEhB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAEhB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,iBAAiB;AACjB,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Town / Token 类型(对应 core service/towns/types.ts + core/auth/types.ts)。
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/city/invoker/towns/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}