@shdan/submesh 0.1.0

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 (230) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -0
  3. package/dist/contracts.d.ts +191 -0
  4. package/dist/contracts.d.ts.map +1 -0
  5. package/dist/contracts.js +2 -0
  6. package/dist/contracts.js.map +1 -0
  7. package/dist/drizzle/catalog-mapping-repository.d.ts +280 -0
  8. package/dist/drizzle/catalog-mapping-repository.d.ts.map +1 -0
  9. package/dist/drizzle/catalog-mapping-repository.js +62 -0
  10. package/dist/drizzle/catalog-mapping-repository.js.map +1 -0
  11. package/dist/drizzle/ensure-schema.d.ts +3 -0
  12. package/dist/drizzle/ensure-schema.d.ts.map +1 -0
  13. package/dist/drizzle/ensure-schema.js +100 -0
  14. package/dist/drizzle/ensure-schema.js.map +1 -0
  15. package/dist/drizzle/inbound-event-repository.d.ts +960 -0
  16. package/dist/drizzle/inbound-event-repository.d.ts.map +1 -0
  17. package/dist/drizzle/inbound-event-repository.js +148 -0
  18. package/dist/drizzle/inbound-event-repository.js.map +1 -0
  19. package/dist/drizzle/index.d.ts +40 -0
  20. package/dist/drizzle/index.d.ts.map +1 -0
  21. package/dist/drizzle/index.js +57 -0
  22. package/dist/drizzle/index.js.map +1 -0
  23. package/dist/drizzle/migrate.d.ts +11 -0
  24. package/dist/drizzle/migrate.d.ts.map +1 -0
  25. package/dist/drizzle/migrate.js +22 -0
  26. package/dist/drizzle/migrate.js.map +1 -0
  27. package/dist/drizzle/plan-repository.d.ts +497 -0
  28. package/dist/drizzle/plan-repository.d.ts.map +1 -0
  29. package/dist/drizzle/plan-repository.js +70 -0
  30. package/dist/drizzle/plan-repository.js.map +1 -0
  31. package/dist/drizzle/plugin-installation-repository.d.ts +26 -0
  32. package/dist/drizzle/plugin-installation-repository.d.ts.map +1 -0
  33. package/dist/drizzle/plugin-installation-repository.js +71 -0
  34. package/dist/drizzle/plugin-installation-repository.js.map +1 -0
  35. package/dist/drizzle/repository-set.d.ts +4 -0
  36. package/dist/drizzle/repository-set.d.ts.map +1 -0
  37. package/dist/drizzle/repository-set.js +19 -0
  38. package/dist/drizzle/repository-set.js.map +1 -0
  39. package/dist/drizzle/schema.d.ts +2370 -0
  40. package/dist/drizzle/schema.d.ts.map +1 -0
  41. package/dist/drizzle/schema.js +103 -0
  42. package/dist/drizzle/schema.js.map +1 -0
  43. package/dist/drizzle/subject-repository.d.ts +295 -0
  44. package/dist/drizzle/subject-repository.d.ts.map +1 -0
  45. package/dist/drizzle/subject-repository.js +76 -0
  46. package/dist/drizzle/subject-repository.js.map +1 -0
  47. package/dist/drizzle/subscription-repository.d.ts +60 -0
  48. package/dist/drizzle/subscription-repository.d.ts.map +1 -0
  49. package/dist/drizzle/subscription-repository.js +128 -0
  50. package/dist/drizzle/subscription-repository.js.map +1 -0
  51. package/dist/drizzle/summary-repository.d.ts +9 -0
  52. package/dist/drizzle/summary-repository.d.ts.map +1 -0
  53. package/dist/drizzle/summary-repository.js +25 -0
  54. package/dist/drizzle/summary-repository.js.map +1 -0
  55. package/dist/drizzle/types.d.ts +4 -0
  56. package/dist/drizzle/types.d.ts.map +1 -0
  57. package/dist/drizzle/types.js +2 -0
  58. package/dist/drizzle/types.js.map +1 -0
  59. package/dist/errors.d.ts +10 -0
  60. package/dist/errors.d.ts.map +1 -0
  61. package/dist/errors.js +13 -0
  62. package/dist/errors.js.map +1 -0
  63. package/dist/hooks.d.ts +24 -0
  64. package/dist/hooks.d.ts.map +1 -0
  65. package/dist/hooks.js +2 -0
  66. package/dist/hooks.js.map +1 -0
  67. package/dist/index.d.ts +11 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +9 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/logger.d.ts +16 -0
  72. package/dist/logger.d.ts.map +1 -0
  73. package/dist/logger.js +8 -0
  74. package/dist/logger.js.map +1 -0
  75. package/dist/plugins/builtin-plugins.d.ts +3 -0
  76. package/dist/plugins/builtin-plugins.d.ts.map +1 -0
  77. package/dist/plugins/builtin-plugins.js +7 -0
  78. package/dist/plugins/builtin-plugins.js.map +1 -0
  79. package/dist/plugins/hash-payload.d.ts +2 -0
  80. package/dist/plugins/hash-payload.d.ts.map +1 -0
  81. package/dist/plugins/hash-payload.js +5 -0
  82. package/dist/plugins/hash-payload.js.map +1 -0
  83. package/dist/plugins/manual.d.ts +12 -0
  84. package/dist/plugins/manual.d.ts.map +1 -0
  85. package/dist/plugins/manual.js +87 -0
  86. package/dist/plugins/manual.js.map +1 -0
  87. package/dist/plugins/plan-provisioning.d.ts +18 -0
  88. package/dist/plugins/plan-provisioning.d.ts.map +1 -0
  89. package/dist/plugins/plan-provisioning.js +159 -0
  90. package/dist/plugins/plan-provisioning.js.map +1 -0
  91. package/dist/plugins/plugin-registry.d.ts +9 -0
  92. package/dist/plugins/plugin-registry.d.ts.map +1 -0
  93. package/dist/plugins/plugin-registry.js +18 -0
  94. package/dist/plugins/plugin-registry.js.map +1 -0
  95. package/dist/providers/apple/plugin/app-store-plan-sync.d.ts +4 -0
  96. package/dist/providers/apple/plugin/app-store-plan-sync.d.ts.map +1 -0
  97. package/dist/providers/apple/plugin/app-store-plan-sync.js +85 -0
  98. package/dist/providers/apple/plugin/app-store-plan-sync.js.map +1 -0
  99. package/dist/providers/apple/plugin/app-store.d.ts +20 -0
  100. package/dist/providers/apple/plugin/app-store.d.ts.map +1 -0
  101. package/dist/providers/apple/plugin/app-store.js +397 -0
  102. package/dist/providers/apple/plugin/app-store.js.map +1 -0
  103. package/dist/providers/apple/security/app-store-verification.d.ts +4 -0
  104. package/dist/providers/apple/security/app-store-verification.d.ts.map +1 -0
  105. package/dist/providers/apple/security/app-store-verification.js +100 -0
  106. package/dist/providers/apple/security/app-store-verification.js.map +1 -0
  107. package/dist/providers/apple/services/app-store-subscription-verification-service.d.ts +3 -0
  108. package/dist/providers/apple/services/app-store-subscription-verification-service.d.ts.map +1 -0
  109. package/dist/providers/apple/services/app-store-subscription-verification-service.js +155 -0
  110. package/dist/providers/apple/services/app-store-subscription-verification-service.js.map +1 -0
  111. package/dist/providers/google/plugin/play-plan-sync.d.ts +4 -0
  112. package/dist/providers/google/plugin/play-plan-sync.d.ts.map +1 -0
  113. package/dist/providers/google/plugin/play-plan-sync.js +270 -0
  114. package/dist/providers/google/plugin/play-plan-sync.js.map +1 -0
  115. package/dist/providers/google/plugin/play.d.ts +20 -0
  116. package/dist/providers/google/plugin/play.d.ts.map +1 -0
  117. package/dist/providers/google/plugin/play.js +460 -0
  118. package/dist/providers/google/plugin/play.js.map +1 -0
  119. package/dist/providers/google/security/oauth.d.ts +10 -0
  120. package/dist/providers/google/security/oauth.d.ts.map +1 -0
  121. package/dist/providers/google/security/oauth.js +116 -0
  122. package/dist/providers/google/security/oauth.js.map +1 -0
  123. package/dist/providers/google/security/pubsub-verification.d.ts +3 -0
  124. package/dist/providers/google/security/pubsub-verification.d.ts.map +1 -0
  125. package/dist/providers/google/security/pubsub-verification.js +229 -0
  126. package/dist/providers/google/security/pubsub-verification.js.map +1 -0
  127. package/dist/providers/google/services/play-subscription-verification-service.d.ts +3 -0
  128. package/dist/providers/google/services/play-subscription-verification-service.d.ts.map +1 -0
  129. package/dist/providers/google/services/play-subscription-verification-service.js +96 -0
  130. package/dist/providers/google/services/play-subscription-verification-service.js.map +1 -0
  131. package/dist/repositories/catalog-mapping-repository.d.ts +9 -0
  132. package/dist/repositories/catalog-mapping-repository.d.ts.map +1 -0
  133. package/dist/repositories/catalog-mapping-repository.js +2 -0
  134. package/dist/repositories/catalog-mapping-repository.js.map +1 -0
  135. package/dist/repositories/inbound-event-repository.d.ts +23 -0
  136. package/dist/repositories/inbound-event-repository.d.ts.map +1 -0
  137. package/dist/repositories/inbound-event-repository.js +2 -0
  138. package/dist/repositories/inbound-event-repository.js.map +1 -0
  139. package/dist/repositories/index.d.ts +30 -0
  140. package/dist/repositories/index.d.ts.map +1 -0
  141. package/dist/repositories/index.js +2 -0
  142. package/dist/repositories/index.js.map +1 -0
  143. package/dist/repositories/plan-repository.d.ts +10 -0
  144. package/dist/repositories/plan-repository.d.ts.map +1 -0
  145. package/dist/repositories/plan-repository.js +2 -0
  146. package/dist/repositories/plan-repository.js.map +1 -0
  147. package/dist/repositories/plugin-installation-repository.d.ts +13 -0
  148. package/dist/repositories/plugin-installation-repository.d.ts.map +1 -0
  149. package/dist/repositories/plugin-installation-repository.js +2 -0
  150. package/dist/repositories/plugin-installation-repository.js.map +1 -0
  151. package/dist/repositories/subject-repository.d.ts +10 -0
  152. package/dist/repositories/subject-repository.d.ts.map +1 -0
  153. package/dist/repositories/subject-repository.js +2 -0
  154. package/dist/repositories/subject-repository.js.map +1 -0
  155. package/dist/repositories/subscription-repository.d.ts +24 -0
  156. package/dist/repositories/subscription-repository.d.ts.map +1 -0
  157. package/dist/repositories/subscription-repository.js +2 -0
  158. package/dist/repositories/subscription-repository.js.map +1 -0
  159. package/dist/security/jwt.d.ts +22 -0
  160. package/dist/security/jwt.d.ts.map +1 -0
  161. package/dist/security/jwt.js +132 -0
  162. package/dist/security/jwt.js.map +1 -0
  163. package/dist/security/plugin-webhook-verification.d.ts +3 -0
  164. package/dist/security/plugin-webhook-verification.d.ts.map +1 -0
  165. package/dist/security/plugin-webhook-verification.js +44 -0
  166. package/dist/security/plugin-webhook-verification.js.map +1 -0
  167. package/dist/security/relay-signature.d.ts +12 -0
  168. package/dist/security/relay-signature.d.ts.map +1 -0
  169. package/dist/security/relay-signature.js +39 -0
  170. package/dist/security/relay-signature.js.map +1 -0
  171. package/dist/services/canonical-subscription-service.d.ts +4 -0
  172. package/dist/services/canonical-subscription-service.d.ts.map +1 -0
  173. package/dist/services/canonical-subscription-service.js +20 -0
  174. package/dist/services/canonical-subscription-service.js.map +1 -0
  175. package/dist/services/managed-subscription-service.d.ts +5 -0
  176. package/dist/services/managed-subscription-service.d.ts.map +1 -0
  177. package/dist/services/managed-subscription-service.js +24 -0
  178. package/dist/services/managed-subscription-service.js.map +1 -0
  179. package/dist/services/plan-provisioning-service.d.ts +5 -0
  180. package/dist/services/plan-provisioning-service.d.ts.map +1 -0
  181. package/dist/services/plan-provisioning-service.js +100 -0
  182. package/dist/services/plan-provisioning-service.js.map +1 -0
  183. package/dist/services/plan-resolution.d.ts +4 -0
  184. package/dist/services/plan-resolution.d.ts.map +1 -0
  185. package/dist/services/plan-resolution.js +33 -0
  186. package/dist/services/plan-resolution.js.map +1 -0
  187. package/dist/services/plugin-installation-service.d.ts +6 -0
  188. package/dist/services/plugin-installation-service.d.ts.map +1 -0
  189. package/dist/services/plugin-installation-service.js +19 -0
  190. package/dist/services/plugin-installation-service.js.map +1 -0
  191. package/dist/services/provider-subscription-sync-service.d.ts +4 -0
  192. package/dist/services/provider-subscription-sync-service.d.ts.map +1 -0
  193. package/dist/services/provider-subscription-sync-service.js +13 -0
  194. package/dist/services/provider-subscription-sync-service.js.map +1 -0
  195. package/dist/services/subject-resolution.d.ts +4 -0
  196. package/dist/services/subject-resolution.d.ts.map +1 -0
  197. package/dist/services/subject-resolution.js +48 -0
  198. package/dist/services/subject-resolution.js.map +1 -0
  199. package/dist/services/webhook-ingestion-service.d.ts +14 -0
  200. package/dist/services/webhook-ingestion-service.d.ts.map +1 -0
  201. package/dist/services/webhook-ingestion-service.js +149 -0
  202. package/dist/services/webhook-ingestion-service.js.map +1 -0
  203. package/dist/submesh.d.ts +265 -0
  204. package/dist/submesh.d.ts.map +1 -0
  205. package/dist/submesh.js +602 -0
  206. package/dist/submesh.js.map +1 -0
  207. package/dist/utils/canonical.d.ts +7 -0
  208. package/dist/utils/canonical.d.ts.map +1 -0
  209. package/dist/utils/canonical.js +8 -0
  210. package/dist/utils/canonical.js.map +1 -0
  211. package/dist/utils/parse.d.ts +42 -0
  212. package/dist/utils/parse.d.ts.map +1 -0
  213. package/dist/utils/parse.js +74 -0
  214. package/dist/utils/parse.js.map +1 -0
  215. package/dist/utils/records.d.ts +2 -0
  216. package/dist/utils/records.d.ts.map +1 -0
  217. package/dist/utils/records.js +7 -0
  218. package/dist/utils/records.js.map +1 -0
  219. package/dist/utils/time.d.ts +2 -0
  220. package/dist/utils/time.d.ts.map +1 -0
  221. package/dist/utils/time.js +4 -0
  222. package/dist/utils/time.js.map +1 -0
  223. package/dist/utils/validation.d.ts +10 -0
  224. package/dist/utils/validation.d.ts.map +1 -0
  225. package/dist/utils/validation.js +19 -0
  226. package/dist/utils/validation.js.map +1 -0
  227. package/drizzle/0000_cute_the_order.sql +94 -0
  228. package/drizzle/meta/0000_snapshot.json +559 -0
  229. package/drizzle/meta/_journal.json +13 -0
  230. package/package.json +54 -0
@@ -0,0 +1,602 @@
1
+ import { evaluateEntitlementAccess, } from "@shdan/submesh-core";
2
+ import { collectGrantedEntitlements } from "@shdan/submesh-core";
3
+ import { ConflictError, NotFoundError, ValidationError } from "./errors.js";
4
+ import { DrizzleSubmeshRepositories } from "./drizzle/index.js";
5
+ import { noopLogger } from "./logger.js";
6
+ import { getBuiltinPlugins } from "./plugins/builtin-plugins.js";
7
+ import { PluginRegistry } from "./plugins/plugin-registry.js";
8
+ import { ingestCanonicalSubscription } from "./services/canonical-subscription-service.js";
9
+ import { verifyAppleAppStoreSubscription } from "./providers/apple/services/app-store-subscription-verification-service.js";
10
+ import { createManagedSubscription } from "./services/managed-subscription-service.js";
11
+ import { verifyGooglePlaySubscription } from "./providers/google/services/play-subscription-verification-service.js";
12
+ import { createPlanWithProvisioning } from "./services/plan-provisioning-service.js";
13
+ import { installPlugin } from "./services/plugin-installation-service.js";
14
+ import { syncVerifiedProviderSubscription } from "./services/provider-subscription-sync-service.js";
15
+ import { ingestWebhookEvent } from "./services/webhook-ingestion-service.js";
16
+ import { requireString } from "./utils/validation.js";
17
+ /**
18
+ * Main Submesh SDK client.
19
+ *
20
+ * Create one instance, then use it to manage subjects, plans, subscriptions,
21
+ * plugins, and provider sync flows.
22
+ */
23
+ export class Submesh {
24
+ repositories;
25
+ pluginRegistry = new PluginRegistry();
26
+ ready;
27
+ readyError;
28
+ logger;
29
+ hooks;
30
+ async ensureReady() {
31
+ await this.ready;
32
+ if (this.readyError instanceof Error) {
33
+ throw this.readyError;
34
+ }
35
+ if (this.readyError) {
36
+ throw new ValidationError("Submesh initialization failed.");
37
+ }
38
+ }
39
+ async getPluginConfig(pluginKey) {
40
+ await this.ensureReady();
41
+ const installations = await this.repositories.pluginInstallations.list();
42
+ return installations.find((item) => item.pluginKey === pluginKey)?.config ?? {};
43
+ }
44
+ /**
45
+ * Creates a Submesh client.
46
+ *
47
+ * You can provide repositories directly, Drizzle options, or a Postgres
48
+ * connection string. Built-in plugins are registered by default.
49
+ *
50
+ * @param options Configuration for repositories, migrations, and plugins.
51
+ */
52
+ constructor(options = {}) {
53
+ if (options.repositories) {
54
+ this.repositories = options.repositories;
55
+ }
56
+ else if (options.drizzle) {
57
+ this.repositories = new DrizzleSubmeshRepositories(options.drizzle);
58
+ }
59
+ else if (options.connectionString ?? process.env.DATABASE_URL) {
60
+ this.repositories = new DrizzleSubmeshRepositories({
61
+ connectionString: options.connectionString ?? process.env.DATABASE_URL,
62
+ });
63
+ }
64
+ else {
65
+ throw new ValidationError("Provide repositories, drizzle options, or a Postgres connectionString / DATABASE_URL.");
66
+ }
67
+ this.logger = options.logger ?? noopLogger;
68
+ this.hooks = options.hooks ?? {};
69
+ if (options.autoRegisterBuiltinPlugins !== false) {
70
+ for (const plugin of getBuiltinPlugins()) {
71
+ this.registerPlugin(plugin);
72
+ }
73
+ }
74
+ for (const plugin of options.plugins ?? []) {
75
+ this.registerPlugin(plugin);
76
+ }
77
+ const repositories = this.repositories;
78
+ this.ready = (async () => {
79
+ if (options.autoMigrate === false) {
80
+ return;
81
+ }
82
+ if (!(repositories instanceof DrizzleSubmeshRepositories)) {
83
+ if (options.migration) {
84
+ throw new ValidationError("Submesh migration options require Drizzle repositories.");
85
+ }
86
+ return;
87
+ }
88
+ await repositories.migrate(options.migration ?? {});
89
+ })().catch((error) => {
90
+ this.readyError = error;
91
+ });
92
+ }
93
+ /**
94
+ * Registers a plugin in memory so it can be installed and used.
95
+ *
96
+ * @param plugin Plugin definition to register.
97
+ */
98
+ registerPlugin(plugin) {
99
+ this.pluginRegistry.register(plugin);
100
+ }
101
+ /**
102
+ * Saves plugin configuration and marks the plugin as installed.
103
+ *
104
+ * @param input Plugin key and installation config payload.
105
+ * @returns The stored plugin installation record.
106
+ */
107
+ async installPlugin(input) {
108
+ await this.ensureReady();
109
+ return installPlugin(this.repositories, this.pluginRegistry, input);
110
+ }
111
+ /**
112
+ * Returns registered plugins with their current installation state.
113
+ *
114
+ * @returns Registered plugins enriched with installation status.
115
+ */
116
+ async listPlugins() {
117
+ await this.ensureReady();
118
+ return this.pluginRegistry.list(await this.repositories.pluginInstallations.list());
119
+ }
120
+ /**
121
+ * Disables an installed plugin.
122
+ *
123
+ * @param pluginKey The key of the plugin to disable.
124
+ */
125
+ async disablePlugin(pluginKey) {
126
+ await this.ensureReady();
127
+ const plugin = this.pluginRegistry.get(pluginKey);
128
+ if (!plugin) {
129
+ throw new ValidationError(`Plugin ${pluginKey} is not registered.`);
130
+ }
131
+ await this.repositories.pluginInstallations.upsert({
132
+ pluginKey,
133
+ displayName: plugin.displayName,
134
+ enabled: false,
135
+ });
136
+ }
137
+ /**
138
+ * Returns all subjects.
139
+ *
140
+ * @returns All known subjects.
141
+ */
142
+ async listSubjects() {
143
+ await this.ensureReady();
144
+ return this.repositories.subjects.list();
145
+ }
146
+ /**
147
+ * Creates or updates a subject.
148
+ *
149
+ * @param input Subject payload to insert or update.
150
+ * @returns The created or updated subject.
151
+ */
152
+ async upsertSubject(input) {
153
+ await this.ensureReady();
154
+ requireString(input.id, "Subject id");
155
+ return this.repositories.subjects.upsert(input);
156
+ }
157
+ /**
158
+ * Returns a subject by their ID.
159
+ *
160
+ * @param id The subject identifier.
161
+ * @returns The subject or undefined if not found.
162
+ */
163
+ async getSubject(id) {
164
+ await this.ensureReady();
165
+ requireString(id, "Subject id");
166
+ return this.repositories.subjects.getById(id);
167
+ }
168
+ /**
169
+ * Links an external provider identity to a subject.
170
+ *
171
+ * @param input Provider identity details and target subject.
172
+ * @returns Resolves when the identity link is persisted.
173
+ */
174
+ async linkProviderIdentity(input) {
175
+ await this.ensureReady();
176
+ requireString(input.subjectId, "Subject id");
177
+ requireString(input.provider, "Provider");
178
+ requireString(input.externalId, "External id");
179
+ await this.repositories.subjects.upsert({ id: input.subjectId });
180
+ await this.repositories.subjects.upsertIdentity(input);
181
+ }
182
+ /**
183
+ * Returns all plans.
184
+ *
185
+ * @returns All plans in the catalog.
186
+ */
187
+ async listPlans() {
188
+ await this.ensureReady();
189
+ return this.repositories.plans.list();
190
+ }
191
+ /**
192
+ * Creates a plan and runs plugin provisioning hooks.
193
+ *
194
+ * @param input Plan definition and entitlement data.
195
+ * @returns The newly created plan.
196
+ */
197
+ async createPlan(input) {
198
+ await this.ensureReady();
199
+ requireString(input.code, "Plan code");
200
+ requireString(input.name, "Plan name");
201
+ const existing = await this.repositories.plans.getByCode(input.code);
202
+ if (existing) {
203
+ throw new ConflictError(`Plan ${input.code} already exists.`);
204
+ }
205
+ return createPlanWithProvisioning(this.repositories, this.pluginRegistry, input);
206
+ }
207
+ /**
208
+ * Updates a plan's details.
209
+ *
210
+ * @param code The unique code of the plan to update.
211
+ * @param input Data to update on the plan.
212
+ * @returns The updated plan.
213
+ */
214
+ async updatePlan(code, input) {
215
+ await this.ensureReady();
216
+ requireString(code, "Plan code");
217
+ const updated = await this.repositories.plans.update(code, input);
218
+ if (!updated) {
219
+ throw new NotFoundError(`Plan ${code} was not found.`);
220
+ }
221
+ return updated;
222
+ }
223
+ /**
224
+ * Deletes a plan from the catalog.
225
+ *
226
+ * @param code The plan code to delete.
227
+ */
228
+ async deletePlan(code) {
229
+ await this.ensureReady();
230
+ requireString(code, "Plan code");
231
+ const deleted = await this.repositories.plans.delete(code);
232
+ if (!deleted) {
233
+ throw new NotFoundError(`Plan ${code} was not found.`);
234
+ }
235
+ }
236
+ /**
237
+ * Returns catalog mappings from provider products to internal plan codes.
238
+ *
239
+ * @returns All configured catalog mappings.
240
+ */
241
+ async listCatalogMappings() {
242
+ await this.ensureReady();
243
+ return this.repositories.catalogMappings.list();
244
+ }
245
+ /**
246
+ * Creates or updates a catalog mapping after validating the target plan.
247
+ *
248
+ * @param input Provider catalog identifier mapped to a plan code.
249
+ * @returns The created or updated mapping.
250
+ */
251
+ async upsertCatalogMapping(input) {
252
+ await this.ensureReady();
253
+ requireString(input.pluginKey, "Plugin key");
254
+ requireString(input.externalProductId, "External product id");
255
+ requireString(input.planCode, "Plan code");
256
+ const plan = await this.repositories.plans.getByCode(input.planCode);
257
+ if (!plan) {
258
+ throw new NotFoundError(`Plan ${input.planCode} was not found.`);
259
+ }
260
+ return this.repositories.catalogMappings.upsert(input);
261
+ }
262
+ /**
263
+ * Removes a catalog mapping.
264
+ *
265
+ * @param pluginKey Plugin key (e.g. google-play).
266
+ * @param externalProductId Product ID at the provider.
267
+ */
268
+ async deleteCatalogMapping(pluginKey, externalProductId) {
269
+ await this.ensureReady();
270
+ requireString(pluginKey, "Plugin key");
271
+ requireString(externalProductId, "External product id");
272
+ const deleted = await this.repositories.catalogMappings.delete(pluginKey, externalProductId);
273
+ if (!deleted) {
274
+ throw new NotFoundError(`Mapping for ${pluginKey} / ${externalProductId} not found.`);
275
+ }
276
+ }
277
+ /**
278
+ * Returns subscriptions with resolved plan details.
279
+ *
280
+ * @returns All subscriptions joined with plan details.
281
+ */
282
+ async listSubscriptions() {
283
+ await this.ensureReady();
284
+ return this.repositories.subscriptions.list();
285
+ }
286
+ /**
287
+ * Returns a subscription by its ID.
288
+ *
289
+ * @param id The subscription identifier.
290
+ */
291
+ async getSubscription(id) {
292
+ await this.ensureReady();
293
+ requireString(id, "Subscription id");
294
+ return this.repositories.subscriptions.getById(id);
295
+ }
296
+ /**
297
+ * Returns subscriptions for a specific subject.
298
+ *
299
+ * @param subjectId The subject identifier.
300
+ */
301
+ async listSubscriptionsBySubject(subjectId) {
302
+ await this.ensureReady();
303
+ requireString(subjectId, "Subject id");
304
+ return this.repositories.subscriptions.listBySubjectId(subjectId);
305
+ }
306
+ /**
307
+ * Creates a managed subscription.
308
+ *
309
+ * @param input Subscription payload for a subject and plan.
310
+ * @returns The created subscription.
311
+ */
312
+ async createSubscription(input) {
313
+ await this.ensureReady();
314
+ requireString(input.subjectId, "Subject id");
315
+ requireString(input.planCode, "Plan code");
316
+ const sub = await createManagedSubscription(this.repositories, input);
317
+ this.logger.info("Subscription created", { id: sub.id, subjectId: sub.subjectId });
318
+ if (this.hooks.onSubscriptionChanged) {
319
+ await Promise.resolve(this.hooks.onSubscriptionChanged(sub, null)).catch((e) => this.logger.error("Error in onSubscriptionChanged hook", { error: e }));
320
+ }
321
+ return sub;
322
+ }
323
+ /**
324
+ * Updates an existing subscription directly.
325
+ *
326
+ * @param id The subscription ID.
327
+ * @param input Data to update.
328
+ */
329
+ async updateSubscription(id, input) {
330
+ await this.ensureReady();
331
+ requireString(id, "Subscription id");
332
+ // We fetch it first to get existing status for hooks
333
+ const existing = await this.repositories.subscriptions.getById(id);
334
+ if (!existing) {
335
+ throw new NotFoundError(`Subscription ${id} not found.`);
336
+ }
337
+ const updated = await this.repositories.subscriptions.update(id, input);
338
+ if (!updated) {
339
+ throw new NotFoundError(`Subscription ${id} not found.`);
340
+ }
341
+ if (input.status !== undefined && existing.status !== input.status) {
342
+ this.logger.info("Subscription status updated", {
343
+ id,
344
+ oldStatus: existing.status,
345
+ newStatus: input.status,
346
+ });
347
+ if (this.hooks.onSubscriptionChanged) {
348
+ await Promise.resolve(this.hooks.onSubscriptionChanged(updated, existing.status)).catch((e) => this.logger.error("Error in onSubscriptionChanged hook", { error: e }));
349
+ }
350
+ }
351
+ return updated;
352
+ }
353
+ /**
354
+ * Cancels a subscription. For manual subscriptions, updates local state.
355
+ *
356
+ * @param id Subscription ID.
357
+ * @param options Cancellation options.
358
+ */
359
+ async cancelSubscription(id, options = {}) {
360
+ return this.updateSubscription(id, {
361
+ cancelAt: options.cancelAt ?? new Date().toISOString(),
362
+ status: options.immediate ? "canceled" : undefined,
363
+ });
364
+ }
365
+ /**
366
+ * Checks whether a subject has access to an entitlement.
367
+ *
368
+ * @param subjectId Subject identifier to evaluate.
369
+ * @param entitlement Entitlement key to check.
370
+ * @returns Access decision with reason and optional matched subscription.
371
+ */
372
+ async hasAccess(subjectId, entitlement, options = {}) {
373
+ await this.ensureReady();
374
+ requireString(subjectId, "Subject id");
375
+ requireString(entitlement, "Entitlement");
376
+ const subject = await this.repositories.subjects.getById(subjectId);
377
+ if (!subject) {
378
+ return {
379
+ allowed: false,
380
+ reason: "subject_not_found",
381
+ };
382
+ }
383
+ return evaluateEntitlementAccess(await this.repositories.subscriptions.listBySubjectId(subjectId), entitlement, options);
384
+ }
385
+ /**
386
+ * Returns all active entitlements for a subject.
387
+ *
388
+ * @param subjectId Subject identifier.
389
+ * @param options Execution options.
390
+ */
391
+ async listEntitlements(subjectId, options = {}) {
392
+ await this.ensureReady();
393
+ requireString(subjectId, "Subject id");
394
+ const subscriptions = await this.repositories.subscriptions.listBySubjectId(subjectId);
395
+ return collectGrantedEntitlements(subscriptions, options);
396
+ }
397
+ /**
398
+ * Returns dashboard summary metrics.
399
+ *
400
+ * @returns Aggregate counts and metrics for dashboard views.
401
+ */
402
+ async getSummary() {
403
+ await this.ensureReady();
404
+ return this.repositories.summary.getSummary();
405
+ }
406
+ /**
407
+ * Returns recently ingested inbound events.
408
+ *
409
+ * @param limit Maximum number of events to return.
410
+ * @returns Most recent inbound events up to the requested limit.
411
+ */
412
+ async listEvents(limit = 50) {
413
+ await this.ensureReady();
414
+ return this.repositories.inboundEvents.list(limit);
415
+ }
416
+ /**
417
+ * Returns failed inbound events.
418
+ *
419
+ * @param limit Maximum number of events.
420
+ */
421
+ async listFailedEvents(limit = 50) {
422
+ await this.ensureReady();
423
+ return this.repositories.inboundEvents.listByStatus("failed", limit);
424
+ }
425
+ /**
426
+ * Retry processing a failed event.
427
+ *
428
+ * @param eventId The event identifier.
429
+ */
430
+ async retryEvent(eventId) {
431
+ await this.ensureReady();
432
+ requireString(eventId, "Event id");
433
+ const event = await this.repositories.inboundEvents.getById(eventId);
434
+ if (!event) {
435
+ throw new NotFoundError(`Event ${eventId} not found.`);
436
+ }
437
+ if (event.status !== "failed") {
438
+ throw new ValidationError(`Event ${eventId} is not in a failed state (${event.status}).`);
439
+ }
440
+ this.logger.info("Retrying failed event", { eventId, pluginKey: event.pluginKey });
441
+ // Mark it as received again to permit re-processing in a fresh state
442
+ await this.repositories.inboundEvents.markReceived({
443
+ pluginKey: event.pluginKey,
444
+ eventKey: event.eventKey + "_retry_" + Date.now().toString(),
445
+ eventType: event.eventType,
446
+ sourceRef: event.sourceRef,
447
+ payload: event.payload,
448
+ });
449
+ // Re-ingest the payload through the standard processing pipeline via manual execution bypassing webhook source checks.
450
+ // For safety, this delegates to ingestWebhookEvent but since the event is already received, we reconstruct the payload.
451
+ // However, ingestWebhookEvent requires the raw payload. We assume event.payload is close enough to raw payload.
452
+ return this.ingestWebhook(event.pluginKey, event.payload.value ?? event.payload, {}, { rawBody: undefined });
453
+ }
454
+ /**
455
+ * Ingests a canonical subscription event.
456
+ *
457
+ * @param input Canonical subscription event payload.
458
+ * @returns The resulting subscription after ingestion.
459
+ */
460
+ async ingestCanonicalEvent(input) {
461
+ await this.ensureReady();
462
+ return this.repositories.transaction((tx) => ingestCanonicalSubscription(tx, input));
463
+ }
464
+ /**
465
+ * Ingests a plugin webhook payload and applies subscription updates.
466
+ *
467
+ * @param pluginKey Registered plugin key handling this webhook.
468
+ * @param body Raw webhook request body.
469
+ * @param headers Request headers used for verification and parsing.
470
+ * @param options Additional ingestion behavior options.
471
+ * @returns Ingestion result including dedupe and subscription update outcome.
472
+ */
473
+ async ingestWebhook(pluginKey, body, headers = {}, options = {}) {
474
+ await this.ensureReady();
475
+ requireString(pluginKey, "Plugin key");
476
+ return ingestWebhookEvent({
477
+ repositories: this.repositories,
478
+ pluginRegistry: this.pluginRegistry,
479
+ logger: this.logger,
480
+ hooks: this.hooks,
481
+ }, pluginKey, body, headers, options);
482
+ }
483
+ /**
484
+ * Creates a Web API standard request handler for webhooks.
485
+ * Compatible with Next.js App Router, Cloudflare Workers, and standard Node >= 18.
486
+ *
487
+ * @param pluginKey The plugin to route webhooks to.
488
+ * @returns A function `(req: Request) => Promise<Response>`
489
+ */
490
+ createWebhookHandler(pluginKey) {
491
+ return async (req) => {
492
+ try {
493
+ const bodyBuffer = await req.arrayBuffer();
494
+ const rawBody = Buffer.from(bodyBuffer);
495
+ const headers = {};
496
+ req.headers.forEach((value, key) => {
497
+ headers[key] = value;
498
+ });
499
+ const contentType = req.headers.get("content-type") || "";
500
+ let body = rawBody.toString("utf8");
501
+ if (contentType.includes("application/json")) {
502
+ try {
503
+ body = JSON.parse(body);
504
+ }
505
+ catch {
506
+ // Ignored, pass raw string
507
+ }
508
+ }
509
+ const result = await this.ingestWebhook(pluginKey, body, headers, { rawBody });
510
+ return new Response(JSON.stringify(result), {
511
+ status: 200,
512
+ headers: { "Content-Type": "application/json" },
513
+ });
514
+ }
515
+ catch (error) {
516
+ this.logger.error(`Webhook ingestion failed for ${pluginKey}`, { error });
517
+ const message = error instanceof Error ? error.message : "Internal error";
518
+ return new Response(JSON.stringify({ error: message }), {
519
+ status: error instanceof ValidationError ? 400 : 500,
520
+ headers: { "Content-Type": "application/json" },
521
+ });
522
+ }
523
+ };
524
+ }
525
+ /**
526
+ * Verifies a Google Play purchase and returns canonical subscription data.
527
+ *
528
+ * @param input Google Play verification payload.
529
+ * @returns Verified provider response with canonical subscription data.
530
+ */
531
+ async verifyGooglePlaySubscription(input) {
532
+ await this.ensureReady();
533
+ return verifyGooglePlaySubscription(input, await this.getPluginConfig("google-play"));
534
+ }
535
+ /**
536
+ * Verifies and syncs a Google Play subscription.
537
+ *
538
+ * @param input Google Play verification payload plus target subject.
539
+ * @returns Verified data plus the synchronized subscription record.
540
+ */
541
+ async syncGooglePlaySubscription(input) {
542
+ await this.ensureReady();
543
+ const verified = await this.verifyGooglePlaySubscription(input);
544
+ const canonical = {
545
+ ...verified.canonical,
546
+ subjectId: input.subjectId,
547
+ };
548
+ return {
549
+ ...verified,
550
+ canonical,
551
+ subscription: await syncVerifiedProviderSubscription(this.repositories, canonical),
552
+ };
553
+ }
554
+ /**
555
+ * Verifies an Apple App Store transaction and returns canonical data.
556
+ *
557
+ * @param input Apple App Store verification payload.
558
+ * @returns Verified provider response with canonical subscription data.
559
+ */
560
+ async verifyAppleAppStoreSubscription(input) {
561
+ await this.ensureReady();
562
+ return verifyAppleAppStoreSubscription(input, await this.getPluginConfig("apple-app-store"));
563
+ }
564
+ /**
565
+ * Verifies and syncs an Apple App Store subscription.
566
+ *
567
+ * @param input Apple verification payload plus target subject.
568
+ * @returns Verified data plus the synchronized subscription record.
569
+ */
570
+ async syncAppleAppStoreSubscription(input) {
571
+ await this.ensureReady();
572
+ const verified = await this.verifyAppleAppStoreSubscription(input);
573
+ const canonical = {
574
+ ...verified.canonical,
575
+ subjectId: input.subjectId,
576
+ };
577
+ return {
578
+ ...verified,
579
+ canonical,
580
+ subscription: await syncVerifiedProviderSubscription(this.repositories, canonical),
581
+ };
582
+ }
583
+ /**
584
+ * Closes underlying repository connections.
585
+ *
586
+ * @returns Resolves when repository connections are closed.
587
+ */
588
+ async close() {
589
+ await this.ready;
590
+ if (this.readyError instanceof Error) {
591
+ const closeError = this.readyError;
592
+ await this.repositories.close?.();
593
+ throw closeError;
594
+ }
595
+ if (this.readyError) {
596
+ await this.repositories.close?.();
597
+ throw new ValidationError("Submesh initialization failed.");
598
+ }
599
+ await this.repositories.close?.();
600
+ }
601
+ }
602
+ //# sourceMappingURL=submesh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submesh.js","sourceRoot":"","sources":["../src/submesh.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,yBAAyB,GAY1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAsBjE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,+BAA+B,EAAE,MAAM,2EAA2E,CAAC;AAC5H,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uEAAuE,CAAC;AACrH,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,gCAAgC,EAAE,MAAM,kDAAkD,CAAC;AACpG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,OAAO,OAAO;IACD,YAAY,CAAsB;IAClC,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,KAAK,CAAgB;IAC9B,UAAU,CAAU;IACX,MAAM,CAAgB;IACtB,KAAK,CAAe;IAE7B,KAAK,CAAC,WAAW;QACvB,MAAM,IAAI,CAAC,KAAK,CAAC;QACjB,IAAI,IAAI,CAAC,UAAU,YAAY,KAAK,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,UAAU,CAAC;QACxB,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,eAAe,CAAC,gCAAgC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,SAAiB;QAC7C,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;QACzE,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;IAClF,CAAC;IAED;;;;;;;OAOG;IACH,YAAY,UAA0B,EAAE;QACtC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC3C,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtE,CAAC;aAAM,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAChE,IAAI,CAAC,YAAY,GAAG,IAAI,0BAA0B,CAAC;gBACjD,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAa;aACxE,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,eAAe,CACvB,uFAAuF,CACxF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAEjC,IAAI,OAAO,CAAC,0BAA0B,KAAK,KAAK,EAAE,CAAC;YACjD,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,EAAE,CAAC;gBACzC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QAEvC,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE;YACvB,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YAED,IAAI,CAAC,CAAC,YAAY,YAAY,0BAA0B,CAAC,EAAE,CAAC;gBAC1D,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtB,MAAM,IAAI,eAAe,CACvB,yDAAyD,CAC1D,CAAC;gBACJ,CAAC;gBAED,OAAO;YACT,CAAC;YAED,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACnB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,MAA0B;QACvC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CACjB,KAA4B;QAE5B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC;IACtF,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,eAAe,CAAC,UAAU,SAAS,qBAAqB,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC;YACjD,SAAS;YACT,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CAAC,KAAyB;QAC3C,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,oBAAoB,CAAC,KAAgC;QACzD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC7C,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC1C,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAC/C,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,KAAsB;QACrC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACvC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrE,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,QAAQ,KAAK,CAAC,IAAI,kBAAkB,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,0BAA0B,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACnF,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,KAAsB;QACnD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,QAAQ,IAAI,iBAAiB,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,QAAQ,IAAI,iBAAiB,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,mBAAmB;QACvB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IAClD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,oBAAoB,CAAC,KAAgC;QACzD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC7C,aAAa,CAAC,KAAK,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;QAC9D,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,aAAa,CAAC,QAAQ,KAAK,CAAC,QAAQ,iBAAiB,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,oBAAoB,CACxB,SAAiB,EACjB,iBAAyB;QAEzB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACvC,aAAa,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,CAC5D,SAAS,EACT,iBAAiB,CAClB,CAAC;QACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CACrB,eAAe,SAAS,MAAM,iBAAiB,aAAa,CAC7D,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,iBAAiB;QACrB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,EAAU;QAC9B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,0BAA0B,CAAC,SAAiB;QAChD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CAAC,KAAqC;QAC5D,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC7C,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,yBAAyB,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QACnF,IAAI,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC;YACrC,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CACvE,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CACtB,EAAU,EACV,KAA8B;QAE9B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAErC,qDAAqD;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,aAAa,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YACnE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBAC9C,EAAE;gBACF,SAAS,EAAE,QAAQ,CAAC,MAAM;gBAC1B,SAAS,EAAE,KAAK,CAAC,MAAM;aACxB,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC;gBACrC,MAAM,OAAO,CAAC,OAAO,CACnB,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAC3D,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CACvE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CACtB,EAAU,EACV,UAAqC,EAAE;QAEvC,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE;YACjC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACtD,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;SACnD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,SAAS,CACb,SAAiB,EACjB,WAAmB,EACnB,UAAwC,EAAE;QAE1C,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACvC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,mBAAmB;aAC5B,CAAC;QACJ,CAAC;QAED,OAAO,yBAAyB,CAC9B,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,EAChE,WAAW,EACX,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,CACpB,SAAiB,EACjB,UAAwC,EAAE;QAE1C,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACvC,MAAM,aAAa,GACjB,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACnE,OAAO,0BAA0B,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;IAChD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE;QACzB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CAAC,KAAK,GAAG,EAAE;QAC/B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,OAAe;QAC9B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,aAAa,CAAC,SAAS,OAAO,aAAa,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,eAAe,CACvB,SAAS,OAAO,8BAA8B,KAAK,CAAC,MAAM,IAAI,CAC/D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAEnF,qEAAqE;QACrE,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC;YACjD,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;YAC5D,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QAEH,uHAAuH;QACvH,wHAAwH;QACxH,gHAAgH;QAChH,OAAO,IAAI,CAAC,aAAa,CACvB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,EACpC,EAAE,EACF,EAAE,OAAO,EAAE,SAAS,EAAE,CACvB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,oBAAoB,CAAC,KAAiC;QAC1D,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,2BAA2B,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IACvF,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,aAAa,CACjB,SAAiB,EACjB,IAAa,EACb,UAAyD,EAAE,EAC3D,UAAgC,EAAE;QAElC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACvC,OAAO,kBAAkB,CACvB;YACE,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,EACD,SAAS,EACT,IAAI,EACJ,OAAO,EACP,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,oBAAoB,CAAC,SAAiB;QACpC,OAAO,KAAK,EAAE,GAAY,EAAqB,EAAE;YAC/C,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;gBAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACxC,MAAM,OAAO,GAA2B,EAAE,CAAC;gBAC3C,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;oBACjC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACvB,CAAC,CAAC,CAAC;gBAEH,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;gBAC1D,IAAI,IAAI,GAAY,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC7C,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC7C,IAAI,CAAC;wBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC;oBACpC,CAAC;oBAAC,MAAM,CAAC;wBACP,2BAA2B;oBAC7B,CAAC;gBACH,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/E,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;oBAC1C,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1E,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBAC1E,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;oBACtD,MAAM,EAAE,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;oBACpD,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,4BAA4B,CAChC,KAAwC;QAExC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,4BAA4B,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC;IACxF,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,0BAA0B,CAC9B,KAAsC;QAEtC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG;YAChB,GAAG,QAAQ,CAAC,SAAS;YACrB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC;QAEF,OAAO;YACL,GAAG,QAAQ;YACX,SAAS;YACT,YAAY,EAAE,MAAM,gCAAgC,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC;SACnF,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,+BAA+B,CACnC,KAA2C;QAE3C,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,+BAA+B,CACpC,KAAK,EACL,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAC9C,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,6BAA6B,CACjC,KAAyC;QAEzC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,SAAS,GAAG;YAChB,GAAG,QAAQ,CAAC,SAAS;YACrB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC;QAEF,OAAO;YACL,GAAG,QAAQ;YACX,SAAS;YACT,YAAY,EAAE,MAAM,gCAAgC,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC;SACnF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,CAAC;QACjB,IAAI,IAAI,CAAC,UAAU,YAAY,KAAK,EAAE,CAAC;YACrC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YACnC,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;YAClC,MAAM,UAAU,CAAC;QACnB,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,eAAe,CAAC,gCAAgC,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type { CanonicalSubscriptionInput } from "@shdan/submesh-core";
2
+ /**
3
+ * Returns the external subject identifier from a canonical subscription input,
4
+ * preferring `externalSubjectId` but falling back to `externalCustomerId`.
5
+ */
6
+ export declare function getExternalSubjectId(input: CanonicalSubscriptionInput): string | undefined;
7
+ //# sourceMappingURL=canonical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/utils/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEtE;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,0BAA0B,GAChC,MAAM,GAAG,SAAS,CAEpB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Returns the external subject identifier from a canonical subscription input,
3
+ * preferring `externalSubjectId` but falling back to `externalCustomerId`.
4
+ */
5
+ export function getExternalSubjectId(input) {
6
+ return input.externalSubjectId ?? input.externalCustomerId;
7
+ }
8
+ //# sourceMappingURL=canonical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/utils/canonical.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAiC;IAEjC,OAAO,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,kBAAkB,CAAC;AAC7D,CAAC"}