@ima-jin/config 0.7.0 → 0.8.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/{index.mjs → index.cjs} +252 -16
- package/dist/index.d.cts +343 -0
- package/dist/index.d.ts +343 -0
- package/dist/index.js +97 -163
- package/next-headers.cjs +57 -0
- package/package.json +17 -7
- package/src/base-path.ts +4 -4
- package/src/cors.ts +7 -0
- package/src/handles.ts +2 -2
- package/src/index.ts +5 -1
- package/src/rate-limit.ts +54 -0
- package/src/security-headers.ts +45 -0
- package/src/services.ts +47 -4
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* CSP host-source list corresponding to ORIGIN_PATTERN (prod).
|
|
5
|
+
* Used by security-headers.ts to build frame-ancestors directives.
|
|
6
|
+
* If the allowed-origin set changes, update ORIGIN_PATTERN and this constant together.
|
|
7
|
+
*/
|
|
8
|
+
declare const ALLOWED_FRAME_ORIGINS = "https://*.imajin.ai https://imajin.ai";
|
|
9
|
+
declare function isAllowedOrigin(origin: string | null): boolean;
|
|
10
|
+
declare function corsHeaders(request: NextRequest): Record<string, string>;
|
|
11
|
+
declare function corsOptions(request: NextRequest): NextResponse;
|
|
12
|
+
declare function withCors(response: NextResponse, request: NextRequest): NextResponse;
|
|
13
|
+
declare function validateOrigin(request: NextRequest): boolean;
|
|
14
|
+
|
|
15
|
+
type HeaderEntry = {
|
|
16
|
+
key: string;
|
|
17
|
+
value: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Tier 1 — hard deny framing.
|
|
21
|
+
* Use on credential and auth-sensitive pages that must never be embedded.
|
|
22
|
+
*/
|
|
23
|
+
declare function tier1Headers(): HeaderEntry[];
|
|
24
|
+
/**
|
|
25
|
+
* Tier 2 — allow framing by Imajin origins only.
|
|
26
|
+
* Use on routes embedded by the auth hub (service dashboards, document viewer, surveys).
|
|
27
|
+
* Does not include X-Frame-Options — it cannot express an allow-list, and SAMEORIGIN
|
|
28
|
+
* would break cross-subdomain framing. CSP frame-ancestors does the work here.
|
|
29
|
+
*/
|
|
30
|
+
declare function tier2Headers(): HeaderEntry[];
|
|
31
|
+
/**
|
|
32
|
+
* Tier 3 — baseline hardening.
|
|
33
|
+
* Safe to apply on every route in every app.
|
|
34
|
+
*/
|
|
35
|
+
declare function tier3Headers(): HeaderEntry[];
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Canonical service manifest — single source of truth for all Imajin services.
|
|
39
|
+
*
|
|
40
|
+
* Consumers: registry specs, Caddy config, pm2 ecosystem, docs sync, shared nav.
|
|
41
|
+
*/
|
|
42
|
+
type ServiceTier = "core" | "imajin";
|
|
43
|
+
type ServiceVisibility = "public" | "authenticated" | "creator" | "internal";
|
|
44
|
+
type ServiceCategory = "kernel" | "core" | "creator" | "developer" | "infrastructure" | "meta";
|
|
45
|
+
interface ServiceDefinition {
|
|
46
|
+
/** Subdomain / app directory name */
|
|
47
|
+
name: string;
|
|
48
|
+
/** Human-readable label */
|
|
49
|
+
label: string;
|
|
50
|
+
/** Description */
|
|
51
|
+
description: string;
|
|
52
|
+
/** Emoji icon */
|
|
53
|
+
icon: string;
|
|
54
|
+
/** Dev port (3xxx) */
|
|
55
|
+
devPort: number;
|
|
56
|
+
/** Prod port (7xxx) */
|
|
57
|
+
prodPort: number;
|
|
58
|
+
/** Postgres schema name (null if no DB) */
|
|
59
|
+
schema: string | null;
|
|
60
|
+
/** Deployment tier */
|
|
61
|
+
tier: ServiceTier;
|
|
62
|
+
/** Visibility in launcher / nav */
|
|
63
|
+
visibility: ServiceVisibility;
|
|
64
|
+
/** Grouping category */
|
|
65
|
+
category: ServiceCategory;
|
|
66
|
+
/** External URL override (bypasses subdomain convention) */
|
|
67
|
+
externalUrl?: string;
|
|
68
|
+
/** Path on www service (env-aware — resolves against www's URL at runtime) */
|
|
69
|
+
wwwPath?: string;
|
|
70
|
+
}
|
|
71
|
+
declare const SERVICES: readonly ServiceDefinition[];
|
|
72
|
+
/** Get a service definition by name */
|
|
73
|
+
declare function getService(name: string): ServiceDefinition | undefined;
|
|
74
|
+
/** Get the port for a service in a given environment */
|
|
75
|
+
declare function getPort(name: string, env?: "dev" | "prod"): number | undefined;
|
|
76
|
+
/** Get internal URL for a service (server-side calls) */
|
|
77
|
+
declare function getServiceUrl(name: string, env?: "dev" | "prod"): string | undefined;
|
|
78
|
+
/** Get the public URL for a service.
|
|
79
|
+
* Localhost-aware: if domain contains "localhost" or prefix is "http://localhost:",
|
|
80
|
+
* returns http://localhost:{devPort} using the canonical port map.
|
|
81
|
+
*/
|
|
82
|
+
declare function getPublicUrl(name: string, options?: {
|
|
83
|
+
prefix?: string;
|
|
84
|
+
domain?: string;
|
|
85
|
+
}): string;
|
|
86
|
+
/**
|
|
87
|
+
* Build the public URL for a service using raw env vars.
|
|
88
|
+
* Convenience wrapper around getPublicUrl that handles NEXT_PUBLIC_SERVICE_PREFIX
|
|
89
|
+
* and NEXT_PUBLIC_DOMAIN directly (no need to strip protocol).
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* buildPublicUrl('www') → uses env vars, localhost-aware
|
|
93
|
+
* buildPublicUrl('auth', prefix, domain) → explicit values
|
|
94
|
+
*/
|
|
95
|
+
declare function buildPublicUrl(name: string, servicePrefix?: string, domain?: string): string;
|
|
96
|
+
/**
|
|
97
|
+
* Build an ABSOLUTE public URL for a service — for use OUTSIDE the browser
|
|
98
|
+
* origin: email links, Stripe/webhook return/success URLs, externally shared
|
|
99
|
+
* links, and cross-node links. Unlike buildPublicUrl(), this never returns a
|
|
100
|
+
* relative path.
|
|
101
|
+
*
|
|
102
|
+
* Resolution order:
|
|
103
|
+
* 1. explicit NEXT_PUBLIC_{NAME}_URL env var (only if already absolute)
|
|
104
|
+
* 2. localhost dev → http://localhost:{devPort} from the canonical port map
|
|
105
|
+
* 3. otherwise an absolute https URL derived from NEXT_PUBLIC_SERVICE_PREFIX
|
|
106
|
+
* + NEXT_PUBLIC_DOMAIN via getPublicUrl()
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* buildPublicUrlAbsolute('chat') → https://jin.imajin.ai/chat (single-domain)
|
|
110
|
+
* buildPublicUrlAbsolute('kernel') → https://jin.imajin.ai (node root)
|
|
111
|
+
*/
|
|
112
|
+
declare function buildPublicUrlAbsolute(name: string): string;
|
|
113
|
+
/** All service names */
|
|
114
|
+
declare const SERVICE_NAMES: string[];
|
|
115
|
+
/** Services filtered by tier */
|
|
116
|
+
declare function servicesByTier(tier: ServiceTier): ServiceDefinition[];
|
|
117
|
+
/** Services filtered by visibility */
|
|
118
|
+
declare function servicesByVisibility(visibility: ServiceVisibility): ServiceDefinition[];
|
|
119
|
+
/**
|
|
120
|
+
* Build a map of service name → internal URL from env vars with fallback to port convention.
|
|
121
|
+
* Env var pattern: `{NAME}_SERVICE_URL` (e.g. `AUTH_SERVICE_URL`)
|
|
122
|
+
*/
|
|
123
|
+
declare function buildServiceUrlMap(env: Record<string, string | undefined>, mode?: "dev" | "prod"): Record<string, string>;
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Session cookie configuration — single source of truth.
|
|
127
|
+
*
|
|
128
|
+
* Every service that reads or writes the session cookie should import from here
|
|
129
|
+
* instead of hardcoding 'imajin_session'.
|
|
130
|
+
*/
|
|
131
|
+
/** The session cookie name. Use a different name per environment to prevent collisions. */
|
|
132
|
+
declare function getSessionCookieName(env?: "dev" | "prod"): string;
|
|
133
|
+
/** Default cookie name — resolves at import time based on environment */
|
|
134
|
+
declare const SESSION_COOKIE_NAME: string;
|
|
135
|
+
/** Cookie options for cross-subdomain sessions.
|
|
136
|
+
* When called with no argument, auto-detects from IMAJIN_ENV (same logic as getSessionCookieName).
|
|
137
|
+
* Accepts optional "dev" | "prod" override for explicit control.
|
|
138
|
+
*
|
|
139
|
+
* Localhost-aware: when SERVICE_PREFIX contains "localhost", uses
|
|
140
|
+
* settings compatible with HTTP on localhost (no domain, not secure, lax sameSite).
|
|
141
|
+
*/
|
|
142
|
+
declare function getSessionCookieOptions(env?: "dev" | "prod"): {
|
|
143
|
+
name: string;
|
|
144
|
+
options: {
|
|
145
|
+
maxAge: number;
|
|
146
|
+
domain?: string | undefined;
|
|
147
|
+
httpOnly: boolean;
|
|
148
|
+
secure: boolean;
|
|
149
|
+
sameSite: "lax" | "none";
|
|
150
|
+
path: string;
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* basePath-aware utilities for userspace apps running behind Next.js basePath.
|
|
156
|
+
*
|
|
157
|
+
* Next.js `basePath` auto-prefixes <Link> and router.push() but NOT:
|
|
158
|
+
* - fetch() calls
|
|
159
|
+
* - <a href=""> tags
|
|
160
|
+
* - globalThis.location assignments
|
|
161
|
+
*
|
|
162
|
+
* These utilities read NEXT_PUBLIC_BASE_PATH (set automatically by Next.js
|
|
163
|
+
* when basePath is configured) and prepend it where needed.
|
|
164
|
+
*
|
|
165
|
+
* Usage:
|
|
166
|
+
* import { apiFetch, apiUrl } from '@ima-jin/config';
|
|
167
|
+
*
|
|
168
|
+
* // Instead of: fetch('/api/listings')
|
|
169
|
+
* apiFetch('/api/listings')
|
|
170
|
+
*
|
|
171
|
+
* // For <a> tags or globalThis.location:
|
|
172
|
+
* <a href={apiUrl('/dashboard')}>Dashboard</a>
|
|
173
|
+
* globalThis.location.href = apiUrl('/dashboard');
|
|
174
|
+
*/
|
|
175
|
+
/**
|
|
176
|
+
* Prepend basePath to any root-relative path.
|
|
177
|
+
*
|
|
178
|
+
* apiUrl('/api/listings') → '/market/api/listings' (with basePath: '/market')
|
|
179
|
+
* apiUrl('/dashboard') → '/market/dashboard'
|
|
180
|
+
* apiUrl('/api/listings') → '/api/listings' (standalone, no basePath)
|
|
181
|
+
*/
|
|
182
|
+
declare function apiUrl(path: string): string;
|
|
183
|
+
/**
|
|
184
|
+
* basePath-aware fetch wrapper. Drop-in replacement for fetch() with
|
|
185
|
+
* root-relative paths.
|
|
186
|
+
*
|
|
187
|
+
* apiFetch('/api/listings') → fetch('/market/api/listings')
|
|
188
|
+
* apiFetch('/api/listings', { ... }) → fetch('/market/api/listings', { ... })
|
|
189
|
+
*
|
|
190
|
+
* Absolute URLs (http://, https://) are passed through unchanged.
|
|
191
|
+
*
|
|
192
|
+
* TODO(WO2/correlation): For server-side service-to-service calls, callers should
|
|
193
|
+
* forward the X-Correlation-Id header so the full request chain shares one ID.
|
|
194
|
+
* apiFetch is browser-side too, so we can't read headers here automatically —
|
|
195
|
+
* instead, pass it explicitly via init.headers when calling from a withLogger handler:
|
|
196
|
+
*
|
|
197
|
+
* apiFetch('/api/something', {
|
|
198
|
+
* headers: { 'x-correlation-id': correlationId },
|
|
199
|
+
* });
|
|
200
|
+
*
|
|
201
|
+
* When WO3 instruments services, each withLogger handler receives correlationId in
|
|
202
|
+
* ctx and should forward it on any outbound apiFetch/fetch calls.
|
|
203
|
+
*/
|
|
204
|
+
declare function apiFetch(path: string, init?: RequestInit): Promise<Response>;
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Simple sliding-window in-memory rate limiter.
|
|
208
|
+
* Safe for single-process Next.js. Per-worker in multi-worker setups (acceptable).
|
|
209
|
+
*/
|
|
210
|
+
declare function rateLimit(key: string, limit: number, windowMs: number): {
|
|
211
|
+
limited: boolean;
|
|
212
|
+
retryAfter: number;
|
|
213
|
+
};
|
|
214
|
+
declare function getClientIP(request: Request): string;
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Handle validation and normalization.
|
|
218
|
+
*
|
|
219
|
+
* Handles are node-scoped today, globally unique via DFOS chain in the future.
|
|
220
|
+
* Pattern: lowercase alphanumeric + dots, hyphens, underscores. 3-30 chars.
|
|
221
|
+
* No leading/trailing dots or hyphens. No consecutive dots or hyphens.
|
|
222
|
+
*/
|
|
223
|
+
/** Regex: the full allowed character set, length enforced */
|
|
224
|
+
declare const HANDLE_PATTERN: RegExp;
|
|
225
|
+
/** HTML input pattern attribute (no anchors, no flags) */
|
|
226
|
+
declare const HANDLE_INPUT_PATTERN = "[a-z0-9._\\-]{3,30}";
|
|
227
|
+
/** Characters allowed in handles — use in onChange filters */
|
|
228
|
+
declare const HANDLE_ALLOWED_CHARS: RegExp;
|
|
229
|
+
/** Reserved handles that cannot be claimed */
|
|
230
|
+
declare const RESERVED_HANDLES: Set<string>;
|
|
231
|
+
/** Validate handle format (does NOT check reserved or uniqueness) */
|
|
232
|
+
declare function isValidHandle(handle: string): boolean;
|
|
233
|
+
/** Check if handle is reserved */
|
|
234
|
+
declare function isReservedHandle(handle: string): boolean;
|
|
235
|
+
/** Normalize input: lowercase, strip disallowed chars */
|
|
236
|
+
declare function normalizeHandleInput(value: string): string;
|
|
237
|
+
/** Validation error message */
|
|
238
|
+
declare const HANDLE_ERROR = "Handle must be 3-30 characters: lowercase letters, numbers, dots, hyphens, underscores";
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Centralized public route paths.
|
|
242
|
+
* Every service imports from here — change the prefix once, changes everywhere.
|
|
243
|
+
*
|
|
244
|
+
* Note: These are the *public-facing* URL paths (after any proxy/basePath
|
|
245
|
+
* stripping). Internal Next.js file paths may differ (e.g. kernel profiles
|
|
246
|
+
* are in `app/profile/p/[handle]` but the public URL is `/p/[handle]`).
|
|
247
|
+
*/
|
|
248
|
+
declare const eventPath: (eventId: string) => string;
|
|
249
|
+
declare const eventEditPath: (eventId: string) => string;
|
|
250
|
+
declare const eventRegisterPath: (eventId: string, ticketId: string) => string;
|
|
251
|
+
declare const eventMyTicketsPath: (eventId: string) => string;
|
|
252
|
+
declare const eventCheckoutSuccessPath: (eventId: string) => string;
|
|
253
|
+
declare const eventAdminPath: (eventId: string) => string;
|
|
254
|
+
declare const eventsDashboardPath: () => string;
|
|
255
|
+
declare const eventsCreatePath: () => string;
|
|
256
|
+
declare const eventsCheckoutSuccessPath: () => string;
|
|
257
|
+
declare const eventsAdminListPath: () => string;
|
|
258
|
+
declare const eventUrl: (baseUrl: string, eventId: string) => string;
|
|
259
|
+
declare const eventEditUrl: (baseUrl: string, eventId: string) => string;
|
|
260
|
+
declare const eventRegisterUrl: (baseUrl: string, eventId: string, ticketId: string) => string;
|
|
261
|
+
declare const eventMyTicketsUrl: (baseUrl: string, eventId: string) => string;
|
|
262
|
+
declare const profilePath: (handle: string) => string;
|
|
263
|
+
declare const profileEditPath: () => string;
|
|
264
|
+
declare const profileLoginPath: () => string;
|
|
265
|
+
declare const profileRegisterPath: () => string;
|
|
266
|
+
declare const profileUrl: (baseUrl: string, handle: string) => string;
|
|
267
|
+
declare const authLoginPath: () => string;
|
|
268
|
+
declare const authRegisterPath: () => string;
|
|
269
|
+
declare const authOnboardPath: () => string;
|
|
270
|
+
declare const authSettingsPath: () => string;
|
|
271
|
+
declare const authSecurityPath: () => string;
|
|
272
|
+
declare const authGroupSettingsPath: (groupDid: string) => string;
|
|
273
|
+
declare const authGroupsPath: () => string;
|
|
274
|
+
declare const authNewGroupPath: () => string;
|
|
275
|
+
declare const authAgentsPath: () => string;
|
|
276
|
+
declare const authAppsPath: () => string;
|
|
277
|
+
declare const authAttestationsPath: () => string;
|
|
278
|
+
declare const authAuthorizePath: () => string;
|
|
279
|
+
declare const authDeveloperAppsPath: () => string;
|
|
280
|
+
declare const authDeveloperAppPath: (appId: string) => string;
|
|
281
|
+
declare const authMembersPath: () => string;
|
|
282
|
+
declare const authNotificationsPath: () => string;
|
|
283
|
+
declare const authStubsPath: (did: string) => string;
|
|
284
|
+
declare const authNewStubPath: () => string;
|
|
285
|
+
declare const chatConversationsPath: () => string;
|
|
286
|
+
declare const chatConversationPath: (type: string, slug: string) => string;
|
|
287
|
+
declare const chatPath: () => string;
|
|
288
|
+
declare const connectionsPath: () => string;
|
|
289
|
+
declare const connectionsInvitePath: (did: string, code: string) => string;
|
|
290
|
+
declare const connectionsPodPath: (id: string) => string;
|
|
291
|
+
declare const payPath: () => string;
|
|
292
|
+
declare const payHistoryPath: () => string;
|
|
293
|
+
declare const payPayoutsPath: () => string;
|
|
294
|
+
declare const payTopupPath: () => string;
|
|
295
|
+
declare const payTopupSuccessPath: () => string;
|
|
296
|
+
declare const mediaPath: () => string;
|
|
297
|
+
declare const learnCoursePath: (slug: string) => string;
|
|
298
|
+
declare const learnCourseLessonPath: (slug: string, lessonId: string) => string;
|
|
299
|
+
declare const learnCoursePresentPath: (slug: string) => string;
|
|
300
|
+
declare const learnDashboardPath: () => string;
|
|
301
|
+
declare const learnCourseDashboardPath: (slug: string) => string;
|
|
302
|
+
declare const learnCourseStudentsPath: (slug: string) => string;
|
|
303
|
+
declare const learnHandlePath: (handle: string) => string;
|
|
304
|
+
declare const coffeeHandlePath: (handle: string) => string;
|
|
305
|
+
declare const coffeeDashboardPath: () => string;
|
|
306
|
+
declare const coffeeEditPath: () => string;
|
|
307
|
+
declare const coffeeSuccessPath: () => string;
|
|
308
|
+
declare const dykilHandlePath: (handle: string) => string;
|
|
309
|
+
declare const dykilSurveyPath: (handle: string, surveyId: string) => string;
|
|
310
|
+
declare const dykilCreatePath: () => string;
|
|
311
|
+
declare const dykilDashboardPath: () => string;
|
|
312
|
+
declare const dykilResultsPath: (id: string) => string;
|
|
313
|
+
declare const dykilEmbedPath: (surveyId: string) => string;
|
|
314
|
+
declare const linksHandlePath: (handle: string) => string;
|
|
315
|
+
declare const linksDashboardPath: () => string;
|
|
316
|
+
declare const linksEditPath: () => string;
|
|
317
|
+
declare const marketListingPath: (id: string) => string;
|
|
318
|
+
declare const marketListingEditPath: (id: string) => string;
|
|
319
|
+
declare const marketNewListingPath: () => string;
|
|
320
|
+
declare const marketSellerPath: (handle: string) => string;
|
|
321
|
+
declare const marketCheckoutSuccessPath: () => string;
|
|
322
|
+
declare const marketDashboardPath: () => string;
|
|
323
|
+
declare const marketSettingsPath: () => string;
|
|
324
|
+
declare const articlesPath: () => string;
|
|
325
|
+
declare const articleAuthorPath: (handle: string) => string;
|
|
326
|
+
declare const articlePath: (handle: string, slug: string) => string;
|
|
327
|
+
declare const registryPath: () => string;
|
|
328
|
+
declare const registryDocsPath: () => string;
|
|
329
|
+
declare const buildPath: () => string;
|
|
330
|
+
declare const bumpPath: () => string;
|
|
331
|
+
declare const bugsPath: () => string;
|
|
332
|
+
declare const bugsAdminPath: () => string;
|
|
333
|
+
declare const healthPath: () => string;
|
|
334
|
+
declare const privacyPath: () => string;
|
|
335
|
+
declare const whitepaperPath: () => string;
|
|
336
|
+
declare const subscribePath: () => string;
|
|
337
|
+
declare const developerGuidePath: () => string;
|
|
338
|
+
declare const docsPath: () => string;
|
|
339
|
+
declare const projectPath: () => string;
|
|
340
|
+
declare const notifyPath: () => string;
|
|
341
|
+
declare const notifySettingsPath: () => string;
|
|
342
|
+
|
|
343
|
+
export { ALLOWED_FRAME_ORIGINS, HANDLE_ALLOWED_CHARS, HANDLE_ERROR, HANDLE_INPUT_PATTERN, HANDLE_PATTERN, RESERVED_HANDLES, SERVICES, SERVICE_NAMES, SESSION_COOKIE_NAME, type ServiceCategory, type ServiceDefinition, type ServiceTier, type ServiceVisibility, apiFetch, apiUrl, articleAuthorPath, articlePath, articlesPath, authAgentsPath, authAppsPath, authAttestationsPath, authAuthorizePath, authDeveloperAppPath, authDeveloperAppsPath, authGroupSettingsPath, authGroupsPath, authLoginPath, authMembersPath, authNewGroupPath, authNewStubPath, authNotificationsPath, authOnboardPath, authRegisterPath, authSecurityPath, authSettingsPath, authStubsPath, bugsAdminPath, bugsPath, buildPath, buildPublicUrl, buildPublicUrlAbsolute, buildServiceUrlMap, bumpPath, chatConversationPath, chatConversationsPath, chatPath, coffeeDashboardPath, coffeeEditPath, coffeeHandlePath, coffeeSuccessPath, connectionsInvitePath, connectionsPath, connectionsPodPath, corsHeaders, corsOptions, developerGuidePath, docsPath, dykilCreatePath, dykilDashboardPath, dykilEmbedPath, dykilHandlePath, dykilResultsPath, dykilSurveyPath, eventAdminPath, eventCheckoutSuccessPath, eventEditPath, eventEditUrl, eventMyTicketsPath, eventMyTicketsUrl, eventPath, eventRegisterPath, eventRegisterUrl, eventUrl, eventsAdminListPath, eventsCheckoutSuccessPath, eventsCreatePath, eventsDashboardPath, getClientIP, getPort, getPublicUrl, getService, getServiceUrl, getSessionCookieName, getSessionCookieOptions, healthPath, isAllowedOrigin, isReservedHandle, isValidHandle, learnCourseDashboardPath, learnCourseLessonPath, learnCoursePath, learnCoursePresentPath, learnCourseStudentsPath, learnDashboardPath, learnHandlePath, linksDashboardPath, linksEditPath, linksHandlePath, marketCheckoutSuccessPath, marketDashboardPath, marketListingEditPath, marketListingPath, marketNewListingPath, marketSellerPath, marketSettingsPath, mediaPath, normalizeHandleInput, notifyPath, notifySettingsPath, payHistoryPath, payPath, payPayoutsPath, payTopupPath, payTopupSuccessPath, privacyPath, profileEditPath, profileLoginPath, profilePath, profileRegisterPath, profileUrl, projectPath, rateLimit, registryDocsPath, registryPath, servicesByTier, servicesByVisibility, subscribePath, tier1Headers, tier2Headers, tier3Headers, validateOrigin, whitepaperPath, withCors };
|