@profplum700/etsy-nextjs 2.3.1 → 2.3.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.
package/README.md CHANGED
@@ -17,6 +17,54 @@ npm install @profplum700/etsy-nextjs @profplum700/etsy-v3-api-client
17
17
  - Cookie-based token storage
18
18
  - Edge Runtime compatibility
19
19
  - TypeScript support
20
+ - Optimized bundle sizes with tree-shakeable exports
21
+
22
+ ## Package Structure
23
+
24
+ This package provides three separate entry points to ensure optimal bundle sizes and prevent build errors:
25
+
26
+ ### 📦 Entry Points
27
+
28
+ 1. **`@profplum700/etsy-nextjs`** (Main Entry)
29
+ - Default export for backward compatibility
30
+ - Contains both client and server code
31
+ - Use when you need both client and server functionality
32
+
33
+ 2. **`@profplum700/etsy-nextjs/server`** (Server-Only)
34
+ - Server-side code with **zero React dependencies**
35
+ - Optimized for Next.js Server Components, API Routes, and Server Actions
36
+ - Prevents "createContext is not a function" build errors
37
+ - Exports: `configureEtsyServerClient`, `getEtsyServerClient`, `createEtsyServerClient`, `createEtsyApiRoute`
38
+
39
+ 3. **`@profplum700/etsy-nextjs/client`** (Client-Only)
40
+ - Client-side React code
41
+ - Optimized for browser environments
42
+ - Exports: `EtsyNextClientProvider`, `useEtsyNextClient`
43
+
44
+ ### 🎯 Why Separate Entry Points?
45
+
46
+ The separation into `/server` and `/client` subpaths solves a critical packaging issue where React Context code (createContext, useContext) was being bundled with server-side exports. This caused build errors when importing server functions in Next.js API routes or Server Components.
47
+
48
+ **Benefits:**
49
+ - ✅ **Tree-shakeable**: Only bundle what you need
50
+ - ✅ **Zero React overhead**: Server bundles have no React dependencies
51
+ - ✅ **Build stability**: No "createContext is not a function" errors
52
+ - ✅ **Smaller bundles**: Optimized for both client and server environments
53
+ - ✅ **Type-safe**: Full TypeScript support for all entry points
54
+
55
+ ### 💡 Migration Guide
56
+
57
+ **Before (may cause build errors):**
58
+ ```typescript
59
+ import { getEtsyServerClient } from '@profplum700/etsy-nextjs';
60
+ ```
61
+
62
+ **After (recommended):**
63
+ ```typescript
64
+ import { getEtsyServerClient } from '@profplum700/etsy-nextjs/server';
65
+ ```
66
+
67
+ **Note:** The main entry point still works for backward compatibility, but using the specific `/server` or `/client` imports is recommended for optimal bundle sizes and build stability.
20
68
 
21
69
  ## Quick Start
22
70
 
@@ -57,7 +105,7 @@ export default async function ShopPage({ params }: { params: { shopId: string }
57
105
 
58
106
  ```typescript
59
107
  // app/api/etsy/[...path]/route.ts
60
- import { createEtsyApiRoute } from '@profplum700/etsy-nextjs';
108
+ import { createEtsyApiRoute } from '@profplum700/etsy-nextjs/server';
61
109
 
62
110
  export const { GET, POST, PUT, DELETE } = createEtsyApiRoute({
63
111
  apiKey: process.env.ETSY_API_KEY!,
@@ -77,7 +125,7 @@ export const { GET, POST, PUT, DELETE } = createEtsyApiRoute({
77
125
  ```typescript
78
126
  'use client';
79
127
 
80
- import { EtsyNextClientProvider, useEtsyNextClient } from '@profplum700/etsy-nextjs';
128
+ import { EtsyNextClientProvider, useEtsyNextClient } from '@profplum700/etsy-nextjs/client';
81
129
  import { EtsyClient } from '@profplum700/etsy-v3-api-client';
82
130
 
83
131
  const client = new EtsyClient({
@@ -308,6 +356,19 @@ ETSY_SCOPES=listings_r,listings_w,shops_r
308
356
  All functions and components are fully typed with TypeScript.
309
357
 
310
358
  ```typescript
359
+ // Server types
360
+ import type {
361
+ EtsyServerClientConfig,
362
+ EtsyApiRouteConfig,
363
+ } from '@profplum700/etsy-nextjs/server';
364
+
365
+ // Client types (if needed)
366
+ import type {
367
+ EtsyNextClientProvider,
368
+ useEtsyNextClient,
369
+ } from '@profplum700/etsy-nextjs/client';
370
+
371
+ // Or use the main entry for all types
311
372
  import type {
312
373
  EtsyServerClientConfig,
313
374
  EtsyApiRouteConfig,
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ const EtsyNextClientContext = React.createContext(undefined);
6
+ function EtsyNextClientProvider({ client, apiEndpoint, children }) {
7
+ return (React.createElement(EtsyNextClientContext.Provider, { value: { client, apiEndpoint } }, children));
8
+ }
9
+ function useEtsyNextClient() {
10
+ const context = React.useContext(EtsyNextClientContext);
11
+ if (!context) {
12
+ throw new Error('useEtsyNextClient must be used within an EtsyNextClientProvider');
13
+ }
14
+ return context;
15
+ }
16
+
17
+ exports.EtsyNextClientProvider = EtsyNextClientProvider;
18
+ exports.useEtsyNextClient = useEtsyNextClient;
19
+ //# sourceMappingURL=client.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.cjs","sources":["../../src/client/provider.tsx"],"sourcesContent":[null],"names":["createContext","useContext"],"mappings":";;;;AAQA,MAAM,qBAAqB,GAAGA,mBAAa,CAAyC,SAAS,CAAC;AAYxF,SAAU,sBAAsB,CAAC,EACrC,MAAM,EACN,WAAW,EACX,QAAQ,EACoB,EAAA;AAC5B,IAAA,QACE,KAAA,CAAA,aAAA,CAAC,qBAAqB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IAC3D,QAAQ,CACsB;AAErC;SAEgB,iBAAiB,GAAA;AAC/B,IAAA,MAAM,OAAO,GAAGC,gBAAU,CAAC,qBAAqB,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC;IACpF;AACA,IAAA,OAAO,OAAO;AAChB;;;;;"}
@@ -0,0 +1,16 @@
1
+ import React, { ReactNode } from 'react';
2
+ import { EtsyClient } from '@profplum700/etsy-v3-api-client';
3
+
4
+ interface EtsyNextClientContextValue {
5
+ client: EtsyClient;
6
+ apiEndpoint?: string;
7
+ }
8
+ interface EtsyNextClientProviderProps {
9
+ client: EtsyClient;
10
+ apiEndpoint?: string;
11
+ children: ReactNode;
12
+ }
13
+ declare function EtsyNextClientProvider({ client, apiEndpoint, children }: EtsyNextClientProviderProps): React.JSX.Element;
14
+ declare function useEtsyNextClient(): EtsyNextClientContextValue;
15
+
16
+ export { EtsyNextClientProvider, useEtsyNextClient };
@@ -0,0 +1,16 @@
1
+ import React, { createContext, useContext } from 'react';
2
+
3
+ const EtsyNextClientContext = createContext(undefined);
4
+ function EtsyNextClientProvider({ client, apiEndpoint, children }) {
5
+ return (React.createElement(EtsyNextClientContext.Provider, { value: { client, apiEndpoint } }, children));
6
+ }
7
+ function useEtsyNextClient() {
8
+ const context = useContext(EtsyNextClientContext);
9
+ if (!context) {
10
+ throw new Error('useEtsyNextClient must be used within an EtsyNextClientProvider');
11
+ }
12
+ return context;
13
+ }
14
+
15
+ export { EtsyNextClientProvider, useEtsyNextClient };
16
+ //# sourceMappingURL=client.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.esm.js","sources":["../../src/client/provider.tsx"],"sourcesContent":[null],"names":[],"mappings":";;AAQA,MAAM,qBAAqB,GAAG,aAAa,CAAyC,SAAS,CAAC;AAYxF,SAAU,sBAAsB,CAAC,EACrC,MAAM,EACN,WAAW,EACX,QAAQ,EACoB,EAAA;AAC5B,IAAA,QACE,KAAA,CAAA,aAAA,CAAC,qBAAqB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IAC3D,QAAQ,CACsB;AAErC;SAEgB,iBAAiB,GAAA;AAC/B,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,qBAAqB,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC;IACpF;AACA,IAAA,OAAO,OAAO;AAChB;;;;"}
@@ -0,0 +1,191 @@
1
+ 'use strict';
2
+
3
+ var etsyV3ApiClient = require('@profplum700/etsy-v3-api-client');
4
+ var headers = require('next/headers');
5
+ var server = require('next/server');
6
+
7
+ let serverClientInstance = null;
8
+ let serverClientConfig = null;
9
+ function configureEtsyServerClient(config) {
10
+ serverClientConfig = config;
11
+ }
12
+ async function getEtsyServerClient() {
13
+ if (!serverClientConfig) {
14
+ throw new Error('Etsy server client not configured. Call configureEtsyServerClient() first.');
15
+ }
16
+ if (!serverClientInstance) {
17
+ const { apiKey } = serverClientConfig;
18
+ const cookieStore = await headers.cookies();
19
+ const cookieName = serverClientConfig.cookieName || 'etsy-tokens';
20
+ const tokenData = cookieStore.get(cookieName);
21
+ if (!tokenData) {
22
+ throw new Error('No authentication tokens found in cookies');
23
+ }
24
+ let tokens;
25
+ try {
26
+ tokens = JSON.parse(tokenData.value);
27
+ }
28
+ catch {
29
+ throw new Error('Invalid token data in cookies');
30
+ }
31
+ const refreshSave = async (accessToken, refreshToken, expiresAt) => {
32
+ const cookieStore = await headers.cookies();
33
+ const cookieName = serverClientConfig?.cookieName || 'etsy-tokens';
34
+ cookieStore.set(cookieName, JSON.stringify({
35
+ accessToken,
36
+ refreshToken,
37
+ expiresAt: expiresAt.toISOString(),
38
+ }), {
39
+ httpOnly: true,
40
+ secure: process.env.NODE_ENV === 'production',
41
+ sameSite: 'lax',
42
+ maxAge: 60 * 60 * 24 * 90,
43
+ });
44
+ };
45
+ serverClientInstance = new etsyV3ApiClient.EtsyClient({
46
+ keystring: apiKey,
47
+ accessToken: tokens.accessToken,
48
+ refreshToken: tokens.refreshToken,
49
+ expiresAt: new Date(tokens.expiresAt),
50
+ refreshSave,
51
+ });
52
+ }
53
+ return serverClientInstance;
54
+ }
55
+ async function createEtsyServerClient(config) {
56
+ const { apiKey, cookieName } = config;
57
+ const cookieStore = await headers.cookies();
58
+ const tokenCookieName = cookieName || 'etsy-tokens';
59
+ const tokenData = cookieStore.get(tokenCookieName);
60
+ if (!tokenData) {
61
+ throw new Error('No authentication tokens found in cookies');
62
+ }
63
+ let tokens;
64
+ try {
65
+ tokens = JSON.parse(tokenData.value);
66
+ }
67
+ catch {
68
+ throw new Error('Invalid token data in cookies');
69
+ }
70
+ const refreshSave = async (accessToken, refreshToken, expiresAt) => {
71
+ const cookieStore = await headers.cookies();
72
+ cookieStore.set(tokenCookieName, JSON.stringify({
73
+ accessToken,
74
+ refreshToken,
75
+ expiresAt: expiresAt.toISOString(),
76
+ }), {
77
+ httpOnly: true,
78
+ secure: process.env.NODE_ENV === 'production',
79
+ sameSite: 'lax',
80
+ maxAge: 60 * 60 * 24 * 90,
81
+ });
82
+ };
83
+ return new etsyV3ApiClient.EtsyClient({
84
+ keystring: apiKey,
85
+ accessToken: tokens.accessToken,
86
+ refreshToken: tokens.refreshToken,
87
+ expiresAt: new Date(tokens.expiresAt),
88
+ refreshSave,
89
+ });
90
+ }
91
+
92
+ const rateLimitStore = new Map();
93
+ function createEtsyApiRoute(config) {
94
+ const { rateLimit, cache } = config;
95
+ function checkRateLimit(identifier) {
96
+ if (!rateLimit)
97
+ return true;
98
+ const now = Date.now();
99
+ const entry = rateLimitStore.get(identifier);
100
+ if (!entry || now > entry.resetTime) {
101
+ rateLimitStore.set(identifier, {
102
+ count: 1,
103
+ resetTime: now + rateLimit.window,
104
+ });
105
+ return true;
106
+ }
107
+ if (entry.count >= rateLimit.requests) {
108
+ return false;
109
+ }
110
+ entry.count++;
111
+ return true;
112
+ }
113
+ async function handleRequest(request, handler) {
114
+ try {
115
+ if (rateLimit) {
116
+ const identifier = request.headers.get('x-forwarded-for') || 'anonymous';
117
+ if (!checkRateLimit(identifier)) {
118
+ return server.NextResponse.json({ error: 'Rate limit exceeded' }, { status: 429 });
119
+ }
120
+ }
121
+ const client = await getEtsyServerClient();
122
+ const result = await handler(client, request);
123
+ const response = server.NextResponse.json(result);
124
+ if (cache?.enabled) {
125
+ response.headers.set('Cache-Control', `public, s-maxage=${cache.ttl}, stale-while-revalidate`);
126
+ }
127
+ return response;
128
+ }
129
+ catch (error) {
130
+ console.error('Etsy API route error:', error);
131
+ if (error instanceof Error) {
132
+ return server.NextResponse.json({ error: error.message }, { status: 500 });
133
+ }
134
+ return server.NextResponse.json({ error: 'Internal server error' }, { status: 500 });
135
+ }
136
+ }
137
+ return {
138
+ GET: async (request) => {
139
+ return handleRequest(request, async (_client) => {
140
+ const { searchParams } = new URL(request.url);
141
+ const endpoint = searchParams.get('endpoint');
142
+ if (!endpoint) {
143
+ throw new Error('Endpoint parameter is required');
144
+ }
145
+ const params = {};
146
+ searchParams.forEach((value, key) => {
147
+ if (key !== 'endpoint') {
148
+ params[key] = value;
149
+ }
150
+ });
151
+ return { message: 'GET endpoint', endpoint, params };
152
+ });
153
+ },
154
+ POST: async (request) => {
155
+ return handleRequest(request, async (_client) => {
156
+ const body = await request.json();
157
+ const { endpoint, data } = body;
158
+ if (!endpoint) {
159
+ throw new Error('Endpoint parameter is required');
160
+ }
161
+ return { message: 'POST endpoint', endpoint, data };
162
+ });
163
+ },
164
+ PUT: async (request) => {
165
+ return handleRequest(request, async (_client) => {
166
+ const body = await request.json();
167
+ const { endpoint, data } = body;
168
+ if (!endpoint) {
169
+ throw new Error('Endpoint parameter is required');
170
+ }
171
+ return { message: 'PUT endpoint', endpoint, data };
172
+ });
173
+ },
174
+ DELETE: async (request) => {
175
+ return handleRequest(request, async (_client) => {
176
+ const { searchParams } = new URL(request.url);
177
+ const endpoint = searchParams.get('endpoint');
178
+ if (!endpoint) {
179
+ throw new Error('Endpoint parameter is required');
180
+ }
181
+ return { message: 'DELETE endpoint', endpoint };
182
+ });
183
+ },
184
+ };
185
+ }
186
+
187
+ exports.configureEtsyServerClient = configureEtsyServerClient;
188
+ exports.createEtsyApiRoute = createEtsyApiRoute;
189
+ exports.createEtsyServerClient = createEtsyServerClient;
190
+ exports.getEtsyServerClient = getEtsyServerClient;
191
+ //# sourceMappingURL=server.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.cjs","sources":["../../src/server/client.ts","../../src/server/route.ts"],"sourcesContent":[null,null],"names":["cookies","EtsyClient","NextResponse"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { EtsyClient } from '@profplum700/etsy-v3-api-client';
2
+ import { NextRequest, NextResponse } from 'next/server';
3
+
4
+ interface EtsyServerClientConfig {
5
+ apiKey: string;
6
+ redirectUri?: string;
7
+ scopes?: string[];
8
+ cookieName?: string;
9
+ encryptionKey?: string;
10
+ }
11
+ declare function configureEtsyServerClient(config: EtsyServerClientConfig): void;
12
+ declare function getEtsyServerClient(): Promise<EtsyClient>;
13
+ declare function createEtsyServerClient(config: EtsyServerClientConfig): Promise<EtsyClient>;
14
+
15
+ interface EtsyApiRouteConfig {
16
+ apiKey: string;
17
+ redirectUri?: string;
18
+ scopes?: string[];
19
+ rateLimit?: {
20
+ requests: number;
21
+ window: number;
22
+ };
23
+ cache?: {
24
+ enabled: boolean;
25
+ ttl: number;
26
+ };
27
+ }
28
+ declare function createEtsyApiRoute(config: EtsyApiRouteConfig): {
29
+ GET: (request: NextRequest) => Promise<NextResponse>;
30
+ POST: (request: NextRequest) => Promise<NextResponse>;
31
+ PUT: (request: NextRequest) => Promise<NextResponse>;
32
+ DELETE: (request: NextRequest) => Promise<NextResponse>;
33
+ };
34
+
35
+ export { configureEtsyServerClient, createEtsyApiRoute, createEtsyServerClient, getEtsyServerClient };
36
+ export type { EtsyApiRouteConfig, EtsyServerClientConfig };
@@ -0,0 +1,186 @@
1
+ import { EtsyClient } from '@profplum700/etsy-v3-api-client';
2
+ import { cookies } from 'next/headers';
3
+ import { NextResponse } from 'next/server';
4
+
5
+ let serverClientInstance = null;
6
+ let serverClientConfig = null;
7
+ function configureEtsyServerClient(config) {
8
+ serverClientConfig = config;
9
+ }
10
+ async function getEtsyServerClient() {
11
+ if (!serverClientConfig) {
12
+ throw new Error('Etsy server client not configured. Call configureEtsyServerClient() first.');
13
+ }
14
+ if (!serverClientInstance) {
15
+ const { apiKey } = serverClientConfig;
16
+ const cookieStore = await cookies();
17
+ const cookieName = serverClientConfig.cookieName || 'etsy-tokens';
18
+ const tokenData = cookieStore.get(cookieName);
19
+ if (!tokenData) {
20
+ throw new Error('No authentication tokens found in cookies');
21
+ }
22
+ let tokens;
23
+ try {
24
+ tokens = JSON.parse(tokenData.value);
25
+ }
26
+ catch {
27
+ throw new Error('Invalid token data in cookies');
28
+ }
29
+ const refreshSave = async (accessToken, refreshToken, expiresAt) => {
30
+ const cookieStore = await cookies();
31
+ const cookieName = serverClientConfig?.cookieName || 'etsy-tokens';
32
+ cookieStore.set(cookieName, JSON.stringify({
33
+ accessToken,
34
+ refreshToken,
35
+ expiresAt: expiresAt.toISOString(),
36
+ }), {
37
+ httpOnly: true,
38
+ secure: process.env.NODE_ENV === 'production',
39
+ sameSite: 'lax',
40
+ maxAge: 60 * 60 * 24 * 90,
41
+ });
42
+ };
43
+ serverClientInstance = new EtsyClient({
44
+ keystring: apiKey,
45
+ accessToken: tokens.accessToken,
46
+ refreshToken: tokens.refreshToken,
47
+ expiresAt: new Date(tokens.expiresAt),
48
+ refreshSave,
49
+ });
50
+ }
51
+ return serverClientInstance;
52
+ }
53
+ async function createEtsyServerClient(config) {
54
+ const { apiKey, cookieName } = config;
55
+ const cookieStore = await cookies();
56
+ const tokenCookieName = cookieName || 'etsy-tokens';
57
+ const tokenData = cookieStore.get(tokenCookieName);
58
+ if (!tokenData) {
59
+ throw new Error('No authentication tokens found in cookies');
60
+ }
61
+ let tokens;
62
+ try {
63
+ tokens = JSON.parse(tokenData.value);
64
+ }
65
+ catch {
66
+ throw new Error('Invalid token data in cookies');
67
+ }
68
+ const refreshSave = async (accessToken, refreshToken, expiresAt) => {
69
+ const cookieStore = await cookies();
70
+ cookieStore.set(tokenCookieName, JSON.stringify({
71
+ accessToken,
72
+ refreshToken,
73
+ expiresAt: expiresAt.toISOString(),
74
+ }), {
75
+ httpOnly: true,
76
+ secure: process.env.NODE_ENV === 'production',
77
+ sameSite: 'lax',
78
+ maxAge: 60 * 60 * 24 * 90,
79
+ });
80
+ };
81
+ return new EtsyClient({
82
+ keystring: apiKey,
83
+ accessToken: tokens.accessToken,
84
+ refreshToken: tokens.refreshToken,
85
+ expiresAt: new Date(tokens.expiresAt),
86
+ refreshSave,
87
+ });
88
+ }
89
+
90
+ const rateLimitStore = new Map();
91
+ function createEtsyApiRoute(config) {
92
+ const { rateLimit, cache } = config;
93
+ function checkRateLimit(identifier) {
94
+ if (!rateLimit)
95
+ return true;
96
+ const now = Date.now();
97
+ const entry = rateLimitStore.get(identifier);
98
+ if (!entry || now > entry.resetTime) {
99
+ rateLimitStore.set(identifier, {
100
+ count: 1,
101
+ resetTime: now + rateLimit.window,
102
+ });
103
+ return true;
104
+ }
105
+ if (entry.count >= rateLimit.requests) {
106
+ return false;
107
+ }
108
+ entry.count++;
109
+ return true;
110
+ }
111
+ async function handleRequest(request, handler) {
112
+ try {
113
+ if (rateLimit) {
114
+ const identifier = request.headers.get('x-forwarded-for') || 'anonymous';
115
+ if (!checkRateLimit(identifier)) {
116
+ return NextResponse.json({ error: 'Rate limit exceeded' }, { status: 429 });
117
+ }
118
+ }
119
+ const client = await getEtsyServerClient();
120
+ const result = await handler(client, request);
121
+ const response = NextResponse.json(result);
122
+ if (cache?.enabled) {
123
+ response.headers.set('Cache-Control', `public, s-maxage=${cache.ttl}, stale-while-revalidate`);
124
+ }
125
+ return response;
126
+ }
127
+ catch (error) {
128
+ console.error('Etsy API route error:', error);
129
+ if (error instanceof Error) {
130
+ return NextResponse.json({ error: error.message }, { status: 500 });
131
+ }
132
+ return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
133
+ }
134
+ }
135
+ return {
136
+ GET: async (request) => {
137
+ return handleRequest(request, async (_client) => {
138
+ const { searchParams } = new URL(request.url);
139
+ const endpoint = searchParams.get('endpoint');
140
+ if (!endpoint) {
141
+ throw new Error('Endpoint parameter is required');
142
+ }
143
+ const params = {};
144
+ searchParams.forEach((value, key) => {
145
+ if (key !== 'endpoint') {
146
+ params[key] = value;
147
+ }
148
+ });
149
+ return { message: 'GET endpoint', endpoint, params };
150
+ });
151
+ },
152
+ POST: async (request) => {
153
+ return handleRequest(request, async (_client) => {
154
+ const body = await request.json();
155
+ const { endpoint, data } = body;
156
+ if (!endpoint) {
157
+ throw new Error('Endpoint parameter is required');
158
+ }
159
+ return { message: 'POST endpoint', endpoint, data };
160
+ });
161
+ },
162
+ PUT: async (request) => {
163
+ return handleRequest(request, async (_client) => {
164
+ const body = await request.json();
165
+ const { endpoint, data } = body;
166
+ if (!endpoint) {
167
+ throw new Error('Endpoint parameter is required');
168
+ }
169
+ return { message: 'PUT endpoint', endpoint, data };
170
+ });
171
+ },
172
+ DELETE: async (request) => {
173
+ return handleRequest(request, async (_client) => {
174
+ const { searchParams } = new URL(request.url);
175
+ const endpoint = searchParams.get('endpoint');
176
+ if (!endpoint) {
177
+ throw new Error('Endpoint parameter is required');
178
+ }
179
+ return { message: 'DELETE endpoint', endpoint };
180
+ });
181
+ },
182
+ };
183
+ }
184
+
185
+ export { configureEtsyServerClient, createEtsyApiRoute, createEtsyServerClient, getEtsyServerClient };
186
+ //# sourceMappingURL=server.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.esm.js","sources":["../../src/server/client.ts","../../src/server/route.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,28 @@
1
1
  {
2
2
  "name": "@profplum700/etsy-nextjs",
3
- "version": "2.3.1",
3
+ "version": "2.3.2",
4
4
  "type": "module",
5
5
  "description": "Next.js integration for Etsy v3 API client",
6
6
  "main": "dist/index.cjs",
7
7
  "module": "dist/index.esm.js",
8
8
  "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.esm.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./client": {
16
+ "types": "./dist/client.d.ts",
17
+ "import": "./dist/client.esm.js",
18
+ "require": "./dist/client.cjs"
19
+ },
20
+ "./server": {
21
+ "types": "./dist/server.d.ts",
22
+ "import": "./dist/server.esm.js",
23
+ "require": "./dist/server.cjs"
24
+ }
25
+ },
9
26
  "files": [
10
27
  "dist/**/*",
11
28
  "README.md"
@@ -39,7 +56,7 @@
39
56
  },
40
57
  "peerDependencies": {
41
58
  "@profplum700/etsy-v3-api-client": "^2.0.0",
42
- "next": "^14.0.0 || ^15.0.0",
59
+ "next": "^14.0.0 || ^15.0.0 || ^16.0.0",
43
60
  "react": "^18.0.0 || ^19.0.0"
44
61
  },
45
62
  "devDependencies": {