@alisamadiillc/devtools 0.0.1 → 0.0.2

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,74 @@
1
+ 'use strict';
2
+
3
+ // src/client/contact.ts
4
+ async function sendContact(baseUrl, sourceUrl, input) {
5
+ const headers = {
6
+ "Content-Type": "application/json"
7
+ };
8
+ if (input.origin) {
9
+ headers["Origin"] = input.origin;
10
+ }
11
+ const body = {
12
+ name: input.name,
13
+ email: input.email,
14
+ subject: input.subject,
15
+ message: input.message
16
+ };
17
+ if (input.metadata) {
18
+ body.metadata = input.metadata;
19
+ }
20
+ if (sourceUrl) {
21
+ body.sourceUrl = sourceUrl;
22
+ }
23
+ const response = await fetch(`${baseUrl}/api/contact`, {
24
+ method: "POST",
25
+ headers,
26
+ body: JSON.stringify(body)
27
+ });
28
+ const data = await response.json();
29
+ if (!response.ok) {
30
+ return {
31
+ success: false,
32
+ error: data.error || `Request failed with status ${response.status}`,
33
+ details: data.details
34
+ };
35
+ }
36
+ return {
37
+ success: true,
38
+ id: data.id,
39
+ message: data.message
40
+ };
41
+ }
42
+
43
+ // src/client/client.ts
44
+ var DEFAULT_BASE_URL = "https://www.alisamadii.com";
45
+ function detectSourceUrl() {
46
+ if (typeof window !== "undefined") {
47
+ return window.location.origin;
48
+ }
49
+ if (process.env.NEXT_PUBLIC_SITE_URL) return process.env.NEXT_PUBLIC_SITE_URL;
50
+ if (process.env.VERCEL_PROJECT_PRODUCTION_URL)
51
+ return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`;
52
+ if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`;
53
+ return void 0;
54
+ }
55
+ var AgencyClient = class {
56
+ constructor(config) {
57
+ this.baseUrl = config?.baseUrl ?? DEFAULT_BASE_URL;
58
+ this.sourceUrl = config?.sourceUrl;
59
+ }
60
+ getSourceUrl() {
61
+ return this.sourceUrl ?? detectSourceUrl();
62
+ }
63
+ async contact(input) {
64
+ return sendContact(this.baseUrl, this.getSourceUrl(), input);
65
+ }
66
+ };
67
+ function createClient(config) {
68
+ return new AgencyClient(config);
69
+ }
70
+
71
+ exports.AgencyClient = AgencyClient;
72
+ exports.createClient = createClient;
73
+ //# sourceMappingURL=client.cjs.map
74
+ //# sourceMappingURL=client.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/contact.ts","../src/client/client.ts"],"names":[],"mappings":";;;AAEA,eAAsB,WAAA,CACpB,OAAA,EACA,SAAA,EACA,KAAA,EAC0B;AAC1B,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,cAAA,EAAgB;AAAA,GAClB;AAEA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,OAAA,CAAQ,QAAQ,IAAI,KAAA,CAAM,MAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,SAAS,KAAA,CAAM;AAAA,GACjB;AAEA,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,QAAA;AAAA,EACxB;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,YAAA,CAAA,EAAgB;AAAA,IACrD,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,CAAA,2BAAA,EAA8B,SAAS,MAAM,CAAA,CAAA;AAAA,MAClE,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,SAAS,IAAA,CAAK;AAAA,GAChB;AACF;;;AChDA,IAAM,gBAAA,GAAmB,4BAAA;AAEzB,SAAS,eAAA,GAAsC;AAC7C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,OAAO,QAAA,CAAS,MAAA;AAAA,EACzB;AAEA,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,oBAAA,EAAsB,OAAO,QAAQ,GAAA,CAAI,oBAAA;AACzD,EAAA,IAAI,QAAQ,GAAA,CAAI,6BAAA;AACd,IAAA,OAAO,CAAA,QAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,6BAA6B,CAAA,CAAA;AAC7D,EAAA,IAAI,QAAQ,GAAA,CAAI,UAAA,SAAmB,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAI,UAAU,CAAA,CAAA;AACpE,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,eAAN,MAAmB;AAAA,EAIxB,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AAClC,IAAA,IAAA,CAAK,YAAY,MAAA,EAAQ,SAAA;AAAA,EAC3B;AAAA,EAEQ,YAAA,GAAmC;AACzC,IAAA,OAAO,IAAA,CAAK,aAAa,eAAA,EAAgB;AAAA,EAC3C;AAAA,EAEA,MAAM,QAAQ,KAAA,EAA+C;AAC3D,IAAA,OAAO,YAAY,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,YAAA,IAAgB,KAAK,CAAA;AAAA,EAC7D;AACF;AAEO,SAAS,aAAa,MAAA,EAAqC;AAChE,EAAA,OAAO,IAAI,aAAa,MAAM,CAAA;AAChC","file":"client.cjs","sourcesContent":["import type { ContactInput, ContactResponse } from \"./types\";\n\nexport async function sendContact(\n baseUrl: string,\n sourceUrl: string | undefined,\n input: ContactInput\n): Promise<ContactResponse> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (input.origin) {\n headers[\"Origin\"] = input.origin;\n }\n\n const body: Record<string, unknown> = {\n name: input.name,\n email: input.email,\n subject: input.subject,\n message: input.message,\n };\n\n if (input.metadata) {\n body.metadata = input.metadata;\n }\n\n if (sourceUrl) {\n body.sourceUrl = sourceUrl;\n }\n\n const response = await fetch(`${baseUrl}/api/contact`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n return {\n success: false,\n error: data.error || `Request failed with status ${response.status}`,\n details: data.details,\n };\n }\n\n return {\n success: true,\n id: data.id,\n message: data.message,\n };\n}\n","import { sendContact } from \"./contact\";\nimport type { ClientConfig, ContactInput, ContactResponse } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://www.alisamadii.com\";\n\nfunction detectSourceUrl(): string | undefined {\n if (typeof window !== \"undefined\") {\n return window.location.origin;\n }\n // Server-side: check common env vars\n if (process.env.NEXT_PUBLIC_SITE_URL) return process.env.NEXT_PUBLIC_SITE_URL;\n if (process.env.VERCEL_PROJECT_PRODUCTION_URL)\n return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`;\n if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`;\n return undefined;\n}\n\nexport class AgencyClient {\n private baseUrl: string;\n private sourceUrl: string | undefined;\n\n constructor(config?: ClientConfig) {\n this.baseUrl = config?.baseUrl ?? DEFAULT_BASE_URL;\n this.sourceUrl = config?.sourceUrl;\n }\n\n private getSourceUrl(): string | undefined {\n return this.sourceUrl ?? detectSourceUrl();\n }\n\n async contact(input: ContactInput): Promise<ContactResponse> {\n return sendContact(this.baseUrl, this.getSourceUrl(), input);\n }\n}\n\nexport function createClient(config?: ClientConfig): AgencyClient {\n return new AgencyClient(config);\n}\n"]}
@@ -0,0 +1,33 @@
1
+ interface ClientConfig {
2
+ /** API base URL. Default: "https://www.alisamadii.com" */
3
+ baseUrl?: string;
4
+ /** Client site URL, sent as sourceUrl in requests */
5
+ sourceUrl?: string;
6
+ }
7
+ interface ContactInput {
8
+ name: string;
9
+ email: string;
10
+ subject: string;
11
+ message: string;
12
+ metadata?: Record<string, unknown>;
13
+ /** Pass from incoming request headers for CORS origin validation */
14
+ origin?: string | null;
15
+ }
16
+ interface ContactResponse {
17
+ success: boolean;
18
+ id?: string;
19
+ message?: string;
20
+ error?: string;
21
+ details?: string[];
22
+ }
23
+
24
+ declare class AgencyClient {
25
+ private baseUrl;
26
+ private sourceUrl;
27
+ constructor(config?: ClientConfig);
28
+ private getSourceUrl;
29
+ contact(input: ContactInput): Promise<ContactResponse>;
30
+ }
31
+ declare function createClient(config?: ClientConfig): AgencyClient;
32
+
33
+ export { AgencyClient, type ClientConfig, type ContactInput, type ContactResponse, createClient };
@@ -0,0 +1,33 @@
1
+ interface ClientConfig {
2
+ /** API base URL. Default: "https://www.alisamadii.com" */
3
+ baseUrl?: string;
4
+ /** Client site URL, sent as sourceUrl in requests */
5
+ sourceUrl?: string;
6
+ }
7
+ interface ContactInput {
8
+ name: string;
9
+ email: string;
10
+ subject: string;
11
+ message: string;
12
+ metadata?: Record<string, unknown>;
13
+ /** Pass from incoming request headers for CORS origin validation */
14
+ origin?: string | null;
15
+ }
16
+ interface ContactResponse {
17
+ success: boolean;
18
+ id?: string;
19
+ message?: string;
20
+ error?: string;
21
+ details?: string[];
22
+ }
23
+
24
+ declare class AgencyClient {
25
+ private baseUrl;
26
+ private sourceUrl;
27
+ constructor(config?: ClientConfig);
28
+ private getSourceUrl;
29
+ contact(input: ContactInput): Promise<ContactResponse>;
30
+ }
31
+ declare function createClient(config?: ClientConfig): AgencyClient;
32
+
33
+ export { AgencyClient, type ClientConfig, type ContactInput, type ContactResponse, createClient };
package/dist/client.js ADDED
@@ -0,0 +1,71 @@
1
+ // src/client/contact.ts
2
+ async function sendContact(baseUrl, sourceUrl, input) {
3
+ const headers = {
4
+ "Content-Type": "application/json"
5
+ };
6
+ if (input.origin) {
7
+ headers["Origin"] = input.origin;
8
+ }
9
+ const body = {
10
+ name: input.name,
11
+ email: input.email,
12
+ subject: input.subject,
13
+ message: input.message
14
+ };
15
+ if (input.metadata) {
16
+ body.metadata = input.metadata;
17
+ }
18
+ if (sourceUrl) {
19
+ body.sourceUrl = sourceUrl;
20
+ }
21
+ const response = await fetch(`${baseUrl}/api/contact`, {
22
+ method: "POST",
23
+ headers,
24
+ body: JSON.stringify(body)
25
+ });
26
+ const data = await response.json();
27
+ if (!response.ok) {
28
+ return {
29
+ success: false,
30
+ error: data.error || `Request failed with status ${response.status}`,
31
+ details: data.details
32
+ };
33
+ }
34
+ return {
35
+ success: true,
36
+ id: data.id,
37
+ message: data.message
38
+ };
39
+ }
40
+
41
+ // src/client/client.ts
42
+ var DEFAULT_BASE_URL = "https://www.alisamadii.com";
43
+ function detectSourceUrl() {
44
+ if (typeof window !== "undefined") {
45
+ return window.location.origin;
46
+ }
47
+ if (process.env.NEXT_PUBLIC_SITE_URL) return process.env.NEXT_PUBLIC_SITE_URL;
48
+ if (process.env.VERCEL_PROJECT_PRODUCTION_URL)
49
+ return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`;
50
+ if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`;
51
+ return void 0;
52
+ }
53
+ var AgencyClient = class {
54
+ constructor(config) {
55
+ this.baseUrl = config?.baseUrl ?? DEFAULT_BASE_URL;
56
+ this.sourceUrl = config?.sourceUrl;
57
+ }
58
+ getSourceUrl() {
59
+ return this.sourceUrl ?? detectSourceUrl();
60
+ }
61
+ async contact(input) {
62
+ return sendContact(this.baseUrl, this.getSourceUrl(), input);
63
+ }
64
+ };
65
+ function createClient(config) {
66
+ return new AgencyClient(config);
67
+ }
68
+
69
+ export { AgencyClient, createClient };
70
+ //# sourceMappingURL=client.js.map
71
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/contact.ts","../src/client/client.ts"],"names":[],"mappings":";AAEA,eAAsB,WAAA,CACpB,OAAA,EACA,SAAA,EACA,KAAA,EAC0B;AAC1B,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,cAAA,EAAgB;AAAA,GAClB;AAEA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,OAAA,CAAQ,QAAQ,IAAI,KAAA,CAAM,MAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,SAAS,KAAA,CAAM;AAAA,GACjB;AAEA,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,QAAA;AAAA,EACxB;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,YAAA,CAAA,EAAgB;AAAA,IACrD,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,CAAA,2BAAA,EAA8B,SAAS,MAAM,CAAA,CAAA;AAAA,MAClE,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,SAAS,IAAA,CAAK;AAAA,GAChB;AACF;;;AChDA,IAAM,gBAAA,GAAmB,4BAAA;AAEzB,SAAS,eAAA,GAAsC;AAC7C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,OAAO,QAAA,CAAS,MAAA;AAAA,EACzB;AAEA,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,oBAAA,EAAsB,OAAO,QAAQ,GAAA,CAAI,oBAAA;AACzD,EAAA,IAAI,QAAQ,GAAA,CAAI,6BAAA;AACd,IAAA,OAAO,CAAA,QAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,6BAA6B,CAAA,CAAA;AAC7D,EAAA,IAAI,QAAQ,GAAA,CAAI,UAAA,SAAmB,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAI,UAAU,CAAA,CAAA;AACpE,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,eAAN,MAAmB;AAAA,EAIxB,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AAClC,IAAA,IAAA,CAAK,YAAY,MAAA,EAAQ,SAAA;AAAA,EAC3B;AAAA,EAEQ,YAAA,GAAmC;AACzC,IAAA,OAAO,IAAA,CAAK,aAAa,eAAA,EAAgB;AAAA,EAC3C;AAAA,EAEA,MAAM,QAAQ,KAAA,EAA+C;AAC3D,IAAA,OAAO,YAAY,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,YAAA,IAAgB,KAAK,CAAA;AAAA,EAC7D;AACF;AAEO,SAAS,aAAa,MAAA,EAAqC;AAChE,EAAA,OAAO,IAAI,aAAa,MAAM,CAAA;AAChC","file":"client.js","sourcesContent":["import type { ContactInput, ContactResponse } from \"./types\";\n\nexport async function sendContact(\n baseUrl: string,\n sourceUrl: string | undefined,\n input: ContactInput\n): Promise<ContactResponse> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (input.origin) {\n headers[\"Origin\"] = input.origin;\n }\n\n const body: Record<string, unknown> = {\n name: input.name,\n email: input.email,\n subject: input.subject,\n message: input.message,\n };\n\n if (input.metadata) {\n body.metadata = input.metadata;\n }\n\n if (sourceUrl) {\n body.sourceUrl = sourceUrl;\n }\n\n const response = await fetch(`${baseUrl}/api/contact`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n return {\n success: false,\n error: data.error || `Request failed with status ${response.status}`,\n details: data.details,\n };\n }\n\n return {\n success: true,\n id: data.id,\n message: data.message,\n };\n}\n","import { sendContact } from \"./contact\";\nimport type { ClientConfig, ContactInput, ContactResponse } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://www.alisamadii.com\";\n\nfunction detectSourceUrl(): string | undefined {\n if (typeof window !== \"undefined\") {\n return window.location.origin;\n }\n // Server-side: check common env vars\n if (process.env.NEXT_PUBLIC_SITE_URL) return process.env.NEXT_PUBLIC_SITE_URL;\n if (process.env.VERCEL_PROJECT_PRODUCTION_URL)\n return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`;\n if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`;\n return undefined;\n}\n\nexport class AgencyClient {\n private baseUrl: string;\n private sourceUrl: string | undefined;\n\n constructor(config?: ClientConfig) {\n this.baseUrl = config?.baseUrl ?? DEFAULT_BASE_URL;\n this.sourceUrl = config?.sourceUrl;\n }\n\n private getSourceUrl(): string | undefined {\n return this.sourceUrl ?? detectSourceUrl();\n }\n\n async contact(input: ContactInput): Promise<ContactResponse> {\n return sendContact(this.baseUrl, this.getSourceUrl(), input);\n }\n}\n\nexport function createClient(config?: ClientConfig): AgencyClient {\n return new AgencyClient(config);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alisamadiillc/devtools",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Visual feedback devtools for client websites — select elements, edit live, capture screenshots, copy structured feedback",
5
5
  "private": false,
6
6
  "type": "module",
@@ -17,6 +17,16 @@
17
17
  "types": "./dist/index.d.cts",
18
18
  "default": "./dist/index.cjs"
19
19
  }
20
+ },
21
+ "./client": {
22
+ "import": {
23
+ "types": "./dist/client.d.ts",
24
+ "default": "./dist/client.js"
25
+ },
26
+ "require": {
27
+ "types": "./dist/client.d.cts",
28
+ "default": "./dist/client.cjs"
29
+ }
20
30
  }
21
31
  },
22
32
  "files": [