@einblick/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,44 @@
1
+ # `@einblick/sdk`
2
+
3
+ Typed client and code generator for the Einblick public API.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @einblick/sdk
9
+ ```
10
+
11
+ ## Generate types
12
+
13
+ Set your API key in the consuming app:
14
+
15
+ ```bash
16
+ EINBLICK_API_KEY=api_...
17
+ ```
18
+
19
+ Then generate the typed schema file:
20
+
21
+ ```bash
22
+ npx @einblick/sdk generate --output app/lib/einblick.generated.ts
23
+ ```
24
+
25
+ Optional:
26
+
27
+ ```bash
28
+ EINBLICK_API_URL=https://actions.einblick.xyz
29
+ ```
30
+
31
+ If `EINBLICK_API_URL` is omitted, the SDK defaults to the hosted Einblick API URL.
32
+
33
+ ## Use it
34
+
35
+ ```ts
36
+ import { createGeneratedEinblickClient } from "@/app/lib/einblick.generated";
37
+
38
+ const einblick = createGeneratedEinblickClient();
39
+
40
+ const posts = await einblick.request("posts", { limit: 10 });
41
+ const post = await einblick.request("posts", { slug: "das-atelier" });
42
+ ```
43
+
44
+ Regenerate the file whenever the allowed resource fields change.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env node
2
+ import { generateEinblickTypes } from './codegen.js';
3
+ function printHelp() {
4
+ process.stdout.write([
5
+ 'Usage',
6
+ ' einblick-sdk generate [options]',
7
+ '',
8
+ 'Options',
9
+ ' -o, --output <path> Output path for the generated TypeScript file',
10
+ ' --cwd <path> Working directory to load .env files from',
11
+ ' --url <url> Override the Einblick API base URL',
12
+ ' --api-key <key> Override the API key (otherwise read from env)',
13
+ ' -h, --help Show this help message',
14
+ '',
15
+ 'Environment',
16
+ ' EINBLICK_API_KEY Required unless --api-key is passed',
17
+ ' EINBLICK_API_URL Optional, defaults to https://actions.einblick.xyz',
18
+ '',
19
+ 'Example',
20
+ ' einblick-sdk generate --output app/lib/einblick.generated.ts',
21
+ '',
22
+ ].join('\n'));
23
+ }
24
+ function parseArgs(argv) {
25
+ if (argv.length === 0) {
26
+ return { command: 'generate' };
27
+ }
28
+ const [firstArg] = argv;
29
+ if (firstArg === '-h' || firstArg === '--help' || firstArg === 'help') {
30
+ return { command: 'help' };
31
+ }
32
+ const command = firstArg === 'generate'
33
+ ? 'generate'
34
+ : firstArg.startsWith('-')
35
+ ? 'generate'
36
+ : null;
37
+ if (command === null) {
38
+ throw new Error(`Unknown command: ${firstArg}`);
39
+ }
40
+ const args = command === 'generate' && firstArg === 'generate' ? argv.slice(1) : argv;
41
+ const parsed = { command: 'generate' };
42
+ for (let index = 0; index < args.length; index += 1) {
43
+ const arg = args[index];
44
+ switch (arg) {
45
+ case '-h':
46
+ case '--help':
47
+ return { command: 'help' };
48
+ case '-o':
49
+ case '--output':
50
+ parsed.output = args[index + 1];
51
+ index += 1;
52
+ break;
53
+ case '--cwd':
54
+ parsed.cwd = args[index + 1];
55
+ index += 1;
56
+ break;
57
+ case '--url':
58
+ parsed.baseUrl = args[index + 1];
59
+ index += 1;
60
+ break;
61
+ case '--api-key':
62
+ parsed.apiKey = args[index + 1];
63
+ index += 1;
64
+ break;
65
+ default:
66
+ throw new Error(`Unknown argument: ${arg}`);
67
+ }
68
+ }
69
+ return parsed;
70
+ }
71
+ async function main() {
72
+ const parsed = parseArgs(process.argv.slice(2));
73
+ if (parsed.command === 'help') {
74
+ printHelp();
75
+ return;
76
+ }
77
+ const result = await generateEinblickTypes({
78
+ cwd: parsed.cwd,
79
+ output: parsed.output,
80
+ apiKey: parsed.apiKey,
81
+ baseUrl: parsed.baseUrl,
82
+ });
83
+ process.stdout.write([
84
+ `Generated ${result.outputPath}`,
85
+ `Resources: ${result.resourceCount} (${result.resourceSlugs.join(', ')})`,
86
+ `Schema source: ${result.schemaSource}`,
87
+ '',
88
+ ].join('\n'));
89
+ }
90
+ main().catch((error) => {
91
+ const message = error instanceof Error ? error.message : String(error);
92
+ process.stderr.write(`einblick-sdk: ${message}\n`);
93
+ process.exitCode = 1;
94
+ });
95
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ export declare const DEFAULT_EINBLICK_API_URL = "https://actions.einblick.xyz";
2
+ export interface EinblickAsset {
3
+ id: string;
4
+ url: string;
5
+ fileName?: string;
6
+ mimeType?: string;
7
+ fileSize?: number;
8
+ }
9
+ export interface EinblickFieldDefinition<FieldKey extends string = string> {
10
+ key: FieldKey;
11
+ label: string;
12
+ type: string;
13
+ }
14
+ export interface EinblickSchemaFieldDefinition<FieldKey extends string = string> extends EinblickFieldDefinition<FieldKey> {
15
+ required: boolean;
16
+ options?: Array<{
17
+ label: string;
18
+ value: string;
19
+ }>;
20
+ }
21
+ export interface EinblickResourceSummary<ResourceSlug extends string = string> {
22
+ name: string;
23
+ slug: ResourceSlug;
24
+ }
25
+ export interface EinblickSchemaResource<ResourceSlug extends string = string> {
26
+ name: string;
27
+ slug: ResourceSlug;
28
+ fields: EinblickSchemaFieldDefinition[];
29
+ }
30
+ export interface EinblickSchemaResponse {
31
+ generatedAt: number;
32
+ resources: EinblickSchemaResource[];
33
+ }
34
+ export interface EinblickRecord<Fields extends Record<string, unknown> = Record<string, unknown>> {
35
+ id: string;
36
+ slug?: string;
37
+ fields: Fields;
38
+ publishedAt?: number;
39
+ createdAt: number;
40
+ updatedAt?: number;
41
+ }
42
+ export interface EinblickListResponse<Fields extends Record<string, unknown> = Record<string, unknown>, ResourceSlug extends string = string> {
43
+ resource: EinblickResourceSummary<ResourceSlug>;
44
+ fields: Array<EinblickFieldDefinition<Extract<keyof Fields, string>>>;
45
+ records: Array<EinblickRecord<Fields>>;
46
+ nextCursor: string | null;
47
+ }
48
+ export interface EinblickSingleRecordResponse<Fields extends Record<string, unknown> = Record<string, unknown>, ResourceSlug extends string = string> {
49
+ resource: EinblickResourceSummary<ResourceSlug>;
50
+ fields: Array<EinblickFieldDefinition<Extract<keyof Fields, string>>>;
51
+ record: EinblickRecord<Fields>;
52
+ }
53
+ export interface EinblickGeneratedResource<Name extends string = string, Fields extends Record<string, unknown> = Record<string, unknown>> {
54
+ name: Name;
55
+ fields: Fields;
56
+ }
57
+ export type EinblickGeneratedSchema = Record<string, EinblickGeneratedResource<string, Record<string, unknown>>>;
58
+ export type KnownEinblickResource<Schema extends EinblickGeneratedSchema> = Extract<keyof Schema, string>;
59
+ export type EinblickResourceFields<Schema extends EinblickGeneratedSchema, Resource extends KnownEinblickResource<Schema>> = Schema[Resource]['fields'];
60
+ export type EinblickResourceRecord<Schema extends EinblickGeneratedSchema, Resource extends KnownEinblickResource<Schema>> = EinblickRecord<EinblickResourceFields<Schema, Resource>>;
61
+ export type EinblickResourceListResponse<Schema extends EinblickGeneratedSchema, Resource extends KnownEinblickResource<Schema>> = EinblickListResponse<EinblickResourceFields<Schema, Resource>, Resource>;
62
+ export type EinblickResourceSingleResponse<Schema extends EinblickGeneratedSchema, Resource extends KnownEinblickResource<Schema>> = EinblickSingleRecordResponse<EinblickResourceFields<Schema, Resource>, Resource>;
63
+ export interface EinblickFetchOptions extends RequestInit {
64
+ next?: {
65
+ revalidate?: number | false;
66
+ tags?: string[];
67
+ };
68
+ }
69
+ export interface CreateEinblickClientOptions {
70
+ baseUrl?: string;
71
+ apiKey?: string;
72
+ fetch?: typeof globalThis.fetch;
73
+ requestInit?: EinblickFetchOptions;
74
+ }
75
+ export interface EinblickListRequestOptions {
76
+ limit?: number;
77
+ cursor?: string | null;
78
+ fetch?: EinblickFetchOptions;
79
+ }
80
+ export interface EinblickRecordRequestOptions {
81
+ slug: string;
82
+ fetch?: EinblickFetchOptions;
83
+ }
84
+ export declare class EinblickApiError extends Error {
85
+ readonly status: number;
86
+ constructor(message: string, status: number);
87
+ }
88
+ export declare class EinblickClient<Schema extends EinblickGeneratedSchema = EinblickGeneratedSchema> {
89
+ private readonly baseUrl;
90
+ private readonly apiKey;
91
+ private readonly fetchImpl;
92
+ private readonly defaultRequestInit?;
93
+ constructor(options?: CreateEinblickClientOptions);
94
+ private requestJson;
95
+ listResources(fetchOptions?: EinblickFetchOptions): Promise<EinblickResourceSummary[]>;
96
+ getSchema(fetchOptions?: EinblickFetchOptions): Promise<EinblickSchemaResponse>;
97
+ getResource<Resource extends KnownEinblickResource<Schema>>(resource: Resource, options?: EinblickListRequestOptions): Promise<EinblickResourceListResponse<Schema, Resource>>;
98
+ getRecord<Resource extends KnownEinblickResource<Schema>>(resource: Resource, slug: string, fetchOptions?: EinblickFetchOptions): Promise<EinblickResourceSingleResponse<Schema, Resource>>;
99
+ request<Resource extends KnownEinblickResource<Schema>>(resource: Resource, options?: EinblickListRequestOptions): Promise<EinblickResourceListResponse<Schema, Resource>>;
100
+ request<Resource extends KnownEinblickResource<Schema>>(resource: Resource, options: EinblickRecordRequestOptions): Promise<EinblickResourceSingleResponse<Schema, Resource>>;
101
+ }
102
+ export declare function createEinblickClient<Schema extends EinblickGeneratedSchema = EinblickGeneratedSchema>(options?: CreateEinblickClientOptions): EinblickClient<Schema>;
103
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,127 @@
1
+ export const DEFAULT_EINBLICK_API_URL = 'https://actions.einblick.xyz';
2
+ const API_KEY_ENV_NAMES = ['EINBLICK_API_KEY', 'EINBLICK_API_TOKEN'];
3
+ const API_URL_ENV_NAMES = [
4
+ 'EINBLICK_API_URL',
5
+ 'NEXT_PUBLIC_EINBLICK_API_URL',
6
+ ];
7
+ function readEnv(names) {
8
+ if (typeof process === 'undefined' || !process.env) {
9
+ return undefined;
10
+ }
11
+ for (const name of names) {
12
+ const value = process.env[name];
13
+ if (typeof value === 'string' && value.length > 0) {
14
+ return value;
15
+ }
16
+ }
17
+ return undefined;
18
+ }
19
+ function normalizeBaseUrl(input) {
20
+ const trimmed = input.replace(/\/$/, '');
21
+ return trimmed.endsWith('/api/v1') ? trimmed : `${trimmed}/api/v1`;
22
+ }
23
+ function getRuntimeFetch(customFetch) {
24
+ if (customFetch) {
25
+ return customFetch;
26
+ }
27
+ if (typeof globalThis.fetch !== 'function') {
28
+ throw new Error('Fetch is not available in this runtime. Pass a custom fetch implementation.');
29
+ }
30
+ return globalThis.fetch.bind(globalThis);
31
+ }
32
+ function mergeRequestInit(apiKey, defaults, overrides) {
33
+ const headers = new Headers(defaults?.headers);
34
+ if (overrides?.headers) {
35
+ const overrideHeaders = new Headers(overrides.headers);
36
+ overrideHeaders.forEach((value, key) => {
37
+ headers.set(key, value);
38
+ });
39
+ }
40
+ headers.set('Authorization', `Bearer ${apiKey}`);
41
+ headers.set('Accept', 'application/json');
42
+ return {
43
+ ...(defaults ?? {}),
44
+ ...(overrides ?? {}),
45
+ headers,
46
+ };
47
+ }
48
+ async function parseErrorMessage(response) {
49
+ const fallbackMessage = `HTTP ${response.status}`;
50
+ try {
51
+ const json = (await response.json());
52
+ if (json.error) {
53
+ return json.error;
54
+ }
55
+ }
56
+ catch {
57
+ // Ignore JSON parsing errors and fall back to the status code.
58
+ }
59
+ return fallbackMessage;
60
+ }
61
+ export class EinblickApiError extends Error {
62
+ status;
63
+ constructor(message, status) {
64
+ super(message);
65
+ this.status = status;
66
+ this.name = 'EinblickApiError';
67
+ }
68
+ }
69
+ export class EinblickClient {
70
+ baseUrl;
71
+ apiKey;
72
+ fetchImpl;
73
+ defaultRequestInit;
74
+ constructor(options = {}) {
75
+ const apiKey = options.apiKey ?? readEnv(API_KEY_ENV_NAMES);
76
+ if (!apiKey) {
77
+ throw new Error('Missing API key. Set EINBLICK_API_KEY or pass apiKey to createEinblickClient().');
78
+ }
79
+ const rawBaseUrl = options.baseUrl ?? readEnv(API_URL_ENV_NAMES) ?? DEFAULT_EINBLICK_API_URL;
80
+ this.baseUrl = normalizeBaseUrl(rawBaseUrl);
81
+ this.apiKey = apiKey;
82
+ this.fetchImpl = getRuntimeFetch(options.fetch);
83
+ this.defaultRequestInit = options.requestInit;
84
+ }
85
+ async requestJson(path, params, fetchOptions) {
86
+ const url = new URL(`${this.baseUrl}${path}`);
87
+ if (params) {
88
+ for (const [key, value] of Object.entries(params)) {
89
+ if (value === undefined || value === null) {
90
+ continue;
91
+ }
92
+ url.searchParams.set(key, String(value));
93
+ }
94
+ }
95
+ const response = await this.fetchImpl(url.toString(), mergeRequestInit(this.apiKey, this.defaultRequestInit, fetchOptions));
96
+ if (!response.ok) {
97
+ throw new EinblickApiError(await parseErrorMessage(response), response.status);
98
+ }
99
+ const json = (await response.json());
100
+ return json.data;
101
+ }
102
+ async listResources(fetchOptions) {
103
+ return this.requestJson('/resources', undefined, fetchOptions);
104
+ }
105
+ async getSchema(fetchOptions) {
106
+ return this.requestJson('/schema', undefined, fetchOptions);
107
+ }
108
+ async getResource(resource, options) {
109
+ return this.requestJson(`/resources/${resource}`, {
110
+ limit: options?.limit,
111
+ cursor: options?.cursor,
112
+ }, options?.fetch);
113
+ }
114
+ async getRecord(resource, slug, fetchOptions) {
115
+ return this.requestJson(`/resources/${resource}/${slug}`, undefined, fetchOptions);
116
+ }
117
+ async request(resource, options) {
118
+ if (options && 'slug' in options) {
119
+ return this.getRecord(resource, options.slug, options.fetch);
120
+ }
121
+ return this.getResource(resource, options);
122
+ }
123
+ }
124
+ export function createEinblickClient(options = {}) {
125
+ return new EinblickClient(options);
126
+ }
127
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ type SchemaSource = 'schema-endpoint' | 'resource-fallback';
2
+ export interface GenerateEinblickTypesOptions {
3
+ cwd?: string;
4
+ output?: string;
5
+ apiKey?: string;
6
+ baseUrl?: string;
7
+ }
8
+ export interface GenerateEinblickTypesResult {
9
+ outputPath: string;
10
+ generatedAt: number;
11
+ resourceCount: number;
12
+ schemaSource: SchemaSource;
13
+ resourceSlugs: string[];
14
+ }
15
+ export declare function generateEinblickTypes(options?: GenerateEinblickTypesOptions): Promise<GenerateEinblickTypesResult>;
16
+ export {};
17
+ //# sourceMappingURL=codegen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAcA,KAAK,YAAY,GAAG,iBAAiB,GAAG,mBAAmB,CAAA;AAQ3D,MAAM,WAAW,4BAA4B;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,YAAY,CAAA;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB;AAmPD,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,2BAA2B,CAAC,CAsBtC"}
@@ -0,0 +1,212 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ import { dirname, resolve } from 'node:path';
4
+ import { config as loadDotEnv } from 'dotenv';
5
+ import { createEinblickClient, EinblickApiError, } from './client.js';
6
+ function loadEnvironmentFiles(cwd) {
7
+ const nodeEnv = process.env.NODE_ENV;
8
+ const candidates = [
9
+ '.env',
10
+ nodeEnv ? `.env.${nodeEnv}` : null,
11
+ '.env.local',
12
+ nodeEnv ? `.env.${nodeEnv}.local` : null,
13
+ ].filter((candidate) => candidate !== null);
14
+ for (const candidate of candidates) {
15
+ const fullPath = resolve(cwd, candidate);
16
+ if (!existsSync(fullPath)) {
17
+ continue;
18
+ }
19
+ loadDotEnv({
20
+ path: fullPath,
21
+ override: true,
22
+ });
23
+ }
24
+ }
25
+ function isValidIdentifier(value) {
26
+ return /^[$A-Z_a-z][$\w]*$/.test(value);
27
+ }
28
+ function toPropertyKey(value) {
29
+ return isValidIdentifier(value) ? value : JSON.stringify(value);
30
+ }
31
+ function toPascalCase(value) {
32
+ const result = value
33
+ .split(/[^A-Za-z0-9]+/)
34
+ .filter((segment) => segment.length > 0)
35
+ .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))
36
+ .join('');
37
+ if (!result) {
38
+ return 'Resource';
39
+ }
40
+ return /^[A-Za-z_$]/.test(result) ? result : `Resource${result}`;
41
+ }
42
+ function toTypeLiteral(value) {
43
+ return JSON.stringify(value);
44
+ }
45
+ function uniqueOptionValues(field) {
46
+ const values = new Set();
47
+ for (const option of field.options ?? []) {
48
+ if (option.value.trim().length > 0) {
49
+ values.add(option.value);
50
+ }
51
+ }
52
+ return [...values];
53
+ }
54
+ function mapFieldType(field) {
55
+ switch (field.type) {
56
+ case 'string':
57
+ case 'text':
58
+ case 'textarea':
59
+ case 'richtext':
60
+ case 'markdown':
61
+ case 'email':
62
+ case 'url':
63
+ case 'tel':
64
+ case 'date':
65
+ case 'datetime':
66
+ case 'combobox':
67
+ return 'string';
68
+ case 'number':
69
+ return 'number';
70
+ case 'boolean':
71
+ case 'switch':
72
+ case 'checkbox':
73
+ return 'boolean';
74
+ case 'select': {
75
+ const optionValues = uniqueOptionValues(field);
76
+ if (optionValues.length === 0) {
77
+ return 'string';
78
+ }
79
+ return optionValues.map(toTypeLiteral).join(' | ');
80
+ }
81
+ case 'tags':
82
+ case 'multiselect': {
83
+ const optionValues = uniqueOptionValues(field);
84
+ const itemType = optionValues.length === 0
85
+ ? 'string'
86
+ : optionValues.map(toTypeLiteral).join(' | ');
87
+ return `Array<${itemType}>`;
88
+ }
89
+ case 'image':
90
+ case 'file':
91
+ return 'EinblickAsset | null';
92
+ case 'files':
93
+ return 'EinblickAsset[]';
94
+ case 'json':
95
+ default:
96
+ return 'unknown';
97
+ }
98
+ }
99
+ function renderResource(resource) {
100
+ const lines = [` ${toPropertyKey(resource.slug)}: {`];
101
+ lines.push(` name: ${toTypeLiteral(resource.name)}`);
102
+ lines.push(' fields: {');
103
+ if (resource.fields.length === 0) {
104
+ lines.push(' [key: string]: never');
105
+ }
106
+ else {
107
+ for (const field of resource.fields) {
108
+ const optionalMarker = field.required ? '' : '?';
109
+ lines.push(` ${toPropertyKey(field.key)}${optionalMarker}: ${mapFieldType(field)}`);
110
+ }
111
+ }
112
+ lines.push(' }');
113
+ lines.push(' }');
114
+ return lines;
115
+ }
116
+ function renderSchemaFile(schema) {
117
+ const lines = [
118
+ '/**',
119
+ ` * Generated by einblick-sdk on ${new Date(schema.generatedAt).toISOString()}.`,
120
+ ` * Schema source: ${schema.source}.`,
121
+ ' * Do not edit manually.',
122
+ ' */',
123
+ '',
124
+ "import { createEinblickClient } from '@einblick/sdk'",
125
+ "import type {",
126
+ ' CreateEinblickClientOptions,',
127
+ ' EinblickAsset,',
128
+ ' EinblickGeneratedSchema,',
129
+ ' EinblickResourceFields,',
130
+ "} from '@einblick/sdk'",
131
+ '',
132
+ 'export interface EinblickSchema extends EinblickGeneratedSchema {',
133
+ ];
134
+ schema.resources.forEach((resource, index) => {
135
+ lines.push(...renderResource(resource));
136
+ if (index < schema.resources.length - 1) {
137
+ lines[lines.length - 1] += '';
138
+ }
139
+ });
140
+ lines.push('}');
141
+ lines.push('');
142
+ lines.push('export type EinblickResourceSlug = keyof EinblickSchema');
143
+ lines.push('');
144
+ for (const resource of schema.resources) {
145
+ const alias = `${toPascalCase(resource.slug)}Fields`;
146
+ lines.push(`export type ${alias} = EinblickResourceFields<EinblickSchema, ${toTypeLiteral(resource.slug)}>`);
147
+ }
148
+ if (schema.resources.length > 0) {
149
+ lines.push('');
150
+ }
151
+ lines.push('export function createGeneratedEinblickClient(', ' options: Partial<CreateEinblickClientOptions> = {}', ') {', ' return createEinblickClient<EinblickSchema>(options)', '}', '', 'export const createEinblick = createGeneratedEinblickClient', '');
152
+ return lines.join('\n');
153
+ }
154
+ async function inferSchemaFromResources(options) {
155
+ const client = createEinblickClient(options);
156
+ const resources = await client.listResources();
157
+ const detailedResources = await Promise.all(resources.map(async (resource) => {
158
+ const response = await client.getResource(resource.slug, { limit: 1 });
159
+ return {
160
+ name: resource.name,
161
+ slug: resource.slug,
162
+ fields: response.fields.map((field) => ({
163
+ key: field.key,
164
+ label: field.label,
165
+ type: field.type,
166
+ required: false,
167
+ })),
168
+ };
169
+ }));
170
+ return {
171
+ generatedAt: Date.now(),
172
+ resources: detailedResources,
173
+ source: 'resource-fallback',
174
+ };
175
+ }
176
+ async function resolveSchema(options) {
177
+ const client = createEinblickClient(options);
178
+ try {
179
+ const schema = await client.getSchema();
180
+ return {
181
+ generatedAt: schema.generatedAt,
182
+ resources: schema.resources,
183
+ source: 'schema-endpoint',
184
+ };
185
+ }
186
+ catch (error) {
187
+ if (error instanceof EinblickApiError && error.status === 404) {
188
+ return inferSchemaFromResources(options);
189
+ }
190
+ throw error;
191
+ }
192
+ }
193
+ export async function generateEinblickTypes(options = {}) {
194
+ const cwd = resolve(options.cwd ?? process.cwd());
195
+ loadEnvironmentFiles(cwd);
196
+ const schema = await resolveSchema({
197
+ apiKey: options.apiKey,
198
+ baseUrl: options.baseUrl,
199
+ });
200
+ const outputPath = resolve(cwd, options.output ?? './einblick.generated.ts');
201
+ const fileContent = renderSchemaFile(schema);
202
+ await mkdir(dirname(outputPath), { recursive: true });
203
+ await writeFile(outputPath, fileContent, 'utf8');
204
+ return {
205
+ outputPath,
206
+ generatedAt: schema.generatedAt,
207
+ resourceCount: schema.resources.length,
208
+ schemaSource: schema.source,
209
+ resourceSlugs: schema.resources.map((resource) => resource.slug),
210
+ };
211
+ }
212
+ //# sourceMappingURL=codegen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.js","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './client.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './client.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@einblick/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Typed client and code generator for the Einblick public API.",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ },
14
+ "./codegen": {
15
+ "import": "./dist/codegen.js",
16
+ "types": "./dist/codegen.d.ts"
17
+ }
18
+ },
19
+ "bin": {
20
+ "einblick-sdk": "./dist/cli.js"
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsc -p tsconfig.json",
27
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
28
+ "type-check": "tsc --noEmit -p tsconfig.json",
29
+ "prepublishOnly": "npm run clean && npm run build"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "engines": {
35
+ "node": ">=20.0.0"
36
+ },
37
+ "dependencies": {
38
+ "dotenv": "^17.2.3"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^25.1.0",
42
+ "typescript": "^5.9.3"
43
+ }
44
+ }