priceos 0.0.42 → 0.0.44
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/cli.cjs +1 -13
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +1 -13
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +33 -136
- package/dist/index.d.ts +33 -136
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -154,8 +154,6 @@ export type LimitFeatureUsage = {
|
|
|
154
154
|
remaining: number | null;
|
|
155
155
|
bonusRemaining: number;
|
|
156
156
|
bonusUsed: number;
|
|
157
|
-
resetsWhen: "billing_period" | "calendar";
|
|
158
|
-
resetType: "never" | "day" | "week" | "month" | "year";
|
|
159
157
|
nextReset: number | null;
|
|
160
158
|
lastReset: number | null;
|
|
161
159
|
};
|
|
@@ -164,10 +162,6 @@ export type TrackedLimitFeatureAccess = {
|
|
|
164
162
|
hasAccess: boolean;
|
|
165
163
|
isUnlimited: boolean;
|
|
166
164
|
limit: number | null;
|
|
167
|
-
used: number;
|
|
168
|
-
remaining: number | null;
|
|
169
|
-
bonusRemaining: number;
|
|
170
|
-
bonusUsed: number;
|
|
171
165
|
usage: LimitFeatureUsage;
|
|
172
166
|
};
|
|
173
167
|
export type UntrackedLimitFeatureAccess = {
|
|
@@ -175,18 +169,12 @@ export type UntrackedLimitFeatureAccess = {
|
|
|
175
169
|
hasAccess: boolean;
|
|
176
170
|
isUnlimited: boolean;
|
|
177
171
|
limit: number | null;
|
|
178
|
-
used: number;
|
|
179
|
-
remaining: number | null;
|
|
180
|
-
bonusRemaining: number;
|
|
181
|
-
bonusUsed: number;
|
|
182
|
-
usage: LimitFeatureUsage;
|
|
183
172
|
};
|
|
184
173
|
export type LimitFeatureAccess = TrackedLimitFeatureAccess | UntrackedLimitFeatureAccess;
|
|
185
174
|
export type FeatureAccessEntry = BooleanFeatureAccess | LimitFeatureAccess;
|
|
186
175
|
export type FeatureAccessMap = {
|
|
187
|
-
__limitFeatureKey?: LimitFeatureKey;
|
|
188
176
|
${mapLines.join("\n")}
|
|
189
|
-
}
|
|
177
|
+
};
|
|
190
178
|
`;
|
|
191
179
|
await import_promises.default.mkdir(import_node_path.default.dirname(outPath), { recursive: true });
|
|
192
180
|
await import_promises.default.writeFile(outPath, content, "utf8");
|
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\ntype Feature = {\n featureKey: string;\n type?: \"boolean\" | \"limit\" | null;\n tracksUsage?: boolean | null;\n};\n\nfunction argValue(args: string[], name: string) {\n const idx = args.indexOf(name);\n if (idx === -1) return undefined;\n return args[idx + 1];\n}\n\nfunction hasFlag(args: string[], name: string) {\n return args.includes(name);\n}\n\nasync function readEnvFile(filePath: string) {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n const entries: Record<string, string> = {};\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const rawKey = trimmed.slice(0, eqIdx).trim();\n const key = rawKey.startsWith(\"export \") ? rawKey.slice(\"export \".length).trim() : rawKey;\n let value = trimmed.slice(eqIdx + 1).trim();\n if (\n (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (key) {\n entries[key] = value;\n }\n }\n return entries;\n } catch {\n return {};\n }\n}\n\nfunction printHelp() {\n console.log(`\npriceos generate-types\n\nGenerates TypeScript feature access types for your PriceOS workspace.\n\nOptions:\n --api-key <key> PriceOS API key (defaults to .env.local, .env, or env PRICEOS_API_KEY) [required]\n --out <path> Output .d.ts file (default: priceos.d.ts in current directory)\n --out-dir <path> Output directory for priceos.d.ts (ignored if --out is set)\n -h, --help Show help\n\nExamples:\n priceos generate-types --api-key sk_test_... --out ./priceos.d.ts\n priceos generate-types --api-key sk_test_... --out-dir ./src\n`.trim());\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || hasFlag(args, \"--help\") || hasFlag(args, \"-h\")) {\n printHelp();\n process.exit(args.length === 0 ? 1 : 0);\n }\n\n const cmd = args[0];\n if (cmd !== \"generate-types\") {\n console.error(`Unknown command: ${cmd}`);\n printHelp();\n process.exit(1);\n }\n\n const envLocal = await readEnvFile(path.resolve(process.cwd(), \".env.local\"));\n const envDefault = await readEnvFile(path.resolve(process.cwd(), \".env\"));\n const apiKey =\n argValue(args, \"--api-key\") ??\n envLocal.PRICEOS_API_KEY ??\n envDefault.PRICEOS_API_KEY ??\n process.env.PRICEOS_API_KEY;\n\n if (!apiKey) {\n console.error(\"Missing API key. Provide --api-key <key> or set PRICEOS_API_KEY in .env.local/.env.\");\n process.exit(1);\n }\n\n const outRel = argValue(args, \"--out\");\n const outDir = argValue(args, \"--out-dir\");\n const outFile = outRel ?? \"priceos.d.ts\";\n const outPath = outDir && !outRel\n ? path.resolve(process.cwd(), outDir, outFile)\n : path.resolve(process.cwd(), outFile);\n const outDisplay = outDir && !outRel ? path.join(outDir, outFile) : outFile;\n\n const url = \"https://api.priceos.com/v1/features\";\n const res = await fetch(url, {\n headers: { \"x-api-key\": apiKey },\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n console.error(`Failed to fetch features: ${res.status} ${res.statusText}\\n${text}`);\n process.exit(1);\n }\n\n const features = (await res.json()) as Feature[];\n const typeByKey = new Map<string, \"boolean\" | \"limit\" | \"unknown\">();\n const trackingByKey = new Map<string, \"tracked\" | \"untracked\" | \"unknown\">();\n\n for (const feature of features ?? []) {\n if (!feature?.featureKey) continue;\n const key = feature.featureKey;\n const nextType = feature.type === \"boolean\" || feature.type === \"limit\" ? feature.type : \"unknown\";\n const currentType = typeByKey.get(key);\n if (!currentType) {\n typeByKey.set(key, nextType);\n } else if (currentType !== nextType) {\n typeByKey.set(key, \"unknown\");\n }\n\n if (nextType !== \"limit\") continue;\n\n const nextTracking =\n feature.tracksUsage === true\n ? \"tracked\"\n : feature.tracksUsage === false\n ? \"untracked\"\n : \"unknown\";\n const currentTracking = trackingByKey.get(key);\n if (!currentTracking) {\n trackingByKey.set(key, nextTracking);\n continue;\n }\n if (currentTracking !== nextTracking) {\n trackingByKey.set(key, \"unknown\");\n }\n }\n\n const keys = [...typeByKey.keys()].sort();\n const union = keys.length ? keys.map((k) => JSON.stringify(k)).join(\" | \") : \"never\";\n const limitKeys = keys.filter((key) => typeByKey.get(key) === \"limit\");\n const limitUnion = limitKeys.length ? limitKeys.map((k) => JSON.stringify(k)).join(\" | \") : \"never\";\n const mapLines = keys.map((key) => {\n const featureType = typeByKey.get(key);\n const accessType =\n featureType === \"boolean\"\n ? \"BooleanFeatureAccess\"\n : featureType === \"limit\"\n ? trackingByKey.get(key) === \"tracked\"\n ? \"TrackedLimitFeatureAccess\"\n : trackingByKey.get(key) === \"untracked\"\n ? \"UntrackedLimitFeatureAccess\"\n : \"LimitFeatureAccess\"\n : \"FeatureAccessEntry\";\n return ` ${JSON.stringify(key)}: ${accessType};`;\n });\n\n const content = `// Auto-generated by PriceOS (priceos generate-types). Do not edit.\nexport type FeatureKey = ${union};\nexport type LimitFeatureKey = ${limitUnion};\nexport type BooleanFeatureAccess = {\n type: \"boolean\";\n hasAccess: boolean;\n};\nexport type LimitFeatureUsage = {\n used: number;\n remaining: number | null;\n bonusRemaining: number;\n bonusUsed: number;\n resetsWhen: \"billing_period\" | \"calendar\";\n resetType: \"never\" | \"day\" | \"week\" | \"month\" | \"year\";\n nextReset: number | null;\n lastReset: number | null;\n};\nexport type TrackedLimitFeatureAccess = {\n type: \"limit\";\n hasAccess: boolean;\n isUnlimited: boolean;\n limit: number | null;\n used: number;\n remaining: number | null;\n bonusRemaining: number;\n bonusUsed: number;\n usage: LimitFeatureUsage;\n};\nexport type UntrackedLimitFeatureAccess = {\n type: \"limit\";\n hasAccess: boolean;\n isUnlimited: boolean;\n limit: number | null;\n used: number;\n remaining: number | null;\n bonusRemaining: number;\n bonusUsed: number;\n usage: LimitFeatureUsage;\n};\nexport type LimitFeatureAccess = TrackedLimitFeatureAccess | UntrackedLimitFeatureAccess;\nexport type FeatureAccessEntry = BooleanFeatureAccess | LimitFeatureAccess;\nexport type FeatureAccessMap = {\n __limitFeatureKey?: LimitFeatureKey;\n${mapLines.join(\"\\n\")}\n} & Record<string, FeatureAccessEntry>;\n`;\n\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n await fs.writeFile(outPath, content, \"utf8\");\n\n console.log(`Generated ${outDisplay} (${keys.length} feature keys)`);\n}\n\nmain().catch((e) => {\n console.error(e);\n process.exit(1);\n});\n"],"mappings":"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","names":["fs","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\ntype Feature = {\n featureKey: string;\n type?: \"boolean\" | \"limit\" | null;\n tracksUsage?: boolean | null;\n};\n\nfunction argValue(args: string[], name: string) {\n const idx = args.indexOf(name);\n if (idx === -1) return undefined;\n return args[idx + 1];\n}\n\nfunction hasFlag(args: string[], name: string) {\n return args.includes(name);\n}\n\nasync function readEnvFile(filePath: string) {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n const entries: Record<string, string> = {};\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const rawKey = trimmed.slice(0, eqIdx).trim();\n const key = rawKey.startsWith(\"export \") ? rawKey.slice(\"export \".length).trim() : rawKey;\n let value = trimmed.slice(eqIdx + 1).trim();\n if (\n (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (key) {\n entries[key] = value;\n }\n }\n return entries;\n } catch {\n return {};\n }\n}\n\nfunction printHelp() {\n console.log(`\npriceos generate-types\n\nGenerates TypeScript feature access types for your PriceOS workspace.\n\nOptions:\n --api-key <key> PriceOS API key (defaults to .env.local, .env, or env PRICEOS_API_KEY) [required]\n --out <path> Output .d.ts file (default: priceos.d.ts in current directory)\n --out-dir <path> Output directory for priceos.d.ts (ignored if --out is set)\n -h, --help Show help\n\nExamples:\n priceos generate-types --api-key sk_test_... --out ./priceos.d.ts\n priceos generate-types --api-key sk_test_... --out-dir ./src\n`.trim());\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || hasFlag(args, \"--help\") || hasFlag(args, \"-h\")) {\n printHelp();\n process.exit(args.length === 0 ? 1 : 0);\n }\n\n const cmd = args[0];\n if (cmd !== \"generate-types\") {\n console.error(`Unknown command: ${cmd}`);\n printHelp();\n process.exit(1);\n }\n\n const envLocal = await readEnvFile(path.resolve(process.cwd(), \".env.local\"));\n const envDefault = await readEnvFile(path.resolve(process.cwd(), \".env\"));\n const apiKey =\n argValue(args, \"--api-key\") ??\n envLocal.PRICEOS_API_KEY ??\n envDefault.PRICEOS_API_KEY ??\n process.env.PRICEOS_API_KEY;\n\n if (!apiKey) {\n console.error(\"Missing API key. Provide --api-key <key> or set PRICEOS_API_KEY in .env.local/.env.\");\n process.exit(1);\n }\n\n const outRel = argValue(args, \"--out\");\n const outDir = argValue(args, \"--out-dir\");\n const outFile = outRel ?? \"priceos.d.ts\";\n const outPath = outDir && !outRel\n ? path.resolve(process.cwd(), outDir, outFile)\n : path.resolve(process.cwd(), outFile);\n const outDisplay = outDir && !outRel ? path.join(outDir, outFile) : outFile;\n\n const url = \"https://api.priceos.com/v1/features\";\n const res = await fetch(url, {\n headers: { \"x-api-key\": apiKey },\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n console.error(`Failed to fetch features: ${res.status} ${res.statusText}\\n${text}`);\n process.exit(1);\n }\n\n const features = (await res.json()) as Feature[];\n const typeByKey = new Map<string, \"boolean\" | \"limit\" | \"unknown\">();\n const trackingByKey = new Map<string, \"tracked\" | \"untracked\" | \"unknown\">();\n\n for (const feature of features ?? []) {\n if (!feature?.featureKey) continue;\n const key = feature.featureKey;\n const nextType = feature.type === \"boolean\" || feature.type === \"limit\" ? feature.type : \"unknown\";\n const currentType = typeByKey.get(key);\n if (!currentType) {\n typeByKey.set(key, nextType);\n } else if (currentType !== nextType) {\n typeByKey.set(key, \"unknown\");\n }\n\n if (nextType !== \"limit\") continue;\n\n const nextTracking =\n feature.tracksUsage === true\n ? \"tracked\"\n : feature.tracksUsage === false\n ? \"untracked\"\n : \"unknown\";\n const currentTracking = trackingByKey.get(key);\n if (!currentTracking) {\n trackingByKey.set(key, nextTracking);\n continue;\n }\n if (currentTracking !== nextTracking) {\n trackingByKey.set(key, \"unknown\");\n }\n }\n\n const keys = [...typeByKey.keys()].sort();\n const union = keys.length ? keys.map((k) => JSON.stringify(k)).join(\" | \") : \"never\";\n const limitKeys = keys.filter((key) => typeByKey.get(key) === \"limit\");\n const limitUnion = limitKeys.length ? limitKeys.map((k) => JSON.stringify(k)).join(\" | \") : \"never\";\n const mapLines = keys.map((key) => {\n const featureType = typeByKey.get(key);\n const accessType =\n featureType === \"boolean\"\n ? \"BooleanFeatureAccess\"\n : featureType === \"limit\"\n ? trackingByKey.get(key) === \"tracked\"\n ? \"TrackedLimitFeatureAccess\"\n : trackingByKey.get(key) === \"untracked\"\n ? \"UntrackedLimitFeatureAccess\"\n : \"LimitFeatureAccess\"\n : \"FeatureAccessEntry\";\n return ` ${JSON.stringify(key)}: ${accessType};`;\n });\n\n const content = `// Auto-generated by PriceOS (priceos generate-types). Do not edit.\nexport type FeatureKey = ${union};\nexport type LimitFeatureKey = ${limitUnion};\nexport type BooleanFeatureAccess = {\n type: \"boolean\";\n hasAccess: boolean;\n};\nexport type LimitFeatureUsage = {\n used: number;\n remaining: number | null;\n bonusRemaining: number;\n bonusUsed: number;\n nextReset: number | null;\n lastReset: number | null;\n};\nexport type TrackedLimitFeatureAccess = {\n type: \"limit\";\n hasAccess: boolean;\n isUnlimited: boolean;\n limit: number | null;\n usage: LimitFeatureUsage;\n};\nexport type UntrackedLimitFeatureAccess = {\n type: \"limit\";\n hasAccess: boolean;\n isUnlimited: boolean;\n limit: number | null;\n};\nexport type LimitFeatureAccess = TrackedLimitFeatureAccess | UntrackedLimitFeatureAccess;\nexport type FeatureAccessEntry = BooleanFeatureAccess | LimitFeatureAccess;\nexport type FeatureAccessMap = {\n${mapLines.join(\"\\n\")}\n};\n`;\n\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n await fs.writeFile(outPath, content, \"utf8\");\n\n console.log(`Generated ${outDisplay} (${keys.length} feature keys)`);\n}\n\nmain().catch((e) => {\n console.error(e);\n process.exit(1);\n});\n"],"mappings":"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","names":["fs","path"]}
|
package/dist/cli.js
CHANGED
|
@@ -131,8 +131,6 @@ export type LimitFeatureUsage = {
|
|
|
131
131
|
remaining: number | null;
|
|
132
132
|
bonusRemaining: number;
|
|
133
133
|
bonusUsed: number;
|
|
134
|
-
resetsWhen: "billing_period" | "calendar";
|
|
135
|
-
resetType: "never" | "day" | "week" | "month" | "year";
|
|
136
134
|
nextReset: number | null;
|
|
137
135
|
lastReset: number | null;
|
|
138
136
|
};
|
|
@@ -141,10 +139,6 @@ export type TrackedLimitFeatureAccess = {
|
|
|
141
139
|
hasAccess: boolean;
|
|
142
140
|
isUnlimited: boolean;
|
|
143
141
|
limit: number | null;
|
|
144
|
-
used: number;
|
|
145
|
-
remaining: number | null;
|
|
146
|
-
bonusRemaining: number;
|
|
147
|
-
bonusUsed: number;
|
|
148
142
|
usage: LimitFeatureUsage;
|
|
149
143
|
};
|
|
150
144
|
export type UntrackedLimitFeatureAccess = {
|
|
@@ -152,18 +146,12 @@ export type UntrackedLimitFeatureAccess = {
|
|
|
152
146
|
hasAccess: boolean;
|
|
153
147
|
isUnlimited: boolean;
|
|
154
148
|
limit: number | null;
|
|
155
|
-
used: number;
|
|
156
|
-
remaining: number | null;
|
|
157
|
-
bonusRemaining: number;
|
|
158
|
-
bonusUsed: number;
|
|
159
|
-
usage: LimitFeatureUsage;
|
|
160
149
|
};
|
|
161
150
|
export type LimitFeatureAccess = TrackedLimitFeatureAccess | UntrackedLimitFeatureAccess;
|
|
162
151
|
export type FeatureAccessEntry = BooleanFeatureAccess | LimitFeatureAccess;
|
|
163
152
|
export type FeatureAccessMap = {
|
|
164
|
-
__limitFeatureKey?: LimitFeatureKey;
|
|
165
153
|
${mapLines.join("\n")}
|
|
166
|
-
}
|
|
154
|
+
};
|
|
167
155
|
`;
|
|
168
156
|
await fs.mkdir(path.dirname(outPath), { recursive: true });
|
|
169
157
|
await fs.writeFile(outPath, content, "utf8");
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\ntype Feature = {\n featureKey: string;\n type?: \"boolean\" | \"limit\" | null;\n tracksUsage?: boolean | null;\n};\n\nfunction argValue(args: string[], name: string) {\n const idx = args.indexOf(name);\n if (idx === -1) return undefined;\n return args[idx + 1];\n}\n\nfunction hasFlag(args: string[], name: string) {\n return args.includes(name);\n}\n\nasync function readEnvFile(filePath: string) {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n const entries: Record<string, string> = {};\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const rawKey = trimmed.slice(0, eqIdx).trim();\n const key = rawKey.startsWith(\"export \") ? rawKey.slice(\"export \".length).trim() : rawKey;\n let value = trimmed.slice(eqIdx + 1).trim();\n if (\n (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (key) {\n entries[key] = value;\n }\n }\n return entries;\n } catch {\n return {};\n }\n}\n\nfunction printHelp() {\n console.log(`\npriceos generate-types\n\nGenerates TypeScript feature access types for your PriceOS workspace.\n\nOptions:\n --api-key <key> PriceOS API key (defaults to .env.local, .env, or env PRICEOS_API_KEY) [required]\n --out <path> Output .d.ts file (default: priceos.d.ts in current directory)\n --out-dir <path> Output directory for priceos.d.ts (ignored if --out is set)\n -h, --help Show help\n\nExamples:\n priceos generate-types --api-key sk_test_... --out ./priceos.d.ts\n priceos generate-types --api-key sk_test_... --out-dir ./src\n`.trim());\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || hasFlag(args, \"--help\") || hasFlag(args, \"-h\")) {\n printHelp();\n process.exit(args.length === 0 ? 1 : 0);\n }\n\n const cmd = args[0];\n if (cmd !== \"generate-types\") {\n console.error(`Unknown command: ${cmd}`);\n printHelp();\n process.exit(1);\n }\n\n const envLocal = await readEnvFile(path.resolve(process.cwd(), \".env.local\"));\n const envDefault = await readEnvFile(path.resolve(process.cwd(), \".env\"));\n const apiKey =\n argValue(args, \"--api-key\") ??\n envLocal.PRICEOS_API_KEY ??\n envDefault.PRICEOS_API_KEY ??\n process.env.PRICEOS_API_KEY;\n\n if (!apiKey) {\n console.error(\"Missing API key. Provide --api-key <key> or set PRICEOS_API_KEY in .env.local/.env.\");\n process.exit(1);\n }\n\n const outRel = argValue(args, \"--out\");\n const outDir = argValue(args, \"--out-dir\");\n const outFile = outRel ?? \"priceos.d.ts\";\n const outPath = outDir && !outRel\n ? path.resolve(process.cwd(), outDir, outFile)\n : path.resolve(process.cwd(), outFile);\n const outDisplay = outDir && !outRel ? path.join(outDir, outFile) : outFile;\n\n const url = \"https://api.priceos.com/v1/features\";\n const res = await fetch(url, {\n headers: { \"x-api-key\": apiKey },\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n console.error(`Failed to fetch features: ${res.status} ${res.statusText}\\n${text}`);\n process.exit(1);\n }\n\n const features = (await res.json()) as Feature[];\n const typeByKey = new Map<string, \"boolean\" | \"limit\" | \"unknown\">();\n const trackingByKey = new Map<string, \"tracked\" | \"untracked\" | \"unknown\">();\n\n for (const feature of features ?? []) {\n if (!feature?.featureKey) continue;\n const key = feature.featureKey;\n const nextType = feature.type === \"boolean\" || feature.type === \"limit\" ? feature.type : \"unknown\";\n const currentType = typeByKey.get(key);\n if (!currentType) {\n typeByKey.set(key, nextType);\n } else if (currentType !== nextType) {\n typeByKey.set(key, \"unknown\");\n }\n\n if (nextType !== \"limit\") continue;\n\n const nextTracking =\n feature.tracksUsage === true\n ? \"tracked\"\n : feature.tracksUsage === false\n ? \"untracked\"\n : \"unknown\";\n const currentTracking = trackingByKey.get(key);\n if (!currentTracking) {\n trackingByKey.set(key, nextTracking);\n continue;\n }\n if (currentTracking !== nextTracking) {\n trackingByKey.set(key, \"unknown\");\n }\n }\n\n const keys = [...typeByKey.keys()].sort();\n const union = keys.length ? keys.map((k) => JSON.stringify(k)).join(\" | \") : \"never\";\n const limitKeys = keys.filter((key) => typeByKey.get(key) === \"limit\");\n const limitUnion = limitKeys.length ? limitKeys.map((k) => JSON.stringify(k)).join(\" | \") : \"never\";\n const mapLines = keys.map((key) => {\n const featureType = typeByKey.get(key);\n const accessType =\n featureType === \"boolean\"\n ? \"BooleanFeatureAccess\"\n : featureType === \"limit\"\n ? trackingByKey.get(key) === \"tracked\"\n ? \"TrackedLimitFeatureAccess\"\n : trackingByKey.get(key) === \"untracked\"\n ? \"UntrackedLimitFeatureAccess\"\n : \"LimitFeatureAccess\"\n : \"FeatureAccessEntry\";\n return ` ${JSON.stringify(key)}: ${accessType};`;\n });\n\n const content = `// Auto-generated by PriceOS (priceos generate-types). Do not edit.\nexport type FeatureKey = ${union};\nexport type LimitFeatureKey = ${limitUnion};\nexport type BooleanFeatureAccess = {\n type: \"boolean\";\n hasAccess: boolean;\n};\nexport type LimitFeatureUsage = {\n used: number;\n remaining: number | null;\n bonusRemaining: number;\n bonusUsed: number;\n resetsWhen: \"billing_period\" | \"calendar\";\n resetType: \"never\" | \"day\" | \"week\" | \"month\" | \"year\";\n nextReset: number | null;\n lastReset: number | null;\n};\nexport type TrackedLimitFeatureAccess = {\n type: \"limit\";\n hasAccess: boolean;\n isUnlimited: boolean;\n limit: number | null;\n used: number;\n remaining: number | null;\n bonusRemaining: number;\n bonusUsed: number;\n usage: LimitFeatureUsage;\n};\nexport type UntrackedLimitFeatureAccess = {\n type: \"limit\";\n hasAccess: boolean;\n isUnlimited: boolean;\n limit: number | null;\n used: number;\n remaining: number | null;\n bonusRemaining: number;\n bonusUsed: number;\n usage: LimitFeatureUsage;\n};\nexport type LimitFeatureAccess = TrackedLimitFeatureAccess | UntrackedLimitFeatureAccess;\nexport type FeatureAccessEntry = BooleanFeatureAccess | LimitFeatureAccess;\nexport type FeatureAccessMap = {\n __limitFeatureKey?: LimitFeatureKey;\n${mapLines.join(\"\\n\")}\n} & Record<string, FeatureAccessEntry>;\n`;\n\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n await fs.writeFile(outPath, content, \"utf8\");\n\n console.log(`Generated ${outDisplay} (${keys.length} feature keys)`);\n}\n\nmain().catch((e) => {\n console.error(e);\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\ntype Feature = {\n featureKey: string;\n type?: \"boolean\" | \"limit\" | null;\n tracksUsage?: boolean | null;\n};\n\nfunction argValue(args: string[], name: string) {\n const idx = args.indexOf(name);\n if (idx === -1) return undefined;\n return args[idx + 1];\n}\n\nfunction hasFlag(args: string[], name: string) {\n return args.includes(name);\n}\n\nasync function readEnvFile(filePath: string) {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n const entries: Record<string, string> = {};\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const rawKey = trimmed.slice(0, eqIdx).trim();\n const key = rawKey.startsWith(\"export \") ? rawKey.slice(\"export \".length).trim() : rawKey;\n let value = trimmed.slice(eqIdx + 1).trim();\n if (\n (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (key) {\n entries[key] = value;\n }\n }\n return entries;\n } catch {\n return {};\n }\n}\n\nfunction printHelp() {\n console.log(`\npriceos generate-types\n\nGenerates TypeScript feature access types for your PriceOS workspace.\n\nOptions:\n --api-key <key> PriceOS API key (defaults to .env.local, .env, or env PRICEOS_API_KEY) [required]\n --out <path> Output .d.ts file (default: priceos.d.ts in current directory)\n --out-dir <path> Output directory for priceos.d.ts (ignored if --out is set)\n -h, --help Show help\n\nExamples:\n priceos generate-types --api-key sk_test_... --out ./priceos.d.ts\n priceos generate-types --api-key sk_test_... --out-dir ./src\n`.trim());\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || hasFlag(args, \"--help\") || hasFlag(args, \"-h\")) {\n printHelp();\n process.exit(args.length === 0 ? 1 : 0);\n }\n\n const cmd = args[0];\n if (cmd !== \"generate-types\") {\n console.error(`Unknown command: ${cmd}`);\n printHelp();\n process.exit(1);\n }\n\n const envLocal = await readEnvFile(path.resolve(process.cwd(), \".env.local\"));\n const envDefault = await readEnvFile(path.resolve(process.cwd(), \".env\"));\n const apiKey =\n argValue(args, \"--api-key\") ??\n envLocal.PRICEOS_API_KEY ??\n envDefault.PRICEOS_API_KEY ??\n process.env.PRICEOS_API_KEY;\n\n if (!apiKey) {\n console.error(\"Missing API key. Provide --api-key <key> or set PRICEOS_API_KEY in .env.local/.env.\");\n process.exit(1);\n }\n\n const outRel = argValue(args, \"--out\");\n const outDir = argValue(args, \"--out-dir\");\n const outFile = outRel ?? \"priceos.d.ts\";\n const outPath = outDir && !outRel\n ? path.resolve(process.cwd(), outDir, outFile)\n : path.resolve(process.cwd(), outFile);\n const outDisplay = outDir && !outRel ? path.join(outDir, outFile) : outFile;\n\n const url = \"https://api.priceos.com/v1/features\";\n const res = await fetch(url, {\n headers: { \"x-api-key\": apiKey },\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n console.error(`Failed to fetch features: ${res.status} ${res.statusText}\\n${text}`);\n process.exit(1);\n }\n\n const features = (await res.json()) as Feature[];\n const typeByKey = new Map<string, \"boolean\" | \"limit\" | \"unknown\">();\n const trackingByKey = new Map<string, \"tracked\" | \"untracked\" | \"unknown\">();\n\n for (const feature of features ?? []) {\n if (!feature?.featureKey) continue;\n const key = feature.featureKey;\n const nextType = feature.type === \"boolean\" || feature.type === \"limit\" ? feature.type : \"unknown\";\n const currentType = typeByKey.get(key);\n if (!currentType) {\n typeByKey.set(key, nextType);\n } else if (currentType !== nextType) {\n typeByKey.set(key, \"unknown\");\n }\n\n if (nextType !== \"limit\") continue;\n\n const nextTracking =\n feature.tracksUsage === true\n ? \"tracked\"\n : feature.tracksUsage === false\n ? \"untracked\"\n : \"unknown\";\n const currentTracking = trackingByKey.get(key);\n if (!currentTracking) {\n trackingByKey.set(key, nextTracking);\n continue;\n }\n if (currentTracking !== nextTracking) {\n trackingByKey.set(key, \"unknown\");\n }\n }\n\n const keys = [...typeByKey.keys()].sort();\n const union = keys.length ? keys.map((k) => JSON.stringify(k)).join(\" | \") : \"never\";\n const limitKeys = keys.filter((key) => typeByKey.get(key) === \"limit\");\n const limitUnion = limitKeys.length ? limitKeys.map((k) => JSON.stringify(k)).join(\" | \") : \"never\";\n const mapLines = keys.map((key) => {\n const featureType = typeByKey.get(key);\n const accessType =\n featureType === \"boolean\"\n ? \"BooleanFeatureAccess\"\n : featureType === \"limit\"\n ? trackingByKey.get(key) === \"tracked\"\n ? \"TrackedLimitFeatureAccess\"\n : trackingByKey.get(key) === \"untracked\"\n ? \"UntrackedLimitFeatureAccess\"\n : \"LimitFeatureAccess\"\n : \"FeatureAccessEntry\";\n return ` ${JSON.stringify(key)}: ${accessType};`;\n });\n\n const content = `// Auto-generated by PriceOS (priceos generate-types). Do not edit.\nexport type FeatureKey = ${union};\nexport type LimitFeatureKey = ${limitUnion};\nexport type BooleanFeatureAccess = {\n type: \"boolean\";\n hasAccess: boolean;\n};\nexport type LimitFeatureUsage = {\n used: number;\n remaining: number | null;\n bonusRemaining: number;\n bonusUsed: number;\n nextReset: number | null;\n lastReset: number | null;\n};\nexport type TrackedLimitFeatureAccess = {\n type: \"limit\";\n hasAccess: boolean;\n isUnlimited: boolean;\n limit: number | null;\n usage: LimitFeatureUsage;\n};\nexport type UntrackedLimitFeatureAccess = {\n type: \"limit\";\n hasAccess: boolean;\n isUnlimited: boolean;\n limit: number | null;\n};\nexport type LimitFeatureAccess = TrackedLimitFeatureAccess | UntrackedLimitFeatureAccess;\nexport type FeatureAccessEntry = BooleanFeatureAccess | LimitFeatureAccess;\nexport type FeatureAccessMap = {\n${mapLines.join(\"\\n\")}\n};\n`;\n\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n await fs.writeFile(outPath, content, \"utf8\");\n\n console.log(`Generated ${outDisplay} (${keys.length} feature keys)`);\n}\n\nmain().catch((e) => {\n console.error(e);\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client.ts"],"sourcesContent":["export { PriceOS, PriceOSError } from \"./client\";\nexport type {\n PriceOSClientOptions,\n PriceOSLogLevel,\n PriceOSBonusesClient,\n PriceOSCustomersClient,\n PriceOSFeaturesClient,\n PriceOSHttpClient,\n PriceOSUsageClient,\n} from \"./client\";\nexport type {\n CreateBonusBody,\n CreateBonusResponse,\n ListBonusesRequest,\n ListBonusesResponse,\n UpdateBonusBody,\n UpdateBonusRequest,\n UpdateBonusResponse,\n DeleteBonusRequest,\n DeleteBonusResponse,\n CreateCustomerRequest,\n CreateCustomerResponse,\n DeleteUsageEventsBody,\n DeleteUsageEventsResponse,\n DeleteCustomerRequest,\n DeleteCustomerResponse,\n GetCustomerResponse,\n GetFeatureAccessResponse,\n LinkCustomerBody,\n LinkCustomerResponse,\n LimitFeatureKeyFromAccessMap,\n ListUsageEventsBody,\n ListUsageEventsResponse,\n ResetUsageBody,\n ResetUsageResponse,\n UsageEvent,\n TrackUsageBody,\n TrackUsageBatchBody,\n TrackUsageBatchEvent,\n TrackUsageBatchResponse,\n TrackUsageResponse,\n UpdateCustomerBody,\n UpdateCustomerResponse,\n} from \"./types\";\n","import createClient from \"openapi-fetch\";\nimport type { Client } from \"openapi-fetch\";\nimport type { paths } from \"./gen/openapi\";\nimport {\n CreateBonusBody,\n CreateBonusResponse,\n CreateCustomerRequest,\n CreateCustomerResponse,\n DeleteBonusResponse,\n ListBonusesRequest,\n ListBonusesResponse,\n DeleteUsageEventsBody,\n DeleteUsageEventsResponse,\n DeleteCustomerResponse,\n GetCustomerResponse,\n GetFeatureAccessResponse,\n LinkCustomerBody,\n LinkCustomerResponse,\n LimitFeatureKeyFromAccessMap,\n ListUsageEventsBody,\n ListUsageEventsResponse,\n ResetUsageBody,\n ResetUsageResponse,\n UpdateBonusRequest,\n UpdateBonusResponse,\n TrackUsageBody,\n TrackUsageBatchBody,\n TrackUsageBatchResponse,\n TrackUsageResponse,\n UpdateCustomerBody,\n UpdateCustomerResponse,\n} from \"./types\";\n\nexport type PriceOSLogLevel = \"none\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n\n// --- Public options ---\nexport type PriceOSClientOptions = {\n logLevel?: PriceOSLogLevel;\n};\n\nconst RATE_LIMIT_STATUS = 429;\nconst MAX_RETRIES = 4;\nconst BASE_DELAY_MS = 250;\nconst BACKOFF_MULTIPLIER = 2;\nconst JITTER_MS = 250;\nconst RETRY_DELAY_CAP_MS = 5_000;\nconst REQUEST_TIMEOUT_MS = 20_000;\n\nconst LOG_LEVELS: Record<PriceOSLogLevel, number> = {\n none: 0,\n error: 1,\n warning: 2,\n info: 3,\n debug: 4,\n};\n\ntype Logger = {\n error: (message: string, details?: Record<string, unknown>) => void;\n warning: (message: string, details?: Record<string, unknown>) => void;\n info: (message: string, details?: Record<string, unknown>) => void;\n debug: (message: string, details?: Record<string, unknown>) => void;\n};\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst getRetryDelayMs = (retryCount: number): number => {\n const backoff = BASE_DELAY_MS * Math.pow(BACKOFF_MULTIPLIER, retryCount - 1);\n const jitter = Math.random() * JITTER_MS;\n return Math.min(RETRY_DELAY_CAP_MS, backoff + jitter);\n};\n\nconst createLogger = (logLevel: PriceOSLogLevel): Logger => {\n const shouldLog = (level: PriceOSLogLevel): boolean =>\n logLevel !== \"none\" && LOG_LEVELS[level] <= LOG_LEVELS[logLevel];\n\n const write = (\n level: PriceOSLogLevel,\n message: string,\n details?: Record<string, unknown>\n ): void => {\n if (!shouldLog(level)) return;\n const prefix = `[PriceOS] ${level.toUpperCase()}: ${message}`;\n const payload = details && Object.keys(details).length > 0 ? details : undefined;\n\n switch (level) {\n case \"error\":\n payload ? console.error(prefix, payload) : console.error(prefix);\n return;\n case \"warning\":\n payload ? console.warn(prefix, payload) : console.warn(prefix);\n return;\n case \"info\":\n payload ? console.info(prefix, payload) : console.info(prefix);\n return;\n case \"debug\":\n payload ? console.debug(prefix, payload) : console.debug(prefix);\n return;\n }\n };\n\n return {\n error: (message, details) => write(\"error\", message, details),\n warning: (message, details) => write(\"warning\", message, details),\n info: (message, details) => write(\"info\", message, details),\n debug: (message, details) => write(\"debug\", message, details),\n };\n};\n\nconst getUpstreamSignal = (input: RequestInfo | URL, init?: RequestInit): AbortSignal | undefined => {\n if (init?.signal) return init.signal;\n if (typeof Request !== \"undefined\" && input instanceof Request) return input.signal;\n return undefined;\n};\n\nconst stripSignal = (init?: RequestInit): RequestInit | undefined => {\n if (!init) return undefined;\n const { signal: _signal, ...rest } = init;\n return rest;\n};\n\nconst getRequestDetails = (\n input: RequestInfo | URL,\n init?: RequestInit\n): { method: string; url: string } => {\n const method =\n init?.method ??\n (typeof Request !== \"undefined\" && input instanceof Request ? input.method : \"GET\");\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n return { method, url };\n};\n\nconst prepareRetryRequest = async (\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n log: Logger,\n method: string,\n url: string\n): Promise<{ requestInput: RequestInfo | URL; baseInit?: RequestInit; canRetry: boolean }> => {\n if (!(typeof Request !== \"undefined\" && input instanceof Request)) {\n return { requestInput: input, baseInit: stripSignal(init), canRetry: true };\n }\n\n if (input.bodyUsed) {\n log.warning(\"Request body already used; retries disabled\", { method, url });\n return { requestInput: input, baseInit: stripSignal(init), canRetry: false };\n }\n\n let body: BodyInit | undefined = undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n try {\n body = await input.clone().arrayBuffer();\n } catch (error) {\n log.warning(\"Unable to clone request body; retries disabled\", { method, url, error });\n return { requestInput: input, baseInit: stripSignal(init), canRetry: false };\n }\n }\n\n const headers = new Headers(input.headers);\n const baseInit = { ...stripSignal(init), method, headers, body };\n return { requestInput: input.url, baseInit, canRetry: true };\n};\n\nconst getErrorMessage = (error: unknown): string => {\n const maybeError = error as { error?: unknown } | null;\n if (maybeError && typeof maybeError.error === \"string\") return maybeError.error;\n return \"Request failed\";\n};\n\nconst throwRequestError = (\n log: Logger,\n error: unknown,\n response: Response | undefined,\n context: string\n): never => {\n log.error(\"Request failed\", { context, status: response?.status, error });\n throw new PriceOSError(getErrorMessage(error), { status: response?.status, details: error });\n};\n\nconst createRetryingFetch = (baseFetch: typeof fetch, log: Logger): typeof fetch => {\n return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const { method, url } = getRequestDetails(input, init);\n const upstreamSignal = getUpstreamSignal(input, init);\n const { requestInput, baseInit, canRetry } = await prepareRetryRequest(\n input,\n init,\n log,\n method,\n url\n );\n let attempt = 0;\n while (true) {\n log.debug(\"Request attempt\", { method, url, attempt: attempt + 1, maxRetries: MAX_RETRIES });\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n let removeAbortListener: (() => void) | null = null;\n\n if (upstreamSignal) {\n if (upstreamSignal.aborted) {\n controller.abort();\n } else {\n const onAbort = () => controller.abort();\n upstreamSignal.addEventListener(\"abort\", onAbort);\n removeAbortListener = () => upstreamSignal.removeEventListener(\"abort\", onAbort);\n }\n }\n\n try {\n const requestInit = { ...(baseInit ?? {}), signal: controller.signal };\n const response = await baseFetch(requestInput, requestInit);\n if (response.status !== RATE_LIMIT_STATUS) return response;\n\n const retryAfter = response.headers.get(\"retry-after\") ?? undefined;\n log.warning(\"Rate limit hit (429)\", {\n method,\n url,\n attempt: attempt + 1,\n maxRetries: MAX_RETRIES,\n retryAfter,\n });\n\n if (!canRetry) {\n log.warning(\"Skipping retry because request body is not replayable\", { method, url });\n return response;\n }\n\n if (attempt >= MAX_RETRIES) {\n log.error(\"Rate limit retries exhausted\", { method, url, attempts: attempt + 1 });\n return response;\n }\n\n const delayMs = getRetryDelayMs(attempt + 1);\n log.info(\"Waiting to retry after rate limit\", {\n method,\n url,\n delayMs,\n nextAttempt: attempt + 2,\n maxRetries: MAX_RETRIES,\n });\n await sleep(delayMs);\n attempt += 1;\n } catch (error) {\n if (controller.signal.aborted) {\n const abortedByCaller = upstreamSignal?.aborted ?? false;\n if (abortedByCaller) {\n log.warning(\"Request aborted by caller\", { method, url, attempt: attempt + 1 });\n } else {\n log.error(\"Request timed out\", {\n method,\n url,\n attempt: attempt + 1,\n timeoutMs: REQUEST_TIMEOUT_MS,\n });\n }\n } else {\n log.error(\"Request failed\", { method, url, attempt: attempt + 1, error });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n removeAbortListener?.();\n }\n }\n };\n};\n\nexport type PriceOSCustomersClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n get(customerId: string): Promise<GetCustomerResponse<TFeatureAccessMap> | null>;\n link(input: LinkCustomerBody): Promise<LinkCustomerResponse<TFeatureAccessMap> | null>;\n create(input: CreateCustomerRequest): Promise<CreateCustomerResponse<TFeatureAccessMap>>;\n update(input: UpdateCustomerBody): Promise<UpdateCustomerResponse<TFeatureAccessMap>>;\n delete(customerId: string): Promise<DeleteCustomerResponse>;\n};\n\nexport type PriceOSFeaturesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n getAccess(customerId: string): Promise<TFeatureAccessMap>;\n};\n\nexport type PriceOSBonusesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n create(\n input: CreateBonusBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<CreateBonusResponse>;\n list(\n input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListBonusesResponse>;\n update(input: UpdateBonusRequest): Promise<UpdateBonusResponse>;\n delete(bonusId: string): Promise<DeleteBonusResponse>;\n};\n\nexport type PriceOSUsageClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n track(\n input: TrackUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageResponse>;\n reset(\n input: ResetUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ResetUsageResponse>;\n deleteEvents(\n input: DeleteUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<DeleteUsageEventsResponse>;\n trackBatch(\n input: TrackUsageBatchBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageBatchResponse>;\n listEvents(\n input: ListUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListUsageEventsResponse>;\n};\n\n// --- Public SDK surface type ---\nexport type PriceOSHttpClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n customers: PriceOSCustomersClient<TFeatureAccessMap>;\n features: PriceOSFeaturesClient<TFeatureAccessMap>;\n bonuses: PriceOSBonusesClient<TFeatureAccessMap>;\n usage: PriceOSUsageClient<TFeatureAccessMap>;\n};\n\nexport class PriceOSError extends Error {\n status?: number;\n details?: unknown;\n\n constructor(message: string, opts?: { status?: number; details?: unknown }) {\n super(message);\n this.name = \"PriceOSError\";\n this.status = opts?.status;\n this.details = opts?.details;\n }\n}\n\nexport class PriceOS<TFeatureAccessMap = GetFeatureAccessResponse>\n implements PriceOSHttpClient<TFeatureAccessMap>\n{\n private client: Client<paths>;\n private header: { \"x-api-key\": string };\n private log: Logger;\n customers: PriceOSCustomersClient<TFeatureAccessMap>;\n features: PriceOSFeaturesClient<TFeatureAccessMap>;\n bonuses: PriceOSBonusesClient<TFeatureAccessMap>;\n usage: PriceOSUsageClient<TFeatureAccessMap>;\n\n constructor(apiKey: string, opts: PriceOSClientOptions = {}) {\n const logLevel = opts.logLevel ?? \"none\";\n this.log = createLogger(logLevel);\n const baseUrl = \"https://api.priceos.com\";\n this.header = { \"x-api-key\": apiKey };\n const fetchWithRetry = createRetryingFetch(fetch, this.log);\n this.client = createClient<paths>({\n baseUrl,\n fetch: fetchWithRetry,\n headers: {\n \"x-api-key\": apiKey,\n },\n });\n\n this.customers = {\n get: async (customerId: string): Promise<GetCustomerResponse<TFeatureAccessMap> | null> => {\n const { data, error, response } = await this.client.GET(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/customers/{customerId}\");\n return (data ?? null) as GetCustomerResponse<TFeatureAccessMap> | null;\n },\n link: async (\n input: LinkCustomerBody\n ): Promise<LinkCustomerResponse<TFeatureAccessMap> | null> => {\n const { data, error, response } = await this.client.POST(\"/v1/customers/link\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/customers/link\");\n return (data ?? null) as LinkCustomerResponse<TFeatureAccessMap> | null;\n },\n create: async (input: CreateCustomerRequest): Promise<CreateCustomerResponse<TFeatureAccessMap>> => {\n const { data, error, response } = await this.client.POST(\"/v1/customers\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/customers\");\n return data! as CreateCustomerResponse<TFeatureAccessMap>;\n },\n update: async (input: UpdateCustomerBody): Promise<UpdateCustomerResponse<TFeatureAccessMap>> => {\n const { customerId, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/customers/{customerId}\");\n return data! as UpdateCustomerResponse<TFeatureAccessMap>;\n },\n delete: async (customerId: string): Promise<DeleteCustomerResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/customers/{customerId}\");\n return data! as DeleteCustomerResponse;\n },\n };\n\n this.features = {\n getAccess: async (customerId: string): Promise<TFeatureAccessMap> => {\n const { data, error, response } = await this.client.GET(\"/v1/feature-access\", {\n params: { query: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/feature-access\");\n return data! as TFeatureAccessMap;\n },\n };\n\n this.bonuses = {\n create: async (\n input: CreateBonusBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<CreateBonusResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/bonuses\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/bonuses\");\n return data!;\n },\n list: async (\n input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListBonusesResponse> => {\n const { data, error, response } = await this.client.GET(\"/v1/bonuses\", {\n params: { header: this.header, query: input },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/bonuses\");\n return data!;\n },\n update: async (input: UpdateBonusRequest): Promise<UpdateBonusResponse> => {\n const { bonusId, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/bonuses/{bonusId}\", {\n params: { header: this.header, path: { bonusId } },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/bonuses/{bonusId}\");\n return data!;\n },\n delete: async (bonusId: string): Promise<DeleteBonusResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/bonuses/{bonusId}\", {\n params: { header: this.header, path: { bonusId } },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/bonuses/{bonusId}\");\n return data!;\n },\n };\n\n this.usage = {\n track: async (\n input: TrackUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage\");\n return data!;\n },\n reset: async (\n input: ResetUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ResetUsageResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/void\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/void\");\n return data!;\n },\n deleteEvents: async (\n input: DeleteUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<DeleteUsageEventsResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/delete\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/delete\");\n return data!;\n },\n trackBatch: async (\n input: TrackUsageBatchBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageBatchResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/batch\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/batch\");\n return data!;\n },\n listEvents: async (\n input: ListUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListUsageEventsResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/events\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/events\");\n return data!;\n },\n };\n }\n}\n"],"mappings":"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","names":["createClient"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client.ts"],"sourcesContent":["export { PriceOS, PriceOSError } from \"./client\";\nexport type {\n PriceOSClientOptions,\n PriceOSLogLevel,\n PriceOSBonusesClient,\n PriceOSCustomersClient,\n PriceOSFeaturesClient,\n PriceOSHttpClient,\n PriceOSUsageClient,\n} from \"./client\";\nexport type {\n CreateBonusBody,\n CreateBonusResponse,\n ListBonusesRequest,\n ListBonusesResponse,\n UpdateBonusBody,\n UpdateBonusRequest,\n UpdateBonusResponse,\n DeleteBonusRequest,\n DeleteBonusResponse,\n CreateCustomerRequest,\n CreateCustomerResponse,\n DeleteUsageEventsBody,\n DeleteUsageEventsResponse,\n DeleteCustomerRequest,\n DeleteCustomerResponse,\n GetCustomerResponse,\n GetFeatureAccessResponse,\n LinkCustomerBody,\n LinkCustomerResponse,\n LimitFeatureKeyFromAccessMap,\n TrackedLimitFeatureKeyFromAccessMap,\n ListUsageEventsBody,\n ListUsageEventsResponse,\n ResetUsageBody,\n ResetUsageResponse,\n UsageEvent,\n TrackUsageBody,\n TrackUsageBatchBody,\n TrackUsageBatchEvent,\n TrackUsageBatchResponse,\n TrackUsageResponse,\n UpdateCustomerBody,\n UpdateCustomerResponse,\n} from \"./types\";\n","import createClient from \"openapi-fetch\";\nimport type { Client } from \"openapi-fetch\";\nimport type { paths } from \"./gen/openapi\";\nimport {\n CreateBonusBody,\n CreateBonusResponse,\n CreateCustomerRequest,\n CreateCustomerResponse,\n DeleteBonusResponse,\n ListBonusesRequest,\n ListBonusesResponse,\n DeleteUsageEventsBody,\n DeleteUsageEventsResponse,\n DeleteCustomerResponse,\n GetCustomerResponse,\n GetFeatureAccessResponse,\n LinkCustomerBody,\n LinkCustomerResponse,\n LimitFeatureKeyFromAccessMap,\n TrackedLimitFeatureKeyFromAccessMap,\n ListUsageEventsBody,\n ListUsageEventsResponse,\n ResetUsageBody,\n ResetUsageResponse,\n UpdateBonusRequest,\n UpdateBonusResponse,\n TrackUsageBody,\n TrackUsageBatchBody,\n TrackUsageBatchResponse,\n TrackUsageResponse,\n UpdateCustomerBody,\n UpdateCustomerResponse,\n} from \"./types\";\n\nexport type PriceOSLogLevel = \"none\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n\n// --- Public options ---\nexport type PriceOSClientOptions = {\n logLevel?: PriceOSLogLevel;\n};\n\nconst RATE_LIMIT_STATUS = 429;\nconst MAX_RETRIES = 4;\nconst BASE_DELAY_MS = 250;\nconst BACKOFF_MULTIPLIER = 2;\nconst JITTER_MS = 250;\nconst RETRY_DELAY_CAP_MS = 5_000;\nconst REQUEST_TIMEOUT_MS = 20_000;\n\nconst LOG_LEVELS: Record<PriceOSLogLevel, number> = {\n none: 0,\n error: 1,\n warning: 2,\n info: 3,\n debug: 4,\n};\n\ntype Logger = {\n error: (message: string, details?: Record<string, unknown>) => void;\n warning: (message: string, details?: Record<string, unknown>) => void;\n info: (message: string, details?: Record<string, unknown>) => void;\n debug: (message: string, details?: Record<string, unknown>) => void;\n};\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst getRetryDelayMs = (retryCount: number): number => {\n const backoff = BASE_DELAY_MS * Math.pow(BACKOFF_MULTIPLIER, retryCount - 1);\n const jitter = Math.random() * JITTER_MS;\n return Math.min(RETRY_DELAY_CAP_MS, backoff + jitter);\n};\n\nconst createLogger = (logLevel: PriceOSLogLevel): Logger => {\n const shouldLog = (level: PriceOSLogLevel): boolean =>\n logLevel !== \"none\" && LOG_LEVELS[level] <= LOG_LEVELS[logLevel];\n\n const write = (\n level: PriceOSLogLevel,\n message: string,\n details?: Record<string, unknown>\n ): void => {\n if (!shouldLog(level)) return;\n const prefix = `[PriceOS] ${level.toUpperCase()}: ${message}`;\n const payload = details && Object.keys(details).length > 0 ? details : undefined;\n\n switch (level) {\n case \"error\":\n payload ? console.error(prefix, payload) : console.error(prefix);\n return;\n case \"warning\":\n payload ? console.warn(prefix, payload) : console.warn(prefix);\n return;\n case \"info\":\n payload ? console.info(prefix, payload) : console.info(prefix);\n return;\n case \"debug\":\n payload ? console.debug(prefix, payload) : console.debug(prefix);\n return;\n }\n };\n\n return {\n error: (message, details) => write(\"error\", message, details),\n warning: (message, details) => write(\"warning\", message, details),\n info: (message, details) => write(\"info\", message, details),\n debug: (message, details) => write(\"debug\", message, details),\n };\n};\n\nconst getUpstreamSignal = (input: RequestInfo | URL, init?: RequestInit): AbortSignal | undefined => {\n if (init?.signal) return init.signal;\n if (typeof Request !== \"undefined\" && input instanceof Request) return input.signal;\n return undefined;\n};\n\nconst stripSignal = (init?: RequestInit): RequestInit | undefined => {\n if (!init) return undefined;\n const { signal: _signal, ...rest } = init;\n return rest;\n};\n\nconst getRequestDetails = (\n input: RequestInfo | URL,\n init?: RequestInit\n): { method: string; url: string } => {\n const method =\n init?.method ??\n (typeof Request !== \"undefined\" && input instanceof Request ? input.method : \"GET\");\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n return { method, url };\n};\n\nconst prepareRetryRequest = async (\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n log: Logger,\n method: string,\n url: string\n): Promise<{ requestInput: RequestInfo | URL; baseInit?: RequestInit; canRetry: boolean }> => {\n if (!(typeof Request !== \"undefined\" && input instanceof Request)) {\n return { requestInput: input, baseInit: stripSignal(init), canRetry: true };\n }\n\n if (input.bodyUsed) {\n log.warning(\"Request body already used; retries disabled\", { method, url });\n return { requestInput: input, baseInit: stripSignal(init), canRetry: false };\n }\n\n let body: BodyInit | undefined = undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n try {\n body = await input.clone().arrayBuffer();\n } catch (error) {\n log.warning(\"Unable to clone request body; retries disabled\", { method, url, error });\n return { requestInput: input, baseInit: stripSignal(init), canRetry: false };\n }\n }\n\n const headers = new Headers(input.headers);\n const baseInit = { ...stripSignal(init), method, headers, body };\n return { requestInput: input.url, baseInit, canRetry: true };\n};\n\nconst getErrorMessage = (error: unknown): string => {\n const maybeError = error as { error?: unknown } | null;\n if (maybeError && typeof maybeError.error === \"string\") return maybeError.error;\n return \"Request failed\";\n};\n\nconst throwRequestError = (\n log: Logger,\n error: unknown,\n response: Response | undefined,\n context: string\n): never => {\n log.error(\"Request failed\", { context, status: response?.status, error });\n throw new PriceOSError(getErrorMessage(error), { status: response?.status, details: error });\n};\n\nconst createRetryingFetch = (baseFetch: typeof fetch, log: Logger): typeof fetch => {\n return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const { method, url } = getRequestDetails(input, init);\n const upstreamSignal = getUpstreamSignal(input, init);\n const { requestInput, baseInit, canRetry } = await prepareRetryRequest(\n input,\n init,\n log,\n method,\n url\n );\n let attempt = 0;\n while (true) {\n log.debug(\"Request attempt\", { method, url, attempt: attempt + 1, maxRetries: MAX_RETRIES });\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n let removeAbortListener: (() => void) | null = null;\n\n if (upstreamSignal) {\n if (upstreamSignal.aborted) {\n controller.abort();\n } else {\n const onAbort = () => controller.abort();\n upstreamSignal.addEventListener(\"abort\", onAbort);\n removeAbortListener = () => upstreamSignal.removeEventListener(\"abort\", onAbort);\n }\n }\n\n try {\n const requestInit = { ...(baseInit ?? {}), signal: controller.signal };\n const response = await baseFetch(requestInput, requestInit);\n if (response.status !== RATE_LIMIT_STATUS) return response;\n\n const retryAfter = response.headers.get(\"retry-after\") ?? undefined;\n log.warning(\"Rate limit hit (429)\", {\n method,\n url,\n attempt: attempt + 1,\n maxRetries: MAX_RETRIES,\n retryAfter,\n });\n\n if (!canRetry) {\n log.warning(\"Skipping retry because request body is not replayable\", { method, url });\n return response;\n }\n\n if (attempt >= MAX_RETRIES) {\n log.error(\"Rate limit retries exhausted\", { method, url, attempts: attempt + 1 });\n return response;\n }\n\n const delayMs = getRetryDelayMs(attempt + 1);\n log.info(\"Waiting to retry after rate limit\", {\n method,\n url,\n delayMs,\n nextAttempt: attempt + 2,\n maxRetries: MAX_RETRIES,\n });\n await sleep(delayMs);\n attempt += 1;\n } catch (error) {\n if (controller.signal.aborted) {\n const abortedByCaller = upstreamSignal?.aborted ?? false;\n if (abortedByCaller) {\n log.warning(\"Request aborted by caller\", { method, url, attempt: attempt + 1 });\n } else {\n log.error(\"Request timed out\", {\n method,\n url,\n attempt: attempt + 1,\n timeoutMs: REQUEST_TIMEOUT_MS,\n });\n }\n } else {\n log.error(\"Request failed\", { method, url, attempt: attempt + 1, error });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n removeAbortListener?.();\n }\n }\n };\n};\n\nexport type PriceOSCustomersClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n get(customerId: string): Promise<GetCustomerResponse<TFeatureAccessMap> | null>;\n link(input: LinkCustomerBody): Promise<LinkCustomerResponse<TFeatureAccessMap> | null>;\n create(input: CreateCustomerRequest): Promise<CreateCustomerResponse<TFeatureAccessMap>>;\n update(input: UpdateCustomerBody): Promise<UpdateCustomerResponse<TFeatureAccessMap>>;\n delete(customerId: string): Promise<DeleteCustomerResponse>;\n};\n\nexport type PriceOSFeaturesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n getAccess(customerId: string): Promise<TFeatureAccessMap>;\n};\n\nexport type PriceOSBonusesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n create(\n input: CreateBonusBody<TrackedLimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<CreateBonusResponse>;\n list(\n input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListBonusesResponse>;\n update(input: UpdateBonusRequest): Promise<UpdateBonusResponse>;\n delete(bonusId: string): Promise<DeleteBonusResponse>;\n};\n\nexport type PriceOSUsageClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n track(\n input: TrackUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageResponse>;\n reset(\n input: ResetUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ResetUsageResponse>;\n deleteEvents(\n input: DeleteUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<DeleteUsageEventsResponse>;\n trackBatch(\n input: TrackUsageBatchBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageBatchResponse>;\n listEvents(\n input: ListUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListUsageEventsResponse>;\n};\n\n// --- Public SDK surface type ---\nexport type PriceOSHttpClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n customers: PriceOSCustomersClient<TFeatureAccessMap>;\n features: PriceOSFeaturesClient<TFeatureAccessMap>;\n bonuses: PriceOSBonusesClient<TFeatureAccessMap>;\n usage: PriceOSUsageClient<TFeatureAccessMap>;\n};\n\nexport class PriceOSError extends Error {\n status?: number;\n details?: unknown;\n\n constructor(message: string, opts?: { status?: number; details?: unknown }) {\n super(message);\n this.name = \"PriceOSError\";\n this.status = opts?.status;\n this.details = opts?.details;\n }\n}\n\nexport class PriceOS<TFeatureAccessMap = GetFeatureAccessResponse>\n implements PriceOSHttpClient<TFeatureAccessMap>\n{\n private client: Client<paths>;\n private header: { \"x-api-key\": string };\n private log: Logger;\n customers: PriceOSCustomersClient<TFeatureAccessMap>;\n features: PriceOSFeaturesClient<TFeatureAccessMap>;\n bonuses: PriceOSBonusesClient<TFeatureAccessMap>;\n usage: PriceOSUsageClient<TFeatureAccessMap>;\n\n constructor(apiKey: string, opts: PriceOSClientOptions = {}) {\n const logLevel = opts.logLevel ?? \"none\";\n this.log = createLogger(logLevel);\n const baseUrl = \"https://api.priceos.com\";\n this.header = { \"x-api-key\": apiKey };\n const fetchWithRetry = createRetryingFetch(fetch, this.log);\n this.client = createClient<paths>({\n baseUrl,\n fetch: fetchWithRetry,\n headers: {\n \"x-api-key\": apiKey,\n },\n });\n\n this.customers = {\n get: async (customerId: string): Promise<GetCustomerResponse<TFeatureAccessMap> | null> => {\n const { data, error, response } = await this.client.GET(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/customers/{customerId}\");\n return (data ?? null) as GetCustomerResponse<TFeatureAccessMap> | null;\n },\n link: async (\n input: LinkCustomerBody\n ): Promise<LinkCustomerResponse<TFeatureAccessMap> | null> => {\n const { data, error, response } = await this.client.POST(\"/v1/customers/link\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/customers/link\");\n return (data ?? null) as LinkCustomerResponse<TFeatureAccessMap> | null;\n },\n create: async (input: CreateCustomerRequest): Promise<CreateCustomerResponse<TFeatureAccessMap>> => {\n const { data, error, response } = await this.client.POST(\"/v1/customers\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/customers\");\n return data! as CreateCustomerResponse<TFeatureAccessMap>;\n },\n update: async (input: UpdateCustomerBody): Promise<UpdateCustomerResponse<TFeatureAccessMap>> => {\n const { customerId, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/customers/{customerId}\");\n return data! as UpdateCustomerResponse<TFeatureAccessMap>;\n },\n delete: async (customerId: string): Promise<DeleteCustomerResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/customers/{customerId}\");\n return data! as DeleteCustomerResponse;\n },\n };\n\n this.features = {\n getAccess: async (customerId: string): Promise<TFeatureAccessMap> => {\n const { data, error, response } = await this.client.GET(\"/v1/feature-access\", {\n params: { query: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/feature-access\");\n return data! as TFeatureAccessMap;\n },\n };\n\n this.bonuses = {\n create: async (\n input: CreateBonusBody<TrackedLimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<CreateBonusResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/bonuses\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/bonuses\");\n return data!;\n },\n list: async (\n input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListBonusesResponse> => {\n const { data, error, response } = await this.client.GET(\"/v1/bonuses\", {\n params: { header: this.header, query: input },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/bonuses\");\n return data!;\n },\n update: async (input: UpdateBonusRequest): Promise<UpdateBonusResponse> => {\n const { bonusId, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/bonuses/{bonusId}\", {\n params: { header: this.header, path: { bonusId } },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/bonuses/{bonusId}\");\n return data!;\n },\n delete: async (bonusId: string): Promise<DeleteBonusResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/bonuses/{bonusId}\", {\n params: { header: this.header, path: { bonusId } },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/bonuses/{bonusId}\");\n return data!;\n },\n };\n\n this.usage = {\n track: async (\n input: TrackUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage\");\n return data!;\n },\n reset: async (\n input: ResetUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ResetUsageResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/void\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/void\");\n return data!;\n },\n deleteEvents: async (\n input: DeleteUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<DeleteUsageEventsResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/delete\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/delete\");\n return data!;\n },\n trackBatch: async (\n input: TrackUsageBatchBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageBatchResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/batch\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/batch\");\n return data!;\n },\n listEvents: async (\n input: ListUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListUsageEventsResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/events\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/events\");\n return data!;\n },\n };\n }\n}\n"],"mappings":"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","names":["createClient"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -42,6 +42,7 @@ interface paths {
|
|
|
42
42
|
* "stripeCustomerId": "cus_abc123",
|
|
43
43
|
* "name": "Ada Lovelace",
|
|
44
44
|
* "email": "ada@example.com",
|
|
45
|
+
* "created": 1735689600000,
|
|
45
46
|
* "usageStartedAt": 1735689600000,
|
|
46
47
|
* "enviroment": "test",
|
|
47
48
|
* "products": [
|
|
@@ -80,17 +81,11 @@ interface paths {
|
|
|
80
81
|
* "type": "limit",
|
|
81
82
|
* "limit": 1000,
|
|
82
83
|
* "isUnlimited": false,
|
|
83
|
-
* "used": 120,
|
|
84
|
-
* "remaining": 880,
|
|
85
|
-
* "bonusRemaining": 25,
|
|
86
|
-
* "bonusUsed": 5,
|
|
87
84
|
* "usage": {
|
|
88
85
|
* "used": 120,
|
|
89
86
|
* "remaining": 880,
|
|
90
87
|
* "bonusRemaining": 25,
|
|
91
88
|
* "bonusUsed": 5,
|
|
92
|
-
* "resetsWhen": "billing_period",
|
|
93
|
-
* "resetType": "month",
|
|
94
89
|
* "nextReset": 1738368000000,
|
|
95
90
|
* "lastReset": 1735689600000
|
|
96
91
|
* }
|
|
@@ -126,6 +121,8 @@ interface paths {
|
|
|
126
121
|
name?: string;
|
|
127
122
|
/** @description Customer email address. */
|
|
128
123
|
email?: string;
|
|
124
|
+
/** @description Unix timestamp (ms) when the customer was created. */
|
|
125
|
+
created?: number;
|
|
129
126
|
/** @description Unix timestamp (ms) when usage tracking started. */
|
|
130
127
|
usageStartedAt?: number;
|
|
131
128
|
/**
|
|
@@ -209,16 +206,8 @@ interface paths {
|
|
|
209
206
|
isUnlimited: boolean;
|
|
210
207
|
/** @description Limit for the feature, when applicable. */
|
|
211
208
|
limit: number | null;
|
|
212
|
-
/** @description Usage
|
|
213
|
-
|
|
214
|
-
/** @description Remaining base limit (limit - used). */
|
|
215
|
-
remaining: number | null;
|
|
216
|
-
/** @description Remaining bonus amount. */
|
|
217
|
-
bonusRemaining: number;
|
|
218
|
-
/** @description Bonus amount consumed. */
|
|
219
|
-
bonusUsed: number;
|
|
220
|
-
/** @description Usage details for the feature. */
|
|
221
|
-
usage: {
|
|
209
|
+
/** @description Usage details for tracked features. */
|
|
210
|
+
usage?: {
|
|
222
211
|
/** @description Usage consumed for the feature. */
|
|
223
212
|
used: number;
|
|
224
213
|
/** @description Remaining base limit (limit - used). */
|
|
@@ -227,16 +216,6 @@ interface paths {
|
|
|
227
216
|
bonusRemaining: number;
|
|
228
217
|
/** @description Bonus amount consumed. */
|
|
229
218
|
bonusUsed: number;
|
|
230
|
-
/**
|
|
231
|
-
* @description When usage resets are anchored.
|
|
232
|
-
* @enum {string}
|
|
233
|
-
*/
|
|
234
|
-
resetsWhen: "billing_period" | "calendar";
|
|
235
|
-
/**
|
|
236
|
-
* @description How frequently usage resets.
|
|
237
|
-
* @enum {string}
|
|
238
|
-
*/
|
|
239
|
-
resetType: "never" | "day" | "week" | "month" | "year";
|
|
240
219
|
/** @description Unix timestamp (ms) for the next reset, when applicable. */
|
|
241
220
|
nextReset: number | null;
|
|
242
221
|
/** @description Unix timestamp (ms) for the last reset, when applicable. */
|
|
@@ -355,6 +334,7 @@ interface paths {
|
|
|
355
334
|
* "stripeCustomerId": "cus_abc123",
|
|
356
335
|
* "name": "Ada Lovelace",
|
|
357
336
|
* "email": "ada@example.com",
|
|
337
|
+
* "created": 1735689600000,
|
|
358
338
|
* "usageStartedAt": 1735689600000,
|
|
359
339
|
* "enviroment": "test",
|
|
360
340
|
* "products": [
|
|
@@ -393,17 +373,11 @@ interface paths {
|
|
|
393
373
|
* "type": "limit",
|
|
394
374
|
* "limit": 1000,
|
|
395
375
|
* "isUnlimited": false,
|
|
396
|
-
* "used": 120,
|
|
397
|
-
* "remaining": 880,
|
|
398
|
-
* "bonusRemaining": 25,
|
|
399
|
-
* "bonusUsed": 5,
|
|
400
376
|
* "usage": {
|
|
401
377
|
* "used": 120,
|
|
402
378
|
* "remaining": 880,
|
|
403
379
|
* "bonusRemaining": 25,
|
|
404
380
|
* "bonusUsed": 5,
|
|
405
|
-
* "resetsWhen": "billing_period",
|
|
406
|
-
* "resetType": "month",
|
|
407
381
|
* "nextReset": 1738368000000,
|
|
408
382
|
* "lastReset": 1735689600000
|
|
409
383
|
* }
|
|
@@ -439,6 +413,8 @@ interface paths {
|
|
|
439
413
|
name?: string;
|
|
440
414
|
/** @description Customer email address. */
|
|
441
415
|
email?: string;
|
|
416
|
+
/** @description Unix timestamp (ms) when the customer was created. */
|
|
417
|
+
created?: number;
|
|
442
418
|
/** @description Unix timestamp (ms) when usage tracking started. */
|
|
443
419
|
usageStartedAt?: number;
|
|
444
420
|
/**
|
|
@@ -522,16 +498,8 @@ interface paths {
|
|
|
522
498
|
isUnlimited: boolean;
|
|
523
499
|
/** @description Limit for the feature, when applicable. */
|
|
524
500
|
limit: number | null;
|
|
525
|
-
/** @description Usage
|
|
526
|
-
|
|
527
|
-
/** @description Remaining base limit (limit - used). */
|
|
528
|
-
remaining: number | null;
|
|
529
|
-
/** @description Remaining bonus amount. */
|
|
530
|
-
bonusRemaining: number;
|
|
531
|
-
/** @description Bonus amount consumed. */
|
|
532
|
-
bonusUsed: number;
|
|
533
|
-
/** @description Usage details for the feature. */
|
|
534
|
-
usage: {
|
|
501
|
+
/** @description Usage details for tracked features. */
|
|
502
|
+
usage?: {
|
|
535
503
|
/** @description Usage consumed for the feature. */
|
|
536
504
|
used: number;
|
|
537
505
|
/** @description Remaining base limit (limit - used). */
|
|
@@ -540,16 +508,6 @@ interface paths {
|
|
|
540
508
|
bonusRemaining: number;
|
|
541
509
|
/** @description Bonus amount consumed. */
|
|
542
510
|
bonusUsed: number;
|
|
543
|
-
/**
|
|
544
|
-
* @description When usage resets are anchored.
|
|
545
|
-
* @enum {string}
|
|
546
|
-
*/
|
|
547
|
-
resetsWhen: "billing_period" | "calendar";
|
|
548
|
-
/**
|
|
549
|
-
* @description How frequently usage resets.
|
|
550
|
-
* @enum {string}
|
|
551
|
-
*/
|
|
552
|
-
resetType: "never" | "day" | "week" | "month" | "year";
|
|
553
511
|
/** @description Unix timestamp (ms) for the next reset, when applicable. */
|
|
554
512
|
nextReset: number | null;
|
|
555
513
|
/** @description Unix timestamp (ms) for the last reset, when applicable. */
|
|
@@ -775,6 +733,7 @@ interface paths {
|
|
|
775
733
|
* "stripeCustomerId": "cus_abc123",
|
|
776
734
|
* "name": "Ada Lovelace",
|
|
777
735
|
* "email": "ada@example.com",
|
|
736
|
+
* "created": 1735689600000,
|
|
778
737
|
* "usageStartedAt": 1735689600000,
|
|
779
738
|
* "enviroment": "test",
|
|
780
739
|
* "products": [
|
|
@@ -813,17 +772,11 @@ interface paths {
|
|
|
813
772
|
* "type": "limit",
|
|
814
773
|
* "limit": 1000,
|
|
815
774
|
* "isUnlimited": false,
|
|
816
|
-
* "used": 120,
|
|
817
|
-
* "remaining": 880,
|
|
818
|
-
* "bonusRemaining": 25,
|
|
819
|
-
* "bonusUsed": 5,
|
|
820
775
|
* "usage": {
|
|
821
776
|
* "used": 120,
|
|
822
777
|
* "remaining": 880,
|
|
823
778
|
* "bonusRemaining": 25,
|
|
824
779
|
* "bonusUsed": 5,
|
|
825
|
-
* "resetsWhen": "billing_period",
|
|
826
|
-
* "resetType": "month",
|
|
827
780
|
* "nextReset": 1738368000000,
|
|
828
781
|
* "lastReset": 1735689600000
|
|
829
782
|
* }
|
|
@@ -859,6 +812,8 @@ interface paths {
|
|
|
859
812
|
name?: string;
|
|
860
813
|
/** @description Customer email address. */
|
|
861
814
|
email?: string;
|
|
815
|
+
/** @description Unix timestamp (ms) when the customer was created. */
|
|
816
|
+
created?: number;
|
|
862
817
|
/** @description Unix timestamp (ms) when usage tracking started. */
|
|
863
818
|
usageStartedAt?: number;
|
|
864
819
|
/**
|
|
@@ -942,16 +897,8 @@ interface paths {
|
|
|
942
897
|
isUnlimited: boolean;
|
|
943
898
|
/** @description Limit for the feature, when applicable. */
|
|
944
899
|
limit: number | null;
|
|
945
|
-
/** @description Usage
|
|
946
|
-
|
|
947
|
-
/** @description Remaining base limit (limit - used). */
|
|
948
|
-
remaining: number | null;
|
|
949
|
-
/** @description Remaining bonus amount. */
|
|
950
|
-
bonusRemaining: number;
|
|
951
|
-
/** @description Bonus amount consumed. */
|
|
952
|
-
bonusUsed: number;
|
|
953
|
-
/** @description Usage details for the feature. */
|
|
954
|
-
usage: {
|
|
900
|
+
/** @description Usage details for tracked features. */
|
|
901
|
+
usage?: {
|
|
955
902
|
/** @description Usage consumed for the feature. */
|
|
956
903
|
used: number;
|
|
957
904
|
/** @description Remaining base limit (limit - used). */
|
|
@@ -960,16 +907,6 @@ interface paths {
|
|
|
960
907
|
bonusRemaining: number;
|
|
961
908
|
/** @description Bonus amount consumed. */
|
|
962
909
|
bonusUsed: number;
|
|
963
|
-
/**
|
|
964
|
-
* @description When usage resets are anchored.
|
|
965
|
-
* @enum {string}
|
|
966
|
-
*/
|
|
967
|
-
resetsWhen: "billing_period" | "calendar";
|
|
968
|
-
/**
|
|
969
|
-
* @description How frequently usage resets.
|
|
970
|
-
* @enum {string}
|
|
971
|
-
*/
|
|
972
|
-
resetType: "never" | "day" | "week" | "month" | "year";
|
|
973
910
|
/** @description Unix timestamp (ms) for the next reset, when applicable. */
|
|
974
911
|
nextReset: number | null;
|
|
975
912
|
/** @description Unix timestamp (ms) for the last reset, when applicable. */
|
|
@@ -1108,6 +1045,7 @@ interface paths {
|
|
|
1108
1045
|
* "stripeCustomerId": "cus_abc123",
|
|
1109
1046
|
* "name": "Ada Lovelace",
|
|
1110
1047
|
* "email": "ada@example.com",
|
|
1048
|
+
* "created": 1735689600000,
|
|
1111
1049
|
* "usageStartedAt": 1735689600000,
|
|
1112
1050
|
* "enviroment": "test",
|
|
1113
1051
|
* "products": [
|
|
@@ -1146,17 +1084,11 @@ interface paths {
|
|
|
1146
1084
|
* "type": "limit",
|
|
1147
1085
|
* "limit": 1000,
|
|
1148
1086
|
* "isUnlimited": false,
|
|
1149
|
-
* "used": 120,
|
|
1150
|
-
* "remaining": 880,
|
|
1151
|
-
* "bonusRemaining": 25,
|
|
1152
|
-
* "bonusUsed": 5,
|
|
1153
1087
|
* "usage": {
|
|
1154
1088
|
* "used": 120,
|
|
1155
1089
|
* "remaining": 880,
|
|
1156
1090
|
* "bonusRemaining": 25,
|
|
1157
1091
|
* "bonusUsed": 5,
|
|
1158
|
-
* "resetsWhen": "billing_period",
|
|
1159
|
-
* "resetType": "month",
|
|
1160
1092
|
* "nextReset": 1738368000000,
|
|
1161
1093
|
* "lastReset": 1735689600000
|
|
1162
1094
|
* }
|
|
@@ -1192,6 +1124,8 @@ interface paths {
|
|
|
1192
1124
|
name?: string;
|
|
1193
1125
|
/** @description Customer email address. */
|
|
1194
1126
|
email?: string;
|
|
1127
|
+
/** @description Unix timestamp (ms) when the customer was created. */
|
|
1128
|
+
created?: number;
|
|
1195
1129
|
/** @description Unix timestamp (ms) when usage tracking started. */
|
|
1196
1130
|
usageStartedAt?: number;
|
|
1197
1131
|
/**
|
|
@@ -1275,16 +1209,8 @@ interface paths {
|
|
|
1275
1209
|
isUnlimited: boolean;
|
|
1276
1210
|
/** @description Limit for the feature, when applicable. */
|
|
1277
1211
|
limit: number | null;
|
|
1278
|
-
/** @description Usage
|
|
1279
|
-
|
|
1280
|
-
/** @description Remaining base limit (limit - used). */
|
|
1281
|
-
remaining: number | null;
|
|
1282
|
-
/** @description Remaining bonus amount. */
|
|
1283
|
-
bonusRemaining: number;
|
|
1284
|
-
/** @description Bonus amount consumed. */
|
|
1285
|
-
bonusUsed: number;
|
|
1286
|
-
/** @description Usage details for the feature. */
|
|
1287
|
-
usage: {
|
|
1212
|
+
/** @description Usage details for tracked features. */
|
|
1213
|
+
usage?: {
|
|
1288
1214
|
/** @description Usage consumed for the feature. */
|
|
1289
1215
|
used: number;
|
|
1290
1216
|
/** @description Remaining base limit (limit - used). */
|
|
@@ -1293,16 +1219,6 @@ interface paths {
|
|
|
1293
1219
|
bonusRemaining: number;
|
|
1294
1220
|
/** @description Bonus amount consumed. */
|
|
1295
1221
|
bonusUsed: number;
|
|
1296
|
-
/**
|
|
1297
|
-
* @description When usage resets are anchored.
|
|
1298
|
-
* @enum {string}
|
|
1299
|
-
*/
|
|
1300
|
-
resetsWhen: "billing_period" | "calendar";
|
|
1301
|
-
/**
|
|
1302
|
-
* @description How frequently usage resets.
|
|
1303
|
-
* @enum {string}
|
|
1304
|
-
*/
|
|
1305
|
-
resetType: "never" | "day" | "week" | "month" | "year";
|
|
1306
1222
|
/** @description Unix timestamp (ms) for the next reset, when applicable. */
|
|
1307
1223
|
nextReset: number | null;
|
|
1308
1224
|
/** @description Unix timestamp (ms) for the last reset, when applicable. */
|
|
@@ -1446,17 +1362,11 @@ interface paths {
|
|
|
1446
1362
|
* "type": "limit",
|
|
1447
1363
|
* "limit": 1000,
|
|
1448
1364
|
* "isUnlimited": false,
|
|
1449
|
-
* "used": 120,
|
|
1450
|
-
* "remaining": 880,
|
|
1451
|
-
* "bonusRemaining": 25,
|
|
1452
|
-
* "bonusUsed": 5,
|
|
1453
1365
|
* "usage": {
|
|
1454
1366
|
* "used": 120,
|
|
1455
1367
|
* "remaining": 880,
|
|
1456
1368
|
* "bonusRemaining": 25,
|
|
1457
1369
|
* "bonusUsed": 5,
|
|
1458
|
-
* "resetsWhen": "billing_period",
|
|
1459
|
-
* "resetType": "month",
|
|
1460
1370
|
* "nextReset": 1738368000000,
|
|
1461
1371
|
* "lastReset": 1735689600000
|
|
1462
1372
|
* }
|
|
@@ -1488,16 +1398,8 @@ interface paths {
|
|
|
1488
1398
|
isUnlimited: boolean;
|
|
1489
1399
|
/** @description Limit for the feature, when applicable. */
|
|
1490
1400
|
limit: number | null;
|
|
1491
|
-
/** @description Usage
|
|
1492
|
-
|
|
1493
|
-
/** @description Remaining base limit (limit - used). */
|
|
1494
|
-
remaining: number | null;
|
|
1495
|
-
/** @description Remaining bonus amount. */
|
|
1496
|
-
bonusRemaining: number;
|
|
1497
|
-
/** @description Bonus amount consumed. */
|
|
1498
|
-
bonusUsed: number;
|
|
1499
|
-
/** @description Usage details for the feature. */
|
|
1500
|
-
usage: {
|
|
1401
|
+
/** @description Usage details for tracked features. */
|
|
1402
|
+
usage?: {
|
|
1501
1403
|
/** @description Usage consumed for the feature. */
|
|
1502
1404
|
used: number;
|
|
1503
1405
|
/** @description Remaining base limit (limit - used). */
|
|
@@ -1506,16 +1408,6 @@ interface paths {
|
|
|
1506
1408
|
bonusRemaining: number;
|
|
1507
1409
|
/** @description Bonus amount consumed. */
|
|
1508
1410
|
bonusUsed: number;
|
|
1509
|
-
/**
|
|
1510
|
-
* @description When usage resets are anchored.
|
|
1511
|
-
* @enum {string}
|
|
1512
|
-
*/
|
|
1513
|
-
resetsWhen: "billing_period" | "calendar";
|
|
1514
|
-
/**
|
|
1515
|
-
* @description How frequently usage resets.
|
|
1516
|
-
* @enum {string}
|
|
1517
|
-
*/
|
|
1518
|
-
resetType: "never" | "day" | "week" | "month" | "year";
|
|
1519
1411
|
/** @description Unix timestamp (ms) for the next reset, when applicable. */
|
|
1520
1412
|
nextReset: number | null;
|
|
1521
1413
|
/** @description Unix timestamp (ms) for the last reset, when applicable. */
|
|
@@ -2773,13 +2665,18 @@ type LinkCustomerResponse<TFeatureAccessMap = GetFeatureAccessResponse> = WithFe
|
|
|
2773
2665
|
type GetFeatureAccessResponse = paths["/v1/feature-access"]["get"]["responses"][200]["content"]["application/json"];
|
|
2774
2666
|
type IsAny<T> = 0 extends (1 & T) ? true : false;
|
|
2775
2667
|
type LimitFeatureKeyFromEntries<TFeatureAccessMap> = ({
|
|
2776
|
-
[K in keyof TFeatureAccessMap]:
|
|
2668
|
+
[K in keyof TFeatureAccessMap]: TFeatureAccessMap[K] extends {
|
|
2777
2669
|
type: "limit";
|
|
2778
2670
|
} ? K : never;
|
|
2779
2671
|
}[keyof TFeatureAccessMap] & string);
|
|
2780
|
-
type LimitFeatureKeyFromAccessMap<TFeatureAccessMap> = IsAny<TFeatureAccessMap> extends true ? string : TFeatureAccessMap extends
|
|
2781
|
-
|
|
2782
|
-
|
|
2672
|
+
type LimitFeatureKeyFromAccessMap<TFeatureAccessMap> = IsAny<TFeatureAccessMap> extends true ? string : LimitFeatureKeyFromEntries<TFeatureAccessMap> extends never ? string : LimitFeatureKeyFromEntries<TFeatureAccessMap>;
|
|
2673
|
+
type TrackedLimitFeatureKeyFromEntries<TFeatureAccessMap> = ({
|
|
2674
|
+
[K in keyof TFeatureAccessMap]: Extract<TFeatureAccessMap[K], {
|
|
2675
|
+
type: "limit";
|
|
2676
|
+
usage: unknown;
|
|
2677
|
+
}> extends never ? never : K;
|
|
2678
|
+
}[keyof TFeatureAccessMap] & string);
|
|
2679
|
+
type TrackedLimitFeatureKeyFromAccessMap<TFeatureAccessMap> = IsAny<TFeatureAccessMap> extends true ? string : TrackedLimitFeatureKeyFromEntries<TFeatureAccessMap> extends never ? string : TrackedLimitFeatureKeyFromEntries<TFeatureAccessMap>;
|
|
2783
2680
|
type TrackUsageBodyBase = paths["/v1/usage"]["post"]["requestBody"]["content"]["application/json"];
|
|
2784
2681
|
type TrackUsageBody<TFeatureKey extends string = TrackUsageBodyBase["featureKey"]> = Omit<TrackUsageBodyBase, "featureKey"> & {
|
|
2785
2682
|
featureKey: TFeatureKey;
|
|
@@ -2843,7 +2740,7 @@ type PriceOSFeaturesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {
|
|
|
2843
2740
|
getAccess(customerId: string): Promise<TFeatureAccessMap>;
|
|
2844
2741
|
};
|
|
2845
2742
|
type PriceOSBonusesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {
|
|
2846
|
-
create(input: CreateBonusBody<
|
|
2743
|
+
create(input: CreateBonusBody<TrackedLimitFeatureKeyFromAccessMap<TFeatureAccessMap>>): Promise<CreateBonusResponse>;
|
|
2847
2744
|
list(input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>): Promise<ListBonusesResponse>;
|
|
2848
2745
|
update(input: UpdateBonusRequest): Promise<UpdateBonusResponse>;
|
|
2849
2746
|
delete(bonusId: string): Promise<DeleteBonusResponse>;
|
|
@@ -2880,4 +2777,4 @@ declare class PriceOS<TFeatureAccessMap = GetFeatureAccessResponse> implements P
|
|
|
2880
2777
|
constructor(apiKey: string, opts?: PriceOSClientOptions);
|
|
2881
2778
|
}
|
|
2882
2779
|
|
|
2883
|
-
export { type CreateBonusBody, type CreateBonusResponse, type CreateCustomerRequest, type CreateCustomerResponse, type DeleteBonusRequest, type DeleteBonusResponse, type DeleteCustomerRequest, type DeleteCustomerResponse, type DeleteUsageEventsBody, type DeleteUsageEventsResponse, type GetCustomerResponse, type GetFeatureAccessResponse, type LimitFeatureKeyFromAccessMap, type LinkCustomerBody, type LinkCustomerResponse, type ListBonusesRequest, type ListBonusesResponse, type ListUsageEventsBody, type ListUsageEventsResponse, PriceOS, type PriceOSBonusesClient, type PriceOSClientOptions, type PriceOSCustomersClient, PriceOSError, type PriceOSFeaturesClient, type PriceOSHttpClient, type PriceOSLogLevel, type PriceOSUsageClient, type ResetUsageBody, type ResetUsageResponse, type TrackUsageBatchBody, type TrackUsageBatchEvent, type TrackUsageBatchResponse, type TrackUsageBody, type TrackUsageResponse, type UpdateBonusBody, type UpdateBonusRequest, type UpdateBonusResponse, type UpdateCustomerBody, type UpdateCustomerResponse, type UsageEvent };
|
|
2780
|
+
export { type CreateBonusBody, type CreateBonusResponse, type CreateCustomerRequest, type CreateCustomerResponse, type DeleteBonusRequest, type DeleteBonusResponse, type DeleteCustomerRequest, type DeleteCustomerResponse, type DeleteUsageEventsBody, type DeleteUsageEventsResponse, type GetCustomerResponse, type GetFeatureAccessResponse, type LimitFeatureKeyFromAccessMap, type LinkCustomerBody, type LinkCustomerResponse, type ListBonusesRequest, type ListBonusesResponse, type ListUsageEventsBody, type ListUsageEventsResponse, PriceOS, type PriceOSBonusesClient, type PriceOSClientOptions, type PriceOSCustomersClient, PriceOSError, type PriceOSFeaturesClient, type PriceOSHttpClient, type PriceOSLogLevel, type PriceOSUsageClient, type ResetUsageBody, type ResetUsageResponse, type TrackUsageBatchBody, type TrackUsageBatchEvent, type TrackUsageBatchResponse, type TrackUsageBody, type TrackUsageResponse, type TrackedLimitFeatureKeyFromAccessMap, type UpdateBonusBody, type UpdateBonusRequest, type UpdateBonusResponse, type UpdateCustomerBody, type UpdateCustomerResponse, type UsageEvent };
|
package/dist/index.d.ts
CHANGED
|
@@ -42,6 +42,7 @@ interface paths {
|
|
|
42
42
|
* "stripeCustomerId": "cus_abc123",
|
|
43
43
|
* "name": "Ada Lovelace",
|
|
44
44
|
* "email": "ada@example.com",
|
|
45
|
+
* "created": 1735689600000,
|
|
45
46
|
* "usageStartedAt": 1735689600000,
|
|
46
47
|
* "enviroment": "test",
|
|
47
48
|
* "products": [
|
|
@@ -80,17 +81,11 @@ interface paths {
|
|
|
80
81
|
* "type": "limit",
|
|
81
82
|
* "limit": 1000,
|
|
82
83
|
* "isUnlimited": false,
|
|
83
|
-
* "used": 120,
|
|
84
|
-
* "remaining": 880,
|
|
85
|
-
* "bonusRemaining": 25,
|
|
86
|
-
* "bonusUsed": 5,
|
|
87
84
|
* "usage": {
|
|
88
85
|
* "used": 120,
|
|
89
86
|
* "remaining": 880,
|
|
90
87
|
* "bonusRemaining": 25,
|
|
91
88
|
* "bonusUsed": 5,
|
|
92
|
-
* "resetsWhen": "billing_period",
|
|
93
|
-
* "resetType": "month",
|
|
94
89
|
* "nextReset": 1738368000000,
|
|
95
90
|
* "lastReset": 1735689600000
|
|
96
91
|
* }
|
|
@@ -126,6 +121,8 @@ interface paths {
|
|
|
126
121
|
name?: string;
|
|
127
122
|
/** @description Customer email address. */
|
|
128
123
|
email?: string;
|
|
124
|
+
/** @description Unix timestamp (ms) when the customer was created. */
|
|
125
|
+
created?: number;
|
|
129
126
|
/** @description Unix timestamp (ms) when usage tracking started. */
|
|
130
127
|
usageStartedAt?: number;
|
|
131
128
|
/**
|
|
@@ -209,16 +206,8 @@ interface paths {
|
|
|
209
206
|
isUnlimited: boolean;
|
|
210
207
|
/** @description Limit for the feature, when applicable. */
|
|
211
208
|
limit: number | null;
|
|
212
|
-
/** @description Usage
|
|
213
|
-
|
|
214
|
-
/** @description Remaining base limit (limit - used). */
|
|
215
|
-
remaining: number | null;
|
|
216
|
-
/** @description Remaining bonus amount. */
|
|
217
|
-
bonusRemaining: number;
|
|
218
|
-
/** @description Bonus amount consumed. */
|
|
219
|
-
bonusUsed: number;
|
|
220
|
-
/** @description Usage details for the feature. */
|
|
221
|
-
usage: {
|
|
209
|
+
/** @description Usage details for tracked features. */
|
|
210
|
+
usage?: {
|
|
222
211
|
/** @description Usage consumed for the feature. */
|
|
223
212
|
used: number;
|
|
224
213
|
/** @description Remaining base limit (limit - used). */
|
|
@@ -227,16 +216,6 @@ interface paths {
|
|
|
227
216
|
bonusRemaining: number;
|
|
228
217
|
/** @description Bonus amount consumed. */
|
|
229
218
|
bonusUsed: number;
|
|
230
|
-
/**
|
|
231
|
-
* @description When usage resets are anchored.
|
|
232
|
-
* @enum {string}
|
|
233
|
-
*/
|
|
234
|
-
resetsWhen: "billing_period" | "calendar";
|
|
235
|
-
/**
|
|
236
|
-
* @description How frequently usage resets.
|
|
237
|
-
* @enum {string}
|
|
238
|
-
*/
|
|
239
|
-
resetType: "never" | "day" | "week" | "month" | "year";
|
|
240
219
|
/** @description Unix timestamp (ms) for the next reset, when applicable. */
|
|
241
220
|
nextReset: number | null;
|
|
242
221
|
/** @description Unix timestamp (ms) for the last reset, when applicable. */
|
|
@@ -355,6 +334,7 @@ interface paths {
|
|
|
355
334
|
* "stripeCustomerId": "cus_abc123",
|
|
356
335
|
* "name": "Ada Lovelace",
|
|
357
336
|
* "email": "ada@example.com",
|
|
337
|
+
* "created": 1735689600000,
|
|
358
338
|
* "usageStartedAt": 1735689600000,
|
|
359
339
|
* "enviroment": "test",
|
|
360
340
|
* "products": [
|
|
@@ -393,17 +373,11 @@ interface paths {
|
|
|
393
373
|
* "type": "limit",
|
|
394
374
|
* "limit": 1000,
|
|
395
375
|
* "isUnlimited": false,
|
|
396
|
-
* "used": 120,
|
|
397
|
-
* "remaining": 880,
|
|
398
|
-
* "bonusRemaining": 25,
|
|
399
|
-
* "bonusUsed": 5,
|
|
400
376
|
* "usage": {
|
|
401
377
|
* "used": 120,
|
|
402
378
|
* "remaining": 880,
|
|
403
379
|
* "bonusRemaining": 25,
|
|
404
380
|
* "bonusUsed": 5,
|
|
405
|
-
* "resetsWhen": "billing_period",
|
|
406
|
-
* "resetType": "month",
|
|
407
381
|
* "nextReset": 1738368000000,
|
|
408
382
|
* "lastReset": 1735689600000
|
|
409
383
|
* }
|
|
@@ -439,6 +413,8 @@ interface paths {
|
|
|
439
413
|
name?: string;
|
|
440
414
|
/** @description Customer email address. */
|
|
441
415
|
email?: string;
|
|
416
|
+
/** @description Unix timestamp (ms) when the customer was created. */
|
|
417
|
+
created?: number;
|
|
442
418
|
/** @description Unix timestamp (ms) when usage tracking started. */
|
|
443
419
|
usageStartedAt?: number;
|
|
444
420
|
/**
|
|
@@ -522,16 +498,8 @@ interface paths {
|
|
|
522
498
|
isUnlimited: boolean;
|
|
523
499
|
/** @description Limit for the feature, when applicable. */
|
|
524
500
|
limit: number | null;
|
|
525
|
-
/** @description Usage
|
|
526
|
-
|
|
527
|
-
/** @description Remaining base limit (limit - used). */
|
|
528
|
-
remaining: number | null;
|
|
529
|
-
/** @description Remaining bonus amount. */
|
|
530
|
-
bonusRemaining: number;
|
|
531
|
-
/** @description Bonus amount consumed. */
|
|
532
|
-
bonusUsed: number;
|
|
533
|
-
/** @description Usage details for the feature. */
|
|
534
|
-
usage: {
|
|
501
|
+
/** @description Usage details for tracked features. */
|
|
502
|
+
usage?: {
|
|
535
503
|
/** @description Usage consumed for the feature. */
|
|
536
504
|
used: number;
|
|
537
505
|
/** @description Remaining base limit (limit - used). */
|
|
@@ -540,16 +508,6 @@ interface paths {
|
|
|
540
508
|
bonusRemaining: number;
|
|
541
509
|
/** @description Bonus amount consumed. */
|
|
542
510
|
bonusUsed: number;
|
|
543
|
-
/**
|
|
544
|
-
* @description When usage resets are anchored.
|
|
545
|
-
* @enum {string}
|
|
546
|
-
*/
|
|
547
|
-
resetsWhen: "billing_period" | "calendar";
|
|
548
|
-
/**
|
|
549
|
-
* @description How frequently usage resets.
|
|
550
|
-
* @enum {string}
|
|
551
|
-
*/
|
|
552
|
-
resetType: "never" | "day" | "week" | "month" | "year";
|
|
553
511
|
/** @description Unix timestamp (ms) for the next reset, when applicable. */
|
|
554
512
|
nextReset: number | null;
|
|
555
513
|
/** @description Unix timestamp (ms) for the last reset, when applicable. */
|
|
@@ -775,6 +733,7 @@ interface paths {
|
|
|
775
733
|
* "stripeCustomerId": "cus_abc123",
|
|
776
734
|
* "name": "Ada Lovelace",
|
|
777
735
|
* "email": "ada@example.com",
|
|
736
|
+
* "created": 1735689600000,
|
|
778
737
|
* "usageStartedAt": 1735689600000,
|
|
779
738
|
* "enviroment": "test",
|
|
780
739
|
* "products": [
|
|
@@ -813,17 +772,11 @@ interface paths {
|
|
|
813
772
|
* "type": "limit",
|
|
814
773
|
* "limit": 1000,
|
|
815
774
|
* "isUnlimited": false,
|
|
816
|
-
* "used": 120,
|
|
817
|
-
* "remaining": 880,
|
|
818
|
-
* "bonusRemaining": 25,
|
|
819
|
-
* "bonusUsed": 5,
|
|
820
775
|
* "usage": {
|
|
821
776
|
* "used": 120,
|
|
822
777
|
* "remaining": 880,
|
|
823
778
|
* "bonusRemaining": 25,
|
|
824
779
|
* "bonusUsed": 5,
|
|
825
|
-
* "resetsWhen": "billing_period",
|
|
826
|
-
* "resetType": "month",
|
|
827
780
|
* "nextReset": 1738368000000,
|
|
828
781
|
* "lastReset": 1735689600000
|
|
829
782
|
* }
|
|
@@ -859,6 +812,8 @@ interface paths {
|
|
|
859
812
|
name?: string;
|
|
860
813
|
/** @description Customer email address. */
|
|
861
814
|
email?: string;
|
|
815
|
+
/** @description Unix timestamp (ms) when the customer was created. */
|
|
816
|
+
created?: number;
|
|
862
817
|
/** @description Unix timestamp (ms) when usage tracking started. */
|
|
863
818
|
usageStartedAt?: number;
|
|
864
819
|
/**
|
|
@@ -942,16 +897,8 @@ interface paths {
|
|
|
942
897
|
isUnlimited: boolean;
|
|
943
898
|
/** @description Limit for the feature, when applicable. */
|
|
944
899
|
limit: number | null;
|
|
945
|
-
/** @description Usage
|
|
946
|
-
|
|
947
|
-
/** @description Remaining base limit (limit - used). */
|
|
948
|
-
remaining: number | null;
|
|
949
|
-
/** @description Remaining bonus amount. */
|
|
950
|
-
bonusRemaining: number;
|
|
951
|
-
/** @description Bonus amount consumed. */
|
|
952
|
-
bonusUsed: number;
|
|
953
|
-
/** @description Usage details for the feature. */
|
|
954
|
-
usage: {
|
|
900
|
+
/** @description Usage details for tracked features. */
|
|
901
|
+
usage?: {
|
|
955
902
|
/** @description Usage consumed for the feature. */
|
|
956
903
|
used: number;
|
|
957
904
|
/** @description Remaining base limit (limit - used). */
|
|
@@ -960,16 +907,6 @@ interface paths {
|
|
|
960
907
|
bonusRemaining: number;
|
|
961
908
|
/** @description Bonus amount consumed. */
|
|
962
909
|
bonusUsed: number;
|
|
963
|
-
/**
|
|
964
|
-
* @description When usage resets are anchored.
|
|
965
|
-
* @enum {string}
|
|
966
|
-
*/
|
|
967
|
-
resetsWhen: "billing_period" | "calendar";
|
|
968
|
-
/**
|
|
969
|
-
* @description How frequently usage resets.
|
|
970
|
-
* @enum {string}
|
|
971
|
-
*/
|
|
972
|
-
resetType: "never" | "day" | "week" | "month" | "year";
|
|
973
910
|
/** @description Unix timestamp (ms) for the next reset, when applicable. */
|
|
974
911
|
nextReset: number | null;
|
|
975
912
|
/** @description Unix timestamp (ms) for the last reset, when applicable. */
|
|
@@ -1108,6 +1045,7 @@ interface paths {
|
|
|
1108
1045
|
* "stripeCustomerId": "cus_abc123",
|
|
1109
1046
|
* "name": "Ada Lovelace",
|
|
1110
1047
|
* "email": "ada@example.com",
|
|
1048
|
+
* "created": 1735689600000,
|
|
1111
1049
|
* "usageStartedAt": 1735689600000,
|
|
1112
1050
|
* "enviroment": "test",
|
|
1113
1051
|
* "products": [
|
|
@@ -1146,17 +1084,11 @@ interface paths {
|
|
|
1146
1084
|
* "type": "limit",
|
|
1147
1085
|
* "limit": 1000,
|
|
1148
1086
|
* "isUnlimited": false,
|
|
1149
|
-
* "used": 120,
|
|
1150
|
-
* "remaining": 880,
|
|
1151
|
-
* "bonusRemaining": 25,
|
|
1152
|
-
* "bonusUsed": 5,
|
|
1153
1087
|
* "usage": {
|
|
1154
1088
|
* "used": 120,
|
|
1155
1089
|
* "remaining": 880,
|
|
1156
1090
|
* "bonusRemaining": 25,
|
|
1157
1091
|
* "bonusUsed": 5,
|
|
1158
|
-
* "resetsWhen": "billing_period",
|
|
1159
|
-
* "resetType": "month",
|
|
1160
1092
|
* "nextReset": 1738368000000,
|
|
1161
1093
|
* "lastReset": 1735689600000
|
|
1162
1094
|
* }
|
|
@@ -1192,6 +1124,8 @@ interface paths {
|
|
|
1192
1124
|
name?: string;
|
|
1193
1125
|
/** @description Customer email address. */
|
|
1194
1126
|
email?: string;
|
|
1127
|
+
/** @description Unix timestamp (ms) when the customer was created. */
|
|
1128
|
+
created?: number;
|
|
1195
1129
|
/** @description Unix timestamp (ms) when usage tracking started. */
|
|
1196
1130
|
usageStartedAt?: number;
|
|
1197
1131
|
/**
|
|
@@ -1275,16 +1209,8 @@ interface paths {
|
|
|
1275
1209
|
isUnlimited: boolean;
|
|
1276
1210
|
/** @description Limit for the feature, when applicable. */
|
|
1277
1211
|
limit: number | null;
|
|
1278
|
-
/** @description Usage
|
|
1279
|
-
|
|
1280
|
-
/** @description Remaining base limit (limit - used). */
|
|
1281
|
-
remaining: number | null;
|
|
1282
|
-
/** @description Remaining bonus amount. */
|
|
1283
|
-
bonusRemaining: number;
|
|
1284
|
-
/** @description Bonus amount consumed. */
|
|
1285
|
-
bonusUsed: number;
|
|
1286
|
-
/** @description Usage details for the feature. */
|
|
1287
|
-
usage: {
|
|
1212
|
+
/** @description Usage details for tracked features. */
|
|
1213
|
+
usage?: {
|
|
1288
1214
|
/** @description Usage consumed for the feature. */
|
|
1289
1215
|
used: number;
|
|
1290
1216
|
/** @description Remaining base limit (limit - used). */
|
|
@@ -1293,16 +1219,6 @@ interface paths {
|
|
|
1293
1219
|
bonusRemaining: number;
|
|
1294
1220
|
/** @description Bonus amount consumed. */
|
|
1295
1221
|
bonusUsed: number;
|
|
1296
|
-
/**
|
|
1297
|
-
* @description When usage resets are anchored.
|
|
1298
|
-
* @enum {string}
|
|
1299
|
-
*/
|
|
1300
|
-
resetsWhen: "billing_period" | "calendar";
|
|
1301
|
-
/**
|
|
1302
|
-
* @description How frequently usage resets.
|
|
1303
|
-
* @enum {string}
|
|
1304
|
-
*/
|
|
1305
|
-
resetType: "never" | "day" | "week" | "month" | "year";
|
|
1306
1222
|
/** @description Unix timestamp (ms) for the next reset, when applicable. */
|
|
1307
1223
|
nextReset: number | null;
|
|
1308
1224
|
/** @description Unix timestamp (ms) for the last reset, when applicable. */
|
|
@@ -1446,17 +1362,11 @@ interface paths {
|
|
|
1446
1362
|
* "type": "limit",
|
|
1447
1363
|
* "limit": 1000,
|
|
1448
1364
|
* "isUnlimited": false,
|
|
1449
|
-
* "used": 120,
|
|
1450
|
-
* "remaining": 880,
|
|
1451
|
-
* "bonusRemaining": 25,
|
|
1452
|
-
* "bonusUsed": 5,
|
|
1453
1365
|
* "usage": {
|
|
1454
1366
|
* "used": 120,
|
|
1455
1367
|
* "remaining": 880,
|
|
1456
1368
|
* "bonusRemaining": 25,
|
|
1457
1369
|
* "bonusUsed": 5,
|
|
1458
|
-
* "resetsWhen": "billing_period",
|
|
1459
|
-
* "resetType": "month",
|
|
1460
1370
|
* "nextReset": 1738368000000,
|
|
1461
1371
|
* "lastReset": 1735689600000
|
|
1462
1372
|
* }
|
|
@@ -1488,16 +1398,8 @@ interface paths {
|
|
|
1488
1398
|
isUnlimited: boolean;
|
|
1489
1399
|
/** @description Limit for the feature, when applicable. */
|
|
1490
1400
|
limit: number | null;
|
|
1491
|
-
/** @description Usage
|
|
1492
|
-
|
|
1493
|
-
/** @description Remaining base limit (limit - used). */
|
|
1494
|
-
remaining: number | null;
|
|
1495
|
-
/** @description Remaining bonus amount. */
|
|
1496
|
-
bonusRemaining: number;
|
|
1497
|
-
/** @description Bonus amount consumed. */
|
|
1498
|
-
bonusUsed: number;
|
|
1499
|
-
/** @description Usage details for the feature. */
|
|
1500
|
-
usage: {
|
|
1401
|
+
/** @description Usage details for tracked features. */
|
|
1402
|
+
usage?: {
|
|
1501
1403
|
/** @description Usage consumed for the feature. */
|
|
1502
1404
|
used: number;
|
|
1503
1405
|
/** @description Remaining base limit (limit - used). */
|
|
@@ -1506,16 +1408,6 @@ interface paths {
|
|
|
1506
1408
|
bonusRemaining: number;
|
|
1507
1409
|
/** @description Bonus amount consumed. */
|
|
1508
1410
|
bonusUsed: number;
|
|
1509
|
-
/**
|
|
1510
|
-
* @description When usage resets are anchored.
|
|
1511
|
-
* @enum {string}
|
|
1512
|
-
*/
|
|
1513
|
-
resetsWhen: "billing_period" | "calendar";
|
|
1514
|
-
/**
|
|
1515
|
-
* @description How frequently usage resets.
|
|
1516
|
-
* @enum {string}
|
|
1517
|
-
*/
|
|
1518
|
-
resetType: "never" | "day" | "week" | "month" | "year";
|
|
1519
1411
|
/** @description Unix timestamp (ms) for the next reset, when applicable. */
|
|
1520
1412
|
nextReset: number | null;
|
|
1521
1413
|
/** @description Unix timestamp (ms) for the last reset, when applicable. */
|
|
@@ -2773,13 +2665,18 @@ type LinkCustomerResponse<TFeatureAccessMap = GetFeatureAccessResponse> = WithFe
|
|
|
2773
2665
|
type GetFeatureAccessResponse = paths["/v1/feature-access"]["get"]["responses"][200]["content"]["application/json"];
|
|
2774
2666
|
type IsAny<T> = 0 extends (1 & T) ? true : false;
|
|
2775
2667
|
type LimitFeatureKeyFromEntries<TFeatureAccessMap> = ({
|
|
2776
|
-
[K in keyof TFeatureAccessMap]:
|
|
2668
|
+
[K in keyof TFeatureAccessMap]: TFeatureAccessMap[K] extends {
|
|
2777
2669
|
type: "limit";
|
|
2778
2670
|
} ? K : never;
|
|
2779
2671
|
}[keyof TFeatureAccessMap] & string);
|
|
2780
|
-
type LimitFeatureKeyFromAccessMap<TFeatureAccessMap> = IsAny<TFeatureAccessMap> extends true ? string : TFeatureAccessMap extends
|
|
2781
|
-
|
|
2782
|
-
|
|
2672
|
+
type LimitFeatureKeyFromAccessMap<TFeatureAccessMap> = IsAny<TFeatureAccessMap> extends true ? string : LimitFeatureKeyFromEntries<TFeatureAccessMap> extends never ? string : LimitFeatureKeyFromEntries<TFeatureAccessMap>;
|
|
2673
|
+
type TrackedLimitFeatureKeyFromEntries<TFeatureAccessMap> = ({
|
|
2674
|
+
[K in keyof TFeatureAccessMap]: Extract<TFeatureAccessMap[K], {
|
|
2675
|
+
type: "limit";
|
|
2676
|
+
usage: unknown;
|
|
2677
|
+
}> extends never ? never : K;
|
|
2678
|
+
}[keyof TFeatureAccessMap] & string);
|
|
2679
|
+
type TrackedLimitFeatureKeyFromAccessMap<TFeatureAccessMap> = IsAny<TFeatureAccessMap> extends true ? string : TrackedLimitFeatureKeyFromEntries<TFeatureAccessMap> extends never ? string : TrackedLimitFeatureKeyFromEntries<TFeatureAccessMap>;
|
|
2783
2680
|
type TrackUsageBodyBase = paths["/v1/usage"]["post"]["requestBody"]["content"]["application/json"];
|
|
2784
2681
|
type TrackUsageBody<TFeatureKey extends string = TrackUsageBodyBase["featureKey"]> = Omit<TrackUsageBodyBase, "featureKey"> & {
|
|
2785
2682
|
featureKey: TFeatureKey;
|
|
@@ -2843,7 +2740,7 @@ type PriceOSFeaturesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {
|
|
|
2843
2740
|
getAccess(customerId: string): Promise<TFeatureAccessMap>;
|
|
2844
2741
|
};
|
|
2845
2742
|
type PriceOSBonusesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {
|
|
2846
|
-
create(input: CreateBonusBody<
|
|
2743
|
+
create(input: CreateBonusBody<TrackedLimitFeatureKeyFromAccessMap<TFeatureAccessMap>>): Promise<CreateBonusResponse>;
|
|
2847
2744
|
list(input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>): Promise<ListBonusesResponse>;
|
|
2848
2745
|
update(input: UpdateBonusRequest): Promise<UpdateBonusResponse>;
|
|
2849
2746
|
delete(bonusId: string): Promise<DeleteBonusResponse>;
|
|
@@ -2880,4 +2777,4 @@ declare class PriceOS<TFeatureAccessMap = GetFeatureAccessResponse> implements P
|
|
|
2880
2777
|
constructor(apiKey: string, opts?: PriceOSClientOptions);
|
|
2881
2778
|
}
|
|
2882
2779
|
|
|
2883
|
-
export { type CreateBonusBody, type CreateBonusResponse, type CreateCustomerRequest, type CreateCustomerResponse, type DeleteBonusRequest, type DeleteBonusResponse, type DeleteCustomerRequest, type DeleteCustomerResponse, type DeleteUsageEventsBody, type DeleteUsageEventsResponse, type GetCustomerResponse, type GetFeatureAccessResponse, type LimitFeatureKeyFromAccessMap, type LinkCustomerBody, type LinkCustomerResponse, type ListBonusesRequest, type ListBonusesResponse, type ListUsageEventsBody, type ListUsageEventsResponse, PriceOS, type PriceOSBonusesClient, type PriceOSClientOptions, type PriceOSCustomersClient, PriceOSError, type PriceOSFeaturesClient, type PriceOSHttpClient, type PriceOSLogLevel, type PriceOSUsageClient, type ResetUsageBody, type ResetUsageResponse, type TrackUsageBatchBody, type TrackUsageBatchEvent, type TrackUsageBatchResponse, type TrackUsageBody, type TrackUsageResponse, type UpdateBonusBody, type UpdateBonusRequest, type UpdateBonusResponse, type UpdateCustomerBody, type UpdateCustomerResponse, type UsageEvent };
|
|
2780
|
+
export { type CreateBonusBody, type CreateBonusResponse, type CreateCustomerRequest, type CreateCustomerResponse, type DeleteBonusRequest, type DeleteBonusResponse, type DeleteCustomerRequest, type DeleteCustomerResponse, type DeleteUsageEventsBody, type DeleteUsageEventsResponse, type GetCustomerResponse, type GetFeatureAccessResponse, type LimitFeatureKeyFromAccessMap, type LinkCustomerBody, type LinkCustomerResponse, type ListBonusesRequest, type ListBonusesResponse, type ListUsageEventsBody, type ListUsageEventsResponse, PriceOS, type PriceOSBonusesClient, type PriceOSClientOptions, type PriceOSCustomersClient, PriceOSError, type PriceOSFeaturesClient, type PriceOSHttpClient, type PriceOSLogLevel, type PriceOSUsageClient, type ResetUsageBody, type ResetUsageResponse, type TrackUsageBatchBody, type TrackUsageBatchEvent, type TrackUsageBatchResponse, type TrackUsageBody, type TrackUsageResponse, type TrackedLimitFeatureKeyFromAccessMap, type UpdateBonusBody, type UpdateBonusRequest, type UpdateBonusResponse, type UpdateCustomerBody, type UpdateCustomerResponse, type UsageEvent };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import createClient from \"openapi-fetch\";\nimport type { Client } from \"openapi-fetch\";\nimport type { paths } from \"./gen/openapi\";\nimport {\n CreateBonusBody,\n CreateBonusResponse,\n CreateCustomerRequest,\n CreateCustomerResponse,\n DeleteBonusResponse,\n ListBonusesRequest,\n ListBonusesResponse,\n DeleteUsageEventsBody,\n DeleteUsageEventsResponse,\n DeleteCustomerResponse,\n GetCustomerResponse,\n GetFeatureAccessResponse,\n LinkCustomerBody,\n LinkCustomerResponse,\n LimitFeatureKeyFromAccessMap,\n ListUsageEventsBody,\n ListUsageEventsResponse,\n ResetUsageBody,\n ResetUsageResponse,\n UpdateBonusRequest,\n UpdateBonusResponse,\n TrackUsageBody,\n TrackUsageBatchBody,\n TrackUsageBatchResponse,\n TrackUsageResponse,\n UpdateCustomerBody,\n UpdateCustomerResponse,\n} from \"./types\";\n\nexport type PriceOSLogLevel = \"none\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n\n// --- Public options ---\nexport type PriceOSClientOptions = {\n logLevel?: PriceOSLogLevel;\n};\n\nconst RATE_LIMIT_STATUS = 429;\nconst MAX_RETRIES = 4;\nconst BASE_DELAY_MS = 250;\nconst BACKOFF_MULTIPLIER = 2;\nconst JITTER_MS = 250;\nconst RETRY_DELAY_CAP_MS = 5_000;\nconst REQUEST_TIMEOUT_MS = 20_000;\n\nconst LOG_LEVELS: Record<PriceOSLogLevel, number> = {\n none: 0,\n error: 1,\n warning: 2,\n info: 3,\n debug: 4,\n};\n\ntype Logger = {\n error: (message: string, details?: Record<string, unknown>) => void;\n warning: (message: string, details?: Record<string, unknown>) => void;\n info: (message: string, details?: Record<string, unknown>) => void;\n debug: (message: string, details?: Record<string, unknown>) => void;\n};\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst getRetryDelayMs = (retryCount: number): number => {\n const backoff = BASE_DELAY_MS * Math.pow(BACKOFF_MULTIPLIER, retryCount - 1);\n const jitter = Math.random() * JITTER_MS;\n return Math.min(RETRY_DELAY_CAP_MS, backoff + jitter);\n};\n\nconst createLogger = (logLevel: PriceOSLogLevel): Logger => {\n const shouldLog = (level: PriceOSLogLevel): boolean =>\n logLevel !== \"none\" && LOG_LEVELS[level] <= LOG_LEVELS[logLevel];\n\n const write = (\n level: PriceOSLogLevel,\n message: string,\n details?: Record<string, unknown>\n ): void => {\n if (!shouldLog(level)) return;\n const prefix = `[PriceOS] ${level.toUpperCase()}: ${message}`;\n const payload = details && Object.keys(details).length > 0 ? details : undefined;\n\n switch (level) {\n case \"error\":\n payload ? console.error(prefix, payload) : console.error(prefix);\n return;\n case \"warning\":\n payload ? console.warn(prefix, payload) : console.warn(prefix);\n return;\n case \"info\":\n payload ? console.info(prefix, payload) : console.info(prefix);\n return;\n case \"debug\":\n payload ? console.debug(prefix, payload) : console.debug(prefix);\n return;\n }\n };\n\n return {\n error: (message, details) => write(\"error\", message, details),\n warning: (message, details) => write(\"warning\", message, details),\n info: (message, details) => write(\"info\", message, details),\n debug: (message, details) => write(\"debug\", message, details),\n };\n};\n\nconst getUpstreamSignal = (input: RequestInfo | URL, init?: RequestInit): AbortSignal | undefined => {\n if (init?.signal) return init.signal;\n if (typeof Request !== \"undefined\" && input instanceof Request) return input.signal;\n return undefined;\n};\n\nconst stripSignal = (init?: RequestInit): RequestInit | undefined => {\n if (!init) return undefined;\n const { signal: _signal, ...rest } = init;\n return rest;\n};\n\nconst getRequestDetails = (\n input: RequestInfo | URL,\n init?: RequestInit\n): { method: string; url: string } => {\n const method =\n init?.method ??\n (typeof Request !== \"undefined\" && input instanceof Request ? input.method : \"GET\");\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n return { method, url };\n};\n\nconst prepareRetryRequest = async (\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n log: Logger,\n method: string,\n url: string\n): Promise<{ requestInput: RequestInfo | URL; baseInit?: RequestInit; canRetry: boolean }> => {\n if (!(typeof Request !== \"undefined\" && input instanceof Request)) {\n return { requestInput: input, baseInit: stripSignal(init), canRetry: true };\n }\n\n if (input.bodyUsed) {\n log.warning(\"Request body already used; retries disabled\", { method, url });\n return { requestInput: input, baseInit: stripSignal(init), canRetry: false };\n }\n\n let body: BodyInit | undefined = undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n try {\n body = await input.clone().arrayBuffer();\n } catch (error) {\n log.warning(\"Unable to clone request body; retries disabled\", { method, url, error });\n return { requestInput: input, baseInit: stripSignal(init), canRetry: false };\n }\n }\n\n const headers = new Headers(input.headers);\n const baseInit = { ...stripSignal(init), method, headers, body };\n return { requestInput: input.url, baseInit, canRetry: true };\n};\n\nconst getErrorMessage = (error: unknown): string => {\n const maybeError = error as { error?: unknown } | null;\n if (maybeError && typeof maybeError.error === \"string\") return maybeError.error;\n return \"Request failed\";\n};\n\nconst throwRequestError = (\n log: Logger,\n error: unknown,\n response: Response | undefined,\n context: string\n): never => {\n log.error(\"Request failed\", { context, status: response?.status, error });\n throw new PriceOSError(getErrorMessage(error), { status: response?.status, details: error });\n};\n\nconst createRetryingFetch = (baseFetch: typeof fetch, log: Logger): typeof fetch => {\n return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const { method, url } = getRequestDetails(input, init);\n const upstreamSignal = getUpstreamSignal(input, init);\n const { requestInput, baseInit, canRetry } = await prepareRetryRequest(\n input,\n init,\n log,\n method,\n url\n );\n let attempt = 0;\n while (true) {\n log.debug(\"Request attempt\", { method, url, attempt: attempt + 1, maxRetries: MAX_RETRIES });\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n let removeAbortListener: (() => void) | null = null;\n\n if (upstreamSignal) {\n if (upstreamSignal.aborted) {\n controller.abort();\n } else {\n const onAbort = () => controller.abort();\n upstreamSignal.addEventListener(\"abort\", onAbort);\n removeAbortListener = () => upstreamSignal.removeEventListener(\"abort\", onAbort);\n }\n }\n\n try {\n const requestInit = { ...(baseInit ?? {}), signal: controller.signal };\n const response = await baseFetch(requestInput, requestInit);\n if (response.status !== RATE_LIMIT_STATUS) return response;\n\n const retryAfter = response.headers.get(\"retry-after\") ?? undefined;\n log.warning(\"Rate limit hit (429)\", {\n method,\n url,\n attempt: attempt + 1,\n maxRetries: MAX_RETRIES,\n retryAfter,\n });\n\n if (!canRetry) {\n log.warning(\"Skipping retry because request body is not replayable\", { method, url });\n return response;\n }\n\n if (attempt >= MAX_RETRIES) {\n log.error(\"Rate limit retries exhausted\", { method, url, attempts: attempt + 1 });\n return response;\n }\n\n const delayMs = getRetryDelayMs(attempt + 1);\n log.info(\"Waiting to retry after rate limit\", {\n method,\n url,\n delayMs,\n nextAttempt: attempt + 2,\n maxRetries: MAX_RETRIES,\n });\n await sleep(delayMs);\n attempt += 1;\n } catch (error) {\n if (controller.signal.aborted) {\n const abortedByCaller = upstreamSignal?.aborted ?? false;\n if (abortedByCaller) {\n log.warning(\"Request aborted by caller\", { method, url, attempt: attempt + 1 });\n } else {\n log.error(\"Request timed out\", {\n method,\n url,\n attempt: attempt + 1,\n timeoutMs: REQUEST_TIMEOUT_MS,\n });\n }\n } else {\n log.error(\"Request failed\", { method, url, attempt: attempt + 1, error });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n removeAbortListener?.();\n }\n }\n };\n};\n\nexport type PriceOSCustomersClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n get(customerId: string): Promise<GetCustomerResponse<TFeatureAccessMap> | null>;\n link(input: LinkCustomerBody): Promise<LinkCustomerResponse<TFeatureAccessMap> | null>;\n create(input: CreateCustomerRequest): Promise<CreateCustomerResponse<TFeatureAccessMap>>;\n update(input: UpdateCustomerBody): Promise<UpdateCustomerResponse<TFeatureAccessMap>>;\n delete(customerId: string): Promise<DeleteCustomerResponse>;\n};\n\nexport type PriceOSFeaturesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n getAccess(customerId: string): Promise<TFeatureAccessMap>;\n};\n\nexport type PriceOSBonusesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n create(\n input: CreateBonusBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<CreateBonusResponse>;\n list(\n input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListBonusesResponse>;\n update(input: UpdateBonusRequest): Promise<UpdateBonusResponse>;\n delete(bonusId: string): Promise<DeleteBonusResponse>;\n};\n\nexport type PriceOSUsageClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n track(\n input: TrackUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageResponse>;\n reset(\n input: ResetUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ResetUsageResponse>;\n deleteEvents(\n input: DeleteUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<DeleteUsageEventsResponse>;\n trackBatch(\n input: TrackUsageBatchBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageBatchResponse>;\n listEvents(\n input: ListUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListUsageEventsResponse>;\n};\n\n// --- Public SDK surface type ---\nexport type PriceOSHttpClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n customers: PriceOSCustomersClient<TFeatureAccessMap>;\n features: PriceOSFeaturesClient<TFeatureAccessMap>;\n bonuses: PriceOSBonusesClient<TFeatureAccessMap>;\n usage: PriceOSUsageClient<TFeatureAccessMap>;\n};\n\nexport class PriceOSError extends Error {\n status?: number;\n details?: unknown;\n\n constructor(message: string, opts?: { status?: number; details?: unknown }) {\n super(message);\n this.name = \"PriceOSError\";\n this.status = opts?.status;\n this.details = opts?.details;\n }\n}\n\nexport class PriceOS<TFeatureAccessMap = GetFeatureAccessResponse>\n implements PriceOSHttpClient<TFeatureAccessMap>\n{\n private client: Client<paths>;\n private header: { \"x-api-key\": string };\n private log: Logger;\n customers: PriceOSCustomersClient<TFeatureAccessMap>;\n features: PriceOSFeaturesClient<TFeatureAccessMap>;\n bonuses: PriceOSBonusesClient<TFeatureAccessMap>;\n usage: PriceOSUsageClient<TFeatureAccessMap>;\n\n constructor(apiKey: string, opts: PriceOSClientOptions = {}) {\n const logLevel = opts.logLevel ?? \"none\";\n this.log = createLogger(logLevel);\n const baseUrl = \"https://api.priceos.com\";\n this.header = { \"x-api-key\": apiKey };\n const fetchWithRetry = createRetryingFetch(fetch, this.log);\n this.client = createClient<paths>({\n baseUrl,\n fetch: fetchWithRetry,\n headers: {\n \"x-api-key\": apiKey,\n },\n });\n\n this.customers = {\n get: async (customerId: string): Promise<GetCustomerResponse<TFeatureAccessMap> | null> => {\n const { data, error, response } = await this.client.GET(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/customers/{customerId}\");\n return (data ?? null) as GetCustomerResponse<TFeatureAccessMap> | null;\n },\n link: async (\n input: LinkCustomerBody\n ): Promise<LinkCustomerResponse<TFeatureAccessMap> | null> => {\n const { data, error, response } = await this.client.POST(\"/v1/customers/link\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/customers/link\");\n return (data ?? null) as LinkCustomerResponse<TFeatureAccessMap> | null;\n },\n create: async (input: CreateCustomerRequest): Promise<CreateCustomerResponse<TFeatureAccessMap>> => {\n const { data, error, response } = await this.client.POST(\"/v1/customers\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/customers\");\n return data! as CreateCustomerResponse<TFeatureAccessMap>;\n },\n update: async (input: UpdateCustomerBody): Promise<UpdateCustomerResponse<TFeatureAccessMap>> => {\n const { customerId, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/customers/{customerId}\");\n return data! as UpdateCustomerResponse<TFeatureAccessMap>;\n },\n delete: async (customerId: string): Promise<DeleteCustomerResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/customers/{customerId}\");\n return data! as DeleteCustomerResponse;\n },\n };\n\n this.features = {\n getAccess: async (customerId: string): Promise<TFeatureAccessMap> => {\n const { data, error, response } = await this.client.GET(\"/v1/feature-access\", {\n params: { query: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/feature-access\");\n return data! as TFeatureAccessMap;\n },\n };\n\n this.bonuses = {\n create: async (\n input: CreateBonusBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<CreateBonusResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/bonuses\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/bonuses\");\n return data!;\n },\n list: async (\n input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListBonusesResponse> => {\n const { data, error, response } = await this.client.GET(\"/v1/bonuses\", {\n params: { header: this.header, query: input },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/bonuses\");\n return data!;\n },\n update: async (input: UpdateBonusRequest): Promise<UpdateBonusResponse> => {\n const { bonusId, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/bonuses/{bonusId}\", {\n params: { header: this.header, path: { bonusId } },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/bonuses/{bonusId}\");\n return data!;\n },\n delete: async (bonusId: string): Promise<DeleteBonusResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/bonuses/{bonusId}\", {\n params: { header: this.header, path: { bonusId } },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/bonuses/{bonusId}\");\n return data!;\n },\n };\n\n this.usage = {\n track: async (\n input: TrackUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage\");\n return data!;\n },\n reset: async (\n input: ResetUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ResetUsageResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/void\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/void\");\n return data!;\n },\n deleteEvents: async (\n input: DeleteUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<DeleteUsageEventsResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/delete\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/delete\");\n return data!;\n },\n trackBatch: async (\n input: TrackUsageBatchBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageBatchResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/batch\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/batch\");\n return data!;\n },\n listEvents: async (\n input: ListUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListUsageEventsResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/events\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/events\");\n return data!;\n },\n };\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import createClient from \"openapi-fetch\";\nimport type { Client } from \"openapi-fetch\";\nimport type { paths } from \"./gen/openapi\";\nimport {\n CreateBonusBody,\n CreateBonusResponse,\n CreateCustomerRequest,\n CreateCustomerResponse,\n DeleteBonusResponse,\n ListBonusesRequest,\n ListBonusesResponse,\n DeleteUsageEventsBody,\n DeleteUsageEventsResponse,\n DeleteCustomerResponse,\n GetCustomerResponse,\n GetFeatureAccessResponse,\n LinkCustomerBody,\n LinkCustomerResponse,\n LimitFeatureKeyFromAccessMap,\n TrackedLimitFeatureKeyFromAccessMap,\n ListUsageEventsBody,\n ListUsageEventsResponse,\n ResetUsageBody,\n ResetUsageResponse,\n UpdateBonusRequest,\n UpdateBonusResponse,\n TrackUsageBody,\n TrackUsageBatchBody,\n TrackUsageBatchResponse,\n TrackUsageResponse,\n UpdateCustomerBody,\n UpdateCustomerResponse,\n} from \"./types\";\n\nexport type PriceOSLogLevel = \"none\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n\n// --- Public options ---\nexport type PriceOSClientOptions = {\n logLevel?: PriceOSLogLevel;\n};\n\nconst RATE_LIMIT_STATUS = 429;\nconst MAX_RETRIES = 4;\nconst BASE_DELAY_MS = 250;\nconst BACKOFF_MULTIPLIER = 2;\nconst JITTER_MS = 250;\nconst RETRY_DELAY_CAP_MS = 5_000;\nconst REQUEST_TIMEOUT_MS = 20_000;\n\nconst LOG_LEVELS: Record<PriceOSLogLevel, number> = {\n none: 0,\n error: 1,\n warning: 2,\n info: 3,\n debug: 4,\n};\n\ntype Logger = {\n error: (message: string, details?: Record<string, unknown>) => void;\n warning: (message: string, details?: Record<string, unknown>) => void;\n info: (message: string, details?: Record<string, unknown>) => void;\n debug: (message: string, details?: Record<string, unknown>) => void;\n};\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst getRetryDelayMs = (retryCount: number): number => {\n const backoff = BASE_DELAY_MS * Math.pow(BACKOFF_MULTIPLIER, retryCount - 1);\n const jitter = Math.random() * JITTER_MS;\n return Math.min(RETRY_DELAY_CAP_MS, backoff + jitter);\n};\n\nconst createLogger = (logLevel: PriceOSLogLevel): Logger => {\n const shouldLog = (level: PriceOSLogLevel): boolean =>\n logLevel !== \"none\" && LOG_LEVELS[level] <= LOG_LEVELS[logLevel];\n\n const write = (\n level: PriceOSLogLevel,\n message: string,\n details?: Record<string, unknown>\n ): void => {\n if (!shouldLog(level)) return;\n const prefix = `[PriceOS] ${level.toUpperCase()}: ${message}`;\n const payload = details && Object.keys(details).length > 0 ? details : undefined;\n\n switch (level) {\n case \"error\":\n payload ? console.error(prefix, payload) : console.error(prefix);\n return;\n case \"warning\":\n payload ? console.warn(prefix, payload) : console.warn(prefix);\n return;\n case \"info\":\n payload ? console.info(prefix, payload) : console.info(prefix);\n return;\n case \"debug\":\n payload ? console.debug(prefix, payload) : console.debug(prefix);\n return;\n }\n };\n\n return {\n error: (message, details) => write(\"error\", message, details),\n warning: (message, details) => write(\"warning\", message, details),\n info: (message, details) => write(\"info\", message, details),\n debug: (message, details) => write(\"debug\", message, details),\n };\n};\n\nconst getUpstreamSignal = (input: RequestInfo | URL, init?: RequestInit): AbortSignal | undefined => {\n if (init?.signal) return init.signal;\n if (typeof Request !== \"undefined\" && input instanceof Request) return input.signal;\n return undefined;\n};\n\nconst stripSignal = (init?: RequestInit): RequestInit | undefined => {\n if (!init) return undefined;\n const { signal: _signal, ...rest } = init;\n return rest;\n};\n\nconst getRequestDetails = (\n input: RequestInfo | URL,\n init?: RequestInit\n): { method: string; url: string } => {\n const method =\n init?.method ??\n (typeof Request !== \"undefined\" && input instanceof Request ? input.method : \"GET\");\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n return { method, url };\n};\n\nconst prepareRetryRequest = async (\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n log: Logger,\n method: string,\n url: string\n): Promise<{ requestInput: RequestInfo | URL; baseInit?: RequestInit; canRetry: boolean }> => {\n if (!(typeof Request !== \"undefined\" && input instanceof Request)) {\n return { requestInput: input, baseInit: stripSignal(init), canRetry: true };\n }\n\n if (input.bodyUsed) {\n log.warning(\"Request body already used; retries disabled\", { method, url });\n return { requestInput: input, baseInit: stripSignal(init), canRetry: false };\n }\n\n let body: BodyInit | undefined = undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n try {\n body = await input.clone().arrayBuffer();\n } catch (error) {\n log.warning(\"Unable to clone request body; retries disabled\", { method, url, error });\n return { requestInput: input, baseInit: stripSignal(init), canRetry: false };\n }\n }\n\n const headers = new Headers(input.headers);\n const baseInit = { ...stripSignal(init), method, headers, body };\n return { requestInput: input.url, baseInit, canRetry: true };\n};\n\nconst getErrorMessage = (error: unknown): string => {\n const maybeError = error as { error?: unknown } | null;\n if (maybeError && typeof maybeError.error === \"string\") return maybeError.error;\n return \"Request failed\";\n};\n\nconst throwRequestError = (\n log: Logger,\n error: unknown,\n response: Response | undefined,\n context: string\n): never => {\n log.error(\"Request failed\", { context, status: response?.status, error });\n throw new PriceOSError(getErrorMessage(error), { status: response?.status, details: error });\n};\n\nconst createRetryingFetch = (baseFetch: typeof fetch, log: Logger): typeof fetch => {\n return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const { method, url } = getRequestDetails(input, init);\n const upstreamSignal = getUpstreamSignal(input, init);\n const { requestInput, baseInit, canRetry } = await prepareRetryRequest(\n input,\n init,\n log,\n method,\n url\n );\n let attempt = 0;\n while (true) {\n log.debug(\"Request attempt\", { method, url, attempt: attempt + 1, maxRetries: MAX_RETRIES });\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n let removeAbortListener: (() => void) | null = null;\n\n if (upstreamSignal) {\n if (upstreamSignal.aborted) {\n controller.abort();\n } else {\n const onAbort = () => controller.abort();\n upstreamSignal.addEventListener(\"abort\", onAbort);\n removeAbortListener = () => upstreamSignal.removeEventListener(\"abort\", onAbort);\n }\n }\n\n try {\n const requestInit = { ...(baseInit ?? {}), signal: controller.signal };\n const response = await baseFetch(requestInput, requestInit);\n if (response.status !== RATE_LIMIT_STATUS) return response;\n\n const retryAfter = response.headers.get(\"retry-after\") ?? undefined;\n log.warning(\"Rate limit hit (429)\", {\n method,\n url,\n attempt: attempt + 1,\n maxRetries: MAX_RETRIES,\n retryAfter,\n });\n\n if (!canRetry) {\n log.warning(\"Skipping retry because request body is not replayable\", { method, url });\n return response;\n }\n\n if (attempt >= MAX_RETRIES) {\n log.error(\"Rate limit retries exhausted\", { method, url, attempts: attempt + 1 });\n return response;\n }\n\n const delayMs = getRetryDelayMs(attempt + 1);\n log.info(\"Waiting to retry after rate limit\", {\n method,\n url,\n delayMs,\n nextAttempt: attempt + 2,\n maxRetries: MAX_RETRIES,\n });\n await sleep(delayMs);\n attempt += 1;\n } catch (error) {\n if (controller.signal.aborted) {\n const abortedByCaller = upstreamSignal?.aborted ?? false;\n if (abortedByCaller) {\n log.warning(\"Request aborted by caller\", { method, url, attempt: attempt + 1 });\n } else {\n log.error(\"Request timed out\", {\n method,\n url,\n attempt: attempt + 1,\n timeoutMs: REQUEST_TIMEOUT_MS,\n });\n }\n } else {\n log.error(\"Request failed\", { method, url, attempt: attempt + 1, error });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n removeAbortListener?.();\n }\n }\n };\n};\n\nexport type PriceOSCustomersClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n get(customerId: string): Promise<GetCustomerResponse<TFeatureAccessMap> | null>;\n link(input: LinkCustomerBody): Promise<LinkCustomerResponse<TFeatureAccessMap> | null>;\n create(input: CreateCustomerRequest): Promise<CreateCustomerResponse<TFeatureAccessMap>>;\n update(input: UpdateCustomerBody): Promise<UpdateCustomerResponse<TFeatureAccessMap>>;\n delete(customerId: string): Promise<DeleteCustomerResponse>;\n};\n\nexport type PriceOSFeaturesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n getAccess(customerId: string): Promise<TFeatureAccessMap>;\n};\n\nexport type PriceOSBonusesClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n create(\n input: CreateBonusBody<TrackedLimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<CreateBonusResponse>;\n list(\n input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListBonusesResponse>;\n update(input: UpdateBonusRequest): Promise<UpdateBonusResponse>;\n delete(bonusId: string): Promise<DeleteBonusResponse>;\n};\n\nexport type PriceOSUsageClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n track(\n input: TrackUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageResponse>;\n reset(\n input: ResetUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ResetUsageResponse>;\n deleteEvents(\n input: DeleteUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<DeleteUsageEventsResponse>;\n trackBatch(\n input: TrackUsageBatchBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageBatchResponse>;\n listEvents(\n input: ListUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListUsageEventsResponse>;\n};\n\n// --- Public SDK surface type ---\nexport type PriceOSHttpClient<TFeatureAccessMap = GetFeatureAccessResponse> = {\n customers: PriceOSCustomersClient<TFeatureAccessMap>;\n features: PriceOSFeaturesClient<TFeatureAccessMap>;\n bonuses: PriceOSBonusesClient<TFeatureAccessMap>;\n usage: PriceOSUsageClient<TFeatureAccessMap>;\n};\n\nexport class PriceOSError extends Error {\n status?: number;\n details?: unknown;\n\n constructor(message: string, opts?: { status?: number; details?: unknown }) {\n super(message);\n this.name = \"PriceOSError\";\n this.status = opts?.status;\n this.details = opts?.details;\n }\n}\n\nexport class PriceOS<TFeatureAccessMap = GetFeatureAccessResponse>\n implements PriceOSHttpClient<TFeatureAccessMap>\n{\n private client: Client<paths>;\n private header: { \"x-api-key\": string };\n private log: Logger;\n customers: PriceOSCustomersClient<TFeatureAccessMap>;\n features: PriceOSFeaturesClient<TFeatureAccessMap>;\n bonuses: PriceOSBonusesClient<TFeatureAccessMap>;\n usage: PriceOSUsageClient<TFeatureAccessMap>;\n\n constructor(apiKey: string, opts: PriceOSClientOptions = {}) {\n const logLevel = opts.logLevel ?? \"none\";\n this.log = createLogger(logLevel);\n const baseUrl = \"https://api.priceos.com\";\n this.header = { \"x-api-key\": apiKey };\n const fetchWithRetry = createRetryingFetch(fetch, this.log);\n this.client = createClient<paths>({\n baseUrl,\n fetch: fetchWithRetry,\n headers: {\n \"x-api-key\": apiKey,\n },\n });\n\n this.customers = {\n get: async (customerId: string): Promise<GetCustomerResponse<TFeatureAccessMap> | null> => {\n const { data, error, response } = await this.client.GET(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/customers/{customerId}\");\n return (data ?? null) as GetCustomerResponse<TFeatureAccessMap> | null;\n },\n link: async (\n input: LinkCustomerBody\n ): Promise<LinkCustomerResponse<TFeatureAccessMap> | null> => {\n const { data, error, response } = await this.client.POST(\"/v1/customers/link\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/customers/link\");\n return (data ?? null) as LinkCustomerResponse<TFeatureAccessMap> | null;\n },\n create: async (input: CreateCustomerRequest): Promise<CreateCustomerResponse<TFeatureAccessMap>> => {\n const { data, error, response } = await this.client.POST(\"/v1/customers\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/customers\");\n return data! as CreateCustomerResponse<TFeatureAccessMap>;\n },\n update: async (input: UpdateCustomerBody): Promise<UpdateCustomerResponse<TFeatureAccessMap>> => {\n const { customerId, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/customers/{customerId}\");\n return data! as UpdateCustomerResponse<TFeatureAccessMap>;\n },\n delete: async (customerId: string): Promise<DeleteCustomerResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/customers/{customerId}\", {\n params: { path: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/customers/{customerId}\");\n return data! as DeleteCustomerResponse;\n },\n };\n\n this.features = {\n getAccess: async (customerId: string): Promise<TFeatureAccessMap> => {\n const { data, error, response } = await this.client.GET(\"/v1/feature-access\", {\n params: { query: { customerId }, header: this.header },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/feature-access\");\n return data! as TFeatureAccessMap;\n },\n };\n\n this.bonuses = {\n create: async (\n input: CreateBonusBody<TrackedLimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<CreateBonusResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/bonuses\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/bonuses\");\n return data!;\n },\n list: async (\n input: ListBonusesRequest<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListBonusesResponse> => {\n const { data, error, response } = await this.client.GET(\"/v1/bonuses\", {\n params: { header: this.header, query: input },\n });\n if (error) throwRequestError(this.log, error, response, \"GET /v1/bonuses\");\n return data!;\n },\n update: async (input: UpdateBonusRequest): Promise<UpdateBonusResponse> => {\n const { bonusId, ...body } = input;\n const { data, error, response } = await this.client.PUT(\"/v1/bonuses/{bonusId}\", {\n params: { header: this.header, path: { bonusId } },\n body,\n });\n if (error) throwRequestError(this.log, error, response, \"PUT /v1/bonuses/{bonusId}\");\n return data!;\n },\n delete: async (bonusId: string): Promise<DeleteBonusResponse> => {\n const { data, error, response } = await this.client.DELETE(\"/v1/bonuses/{bonusId}\", {\n params: { header: this.header, path: { bonusId } },\n });\n if (error) throwRequestError(this.log, error, response, \"DELETE /v1/bonuses/{bonusId}\");\n return data!;\n },\n };\n\n this.usage = {\n track: async (\n input: TrackUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage\");\n return data!;\n },\n reset: async (\n input: ResetUsageBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ResetUsageResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/void\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/void\");\n return data!;\n },\n deleteEvents: async (\n input: DeleteUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<DeleteUsageEventsResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/delete\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/delete\");\n return data!;\n },\n trackBatch: async (\n input: TrackUsageBatchBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<TrackUsageBatchResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/batch\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/batch\");\n return data!;\n },\n listEvents: async (\n input: ListUsageEventsBody<LimitFeatureKeyFromAccessMap<TFeatureAccessMap>>\n ): Promise<ListUsageEventsResponse> => {\n const { data, error, response } = await this.client.POST(\"/v1/usage/events\", {\n params: { header: this.header },\n body: input,\n });\n if (error) throwRequestError(this.log, error, response, \"POST /v1/usage/events\");\n return data!;\n },\n };\n }\n}\n"],"mappings":"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","names":[]}
|