@profplum700/etsy-nextjs 2.3.1 → 2.3.5
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 +63 -2
- package/dist/client.cjs +19 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.ts +16 -0
- package/dist/client.esm.js +16 -0
- package/dist/client.esm.js.map +1 -0
- package/dist/server.cjs +191 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.ts +36 -0
- package/dist/server.esm.js +186 -0
- package/dist/server.esm.js.map +1 -0
- package/package.json +20 -3
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,
|
package/dist/client.cjs
ADDED
|
@@ -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;;;;;"}
|
package/dist/client.d.ts
ADDED
|
@@ -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;;;;"}
|
package/dist/server.cjs
ADDED
|
@@ -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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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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.
|
|
3
|
+
"version": "2.3.5",
|
|
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": {
|
|
@@ -56,7 +73,7 @@
|
|
|
56
73
|
"rollup-plugin-dts": "^6.1.1",
|
|
57
74
|
"ts-jest": "^29.4.0",
|
|
58
75
|
"typescript": "^5.5.3",
|
|
59
|
-
"@profplum700/etsy-v3-api-client": "2.3.
|
|
76
|
+
"@profplum700/etsy-v3-api-client": "2.3.5"
|
|
60
77
|
},
|
|
61
78
|
"publishConfig": {
|
|
62
79
|
"access": "public"
|