@commercejs/adapter-salla 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 (73) hide show
  1. package/dist/__tests__/adapter.contract.test.d.ts +2 -0
  2. package/dist/__tests__/adapter.contract.test.d.ts.map +1 -0
  3. package/dist/__tests__/adapter.contract.test.js +228 -0
  4. package/dist/__tests__/adapter.contract.test.js.map +1 -0
  5. package/dist/__tests__/mappers.test.d.ts +2 -0
  6. package/dist/__tests__/mappers.test.d.ts.map +1 -0
  7. package/dist/__tests__/mappers.test.js +512 -0
  8. package/dist/__tests__/mappers.test.js.map +1 -0
  9. package/dist/adapter.d.ts +85 -0
  10. package/dist/adapter.d.ts.map +1 -0
  11. package/dist/adapter.js +492 -0
  12. package/dist/adapter.js.map +1 -0
  13. package/dist/client.d.ts +43 -0
  14. package/dist/client.d.ts.map +1 -0
  15. package/dist/client.js +162 -0
  16. package/dist/client.js.map +1 -0
  17. package/dist/index.d.ts +6 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +7 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/mappers/brand.d.ts +4 -0
  22. package/dist/mappers/brand.d.ts.map +1 -0
  23. package/dist/mappers/brand.js +20 -0
  24. package/dist/mappers/brand.js.map +1 -0
  25. package/dist/mappers/category.d.ts +5 -0
  26. package/dist/mappers/category.d.ts.map +1 -0
  27. package/dist/mappers/category.js +25 -0
  28. package/dist/mappers/category.js.map +1 -0
  29. package/dist/mappers/country.d.ts +4 -0
  30. package/dist/mappers/country.d.ts.map +1 -0
  31. package/dist/mappers/country.js +14 -0
  32. package/dist/mappers/country.js.map +1 -0
  33. package/dist/mappers/customer.d.ts +7 -0
  34. package/dist/mappers/customer.d.ts.map +1 -0
  35. package/dist/mappers/customer.js +45 -0
  36. package/dist/mappers/customer.js.map +1 -0
  37. package/dist/mappers/index.d.ts +12 -0
  38. package/dist/mappers/index.d.ts.map +1 -0
  39. package/dist/mappers/index.js +15 -0
  40. package/dist/mappers/index.js.map +1 -0
  41. package/dist/mappers/location.d.ts +4 -0
  42. package/dist/mappers/location.d.ts.map +1 -0
  43. package/dist/mappers/location.js +44 -0
  44. package/dist/mappers/location.js.map +1 -0
  45. package/dist/mappers/order-status.d.ts +7 -0
  46. package/dist/mappers/order-status.d.ts.map +1 -0
  47. package/dist/mappers/order-status.js +38 -0
  48. package/dist/mappers/order-status.js.map +1 -0
  49. package/dist/mappers/order.d.ts +5 -0
  50. package/dist/mappers/order.d.ts.map +1 -0
  51. package/dist/mappers/order.js +141 -0
  52. package/dist/mappers/order.js.map +1 -0
  53. package/dist/mappers/payment.d.ts +5 -0
  54. package/dist/mappers/payment.d.ts.map +1 -0
  55. package/dist/mappers/payment.js +20 -0
  56. package/dist/mappers/payment.js.map +1 -0
  57. package/dist/mappers/product.d.ts +5 -0
  58. package/dist/mappers/product.d.ts.map +1 -0
  59. package/dist/mappers/product.js +143 -0
  60. package/dist/mappers/product.js.map +1 -0
  61. package/dist/mappers/review.d.ts +5 -0
  62. package/dist/mappers/review.d.ts.map +1 -0
  63. package/dist/mappers/review.js +17 -0
  64. package/dist/mappers/review.js.map +1 -0
  65. package/dist/mappers/shipping.d.ts +5 -0
  66. package/dist/mappers/shipping.d.ts.map +1 -0
  67. package/dist/mappers/shipping.js +20 -0
  68. package/dist/mappers/shipping.js.map +1 -0
  69. package/dist/types.d.ts +472 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.js +5 -0
  72. package/dist/types.js.map +1 -0
  73. package/package.json +32 -0
package/dist/client.js ADDED
@@ -0,0 +1,162 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Salla HTTP client — wraps ofetch with auth, pagination, and error mapping
3
+ // ---------------------------------------------------------------------------
4
+ import { ofetch } from 'ofetch';
5
+ import { CommerceError } from '@commercejs/types';
6
+ const DEFAULT_BASE_URL = 'https://api.salla.dev/admin/v2';
7
+ const DEFAULT_TIMEOUT = 30_000;
8
+ const SALLA_TOKEN_URL = 'https://accounts.salla.sa/oauth2/token';
9
+ export class SallaClient {
10
+ http;
11
+ config;
12
+ // Token refresh state
13
+ _accessToken;
14
+ _refreshPromise = null;
15
+ constructor(config) {
16
+ this.config = config;
17
+ this._accessToken = config.accessToken;
18
+ this.http = this.createHttpClient(this._accessToken);
19
+ }
20
+ // ---- Internal: create ofetch instance with a given token ----
21
+ createHttpClient(token) {
22
+ return ofetch.create({
23
+ baseURL: this.config.baseUrl ?? DEFAULT_BASE_URL,
24
+ timeout: this.config.timeout ?? DEFAULT_TIMEOUT,
25
+ headers: {
26
+ Authorization: `Bearer ${token}`,
27
+ Accept: 'application/json',
28
+ 'Content-Type': 'application/json',
29
+ },
30
+ retry: 2,
31
+ retryDelay: 500,
32
+ onResponseError({ response: _response }) {
33
+ const response = _response;
34
+ const status = response?.status ?? 0;
35
+ const body = response?._data;
36
+ const message = body?.error?.message ?? body?.message ?? `Salla API error (HTTP ${status})`;
37
+ let code;
38
+ if (status === 401)
39
+ code = 'UNAUTHORIZED';
40
+ else if (status === 403)
41
+ code = 'FORBIDDEN';
42
+ else if (status === 404 || status === 422)
43
+ code = 'VALIDATION';
44
+ else if (status >= 500)
45
+ code = 'PLATFORM_ERROR';
46
+ else
47
+ code = 'UNKNOWN';
48
+ throw new CommerceError(message, code, status);
49
+ },
50
+ });
51
+ }
52
+ // ---- Token Refresh ----
53
+ /** Whether this client has the credentials needed for token refresh */
54
+ get canRefresh() {
55
+ const { refreshToken, clientId, clientSecret } = this.config;
56
+ return !!(refreshToken && clientId && clientSecret);
57
+ }
58
+ /**
59
+ * Refresh the OAuth access token using the refresh token.
60
+ * Uses a mutex so concurrent 401s only trigger one refresh.
61
+ */
62
+ async refreshAccessToken() {
63
+ if (!this.canRefresh) {
64
+ throw new CommerceError('Cannot refresh token — missing refreshToken, clientId, or clientSecret', 'UNAUTHORIZED', 401);
65
+ }
66
+ // Mutex: if a refresh is already in flight, wait for it
67
+ if (this._refreshPromise) {
68
+ return this._refreshPromise;
69
+ }
70
+ this._refreshPromise = this._doRefresh();
71
+ try {
72
+ const newToken = await this._refreshPromise;
73
+ return newToken;
74
+ }
75
+ finally {
76
+ this._refreshPromise = null;
77
+ }
78
+ }
79
+ async _doRefresh() {
80
+ const { refreshToken, clientId, clientSecret } = this.config;
81
+ const response = await ofetch(SALLA_TOKEN_URL, {
82
+ method: 'POST',
83
+ body: {
84
+ grant_type: 'refresh_token',
85
+ refresh_token: refreshToken,
86
+ client_id: clientId,
87
+ client_secret: clientSecret,
88
+ },
89
+ headers: {
90
+ 'Content-Type': 'application/json',
91
+ },
92
+ });
93
+ // Update internal state
94
+ this._accessToken = response.access_token;
95
+ // Update the refresh token if a new one was issued
96
+ if (response.refresh_token) {
97
+ ;
98
+ this.config.refreshToken = response.refresh_token;
99
+ }
100
+ // Recreate the HTTP client with the new token
101
+ this.http = this.createHttpClient(this._accessToken);
102
+ return this._accessToken;
103
+ }
104
+ // ---- Request wrapper with automatic 401 retry ----
105
+ /**
106
+ * Execute a request. If it fails with 401 and refresh credentials
107
+ * are available, refresh the token and retry once.
108
+ */
109
+ async withRefreshRetry(fn) {
110
+ try {
111
+ return await fn(this.http);
112
+ }
113
+ catch (error) {
114
+ const err = error;
115
+ if (err instanceof CommerceError &&
116
+ err.code === 'UNAUTHORIZED' &&
117
+ this.canRefresh) {
118
+ // Refresh and retry once
119
+ await this.refreshAccessToken();
120
+ return fn(this.http);
121
+ }
122
+ throw err;
123
+ }
124
+ }
125
+ // ---- Core request methods ----
126
+ /** GET request — returns the unwrapped response from Salla's response envelope */
127
+ async get(path, query) {
128
+ return this.withRefreshRetry((http) => http(path, { method: 'GET', query }));
129
+ }
130
+ /** POST request */
131
+ async post(path, body) {
132
+ return this.withRefreshRetry((http) => http(path, { method: 'POST', body }));
133
+ }
134
+ /** PUT request */
135
+ async put(path, body) {
136
+ return this.withRefreshRetry((http) => http(path, { method: 'PUT', body }));
137
+ }
138
+ /** DELETE request */
139
+ async delete(path) {
140
+ return this.withRefreshRetry((http) => http(path, { method: 'DELETE' }));
141
+ }
142
+ // ---- Pagination helper ----
143
+ /** Fetch a paginated list from Salla and return data + pagination */
144
+ async paginated(path, params) {
145
+ // Build query — strip our camelCase keys and use Salla's snake_case
146
+ const { page, perPage, ...rest } = params ?? {};
147
+ const query = {
148
+ ...rest,
149
+ ...(page ? { page } : {}),
150
+ ...(perPage ? { per_page: perPage } : {}),
151
+ };
152
+ const response = await this.get(path, query);
153
+ return {
154
+ data: response.data,
155
+ total: response.pagination?.total ?? response.data.length,
156
+ page: response.pagination?.currentPage ?? 1,
157
+ perPage: response.pagination?.perPage ?? response.data.length,
158
+ totalPages: response.pagination?.totalPages ?? 1,
159
+ };
160
+ }
161
+ }
162
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { SallaAdapter } from './adapter.js';
2
+ export { SallaClient } from './client.js';
3
+ export type { SallaConfig } from './types.js';
4
+ export type { SallaApiResponse, SallaRawProduct, SallaRawCategory, SallaRawCustomer, SallaRawOrder, SallaRawOrderItem, SallaRawOrderStatus, SallaRawOrderHistory, SallaRawReview, SallaRawShippingCompany, SallaRawPaymentMethod, SallaRawCoupon, SallaRawStoreInfo, SallaRawCurrency, SallaRawImage, SallaRawOption, SallaRawSku, SallaRawAddress, SallaRawBrand, SallaRawCountry, SallaRawBranch, } from './types.js';
5
+ export { mapSallaProduct, mapSallaCategory, mapSallaCustomer, mapSallaAddress, mapSallaOrder, mapSallaOrderStatus, mapSallaOrderHistory, mapSallaReview, mapSallaShipping, mapSallaPayment, mapSallaBrand, mapSallaCountry, mapSallaBranch, } from './mappers/index.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAG3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzC,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG7C,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,WAAW,EACX,eAAe,EACf,aAAa,EACb,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ // Adapter
2
+ export { SallaAdapter } from './adapter.js';
3
+ // Client (for advanced usage / custom requests)
4
+ export { SallaClient } from './client.js';
5
+ // Mappers (for custom transformations)
6
+ export { mapSallaProduct, mapSallaCategory, mapSallaCustomer, mapSallaAddress, mapSallaOrder, mapSallaOrderStatus, mapSallaOrderHistory, mapSallaReview, mapSallaShipping, mapSallaPayment, mapSallaBrand, mapSallaCountry, mapSallaBranch, } from './mappers/index.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,gDAAgD;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AA8BzC,uCAAuC;AACvC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Brand } from '@commercejs/types';
2
+ import type { SallaRawBrand } from '../types.js';
3
+ export declare function mapSallaBrand(raw: SallaRawBrand, locale?: string): Brand;
4
+ //# sourceMappingURL=brand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/mappers/brand.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAiC,MAAM,mBAAmB,CAAA;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAOhD,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,EAAE,MAAM,GAAE,MAAa,GAAG,KAAK,CAW9E"}
@@ -0,0 +1,20 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Salla → Brand mapper
3
+ // ---------------------------------------------------------------------------
4
+ function toLocalized(value, locale = 'ar') {
5
+ if (locale === 'en')
6
+ return { ar: '', en: value ?? '' };
7
+ return { ar: value ?? '', en: '' };
8
+ }
9
+ export function mapSallaBrand(raw, locale = 'ar') {
10
+ const logo = raw.logo ? { url: raw.logo, alt: raw.name } : null;
11
+ return {
12
+ id: String(raw.id),
13
+ name: toLocalized(raw.name, locale),
14
+ slug: raw.slug ?? String(raw.id),
15
+ logo,
16
+ description: raw.description ? toLocalized(raw.description, locale) : null,
17
+ isActive: raw.status === 'active',
18
+ };
19
+ }
20
+ //# sourceMappingURL=brand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand.js","sourceRoot":"","sources":["../../src/mappers/brand.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAK9E,SAAS,WAAW,CAAC,KAAoB,EAAE,SAAiB,IAAI;IAC9D,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,CAAA;IACvD,OAAO,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAA;AACpC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAkB,EAAE,SAAiB,IAAI;IACrE,MAAM,IAAI,GAAiB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IAE7E,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC;QACnC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,IAAI;QACJ,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1E,QAAQ,EAAE,GAAG,CAAC,MAAM,KAAK,QAAQ;KAClC,CAAA;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Category } from '@commercejs/types';
2
+ import type { SallaRawCategory } from '../types.js';
3
+ /** Map Salla raw category → unified Category */
4
+ export declare function mapSallaCategory(raw: SallaRawCategory, locale?: string): Category;
5
+ //# sourceMappingURL=category.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category.d.ts","sourceRoot":"","sources":["../../src/mappers/category.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAiC,MAAM,mBAAmB,CAAA;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAOnD,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,GAAE,MAAa,GAAG,QAAQ,CAevF"}
@@ -0,0 +1,25 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Salla → Category mapper
3
+ // ---------------------------------------------------------------------------
4
+ function toLocalized(value, locale = 'ar') {
5
+ if (locale === 'en')
6
+ return { ar: '', en: value ?? '' };
7
+ return { ar: value ?? '', en: '' };
8
+ }
9
+ /** Map Salla raw category → unified Category */
10
+ export function mapSallaCategory(raw, locale = 'ar') {
11
+ const image = raw.image
12
+ ? { url: raw.image.url, alt: raw.image.alt ?? '' }
13
+ : null;
14
+ return {
15
+ id: String(raw.id),
16
+ name: toLocalized(raw.name, locale),
17
+ slug: raw.slug,
18
+ description: raw.description ? toLocalized(raw.description, locale) : null,
19
+ image,
20
+ parentId: raw.parent_id ? String(raw.parent_id) : null,
21
+ children: [],
22
+ productCount: raw.products_count,
23
+ };
24
+ }
25
+ //# sourceMappingURL=category.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category.js","sourceRoot":"","sources":["../../src/mappers/category.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAK9E,SAAS,WAAW,CAAC,KAAoB,EAAE,SAAiB,IAAI;IAC9D,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,CAAA;IACvD,OAAO,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAA;AACpC,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,gBAAgB,CAAC,GAAqB,EAAE,SAAiB,IAAI;IAC3E,MAAM,KAAK,GAAiB,GAAG,CAAC,KAAK;QACnC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE;QAClD,CAAC,CAAC,IAAI,CAAA;IAER,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC;QACnC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1E,KAAK;QACL,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI;QACtD,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,GAAG,CAAC,cAAc;KACjC,CAAA;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Country } from '@commercejs/types';
2
+ import type { SallaRawCountry } from '../types.js';
3
+ export declare function mapSallaCountry(raw: SallaRawCountry): Country;
4
+ //# sourceMappingURL=country.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"country.d.ts","sourceRoot":"","sources":["../../src/mappers/country.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAS7D"}
@@ -0,0 +1,14 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Salla → Country mapper
3
+ // ---------------------------------------------------------------------------
4
+ export function mapSallaCountry(raw) {
5
+ return {
6
+ id: String(raw.id),
7
+ code: raw.code,
8
+ name: { ar: raw.name, en: raw.name_en || raw.name },
9
+ callingCode: raw.mobile_code || null,
10
+ currency: null, // Salla doesn't include currency in country response
11
+ capital: raw.capital,
12
+ };
13
+ }
14
+ //# sourceMappingURL=country.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"country.js","sourceRoot":"","sources":["../../src/mappers/country.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAK9E,MAAM,UAAU,eAAe,CAAC,GAAoB;IAClD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE;QACnD,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;QACpC,QAAQ,EAAE,IAAI,EAAE,qDAAqD;QACrE,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAA;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Customer, Address } from '@commercejs/types';
2
+ import type { SallaRawCustomer, SallaRawAddress } from '../types.js';
3
+ /** Map Salla raw customer → unified Customer */
4
+ export declare function mapSallaCustomer(raw: SallaRawCustomer): Customer;
5
+ /** Map Salla raw address → unified Address */
6
+ export declare function mapSallaAddress(raw: SallaRawAddress): Address;
7
+ //# sourceMappingURL=customer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer.d.ts","sourceRoot":"","sources":["../../src/mappers/customer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AASpE,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,QAAQ,CAYhE;AAED,8CAA8C;AAC9C,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAiB7D"}
@@ -0,0 +1,45 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Salla → Customer mapper
3
+ // ---------------------------------------------------------------------------
4
+ /** Extract date string from Salla's flexible date format */
5
+ function extractDate(date) {
6
+ if (!date)
7
+ return new Date().toISOString();
8
+ if (typeof date === 'string')
9
+ return date;
10
+ return date.date;
11
+ }
12
+ /** Map Salla raw customer → unified Customer */
13
+ export function mapSallaCustomer(raw) {
14
+ return {
15
+ id: String(raw.id),
16
+ firstName: raw.first_name,
17
+ lastName: raw.last_name,
18
+ email: raw.email,
19
+ phone: raw.mobile ? `${raw.mobile_code}${raw.mobile}` : null,
20
+ addresses: [],
21
+ defaultAddressId: null,
22
+ createdAt: extractDate(raw.created_at),
23
+ updatedAt: extractDate(raw.updated_at),
24
+ };
25
+ }
26
+ /** Map Salla raw address → unified Address */
27
+ export function mapSallaAddress(raw) {
28
+ return {
29
+ id: String(raw.id),
30
+ firstName: '',
31
+ lastName: '',
32
+ phone: null,
33
+ street: [raw.street_number, raw.block].filter(Boolean).join(', ') || '',
34
+ street2: null,
35
+ city: raw.city ?? '',
36
+ state: null,
37
+ country: raw.country_code ?? raw.country ?? '',
38
+ postalCode: raw.postal_code ?? null,
39
+ district: null,
40
+ nationalAddress: null,
41
+ additionalNumber: null,
42
+ isDefault: false,
43
+ };
44
+ }
45
+ //# sourceMappingURL=customer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer.js","sourceRoot":"","sources":["../../src/mappers/customer.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAK9E,4DAA4D;AAC5D,SAAS,WAAW,CAAC,IAA2C;IAC9D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACzC,OAAO,IAAI,CAAC,IAAI,CAAA;AAClB,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,gBAAgB,CAAC,GAAqB;IACpD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI;QAC5D,SAAS,EAAE,EAAE;QACb,gBAAgB,EAAE,IAAI;QACtB,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;QACtC,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;KACvC,CAAA;AACH,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,eAAe,CAAC,GAAoB;IAClD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,SAAS,EAAE,EAAE;QACb,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QACvE,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;QACpB,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE;QAC9C,UAAU,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;QACnC,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,IAAI;QACrB,gBAAgB,EAAE,IAAI;QACtB,SAAS,EAAE,KAAK;KACjB,CAAA;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ export { mapSallaProduct } from './product.js';
2
+ export { mapSallaCategory } from './category.js';
3
+ export { mapSallaCustomer, mapSallaAddress } from './customer.js';
4
+ export { mapSallaOrder } from './order.js';
5
+ export { mapSallaOrderStatus, mapSallaOrderHistory } from './order-status.js';
6
+ export { mapSallaReview } from './review.js';
7
+ export { mapSallaShipping } from './shipping.js';
8
+ export { mapSallaPayment } from './payment.js';
9
+ export { mapSallaBrand } from './brand.js';
10
+ export { mapSallaCountry } from './country.js';
11
+ export { mapSallaBranch } from './location.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mappers/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,15 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Mapper barrel export
3
+ // ---------------------------------------------------------------------------
4
+ export { mapSallaProduct } from './product.js';
5
+ export { mapSallaCategory } from './category.js';
6
+ export { mapSallaCustomer, mapSallaAddress } from './customer.js';
7
+ export { mapSallaOrder } from './order.js';
8
+ export { mapSallaOrderStatus, mapSallaOrderHistory } from './order-status.js';
9
+ export { mapSallaReview } from './review.js';
10
+ export { mapSallaShipping } from './shipping.js';
11
+ export { mapSallaPayment } from './payment.js';
12
+ export { mapSallaBrand } from './brand.js';
13
+ export { mapSallaCountry } from './country.js';
14
+ export { mapSallaBranch } from './location.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mappers/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { StoreLocation } from '@commercejs/types';
2
+ import type { SallaRawBranch } from '../types.js';
3
+ export declare function mapSallaBranch(raw: SallaRawBranch, locale?: string): StoreLocation;
4
+ //# sourceMappingURL=location.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location.d.ts","sourceRoot":"","sources":["../../src/mappers/location.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAsC,MAAM,mBAAmB,CAAA;AAC1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAOjD,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,GAAE,MAAa,GAAG,aAAa,CAmCxF"}
@@ -0,0 +1,44 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Salla → StoreLocation (branch) mapper
3
+ // ---------------------------------------------------------------------------
4
+ function toLocalized(value, locale = 'ar') {
5
+ if (locale === 'en')
6
+ return { ar: '', en: value ?? '' };
7
+ return { ar: value ?? '', en: '' };
8
+ }
9
+ export function mapSallaBranch(raw, locale = 'ar') {
10
+ const workingHours = (raw.working_hours ?? []).map((wh) => ({
11
+ day: wh.day,
12
+ from: wh.from ?? null,
13
+ to: wh.to ?? null,
14
+ isClosed: wh.is_closed ?? (!wh.from && !wh.to),
15
+ }));
16
+ return {
17
+ id: String(raw.id),
18
+ name: toLocalized(raw.name, locale),
19
+ isActive: raw.status === 'active',
20
+ isDefault: raw.is_default,
21
+ coordinates: raw.location
22
+ ? { lat: parseFloat(raw.location.lat), lng: parseFloat(raw.location.lng) }
23
+ : null,
24
+ shortAddress: raw.short_address,
25
+ street: raw.street,
26
+ postalCode: raw.postal_code,
27
+ city: raw.city ? { ar: raw.city.name, en: raw.city.name_en || raw.city.name } : null,
28
+ region: raw.region ? toLocalized(raw.region.name, locale) : null,
29
+ countryCode: raw.country?.code ?? null,
30
+ contacts: raw.contacts
31
+ ? {
32
+ phone: raw.contacts.phone,
33
+ whatsapp: raw.contacts.whatsapp,
34
+ telephone: raw.contacts.telephone,
35
+ }
36
+ : null,
37
+ workingHours,
38
+ isOpen: raw.is_open,
39
+ isPickupEnabled: raw.pickable,
40
+ isShippingEnabled: raw.shippable,
41
+ isCodAvailable: raw.is_cod_available,
42
+ };
43
+ }
44
+ //# sourceMappingURL=location.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location.js","sourceRoot":"","sources":["../../src/mappers/location.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAK9E,SAAS,WAAW,CAAC,KAAoB,EAAE,SAAiB,IAAI;IAC9D,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,CAAA;IACvD,OAAO,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAA;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAmB,EAAE,SAAiB,IAAI;IACvE,MAAM,YAAY,GAAwB,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,GAAG,EAAE,EAAE,CAAC,GAAG;QACX,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI;QACrB,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,IAAI;QACjB,QAAQ,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;KAC/C,CAAC,CAAC,CAAA;IAEH,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC;QACnC,QAAQ,EAAE,GAAG,CAAC,MAAM,KAAK,QAAQ;QACjC,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,WAAW,EAAE,GAAG,CAAC,QAAQ;YACvB,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC1E,CAAC,CAAC,IAAI;QACR,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;QACpF,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;QAChE,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI;QACtC,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACpB,CAAC,CAAC;gBACE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK;gBACzB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ;gBAC/B,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,SAAS;aAClC;YACH,CAAC,CAAC,IAAI;QACR,YAAY;QACZ,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,eAAe,EAAE,GAAG,CAAC,QAAQ;QAC7B,iBAAiB,EAAE,GAAG,CAAC,SAAS;QAChC,cAAc,EAAE,GAAG,CAAC,gBAAgB;KACrC,CAAA;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { OrderStatusInfo, OrderHistoryEntry } from '@commercejs/types';
2
+ import type { SallaRawOrderStatus, SallaRawOrderHistory } from '../types.js';
3
+ /** Map Salla raw order status → unified OrderStatusInfo */
4
+ export declare function mapSallaOrderStatus(raw: SallaRawOrderStatus): OrderStatusInfo;
5
+ /** Map Salla raw order history → unified OrderHistoryEntry */
6
+ export declare function mapSallaOrderHistory(raw: SallaRawOrderHistory, orderId: string): OrderHistoryEntry;
7
+ //# sourceMappingURL=order-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order-status.d.ts","sourceRoot":"","sources":["../../src/mappers/order-status.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAS5E,2DAA2D;AAC3D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,mBAAmB,GAAG,eAAe,CAc7E;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAQlG"}
@@ -0,0 +1,38 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Salla → OrderStatus & OrderHistory mappers
3
+ // ---------------------------------------------------------------------------
4
+ /** Extract a date string from Salla's date object or ISO string */
5
+ function extractDate(date) {
6
+ if (!date)
7
+ return new Date().toISOString();
8
+ if (typeof date === 'string')
9
+ return date;
10
+ return date.date;
11
+ }
12
+ /** Map Salla raw order status → unified OrderStatusInfo */
13
+ export function mapSallaOrderStatus(raw) {
14
+ return {
15
+ id: String(raw.id),
16
+ name: raw.name,
17
+ slug: raw.slug,
18
+ type: raw.type,
19
+ color: raw.color ?? null,
20
+ icon: raw.icon ?? null,
21
+ isActive: raw.is_active,
22
+ parent: raw.parent
23
+ ? { id: String(raw.parent.id), name: raw.parent.name }
24
+ : null,
25
+ children: (raw.children ?? []).map(mapSallaOrderStatus),
26
+ };
27
+ }
28
+ /** Map Salla raw order history → unified OrderHistoryEntry */
29
+ export function mapSallaOrderHistory(raw, orderId) {
30
+ return {
31
+ id: String(raw.id),
32
+ orderId,
33
+ action: raw.action,
34
+ note: raw.note ?? null,
35
+ createdAt: extractDate(raw.created_at),
36
+ };
37
+ }
38
+ //# sourceMappingURL=order-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order-status.js","sourceRoot":"","sources":["../../src/mappers/order-status.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAK9E,mEAAmE;AACnE,SAAS,WAAW,CAAC,IAAoF;IACvG,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACzC,OAAO,IAAI,CAAC,IAAI,CAAA;AAClB,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,mBAAmB,CAAC,GAAwB;IAC1D,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI;QACxB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI;QACtB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,MAAM,EAAE,GAAG,CAAC,MAAM;YAChB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;YACtD,CAAC,CAAC,IAAI;QACR,QAAQ,EAAE,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC;KACxD,CAAA;AACH,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB,CAAC,GAAyB,EAAE,OAAe;IAC7E,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO;QACP,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI;QACtB,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;KACvC,CAAA;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Order } from '@commercejs/types';
2
+ import type { SallaRawOrder } from '../types.js';
3
+ /** Map Salla raw order → unified Order */
4
+ export declare function mapSallaOrder(raw: SallaRawOrder, locale?: string): Order;
5
+ //# sourceMappingURL=order.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.d.ts","sourceRoot":"","sources":["../../src/mappers/order.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAmF,MAAM,mBAAmB,CAAA;AAC/H,OAAO,KAAK,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAA;AA2CnE,0CAA0C;AAC1C,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,EAAE,MAAM,GAAE,MAAa,GAAG,KAAK,CAiF9E"}