blimu 1.1.1 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index.js → index.cjs} +1 -1
- package/dist/main.cjs +4 -0
- package/dist/main.cjs.map +1 -0
- package/package.json +17 -4
- package/dist/main.js +0 -4
- package/dist/main.js.map +0 -1
- /package/dist/{index.js.map → index.cjs.map} +0 -0
package/dist/main.cjs
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";var M=Object.create;var E=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var V=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var J=(i,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of Q(e))!H.call(i,t)&&t!==n&&E(i,t,{get:()=>e[t],enumerable:!(o=N(e,t))||o.enumerable});return i};var d=(i,e,n)=>(n=i!=null?M(V(i)):{},J(e||!i||!i.__esModule?E(n,"default",{value:i,enumerable:!0}):n,i));var K=require("commander");var u=d(require("path")),F=d(require("fs")),p=d(require("@clack/prompts"));var l=d(require("fs")),h=d(require("path"));function x(i){let{configPath:e,outputPath:n,typesPackages:o=["@blimu/types","@blimu/backend"]}=i,t=[],s=o.join(" and ");t.push("/**"),t.push(` * Type Augmentation for ${s}`),t.push(" *"),t.push(` * This file augments the ${s} packages with union types`),t.push(" * specific to your environment configuration."),t.push(" *"),t.push(" * Types are automatically inferred from your blimu.config.ts file."),t.push(" * No regeneration needed when you update your config!"),t.push(" *"),t.push(" * Make sure to include this file in your tsconfig.json:"),t.push(" * {"),t.push(' * "include": ["blimu-types.d.ts"]'),t.push(" * }"),t.push(" */"),t.push("");let a=h.dirname(n),f=h.isAbsolute(e)?h.resolve(e):h.resolve(a,e),D=h.relative(a,f).replace(/\.(ts|mjs|js)$/,""),W=D.startsWith(".")?D:`./${D}`;t.push(`import type config from '${W}';`),t.push("import type {"),t.push(" InferResourceTypes,"),t.push(" InferEntitlementTypes,"),t.push(" InferPlanTypes,"),t.push(" InferLimitTypes,"),t.push(" InferUsageLimitTypes,"),t.push("} from 'blimu';"),t.push("");for(let z of o)t.push(`declare module '${z}' {`),t.push(" /**"),t.push(" * Resource types inferred from your Blimu configuration."),t.push(" */"),t.push(" type ResourceType = InferResourceTypes<typeof config>;"),t.push(""),t.push(" /**"),t.push(" * Entitlement types inferred from your Blimu configuration."),t.push(" */"),t.push(" type EntitlementType = InferEntitlementTypes<typeof config>;"),t.push(""),t.push(" /**"),t.push(" * Plan types inferred from your Blimu configuration."),t.push(" */"),t.push(" type PlanType = InferPlanTypes<typeof config>;"),t.push(""),t.push(" /**"),t.push(" * Limit types inferred from your Blimu configuration."),t.push(" */"),t.push(" type LimitType = InferLimitTypes<typeof config>;"),t.push(""),t.push(" /**"),t.push(" * Usage limit types inferred from your Blimu configuration."),t.push(" */"),t.push(" type UsageLimitType = InferUsageLimitTypes<typeof config>;"),t.push("}"),t.push("");l.existsSync(a)||l.mkdirSync(a,{recursive:!0}),l.writeFileSync(n,t.join(`
|
|
3
|
+
`),"utf-8")}var m=d(require("path")),g=d(require("fs"));function y(){let i=[m.join(process.cwd(),"blimu.config.ts"),m.join(process.cwd(),"blimu.config.mjs"),m.join(process.cwd(),"blimu.config.js"),m.join(process.cwd(),"blimu.config.json")];for(let e of i)if(g.existsSync(e))return e;return null}async function _(i){let e=m.isAbsolute(i)?i:m.resolve(process.cwd(),i);if(!g.existsSync(e))throw new Error(`Config file not found: ${e}`);if(m.extname(e).toLowerCase()===".json"){let t=g.readFileSync(e,"utf-8");return JSON.parse(t)}let o=await import(e);return o.default||o}function A(i,e){let o=m.relative(i,e).replace(/\.(ts|mjs|js)$/,"");return o.startsWith(".")?o:`./${o}`}function L(i){i.command("codegen").description("Generate type augmentation file from Blimu config").option("--config <path>","Path to Blimu config file (defaults to blimu.config.ts in project root)").option("--output <path>","Output path for generated type augmentation file (defaults to blimu-types.d.ts in project root)").action(async e=>{let n=p.spinner();try{let o=e.config||y();o||(p.cancel("No config file found. Please provide --config or ensure blimu.config.ts exists in project root."),process.exit(1));let t=u.isAbsolute(o)?o:u.resolve(process.cwd(),o);F.existsSync(t)||(p.cancel(`Config file not found: ${t}`),process.exit(1)),p.log.step(`Using config file: ${t}`);let s=e.output?u.isAbsolute(e.output)?e.output:u.resolve(process.cwd(),e.output):u.join(process.cwd(),"blimu-types.d.ts");p.log.step(`Output: ${s}`);let a=u.dirname(s),f=A(a,t);n.start("Generating type augmentation file with type inference..."),x({configPath:f,outputPath:s}),n.stop("\u26A1\uFE0F Successfully generated type augmentation file"),p.log.success(`Generated at: ${s}`),p.log.info("\u{1F4A1} Tip: Types are automatically inferred from your config."),p.log.info(" No regeneration needed when you update blimu.config.ts!")}catch(o){n.stop("\u274C Failed to generate type augmentation"),p.log.error(`Failed to generate type augmentation: ${o instanceof Error?o.message:String(o)}`),o instanceof Error&&o.stack&&p.log.error(o.stack),process.exit(1)}})}var c=d(require("@clack/prompts"));var T=require("@blimu/fetch");function j(i){let e=[...i?.authStrategies??[]];return i.bearer&&e.push({type:"bearer",token:i.bearer}),i.apiKey&&e.push({type:"apiKey",key:i.apiKey,location:"header",name:"X-API-KEY"}),e}var R=class{constructor(e){this.core=e}list(e,n){return this.core.request({method:"GET",path:`/v1/workspace/${encodeURIComponent(e)}/api-keys`,...n??{}})}create(e,n,o){return this.core.request({method:"POST",path:`/v1/workspace/${encodeURIComponent(e)}/api-keys`,body:n,...o??{}})}delete(e,n,o){return this.core.request({method:"DELETE",path:`/v1/workspace/${encodeURIComponent(e)}/api-keys/${encodeURIComponent(n)}`,...o??{}})}get(e,n,o){return this.core.request({method:"GET",path:`/v1/workspace/${encodeURIComponent(e)}/api-keys/${encodeURIComponent(n)}`,...o??{}})}reveal(e,n,o){return this.core.request({method:"POST",path:`/v1/workspace/${encodeURIComponent(e)}/api-keys/${encodeURIComponent(n)}/reveal`,...o??{}})}};var C=class{constructor(e){this.core=e}get(e,n,o){return this.core.request({method:"GET",path:`/v1/workspace/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/definitions`,...o??{}})}update(e,n,o,t){return this.core.request({method:"PUT",path:`/v1/workspace/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/definitions`,body:o,...t??{}})}validate(e,n,o,t){return this.core.request({method:"POST",path:`/v1/workspace/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/definitions/validate`,body:o,...t??{}})}};var v=class{constructor(e){this.core=e}getRecords(e,n,o){return this.core.request({method:"GET",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/dns/records`,...o??{}})}validate(e,n,o){return this.core.request({method:"POST",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/dns/validate`,...o??{}})}};var I=class{constructor(e){this.core=e}list(e,n,o){return this.core.request({method:"GET",path:`/v1/workspace/${encodeURIComponent(e)}/environments`,query:n,...o??{}})}create(e,n,o){return this.core.request({method:"POST",path:`/v1/workspace/${encodeURIComponent(e)}/environments`,body:n,...o??{}})}delete(e,n,o){return this.core.request({method:"DELETE",path:`/v1/workspace/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}`,...o??{}})}read(e,n,o){return this.core.request({method:"GET",path:`/v1/workspace/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}`,...o??{}})}update(e,n,o,t){return this.core.request({method:"PUT",path:`/v1/workspace/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}`,body:o,...t??{}})}getAuthConfig(e,n,o){return this.core.request({method:"GET",path:`/v1/workspace/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/auth-config`,...o??{}})}updateAuthConfig(e,n,o,t){return this.core.request({method:"PUT",path:`/v1/workspace/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/auth-config`,body:o,...t??{}})}};var S=class{constructor(e){this.core=e}getAccess(e){return this.core.request({method:"GET",path:"/v1/me/access",...e??{}})}};var k=class{constructor(e){this.core=e}list(e,n,o,t){return this.core.request({method:"GET",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/resources`,query:o,...t??{}})}create(e,n,o,t){return this.core.request({method:"POST",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/resources`,body:o,...t??{}})}delete(e,n,o,t,s){return this.core.request({method:"DELETE",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/resources/${encodeURIComponent(o)}/${encodeURIComponent(t)}`,...s??{}})}get(e,n,o,t,s){return this.core.request({method:"GET",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/resources/${encodeURIComponent(o)}/${encodeURIComponent(t)}`,...s??{}})}update(e,n,o,t,s,a){return this.core.request({method:"PUT",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/resources/${encodeURIComponent(o)}/${encodeURIComponent(t)}`,body:s,...a??{}})}listChildren(e,n,o,t,s,a){return this.core.request({method:"GET",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/resources/${encodeURIComponent(o)}/${encodeURIComponent(t)}/children`,query:s,...a??{}})}getResourceUsers(e,n,o,t,s,a){return this.core.request({method:"GET",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/resources/${encodeURIComponent(o)}/${encodeURIComponent(t)}/users`,query:s,...a??{}})}};var b=class{constructor(e){this.core=e}provision(e,n,o){return this.core.request({method:"POST",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/ssl/provision`,...o??{}})}getStatus(e,n,o){return this.core.request({method:"GET",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/ssl/status`,...o??{}})}};var U=class{constructor(e){this.core=e}list(e,n,o,t){return this.core.request({method:"GET",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/users`,query:o,...t??{}})}get(e,n,o,t){return this.core.request({method:"GET",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/users/${encodeURIComponent(o)}`,...t??{}})}getUserResources(e,n,o,t){return this.core.request({method:"GET",path:`/v1/workspaces/${encodeURIComponent(e)}/environments/${encodeURIComponent(n)}/users/${encodeURIComponent(o)}/resources`,...t??{}})}};var P=class{constructor(e){this.core=e}list(e,n,o){return this.core.request({method:"GET",path:`/v1/workspaces/${encodeURIComponent(e)}/members`,query:n,...o??{}})}remove(e,n,o){return this.core.request({method:"DELETE",path:`/v1/workspaces/${encodeURIComponent(e)}/members/${encodeURIComponent(n)}`,...o??{}})}updateRole(e,n,o,t){return this.core.request({method:"PUT",path:`/v1/workspaces/${encodeURIComponent(e)}/members/${encodeURIComponent(n)}/role`,body:o,...t??{}})}invite(e,n,o){return this.core.request({method:"POST",path:`/v1/workspaces/${encodeURIComponent(e)}/members/invite`,body:n,...o??{}})}};var $=class{constructor(e){this.core=e}list(e){return this.core.request({method:"GET",path:"/v1/workspaces",...e??{}})}create(e,n){return this.core.request({method:"POST",path:"/v1/workspaces",body:e,...n??{}})}getCurrent(e,n){return this.core.request({method:"GET",path:`/v1/workspaces/${encodeURIComponent(e)}`,...n??{}})}update(e,n,o){return this.core.request({method:"PUT",path:`/v1/workspaces/${encodeURIComponent(e)}`,body:n,...o??{}})}};var w=class{apiKeys;definitions;dns;environments;me;resources;ssl;users;workspaceMembers;workspaces;constructor(e){let n={...e??{}};delete n.apiKey,delete n.bearer;let o=j(e??{}),t=new T.FetchClient({...n,baseURL:e?.baseURL??"https://runtime.blimu.dev",...o.length>0?{authStrategies:o}:{}});this.apiKeys=new R(t),this.definitions=new C(t),this.dns=new v(t),this.environments=new I(t),this.me=new S(t),this.resources=new k(t),this.ssl=new b(t),this.users=new U(t),this.workspaceMembers=new P(t),this.workspaces=new $(t)}};var r=require("zod"),X=r.z.object({is_tenant:r.z.boolean().optional(),roles:r.z.array(r.z.string()).min(1,"At least one role must be defined"),parents:r.z.record(r.z.string(),r.z.object({required:r.z.boolean()})).optional(),roles_inheritance:r.z.record(r.z.string().min(1),r.z.array(r.z.string().regex(/^([a-z0-9_-]+->)*[a-z0-9_-]+$/i)).min(1)).optional()}),Y=r.z.object({roles:r.z.array(r.z.string()).min(1).optional(),plans:r.z.array(r.z.string()).optional(),limit:r.z.string().optional()}),Z=r.z.object({name:r.z.string(),summary:r.z.string().optional(),entitlements:r.z.array(r.z.string()).optional(),plans:r.z.array(r.z.string()).optional(),default_enabled:r.z.boolean().optional()}),ee=r.z.object({name:r.z.string().min(1,"Plan name is required"),summary:r.z.string().optional(),description:r.z.string().min(1,"Plan description is required").optional(),resource_limits:r.z.record(r.z.string(),r.z.number().int().min(0)).optional(),usage_based_limits:r.z.record(r.z.string(),r.z.object({value:r.z.number().int().min(0),period:r.z.enum(["monthly","yearly","lifetime"])})).optional()}),G=r.z.object({resources:r.z.record(r.z.string().min(1),X),entitlements:r.z.record(r.z.string().min(1),Y).optional(),features:r.z.record(r.z.string().min(1),Z).optional(),plans:r.z.record(r.z.string().min(1),ee).optional()});function B(i){i.command("push").description("Push definitions to Blimu API").option("--config <path>","Path to Blimu config file (defaults to blimu.config.ts in project root)").option("--workspace-id <id>","Workspace ID (required)").option("--environment-id <id>","Environment ID (required)").option("--api-key <key>","API key for authentication").option("--bearer <token>","Bearer token for authentication").option("--base-url <url>","Base URL for the API","https://runtime.blimu.dev").action(async e=>{let n=c.spinner();try{e.workspaceId||(c.cancel("Workspace ID is required. Use --workspace-id <id>"),process.exit(1)),e.environmentId||(c.cancel("Environment ID is required. Use --environment-id <id>"),process.exit(1)),!e.apiKey&&!e.bearer&&(c.cancel("Authentication required. Provide either --api-key <key> or --bearer <token>"),process.exit(1));let o=e.config||y();o||(c.cancel("No config file found. Please provide --config or ensure blimu.config.ts exists in project root."),process.exit(1)),c.log.step(`Loading config from: ${o}`),n.start("Loading and validating config file...");let t=await _(o);n.stop("\u2713 Config loaded"),n.start("Validating config structure...");let s=G.safeParse(t);s.success||(n.stop("\u274C Config validation failed"),c.log.error("Config validation errors:"),s.error.issues.forEach(q=>{c.log.error(` - ${q.path.join(".")}: ${q.message}`)}),process.exit(1));let a=s.data;n.stop("\u2713 Config validated"),n.start("Connecting to Blimu API...");let f=new w({baseURL:e.baseUrl,...e.apiKey?{apiKey:e.apiKey}:{},...e.bearer?{bearer:e.bearer}:{}});n.stop("\u2713 Connected"),n.start("Pushing definitions to Blimu..."),await f.definitions.update(e.workspaceId,e.environmentId,{resources:a.resources,...a.entitlements?{entitlements:a.entitlements}:{},...a.features?{features:a.features}:{},...a.plans?{plans:a.plans}:{}}),n.stop("\u2713 Definitions pushed successfully"),c.log.success(`Successfully pushed definitions to workspace ${e.workspaceId}, environment ${e.environmentId}`)}catch(o){n.stop("\u274C Failed to push definitions"),c.log.error(`Failed to push definitions: ${o instanceof Error?o.message:String(o)}`),o instanceof Error&&o.stack&&c.log.error(o.stack),process.exit(1)}})}var O=new K.Command;O.name("blimu").description("Blimu - Authorization as a Service CLI").version(process.env.npm_package_version??"0.0.0");L(O);B(O);O.parse();
|
|
4
|
+
//# sourceMappingURL=main.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/main.ts","../src/commands/codegen.ts","../src/utils/type-augmentation-generator.ts","../src/utils/config-loader.ts","../src/commands/push.ts","../src/api-sdk/client.ts","../src/api-sdk/auth-strategies.ts","../src/api-sdk/services/api_keys.ts","../src/api-sdk/services/definitions.ts","../src/api-sdk/services/dns.ts","../src/api-sdk/services/environments.ts","../src/api-sdk/services/me.ts","../src/api-sdk/services/resources.ts","../src/api-sdk/services/ssl.ts","../src/api-sdk/services/users.ts","../src/api-sdk/services/workspace_members.ts","../src/api-sdk/services/workspaces.ts","../src/config/schema.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { codegenCommand } from './commands/codegen';\nimport { pushCommand } from './commands/push';\n\nconst program = new Command();\n\nprogram\n .name('blimu')\n .description('Blimu - Authorization as a Service CLI')\n .version(process.env['npm_package_version'] ?? '0.0.0');\n\n// Register commands\ncodegenCommand(program);\npushCommand(program);\n\n// Parse arguments\nprogram.parse();\n","import { Command } from 'commander';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport * as clack from '@clack/prompts';\nimport { generateTypeAugmentationFile } from '../utils/type-augmentation-generator';\nimport {\n findDefaultConfig,\n getRelativeImportPath,\n} from '../utils/config-loader';\n\n/**\n * Register the codegen command\n */\nexport function codegenCommand(program: Command): void {\n program\n .command('codegen')\n .description('Generate type augmentation file from Blimu config')\n .option(\n '--config <path>',\n 'Path to Blimu config file (defaults to blimu.config.ts in project root)'\n )\n .option(\n '--output <path>',\n 'Output path for generated type augmentation file (defaults to blimu-types.d.ts in project root)'\n )\n .action(async (options) => {\n const spinner = clack.spinner();\n\n try {\n // Find config file\n const configPath = options.config || findDefaultConfig();\n if (!configPath) {\n clack.cancel(\n 'No config file found. Please provide --config or ensure blimu.config.ts exists in project root.'\n );\n process.exit(1);\n }\n\n // Resolve to absolute path\n const absoluteConfigPath = path.isAbsolute(configPath)\n ? configPath\n : path.resolve(process.cwd(), configPath);\n\n if (!fs.existsSync(absoluteConfigPath)) {\n clack.cancel(`Config file not found: ${absoluteConfigPath}`);\n process.exit(1);\n }\n\n clack.log.step(`Using config file: ${absoluteConfigPath}`);\n\n // Determine output path\n const outputPath = options.output\n ? path.isAbsolute(options.output)\n ? options.output\n : path.resolve(process.cwd(), options.output)\n : path.join(process.cwd(), 'blimu-types.d.ts');\n\n clack.log.step(`Output: ${outputPath}`);\n\n // Calculate relative path from output to config for import statement\n const outputDir = path.dirname(outputPath);\n const relativeConfigPath = getRelativeImportPath(\n outputDir,\n absoluteConfigPath\n );\n\n // Generate type augmentation file\n spinner.start(\n 'Generating type augmentation file with type inference...'\n );\n\n generateTypeAugmentationFile({\n configPath: relativeConfigPath,\n outputPath,\n // Always augment both @blimu/types and @blimu/backend\n // This is an internal implementation detail, not user-configurable\n });\n\n spinner.stop('⚡️ Successfully generated type augmentation file');\n\n clack.log.success(`Generated at: ${outputPath}`);\n clack.log.info(\n '💡 Tip: Types are automatically inferred from your config.'\n );\n clack.log.info(\n ' No regeneration needed when you update blimu.config.ts!'\n );\n } catch (error) {\n spinner.stop('❌ Failed to generate type augmentation');\n clack.log.error(\n `Failed to generate type augmentation: ${error instanceof Error ? error.message : String(error)}`\n );\n if (error instanceof Error && error.stack) {\n clack.log.error(error.stack);\n }\n process.exit(1);\n }\n });\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Options for generating type augmentation file\n */\nexport interface GenerateTypeAugmentationOptions {\n /** Path to the config file (relative to output directory or absolute) */\n configPath: string;\n /** Output path for the generated type augmentation file */\n outputPath: string;\n /** Types package names to augment (defaults to ['@blimu/types', '@blimu/backend']) */\n typesPackages?: string[];\n}\n\n/**\n * Generate type augmentation file for @blimu/types and @blimu/backend using type inference utilities.\n *\n * This generates a .d.ts file that imports the config and uses type inference\n * utilities to automatically extract types from the config structure.\n *\n * @param options - Generation options\n */\nexport function generateTypeAugmentationFile(options: GenerateTypeAugmentationOptions): void {\n const { configPath, outputPath, typesPackages = ['@blimu/types', '@blimu/backend'] } = options;\n\n const lines: string[] = [];\n\n // Header\n const packageNames = typesPackages.join(' and ');\n lines.push('/**');\n lines.push(` * Type Augmentation for ${packageNames}`);\n lines.push(' *');\n lines.push(` * This file augments the ${packageNames} packages with union types`);\n lines.push(' * specific to your environment configuration.');\n lines.push(' *');\n lines.push(' * Types are automatically inferred from your blimu.config.ts file.');\n lines.push(' * No regeneration needed when you update your config!');\n lines.push(' *');\n lines.push(' * Make sure to include this file in your tsconfig.json:');\n lines.push(' * {');\n lines.push(' * \"include\": [\"blimu-types.d.ts\"]');\n lines.push(' * }');\n lines.push(' */');\n lines.push('');\n\n // Calculate output directory and relative import path\n const outputDir = path.dirname(outputPath);\n const resolvedConfigPath = path.isAbsolute(configPath)\n ? path.resolve(configPath)\n : path.resolve(outputDir, configPath);\n const relativeConfigPath = path.relative(outputDir, resolvedConfigPath);\n // Remove .ts/.mjs/.js extension and ensure it starts with ./\n const importPath = relativeConfigPath.replace(/\\.(ts|mjs|js)$/, '');\n const finalImportPath = importPath.startsWith('.') ? importPath : `./${importPath}`;\n\n // Import config and type utilities\n lines.push(`import type config from '${finalImportPath}';`);\n lines.push('import type {');\n lines.push(' InferResourceTypes,');\n lines.push(' InferEntitlementTypes,');\n lines.push(' InferPlanTypes,');\n lines.push(' InferLimitTypes,');\n lines.push(' InferUsageLimitTypes,');\n lines.push(\"} from 'blimu';\");\n lines.push('');\n\n // Generate module augmentation for each package\n for (const typesPackage of typesPackages) {\n lines.push(`declare module '${typesPackage}' {`);\n lines.push(' /**');\n lines.push(' * Resource types inferred from your Blimu configuration.');\n lines.push(' */');\n lines.push(' type ResourceType = InferResourceTypes<typeof config>;');\n lines.push('');\n lines.push(' /**');\n lines.push(' * Entitlement types inferred from your Blimu configuration.');\n lines.push(' */');\n lines.push(' type EntitlementType = InferEntitlementTypes<typeof config>;');\n lines.push('');\n lines.push(' /**');\n lines.push(' * Plan types inferred from your Blimu configuration.');\n lines.push(' */');\n lines.push(' type PlanType = InferPlanTypes<typeof config>;');\n lines.push('');\n lines.push(' /**');\n lines.push(' * Limit types inferred from your Blimu configuration.');\n lines.push(' */');\n lines.push(' type LimitType = InferLimitTypes<typeof config>;');\n lines.push('');\n lines.push(' /**');\n lines.push(' * Usage limit types inferred from your Blimu configuration.');\n lines.push(' */');\n lines.push(' type UsageLimitType = InferUsageLimitTypes<typeof config>;');\n lines.push('}');\n lines.push('');\n }\n\n // Ensure output directory exists\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // Write file\n fs.writeFileSync(outputPath, lines.join('\\n'), 'utf-8');\n}\n","import * as path from 'path';\nimport * as fs from 'fs';\n\n/**\n * Find default config file in project root\n */\nexport function findDefaultConfig(): string | null {\n const possiblePaths = [\n path.join(process.cwd(), 'blimu.config.ts'),\n path.join(process.cwd(), 'blimu.config.mjs'),\n path.join(process.cwd(), 'blimu.config.js'),\n path.join(process.cwd(), 'blimu.config.json'),\n ];\n\n for (const configPath of possiblePaths) {\n if (fs.existsSync(configPath)) {\n return configPath;\n }\n }\n\n return null;\n}\n\n/**\n * Load and parse config file\n */\nexport async function loadConfig(configPath: string): Promise<unknown> {\n const absolutePath = path.isAbsolute(configPath)\n ? configPath\n : path.resolve(process.cwd(), configPath);\n\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`Config file not found: ${absolutePath}`);\n }\n\n const ext = path.extname(absolutePath).toLowerCase();\n\n if (ext === '.json') {\n const content = fs.readFileSync(absolutePath, 'utf-8');\n return JSON.parse(content);\n }\n\n // For .ts, .mjs, .js files, use dynamic import\n const module = await import(absolutePath);\n return module.default || module;\n}\n\n/**\n * Get relative import path from output directory to config file\n * Handles both relative paths and ensures proper extension handling\n */\nexport function getRelativeImportPath(fromDir: string, toFile: string): string {\n const relative = path.relative(fromDir, toFile);\n // Remove .ts/.mjs/.js extension for import\n const withoutExt = relative.replace(/\\.(ts|mjs|js)$/, '');\n // Ensure it starts with ./ or ../\n if (!withoutExt.startsWith('.')) {\n return `./${withoutExt}`;\n }\n return withoutExt;\n}\n","import { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport { BlimuCli } from '../api-sdk/client';\nimport { BlimuConfigSchema } from '../config/schema';\nimport { findDefaultConfig, loadConfig } from '../utils/config-loader';\n\n/**\n * Register the push command\n */\nexport function pushCommand(program: Command): void {\n program\n .command('push')\n .description('Push definitions to Blimu API')\n .option(\n '--config <path>',\n 'Path to Blimu config file (defaults to blimu.config.ts in project root)'\n )\n .option('--workspace-id <id>', 'Workspace ID (required)')\n .option('--environment-id <id>', 'Environment ID (required)')\n .option('--api-key <key>', 'API key for authentication')\n .option('--bearer <token>', 'Bearer token for authentication')\n .option('--base-url <url>', 'Base URL for the API', 'https://runtime.blimu.dev')\n .action(async (options) => {\n const spinner = clack.spinner();\n\n try {\n // Validate required options\n if (!options.workspaceId) {\n clack.cancel('Workspace ID is required. Use --workspace-id <id>');\n process.exit(1);\n }\n\n if (!options.environmentId) {\n clack.cancel('Environment ID is required. Use --environment-id <id>');\n process.exit(1);\n }\n\n // Check authentication\n if (!options.apiKey && !options.bearer) {\n clack.cancel(\n 'Authentication required. Provide either --api-key <key> or --bearer <token>'\n );\n process.exit(1);\n }\n\n // Find and load config file\n const configPath = options.config || findDefaultConfig();\n if (!configPath) {\n clack.cancel(\n 'No config file found. Please provide --config or ensure blimu.config.ts exists in project root.'\n );\n process.exit(1);\n }\n\n clack.log.step(`Loading config from: ${configPath}`);\n\n spinner.start('Loading and validating config file...');\n const rawConfig = await loadConfig(configPath);\n spinner.stop('✓ Config loaded');\n\n // Validate config structure\n spinner.start('Validating config structure...');\n const validationResult = BlimuConfigSchema.safeParse(rawConfig);\n if (!validationResult.success) {\n spinner.stop('❌ Config validation failed');\n clack.log.error('Config validation errors:');\n validationResult.error.issues.forEach((err) => {\n clack.log.error(` - ${err.path.join('.')}: ${err.message}`);\n });\n process.exit(1);\n }\n const config = validationResult.data;\n spinner.stop('✓ Config validated');\n\n // Create API client\n spinner.start('Connecting to Blimu API...');\n const client = new BlimuCli({\n baseURL: options.baseUrl,\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n ...(options.bearer ? { bearer: options.bearer } : {}),\n });\n spinner.stop('✓ Connected');\n\n // Push definitions\n spinner.start('Pushing definitions to Blimu...');\n await client.definitions.update(options.workspaceId, options.environmentId, {\n resources: config.resources,\n ...(config.entitlements ? { entitlements: config.entitlements } : {}),\n ...(config.features ? { features: config.features } : {}),\n ...(config.plans ? { plans: config.plans } : {}),\n });\n spinner.stop('✓ Definitions pushed successfully');\n\n clack.log.success(\n `Successfully pushed definitions to workspace ${options.workspaceId}, environment ${options.environmentId}`\n );\n } catch (error) {\n spinner.stop('❌ Failed to push definitions');\n clack.log.error(\n `Failed to push definitions: ${error instanceof Error ? error.message : String(error)}`\n );\n if (error instanceof Error && error.stack) {\n clack.log.error(error.stack);\n }\n process.exit(1);\n }\n });\n}\n","import { FetchClient, FetchError } from '@blimu/fetch';\nimport {\n type FetchClientConfig,\n type BearerAuthStrategy,\n type ApiKeyAuthStrategy,\n} from '@blimu/fetch';\nimport { buildAuthStrategies } from './auth-strategies';\nimport { ApiKeysService } from './services/api_keys';\nimport { DefinitionsService } from './services/definitions';\nimport { DnsService } from './services/dns';\nimport { EnvironmentsService } from './services/environments';\nimport { MeService } from './services/me';\nimport { ResourcesService } from './services/resources';\nimport { SslService } from './services/ssl';\nimport { UsersService } from './services/users';\nimport { WorkspaceMembersService } from './services/workspace_members';\nimport { WorkspacesService } from './services/workspaces';\n\nexport type ClientOption = FetchClientConfig & {\n apiKey?: ApiKeyAuthStrategy['key'];\n bearer?: BearerAuthStrategy['token'];\n};\n\nexport class BlimuCli {\n readonly apiKeys: ApiKeysService;\n readonly definitions: DefinitionsService;\n readonly dns: DnsService;\n readonly environments: EnvironmentsService;\n readonly me: MeService;\n readonly resources: ResourcesService;\n readonly ssl: SslService;\n readonly users: UsersService;\n readonly workspaceMembers: WorkspaceMembersService;\n readonly workspaces: WorkspacesService;\n\n constructor(options?: ClientOption) {\n const restCfg = { ...(options ?? {}) };\n delete restCfg.apiKey;\n delete restCfg.bearer;\n\n const authStrategies = buildAuthStrategies(options ?? {});\n\n const core = new FetchClient({\n ...restCfg,\n baseURL: options?.baseURL ?? 'https://runtime.blimu.dev',\n ...(authStrategies.length > 0 ? { authStrategies } : {}),\n });\n\n this.apiKeys = new ApiKeysService(core);\n this.definitions = new DefinitionsService(core);\n this.dns = new DnsService(core);\n this.environments = new EnvironmentsService(core);\n this.me = new MeService(core);\n this.resources = new ResourcesService(core);\n this.ssl = new SslService(core);\n this.users = new UsersService(core);\n this.workspaceMembers = new WorkspaceMembersService(core);\n this.workspaces = new WorkspacesService(core);\n }\n}\n\n// Re-export FetchError for backward compatibility\nexport { FetchError };\nexport const BlimuCliError = FetchError;\n","import type { AuthStrategy } from '@blimu/fetch';\nimport type { ClientOption } from './client';\n\nexport function buildAuthStrategies(cfg: ClientOption): AuthStrategy[] {\n const authStrategies: AuthStrategy[] = [...(cfg?.authStrategies ?? [])];\n\n if (cfg.bearer) {\n authStrategies.push({\n type: 'bearer',\n token: cfg.bearer,\n });\n }\n if (cfg.apiKey) {\n authStrategies.push({\n type: 'apiKey',\n key: cfg.apiKey,\n location: 'header',\n name: 'X-API-KEY',\n });\n }\n return authStrategies;\n}\n","import { FetchClient } from '@blimu/fetch';\nimport * as Schema from '../schema';\n\nexport class ApiKeysService {\n constructor(private core: FetchClient) {}\n\n /**\n * GET /v1/workspace/{workspaceId}/api-keys*\n * @returns List API keys*/\n list(\n workspaceId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.ApiKeyListDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/api-keys`,\n ...(init ?? {}),\n });\n }\n\n /**\n * POST /v1/workspace/{workspaceId}/api-keys*\n * @returns Create API key*/\n create(\n workspaceId: string,\n body: Schema.ApiKeyCreateDto,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.ApiKeyDto_Output> {\n return this.core.request({\n method: 'POST',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/api-keys`,\n body,\n ...(init ?? {}),\n });\n }\n\n /**\n * DELETE /v1/workspace/{workspaceId}/api-keys/{id}*\n * @returns Delete API key*/\n delete(\n workspaceId: string,\n id: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<unknown> {\n return this.core.request({\n method: 'DELETE',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/api-keys/${encodeURIComponent(id)}`,\n ...(init ?? {}),\n });\n }\n\n /**\n * GET /v1/workspace/{workspaceId}/api-keys/{id}*\n * @returns Get API key*/\n get(\n workspaceId: string,\n id: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.ApiKeyDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/api-keys/${encodeURIComponent(id)}`,\n ...(init ?? {}),\n });\n }\n\n /**\n * POST /v1/workspace/{workspaceId}/api-keys/{id}/reveal*\n * @returns Reveal API key*/\n reveal(\n workspaceId: string,\n id: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.ApiKeyRevealDto_Output> {\n return this.core.request({\n method: 'POST',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/api-keys/${encodeURIComponent(id)}/reveal`,\n ...(init ?? {}),\n });\n }\n}\n","import { FetchClient } from '@blimu/fetch';\nimport * as Schema from '../schema';\n\nexport class DefinitionsService {\n constructor(private core: FetchClient) {}\n\n /**\n * GET /v1/workspace/{workspaceId}/environments/{environmentId}/definitions*\n * @summary Get environment definitions*/\n get(\n workspaceId: string,\n environmentId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.DefinitionDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/definitions`,\n ...(init ?? {}),\n });\n }\n\n /**\n * PUT /v1/workspace/{workspaceId}/environments/{environmentId}/definitions*\n * @summary Update environment definitions*/\n update(\n workspaceId: string,\n environmentId: string,\n body: Schema.DefinitionUpdateDto,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<unknown> {\n return this.core.request({\n method: 'PUT',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/definitions`,\n body,\n ...(init ?? {}),\n });\n }\n\n /**\n * POST /v1/workspace/{workspaceId}/environments/{environmentId}/definitions/validate*\n * @summary Validate Blimu configuration*\n * @description Validates a complete Blimu configuration including resources, entitlements, features, and plans. Returns validation errors and optionally generates an OpenAPI spec if valid.*/\n validate(\n workspaceId: string,\n environmentId: string,\n body: Schema.DefinitionValidateRequestDto,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.DefinitionValidateResponseDto_Output> {\n return this.core.request({\n method: 'POST',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/definitions/validate`,\n body,\n ...(init ?? {}),\n });\n }\n}\n","import { FetchClient } from '@blimu/fetch';\nimport * as Schema from '../schema';\n\nexport class DnsService {\n constructor(private core: FetchClient) {}\n\n /**\n * GET /v1/workspaces/{workspaceId}/environments/{environmentId}/dns/records*\n * @summary Get DNS records for an environment*/\n getRecords(\n workspaceId: string,\n environmentId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.DnsRecordListDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/dns/records`,\n ...(init ?? {}),\n });\n }\n\n /**\n * POST /v1/workspaces/{workspaceId}/environments/{environmentId}/dns/validate*\n * @summary Validate DNS records for an environment*/\n validate(\n workspaceId: string,\n environmentId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.DnsRecordListDto_Output> {\n return this.core.request({\n method: 'POST',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/dns/validate`,\n ...(init ?? {}),\n });\n }\n}\n","import { FetchClient } from '@blimu/fetch';\nimport * as Schema from '../schema';\n\nexport class EnvironmentsService {\n constructor(private core: FetchClient) {}\n\n /**\n * GET /v1/workspace/{workspaceId}/environments*\n * @summary List environments*/\n list(\n workspaceId: string,\n query?: Schema.EnvironmentsListQuery,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.EnvironmentListDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/environments`,\n query,\n ...(init ?? {}),\n });\n }\n\n /**\n * POST /v1/workspace/{workspaceId}/environments*\n * @summary Create a new environment*/\n create(\n workspaceId: string,\n body: Schema.EnvironmentCreateDto,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.EnvironmentDto_Output> {\n return this.core.request({\n method: 'POST',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/environments`,\n body,\n ...(init ?? {}),\n });\n }\n\n /**\n * DELETE /v1/workspace/{workspaceId}/environments/{environmentId}*\n * @summary Delete an environment*/\n delete(\n workspaceId: string,\n environmentId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<unknown> {\n return this.core.request({\n method: 'DELETE',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}`,\n ...(init ?? {}),\n });\n }\n\n /**\n * GET /v1/workspace/{workspaceId}/environments/{environmentId}*\n * @summary Read an environment by ID*/\n read(\n workspaceId: string,\n environmentId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.EnvironmentWithDefinitionDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}`,\n ...(init ?? {}),\n });\n }\n\n /**\n * PUT /v1/workspace/{workspaceId}/environments/{environmentId}*\n * @summary Update an environment*/\n update(\n workspaceId: string,\n environmentId: string,\n body: Schema.EnvironmentUpdateDto,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.EnvironmentDto_Output> {\n return this.core.request({\n method: 'PUT',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}`,\n body,\n ...(init ?? {}),\n });\n }\n\n /**\n * GET /v1/workspace/{workspaceId}/environments/{environmentId}/auth-config*\n * @summary Get authentication configuration for environment*/\n getAuthConfig(\n workspaceId: string,\n environmentId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.EnvironmentAuthConfigDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/auth-config`,\n ...(init ?? {}),\n });\n }\n\n /**\n * PUT /v1/workspace/{workspaceId}/environments/{environmentId}/auth-config*\n * @summary Update authentication configuration for environment*/\n updateAuthConfig(\n workspaceId: string,\n environmentId: string,\n body: Schema.EnvironmentAuthConfigUpdateDto,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.EnvironmentAuthConfigDto_Output> {\n return this.core.request({\n method: 'PUT',\n path: `/v1/workspace/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/auth-config`,\n body,\n ...(init ?? {}),\n });\n }\n}\n","import { FetchClient } from '@blimu/fetch';\nimport * as Schema from '../schema';\n\nexport class MeService {\n constructor(private core: FetchClient) {}\n\n /**\n * GET /v1/me/access*\n * @summary Get active resources for current user*/\n getAccess(init?: Omit<RequestInit, 'method' | 'body'>): Promise<Schema.UserAccessDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/me/access`,\n ...(init ?? {}),\n });\n }\n}\n","import { FetchClient } from '@blimu/fetch';\nimport * as Schema from '../schema';\n\nexport class ResourcesService {\n constructor(private core: FetchClient) {}\n\n /**\n * GET /v1/workspaces/{workspaceId}/environments/{environmentId}/resources*\n * @summary List resources for an environment*/\n list(\n workspaceId: string,\n environmentId: string,\n query?: Schema.ResourcesListQuery,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.ResourceListResponseDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/resources`,\n query,\n ...(init ?? {}),\n });\n }\n\n /**\n * POST /v1/workspaces/{workspaceId}/environments/{environmentId}/resources*\n * @summary Create a new resource*/\n create(\n workspaceId: string,\n environmentId: string,\n body: Schema.ResourceCreateDto,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.ResourceDto_Output> {\n return this.core.request({\n method: 'POST',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/resources`,\n body,\n ...(init ?? {}),\n });\n }\n\n /**\n * DELETE /v1/workspaces/{workspaceId}/environments/{environmentId}/resources/{resourceType}/{resourceId}*\n * @summary Delete a resource*/\n delete(\n workspaceId: string,\n environmentId: string,\n resourceType: string,\n resourceId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<unknown> {\n return this.core.request({\n method: 'DELETE',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/resources/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}`,\n ...(init ?? {}),\n });\n }\n\n /**\n * GET /v1/workspaces/{workspaceId}/environments/{environmentId}/resources/{resourceType}/{resourceId}*\n * @summary Get a specific resource*/\n get(\n workspaceId: string,\n environmentId: string,\n resourceType: string,\n resourceId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.ResourceDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/resources/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}`,\n ...(init ?? {}),\n });\n }\n\n /**\n * PUT /v1/workspaces/{workspaceId}/environments/{environmentId}/resources/{resourceType}/{resourceId}*\n * @summary Update a resource*/\n update(\n workspaceId: string,\n environmentId: string,\n resourceType: string,\n resourceId: string,\n body: Schema.ResourceUpdateDto,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.ResourceDto_Output> {\n return this.core.request({\n method: 'PUT',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/resources/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}`,\n body,\n ...(init ?? {}),\n });\n }\n\n /**\n * GET /v1/workspaces/{workspaceId}/environments/{environmentId}/resources/{resourceType}/{resourceId}/children*\n * @summary List children resources for a specific resource*/\n listChildren(\n workspaceId: string,\n environmentId: string,\n resourceType: string,\n resourceId: string,\n query?: Schema.ResourcesListChildrenQuery,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.ResourceListResponseDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/resources/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}/children`,\n query,\n ...(init ?? {}),\n });\n }\n\n /**\n * GET /v1/workspaces/{workspaceId}/environments/{environmentId}/resources/{resourceType}/{resourceId}/users*\n * @summary Get users with roles on a resource*/\n getResourceUsers(\n workspaceId: string,\n environmentId: string,\n resourceType: string,\n resourceId: string,\n query?: Schema.ResourcesGetResourceUsersQuery,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.ResourceUserListResponseDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/resources/${encodeURIComponent(resourceType)}/${encodeURIComponent(resourceId)}/users`,\n query,\n ...(init ?? {}),\n });\n }\n}\n","import { FetchClient } from '@blimu/fetch';\nimport * as Schema from '../schema';\n\nexport class SslService {\n constructor(private core: FetchClient) {}\n\n /**\n * POST /v1/workspaces/{workspaceId}/environments/{environmentId}/ssl/provision*\n * @summary Provision custom domains and SSL certificates for an environment*/\n provision(\n workspaceId: string,\n environmentId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.CustomHostnameListDto_Output> {\n return this.core.request({\n method: 'POST',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/ssl/provision`,\n ...(init ?? {}),\n });\n }\n\n /**\n * GET /v1/workspaces/{workspaceId}/environments/{environmentId}/ssl/status*\n * @summary Get SSL certificate status for an environment*/\n getStatus(\n workspaceId: string,\n environmentId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.SslStatusResponseDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/ssl/status`,\n ...(init ?? {}),\n });\n }\n}\n","import { FetchClient } from '@blimu/fetch';\nimport * as Schema from '../schema';\n\nexport class UsersService {\n constructor(private core: FetchClient) {}\n\n /**\n * GET /v1/workspaces/{workspaceId}/environments/{environmentId}/users*\n * @summary List users for an environment*/\n list(\n workspaceId: string,\n environmentId: string,\n query?: Schema.UsersListQuery,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.UserListResponseDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/users`,\n query,\n ...(init ?? {}),\n });\n }\n\n /**\n * GET /v1/workspaces/{workspaceId}/environments/{environmentId}/users/{userId}*\n * @summary Get user details by ID*/\n get(\n workspaceId: string,\n environmentId: string,\n userId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.UserDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/users/${encodeURIComponent(userId)}`,\n ...(init ?? {}),\n });\n }\n\n /**\n * GET /v1/workspaces/{workspaceId}/environments/{environmentId}/users/{userId}/resources*\n * @summary Get user resource relationships*/\n getUserResources(\n workspaceId: string,\n environmentId: string,\n userId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.UserResourceDto_Output[]> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/environments/${encodeURIComponent(environmentId)}/users/${encodeURIComponent(userId)}/resources`,\n ...(init ?? {}),\n });\n }\n}\n","import { FetchClient } from '@blimu/fetch';\nimport * as Schema from '../schema';\n\nexport class WorkspaceMembersService {\n constructor(private core: FetchClient) {}\n\n /**\n * GET /v1/workspaces/{workspaceId}/members*\n * @summary List workspace members with pagination and search*/\n list(\n workspaceId: string,\n query?: Schema.WorkspaceMembersListQuery,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.MemberListResponseDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/members`,\n query,\n ...(init ?? {}),\n });\n }\n\n /**\n * DELETE /v1/workspaces/{workspaceId}/members/{userId}*\n * @summary Remove member from workspace*/\n remove(\n workspaceId: string,\n userId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<unknown> {\n return this.core.request({\n method: 'DELETE',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/members/${encodeURIComponent(userId)}`,\n ...(init ?? {}),\n });\n }\n\n /**\n * PUT /v1/workspaces/{workspaceId}/members/{userId}/role*\n * @summary Update member role*/\n updateRole(\n workspaceId: string,\n userId: string,\n body: Schema.UpdateRoleDto,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<unknown> {\n return this.core.request({\n method: 'PUT',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/members/${encodeURIComponent(userId)}/role`,\n body,\n ...(init ?? {}),\n });\n }\n\n /**\n * POST /v1/workspaces/{workspaceId}/members/invite*\n * @summary Invite a member to the workspace*/\n invite(\n workspaceId: string,\n body: Schema.InviteMemberDto,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.InviteMemberResponseDto_Output> {\n return this.core.request({\n method: 'POST',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}/members/invite`,\n body,\n ...(init ?? {}),\n });\n }\n}\n","import { FetchClient } from '@blimu/fetch';\nimport * as Schema from '../schema';\n\nexport class WorkspacesService {\n constructor(private core: FetchClient) {}\n\n /**\n * GET /v1/workspaces*\n * @summary Get all workspaces*/\n list(init?: Omit<RequestInit, 'method' | 'body'>): Promise<Schema.WorkspaceListDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspaces`,\n ...(init ?? {}),\n });\n }\n\n /**\n * POST /v1/workspaces*\n * @summary Create a new workspace*/\n create(\n body: Schema.WorkspaceCreateDto,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.WorkspaceCreateResponseDto_Output> {\n return this.core.request({\n method: 'POST',\n path: `/v1/workspaces`,\n body,\n ...(init ?? {}),\n });\n }\n\n /**\n * GET /v1/workspaces/{workspaceId}*\n * @summary Get current authenticated workspace*/\n getCurrent(\n workspaceId: string,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.WorkspaceDto_Output> {\n return this.core.request({\n method: 'GET',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}`,\n ...(init ?? {}),\n });\n }\n\n /**\n * PUT /v1/workspaces/{workspaceId}*\n * @summary Update authenticated workspace*/\n update(\n workspaceId: string,\n body: Schema.WorkspaceUpdateDto,\n init?: Omit<RequestInit, 'method' | 'body'>\n ): Promise<Schema.WorkspaceDto_Output> {\n return this.core.request({\n method: 'PUT',\n path: `/v1/workspaces/${encodeURIComponent(workspaceId)}`,\n body,\n ...(init ?? {}),\n });\n }\n}\n","import { z } from 'zod';\n\n/**\n * Zod schema for resource definition\n */\nexport const ResourceDefinitionSchema = z.object({\n is_tenant: z.boolean().optional(),\n roles: z.array(z.string()).min(1, 'At least one role must be defined'),\n parents: z.record(z.string(), z.object({ required: z.boolean() })).optional(),\n roles_inheritance: z\n .record(\n z.string().min(1), // local role\n // Allow tokens containing letters, numbers, underscores or dashes\n // Examples: parent->editor, organization->admin, workspace_v2->viewer\n z.array(z.string().regex(/^([a-z0-9_-]+->)*[a-z0-9_-]+$/i)).min(1),\n )\n .optional(),\n});\n\n/**\n * Zod schema for entitlement definition\n */\nexport const EntitlementDefinitionSchema = z.object({\n roles: z.array(z.string()).min(1).optional(),\n plans: z.array(z.string()).optional(),\n limit: z.string().optional(), // Reference to usage-based limit\n});\n\n/**\n * Zod schema for feature definition\n */\nexport const FeatureDefinitionSchema = z.object({\n name: z.string(),\n summary: z.string().optional(),\n entitlements: z.array(z.string()).optional(),\n plans: z.array(z.string()).optional(),\n default_enabled: z.boolean().optional(),\n});\n\n/**\n * Zod schema for plan definition\n */\nexport const PlanDefinitionSchema = z.object({\n name: z.string().min(1, 'Plan name is required'),\n summary: z.string().optional(),\n description: z.string().min(1, 'Plan description is required').optional(),\n resource_limits: z.record(z.string(), z.number().int().min(0)).optional(),\n usage_based_limits: z\n .record(\n z.string(),\n z.object({\n value: z.number().int().min(0),\n period: z.enum(['monthly', 'yearly', 'lifetime']),\n }),\n )\n .optional(),\n});\n\n/**\n * Zod schema for complete Blimu configuration\n */\nexport const BlimuConfigSchema = z.object({\n resources: z.record(z.string().min(1), ResourceDefinitionSchema),\n entitlements: z.record(z.string().min(1), EntitlementDefinitionSchema).optional(),\n features: z.record(z.string().min(1), FeatureDefinitionSchema).optional(),\n plans: z.record(z.string().min(1), PlanDefinitionSchema).optional(),\n});\n\n/**\n * Type inference from schemas\n */\nexport type ResourceDefinition = z.infer<typeof ResourceDefinitionSchema>;\nexport type EntitlementDefinition = z.infer<typeof EntitlementDefinitionSchema>;\nexport type FeatureDefinition = z.infer<typeof FeatureDefinitionSchema>;\nexport type PlanDefinition = z.infer<typeof PlanDefinitionSchema>;\nexport type BlimuConfig = z.infer<typeof BlimuConfigSchema>;\n"],"mappings":"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","names":["import_commander","path","fs","clack","fs","path","generateTypeAugmentationFile","options","configPath","outputPath","typesPackages","lines","packageNames","outputDir","resolvedConfigPath","importPath","finalImportPath","typesPackage","path","fs","findDefaultConfig","possiblePaths","configPath","loadConfig","absolutePath","content","module","getRelativeImportPath","fromDir","toFile","withoutExt","codegenCommand","program","options","spinner","configPath","findDefaultConfig","absoluteConfigPath","outputPath","outputDir","relativeConfigPath","getRelativeImportPath","generateTypeAugmentationFile","error","clack","import_fetch","buildAuthStrategies","cfg","authStrategies","ApiKeysService","core","workspaceId","init","body","id","DefinitionsService","core","workspaceId","environmentId","init","body","DnsService","core","workspaceId","environmentId","init","EnvironmentsService","core","workspaceId","query","init","body","environmentId","MeService","core","init","ResourcesService","core","workspaceId","environmentId","query","init","body","resourceType","resourceId","SslService","core","workspaceId","environmentId","init","UsersService","core","workspaceId","environmentId","query","init","userId","WorkspaceMembersService","core","workspaceId","query","init","userId","body","WorkspacesService","core","init","body","workspaceId","BlimuCli","options","restCfg","authStrategies","buildAuthStrategies","core","ApiKeysService","DefinitionsService","DnsService","EnvironmentsService","MeService","ResourcesService","SslService","UsersService","WorkspaceMembersService","WorkspacesService","import_zod","ResourceDefinitionSchema","EntitlementDefinitionSchema","FeatureDefinitionSchema","PlanDefinitionSchema","BlimuConfigSchema","pushCommand","program","options","spinner","configPath","findDefaultConfig","rawConfig","loadConfig","validationResult","BlimuConfigSchema","err","config","client","BlimuCli","error","program","codegenCommand","pushCommand"]}
|
package/package.json
CHANGED
|
@@ -1,24 +1,37 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blimu",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"description": "Blimu - Authorization as a Service CLI",
|
|
5
|
-
"main": "dist/index.
|
|
5
|
+
"main": "dist/index.cjs",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
6
7
|
"types": "dist/index.d.ts",
|
|
7
|
-
"bin": "./dist/main.
|
|
8
|
+
"bin": "./dist/main.cjs",
|
|
8
9
|
"files": [
|
|
9
10
|
"dist",
|
|
10
11
|
"README.md",
|
|
11
12
|
"bin/**"
|
|
12
13
|
],
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.mjs",
|
|
18
|
+
"require": "./dist/index.cjs",
|
|
19
|
+
"default": "./dist/index.cjs"
|
|
20
|
+
},
|
|
21
|
+
"./package.json": "./package.json"
|
|
22
|
+
},
|
|
23
|
+
"sideEffects": false,
|
|
13
24
|
"scripts": {
|
|
25
|
+
"d:build": "npm run build && npm run typecheck",
|
|
14
26
|
"build": "tsup",
|
|
15
27
|
"dev": "tsx watch src/main.ts",
|
|
16
|
-
"
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
17
29
|
"test": "vitest run",
|
|
18
30
|
"test:watch": "vitest",
|
|
19
31
|
"prepublishOnly": "yarn build"
|
|
20
32
|
},
|
|
21
33
|
"dependencies": {
|
|
34
|
+
"@blimu/fetch": "^0.4.0",
|
|
22
35
|
"@clack/prompts": "^0.11.0",
|
|
23
36
|
"commander": "^14.0.2",
|
|
24
37
|
"zod": "^4.3.5"
|
package/dist/main.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";var b=Object.create;var y=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,I=Object.prototype.hasOwnProperty;var $=(i,t,s,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of w(t))!I.call(i,e)&&e!==s&&y(i,e,{get:()=>t[e],enumerable:!(o=j(t,e))||o.enumerable});return i};var f=(i,t,s)=>(s=i!=null?b(C(i)):{},$(t||!i||!i.__esModule?y(s,"default",{value:i,enumerable:!0}):s,i));var T=require("commander");var n=f(require("path")),h=f(require("fs")),r=f(require("@clack/prompts"));var c=f(require("fs")),p=f(require("path"));function d(i){let{configPath:t,outputPath:s,typesPackages:o=["@blimu/types","@blimu/backend"]}=i,e=[],a=o.join(" and ");e.push("/**"),e.push(` * Type Augmentation for ${a}`),e.push(" *"),e.push(` * This file augments the ${a} packages with union types`),e.push(" * specific to your environment configuration."),e.push(" *"),e.push(" * Types are automatically inferred from your blimu.config.ts file."),e.push(" * No regeneration needed when you update your config!"),e.push(" *"),e.push(" * Make sure to include this file in your tsconfig.json:"),e.push(" * {"),e.push(' * "include": ["blimu-types.d.ts"]'),e.push(" * }"),e.push(" */"),e.push("");let u=p.dirname(s),l=p.isAbsolute(t)?p.resolve(t):p.resolve(u,t),m=p.relative(u,l).replace(/\.(ts|mjs|js)$/,""),k=m.startsWith(".")?m:`./${m}`;e.push(`import type config from '${k}';`),e.push("import type {"),e.push(" InferResourceTypes,"),e.push(" InferEntitlementTypes,"),e.push(" InferPlanTypes,"),e.push(" InferLimitTypes,"),e.push(" InferUsageLimitTypes,"),e.push("} from 'blimu';"),e.push("");for(let v of o)e.push(`declare module '${v}' {`),e.push(" /**"),e.push(" * Resource types inferred from your Blimu configuration."),e.push(" */"),e.push(" type ResourceType = InferResourceTypes<typeof config>;"),e.push(""),e.push(" /**"),e.push(" * Entitlement types inferred from your Blimu configuration."),e.push(" */"),e.push(" type EntitlementType = InferEntitlementTypes<typeof config>;"),e.push(""),e.push(" /**"),e.push(" * Plan types inferred from your Blimu configuration."),e.push(" */"),e.push(" type PlanType = InferPlanTypes<typeof config>;"),e.push(""),e.push(" /**"),e.push(" * Limit types inferred from your Blimu configuration."),e.push(" */"),e.push(" type LimitType = InferLimitTypes<typeof config>;"),e.push(""),e.push(" /**"),e.push(" * Usage limit types inferred from your Blimu configuration."),e.push(" */"),e.push(" type UsageLimitType = InferUsageLimitTypes<typeof config>;"),e.push("}"),e.push("");c.existsSync(u)||c.mkdirSync(u,{recursive:!0}),c.writeFileSync(s,e.join(`
|
|
3
|
-
`),"utf-8")}function x(){let i=[n.join(process.cwd(),"blimu.config.ts"),n.join(process.cwd(),"blimu.config.mjs"),n.join(process.cwd(),"blimu.config.js")];for(let t of i)if(h.existsSync(t))return t;return null}function A(i,t){let o=n.relative(i,t).replace(/\.(ts|mjs|js)$/,"");return o.startsWith(".")?o:`./${o}`}function P(i){i.command("codegen").description("Generate type augmentation file from Blimu config").option("--config <path>","Path to Blimu config file (defaults to blimu.config.ts in project root)").option("--output <path>","Output path for generated type augmentation file (defaults to blimu-types.d.ts in project root)").action(async t=>{let s=r.spinner();try{let o=t.config||x();o||(r.cancel("No config file found. Please provide --config or ensure blimu.config.ts exists in project root."),process.exit(1));let e=n.isAbsolute(o)?o:n.resolve(process.cwd(),o);h.existsSync(e)||(r.cancel(`Config file not found: ${e}`),process.exit(1)),r.log.step(`Using config file: ${e}`);let a=t.output?n.isAbsolute(t.output)?t.output:n.resolve(process.cwd(),t.output):n.join(process.cwd(),"blimu-types.d.ts");r.log.step(`Output: ${a}`);let u=n.dirname(a),l=A(u,e);s.start("Generating type augmentation file with type inference..."),d({configPath:l,outputPath:a}),s.stop("\u26A1\uFE0F Successfully generated type augmentation file"),r.log.success(`Generated at: ${a}`),r.log.info("\u{1F4A1} Tip: Types are automatically inferred from your config."),r.log.info(" No regeneration needed when you update blimu.config.ts!")}catch(o){s.stop("\u274C Failed to generate type augmentation"),r.log.error(`Failed to generate type augmentation: ${o instanceof Error?o.message:String(o)}`),o instanceof Error&&o.stack&&r.log.error(o.stack),process.exit(1)}})}var g=new T.Command;g.name("blimu").description("Blimu - Authorization as a Service CLI").version(process.env.npm_package_version||"0.7.0");P(g);g.parse();
|
|
4
|
-
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main.ts","../src/commands/codegen.ts","../src/utils/type-augmentation-generator.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { codegenCommand } from './commands/codegen';\n\nconst program = new Command();\n\nprogram\n .name('blimu')\n .description('Blimu - Authorization as a Service CLI')\n .version(process.env.npm_package_version || '0.7.0');\n\n// Register commands\ncodegenCommand(program);\n\n// Parse arguments\nprogram.parse();\n","import { Command } from 'commander';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport * as clack from '@clack/prompts';\nimport { generateTypeAugmentationFile } from '../utils/type-augmentation-generator';\n\n/**\n * Find default config file in project root\n */\nfunction findDefaultConfig(): string | null {\n const possiblePaths = [\n path.join(process.cwd(), 'blimu.config.ts'),\n path.join(process.cwd(), 'blimu.config.mjs'),\n path.join(process.cwd(), 'blimu.config.js'),\n ];\n\n for (const configPath of possiblePaths) {\n if (fs.existsSync(configPath)) {\n return configPath;\n }\n }\n\n return null;\n}\n\n/**\n * Get relative import path from output directory to config file\n * Handles both relative paths and ensures proper extension handling\n */\nfunction getRelativeImportPath(fromDir: string, toFile: string): string {\n const relative = path.relative(fromDir, toFile);\n // Remove .ts/.mjs/.js extension for import\n const withoutExt = relative.replace(/\\.(ts|mjs|js)$/, '');\n // Ensure it starts with ./ or ../\n if (!withoutExt.startsWith('.')) {\n return `./${withoutExt}`;\n }\n return withoutExt;\n}\n\n/**\n * Register the codegen command\n */\nexport function codegenCommand(program: Command): void {\n program\n .command('codegen')\n .description('Generate type augmentation file from Blimu config')\n .option(\n '--config <path>',\n 'Path to Blimu config file (defaults to blimu.config.ts in project root)',\n )\n .option(\n '--output <path>',\n 'Output path for generated type augmentation file (defaults to blimu-types.d.ts in project root)',\n )\n .action(async (options) => {\n const spinner = clack.spinner();\n\n try {\n // Find config file\n const configPath = options.config || findDefaultConfig();\n if (!configPath) {\n clack.cancel(\n 'No config file found. Please provide --config or ensure blimu.config.ts exists in project root.',\n );\n process.exit(1);\n }\n\n // Resolve to absolute path\n const absoluteConfigPath = path.isAbsolute(configPath)\n ? configPath\n : path.resolve(process.cwd(), configPath);\n\n if (!fs.existsSync(absoluteConfigPath)) {\n clack.cancel(`Config file not found: ${absoluteConfigPath}`);\n process.exit(1);\n }\n\n clack.log.step(`Using config file: ${absoluteConfigPath}`);\n\n // Determine output path\n const outputPath = options.output\n ? path.isAbsolute(options.output)\n ? options.output\n : path.resolve(process.cwd(), options.output)\n : path.join(process.cwd(), 'blimu-types.d.ts');\n\n clack.log.step(`Output: ${outputPath}`);\n\n // Calculate relative path from output to config for import statement\n const outputDir = path.dirname(outputPath);\n const relativeConfigPath = getRelativeImportPath(outputDir, absoluteConfigPath);\n\n // Generate type augmentation file\n spinner.start('Generating type augmentation file with type inference...');\n\n generateTypeAugmentationFile({\n configPath: relativeConfigPath,\n outputPath,\n // Always augment both @blimu/types and @blimu/backend\n // This is an internal implementation detail, not user-configurable\n });\n\n spinner.stop('⚡️ Successfully generated type augmentation file');\n\n clack.log.success(`Generated at: ${outputPath}`);\n clack.log.info('💡 Tip: Types are automatically inferred from your config.');\n clack.log.info(' No regeneration needed when you update blimu.config.ts!');\n } catch (error) {\n spinner.stop('❌ Failed to generate type augmentation');\n clack.log.error(\n `Failed to generate type augmentation: ${error instanceof Error ? error.message : String(error)}`,\n );\n if (error instanceof Error && error.stack) {\n clack.log.error(error.stack);\n }\n process.exit(1);\n }\n });\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Options for generating type augmentation file\n */\nexport interface GenerateTypeAugmentationOptions {\n /** Path to the config file (relative to output directory or absolute) */\n configPath: string;\n /** Output path for the generated type augmentation file */\n outputPath: string;\n /** Types package names to augment (defaults to ['@blimu/types', '@blimu/backend']) */\n typesPackages?: string[];\n}\n\n/**\n * Generate type augmentation file for @blimu/types and @blimu/backend using type inference utilities.\n *\n * This generates a .d.ts file that imports the config and uses type inference\n * utilities to automatically extract types from the config structure.\n *\n * @param options - Generation options\n */\nexport function generateTypeAugmentationFile(options: GenerateTypeAugmentationOptions): void {\n const { configPath, outputPath, typesPackages = ['@blimu/types', '@blimu/backend'] } = options;\n\n const lines: string[] = [];\n\n // Header\n const packageNames = typesPackages.join(' and ');\n lines.push('/**');\n lines.push(` * Type Augmentation for ${packageNames}`);\n lines.push(' *');\n lines.push(` * This file augments the ${packageNames} packages with union types`);\n lines.push(' * specific to your environment configuration.');\n lines.push(' *');\n lines.push(' * Types are automatically inferred from your blimu.config.ts file.');\n lines.push(' * No regeneration needed when you update your config!');\n lines.push(' *');\n lines.push(' * Make sure to include this file in your tsconfig.json:');\n lines.push(' * {');\n lines.push(' * \"include\": [\"blimu-types.d.ts\"]');\n lines.push(' * }');\n lines.push(' */');\n lines.push('');\n\n // Calculate output directory and relative import path\n const outputDir = path.dirname(outputPath);\n const resolvedConfigPath = path.isAbsolute(configPath)\n ? path.resolve(configPath)\n : path.resolve(outputDir, configPath);\n const relativeConfigPath = path.relative(outputDir, resolvedConfigPath);\n // Remove .ts/.mjs/.js extension and ensure it starts with ./\n const importPath = relativeConfigPath.replace(/\\.(ts|mjs|js)$/, '');\n const finalImportPath = importPath.startsWith('.') ? importPath : `./${importPath}`;\n\n // Import config and type utilities\n lines.push(`import type config from '${finalImportPath}';`);\n lines.push('import type {');\n lines.push(' InferResourceTypes,');\n lines.push(' InferEntitlementTypes,');\n lines.push(' InferPlanTypes,');\n lines.push(' InferLimitTypes,');\n lines.push(' InferUsageLimitTypes,');\n lines.push(\"} from 'blimu';\");\n lines.push('');\n\n // Generate module augmentation for each package\n for (const typesPackage of typesPackages) {\n lines.push(`declare module '${typesPackage}' {`);\n lines.push(' /**');\n lines.push(' * Resource types inferred from your Blimu configuration.');\n lines.push(' */');\n lines.push(' type ResourceType = InferResourceTypes<typeof config>;');\n lines.push('');\n lines.push(' /**');\n lines.push(' * Entitlement types inferred from your Blimu configuration.');\n lines.push(' */');\n lines.push(' type EntitlementType = InferEntitlementTypes<typeof config>;');\n lines.push('');\n lines.push(' /**');\n lines.push(' * Plan types inferred from your Blimu configuration.');\n lines.push(' */');\n lines.push(' type PlanType = InferPlanTypes<typeof config>;');\n lines.push('');\n lines.push(' /**');\n lines.push(' * Limit types inferred from your Blimu configuration.');\n lines.push(' */');\n lines.push(' type LimitType = InferLimitTypes<typeof config>;');\n lines.push('');\n lines.push(' /**');\n lines.push(' * Usage limit types inferred from your Blimu configuration.');\n lines.push(' */');\n lines.push(' type UsageLimitType = InferUsageLimitTypes<typeof config>;');\n lines.push('}');\n lines.push('');\n }\n\n // Ensure output directory exists\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // Write file\n fs.writeFileSync(outputPath, lines.join('\\n'), 'utf-8');\n}\n"],"mappings":"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","names":["import_commander","path","fs","clack","fs","path","generateTypeAugmentationFile","options","configPath","outputPath","typesPackages","lines","packageNames","outputDir","resolvedConfigPath","importPath","finalImportPath","typesPackage","findDefaultConfig","possiblePaths","configPath","getRelativeImportPath","fromDir","toFile","withoutExt","codegenCommand","program","options","spinner","absoluteConfigPath","outputPath","outputDir","relativeConfigPath","generateTypeAugmentationFile","error","program","codegenCommand"]}
|
|
File without changes
|