shipflow 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 (44) hide show
  1. package/README.md +328 -0
  2. package/dist/carriers/aymakan/adapter.d.ts +87 -0
  3. package/dist/carriers/aymakan/adapter.d.ts.map +1 -0
  4. package/dist/carriers/aymakan/index.d.ts +9 -0
  5. package/dist/carriers/aymakan/index.d.ts.map +1 -0
  6. package/dist/carriers/aymakan/index.js +625 -0
  7. package/dist/carriers/aymakan/index.js.map +12 -0
  8. package/dist/carriers/aymakan/mappers.d.ts +21 -0
  9. package/dist/carriers/aymakan/mappers.d.ts.map +1 -0
  10. package/dist/carriers/aymakan/services.d.ts +47 -0
  11. package/dist/carriers/aymakan/services.d.ts.map +1 -0
  12. package/dist/carriers/aymakan/types.d.ts +287 -0
  13. package/dist/carriers/aymakan/types.d.ts.map +1 -0
  14. package/dist/carriers/base.d.ts +88 -0
  15. package/dist/carriers/base.d.ts.map +1 -0
  16. package/dist/carriers/smsaexpress/adapter.d.ts +57 -0
  17. package/dist/carriers/smsaexpress/adapter.d.ts.map +1 -0
  18. package/dist/carriers/smsaexpress/index.d.ts +9 -0
  19. package/dist/carriers/smsaexpress/index.d.ts.map +1 -0
  20. package/dist/carriers/smsaexpress/index.js +408 -0
  21. package/dist/carriers/smsaexpress/index.js.map +12 -0
  22. package/dist/carriers/smsaexpress/mappers.d.ts +45 -0
  23. package/dist/carriers/smsaexpress/mappers.d.ts.map +1 -0
  24. package/dist/carriers/smsaexpress/services.d.ts +21 -0
  25. package/dist/carriers/smsaexpress/services.d.ts.map +1 -0
  26. package/dist/carriers/smsaexpress/types.d.ts +197 -0
  27. package/dist/carriers/smsaexpress/types.d.ts.map +1 -0
  28. package/dist/client.d.ts +44 -0
  29. package/dist/client.d.ts.map +1 -0
  30. package/dist/core/errors.d.ts +69 -0
  31. package/dist/core/errors.d.ts.map +1 -0
  32. package/dist/core/http.d.ts +72 -0
  33. package/dist/core/http.d.ts.map +1 -0
  34. package/dist/core/schemas.d.ts +832 -0
  35. package/dist/core/schemas.d.ts.map +1 -0
  36. package/dist/core/types.d.ts +234 -0
  37. package/dist/core/types.d.ts.map +1 -0
  38. package/dist/index-x8sk1kw9.js +4600 -0
  39. package/dist/index-x8sk1kw9.js.map +22 -0
  40. package/dist/index.d.ts +27 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +109 -0
  43. package/dist/index.js.map +10 -0
  44. package/package.json +63 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * ShipFlow - Unified Shipping SDK for MENA Region
3
+ *
4
+ * @example
5
+ * ```typescript
6
+ * import { ShipFlow } from 'shipflow';
7
+ * import { AymakanAdapter, AymakanService } from 'shipflow/carriers/aymakan';
8
+ *
9
+ * const client = new ShipFlow({
10
+ * adapters: [
11
+ * new AymakanAdapter({
12
+ * mode: 'sandbox',
13
+ * credentials: { apiKey: 'your-api-key' }
14
+ * })
15
+ * ]
16
+ * });
17
+ *
18
+ * const shipment = await client.carrier('aymakan').createShipment({...});
19
+ * ```
20
+ */
21
+ export { ShipFlow, createShipFlow, type ShipFlowOptions } from "./client.js";
22
+ export type { Address, CODDetails, CarrierConfig, CarrierCredentials, City, CreateShipmentInput, CustomerAddress, DeclaredValue, Dimensions, InternationalMetadata, Location, NationalAddress, Parcel, Pickup, PickupRequest, Rate, Shipment, ShipmentOptions, ShipmentStatus, TimeSlot, TrackingEvent, TrackingResult, WebhookConfig, WebhookEvent, WebhookEventType, Weight, } from "./core/types.js";
23
+ export { APIError, AuthenticationError, NetworkError, ShipFlowError, UnsupportedOperationError, ValidationError, WebhookVerificationError, } from "./core/errors.js";
24
+ export { AddressSchema, CODDetailsSchema, CreateShipmentInputSchema, DeclaredValueSchema, DimensionsSchema, ParcelSchema, PickupRequestSchema, WebhookConfigSchema, WeightSchema, validateCreateShipmentInput, validatePickupRequest, } from "./core/schemas.js";
25
+ export { BaseCarrierAdapter, type CarrierAdapter } from "./carriers/base.js";
26
+ export { HttpClient, type HttpClientConfig, type RequestOptions, } from "./core/http.js";
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAG1E,YAAY,EACV,OAAO,EACP,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,IAAI,EACJ,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,UAAU,EACV,qBAAqB,EACrB,QAAQ,EACR,eAAe,EACf,MAAM,EACN,MAAM,EACN,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,eAAe,EACf,cAAc,EACd,QAAQ,EACR,aAAa,EACb,cAAc,EACd,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,MAAM,GACP,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,yBAAyB,EACzB,eAAe,EACf,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,kBAAkB,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG1E,OAAO,EACL,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,109 @@
1
+ import {
2
+ APIError,
3
+ AddressSchema,
4
+ AuthenticationError,
5
+ BaseCarrierAdapter,
6
+ CODDetailsSchema,
7
+ CreateShipmentInputSchema,
8
+ DeclaredValueSchema,
9
+ DimensionsSchema,
10
+ HttpClient,
11
+ NetworkError,
12
+ ParcelSchema,
13
+ PickupRequestSchema,
14
+ ShipFlowError,
15
+ UnsupportedOperationError,
16
+ ValidationError,
17
+ WebhookConfigSchema,
18
+ WebhookVerificationError,
19
+ WeightSchema,
20
+ validateCreateShipmentInput,
21
+ validatePickupRequest
22
+ } from "./index-x8sk1kw9.js";
23
+
24
+ // src/client.ts
25
+ class ShipFlow {
26
+ adapters;
27
+ constructor(options) {
28
+ this.adapters = new Map;
29
+ for (const adapter of options.adapters) {
30
+ this.adapters.set(adapter.name, adapter);
31
+ }
32
+ }
33
+ carrier(name) {
34
+ const adapter = this.adapters.get(name.toLowerCase());
35
+ if (!adapter) {
36
+ throw new ShipFlowError(`Carrier "${name}" is not configured`, {
37
+ carrier: name
38
+ });
39
+ }
40
+ return adapter;
41
+ }
42
+ get carriers() {
43
+ return [...this.adapters.keys()];
44
+ }
45
+ hasCarrier(name) {
46
+ return this.adapters.has(name.toLowerCase());
47
+ }
48
+ async getRatesFromAll(input) {
49
+ const results = new Map;
50
+ const promises = [...this.adapters.entries()].map(async ([name, adapter]) => {
51
+ if (!adapter.getRates) {
52
+ return;
53
+ }
54
+ try {
55
+ const rates = await adapter.getRates(input);
56
+ results.set(name, rates);
57
+ } catch (error) {
58
+ results.set(name, error instanceof Error ? error : new Error(String(error)));
59
+ }
60
+ });
61
+ await Promise.allSettled(promises);
62
+ return results;
63
+ }
64
+ async trackAcrossCarriers(trackingNumber) {
65
+ const promises = [...this.adapters.values()].map(async (adapter) => {
66
+ const result = await adapter.track(trackingNumber);
67
+ if (result && result.status !== "unknown") {
68
+ return result;
69
+ }
70
+ return null;
71
+ });
72
+ const results = await Promise.allSettled(promises);
73
+ for (const result of results) {
74
+ if (result.status === "fulfilled" && result.value) {
75
+ return result.value;
76
+ }
77
+ }
78
+ return null;
79
+ }
80
+ }
81
+ function createShipFlow(options) {
82
+ return new ShipFlow(options);
83
+ }
84
+ export {
85
+ validatePickupRequest,
86
+ validateCreateShipmentInput,
87
+ createShipFlow,
88
+ WeightSchema,
89
+ WebhookVerificationError,
90
+ WebhookConfigSchema,
91
+ ValidationError,
92
+ UnsupportedOperationError,
93
+ ShipFlowError,
94
+ ShipFlow,
95
+ PickupRequestSchema,
96
+ ParcelSchema,
97
+ NetworkError,
98
+ HttpClient,
99
+ DimensionsSchema,
100
+ DeclaredValueSchema,
101
+ CreateShipmentInputSchema,
102
+ CODDetailsSchema,
103
+ BaseCarrierAdapter,
104
+ AuthenticationError,
105
+ AddressSchema,
106
+ APIError
107
+ };
108
+
109
+ //# debugId=E4C256CEB9CCC97764756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/client.ts"],
4
+ "sourcesContent": [
5
+ "// file: src/client.ts\n/**\n * ShipFlow Client\n * Tree-shakeable factory that accepts carrier adapters via dependency injection.\n * Only the carriers you inject will be bundled in your final application.\n */\n\nimport type { CarrierAdapter } from \"./carriers/base\";\nimport { ShipFlowError } from \"./core/errors\";\nimport type { CreateShipmentInput, Rate, TrackingResult } from \"./core/types\";\n\nexport interface ShipFlowOptions {\n adapters: CarrierAdapter[];\n}\n\nexport class ShipFlow {\n private adapters: Map<string, CarrierAdapter>;\n\n constructor(options: ShipFlowOptions) {\n this.adapters = new Map();\n\n for (const adapter of options.adapters) {\n this.adapters.set(adapter.name, adapter);\n }\n }\n\n /**\n * Get a specific carrier adapter by name.\n * @throws ShipFlowError if carrier is not configured\n */\n carrier(name: string): CarrierAdapter {\n const adapter = this.adapters.get(name.toLowerCase());\n if (!adapter) {\n throw new ShipFlowError(`Carrier \"${name}\" is not configured`, {\n carrier: name,\n });\n }\n return adapter;\n }\n\n /**\n * Get all configured carrier names.\n */\n get carriers(): string[] {\n return [...this.adapters.keys()];\n }\n\n /**\n * Check if a carrier is configured.\n */\n hasCarrier(name: string): boolean {\n return this.adapters.has(name.toLowerCase());\n }\n\n /**\n * Get rates from all configured carriers that support rate calculation.\n * Returns a map of carrier name to rates (or error).\n */\n async getRatesFromAll(\n input: CreateShipmentInput,\n ): Promise<Map<string, Rate[] | Error>> {\n const results = new Map<string, Rate[] | Error>();\n\n const promises = [...this.adapters.entries()].map(\n async ([name, adapter]) => {\n if (!adapter.getRates) {\n return; // Skip carriers that don't support rates\n }\n\n try {\n const rates = await adapter.getRates(input);\n results.set(name, rates);\n } catch (error) {\n results.set(\n name,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n },\n );\n\n await Promise.allSettled(promises);\n return results;\n }\n\n /**\n * Try to track a shipment across all configured carriers in parallel.\n * Useful when you don't know which carrier handles a tracking number.\n * Returns the first successful result with a known status.\n */\n async trackAcrossCarriers(\n trackingNumber: string,\n ): Promise<TrackingResult | null> {\n const promises = [...this.adapters.values()].map(async (adapter) => {\n const result = await adapter.track(trackingNumber);\n if (result && result.status !== \"unknown\") {\n return result;\n }\n return null;\n });\n\n const results = await Promise.allSettled(promises);\n for (const result of results) {\n if (result.status === \"fulfilled\" && result.value) {\n return result.value;\n }\n }\n return null;\n }\n}\n\n/**\n * Factory function for creating ShipFlow client.\n * This is the recommended way to instantiate the client.\n */\nexport function createShipFlow(options: ShipFlowOptions): ShipFlow {\n return new ShipFlow(options);\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,SAAS;AAAA,EACZ;AAAA,EAER,WAAW,CAAC,SAA0B;AAAA,IACpC,KAAK,WAAW,IAAI;AAAA,IAEpB,WAAW,WAAW,QAAQ,UAAU;AAAA,MACtC,KAAK,SAAS,IAAI,QAAQ,MAAM,OAAO;AAAA,IACzC;AAAA;AAAA,EAOF,OAAO,CAAC,MAA8B;AAAA,IACpC,MAAM,UAAU,KAAK,SAAS,IAAI,KAAK,YAAY,CAAC;AAAA,IACpD,IAAI,CAAC,SAAS;AAAA,MACZ,MAAM,IAAI,cAAc,YAAY,2BAA2B;AAAA,QAC7D,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,IACA,OAAO;AAAA;AAAA,MAML,QAAQ,GAAa;AAAA,IACvB,OAAO,CAAC,GAAG,KAAK,SAAS,KAAK,CAAC;AAAA;AAAA,EAMjC,UAAU,CAAC,MAAuB;AAAA,IAChC,OAAO,KAAK,SAAS,IAAI,KAAK,YAAY,CAAC;AAAA;AAAA,OAOvC,gBAAe,CACnB,OACsC;AAAA,IACtC,MAAM,UAAU,IAAI;AAAA,IAEpB,MAAM,WAAW,CAAC,GAAG,KAAK,SAAS,QAAQ,CAAC,EAAE,IAC5C,QAAQ,MAAM,aAAa;AAAA,MACzB,IAAI,CAAC,QAAQ,UAAU;AAAA,QACrB;AAAA,MACF;AAAA,MAEA,IAAI;AAAA,QACF,MAAM,QAAQ,MAAM,QAAQ,SAAS,KAAK;AAAA,QAC1C,QAAQ,IAAI,MAAM,KAAK;AAAA,QACvB,OAAO,OAAO;AAAA,QACd,QAAQ,IACN,MACA,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAC1D;AAAA;AAAA,KAGN;AAAA,IAEA,MAAM,QAAQ,WAAW,QAAQ;AAAA,IACjC,OAAO;AAAA;AAAA,OAQH,oBAAmB,CACvB,gBACgC;AAAA,IAChC,MAAM,WAAW,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC,EAAE,IAAI,OAAO,YAAY;AAAA,MAClE,MAAM,SAAS,MAAM,QAAQ,MAAM,cAAc;AAAA,MACjD,IAAI,UAAU,OAAO,WAAW,WAAW;AAAA,QACzC,OAAO;AAAA,MACT;AAAA,MACA,OAAO;AAAA,KACR;AAAA,IAED,MAAM,UAAU,MAAM,QAAQ,WAAW,QAAQ;AAAA,IACjD,WAAW,UAAU,SAAS;AAAA,MAC5B,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO;AAAA,QACjD,OAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAEX;AAMO,SAAS,cAAc,CAAC,SAAoC;AAAA,EACjE,OAAO,IAAI,SAAS,OAAO;AAAA;",
8
+ "debugId": "E4C256CEB9CCC97764756E2164756E21",
9
+ "names": []
10
+ }
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "shipflow",
3
+ "version": "0.1.0",
4
+ "description": "Unified Shipping SDK for MENA Region — Aymakan, SMSA Express, and more",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./carriers/aymakan": {
15
+ "types": "./dist/carriers/aymakan/index.d.ts",
16
+ "import": "./dist/carriers/aymakan/index.js"
17
+ },
18
+ "./carriers/smsaexpress": {
19
+ "types": "./dist/carriers/smsaexpress/index.d.ts",
20
+ "import": "./dist/carriers/smsaexpress/index.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md",
26
+ "LICENSE"
27
+ ],
28
+ "scripts": {
29
+ "typecheck": "tsc --noEmit",
30
+ "build": "rm -rf dist && tsc -p tsconfig.build.json && bun build src/index.ts src/carriers/aymakan/index.ts src/carriers/smsaexpress/index.ts --outdir dist --splitting --target node --format esm --sourcemap=external && bun run build:fix-dts",
31
+ "build:fix-dts": "find dist -name '*.d.ts' -exec sed -i -E \"s/from '(\\.\\.?\\/[^']+)'/from '\\1.js'/g; s/from \\\"(\\.\\.?\\/[^\\\"]+)\\\"/from \\\"\\1.js\\\"/g\" {} +",
32
+ "prepublishOnly": "bun run build",
33
+ "test": "bun test",
34
+ "test:watch": "bun test --watch"
35
+ },
36
+ "dependencies": {
37
+ "p-retry": "^8.0.0",
38
+ "zod": "^3.24"
39
+ },
40
+ "devDependencies": {
41
+ "@types/bun": "latest"
42
+ },
43
+ "peerDependencies": {
44
+ "typescript": "^5.5 || ^6"
45
+ },
46
+ "keywords": [
47
+ "shipping",
48
+ "aymakan",
49
+ "smsa",
50
+ "smsaexpress",
51
+ "saudi-arabia",
52
+ "mena",
53
+ "logistics",
54
+ "cod",
55
+ "ecommerce",
56
+ "tracking"
57
+ ],
58
+ "repository": {
59
+ "url": "https://github.com/aashahin/shipflow"
60
+ },
61
+ "author": "Abdelrahman Shaheen",
62
+ "license": "MIT"
63
+ }