@quiltr/sdk 1.3.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 (138) hide show
  1. package/README.md +292 -0
  2. package/dist/client.d.ts +84 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +149 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/features/api-users/api-users.client.d.ts +52 -0
  7. package/dist/features/api-users/api-users.client.d.ts.map +1 -0
  8. package/dist/features/api-users/api-users.client.js +41 -0
  9. package/dist/features/api-users/api-users.client.js.map +1 -0
  10. package/dist/features/app-sessions/app-sessions.client.d.ts +22 -0
  11. package/dist/features/app-sessions/app-sessions.client.d.ts.map +1 -0
  12. package/dist/features/app-sessions/app-sessions.client.js +50 -0
  13. package/dist/features/app-sessions/app-sessions.client.js.map +1 -0
  14. package/dist/features/auth/auth.client.d.ts +32 -0
  15. package/dist/features/auth/auth.client.d.ts.map +1 -0
  16. package/dist/features/auth/auth.client.js +119 -0
  17. package/dist/features/auth/auth.client.js.map +1 -0
  18. package/dist/features/baskets/basket-operations.client.d.ts +89 -0
  19. package/dist/features/baskets/basket-operations.client.d.ts.map +1 -0
  20. package/dist/features/baskets/basket-operations.client.js +226 -0
  21. package/dist/features/baskets/basket-operations.client.js.map +1 -0
  22. package/dist/features/baskets/baskets.client.d.ts +10 -0
  23. package/dist/features/baskets/baskets.client.d.ts.map +1 -0
  24. package/dist/features/baskets/baskets.client.js +10 -0
  25. package/dist/features/baskets/baskets.client.js.map +1 -0
  26. package/dist/features/customers/customers.client.d.ts +10 -0
  27. package/dist/features/customers/customers.client.d.ts.map +1 -0
  28. package/dist/features/customers/customers.client.js +10 -0
  29. package/dist/features/customers/customers.client.js.map +1 -0
  30. package/dist/features/email-templates/email-templates.client.d.ts +9 -0
  31. package/dist/features/email-templates/email-templates.client.d.ts.map +1 -0
  32. package/dist/features/email-templates/email-templates.client.js +10 -0
  33. package/dist/features/email-templates/email-templates.client.js.map +1 -0
  34. package/dist/features/fascias/fascias.client.d.ts +9 -0
  35. package/dist/features/fascias/fascias.client.d.ts.map +1 -0
  36. package/dist/features/fascias/fascias.client.js +10 -0
  37. package/dist/features/fascias/fascias.client.js.map +1 -0
  38. package/dist/features/gift-cards/gift-card-operations.client.d.ts +24 -0
  39. package/dist/features/gift-cards/gift-card-operations.client.d.ts.map +1 -0
  40. package/dist/features/gift-cards/gift-card-operations.client.js +18 -0
  41. package/dist/features/gift-cards/gift-card-operations.client.js.map +1 -0
  42. package/dist/features/jobs/jobs.client.d.ts +20 -0
  43. package/dist/features/jobs/jobs.client.d.ts.map +1 -0
  44. package/dist/features/jobs/jobs.client.js +44 -0
  45. package/dist/features/jobs/jobs.client.js.map +1 -0
  46. package/dist/features/locations/locations.client.d.ts +9 -0
  47. package/dist/features/locations/locations.client.d.ts.map +1 -0
  48. package/dist/features/locations/locations.client.js +10 -0
  49. package/dist/features/locations/locations.client.js.map +1 -0
  50. package/dist/features/payments/payments.client.d.ts +22 -0
  51. package/dist/features/payments/payments.client.d.ts.map +1 -0
  52. package/dist/features/payments/payments.client.js +50 -0
  53. package/dist/features/payments/payments.client.js.map +1 -0
  54. package/dist/features/price-entries/price-entries.client.d.ts +9 -0
  55. package/dist/features/price-entries/price-entries.client.d.ts.map +1 -0
  56. package/dist/features/price-entries/price-entries.client.js +10 -0
  57. package/dist/features/price-entries/price-entries.client.js.map +1 -0
  58. package/dist/features/pricing/pricing.client.d.ts +20 -0
  59. package/dist/features/pricing/pricing.client.d.ts.map +1 -0
  60. package/dist/features/pricing/pricing.client.js +27 -0
  61. package/dist/features/pricing/pricing.client.js.map +1 -0
  62. package/dist/features/products/products.client.d.ts +20 -0
  63. package/dist/features/products/products.client.d.ts.map +1 -0
  64. package/dist/features/products/products.client.js +45 -0
  65. package/dist/features/products/products.client.js.map +1 -0
  66. package/dist/features/promotions/promotion.client.d.ts +33 -0
  67. package/dist/features/promotions/promotion.client.d.ts.map +1 -0
  68. package/dist/features/promotions/promotion.client.js +69 -0
  69. package/dist/features/promotions/promotion.client.js.map +1 -0
  70. package/dist/features/scripts/scripts.client.d.ts +17 -0
  71. package/dist/features/scripts/scripts.client.d.ts.map +1 -0
  72. package/dist/features/scripts/scripts.client.js +26 -0
  73. package/dist/features/scripts/scripts.client.js.map +1 -0
  74. package/dist/features/search/search.client.d.ts +17 -0
  75. package/dist/features/search/search.client.d.ts.map +1 -0
  76. package/dist/features/search/search.client.js +40 -0
  77. package/dist/features/search/search.client.js.map +1 -0
  78. package/dist/features/tasks/tasks.client.d.ts +9 -0
  79. package/dist/features/tasks/tasks.client.d.ts.map +1 -0
  80. package/dist/features/tasks/tasks.client.js +10 -0
  81. package/dist/features/tasks/tasks.client.js.map +1 -0
  82. package/dist/features/tax/tax-rule.client.d.ts +16 -0
  83. package/dist/features/tax/tax-rule.client.d.ts.map +1 -0
  84. package/dist/features/tax/tax-rule.client.js +18 -0
  85. package/dist/features/tax/tax-rule.client.js.map +1 -0
  86. package/dist/features/tenants/tenants.client.d.ts +21 -0
  87. package/dist/features/tenants/tenants.client.d.ts.map +1 -0
  88. package/dist/features/tenants/tenants.client.js +47 -0
  89. package/dist/features/tenants/tenants.client.js.map +1 -0
  90. package/dist/features/uploads/uploads.client.d.ts +21 -0
  91. package/dist/features/uploads/uploads.client.d.ts.map +1 -0
  92. package/dist/features/uploads/uploads.client.js +57 -0
  93. package/dist/features/uploads/uploads.client.js.map +1 -0
  94. package/dist/features/users/users.client.d.ts +9 -0
  95. package/dist/features/users/users.client.d.ts.map +1 -0
  96. package/dist/features/users/users.client.js +10 -0
  97. package/dist/features/users/users.client.js.map +1 -0
  98. package/dist/features/workflows/workflows.client.d.ts +38 -0
  99. package/dist/features/workflows/workflows.client.d.ts.map +1 -0
  100. package/dist/features/workflows/workflows.client.js +142 -0
  101. package/dist/features/workflows/workflows.client.js.map +1 -0
  102. package/dist/index.d.ts +33 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +38 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/shared/base-crud.client.d.ts +31 -0
  107. package/dist/shared/base-crud.client.d.ts.map +1 -0
  108. package/dist/shared/base-crud.client.js +97 -0
  109. package/dist/shared/base-crud.client.js.map +1 -0
  110. package/dist/shared/errors.d.ts +27 -0
  111. package/dist/shared/errors.d.ts.map +1 -0
  112. package/dist/shared/errors.js +67 -0
  113. package/dist/shared/errors.js.map +1 -0
  114. package/dist/shared/http-client.d.ts +56 -0
  115. package/dist/shared/http-client.d.ts.map +1 -0
  116. package/dist/shared/http-client.js +194 -0
  117. package/dist/shared/http-client.js.map +1 -0
  118. package/dist/shared/result.d.ts +15 -0
  119. package/dist/shared/result.d.ts.map +1 -0
  120. package/dist/shared/result.js +7 -0
  121. package/dist/shared/result.js.map +1 -0
  122. package/dist/shared/websocket.client.d.ts +40 -0
  123. package/dist/shared/websocket.client.d.ts.map +1 -0
  124. package/dist/shared/websocket.client.js +93 -0
  125. package/dist/shared/websocket.client.js.map +1 -0
  126. package/dist/types/common.types.d.ts +21 -0
  127. package/dist/types/common.types.d.ts.map +1 -0
  128. package/dist/types/common.types.js +5 -0
  129. package/dist/types/common.types.js.map +1 -0
  130. package/dist/types/index.d.ts +3 -0
  131. package/dist/types/index.d.ts.map +1 -0
  132. package/dist/types/index.js +3 -0
  133. package/dist/types/index.js.map +1 -0
  134. package/dist/utils/query-builder.d.ts +10 -0
  135. package/dist/utils/query-builder.d.ts.map +1 -0
  136. package/dist/utils/query-builder.js +33 -0
  137. package/dist/utils/query-builder.js.map +1 -0
  138. package/package.json +35 -0
package/dist/index.js ADDED
@@ -0,0 +1,38 @@
1
+ // Main SDK entry point
2
+ // Client
3
+ export { QuiltrClient } from './client';
4
+ // Result helpers
5
+ export { success, failure } from './shared/result';
6
+ // Error classes
7
+ export { SdkError, AuthError, NotFoundError, ValidationError, RateLimitError, NetworkError, } from './shared/errors';
8
+ // Feature clients (for advanced usage / custom composition)
9
+ export { AuthClient } from './features/auth/auth.client';
10
+ export { TenantsClient } from './features/tenants/tenants.client';
11
+ export { ProductsClient } from './features/products/products.client';
12
+ export { CustomersClient } from './features/customers/customers.client';
13
+ export { BasketsClient } from './features/baskets/baskets.client';
14
+ export { BasketOperationsClient } from './features/baskets/basket-operations.client';
15
+ export { ApiUsersClient } from './features/api-users/api-users.client';
16
+ export { WorkflowsClient } from './features/workflows/workflows.client';
17
+ export { JobsClient } from './features/jobs/jobs.client';
18
+ export { PaymentsClient } from './features/payments/payments.client';
19
+ export { SearchClient } from './features/search/search.client';
20
+ export { UploadsClient } from './features/uploads/uploads.client';
21
+ export { LocationsClient } from './features/locations/locations.client';
22
+ export { PriceEntriesClient } from './features/price-entries/price-entries.client';
23
+ export { FasciasClient } from './features/fascias/fascias.client';
24
+ export { TasksClient } from './features/tasks/tasks.client';
25
+ export { EmailTemplatesClient } from './features/email-templates/email-templates.client';
26
+ export { UsersClient } from './features/users/users.client';
27
+ export { ScriptsClient } from './features/scripts/scripts.client';
28
+ export { AppSessionsClient } from './features/app-sessions/app-sessions.client';
29
+ export { PricingClient } from './features/pricing/pricing.client';
30
+ export { GiftCardOperationsClient } from './features/gift-cards/gift-card-operations.client';
31
+ export { PromotionClient } from './features/promotions/promotion.client';
32
+ export { TaxRuleClient } from './features/tax/tax-rule.client';
33
+ export { WebSocketClient } from './shared/websocket.client';
34
+ // Shared (for extension)
35
+ export { HttpClient } from './shared/http-client';
36
+ export { BaseCrudClient } from './shared/base-crud.client';
37
+ export { buildQueryParams } from './utils/query-builder';
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AAEvB,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,iBAAiB;AACjB,OAAO,EAAe,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEhE,gBAAgB;AAChB,OAAO,EACL,QAAQ,EACR,SAAS,EACT,aAAa,EACb,eAAe,EACf,cAAc,EACd,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,4DAA4D;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,cAAc,EAAoF,MAAM,uCAAuC,CAAC;AACzJ,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAA6B,MAAM,mDAAmD,CAAC;AACxH,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,yBAAyB;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Base CRUD client.
3
+ * Larch Framework: DRY - all tenant-scoped entities share the same CRUD pattern.
4
+ *
5
+ * Provides: findAll, findOne, create, update (PUT+PATCH), delete,
6
+ * restore, hardDelete, batchCreate, batchUpdate, batchDelete, count.
7
+ */
8
+ import type { HttpClient } from './http-client';
9
+ import type { Result } from './result';
10
+ import type { SdkError } from './errors';
11
+ import type { PaginatedResult, BaseQueryParams, BatchCreateResult, BatchUpdateResult, BatchDeleteResult, BatchUpdateInput, BatchDeleteInput } from '../types';
12
+ export declare class BaseCrudClient<TEntity, TCreate, TUpdate = Partial<TCreate>, TQuery extends BaseQueryParams = BaseQueryParams> {
13
+ protected readonly http: HttpClient;
14
+ protected readonly basePath: string;
15
+ constructor(http: HttpClient, basePath: string);
16
+ findAll(params?: TQuery): Promise<Result<PaginatedResult<TEntity>, SdkError>>;
17
+ findOne(id: string): Promise<Result<TEntity, SdkError>>;
18
+ create(dto: TCreate): Promise<Result<TEntity, SdkError>>;
19
+ update(id: string, dto: TUpdate): Promise<Result<TEntity, SdkError>>;
20
+ replace(id: string, dto: TUpdate): Promise<Result<TEntity, SdkError>>;
21
+ delete(id: string): Promise<Result<void, SdkError>>;
22
+ restore(id: string): Promise<Result<TEntity, SdkError>>;
23
+ hardDelete(id: string): Promise<Result<void, SdkError>>;
24
+ count(params?: TQuery): Promise<Result<{
25
+ count: number;
26
+ }, SdkError>>;
27
+ batchCreate(items: TCreate[]): Promise<Result<BatchCreateResult<TEntity>, SdkError>>;
28
+ batchUpdate(items: BatchUpdateInput<TUpdate>[]): Promise<Result<BatchUpdateResult<TEntity>, SdkError>>;
29
+ batchDelete(input: BatchDeleteInput): Promise<Result<BatchDeleteResult, SdkError>>;
30
+ }
31
+ //# sourceMappingURL=base-crud.client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-crud.client.d.ts","sourceRoot":"","sources":["../../src/shared/base-crud.client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAGlB,qBAAa,cAAc,CACzB,OAAO,EACP,OAAO,EACP,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAC1B,MAAM,SAAS,eAAe,GAAG,eAAe;IAG9C,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU;IACnC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM;gBADhB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM;IAG/B,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;IAQ7E,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAOvD,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAQxD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAQpE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAQrE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAOnD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAOvD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAOvD,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,QAAQ,CAAC,CAAC;IAQpE,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;IAQpF,WAAW,CAAC,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;IAQtG,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;CAOzF"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Base CRUD client.
3
+ * Larch Framework: DRY - all tenant-scoped entities share the same CRUD pattern.
4
+ *
5
+ * Provides: findAll, findOne, create, update (PUT+PATCH), delete,
6
+ * restore, hardDelete, batchCreate, batchUpdate, batchDelete, count.
7
+ */
8
+ import { buildQueryParams } from '../utils/query-builder';
9
+ export class BaseCrudClient {
10
+ http;
11
+ basePath;
12
+ constructor(http, basePath) {
13
+ this.http = http;
14
+ this.basePath = basePath;
15
+ }
16
+ async findAll(params) {
17
+ return this.http.request({
18
+ method: 'GET',
19
+ path: this.basePath,
20
+ query: buildQueryParams(params),
21
+ });
22
+ }
23
+ async findOne(id) {
24
+ return this.http.request({
25
+ method: 'GET',
26
+ path: `${this.basePath}/${id}`,
27
+ });
28
+ }
29
+ async create(dto) {
30
+ return this.http.request({
31
+ method: 'POST',
32
+ path: this.basePath,
33
+ body: dto,
34
+ });
35
+ }
36
+ async update(id, dto) {
37
+ return this.http.request({
38
+ method: 'PATCH',
39
+ path: `${this.basePath}/${id}`,
40
+ body: dto,
41
+ });
42
+ }
43
+ async replace(id, dto) {
44
+ return this.http.request({
45
+ method: 'PUT',
46
+ path: `${this.basePath}/${id}`,
47
+ body: dto,
48
+ });
49
+ }
50
+ async delete(id) {
51
+ return this.http.request({
52
+ method: 'DELETE',
53
+ path: `${this.basePath}/${id}`,
54
+ });
55
+ }
56
+ async restore(id) {
57
+ return this.http.request({
58
+ method: 'PATCH',
59
+ path: `${this.basePath}/${id}/restore`,
60
+ });
61
+ }
62
+ async hardDelete(id) {
63
+ return this.http.request({
64
+ method: 'DELETE',
65
+ path: `${this.basePath}/${id}/hard`,
66
+ });
67
+ }
68
+ async count(params) {
69
+ return this.http.request({
70
+ method: 'GET',
71
+ path: `${this.basePath}/count`,
72
+ query: buildQueryParams(params),
73
+ });
74
+ }
75
+ async batchCreate(items) {
76
+ return this.http.request({
77
+ method: 'POST',
78
+ path: `${this.basePath}/batch/create`,
79
+ body: items,
80
+ });
81
+ }
82
+ async batchUpdate(items) {
83
+ return this.http.request({
84
+ method: 'PATCH',
85
+ path: `${this.basePath}/batch/update`,
86
+ body: items,
87
+ });
88
+ }
89
+ async batchDelete(input) {
90
+ return this.http.request({
91
+ method: 'DELETE',
92
+ path: `${this.basePath}/batch/delete`,
93
+ body: input,
94
+ });
95
+ }
96
+ }
97
+ //# sourceMappingURL=base-crud.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-crud.client.js","sourceRoot":"","sources":["../../src/shared/base-crud.client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * SDK Error hierarchy.
3
+ * Larch Framework: Custom error types for clear error handling.
4
+ */
5
+ export declare class SdkError extends Error {
6
+ readonly statusCode?: number | undefined;
7
+ readonly code?: string | undefined;
8
+ readonly details?: unknown | undefined;
9
+ constructor(message: string, statusCode?: number | undefined, code?: string | undefined, details?: unknown | undefined);
10
+ }
11
+ export declare class AuthError extends SdkError {
12
+ constructor(message: string, statusCode?: number, details?: unknown);
13
+ }
14
+ export declare class NotFoundError extends SdkError {
15
+ constructor(message: string);
16
+ }
17
+ export declare class ValidationError extends SdkError {
18
+ constructor(message: string, details?: unknown);
19
+ }
20
+ export declare class RateLimitError extends SdkError {
21
+ constructor(retryAfterMs?: number);
22
+ }
23
+ export declare class NetworkError extends SdkError {
24
+ constructor(message: string);
25
+ }
26
+ export declare function mapHttpError(status: number, body: any): SdkError;
27
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,QAAS,SAAQ,KAAK;aAGf,UAAU,CAAC,EAAE,MAAM;aACnB,IAAI,CAAC,EAAE,MAAM;aACb,OAAO,CAAC,EAAE,OAAO;gBAHjC,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,OAAO,CAAC,EAAE,OAAO,YAAA;CAKpC;AAED,qBAAa,SAAU,SAAQ,QAAQ;gBACzB,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAIpE;AAED,qBAAa,aAAc,SAAQ,QAAQ;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C;AAED,qBAAa,cAAe,SAAQ,QAAQ;gBAC9B,YAAY,CAAC,EAAE,MAAM;CAIlC;AAED,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,QAAQ,CAoBhE"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * SDK Error hierarchy.
3
+ * Larch Framework: Custom error types for clear error handling.
4
+ */
5
+ export class SdkError extends Error {
6
+ statusCode;
7
+ code;
8
+ details;
9
+ constructor(message, statusCode, code, details) {
10
+ super(message);
11
+ this.statusCode = statusCode;
12
+ this.code = code;
13
+ this.details = details;
14
+ this.name = 'SdkError';
15
+ }
16
+ }
17
+ export class AuthError extends SdkError {
18
+ constructor(message, statusCode, details) {
19
+ super(message, statusCode, 'AUTH_ERROR', details);
20
+ this.name = 'AuthError';
21
+ }
22
+ }
23
+ export class NotFoundError extends SdkError {
24
+ constructor(message) {
25
+ super(message, 404, 'NOT_FOUND');
26
+ this.name = 'NotFoundError';
27
+ }
28
+ }
29
+ export class ValidationError extends SdkError {
30
+ constructor(message, details) {
31
+ super(message, 400, 'VALIDATION_ERROR', details);
32
+ this.name = 'ValidationError';
33
+ }
34
+ }
35
+ export class RateLimitError extends SdkError {
36
+ constructor(retryAfterMs) {
37
+ super('Rate limit exceeded', 429, 'RATE_LIMIT', { retryAfterMs });
38
+ this.name = 'RateLimitError';
39
+ }
40
+ }
41
+ export class NetworkError extends SdkError {
42
+ constructor(message) {
43
+ super(message, undefined, 'NETWORK_ERROR');
44
+ this.name = 'NetworkError';
45
+ }
46
+ }
47
+ export function mapHttpError(status, body) {
48
+ // New envelope shape: { success: false, error: { message, code, statusCode, errors?, requestId } }
49
+ const err = body?.error;
50
+ const message = err?.message || body?.message || body?.error || `HTTP ${status}`;
51
+ const details = err?.errors || body?.details;
52
+ switch (status) {
53
+ case 400:
54
+ return new ValidationError(message, details);
55
+ case 401:
56
+ return new AuthError(message, 401, details);
57
+ case 403:
58
+ return new AuthError('Forbidden', 403, details);
59
+ case 404:
60
+ return new NotFoundError(message);
61
+ case 429:
62
+ return new RateLimitError(body?.retryAfterMs);
63
+ default:
64
+ return new SdkError(message, status, err?.code, details);
65
+ }
66
+ }
67
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IACA;IACA;IAJlB,YACE,OAAe,EACC,UAAmB,EACnB,IAAa,EACb,OAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,eAAU,GAAV,UAAU,CAAS;QACnB,SAAI,GAAJ,IAAI,CAAS;QACb,YAAO,GAAP,OAAO,CAAU;QAGjC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,QAAQ;IACrC,YAAY,OAAe,EAAE,UAAmB,EAAE,OAAiB;QACjE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,QAAQ;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,OAAe,EAAE,OAAiB;QAC5C,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,QAAQ;IAC1C,YAAY,YAAqB;QAC/B,KAAK,CAAC,qBAAqB,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAS;IACpD,mGAAmG;IACnG,MAAM,GAAG,GAAG,IAAI,EAAE,KAAK,CAAC;IACxB,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,IAAI,QAAQ,MAAM,EAAE,CAAC;IACjF,MAAM,OAAO,GAAG,GAAG,EAAE,MAAM,IAAI,IAAI,EAAE,OAAO,CAAC;IAE7C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,GAAG;YACN,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,KAAK,GAAG;YACN,OAAO,IAAI,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9C,KAAK,GAAG;YACN,OAAO,IAAI,SAAS,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAClD,KAAK,GAAG;YACN,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,GAAG;YACN,OAAO,IAAI,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAChD;YACE,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * HTTP client wrapper using native fetch.
3
+ * Larch Framework: DIP - abstracts HTTP transport behind a clean interface.
4
+ *
5
+ * Features:
6
+ * - Automatic Bearer token injection
7
+ * - Token refresh on 401
8
+ * - Retry with backoff for transient failures (5xx, network errors)
9
+ * - Result type returns (no thrown exceptions)
10
+ * - Request timeout support
11
+ */
12
+ import type { SdkConfig } from '../types/common.types';
13
+ import { type Result } from './result';
14
+ import { SdkError } from './errors';
15
+ export interface RequestOptions {
16
+ method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
17
+ path: string;
18
+ body?: unknown;
19
+ query?: Record<string, unknown>;
20
+ headers?: Record<string, string>;
21
+ /** Skip auth header (for public endpoints) */
22
+ skipAuth?: boolean;
23
+ /** Override timeout for this request */
24
+ timeout?: number;
25
+ }
26
+ export declare class HttpClient {
27
+ private readonly config;
28
+ private accessToken;
29
+ private refreshToken;
30
+ private refreshPromise;
31
+ constructor(config: SdkConfig);
32
+ setTokens(accessToken: string, refreshToken: string): void;
33
+ clearTokens(): void;
34
+ getAccessToken(): string | null;
35
+ getRefreshToken(): string | null;
36
+ request<T>(options: RequestOptions): Promise<Result<T, SdkError>>;
37
+ private executeRequest;
38
+ private attemptTokenRefresh;
39
+ private buildUrl;
40
+ /**
41
+ * Unwrap the server's response envelope.
42
+ *
43
+ * The API returns all responses in a unified envelope:
44
+ * Success single: { success: true, data: { ... } }
45
+ * Success paginated: { success: true, data: [...], meta: { ... } }
46
+ * Success other: { success: true, data: { count: N } }
47
+ *
48
+ * This method extracts the inner payload so SDK consumers see clean types:
49
+ * - Paginated: { data: [...], meta: { ... } } (PaginatedResult<T>)
50
+ * - Single: the entity object directly
51
+ * - Non-enveloped: returned as-is (backwards compat)
52
+ */
53
+ private unwrapEnvelope;
54
+ private delay;
55
+ }
56
+ //# sourceMappingURL=http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/shared/http-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,KAAK,MAAM,EAAoB,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,QAAQ,EAA8B,MAAM,UAAU,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,UAAU;IAKT,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,cAAc,CAAiC;gBAE1B,MAAM,EAAE,SAAS;IAE9C,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAK1D,WAAW,IAAI,IAAI;IAKnB,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B,eAAe,IAAI,MAAM,GAAG,IAAI;IAI1B,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAwCzD,cAAc;YAiEd,mBAAmB;IAwBjC,OAAO,CAAC,QAAQ;IAgBhB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * HTTP client wrapper using native fetch.
3
+ * Larch Framework: DIP - abstracts HTTP transport behind a clean interface.
4
+ *
5
+ * Features:
6
+ * - Automatic Bearer token injection
7
+ * - Token refresh on 401
8
+ * - Retry with backoff for transient failures (5xx, network errors)
9
+ * - Result type returns (no thrown exceptions)
10
+ * - Request timeout support
11
+ */
12
+ import { success, failure } from './result';
13
+ import { SdkError, NetworkError, mapHttpError } from './errors';
14
+ export class HttpClient {
15
+ config;
16
+ accessToken = null;
17
+ refreshToken = null;
18
+ refreshPromise = null;
19
+ constructor(config) {
20
+ this.config = config;
21
+ }
22
+ setTokens(accessToken, refreshToken) {
23
+ this.accessToken = accessToken;
24
+ this.refreshToken = refreshToken;
25
+ }
26
+ clearTokens() {
27
+ this.accessToken = null;
28
+ this.refreshToken = null;
29
+ }
30
+ getAccessToken() {
31
+ return this.accessToken;
32
+ }
33
+ getRefreshToken() {
34
+ return this.refreshToken;
35
+ }
36
+ async request(options) {
37
+ const maxRetries = this.config.maxRetries ?? 2;
38
+ let lastError = null;
39
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
40
+ const result = await this.executeRequest(options);
41
+ if (result.success)
42
+ return result;
43
+ lastError = result.error;
44
+ // On 401, attempt token refresh (once)
45
+ if (result.error.statusCode === 401 && attempt === 0 && !options.skipAuth) {
46
+ const refreshed = await this.attemptTokenRefresh();
47
+ if (refreshed) {
48
+ // Retry the original request with new token
49
+ const retryResult = await this.executeRequest(options);
50
+ return retryResult;
51
+ }
52
+ // Refresh failed - auth is gone
53
+ this.config.onAuthExpired?.();
54
+ return result;
55
+ }
56
+ // Only retry on transient failures (5xx, network errors)
57
+ const isTransient = result.error instanceof NetworkError ||
58
+ (result.error.statusCode !== undefined && result.error.statusCode >= 500);
59
+ if (!isTransient)
60
+ return result;
61
+ // Backoff before retry
62
+ if (attempt < maxRetries) {
63
+ await this.delay(Math.pow(2, attempt) * 300);
64
+ }
65
+ }
66
+ return failure(lastError || new SdkError('Request failed after retries'));
67
+ }
68
+ async executeRequest(options) {
69
+ const url = this.buildUrl(options.path, options.query);
70
+ const timeout = options.timeout ?? this.config.timeout ?? 30000;
71
+ const headers = {
72
+ 'Content-Type': 'application/json',
73
+ 'x-requested-with': 'sdk',
74
+ ...this.config.headers,
75
+ ...options.headers,
76
+ };
77
+ if (!options.skipAuth && this.accessToken) {
78
+ headers['Authorization'] = `Bearer ${this.accessToken}`;
79
+ }
80
+ const controller = new AbortController();
81
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
82
+ try {
83
+ const response = await fetch(url, {
84
+ method: options.method,
85
+ headers,
86
+ body: options.body !== undefined ? JSON.stringify(options.body) : undefined,
87
+ signal: controller.signal,
88
+ });
89
+ clearTimeout(timeoutId);
90
+ if (response.ok) {
91
+ // Handle 204 No Content
92
+ if (response.status === 204) {
93
+ return success(undefined);
94
+ }
95
+ const contentType = response.headers.get('content-type');
96
+ if (contentType?.includes('application/json')) {
97
+ const json = await response.json();
98
+ return success(this.unwrapEnvelope(json));
99
+ }
100
+ const text = await response.text();
101
+ return success(text);
102
+ }
103
+ // Error response
104
+ let body;
105
+ try {
106
+ body = await response.json();
107
+ }
108
+ catch {
109
+ body = { message: response.statusText };
110
+ }
111
+ return failure(mapHttpError(response.status, body));
112
+ }
113
+ catch (error) {
114
+ clearTimeout(timeoutId);
115
+ if (error instanceof DOMException && error.name === 'AbortError') {
116
+ return failure(new NetworkError(`Request timeout after ${timeout}ms`));
117
+ }
118
+ const message = error instanceof Error ? error.message : 'Network error';
119
+ return failure(new NetworkError(message));
120
+ }
121
+ }
122
+ async attemptTokenRefresh() {
123
+ if (!this.refreshToken || !this.config.onTokenRefresh)
124
+ return false;
125
+ // Deduplicate concurrent refresh attempts
126
+ if (this.refreshPromise)
127
+ return this.refreshPromise;
128
+ this.refreshPromise = (async () => {
129
+ try {
130
+ const tokens = await this.config.onTokenRefresh(this.refreshToken);
131
+ if (tokens) {
132
+ this.setTokens(tokens.accessToken, tokens.refreshToken);
133
+ return true;
134
+ }
135
+ return false;
136
+ }
137
+ catch {
138
+ return false;
139
+ }
140
+ finally {
141
+ this.refreshPromise = null;
142
+ }
143
+ })();
144
+ return this.refreshPromise;
145
+ }
146
+ buildUrl(path, query) {
147
+ const base = this.config.baseUrl.replace(/\/+$/, '');
148
+ const cleanPath = path.startsWith('/') ? path : `/${path}`;
149
+ const url = new URL(`${base}${cleanPath}`);
150
+ if (query) {
151
+ for (const [key, value] of Object.entries(query)) {
152
+ if (value !== undefined && value !== null) {
153
+ url.searchParams.set(key, String(value));
154
+ }
155
+ }
156
+ }
157
+ return url.toString();
158
+ }
159
+ /**
160
+ * Unwrap the server's response envelope.
161
+ *
162
+ * The API returns all responses in a unified envelope:
163
+ * Success single: { success: true, data: { ... } }
164
+ * Success paginated: { success: true, data: [...], meta: { ... } }
165
+ * Success other: { success: true, data: { count: N } }
166
+ *
167
+ * This method extracts the inner payload so SDK consumers see clean types:
168
+ * - Paginated: { data: [...], meta: { ... } } (PaginatedResult<T>)
169
+ * - Single: the entity object directly
170
+ * - Non-enveloped: returned as-is (backwards compat)
171
+ */
172
+ unwrapEnvelope(json) {
173
+ if (json && typeof json === 'object' && 'success' in json && json.success === true) {
174
+ // Paginated response: { success, data: [...], meta: { ... }, facets?: [...] }
175
+ if ('meta' in json && json.meta && typeof json.meta === 'object') {
176
+ const result = { data: json.data, meta: json.meta };
177
+ if ('facets' in json && json.facets !== undefined) {
178
+ result.facets = json.facets;
179
+ }
180
+ return result;
181
+ }
182
+ // All other enveloped responses: extract data
183
+ if ('data' in json) {
184
+ return json.data;
185
+ }
186
+ }
187
+ // Non-enveloped response (backwards compat)
188
+ return json;
189
+ }
190
+ delay(ms) {
191
+ return new Promise(resolve => setTimeout(resolve, ms));
192
+ }
193
+ }
194
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/shared/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Result type for handling success/error without exceptions.
3
+ * Larch Framework: Return errors as values, not thrown exceptions.
4
+ */
5
+ export type Result<T, E = SdkError> = {
6
+ success: true;
7
+ data: T;
8
+ } | {
9
+ success: false;
10
+ error: E;
11
+ };
12
+ export declare function success<T>(data: T): Result<T, never>;
13
+ export declare function failure<E>(error: E): Result<never, E>;
14
+ import type { SdkError } from './errors';
15
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/shared/result.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,IAC9B;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC1B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAEjC,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAEpD;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAErD;AAED,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,7 @@
1
+ export function success(data) {
2
+ return { success: true, data };
3
+ }
4
+ export function failure(error) {
5
+ return { success: false, error };
6
+ }
7
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/shared/result.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,OAAO,CAAI,IAAO;IAChC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,OAAO,CAAI,KAAQ;IACjC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * WebSocket client wrapper for real-time updates.
3
+ * Uses socket.io-client for workflow and job progress events.
4
+ *
5
+ * Socket.IO is an optional peer dependency - this module gracefully
6
+ * degrades if socket.io-client is not installed.
7
+ */
8
+ import type { SdkConfig } from '../types/common.types';
9
+ import type { Job, WorkflowInstance } from '../types';
10
+ export interface WebSocketOptions {
11
+ /** Auto-connect on creation (default: false) */
12
+ autoConnect?: boolean;
13
+ /** Socket.IO namespace (default: '/') */
14
+ namespace?: string;
15
+ /** Additional auth data to send on connection */
16
+ auth?: Record<string, string>;
17
+ }
18
+ export declare class WebSocketClient {
19
+ private readonly config;
20
+ private readonly getAccessToken;
21
+ private socket;
22
+ private listeners;
23
+ constructor(config: SdkConfig, getAccessToken: () => string | null);
24
+ /**
25
+ * Connect to the WebSocket server.
26
+ * Requires socket.io-client to be installed as a peer dependency.
27
+ */
28
+ connect(options?: WebSocketOptions): Promise<void>;
29
+ disconnect(): void;
30
+ get isConnected(): boolean;
31
+ onJobProgress(jobId: string, callback: (job: Partial<Job>) => void): () => void;
32
+ onJobComplete(jobId: string, callback: (job: Job) => void): () => void;
33
+ onJobFailed(jobId: string, callback: (job: Job) => void): () => void;
34
+ onWorkflowTransition(instanceId: string, callback: (instance: WorkflowInstance) => void): () => void;
35
+ onWorkflowComplete(instanceId: string, callback: (instance: WorkflowInstance) => void): () => void;
36
+ on(event: string, callback: (...args: any[]) => void): () => void;
37
+ emit(event: string, ...args: any[]): void;
38
+ private subscribe;
39
+ }
40
+ //# sourceMappingURL=websocket.client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.client.d.ts","sourceRoot":"","sources":["../../src/shared/websocket.client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAWtD,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,qBAAa,eAAe;IAKxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc;IALjC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,SAAS,CAAoD;gBAGlD,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI;IAGtD;;;OAGG;IACG,OAAO,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCxD,UAAU,IAAI,IAAI;IAMlB,IAAI,WAAW,IAAI,OAAO,CAEzB;IAID,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAI/E,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAItE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAMpE,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAIpG,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAMlG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI;IAIjE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIzC,OAAO,CAAC,SAAS;CAalB"}