@autolink/nextjs 0.2.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.
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ "use server";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/actions.ts
22
+ var actions_exports = {};
23
+ __export(actions_exports, {
24
+ submitInquiry: () => submitInquiry
25
+ });
26
+ module.exports = __toCommonJS(actions_exports);
27
+ var import_server_only2 = require("server-only");
28
+
29
+ // src/index.ts
30
+ var import_server_only = require("server-only");
31
+ var import_sdk = require("@autolink/sdk");
32
+ var import_sdk2 = require("@autolink/sdk");
33
+ var import_sdk3 = require("@autolink/sdk");
34
+ var import_sdk4 = require("@autolink/sdk");
35
+ function createAutolinkClient() {
36
+ const apiKey = process.env["AUTOLINK_API_KEY"];
37
+ if (!apiKey) {
38
+ throw new Error(
39
+ "AutolinkClient: AUTOLINK_API_KEY environment variable is not set. Add it to your .env.local file."
40
+ );
41
+ }
42
+ return new import_sdk.AutolinkClient({ apiKey });
43
+ }
44
+
45
+ // src/actions.ts
46
+ async function submitInquiry(payload) {
47
+ try {
48
+ const client = createAutolinkClient();
49
+ let type;
50
+ let customer_name;
51
+ let customer_email;
52
+ let customer_phone;
53
+ let subject;
54
+ let message;
55
+ let vehicle_slug;
56
+ let metadata;
57
+ let idempotencyKey;
58
+ if (payload instanceof FormData) {
59
+ type = payload.get("type") ?? void 0;
60
+ customer_name = payload.get("customer_name") ?? "";
61
+ customer_email = payload.get("customer_email") ?? "";
62
+ customer_phone = payload.get("customer_phone") ?? void 0;
63
+ subject = payload.get("subject") ?? void 0;
64
+ message = payload.get("message") ?? "";
65
+ vehicle_slug = payload.get("vehicle_slug") ?? void 0;
66
+ idempotencyKey = payload.get("idempotency_key") ?? void 0;
67
+ const rawMetadata = payload.get("metadata");
68
+ if (rawMetadata && typeof rawMetadata === "string") {
69
+ try {
70
+ metadata = JSON.parse(rawMetadata);
71
+ } catch {
72
+ }
73
+ }
74
+ } else {
75
+ type = payload.type;
76
+ customer_name = payload.customer_name;
77
+ customer_email = payload.customer_email;
78
+ customer_phone = payload.customer_phone;
79
+ subject = payload.subject;
80
+ message = payload.message;
81
+ vehicle_slug = payload.vehicle_slug;
82
+ metadata = payload.metadata;
83
+ }
84
+ const inquiryPayload = {
85
+ type: type ?? (vehicle_slug ? "vehicle" : "general"),
86
+ customer_name,
87
+ customer_email,
88
+ ...customer_phone ? { customer_phone } : {},
89
+ ...subject ? { subject } : {},
90
+ message,
91
+ ...vehicle_slug ? { vehicle_slug } : {},
92
+ ...metadata ? { metadata } : {}
93
+ };
94
+ const result = await client.inquiries.create(inquiryPayload, {
95
+ ...idempotencyKey ? { idempotencyKey } : {}
96
+ });
97
+ return { ok: true, data: result };
98
+ } catch (err) {
99
+ if (err instanceof import_sdk3.AutolinkValidationError) {
100
+ const fields = {};
101
+ for (const [key, value] of Object.entries(err.fields)) {
102
+ fields[key] = Array.isArray(value) ? value : [String(value)];
103
+ }
104
+ return {
105
+ ok: false,
106
+ error: err.message ?? "Validation failed",
107
+ ...Object.keys(fields).length > 0 ? { fields } : {}
108
+ };
109
+ }
110
+ if (err instanceof import_sdk3.AutolinkAuthError) {
111
+ return {
112
+ ok: false,
113
+ error: "Authentication failed. Please check your API key."
114
+ };
115
+ }
116
+ return {
117
+ ok: false,
118
+ error: err instanceof Error ? err.message : "An unexpected error occurred"
119
+ };
120
+ }
121
+ }
122
+ // Annotate the CommonJS export names for ESM import in node:
123
+ 0 && (module.exports = {
124
+ submitInquiry
125
+ });
126
+ //# sourceMappingURL=actions.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/actions.ts","../src/index.ts"],"sourcesContent":["\"use server\";\nimport \"server-only\";\n\nimport { createAutolinkClient } from \"./index.js\";\nimport { AutolinkValidationError, AutolinkAuthError } from \"./index.js\";\n\nexport async function submitInquiry(\n payload:\n | FormData\n | {\n type?: string;\n customer_name: string;\n customer_email: string;\n customer_phone?: string;\n subject?: string;\n message: string;\n vehicle_slug?: string;\n metadata?: Record<string, unknown>;\n },\n): Promise<\n | { ok: true; data: unknown }\n | { ok: false; error: string; fields?: Record<string, string[]> }\n> {\n try {\n const client = createAutolinkClient();\n\n let type: string | undefined;\n let customer_name: string;\n let customer_email: string;\n let customer_phone: string | undefined;\n let subject: string | undefined;\n let message: string;\n let vehicle_slug: string | undefined;\n let metadata: Record<string, unknown> | undefined;\n let idempotencyKey: string | undefined;\n\n if (payload instanceof FormData) {\n type = (payload.get(\"type\") as string | null) ?? undefined;\n customer_name = (payload.get(\"customer_name\") as string | null) ?? \"\";\n customer_email = (payload.get(\"customer_email\") as string | null) ?? \"\";\n customer_phone =\n (payload.get(\"customer_phone\") as string | null) ?? undefined;\n subject = (payload.get(\"subject\") as string | null) ?? undefined;\n message = (payload.get(\"message\") as string | null) ?? \"\";\n vehicle_slug =\n (payload.get(\"vehicle_slug\") as string | null) ?? undefined;\n idempotencyKey =\n (payload.get(\"idempotency_key\") as string | null) ?? undefined;\n const rawMetadata = payload.get(\"metadata\");\n if (rawMetadata && typeof rawMetadata === \"string\") {\n try {\n metadata = JSON.parse(rawMetadata) as Record<string, unknown>;\n } catch {\n // ignore invalid JSON metadata\n }\n }\n } else {\n type = payload.type;\n customer_name = payload.customer_name;\n customer_email = payload.customer_email;\n customer_phone = payload.customer_phone;\n subject = payload.subject;\n message = payload.message;\n vehicle_slug = payload.vehicle_slug;\n metadata = payload.metadata;\n }\n\n const inquiryPayload = {\n type: (type ?? (vehicle_slug ? \"vehicle\" : \"general\")) as\n | \"vehicle\"\n | \"general\",\n customer_name,\n customer_email,\n ...(customer_phone ? { customer_phone } : {}),\n ...(subject ? { subject } : {}),\n message,\n ...(vehicle_slug ? { vehicle_slug } : {}),\n ...(metadata ? { metadata } : {}),\n };\n\n const result = await client.inquiries.create(inquiryPayload, {\n ...(idempotencyKey ? { idempotencyKey } : {}),\n });\n\n return { ok: true, data: result };\n } catch (err: unknown) {\n if (err instanceof AutolinkValidationError) {\n const fields: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(err.fields)) {\n fields[key] = Array.isArray(value) ? value : [String(value)];\n }\n return {\n ok: false,\n error: err.message ?? \"Validation failed\",\n ...(Object.keys(fields).length > 0 ? { fields } : {}),\n };\n }\n\n if (err instanceof AutolinkAuthError) {\n return {\n ok: false,\n error: \"Authentication failed. Please check your API key.\",\n };\n }\n\n return {\n ok: false,\n error:\n err instanceof Error ? err.message : \"An unexpected error occurred\",\n };\n }\n}\n","import \"server-only\";\nimport { AutolinkClient } from \"@autolink/sdk\";\nexport type { AutolinkClientConfig } from \"@autolink/sdk\";\n\nexport function createAutolinkClient(): AutolinkClient {\n const apiKey = process.env[\"AUTOLINK_API_KEY\"];\n if (!apiKey) {\n throw new Error(\n \"AutolinkClient: AUTOLINK_API_KEY environment variable is not set. \" +\n \"Add it to your .env.local file.\",\n );\n }\n return new AutolinkClient({ apiKey });\n}\n\nexport { AutolinkClient } from \"@autolink/sdk\";\nexport {\n AutolinkError,\n AutolinkAuthError,\n AutolinkForbiddenError,\n AutolinkNotFoundError,\n AutolinkValidationError,\n AutolinkRateLimitError,\n AutolinkNetworkError,\n} from \"@autolink/sdk\";\nexport type {\n AutolinkVehicle,\n AutolinkInquiryPayload,\n AutolinkInquiry,\n AutolinkProfile,\n AutolinkArticle,\n GatewayEnvelope,\n} from \"@autolink/sdk\";\n\nexport { submitInquiry } from \"./actions.js\";\nexport { unwrap, getFieldErrors } from \"@autolink/sdk\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,IAAAA,sBAAO;;;ACDP,yBAAO;AACP,iBAA+B;AAc/B,IAAAC,cAA+B;AAC/B,IAAAA,cAQO;AAWP,IAAAA,cAAuC;AA/BhC,SAAS,uBAAuC;AACrD,QAAM,SAAS,QAAQ,IAAI,kBAAkB;AAC7C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO,IAAI,0BAAe,EAAE,OAAO,CAAC;AACtC;;;ADPA,eAAsB,cACpB,SAeA;AACA,MAAI;AACF,UAAM,SAAS,qBAAqB;AAEpC,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI,mBAAmB,UAAU;AAC/B,aAAQ,QAAQ,IAAI,MAAM,KAAuB;AACjD,sBAAiB,QAAQ,IAAI,eAAe,KAAuB;AACnE,uBAAkB,QAAQ,IAAI,gBAAgB,KAAuB;AACrE,uBACG,QAAQ,IAAI,gBAAgB,KAAuB;AACtD,gBAAW,QAAQ,IAAI,SAAS,KAAuB;AACvD,gBAAW,QAAQ,IAAI,SAAS,KAAuB;AACvD,qBACG,QAAQ,IAAI,cAAc,KAAuB;AACpD,uBACG,QAAQ,IAAI,iBAAiB,KAAuB;AACvD,YAAM,cAAc,QAAQ,IAAI,UAAU;AAC1C,UAAI,eAAe,OAAO,gBAAgB,UAAU;AAClD,YAAI;AACF,qBAAW,KAAK,MAAM,WAAW;AAAA,QACnC,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AACf,sBAAgB,QAAQ;AACxB,uBAAiB,QAAQ;AACzB,uBAAiB,QAAQ;AACzB,gBAAU,QAAQ;AAClB,gBAAU,QAAQ;AAClB,qBAAe,QAAQ;AACvB,iBAAW,QAAQ;AAAA,IACrB;AAEA,UAAM,iBAAiB;AAAA,MACrB,MAAO,SAAS,eAAe,YAAY;AAAA,MAG3C;AAAA,MACA;AAAA,MACA,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,MAC3C,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC7B;AAAA,MACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACvC,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IACjC;AAEA,UAAM,SAAS,MAAM,OAAO,UAAU,OAAO,gBAAgB;AAAA,MAC3D,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,IAC7C,CAAC;AAED,WAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,EAClC,SAAS,KAAc;AACrB,QAAI,eAAe,qCAAyB;AAC1C,YAAM,SAAmC,CAAC;AAC1C,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AACrD,eAAO,GAAG,IAAI,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC;AAAA,MAC7D;AACA,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,IAAI,WAAW;AAAA,QACtB,GAAI,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,MACrD;AAAA,IACF;AAEA,QAAI,eAAe,+BAAmB;AACpC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OACE,eAAe,QAAQ,IAAI,UAAU;AAAA,IACzC;AAAA,EACF;AACF;","names":["import_server_only","import_sdk"]}
@@ -0,0 +1,19 @@
1
+ declare function submitInquiry(payload: FormData | {
2
+ type?: string;
3
+ customer_name: string;
4
+ customer_email: string;
5
+ customer_phone?: string;
6
+ subject?: string;
7
+ message: string;
8
+ vehicle_slug?: string;
9
+ metadata?: Record<string, unknown>;
10
+ }): Promise<{
11
+ ok: true;
12
+ data: unknown;
13
+ } | {
14
+ ok: false;
15
+ error: string;
16
+ fields?: Record<string, string[]>;
17
+ }>;
18
+
19
+ export { submitInquiry };
@@ -0,0 +1,19 @@
1
+ declare function submitInquiry(payload: FormData | {
2
+ type?: string;
3
+ customer_name: string;
4
+ customer_email: string;
5
+ customer_phone?: string;
6
+ subject?: string;
7
+ message: string;
8
+ vehicle_slug?: string;
9
+ metadata?: Record<string, unknown>;
10
+ }): Promise<{
11
+ ok: true;
12
+ data: unknown;
13
+ } | {
14
+ ok: false;
15
+ error: string;
16
+ fields?: Record<string, string[]>;
17
+ }>;
18
+
19
+ export { submitInquiry };
@@ -0,0 +1,110 @@
1
+ "use server";
2
+
3
+ // src/actions.ts
4
+ import "server-only";
5
+
6
+ // src/index.ts
7
+ import "server-only";
8
+ import { AutolinkClient } from "@autolink/sdk";
9
+ import { AutolinkClient as AutolinkClient2 } from "@autolink/sdk";
10
+ import {
11
+ AutolinkError,
12
+ AutolinkAuthError,
13
+ AutolinkForbiddenError,
14
+ AutolinkNotFoundError,
15
+ AutolinkValidationError,
16
+ AutolinkRateLimitError,
17
+ AutolinkNetworkError
18
+ } from "@autolink/sdk";
19
+ import { unwrap, getFieldErrors } from "@autolink/sdk";
20
+ function createAutolinkClient() {
21
+ const apiKey = process.env["AUTOLINK_API_KEY"];
22
+ if (!apiKey) {
23
+ throw new Error(
24
+ "AutolinkClient: AUTOLINK_API_KEY environment variable is not set. Add it to your .env.local file."
25
+ );
26
+ }
27
+ return new AutolinkClient({ apiKey });
28
+ }
29
+
30
+ // src/actions.ts
31
+ async function submitInquiry(payload) {
32
+ try {
33
+ const client = createAutolinkClient();
34
+ let type;
35
+ let customer_name;
36
+ let customer_email;
37
+ let customer_phone;
38
+ let subject;
39
+ let message;
40
+ let vehicle_slug;
41
+ let metadata;
42
+ let idempotencyKey;
43
+ if (payload instanceof FormData) {
44
+ type = payload.get("type") ?? void 0;
45
+ customer_name = payload.get("customer_name") ?? "";
46
+ customer_email = payload.get("customer_email") ?? "";
47
+ customer_phone = payload.get("customer_phone") ?? void 0;
48
+ subject = payload.get("subject") ?? void 0;
49
+ message = payload.get("message") ?? "";
50
+ vehicle_slug = payload.get("vehicle_slug") ?? void 0;
51
+ idempotencyKey = payload.get("idempotency_key") ?? void 0;
52
+ const rawMetadata = payload.get("metadata");
53
+ if (rawMetadata && typeof rawMetadata === "string") {
54
+ try {
55
+ metadata = JSON.parse(rawMetadata);
56
+ } catch {
57
+ }
58
+ }
59
+ } else {
60
+ type = payload.type;
61
+ customer_name = payload.customer_name;
62
+ customer_email = payload.customer_email;
63
+ customer_phone = payload.customer_phone;
64
+ subject = payload.subject;
65
+ message = payload.message;
66
+ vehicle_slug = payload.vehicle_slug;
67
+ metadata = payload.metadata;
68
+ }
69
+ const inquiryPayload = {
70
+ type: type ?? (vehicle_slug ? "vehicle" : "general"),
71
+ customer_name,
72
+ customer_email,
73
+ ...customer_phone ? { customer_phone } : {},
74
+ ...subject ? { subject } : {},
75
+ message,
76
+ ...vehicle_slug ? { vehicle_slug } : {},
77
+ ...metadata ? { metadata } : {}
78
+ };
79
+ const result = await client.inquiries.create(inquiryPayload, {
80
+ ...idempotencyKey ? { idempotencyKey } : {}
81
+ });
82
+ return { ok: true, data: result };
83
+ } catch (err) {
84
+ if (err instanceof AutolinkValidationError) {
85
+ const fields = {};
86
+ for (const [key, value] of Object.entries(err.fields)) {
87
+ fields[key] = Array.isArray(value) ? value : [String(value)];
88
+ }
89
+ return {
90
+ ok: false,
91
+ error: err.message ?? "Validation failed",
92
+ ...Object.keys(fields).length > 0 ? { fields } : {}
93
+ };
94
+ }
95
+ if (err instanceof AutolinkAuthError) {
96
+ return {
97
+ ok: false,
98
+ error: "Authentication failed. Please check your API key."
99
+ };
100
+ }
101
+ return {
102
+ ok: false,
103
+ error: err instanceof Error ? err.message : "An unexpected error occurred"
104
+ };
105
+ }
106
+ }
107
+ export {
108
+ submitInquiry
109
+ };
110
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/actions.ts","../src/index.ts"],"sourcesContent":["\"use server\";\nimport \"server-only\";\n\nimport { createAutolinkClient } from \"./index.js\";\nimport { AutolinkValidationError, AutolinkAuthError } from \"./index.js\";\n\nexport async function submitInquiry(\n payload:\n | FormData\n | {\n type?: string;\n customer_name: string;\n customer_email: string;\n customer_phone?: string;\n subject?: string;\n message: string;\n vehicle_slug?: string;\n metadata?: Record<string, unknown>;\n },\n): Promise<\n | { ok: true; data: unknown }\n | { ok: false; error: string; fields?: Record<string, string[]> }\n> {\n try {\n const client = createAutolinkClient();\n\n let type: string | undefined;\n let customer_name: string;\n let customer_email: string;\n let customer_phone: string | undefined;\n let subject: string | undefined;\n let message: string;\n let vehicle_slug: string | undefined;\n let metadata: Record<string, unknown> | undefined;\n let idempotencyKey: string | undefined;\n\n if (payload instanceof FormData) {\n type = (payload.get(\"type\") as string | null) ?? undefined;\n customer_name = (payload.get(\"customer_name\") as string | null) ?? \"\";\n customer_email = (payload.get(\"customer_email\") as string | null) ?? \"\";\n customer_phone =\n (payload.get(\"customer_phone\") as string | null) ?? undefined;\n subject = (payload.get(\"subject\") as string | null) ?? undefined;\n message = (payload.get(\"message\") as string | null) ?? \"\";\n vehicle_slug =\n (payload.get(\"vehicle_slug\") as string | null) ?? undefined;\n idempotencyKey =\n (payload.get(\"idempotency_key\") as string | null) ?? undefined;\n const rawMetadata = payload.get(\"metadata\");\n if (rawMetadata && typeof rawMetadata === \"string\") {\n try {\n metadata = JSON.parse(rawMetadata) as Record<string, unknown>;\n } catch {\n // ignore invalid JSON metadata\n }\n }\n } else {\n type = payload.type;\n customer_name = payload.customer_name;\n customer_email = payload.customer_email;\n customer_phone = payload.customer_phone;\n subject = payload.subject;\n message = payload.message;\n vehicle_slug = payload.vehicle_slug;\n metadata = payload.metadata;\n }\n\n const inquiryPayload = {\n type: (type ?? (vehicle_slug ? \"vehicle\" : \"general\")) as\n | \"vehicle\"\n | \"general\",\n customer_name,\n customer_email,\n ...(customer_phone ? { customer_phone } : {}),\n ...(subject ? { subject } : {}),\n message,\n ...(vehicle_slug ? { vehicle_slug } : {}),\n ...(metadata ? { metadata } : {}),\n };\n\n const result = await client.inquiries.create(inquiryPayload, {\n ...(idempotencyKey ? { idempotencyKey } : {}),\n });\n\n return { ok: true, data: result };\n } catch (err: unknown) {\n if (err instanceof AutolinkValidationError) {\n const fields: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(err.fields)) {\n fields[key] = Array.isArray(value) ? value : [String(value)];\n }\n return {\n ok: false,\n error: err.message ?? \"Validation failed\",\n ...(Object.keys(fields).length > 0 ? { fields } : {}),\n };\n }\n\n if (err instanceof AutolinkAuthError) {\n return {\n ok: false,\n error: \"Authentication failed. Please check your API key.\",\n };\n }\n\n return {\n ok: false,\n error:\n err instanceof Error ? err.message : \"An unexpected error occurred\",\n };\n }\n}\n","import \"server-only\";\nimport { AutolinkClient } from \"@autolink/sdk\";\nexport type { AutolinkClientConfig } from \"@autolink/sdk\";\n\nexport function createAutolinkClient(): AutolinkClient {\n const apiKey = process.env[\"AUTOLINK_API_KEY\"];\n if (!apiKey) {\n throw new Error(\n \"AutolinkClient: AUTOLINK_API_KEY environment variable is not set. \" +\n \"Add it to your .env.local file.\",\n );\n }\n return new AutolinkClient({ apiKey });\n}\n\nexport { AutolinkClient } from \"@autolink/sdk\";\nexport {\n AutolinkError,\n AutolinkAuthError,\n AutolinkForbiddenError,\n AutolinkNotFoundError,\n AutolinkValidationError,\n AutolinkRateLimitError,\n AutolinkNetworkError,\n} from \"@autolink/sdk\";\nexport type {\n AutolinkVehicle,\n AutolinkInquiryPayload,\n AutolinkInquiry,\n AutolinkProfile,\n AutolinkArticle,\n GatewayEnvelope,\n} from \"@autolink/sdk\";\n\nexport { submitInquiry } from \"./actions.js\";\nexport { unwrap, getFieldErrors } from \"@autolink/sdk\";\n"],"mappings":";;;AACA,OAAO;;;ACDP,OAAO;AACP,SAAS,sBAAsB;AAc/B,SAAS,kBAAAA,uBAAsB;AAC/B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAWP,SAAS,QAAQ,sBAAsB;AA/BhC,SAAS,uBAAuC;AACrD,QAAM,SAAS,QAAQ,IAAI,kBAAkB;AAC7C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO,IAAI,eAAe,EAAE,OAAO,CAAC;AACtC;;;ADPA,eAAsB,cACpB,SAeA;AACA,MAAI;AACF,UAAM,SAAS,qBAAqB;AAEpC,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI,mBAAmB,UAAU;AAC/B,aAAQ,QAAQ,IAAI,MAAM,KAAuB;AACjD,sBAAiB,QAAQ,IAAI,eAAe,KAAuB;AACnE,uBAAkB,QAAQ,IAAI,gBAAgB,KAAuB;AACrE,uBACG,QAAQ,IAAI,gBAAgB,KAAuB;AACtD,gBAAW,QAAQ,IAAI,SAAS,KAAuB;AACvD,gBAAW,QAAQ,IAAI,SAAS,KAAuB;AACvD,qBACG,QAAQ,IAAI,cAAc,KAAuB;AACpD,uBACG,QAAQ,IAAI,iBAAiB,KAAuB;AACvD,YAAM,cAAc,QAAQ,IAAI,UAAU;AAC1C,UAAI,eAAe,OAAO,gBAAgB,UAAU;AAClD,YAAI;AACF,qBAAW,KAAK,MAAM,WAAW;AAAA,QACnC,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AACf,sBAAgB,QAAQ;AACxB,uBAAiB,QAAQ;AACzB,uBAAiB,QAAQ;AACzB,gBAAU,QAAQ;AAClB,gBAAU,QAAQ;AAClB,qBAAe,QAAQ;AACvB,iBAAW,QAAQ;AAAA,IACrB;AAEA,UAAM,iBAAiB;AAAA,MACrB,MAAO,SAAS,eAAe,YAAY;AAAA,MAG3C;AAAA,MACA;AAAA,MACA,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,MAC3C,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC7B;AAAA,MACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACvC,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IACjC;AAEA,UAAM,SAAS,MAAM,OAAO,UAAU,OAAO,gBAAgB;AAAA,MAC3D,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,IAC7C,CAAC;AAED,WAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,EAClC,SAAS,KAAc;AACrB,QAAI,eAAe,yBAAyB;AAC1C,YAAM,SAAmC,CAAC;AAC1C,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AACrD,eAAO,GAAG,IAAI,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC;AAAA,MAC7D;AACA,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,IAAI,WAAW;AAAA,QACtB,GAAI,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,MACrD;AAAA,IACF;AAEA,QAAI,eAAe,mBAAmB;AACpC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OACE,eAAe,QAAQ,IAAI,UAAU;AAAA,IACzC;AAAA,EACF;AACF;","names":["AutolinkClient"]}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/image-proxy.ts
21
+ var image_proxy_exports = {};
22
+ __export(image_proxy_exports, {
23
+ GET: () => GET
24
+ });
25
+ module.exports = __toCommonJS(image_proxy_exports);
26
+ var import_server_only = require("server-only");
27
+ var ALLOWED_DOMAINS = [
28
+ "autolink-archive.fra1.digitaloceanspaces.com",
29
+ "autolink-archive.fra1.digitaloceanspaces.com"
30
+ ];
31
+ function isAllowedUrl(raw) {
32
+ try {
33
+ const { hostname } = new URL(raw);
34
+ return ALLOWED_DOMAINS.includes(hostname) || hostname.endsWith(".digitaloceanspaces.com");
35
+ } catch {
36
+ return false;
37
+ }
38
+ }
39
+ async function GET(request) {
40
+ const { searchParams } = new URL(request.url);
41
+ const url = searchParams.get("url");
42
+ if (!url) {
43
+ return new Response("Missing url parameter", { status: 400 });
44
+ }
45
+ if (!isAllowedUrl(url)) {
46
+ return new Response("Forbidden: image domain not allowed", { status: 403 });
47
+ }
48
+ let upstream;
49
+ try {
50
+ upstream = await fetch(url, { cache: "no-store" });
51
+ } catch {
52
+ return new Response("Failed to fetch image from upstream", { status: 502 });
53
+ }
54
+ if (!upstream.ok) {
55
+ return new Response("Upstream image not found", {
56
+ status: upstream.status
57
+ });
58
+ }
59
+ const contentType = upstream.headers.get("content-type") ?? "image/jpeg";
60
+ return new Response(upstream.body, {
61
+ status: 200,
62
+ headers: {
63
+ "Content-Type": contentType,
64
+ "Cache-Control": "public, max-age=3600, stale-while-revalidate=86400"
65
+ }
66
+ });
67
+ }
68
+ // Annotate the CommonJS export names for ESM import in node:
69
+ 0 && (module.exports = {
70
+ GET
71
+ });
72
+ //# sourceMappingURL=image-proxy.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/image-proxy.ts"],"sourcesContent":["import \"server-only\";\n\nconst ALLOWED_DOMAINS = [\n \"autolink-archive.fra1.digitaloceanspaces.com\",\n \"autolink-archive.fra1.digitaloceanspaces.com\",\n];\n\nfunction isAllowedUrl(raw: string): boolean {\n try {\n const { hostname } = new URL(raw);\n return (\n ALLOWED_DOMAINS.includes(hostname) ||\n hostname.endsWith(\".digitaloceanspaces.com\")\n );\n } catch {\n return false;\n }\n}\n\nexport async function GET(request: Request): Promise<Response> {\n const { searchParams } = new URL(request.url);\n const url = searchParams.get(\"url\");\n\n if (!url) {\n return new Response(\"Missing url parameter\", { status: 400 });\n }\n\n if (!isAllowedUrl(url)) {\n return new Response(\"Forbidden: image domain not allowed\", { status: 403 });\n }\n\n let upstream: Response;\n try {\n upstream = await fetch(url, { cache: \"no-store\" });\n } catch {\n return new Response(\"Failed to fetch image from upstream\", { status: 502 });\n }\n\n if (!upstream.ok) {\n return new Response(\"Upstream image not found\", {\n status: upstream.status,\n });\n }\n\n const contentType = upstream.headers.get(\"content-type\") ?? \"image/jpeg\";\n\n return new Response(upstream.body, {\n status: 200,\n headers: {\n \"Content-Type\": contentType,\n \"Cache-Control\": \"public, max-age=3600, stale-while-revalidate=86400\",\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAO;AAEP,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AACF;AAEA,SAAS,aAAa,KAAsB;AAC1C,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,IAAI,IAAI,GAAG;AAChC,WACE,gBAAgB,SAAS,QAAQ,KACjC,SAAS,SAAS,yBAAyB;AAAA,EAE/C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,IAAI,SAAqC;AAC7D,QAAM,EAAE,aAAa,IAAI,IAAI,IAAI,QAAQ,GAAG;AAC5C,QAAM,MAAM,aAAa,IAAI,KAAK;AAElC,MAAI,CAAC,KAAK;AACR,WAAO,IAAI,SAAS,yBAAyB,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC9D;AAEA,MAAI,CAAC,aAAa,GAAG,GAAG;AACtB,WAAO,IAAI,SAAS,uCAAuC,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5E;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,KAAK,EAAE,OAAO,WAAW,CAAC;AAAA,EACnD,QAAQ;AACN,WAAO,IAAI,SAAS,uCAAuC,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5E;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,WAAO,IAAI,SAAS,4BAA4B;AAAA,MAC9C,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAE5D,SAAO,IAAI,SAAS,SAAS,MAAM;AAAA,IACjC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,3 @@
1
+ declare function GET(request: Request): Promise<Response>;
2
+
3
+ export { GET };
@@ -0,0 +1,3 @@
1
+ declare function GET(request: Request): Promise<Response>;
2
+
3
+ export { GET };
@@ -0,0 +1,47 @@
1
+ // src/image-proxy.ts
2
+ import "server-only";
3
+ var ALLOWED_DOMAINS = [
4
+ "autolink-archive.fra1.digitaloceanspaces.com",
5
+ "autolink-archive.fra1.digitaloceanspaces.com"
6
+ ];
7
+ function isAllowedUrl(raw) {
8
+ try {
9
+ const { hostname } = new URL(raw);
10
+ return ALLOWED_DOMAINS.includes(hostname) || hostname.endsWith(".digitaloceanspaces.com");
11
+ } catch {
12
+ return false;
13
+ }
14
+ }
15
+ async function GET(request) {
16
+ const { searchParams } = new URL(request.url);
17
+ const url = searchParams.get("url");
18
+ if (!url) {
19
+ return new Response("Missing url parameter", { status: 400 });
20
+ }
21
+ if (!isAllowedUrl(url)) {
22
+ return new Response("Forbidden: image domain not allowed", { status: 403 });
23
+ }
24
+ let upstream;
25
+ try {
26
+ upstream = await fetch(url, { cache: "no-store" });
27
+ } catch {
28
+ return new Response("Failed to fetch image from upstream", { status: 502 });
29
+ }
30
+ if (!upstream.ok) {
31
+ return new Response("Upstream image not found", {
32
+ status: upstream.status
33
+ });
34
+ }
35
+ const contentType = upstream.headers.get("content-type") ?? "image/jpeg";
36
+ return new Response(upstream.body, {
37
+ status: 200,
38
+ headers: {
39
+ "Content-Type": contentType,
40
+ "Cache-Control": "public, max-age=3600, stale-while-revalidate=86400"
41
+ }
42
+ });
43
+ }
44
+ export {
45
+ GET
46
+ };
47
+ //# sourceMappingURL=image-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/image-proxy.ts"],"sourcesContent":["import \"server-only\";\n\nconst ALLOWED_DOMAINS = [\n \"autolink-archive.fra1.digitaloceanspaces.com\",\n \"autolink-archive.fra1.digitaloceanspaces.com\",\n];\n\nfunction isAllowedUrl(raw: string): boolean {\n try {\n const { hostname } = new URL(raw);\n return (\n ALLOWED_DOMAINS.includes(hostname) ||\n hostname.endsWith(\".digitaloceanspaces.com\")\n );\n } catch {\n return false;\n }\n}\n\nexport async function GET(request: Request): Promise<Response> {\n const { searchParams } = new URL(request.url);\n const url = searchParams.get(\"url\");\n\n if (!url) {\n return new Response(\"Missing url parameter\", { status: 400 });\n }\n\n if (!isAllowedUrl(url)) {\n return new Response(\"Forbidden: image domain not allowed\", { status: 403 });\n }\n\n let upstream: Response;\n try {\n upstream = await fetch(url, { cache: \"no-store\" });\n } catch {\n return new Response(\"Failed to fetch image from upstream\", { status: 502 });\n }\n\n if (!upstream.ok) {\n return new Response(\"Upstream image not found\", {\n status: upstream.status,\n });\n }\n\n const contentType = upstream.headers.get(\"content-type\") ?? \"image/jpeg\";\n\n return new Response(upstream.body, {\n status: 200,\n headers: {\n \"Content-Type\": contentType,\n \"Cache-Control\": \"public, max-age=3600, stale-while-revalidate=86400\",\n },\n });\n}\n"],"mappings":";AAAA,OAAO;AAEP,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AACF;AAEA,SAAS,aAAa,KAAsB;AAC1C,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,IAAI,IAAI,GAAG;AAChC,WACE,gBAAgB,SAAS,QAAQ,KACjC,SAAS,SAAS,yBAAyB;AAAA,EAE/C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,IAAI,SAAqC;AAC7D,QAAM,EAAE,aAAa,IAAI,IAAI,IAAI,QAAQ,GAAG;AAC5C,QAAM,MAAM,aAAa,IAAI,KAAK;AAElC,MAAI,CAAC,KAAK;AACR,WAAO,IAAI,SAAS,yBAAyB,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC9D;AAEA,MAAI,CAAC,aAAa,GAAG,GAAG;AACtB,WAAO,IAAI,SAAS,uCAAuC,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5E;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,KAAK,EAAE,OAAO,WAAW,CAAC;AAAA,EACnD,QAAQ;AACN,WAAO,IAAI,SAAS,uCAAuC,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5E;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,WAAO,IAAI,SAAS,4BAA4B;AAAA,MAC9C,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAE5D,SAAO,IAAI,SAAS,SAAS,MAAM;AAAA,IACjC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AACH;","names":[]}
package/dist/index.cjs ADDED
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ AutolinkAuthError: () => import_sdk3.AutolinkAuthError,
24
+ AutolinkClient: () => import_sdk2.AutolinkClient,
25
+ AutolinkError: () => import_sdk3.AutolinkError,
26
+ AutolinkForbiddenError: () => import_sdk3.AutolinkForbiddenError,
27
+ AutolinkNetworkError: () => import_sdk3.AutolinkNetworkError,
28
+ AutolinkNotFoundError: () => import_sdk3.AutolinkNotFoundError,
29
+ AutolinkRateLimitError: () => import_sdk3.AutolinkRateLimitError,
30
+ AutolinkValidationError: () => import_sdk3.AutolinkValidationError,
31
+ createAutolinkClient: () => createAutolinkClient,
32
+ getFieldErrors: () => import_sdk4.getFieldErrors,
33
+ submitInquiry: () => submitInquiry,
34
+ unwrap: () => import_sdk4.unwrap
35
+ });
36
+ module.exports = __toCommonJS(index_exports);
37
+ var import_server_only2 = require("server-only");
38
+ var import_sdk = require("@autolink/sdk");
39
+ var import_sdk2 = require("@autolink/sdk");
40
+ var import_sdk3 = require("@autolink/sdk");
41
+
42
+ // src/actions.ts
43
+ var import_server_only = require("server-only");
44
+ async function submitInquiry(payload) {
45
+ try {
46
+ const client = createAutolinkClient();
47
+ let type;
48
+ let customer_name;
49
+ let customer_email;
50
+ let customer_phone;
51
+ let subject;
52
+ let message;
53
+ let vehicle_slug;
54
+ let metadata;
55
+ let idempotencyKey;
56
+ if (payload instanceof FormData) {
57
+ type = payload.get("type") ?? void 0;
58
+ customer_name = payload.get("customer_name") ?? "";
59
+ customer_email = payload.get("customer_email") ?? "";
60
+ customer_phone = payload.get("customer_phone") ?? void 0;
61
+ subject = payload.get("subject") ?? void 0;
62
+ message = payload.get("message") ?? "";
63
+ vehicle_slug = payload.get("vehicle_slug") ?? void 0;
64
+ idempotencyKey = payload.get("idempotency_key") ?? void 0;
65
+ const rawMetadata = payload.get("metadata");
66
+ if (rawMetadata && typeof rawMetadata === "string") {
67
+ try {
68
+ metadata = JSON.parse(rawMetadata);
69
+ } catch {
70
+ }
71
+ }
72
+ } else {
73
+ type = payload.type;
74
+ customer_name = payload.customer_name;
75
+ customer_email = payload.customer_email;
76
+ customer_phone = payload.customer_phone;
77
+ subject = payload.subject;
78
+ message = payload.message;
79
+ vehicle_slug = payload.vehicle_slug;
80
+ metadata = payload.metadata;
81
+ }
82
+ const inquiryPayload = {
83
+ type: type ?? (vehicle_slug ? "vehicle" : "general"),
84
+ customer_name,
85
+ customer_email,
86
+ ...customer_phone ? { customer_phone } : {},
87
+ ...subject ? { subject } : {},
88
+ message,
89
+ ...vehicle_slug ? { vehicle_slug } : {},
90
+ ...metadata ? { metadata } : {}
91
+ };
92
+ const result = await client.inquiries.create(inquiryPayload, {
93
+ ...idempotencyKey ? { idempotencyKey } : {}
94
+ });
95
+ return { ok: true, data: result };
96
+ } catch (err) {
97
+ if (err instanceof import_sdk3.AutolinkValidationError) {
98
+ const fields = {};
99
+ for (const [key, value] of Object.entries(err.fields)) {
100
+ fields[key] = Array.isArray(value) ? value : [String(value)];
101
+ }
102
+ return {
103
+ ok: false,
104
+ error: err.message ?? "Validation failed",
105
+ ...Object.keys(fields).length > 0 ? { fields } : {}
106
+ };
107
+ }
108
+ if (err instanceof import_sdk3.AutolinkAuthError) {
109
+ return {
110
+ ok: false,
111
+ error: "Authentication failed. Please check your API key."
112
+ };
113
+ }
114
+ return {
115
+ ok: false,
116
+ error: err instanceof Error ? err.message : "An unexpected error occurred"
117
+ };
118
+ }
119
+ }
120
+
121
+ // src/index.ts
122
+ var import_sdk4 = require("@autolink/sdk");
123
+ function createAutolinkClient() {
124
+ const apiKey = process.env["AUTOLINK_API_KEY"];
125
+ if (!apiKey) {
126
+ throw new Error(
127
+ "AutolinkClient: AUTOLINK_API_KEY environment variable is not set. Add it to your .env.local file."
128
+ );
129
+ }
130
+ return new import_sdk.AutolinkClient({ apiKey });
131
+ }
132
+ // Annotate the CommonJS export names for ESM import in node:
133
+ 0 && (module.exports = {
134
+ AutolinkAuthError,
135
+ AutolinkClient,
136
+ AutolinkError,
137
+ AutolinkForbiddenError,
138
+ AutolinkNetworkError,
139
+ AutolinkNotFoundError,
140
+ AutolinkRateLimitError,
141
+ AutolinkValidationError,
142
+ createAutolinkClient,
143
+ getFieldErrors,
144
+ submitInquiry,
145
+ unwrap
146
+ });
147
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/actions.ts"],"sourcesContent":["import \"server-only\";\nimport { AutolinkClient } from \"@autolink/sdk\";\nexport type { AutolinkClientConfig } from \"@autolink/sdk\";\n\nexport function createAutolinkClient(): AutolinkClient {\n const apiKey = process.env[\"AUTOLINK_API_KEY\"];\n if (!apiKey) {\n throw new Error(\n \"AutolinkClient: AUTOLINK_API_KEY environment variable is not set. \" +\n \"Add it to your .env.local file.\",\n );\n }\n return new AutolinkClient({ apiKey });\n}\n\nexport { AutolinkClient } from \"@autolink/sdk\";\nexport {\n AutolinkError,\n AutolinkAuthError,\n AutolinkForbiddenError,\n AutolinkNotFoundError,\n AutolinkValidationError,\n AutolinkRateLimitError,\n AutolinkNetworkError,\n} from \"@autolink/sdk\";\nexport type {\n AutolinkVehicle,\n AutolinkInquiryPayload,\n AutolinkInquiry,\n AutolinkProfile,\n AutolinkArticle,\n GatewayEnvelope,\n} from \"@autolink/sdk\";\n\nexport { submitInquiry } from \"./actions.js\";\nexport { unwrap, getFieldErrors } from \"@autolink/sdk\";\n","\"use server\";\nimport \"server-only\";\n\nimport { createAutolinkClient } from \"./index.js\";\nimport { AutolinkValidationError, AutolinkAuthError } from \"./index.js\";\n\nexport async function submitInquiry(\n payload:\n | FormData\n | {\n type?: string;\n customer_name: string;\n customer_email: string;\n customer_phone?: string;\n subject?: string;\n message: string;\n vehicle_slug?: string;\n metadata?: Record<string, unknown>;\n },\n): Promise<\n | { ok: true; data: unknown }\n | { ok: false; error: string; fields?: Record<string, string[]> }\n> {\n try {\n const client = createAutolinkClient();\n\n let type: string | undefined;\n let customer_name: string;\n let customer_email: string;\n let customer_phone: string | undefined;\n let subject: string | undefined;\n let message: string;\n let vehicle_slug: string | undefined;\n let metadata: Record<string, unknown> | undefined;\n let idempotencyKey: string | undefined;\n\n if (payload instanceof FormData) {\n type = (payload.get(\"type\") as string | null) ?? undefined;\n customer_name = (payload.get(\"customer_name\") as string | null) ?? \"\";\n customer_email = (payload.get(\"customer_email\") as string | null) ?? \"\";\n customer_phone =\n (payload.get(\"customer_phone\") as string | null) ?? undefined;\n subject = (payload.get(\"subject\") as string | null) ?? undefined;\n message = (payload.get(\"message\") as string | null) ?? \"\";\n vehicle_slug =\n (payload.get(\"vehicle_slug\") as string | null) ?? undefined;\n idempotencyKey =\n (payload.get(\"idempotency_key\") as string | null) ?? undefined;\n const rawMetadata = payload.get(\"metadata\");\n if (rawMetadata && typeof rawMetadata === \"string\") {\n try {\n metadata = JSON.parse(rawMetadata) as Record<string, unknown>;\n } catch {\n // ignore invalid JSON metadata\n }\n }\n } else {\n type = payload.type;\n customer_name = payload.customer_name;\n customer_email = payload.customer_email;\n customer_phone = payload.customer_phone;\n subject = payload.subject;\n message = payload.message;\n vehicle_slug = payload.vehicle_slug;\n metadata = payload.metadata;\n }\n\n const inquiryPayload = {\n type: (type ?? (vehicle_slug ? \"vehicle\" : \"general\")) as\n | \"vehicle\"\n | \"general\",\n customer_name,\n customer_email,\n ...(customer_phone ? { customer_phone } : {}),\n ...(subject ? { subject } : {}),\n message,\n ...(vehicle_slug ? { vehicle_slug } : {}),\n ...(metadata ? { metadata } : {}),\n };\n\n const result = await client.inquiries.create(inquiryPayload, {\n ...(idempotencyKey ? { idempotencyKey } : {}),\n });\n\n return { ok: true, data: result };\n } catch (err: unknown) {\n if (err instanceof AutolinkValidationError) {\n const fields: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(err.fields)) {\n fields[key] = Array.isArray(value) ? value : [String(value)];\n }\n return {\n ok: false,\n error: err.message ?? \"Validation failed\",\n ...(Object.keys(fields).length > 0 ? { fields } : {}),\n };\n }\n\n if (err instanceof AutolinkAuthError) {\n return {\n ok: false,\n error: \"Authentication failed. Please check your API key.\",\n };\n }\n\n return {\n ok: false,\n error:\n err instanceof Error ? err.message : \"An unexpected error occurred\",\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,sBAAO;AACP,iBAA+B;AAc/B,IAAAC,cAA+B;AAC/B,IAAAA,cAQO;;;ACvBP,yBAAO;AAKP,eAAsB,cACpB,SAeA;AACA,MAAI;AACF,UAAM,SAAS,qBAAqB;AAEpC,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI,mBAAmB,UAAU;AAC/B,aAAQ,QAAQ,IAAI,MAAM,KAAuB;AACjD,sBAAiB,QAAQ,IAAI,eAAe,KAAuB;AACnE,uBAAkB,QAAQ,IAAI,gBAAgB,KAAuB;AACrE,uBACG,QAAQ,IAAI,gBAAgB,KAAuB;AACtD,gBAAW,QAAQ,IAAI,SAAS,KAAuB;AACvD,gBAAW,QAAQ,IAAI,SAAS,KAAuB;AACvD,qBACG,QAAQ,IAAI,cAAc,KAAuB;AACpD,uBACG,QAAQ,IAAI,iBAAiB,KAAuB;AACvD,YAAM,cAAc,QAAQ,IAAI,UAAU;AAC1C,UAAI,eAAe,OAAO,gBAAgB,UAAU;AAClD,YAAI;AACF,qBAAW,KAAK,MAAM,WAAW;AAAA,QACnC,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AACf,sBAAgB,QAAQ;AACxB,uBAAiB,QAAQ;AACzB,uBAAiB,QAAQ;AACzB,gBAAU,QAAQ;AAClB,gBAAU,QAAQ;AAClB,qBAAe,QAAQ;AACvB,iBAAW,QAAQ;AAAA,IACrB;AAEA,UAAM,iBAAiB;AAAA,MACrB,MAAO,SAAS,eAAe,YAAY;AAAA,MAG3C;AAAA,MACA;AAAA,MACA,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,MAC3C,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC7B;AAAA,MACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACvC,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IACjC;AAEA,UAAM,SAAS,MAAM,OAAO,UAAU,OAAO,gBAAgB;AAAA,MAC3D,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,IAC7C,CAAC;AAED,WAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,EAClC,SAAS,KAAc;AACrB,QAAI,eAAe,qCAAyB;AAC1C,YAAM,SAAmC,CAAC;AAC1C,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AACrD,eAAO,GAAG,IAAI,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC;AAAA,MAC7D;AACA,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,IAAI,WAAW;AAAA,QACtB,GAAI,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,MACrD;AAAA,IACF;AAEA,QAAI,eAAe,+BAAmB;AACpC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OACE,eAAe,QAAQ,IAAI,UAAU;AAAA,IACzC;AAAA,EACF;AACF;;;AD5EA,IAAAC,cAAuC;AA/BhC,SAAS,uBAAuC;AACrD,QAAM,SAAS,QAAQ,IAAI,kBAAkB;AAC7C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO,IAAI,0BAAe,EAAE,OAAO,CAAC;AACtC;","names":["import_server_only","import_sdk","import_sdk"]}
@@ -0,0 +1,24 @@
1
+ import { AutolinkClient } from '@autolink/sdk';
2
+ export { AutolinkArticle, AutolinkAuthError, AutolinkClient, AutolinkClientConfig, AutolinkError, AutolinkForbiddenError, AutolinkInquiry, AutolinkInquiryPayload, AutolinkNetworkError, AutolinkNotFoundError, AutolinkProfile, AutolinkRateLimitError, AutolinkValidationError, AutolinkVehicle, GatewayEnvelope, getFieldErrors, unwrap } from '@autolink/sdk';
3
+
4
+ declare function submitInquiry(payload: FormData | {
5
+ type?: string;
6
+ customer_name: string;
7
+ customer_email: string;
8
+ customer_phone?: string;
9
+ subject?: string;
10
+ message: string;
11
+ vehicle_slug?: string;
12
+ metadata?: Record<string, unknown>;
13
+ }): Promise<{
14
+ ok: true;
15
+ data: unknown;
16
+ } | {
17
+ ok: false;
18
+ error: string;
19
+ fields?: Record<string, string[]>;
20
+ }>;
21
+
22
+ declare function createAutolinkClient(): AutolinkClient;
23
+
24
+ export { createAutolinkClient, submitInquiry };
@@ -0,0 +1,24 @@
1
+ import { AutolinkClient } from '@autolink/sdk';
2
+ export { AutolinkArticle, AutolinkAuthError, AutolinkClient, AutolinkClientConfig, AutolinkError, AutolinkForbiddenError, AutolinkInquiry, AutolinkInquiryPayload, AutolinkNetworkError, AutolinkNotFoundError, AutolinkProfile, AutolinkRateLimitError, AutolinkValidationError, AutolinkVehicle, GatewayEnvelope, getFieldErrors, unwrap } from '@autolink/sdk';
3
+
4
+ declare function submitInquiry(payload: FormData | {
5
+ type?: string;
6
+ customer_name: string;
7
+ customer_email: string;
8
+ customer_phone?: string;
9
+ subject?: string;
10
+ message: string;
11
+ vehicle_slug?: string;
12
+ metadata?: Record<string, unknown>;
13
+ }): Promise<{
14
+ ok: true;
15
+ data: unknown;
16
+ } | {
17
+ ok: false;
18
+ error: string;
19
+ fields?: Record<string, string[]>;
20
+ }>;
21
+
22
+ declare function createAutolinkClient(): AutolinkClient;
23
+
24
+ export { createAutolinkClient, submitInquiry };
package/dist/index.js ADDED
@@ -0,0 +1,119 @@
1
+ // src/index.ts
2
+ import "server-only";
3
+ import { AutolinkClient } from "@autolink/sdk";
4
+ import { AutolinkClient as AutolinkClient2 } from "@autolink/sdk";
5
+ import {
6
+ AutolinkError,
7
+ AutolinkAuthError,
8
+ AutolinkForbiddenError,
9
+ AutolinkNotFoundError,
10
+ AutolinkValidationError,
11
+ AutolinkRateLimitError,
12
+ AutolinkNetworkError
13
+ } from "@autolink/sdk";
14
+
15
+ // src/actions.ts
16
+ import "server-only";
17
+ async function submitInquiry(payload) {
18
+ try {
19
+ const client = createAutolinkClient();
20
+ let type;
21
+ let customer_name;
22
+ let customer_email;
23
+ let customer_phone;
24
+ let subject;
25
+ let message;
26
+ let vehicle_slug;
27
+ let metadata;
28
+ let idempotencyKey;
29
+ if (payload instanceof FormData) {
30
+ type = payload.get("type") ?? void 0;
31
+ customer_name = payload.get("customer_name") ?? "";
32
+ customer_email = payload.get("customer_email") ?? "";
33
+ customer_phone = payload.get("customer_phone") ?? void 0;
34
+ subject = payload.get("subject") ?? void 0;
35
+ message = payload.get("message") ?? "";
36
+ vehicle_slug = payload.get("vehicle_slug") ?? void 0;
37
+ idempotencyKey = payload.get("idempotency_key") ?? void 0;
38
+ const rawMetadata = payload.get("metadata");
39
+ if (rawMetadata && typeof rawMetadata === "string") {
40
+ try {
41
+ metadata = JSON.parse(rawMetadata);
42
+ } catch {
43
+ }
44
+ }
45
+ } else {
46
+ type = payload.type;
47
+ customer_name = payload.customer_name;
48
+ customer_email = payload.customer_email;
49
+ customer_phone = payload.customer_phone;
50
+ subject = payload.subject;
51
+ message = payload.message;
52
+ vehicle_slug = payload.vehicle_slug;
53
+ metadata = payload.metadata;
54
+ }
55
+ const inquiryPayload = {
56
+ type: type ?? (vehicle_slug ? "vehicle" : "general"),
57
+ customer_name,
58
+ customer_email,
59
+ ...customer_phone ? { customer_phone } : {},
60
+ ...subject ? { subject } : {},
61
+ message,
62
+ ...vehicle_slug ? { vehicle_slug } : {},
63
+ ...metadata ? { metadata } : {}
64
+ };
65
+ const result = await client.inquiries.create(inquiryPayload, {
66
+ ...idempotencyKey ? { idempotencyKey } : {}
67
+ });
68
+ return { ok: true, data: result };
69
+ } catch (err) {
70
+ if (err instanceof AutolinkValidationError) {
71
+ const fields = {};
72
+ for (const [key, value] of Object.entries(err.fields)) {
73
+ fields[key] = Array.isArray(value) ? value : [String(value)];
74
+ }
75
+ return {
76
+ ok: false,
77
+ error: err.message ?? "Validation failed",
78
+ ...Object.keys(fields).length > 0 ? { fields } : {}
79
+ };
80
+ }
81
+ if (err instanceof AutolinkAuthError) {
82
+ return {
83
+ ok: false,
84
+ error: "Authentication failed. Please check your API key."
85
+ };
86
+ }
87
+ return {
88
+ ok: false,
89
+ error: err instanceof Error ? err.message : "An unexpected error occurred"
90
+ };
91
+ }
92
+ }
93
+
94
+ // src/index.ts
95
+ import { unwrap, getFieldErrors } from "@autolink/sdk";
96
+ function createAutolinkClient() {
97
+ const apiKey = process.env["AUTOLINK_API_KEY"];
98
+ if (!apiKey) {
99
+ throw new Error(
100
+ "AutolinkClient: AUTOLINK_API_KEY environment variable is not set. Add it to your .env.local file."
101
+ );
102
+ }
103
+ return new AutolinkClient({ apiKey });
104
+ }
105
+ export {
106
+ AutolinkAuthError,
107
+ AutolinkClient2 as AutolinkClient,
108
+ AutolinkError,
109
+ AutolinkForbiddenError,
110
+ AutolinkNetworkError,
111
+ AutolinkNotFoundError,
112
+ AutolinkRateLimitError,
113
+ AutolinkValidationError,
114
+ createAutolinkClient,
115
+ getFieldErrors,
116
+ submitInquiry,
117
+ unwrap
118
+ };
119
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/actions.ts"],"sourcesContent":["import \"server-only\";\nimport { AutolinkClient } from \"@autolink/sdk\";\nexport type { AutolinkClientConfig } from \"@autolink/sdk\";\n\nexport function createAutolinkClient(): AutolinkClient {\n const apiKey = process.env[\"AUTOLINK_API_KEY\"];\n if (!apiKey) {\n throw new Error(\n \"AutolinkClient: AUTOLINK_API_KEY environment variable is not set. \" +\n \"Add it to your .env.local file.\",\n );\n }\n return new AutolinkClient({ apiKey });\n}\n\nexport { AutolinkClient } from \"@autolink/sdk\";\nexport {\n AutolinkError,\n AutolinkAuthError,\n AutolinkForbiddenError,\n AutolinkNotFoundError,\n AutolinkValidationError,\n AutolinkRateLimitError,\n AutolinkNetworkError,\n} from \"@autolink/sdk\";\nexport type {\n AutolinkVehicle,\n AutolinkInquiryPayload,\n AutolinkInquiry,\n AutolinkProfile,\n AutolinkArticle,\n GatewayEnvelope,\n} from \"@autolink/sdk\";\n\nexport { submitInquiry } from \"./actions.js\";\nexport { unwrap, getFieldErrors } from \"@autolink/sdk\";\n","\"use server\";\nimport \"server-only\";\n\nimport { createAutolinkClient } from \"./index.js\";\nimport { AutolinkValidationError, AutolinkAuthError } from \"./index.js\";\n\nexport async function submitInquiry(\n payload:\n | FormData\n | {\n type?: string;\n customer_name: string;\n customer_email: string;\n customer_phone?: string;\n subject?: string;\n message: string;\n vehicle_slug?: string;\n metadata?: Record<string, unknown>;\n },\n): Promise<\n | { ok: true; data: unknown }\n | { ok: false; error: string; fields?: Record<string, string[]> }\n> {\n try {\n const client = createAutolinkClient();\n\n let type: string | undefined;\n let customer_name: string;\n let customer_email: string;\n let customer_phone: string | undefined;\n let subject: string | undefined;\n let message: string;\n let vehicle_slug: string | undefined;\n let metadata: Record<string, unknown> | undefined;\n let idempotencyKey: string | undefined;\n\n if (payload instanceof FormData) {\n type = (payload.get(\"type\") as string | null) ?? undefined;\n customer_name = (payload.get(\"customer_name\") as string | null) ?? \"\";\n customer_email = (payload.get(\"customer_email\") as string | null) ?? \"\";\n customer_phone =\n (payload.get(\"customer_phone\") as string | null) ?? undefined;\n subject = (payload.get(\"subject\") as string | null) ?? undefined;\n message = (payload.get(\"message\") as string | null) ?? \"\";\n vehicle_slug =\n (payload.get(\"vehicle_slug\") as string | null) ?? undefined;\n idempotencyKey =\n (payload.get(\"idempotency_key\") as string | null) ?? undefined;\n const rawMetadata = payload.get(\"metadata\");\n if (rawMetadata && typeof rawMetadata === \"string\") {\n try {\n metadata = JSON.parse(rawMetadata) as Record<string, unknown>;\n } catch {\n // ignore invalid JSON metadata\n }\n }\n } else {\n type = payload.type;\n customer_name = payload.customer_name;\n customer_email = payload.customer_email;\n customer_phone = payload.customer_phone;\n subject = payload.subject;\n message = payload.message;\n vehicle_slug = payload.vehicle_slug;\n metadata = payload.metadata;\n }\n\n const inquiryPayload = {\n type: (type ?? (vehicle_slug ? \"vehicle\" : \"general\")) as\n | \"vehicle\"\n | \"general\",\n customer_name,\n customer_email,\n ...(customer_phone ? { customer_phone } : {}),\n ...(subject ? { subject } : {}),\n message,\n ...(vehicle_slug ? { vehicle_slug } : {}),\n ...(metadata ? { metadata } : {}),\n };\n\n const result = await client.inquiries.create(inquiryPayload, {\n ...(idempotencyKey ? { idempotencyKey } : {}),\n });\n\n return { ok: true, data: result };\n } catch (err: unknown) {\n if (err instanceof AutolinkValidationError) {\n const fields: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(err.fields)) {\n fields[key] = Array.isArray(value) ? value : [String(value)];\n }\n return {\n ok: false,\n error: err.message ?? \"Validation failed\",\n ...(Object.keys(fields).length > 0 ? { fields } : {}),\n };\n }\n\n if (err instanceof AutolinkAuthError) {\n return {\n ok: false,\n error: \"Authentication failed. Please check your API key.\",\n };\n }\n\n return {\n ok: false,\n error:\n err instanceof Error ? err.message : \"An unexpected error occurred\",\n };\n }\n}\n"],"mappings":";AAAA,OAAO;AACP,SAAS,sBAAsB;AAc/B,SAAS,kBAAAA,uBAAsB;AAC/B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACvBP,OAAO;AAKP,eAAsB,cACpB,SAeA;AACA,MAAI;AACF,UAAM,SAAS,qBAAqB;AAEpC,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI,mBAAmB,UAAU;AAC/B,aAAQ,QAAQ,IAAI,MAAM,KAAuB;AACjD,sBAAiB,QAAQ,IAAI,eAAe,KAAuB;AACnE,uBAAkB,QAAQ,IAAI,gBAAgB,KAAuB;AACrE,uBACG,QAAQ,IAAI,gBAAgB,KAAuB;AACtD,gBAAW,QAAQ,IAAI,SAAS,KAAuB;AACvD,gBAAW,QAAQ,IAAI,SAAS,KAAuB;AACvD,qBACG,QAAQ,IAAI,cAAc,KAAuB;AACpD,uBACG,QAAQ,IAAI,iBAAiB,KAAuB;AACvD,YAAM,cAAc,QAAQ,IAAI,UAAU;AAC1C,UAAI,eAAe,OAAO,gBAAgB,UAAU;AAClD,YAAI;AACF,qBAAW,KAAK,MAAM,WAAW;AAAA,QACnC,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,QAAQ;AACf,sBAAgB,QAAQ;AACxB,uBAAiB,QAAQ;AACzB,uBAAiB,QAAQ;AACzB,gBAAU,QAAQ;AAClB,gBAAU,QAAQ;AAClB,qBAAe,QAAQ;AACvB,iBAAW,QAAQ;AAAA,IACrB;AAEA,UAAM,iBAAiB;AAAA,MACrB,MAAO,SAAS,eAAe,YAAY;AAAA,MAG3C;AAAA,MACA;AAAA,MACA,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,MAC3C,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC7B;AAAA,MACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACvC,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IACjC;AAEA,UAAM,SAAS,MAAM,OAAO,UAAU,OAAO,gBAAgB;AAAA,MAC3D,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,IAC7C,CAAC;AAED,WAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,EAClC,SAAS,KAAc;AACrB,QAAI,eAAe,yBAAyB;AAC1C,YAAM,SAAmC,CAAC;AAC1C,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AACrD,eAAO,GAAG,IAAI,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC;AAAA,MAC7D;AACA,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,IAAI,WAAW;AAAA,QACtB,GAAI,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,MACrD;AAAA,IACF;AAEA,QAAI,eAAe,mBAAmB;AACpC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OACE,eAAe,QAAQ,IAAI,UAAU;AAAA,IACzC;AAAA,EACF;AACF;;;AD5EA,SAAS,QAAQ,sBAAsB;AA/BhC,SAAS,uBAAuC;AACrD,QAAM,SAAS,QAAQ,IAAI,kBAAkB;AAC7C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO,IAAI,eAAe,EAAE,OAAO,CAAC;AACtC;","names":["AutolinkClient"]}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/webhook.ts
31
+ var webhook_exports = {};
32
+ __export(webhook_exports, {
33
+ POST: () => POST,
34
+ createWebhookHandler: () => createWebhookHandler
35
+ });
36
+ module.exports = __toCommonJS(webhook_exports);
37
+ var import_server_only = require("server-only");
38
+ var import_crypto = require("crypto");
39
+ var RESOURCE_TAGS = {
40
+ vehicle: ["inventory"],
41
+ article: ["articles"],
42
+ profile: ["profile"]
43
+ };
44
+ function verifySignature(secret, payload, signature) {
45
+ const expected = (0, import_crypto.createHmac)("sha256", secret).update(payload).digest("hex");
46
+ try {
47
+ return (0, import_crypto.timingSafeEqual)(
48
+ Buffer.from(signature, "hex"),
49
+ Buffer.from(expected, "hex")
50
+ );
51
+ } catch {
52
+ return false;
53
+ }
54
+ }
55
+ function createWebhookHandler(config = {}) {
56
+ return async function POST2(request) {
57
+ const body = await request.text();
58
+ if (config.secret) {
59
+ const sig = request.headers.get("X-Autolink-Signature") ?? "";
60
+ if (!verifySignature(config.secret, body, sig)) {
61
+ return new Response(JSON.stringify({ error: "Invalid signature" }), {
62
+ status: 401,
63
+ headers: { "Content-Type": "application/json" }
64
+ });
65
+ }
66
+ }
67
+ let event;
68
+ try {
69
+ event = JSON.parse(body);
70
+ } catch {
71
+ return new Response(JSON.stringify({ error: "Invalid JSON" }), {
72
+ status: 400,
73
+ headers: { "Content-Type": "application/json" }
74
+ });
75
+ }
76
+ const resource = event.resource ?? "";
77
+ const tags = RESOURCE_TAGS[resource] ?? [resource];
78
+ try {
79
+ const { revalidateTag } = await import("next/cache");
80
+ for (const tag of tags) {
81
+ revalidateTag(tag);
82
+ }
83
+ } catch {
84
+ }
85
+ return new Response(JSON.stringify({ ok: true, revalidated: tags }), {
86
+ status: 200,
87
+ headers: { "Content-Type": "application/json" }
88
+ });
89
+ };
90
+ }
91
+ var POST = createWebhookHandler();
92
+ // Annotate the CommonJS export names for ESM import in node:
93
+ 0 && (module.exports = {
94
+ POST,
95
+ createWebhookHandler
96
+ });
97
+ //# sourceMappingURL=webhook.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/webhook.ts"],"sourcesContent":["import \"server-only\";\nimport { createHmac, timingSafeEqual } from \"crypto\";\n\ninterface WebhookHandlerConfig {\n secret?: string;\n}\n\ntype RevalidateTag = (tag: string) => void;\n\nconst RESOURCE_TAGS: Record<string, string[]> = {\n vehicle: [\"inventory\"],\n article: [\"articles\"],\n profile: [\"profile\"],\n};\n\nfunction verifySignature(\n secret: string,\n payload: string,\n signature: string,\n): boolean {\n const expected = createHmac(\"sha256\", secret).update(payload).digest(\"hex\");\n try {\n return timingSafeEqual(\n Buffer.from(signature, \"hex\"),\n Buffer.from(expected, \"hex\"),\n );\n } catch {\n return false;\n }\n}\n\nexport function createWebhookHandler(config: WebhookHandlerConfig = {}) {\n return async function POST(request: Request): Promise<Response> {\n const body = await request.text();\n\n if (config.secret) {\n const sig = request.headers.get(\"X-Autolink-Signature\") ?? \"\";\n if (!verifySignature(config.secret, body, sig)) {\n return new Response(JSON.stringify({ error: \"Invalid signature\" }), {\n status: 401,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n }\n\n let event: { type?: string; resource?: string };\n try {\n event = JSON.parse(body) as { type?: string; resource?: string };\n } catch {\n return new Response(JSON.stringify({ error: \"Invalid JSON\" }), {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n const resource = event.resource ?? \"\";\n const tags = RESOURCE_TAGS[resource] ?? [resource];\n\n // Dynamically import next/cache to avoid breaking non-Next.js environments\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore — next/cache is a peer dep, not available at build time\n const { revalidateTag } = (await import(\"next/cache\")) as {\n revalidateTag: RevalidateTag;\n };\n for (const tag of tags) {\n revalidateTag(tag);\n }\n } catch {\n // Not in a Next.js context — skip revalidation\n }\n\n return new Response(JSON.stringify({ ok: true, revalidated: tags }), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n };\n}\n\nexport const POST = createWebhookHandler();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAO;AACP,oBAA4C;AAQ5C,IAAM,gBAA0C;AAAA,EAC9C,SAAS,CAAC,WAAW;AAAA,EACrB,SAAS,CAAC,UAAU;AAAA,EACpB,SAAS,CAAC,SAAS;AACrB;AAEA,SAAS,gBACP,QACA,SACA,WACS;AACT,QAAM,eAAW,0BAAW,UAAU,MAAM,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAC1E,MAAI;AACF,eAAO;AAAA,MACL,OAAO,KAAK,WAAW,KAAK;AAAA,MAC5B,OAAO,KAAK,UAAU,KAAK;AAAA,IAC7B;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,qBAAqB,SAA+B,CAAC,GAAG;AACtE,SAAO,eAAeA,MAAK,SAAqC;AAC9D,UAAM,OAAO,MAAM,QAAQ,KAAK;AAEhC,QAAI,OAAO,QAAQ;AACjB,YAAM,MAAM,QAAQ,QAAQ,IAAI,sBAAsB,KAAK;AAC3D,UAAI,CAAC,gBAAgB,OAAO,QAAQ,MAAM,GAAG,GAAG;AAC9C,eAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,oBAAoB,CAAC,GAAG;AAAA,UAClE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,cAAQ,KAAK,MAAM,IAAI;AAAA,IACzB,QAAQ;AACN,aAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,eAAe,CAAC,GAAG;AAAA,QAC7D,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAChD,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,MAAM,YAAY;AACnC,UAAM,OAAO,cAAc,QAAQ,KAAK,CAAC,QAAQ;AAGjD,QAAI;AAGF,YAAM,EAAE,cAAc,IAAK,MAAM,OAAO,YAAY;AAGpD,iBAAW,OAAO,MAAM;AACtB,sBAAc,GAAG;AAAA,MACnB;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO,IAAI,SAAS,KAAK,UAAU,EAAE,IAAI,MAAM,aAAa,KAAK,CAAC,GAAG;AAAA,MACnE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAChD,CAAC;AAAA,EACH;AACF;AAEO,IAAM,OAAO,qBAAqB;","names":["POST"]}
@@ -0,0 +1,61 @@
1
+ // src/webhook.ts
2
+ import "server-only";
3
+ import { createHmac, timingSafeEqual } from "crypto";
4
+ var RESOURCE_TAGS = {
5
+ vehicle: ["inventory"],
6
+ article: ["articles"],
7
+ profile: ["profile"]
8
+ };
9
+ function verifySignature(secret, payload, signature) {
10
+ const expected = createHmac("sha256", secret).update(payload).digest("hex");
11
+ try {
12
+ return timingSafeEqual(
13
+ Buffer.from(signature, "hex"),
14
+ Buffer.from(expected, "hex")
15
+ );
16
+ } catch {
17
+ return false;
18
+ }
19
+ }
20
+ function createWebhookHandler(config = {}) {
21
+ return async function POST2(request) {
22
+ const body = await request.text();
23
+ if (config.secret) {
24
+ const sig = request.headers.get("X-Autolink-Signature") ?? "";
25
+ if (!verifySignature(config.secret, body, sig)) {
26
+ return new Response(JSON.stringify({ error: "Invalid signature" }), {
27
+ status: 401,
28
+ headers: { "Content-Type": "application/json" }
29
+ });
30
+ }
31
+ }
32
+ let event;
33
+ try {
34
+ event = JSON.parse(body);
35
+ } catch {
36
+ return new Response(JSON.stringify({ error: "Invalid JSON" }), {
37
+ status: 400,
38
+ headers: { "Content-Type": "application/json" }
39
+ });
40
+ }
41
+ const resource = event.resource ?? "";
42
+ const tags = RESOURCE_TAGS[resource] ?? [resource];
43
+ try {
44
+ const { revalidateTag } = await import("next/cache");
45
+ for (const tag of tags) {
46
+ revalidateTag(tag);
47
+ }
48
+ } catch {
49
+ }
50
+ return new Response(JSON.stringify({ ok: true, revalidated: tags }), {
51
+ status: 200,
52
+ headers: { "Content-Type": "application/json" }
53
+ });
54
+ };
55
+ }
56
+ var POST = createWebhookHandler();
57
+ export {
58
+ POST,
59
+ createWebhookHandler
60
+ };
61
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/webhook.ts"],"sourcesContent":["import \"server-only\";\nimport { createHmac, timingSafeEqual } from \"crypto\";\n\ninterface WebhookHandlerConfig {\n secret?: string;\n}\n\ntype RevalidateTag = (tag: string) => void;\n\nconst RESOURCE_TAGS: Record<string, string[]> = {\n vehicle: [\"inventory\"],\n article: [\"articles\"],\n profile: [\"profile\"],\n};\n\nfunction verifySignature(\n secret: string,\n payload: string,\n signature: string,\n): boolean {\n const expected = createHmac(\"sha256\", secret).update(payload).digest(\"hex\");\n try {\n return timingSafeEqual(\n Buffer.from(signature, \"hex\"),\n Buffer.from(expected, \"hex\"),\n );\n } catch {\n return false;\n }\n}\n\nexport function createWebhookHandler(config: WebhookHandlerConfig = {}) {\n return async function POST(request: Request): Promise<Response> {\n const body = await request.text();\n\n if (config.secret) {\n const sig = request.headers.get(\"X-Autolink-Signature\") ?? \"\";\n if (!verifySignature(config.secret, body, sig)) {\n return new Response(JSON.stringify({ error: \"Invalid signature\" }), {\n status: 401,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n }\n\n let event: { type?: string; resource?: string };\n try {\n event = JSON.parse(body) as { type?: string; resource?: string };\n } catch {\n return new Response(JSON.stringify({ error: \"Invalid JSON\" }), {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n const resource = event.resource ?? \"\";\n const tags = RESOURCE_TAGS[resource] ?? [resource];\n\n // Dynamically import next/cache to avoid breaking non-Next.js environments\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore — next/cache is a peer dep, not available at build time\n const { revalidateTag } = (await import(\"next/cache\")) as {\n revalidateTag: RevalidateTag;\n };\n for (const tag of tags) {\n revalidateTag(tag);\n }\n } catch {\n // Not in a Next.js context — skip revalidation\n }\n\n return new Response(JSON.stringify({ ok: true, revalidated: tags }), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n };\n}\n\nexport const POST = createWebhookHandler();\n"],"mappings":";AAAA,OAAO;AACP,SAAS,YAAY,uBAAuB;AAQ5C,IAAM,gBAA0C;AAAA,EAC9C,SAAS,CAAC,WAAW;AAAA,EACrB,SAAS,CAAC,UAAU;AAAA,EACpB,SAAS,CAAC,SAAS;AACrB;AAEA,SAAS,gBACP,QACA,SACA,WACS;AACT,QAAM,WAAW,WAAW,UAAU,MAAM,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAC1E,MAAI;AACF,WAAO;AAAA,MACL,OAAO,KAAK,WAAW,KAAK;AAAA,MAC5B,OAAO,KAAK,UAAU,KAAK;AAAA,IAC7B;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,qBAAqB,SAA+B,CAAC,GAAG;AACtE,SAAO,eAAeA,MAAK,SAAqC;AAC9D,UAAM,OAAO,MAAM,QAAQ,KAAK;AAEhC,QAAI,OAAO,QAAQ;AACjB,YAAM,MAAM,QAAQ,QAAQ,IAAI,sBAAsB,KAAK;AAC3D,UAAI,CAAC,gBAAgB,OAAO,QAAQ,MAAM,GAAG,GAAG;AAC9C,eAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,oBAAoB,CAAC,GAAG;AAAA,UAClE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,cAAQ,KAAK,MAAM,IAAI;AAAA,IACzB,QAAQ;AACN,aAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,eAAe,CAAC,GAAG;AAAA,QAC7D,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAChD,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,MAAM,YAAY;AACnC,UAAM,OAAO,cAAc,QAAQ,KAAK,CAAC,QAAQ;AAGjD,QAAI;AAGF,YAAM,EAAE,cAAc,IAAK,MAAM,OAAO,YAAY;AAGpD,iBAAW,OAAO,MAAM;AACtB,sBAAc,GAAG;AAAA,MACnB;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO,IAAI,SAAS,KAAK,UAAU,EAAE,IAAI,MAAM,aAAa,KAAK,CAAC,GAAG;AAAA,MACnE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAChD,CAAC;AAAA,EACH;AACF;AAEO,IAAM,OAAO,qBAAqB;","names":["POST"]}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@autolink/nextjs",
3
+ "version": "0.2.0",
4
+ "description": "Next.js adapter for @autolink/sdk — ISR, server actions, and cache invalidation",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
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
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./webhook": {
16
+ "types": "./dist/webhook.d.ts",
17
+ "import": "./dist/webhook.js",
18
+ "require": "./dist/webhook.cjs"
19
+ },
20
+ "./actions": {
21
+ "types": "./dist/actions.d.ts",
22
+ "import": "./dist/actions.js",
23
+ "require": "./dist/actions.cjs"
24
+ },
25
+ "./image-proxy": {
26
+ "types": "./dist/image-proxy.d.ts",
27
+ "import": "./dist/image-proxy.js",
28
+ "require": "./dist/image-proxy.cjs"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist"
33
+ ],
34
+ "scripts": {
35
+ "build": "tsup",
36
+ "test": "vitest run",
37
+ "typecheck": "tsc --noEmit",
38
+ "lint": "eslint src",
39
+ "clean": "rm -rf dist"
40
+ },
41
+ "dependencies": {
42
+ "@autolink/sdk": "workspace:*",
43
+ "server-only": "^0.0.1"
44
+ },
45
+ "peerDependencies": {
46
+ "next": ">=14"
47
+ },
48
+ "devDependencies": {
49
+ "tsup": "^8.3.5",
50
+ "vitest": "^2.1.8",
51
+ "@types/node": "^22.10.5",
52
+ "typescript": "^5.7.3"
53
+ },
54
+ "engines": {
55
+ "node": ">=20"
56
+ },
57
+ "license": "MIT"
58
+ }