@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.
- package/dist/actions.cjs +126 -0
- package/dist/actions.cjs.map +1 -0
- package/dist/actions.d.cts +19 -0
- package/dist/actions.d.ts +19 -0
- package/dist/actions.js +110 -0
- package/dist/actions.js.map +1 -0
- package/dist/image-proxy.cjs +72 -0
- package/dist/image-proxy.cjs.map +1 -0
- package/dist/image-proxy.d.cts +3 -0
- package/dist/image-proxy.d.ts +3 -0
- package/dist/image-proxy.js +47 -0
- package/dist/image-proxy.js.map +1 -0
- package/dist/index.cjs +147 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +24 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +119 -0
- package/dist/index.js.map +1 -0
- package/dist/webhook.cjs +97 -0
- package/dist/webhook.cjs.map +1 -0
- package/dist/webhook.js +61 -0
- package/dist/webhook.js.map +1 -0
- package/package.json +58 -0
package/dist/actions.cjs
ADDED
|
@@ -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 };
|
package/dist/actions.js
ADDED
|
@@ -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,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"]}
|
package/dist/index.d.cts
ADDED
|
@@ -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.d.ts
ADDED
|
@@ -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"]}
|
package/dist/webhook.cjs
ADDED
|
@@ -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"]}
|
package/dist/webhook.js
ADDED
|
@@ -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
|
+
}
|