@geekmidas/cli 1.4.0 → 1.5.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.
Files changed (51) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/{Route53Provider-xrWuBXih.cjs → Route53Provider-Bs7Arms9.cjs} +3 -2
  3. package/dist/Route53Provider-Bs7Arms9.cjs.map +1 -0
  4. package/dist/{Route53Provider-DOWmFnwN.mjs → Route53Provider-C8mS0zY6.mjs} +3 -2
  5. package/dist/Route53Provider-C8mS0zY6.mjs.map +1 -0
  6. package/dist/{config-C1bidhvG.mjs → config-DfCJ29PQ.mjs} +2 -2
  7. package/dist/{config-C1bidhvG.mjs.map → config-DfCJ29PQ.mjs.map} +1 -1
  8. package/dist/{config-C1dM7aZb.cjs → config-ZQM1vBoz.cjs} +2 -2
  9. package/dist/{config-C1dM7aZb.cjs.map → config-ZQM1vBoz.cjs.map} +1 -1
  10. package/dist/config.cjs +2 -2
  11. package/dist/config.d.cts +1 -1
  12. package/dist/config.d.mts +1 -1
  13. package/dist/config.mjs +2 -2
  14. package/dist/{index-DzmZ6SUW.d.cts → index-B58qjyBd.d.cts} +27 -1
  15. package/dist/index-B58qjyBd.d.cts.map +1 -0
  16. package/dist/{index-DvpWzLD7.d.mts → index-C0SpUT9Y.d.mts} +27 -1
  17. package/dist/index-C0SpUT9Y.d.mts.map +1 -0
  18. package/dist/index.cjs +105 -48
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.mjs +105 -48
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/{openapi-9k6a6VA4.mjs → openapi-BcSjLfWq.mjs} +2 -2
  23. package/dist/{openapi-9k6a6VA4.mjs.map → openapi-BcSjLfWq.mjs.map} +1 -1
  24. package/dist/{openapi-Dcja4e1C.cjs → openapi-D6Hcfov0.cjs} +2 -2
  25. package/dist/{openapi-Dcja4e1C.cjs.map → openapi-D6Hcfov0.cjs.map} +1 -1
  26. package/dist/openapi.cjs +3 -3
  27. package/dist/openapi.mjs +3 -3
  28. package/dist/workspace/index.cjs +1 -1
  29. package/dist/workspace/index.d.cts +1 -1
  30. package/dist/workspace/index.d.mts +1 -1
  31. package/dist/workspace/index.mjs +1 -1
  32. package/dist/{workspace-CeFgIDC-.cjs → workspace-2Do2YcGZ.cjs} +5 -1
  33. package/dist/{workspace-CeFgIDC-.cjs.map → workspace-2Do2YcGZ.cjs.map} +1 -1
  34. package/dist/{workspace-Cb_I7oCJ.mjs → workspace-BW2iU37P.mjs} +5 -1
  35. package/dist/{workspace-Cb_I7oCJ.mjs.map → workspace-BW2iU37P.mjs.map} +1 -1
  36. package/package.json +4 -4
  37. package/src/deploy/__tests__/Route53Provider.spec.ts +23 -0
  38. package/src/deploy/__tests__/env-resolver.spec.ts +239 -0
  39. package/src/deploy/__tests__/sniffer.spec.ts +104 -93
  40. package/src/deploy/dns/Route53Provider.ts +4 -1
  41. package/src/deploy/env-resolver.ts +11 -1
  42. package/src/deploy/index.ts +72 -24
  43. package/src/deploy/sniffer.ts +39 -7
  44. package/src/init/generators/monorepo.ts +4 -0
  45. package/src/init/generators/web.ts +45 -2
  46. package/src/workspace/schema.ts +8 -0
  47. package/src/workspace/types.ts +23 -0
  48. package/dist/Route53Provider-DOWmFnwN.mjs.map +0 -1
  49. package/dist/Route53Provider-xrWuBXih.cjs.map +0 -1
  50. package/dist/index-DvpWzLD7.d.mts.map +0 -1
  51. package/dist/index-DzmZ6SUW.d.cts.map +0 -1
@@ -73,12 +73,7 @@ import {
73
73
  type DokployPostgres,
74
74
  type DokployRedis,
75
75
  } from './dokploy-api';
76
- import {
77
- generatePublicUrlBuildArgs,
78
- getPublicUrlArgNames,
79
- isMainFrontendApp,
80
- resolveHost,
81
- } from './domain.js';
76
+ import { isMainFrontendApp, resolveHost } from './domain.js';
82
77
  import {
83
78
  type EnvResolverContext,
84
79
  formatMissingVarsError,
@@ -1576,13 +1571,71 @@ export async function workspaceDeployCommand(
1576
1571
  // Store application ID in state
1577
1572
  setApplicationId(state, appName, application.applicationId);
1578
1573
 
1579
- // Generate public URL build args from dependencies
1580
- const buildArgs = generatePublicUrlBuildArgs(app, publicUrls);
1574
+ // Build dependency URLs for frontend (same pattern as backend)
1575
+ const dependencyUrls: Record<string, string> = {};
1576
+ if (app.dependencies) {
1577
+ for (const dep of app.dependencies) {
1578
+ if (publicUrls[dep]) {
1579
+ dependencyUrls[dep] = publicUrls[dep];
1580
+ }
1581
+ }
1582
+ }
1583
+
1584
+ // Compute hostname for this frontend app
1585
+ const isMainFrontend = isMainFrontendApp(appName, app, workspace.apps);
1586
+ const frontendHost = resolveHost(
1587
+ appName,
1588
+ app,
1589
+ stage,
1590
+ dokployConfig,
1591
+ isMainFrontend,
1592
+ );
1593
+
1594
+ // Build env context for frontend
1595
+ const envContext: EnvResolverContext = {
1596
+ app,
1597
+ appName,
1598
+ stage,
1599
+ state,
1600
+ appHostname: frontendHost,
1601
+ frontendUrls: [],
1602
+ userSecrets: stageSecrets ?? undefined,
1603
+ dependencyUrls,
1604
+ };
1605
+
1606
+ // Resolve all env vars BEFORE Docker build (NEXT_PUBLIC_* must be present at build time)
1607
+ const sniffedVars = sniffedApps.get(appName)?.requiredEnvVars ?? [];
1608
+ const { valid, missing, resolved } = validateEnvVars(
1609
+ sniffedVars,
1610
+ envContext,
1611
+ );
1612
+
1613
+ if (!valid) {
1614
+ throw new Error(formatMissingVarsError(appName, missing, stage));
1615
+ }
1616
+
1617
+ if (Object.keys(resolved).length > 0) {
1618
+ logger.log(
1619
+ ` Resolved ${Object.keys(resolved).length} env vars: ${Object.keys(resolved).join(', ')}`,
1620
+ );
1621
+ }
1622
+
1623
+ // Build args: all NEXT_PUBLIC_* vars must be present at Next.js build time
1624
+ const buildArgs: string[] = [];
1625
+ const publicUrlArgNames: string[] = [];
1626
+
1627
+ for (const [key, value] of Object.entries(resolved)) {
1628
+ if (key.startsWith('NEXT_PUBLIC_')) {
1629
+ buildArgs.push(`${key}=${value}`);
1630
+ publicUrlArgNames.push(key);
1631
+ }
1632
+ }
1633
+
1581
1634
  if (buildArgs.length > 0) {
1582
- logger.log(` Public URLs: ${buildArgs.join(', ')}`);
1635
+ logger.log(` Build args: ${publicUrlArgNames.join(', ')}`);
1583
1636
  }
1584
1637
 
1585
- // Build Docker image with public URLs
1638
+ // Build Docker image with NEXT_PUBLIC_* vars as build args
1586
1639
  const imageName = `${workspace.name}-${appName}`;
1587
1640
  const imageRef = registry
1588
1641
  ? `${registry}/${imageName}:${imageTag}`
@@ -1600,17 +1653,22 @@ export async function workspaceDeployCommand(
1600
1653
  appName,
1601
1654
  },
1602
1655
  buildArgs,
1603
- // Pass public URL arg names for Dockerfile generation
1604
- publicUrlArgs: getPublicUrlArgNames(app),
1656
+ // Pass arg names for Dockerfile ARG generation
1657
+ publicUrlArgs: publicUrlArgNames,
1605
1658
  });
1606
1659
 
1607
- // Prepare environment variables - no secrets needed
1660
+ // Prepare runtime environment variables
1608
1661
  const envVars: string[] = [
1609
1662
  `NODE_ENV=production`,
1610
1663
  `PORT=${app.port}`,
1611
1664
  `STAGE=${stage}`,
1612
1665
  ];
1613
1666
 
1667
+ // Add all resolved vars as runtime env (for SSR and server components)
1668
+ for (const [key, value] of Object.entries(resolved)) {
1669
+ envVars.push(`${key}=${value}`);
1670
+ }
1671
+
1614
1672
  // Configure and deploy application in Dokploy
1615
1673
  await api.saveDockerProvider(application.applicationId, imageRef, {
1616
1674
  registryId,
@@ -1624,17 +1682,7 @@ export async function workspaceDeployCommand(
1624
1682
  logger.log(` Deploying to Dokploy...`);
1625
1683
  await api.deployApplication(application.applicationId);
1626
1684
 
1627
- // Create or find domain for this app
1628
- const isMainFrontend = isMainFrontendApp(appName, app, workspace.apps);
1629
- const frontendHost = resolveHost(
1630
- appName,
1631
- app,
1632
- stage,
1633
- dokployConfig,
1634
- isMainFrontend,
1635
- );
1636
-
1637
- // Check if domain already exists
1685
+ // Check if domain already exists (frontendHost computed earlier for env context)
1638
1686
  const existingFrontendDomains = await api.getDomainsByApplicationId(
1639
1687
  application.applicationId,
1640
1688
  );
@@ -98,17 +98,49 @@ export async function sniffAppEnvironment(
98
98
  ): Promise<SniffedEnvironment> {
99
99
  const { logWarnings = true } = options;
100
100
 
101
- // 1. Frontend apps don't have server-side secrets
101
+ // 1. Frontend apps - handle dependencies and config sniffing
102
102
  if (app.type === 'frontend') {
103
- return { appName, requiredEnvVars: [] };
104
- }
103
+ // Auto-generate NEXT_PUBLIC_{DEP}_URL from dependencies
104
+ const depVars = (app.dependencies ?? []).map(
105
+ (dep) => `NEXT_PUBLIC_${dep.toUpperCase()}_URL`,
106
+ );
107
+
108
+ // If config specified, sniff by importing the file(s)
109
+ // The file calls .parse() at module load, which triggers sniffer to capture vars
110
+ if (app.config) {
111
+ const sniffedVars: string[] = [];
112
+
113
+ // Collect config paths to sniff
114
+ const configPaths: string[] = [];
115
+ if (app.config.client) configPaths.push(app.config.client);
116
+ if (app.config.server) configPaths.push(app.config.server);
117
+
118
+ // Sniff each config file
119
+ for (const configPath of configPaths) {
120
+ const result = await sniffEntryFile(
121
+ configPath,
122
+ app.path,
123
+ workspacePath,
124
+ );
125
+
126
+ if (logWarnings && result.error) {
127
+ console.warn(
128
+ `[sniffer] ${appName}: Config file "${configPath}" threw error during sniffing (env vars still captured): ${result.error.message}`,
129
+ );
130
+ }
131
+
132
+ sniffedVars.push(...result.envVars);
133
+ }
134
+
135
+ // Combine: dependency vars + sniffed vars (deduplicated)
136
+ const allVars = [...new Set([...depVars, ...sniffedVars])];
137
+ return { appName, requiredEnvVars: allVars };
138
+ }
105
139
 
106
- // 2. Entry-based apps with explicit env list
107
- if (app.requiredEnv && app.requiredEnv.length > 0) {
108
- return { appName, requiredEnvVars: [...app.requiredEnv] };
140
+ return { appName, requiredEnvVars: depVars };
109
141
  }
110
142
 
111
- // 3. Entry apps - import entry file in subprocess to trigger config.parse()
143
+ // 2. Entry apps - import entry file in subprocess to trigger config.parse()
112
144
  if (app.entry) {
113
145
  const result = await sniffEntryFile(app.entry, app.path, workspacePath);
114
146
 
@@ -373,6 +373,10 @@ export default defineWorkspace({
373
373
  path: 'apps/web',
374
374
  port: 3001,
375
375
  dependencies: ['api', 'auth'],
376
+ config: {
377
+ client: './src/config/client.ts',
378
+ server: './src/config/server.ts',
379
+ },
376
380
  client: {
377
381
  output: './src/api',
378
382
  },
@@ -133,12 +133,46 @@ export function getQueryClient() {
133
133
  }
134
134
  `;
135
135
 
136
+ // Client config - NEXT_PUBLIC_* vars (available in browser)
137
+ const clientConfigTs = `import { EnvironmentParser } from '@geekmidas/envkit';
138
+
139
+ // Client config - only NEXT_PUBLIC_* vars (available in browser)
140
+ // These values are inlined at build time by Next.js
141
+ const envParser = new EnvironmentParser({
142
+ NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,
143
+ NEXT_PUBLIC_AUTH_URL: process.env.NEXT_PUBLIC_AUTH_URL,
144
+ });
145
+
146
+ export const clientConfig = envParser
147
+ .create((get) => ({
148
+ apiUrl: get('NEXT_PUBLIC_API_URL').string(),
149
+ authUrl: get('NEXT_PUBLIC_AUTH_URL').string(),
150
+ }))
151
+ .parse();
152
+ `;
153
+
154
+ // Server config - server-only vars (not available in browser)
155
+ const serverConfigTs = `import { EnvironmentParser } from '@geekmidas/envkit';
156
+
157
+ // Server config - all env vars (server-side only, not exposed to browser)
158
+ // Access these only in Server Components, Route Handlers, or Server Actions
159
+ const envParser = new EnvironmentParser({ ...process.env });
160
+
161
+ export const serverConfig = envParser
162
+ .create((get) => ({
163
+ // Add server-only secrets here
164
+ // Example: stripeSecretKey: get('STRIPE_SECRET_KEY').string(),
165
+ }))
166
+ .parse();
167
+ `;
168
+
136
169
  // Auth client for better-auth
137
170
  const authClientTs = `import { createAuthClient } from 'better-auth/react';
138
171
  import { magicLinkClient } from 'better-auth/client/plugins';
172
+ import { clientConfig } from '~/config/client';
139
173
 
140
174
  export const authClient = createAuthClient({
141
- baseURL: process.env.NEXT_PUBLIC_AUTH_URL || 'http://localhost:3002',
175
+ baseURL: clientConfig.authUrl,
142
176
  plugins: [magicLinkClient()],
143
177
  });
144
178
 
@@ -163,9 +197,10 @@ export function Providers({ children }: { children: React.ReactNode }) {
163
197
  // API client setup - uses createApi with shared QueryClient
164
198
  const apiIndexTs = `import { createApi } from './openapi';
165
199
  import { getQueryClient } from '~/lib/query-client';
200
+ import { clientConfig } from '~/config/client';
166
201
 
167
202
  export const api = createApi({
168
- baseURL: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3000',
203
+ baseURL: clientConfig.apiUrl,
169
204
  queryClient: getQueryClient(),
170
205
  });
171
206
  `;
@@ -295,6 +330,14 @@ node_modules/
295
330
  path: 'apps/web/src/app/page.tsx',
296
331
  content: pageTsx,
297
332
  },
333
+ {
334
+ path: 'apps/web/src/config/client.ts',
335
+ content: clientConfigTs,
336
+ },
337
+ {
338
+ path: 'apps/web/src/config/server.ts',
339
+ content: serverConfigTs,
340
+ },
298
341
  {
299
342
  path: 'apps/web/src/lib/query-client.ts',
300
343
  content: queryClientTs,
@@ -543,6 +543,14 @@ const AppConfigSchema = z
543
543
  framework: FrameworkSchema.optional(),
544
544
  client: ClientConfigSchema.optional(),
545
545
 
546
+ // Frontend-specific: config file paths for env sniffing (calls .parse() at import)
547
+ config: z
548
+ .object({
549
+ client: z.string().optional(),
550
+ server: z.string().optional(),
551
+ })
552
+ .optional(),
553
+
546
554
  // Auth-specific
547
555
  provider: AuthProviderSchema.optional(),
548
556
  })
@@ -614,6 +614,29 @@ interface AppConfigBase {
614
614
  */
615
615
  client?: ClientConfig;
616
616
 
617
+ /**
618
+ * Config file paths for frontend environment sniffing.
619
+ *
620
+ * Points to file(s) that call EnvironmentParser.parse() at import time.
621
+ * The sniffer imports these files and captures all env vars accessed.
622
+ *
623
+ * Dependencies are auto-generated as NEXT_PUBLIC_{DEP}_URL variables.
624
+ *
625
+ * @example
626
+ * ```ts
627
+ * config: {
628
+ * client: './src/config/client.ts', // NEXT_PUBLIC_* vars for browser
629
+ * server: './src/config/server.ts', // Server-only vars for SSR
630
+ * }
631
+ * ```
632
+ */
633
+ config?: {
634
+ /** Client-side config (NEXT_PUBLIC_* vars, available in browser) */
635
+ client?: string;
636
+ /** Server-side config (all env vars, for SSR/API routes) */
637
+ server?: string;
638
+ };
639
+
617
640
  // ─────────────────────────────────────────────────────────────────
618
641
  // Deployment
619
642
  // ─────────────────────────────────────────────────────────────────
@@ -1 +0,0 @@
1
- {"version":3,"file":"Route53Provider-DOWmFnwN.mjs","names":["options: Route53ProviderOptions","domain: string","type: string","validTypes: DnsRecordType[]","recordName: string","records: DnsRecord[]","nextRecordName: string | undefined","nextRecordType: RRType | undefined","records: UpsertDnsRecord[]","results: UpsertResult[]"],"sources":["../src/deploy/dns/Route53Provider.ts"],"sourcesContent":["/**\n * Route53 DNS Provider\n *\n * Implements DnsProvider interface using AWS Route53.\n */\n\nimport {\n\tChangeResourceRecordSetsCommand,\n\tListHostedZonesByNameCommand,\n\tListResourceRecordSetsCommand,\n\tRoute53Client,\n\ttype RRType,\n} from '@aws-sdk/client-route-53';\nimport { fromIni } from '@aws-sdk/credential-providers';\nimport type {\n\tDnsProvider,\n\tDnsRecord,\n\tDnsRecordType,\n\tUpsertDnsRecord,\n\tUpsertResult,\n} from './DnsProvider';\n\nexport interface Route53ProviderOptions {\n\t/** AWS region (optional - uses AWS_REGION env var if not provided) */\n\tregion?: string;\n\t/** AWS profile name (optional - uses default credential chain if not provided) */\n\tprofile?: string;\n\t/** Hosted zone ID (optional - auto-detected from domain if not provided) */\n\thostedZoneId?: string;\n\t/** Custom endpoint for testing with localstack */\n\tendpoint?: string;\n}\n\n/**\n * Route53 DNS provider implementation.\n *\n * Uses AWS default credential chain for authentication.\n * Region can be specified or will use AWS_REGION/AWS_DEFAULT_REGION env vars.\n * Profile can be specified to use a named profile from ~/.aws/credentials.\n */\nexport class Route53Provider implements DnsProvider {\n\treadonly name = 'route53';\n\tprivate client: Route53Client;\n\tprivate hostedZoneId?: string;\n\tprivate hostedZoneCache: Map<string, string> = new Map();\n\n\tconstructor(options: Route53ProviderOptions = {}) {\n\t\tthis.client = new Route53Client({\n\t\t\t...(options.region && { region: options.region }),\n\t\t\t...(options.endpoint && { endpoint: options.endpoint }),\n\t\t\t...(options.profile && {\n\t\t\t\tcredentials: fromIni({ profile: options.profile }),\n\t\t\t}),\n\t\t});\n\t\tthis.hostedZoneId = options.hostedZoneId;\n\t}\n\n\t/**\n\t * Get the hosted zone ID for a domain.\n\t * Uses cache to avoid repeated API calls.\n\t */\n\tprivate async getHostedZoneId(domain: string): Promise<string> {\n\t\t// Use configured zone ID if provided\n\t\tif (this.hostedZoneId) {\n\t\t\treturn this.hostedZoneId;\n\t\t}\n\n\t\t// Check cache\n\t\tif (this.hostedZoneCache.has(domain)) {\n\t\t\treturn this.hostedZoneCache.get(domain)!;\n\t\t}\n\n\t\t// Auto-detect from domain\n\t\tconst command = new ListHostedZonesByNameCommand({\n\t\t\tDNSName: domain,\n\t\t\tMaxItems: 1,\n\t\t});\n\n\t\tconst response = await this.client.send(command);\n\t\tconst zones = response.HostedZones ?? [];\n\n\t\t// Find exact match (domain with trailing dot)\n\t\tconst normalizedDomain = domain.endsWith('.') ? domain : `${domain}.`;\n\t\tconst zone = zones.find((z) => z.Name === normalizedDomain);\n\n\t\tif (!zone?.Id) {\n\t\t\tthrow new Error(\n\t\t\t\t`No hosted zone found for domain: ${domain}. Create one in Route53 or provide hostedZoneId in config.`,\n\t\t\t);\n\t\t}\n\n\t\t// Zone ID comes as \"/hostedzone/Z1234567890\" - extract just the ID\n\t\tconst zoneId = zone.Id.replace('/hostedzone/', '');\n\t\tthis.hostedZoneCache.set(domain, zoneId);\n\t\treturn zoneId;\n\t}\n\n\t/**\n\t * Convert Route53 record type to our DnsRecordType.\n\t * Excludes NS and SOA which are auto-managed by Route53 for the zone.\n\t */\n\tprivate toRecordType(type: string): DnsRecordType | null {\n\t\t// Exclude NS and SOA which are auto-managed zone records\n\t\tconst managedTypes = ['NS', 'SOA'];\n\t\tif (managedTypes.includes(type)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst validTypes: DnsRecordType[] = [\n\t\t\t'A',\n\t\t\t'AAAA',\n\t\t\t'CNAME',\n\t\t\t'MX',\n\t\t\t'TXT',\n\t\t\t'SRV',\n\t\t\t'CAA',\n\t\t];\n\t\treturn validTypes.includes(type as DnsRecordType)\n\t\t\t? (type as DnsRecordType)\n\t\t\t: null;\n\t}\n\n\t/**\n\t * Extract subdomain from full record name relative to domain.\n\t */\n\tprivate extractSubdomain(recordName: string, domain: string): string {\n\t\tconst normalizedDomain = domain.endsWith('.') ? domain : `${domain}.`;\n\t\tconst normalizedName = recordName.endsWith('.')\n\t\t\t? recordName\n\t\t\t: `${recordName}.`;\n\n\t\tif (normalizedName === normalizedDomain) {\n\t\t\treturn '@';\n\t\t}\n\n\t\t// Remove the domain suffix\n\t\tconst subdomain = normalizedName.replace(`.${normalizedDomain}`, '');\n\t\treturn subdomain.replace(/\\.$/, ''); // Remove trailing dot if any\n\t}\n\n\tasync getRecords(domain: string): Promise<DnsRecord[]> {\n\t\tconst zoneId = await this.getHostedZoneId(domain);\n\t\tconst records: DnsRecord[] = [];\n\n\t\tlet nextRecordName: string | undefined;\n\t\tlet nextRecordType: RRType | undefined;\n\n\t\t// Paginate through all records\n\t\tdo {\n\t\t\tconst command = new ListResourceRecordSetsCommand({\n\t\t\t\tHostedZoneId: zoneId,\n\t\t\t\tStartRecordName: nextRecordName,\n\t\t\t\tStartRecordType: nextRecordType,\n\t\t\t\tMaxItems: 100,\n\t\t\t});\n\n\t\t\tconst response = await this.client.send(command);\n\n\t\t\tfor (const recordSet of response.ResourceRecordSets ?? []) {\n\t\t\t\tconst type = this.toRecordType(recordSet.Type ?? '');\n\t\t\t\tif (!type || !recordSet.Name) continue;\n\n\t\t\t\tconst values = (recordSet.ResourceRecords ?? [])\n\t\t\t\t\t.map((r) => r.Value)\n\t\t\t\t\t.filter((v): v is string => !!v);\n\n\t\t\t\trecords.push({\n\t\t\t\t\tname: this.extractSubdomain(recordSet.Name, domain),\n\t\t\t\t\ttype,\n\t\t\t\t\tttl: recordSet.TTL ?? 300,\n\t\t\t\t\tvalues,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (response.IsTruncated) {\n\t\t\t\tnextRecordName = response.NextRecordName;\n\t\t\t\tnextRecordType = response.NextRecordType;\n\t\t\t} else {\n\t\t\t\tnextRecordName = undefined;\n\t\t\t}\n\t\t} while (nextRecordName);\n\n\t\treturn records;\n\t}\n\n\tasync upsertRecords(\n\t\tdomain: string,\n\t\trecords: UpsertDnsRecord[],\n\t): Promise<UpsertResult[]> {\n\t\tconst zoneId = await this.getHostedZoneId(domain);\n\t\tconst results: UpsertResult[] = [];\n\n\t\t// Get existing records to determine if creating or updating\n\t\tconst existingRecords = await this.getRecords(domain);\n\n\t\t// Process records in batches (Route53 allows max 1000 changes per request)\n\t\tconst batchSize = 100;\n\t\tfor (let i = 0; i < records.length; i += batchSize) {\n\t\t\tconst batch = records.slice(i, i + batchSize);\n\t\t\tconst changes = [];\n\n\t\t\tfor (const record of batch) {\n\t\t\t\tconst existing = existingRecords.find(\n\t\t\t\t\t(r) => r.name === record.name && r.type === record.type,\n\t\t\t\t);\n\n\t\t\t\tconst existingValue = existing?.values?.[0];\n\n\t\t\t\tif (existing && existingValue === record.value) {\n\t\t\t\t\t// Record exists with same value - unchanged\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\trecord,\n\t\t\t\t\t\tcreated: false,\n\t\t\t\t\t\tunchanged: true,\n\t\t\t\t\t});\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Build full record name\n\t\t\t\tconst recordName =\n\t\t\t\t\trecord.name === '@' ? domain : `${record.name}.${domain}`;\n\n\t\t\t\tchanges.push({\n\t\t\t\t\tAction: 'UPSERT' as const,\n\t\t\t\t\tResourceRecordSet: {\n\t\t\t\t\t\tName: recordName,\n\t\t\t\t\t\tType: record.type,\n\t\t\t\t\t\tTTL: record.ttl,\n\t\t\t\t\t\tResourceRecords: [{ Value: record.value }],\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tresults.push({\n\t\t\t\t\trecord,\n\t\t\t\t\tcreated: !existing,\n\t\t\t\t\tunchanged: false,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Execute batch if there are changes\n\t\t\tif (changes.length > 0) {\n\t\t\t\tconst command = new ChangeResourceRecordSetsCommand({\n\t\t\t\t\tHostedZoneId: zoneId,\n\t\t\t\t\tChangeBatch: {\n\t\t\t\t\t\tComment: 'Upsert by gkm deploy',\n\t\t\t\t\t\tChanges: changes,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tawait this.client.send(command);\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Route53Provider-xrWuBXih.cjs","names":["options: Route53ProviderOptions","Route53Client","domain: string","ListHostedZonesByNameCommand","type: string","validTypes: DnsRecordType[]","recordName: string","records: DnsRecord[]","nextRecordName: string | undefined","nextRecordType: RRType | undefined","ListResourceRecordSetsCommand","records: UpsertDnsRecord[]","results: UpsertResult[]","ChangeResourceRecordSetsCommand"],"sources":["../src/deploy/dns/Route53Provider.ts"],"sourcesContent":["/**\n * Route53 DNS Provider\n *\n * Implements DnsProvider interface using AWS Route53.\n */\n\nimport {\n\tChangeResourceRecordSetsCommand,\n\tListHostedZonesByNameCommand,\n\tListResourceRecordSetsCommand,\n\tRoute53Client,\n\ttype RRType,\n} from '@aws-sdk/client-route-53';\nimport { fromIni } from '@aws-sdk/credential-providers';\nimport type {\n\tDnsProvider,\n\tDnsRecord,\n\tDnsRecordType,\n\tUpsertDnsRecord,\n\tUpsertResult,\n} from './DnsProvider';\n\nexport interface Route53ProviderOptions {\n\t/** AWS region (optional - uses AWS_REGION env var if not provided) */\n\tregion?: string;\n\t/** AWS profile name (optional - uses default credential chain if not provided) */\n\tprofile?: string;\n\t/** Hosted zone ID (optional - auto-detected from domain if not provided) */\n\thostedZoneId?: string;\n\t/** Custom endpoint for testing with localstack */\n\tendpoint?: string;\n}\n\n/**\n * Route53 DNS provider implementation.\n *\n * Uses AWS default credential chain for authentication.\n * Region can be specified or will use AWS_REGION/AWS_DEFAULT_REGION env vars.\n * Profile can be specified to use a named profile from ~/.aws/credentials.\n */\nexport class Route53Provider implements DnsProvider {\n\treadonly name = 'route53';\n\tprivate client: Route53Client;\n\tprivate hostedZoneId?: string;\n\tprivate hostedZoneCache: Map<string, string> = new Map();\n\n\tconstructor(options: Route53ProviderOptions = {}) {\n\t\tthis.client = new Route53Client({\n\t\t\t...(options.region && { region: options.region }),\n\t\t\t...(options.endpoint && { endpoint: options.endpoint }),\n\t\t\t...(options.profile && {\n\t\t\t\tcredentials: fromIni({ profile: options.profile }),\n\t\t\t}),\n\t\t});\n\t\tthis.hostedZoneId = options.hostedZoneId;\n\t}\n\n\t/**\n\t * Get the hosted zone ID for a domain.\n\t * Uses cache to avoid repeated API calls.\n\t */\n\tprivate async getHostedZoneId(domain: string): Promise<string> {\n\t\t// Use configured zone ID if provided\n\t\tif (this.hostedZoneId) {\n\t\t\treturn this.hostedZoneId;\n\t\t}\n\n\t\t// Check cache\n\t\tif (this.hostedZoneCache.has(domain)) {\n\t\t\treturn this.hostedZoneCache.get(domain)!;\n\t\t}\n\n\t\t// Auto-detect from domain\n\t\tconst command = new ListHostedZonesByNameCommand({\n\t\t\tDNSName: domain,\n\t\t\tMaxItems: 1,\n\t\t});\n\n\t\tconst response = await this.client.send(command);\n\t\tconst zones = response.HostedZones ?? [];\n\n\t\t// Find exact match (domain with trailing dot)\n\t\tconst normalizedDomain = domain.endsWith('.') ? domain : `${domain}.`;\n\t\tconst zone = zones.find((z) => z.Name === normalizedDomain);\n\n\t\tif (!zone?.Id) {\n\t\t\tthrow new Error(\n\t\t\t\t`No hosted zone found for domain: ${domain}. Create one in Route53 or provide hostedZoneId in config.`,\n\t\t\t);\n\t\t}\n\n\t\t// Zone ID comes as \"/hostedzone/Z1234567890\" - extract just the ID\n\t\tconst zoneId = zone.Id.replace('/hostedzone/', '');\n\t\tthis.hostedZoneCache.set(domain, zoneId);\n\t\treturn zoneId;\n\t}\n\n\t/**\n\t * Convert Route53 record type to our DnsRecordType.\n\t * Excludes NS and SOA which are auto-managed by Route53 for the zone.\n\t */\n\tprivate toRecordType(type: string): DnsRecordType | null {\n\t\t// Exclude NS and SOA which are auto-managed zone records\n\t\tconst managedTypes = ['NS', 'SOA'];\n\t\tif (managedTypes.includes(type)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst validTypes: DnsRecordType[] = [\n\t\t\t'A',\n\t\t\t'AAAA',\n\t\t\t'CNAME',\n\t\t\t'MX',\n\t\t\t'TXT',\n\t\t\t'SRV',\n\t\t\t'CAA',\n\t\t];\n\t\treturn validTypes.includes(type as DnsRecordType)\n\t\t\t? (type as DnsRecordType)\n\t\t\t: null;\n\t}\n\n\t/**\n\t * Extract subdomain from full record name relative to domain.\n\t */\n\tprivate extractSubdomain(recordName: string, domain: string): string {\n\t\tconst normalizedDomain = domain.endsWith('.') ? domain : `${domain}.`;\n\t\tconst normalizedName = recordName.endsWith('.')\n\t\t\t? recordName\n\t\t\t: `${recordName}.`;\n\n\t\tif (normalizedName === normalizedDomain) {\n\t\t\treturn '@';\n\t\t}\n\n\t\t// Remove the domain suffix\n\t\tconst subdomain = normalizedName.replace(`.${normalizedDomain}`, '');\n\t\treturn subdomain.replace(/\\.$/, ''); // Remove trailing dot if any\n\t}\n\n\tasync getRecords(domain: string): Promise<DnsRecord[]> {\n\t\tconst zoneId = await this.getHostedZoneId(domain);\n\t\tconst records: DnsRecord[] = [];\n\n\t\tlet nextRecordName: string | undefined;\n\t\tlet nextRecordType: RRType | undefined;\n\n\t\t// Paginate through all records\n\t\tdo {\n\t\t\tconst command = new ListResourceRecordSetsCommand({\n\t\t\t\tHostedZoneId: zoneId,\n\t\t\t\tStartRecordName: nextRecordName,\n\t\t\t\tStartRecordType: nextRecordType,\n\t\t\t\tMaxItems: 100,\n\t\t\t});\n\n\t\t\tconst response = await this.client.send(command);\n\n\t\t\tfor (const recordSet of response.ResourceRecordSets ?? []) {\n\t\t\t\tconst type = this.toRecordType(recordSet.Type ?? '');\n\t\t\t\tif (!type || !recordSet.Name) continue;\n\n\t\t\t\tconst values = (recordSet.ResourceRecords ?? [])\n\t\t\t\t\t.map((r) => r.Value)\n\t\t\t\t\t.filter((v): v is string => !!v);\n\n\t\t\t\trecords.push({\n\t\t\t\t\tname: this.extractSubdomain(recordSet.Name, domain),\n\t\t\t\t\ttype,\n\t\t\t\t\tttl: recordSet.TTL ?? 300,\n\t\t\t\t\tvalues,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (response.IsTruncated) {\n\t\t\t\tnextRecordName = response.NextRecordName;\n\t\t\t\tnextRecordType = response.NextRecordType;\n\t\t\t} else {\n\t\t\t\tnextRecordName = undefined;\n\t\t\t}\n\t\t} while (nextRecordName);\n\n\t\treturn records;\n\t}\n\n\tasync upsertRecords(\n\t\tdomain: string,\n\t\trecords: UpsertDnsRecord[],\n\t): Promise<UpsertResult[]> {\n\t\tconst zoneId = await this.getHostedZoneId(domain);\n\t\tconst results: UpsertResult[] = [];\n\n\t\t// Get existing records to determine if creating or updating\n\t\tconst existingRecords = await this.getRecords(domain);\n\n\t\t// Process records in batches (Route53 allows max 1000 changes per request)\n\t\tconst batchSize = 100;\n\t\tfor (let i = 0; i < records.length; i += batchSize) {\n\t\t\tconst batch = records.slice(i, i + batchSize);\n\t\t\tconst changes = [];\n\n\t\t\tfor (const record of batch) {\n\t\t\t\tconst existing = existingRecords.find(\n\t\t\t\t\t(r) => r.name === record.name && r.type === record.type,\n\t\t\t\t);\n\n\t\t\t\tconst existingValue = existing?.values?.[0];\n\n\t\t\t\tif (existing && existingValue === record.value) {\n\t\t\t\t\t// Record exists with same value - unchanged\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\trecord,\n\t\t\t\t\t\tcreated: false,\n\t\t\t\t\t\tunchanged: true,\n\t\t\t\t\t});\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Build full record name\n\t\t\t\tconst recordName =\n\t\t\t\t\trecord.name === '@' ? domain : `${record.name}.${domain}`;\n\n\t\t\t\tchanges.push({\n\t\t\t\t\tAction: 'UPSERT' as const,\n\t\t\t\t\tResourceRecordSet: {\n\t\t\t\t\t\tName: recordName,\n\t\t\t\t\t\tType: record.type,\n\t\t\t\t\t\tTTL: record.ttl,\n\t\t\t\t\t\tResourceRecords: [{ Value: record.value }],\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tresults.push({\n\t\t\t\t\trecord,\n\t\t\t\t\tcreated: !existing,\n\t\t\t\t\tunchanged: false,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Execute batch if there are changes\n\t\t\tif (changes.length > 0) {\n\t\t\t\tconst command = new ChangeResourceRecordSetsCommand({\n\t\t\t\t\tHostedZoneId: zoneId,\n\t\t\t\t\tChangeBatch: {\n\t\t\t\t\t\tComment: 'Upsert by gkm deploy',\n\t\t\t\t\t\tChanges: changes,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tawait this.client.send(command);\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DvpWzLD7.d.mts","names":[],"sources":["../src/deploy/state.ts","../src/deploy/StateProvider.ts","../src/workspace/schema.ts","../src/workspace/types.ts","../src/workspace/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAaA;AAQA;AAQA;;;AAYiC,UA5BhB,gBAAA,CA4BgB;EAAgB,MAA/B,EAAA,MAAA;EAAM,UAEW,EAAA,MAAA;;;;AAEd;UAxBJ,qBAAA;;;ACJjB;;;;AAe6B,UDHZ,iBAAA,CCGY;EAAiB,QAAG,EAAA,SAAA;EAAO,KAAA,EAAA,MAAA;EAM5C;EAgCK,SAAA,EAAA,MAAA;EAOA,aAAA,EAAA,MAAc;EAWd,YAAA,EDrDF,MCqDmB,CAAA,MAAA,EAAA,MAEvB,CAAA;EAMC,QAAA,EAAA;IAAW,UAAA,CAAA,EAAA,MAAA;IAAG,OAAA,CAAA,EAAA,MAAA;EAAgB,CAAA;EAAiB;EAAoB,cAAA,CAAA,EDvD7D,MCuD6D,CAAA,MAAA,EDvD9C,gBCuD8C,CAAA;;qBDrD3D,eAAe;;EEiD7B,WAAA,CAAA,EF/CS,ME+CT,CAAA,MAA+C,EF/CvB,qBE+CuB,CAAA;EAK/C,cAAA,EAAA,MAAA;AAKN;AASA;AASA;AAqSA;;;;;;;;;;;AFhXqB,UC5BJ,aAAA,CD4BI;;;;AC5BrB;;;EAO+C,IAAzB,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,OAAA,CAAQ,iBAAR,GAAA,IAAA,CAAA;EAAO;;AAQ2B;AAMxD;AAgCA;AAOA;EAWiB,KAAA,CAAA,KAAA,EAAA,MAAA,EAAiB,KAAA,EAxDL,iBA0DL,CAAA,EA1DyB,OA0DzB,CAAA,IAAA,CAAA;AAMxB;;;;AAA8D,KA1DlD,SAAA,GA0DkD,WAAA,GAAA,WAAA,GAAA,WAAA,GAAA,WAAA,GAAA,YAAA,GAAA,WAAA,GAAA,YAAA,GAAA,YAAA,GAAA,gBAAA,GAAA,gBAAA,GAAA,gBAAA,GAAA,gBAAA,GAAA,gBAAA,GAAA,gBAAA,GAAA,gBAAA,GAAA,cAAA,GAAA,cAAA,GAAA,cAAA,GAAA,WAAA,GAAA,WAAA,GAAA,WAAA,GAAA,YAAA,GAAA,YAAA,GAAA,YAAA,GAAA,YAAA,GAAA,cAAA,GAAA,WAAA;AAAiB;;;UA1B9D,gBAAA;ECsBX,QAAA,EAAA,OAAA;AAA+C;AAUrD;AASA;AASA;AAqSa,UDhVI,cAAA,CCmVf;EAAA,QAAA,EAAA,KAAA;EAAA;EAHoC,MAAA,ED7U7B,SC6U6B;;;;;;;UDrUrB,iBAAA;;YAEN;;;;;KAMC,WAAA,GAAc,mBAAmB,iBAAiB;;;;;;;;;ADnF9D,cE+EM,wBF/E2B,EAAA,SAAA,CAAA,SAAA,CAAA;AAQjC;AAQA;;cEoEM,sBF9DS,EAAA,SAAA,CAAA,QAAA,EAAA,YAAA,CAAA;;;;AAQK,iBE2DJ,uBAAA,CF3DI,MAAA,EAAA,MAAA,CAAA,EAAA,OAAA;;;AAEC;iBEkEL,oBAAA;;;AD9FhB;AAA8B,iBCuGd,oBAAA,CDvGc,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;;;;;AE0tBvB,cD9UM,yBC8UN,ED9U+B,CAAA,CAAA,QC8U/B,CAAA,SAAA,CD9U+B,CAAA,CAAA,SC8U/B,CD9U+B,CAAA,CAAA,SC8U/B,ED9U+B,CAAA,CAAA,QC8U/B,CAAA,SAAA,CD9U+B,CAAA,CAAA,qBC8U/B,CAAA,CD9U+B,CAAA,CAAA,SC8U/B,CAAA;EAAe,QAEZ,EDhV4B,CAAA,CAAA,UCgV5B,CAAA,WAAA,CAAA;EAAY,GAEZ,eAAA,YAAA,CAAA;CAAY,eAEV,CAAA,aAAA,CAAA;EAAc,QAEf,EDtV2B,CAAA,CAAA,UCsV3B,CAAA,SAAA,CAAA;EAAa,MAEf,eAAA,UAAA,CAAA;IAAW,WAAA,EAAA,WAAA;IAMR,WAAA,EAAa,WAAA;IAAA,WAAA,EAAA,WAAA;IAAe,WAAA,EAAA,WAAA;IAAoB,YAAA,EAAA,YAAA;IAAK,WAAA,EAAA,WAAA;IAKrD,YAAA,EAAA,YAAuB;IAAA,YAAA,EAAA,YAAA;IAAe,gBAAA,EAAA,gBAAA;IAGpC,gBAAA,EAAA,gBAAA;IAAa,gBAAA,EAAA,gBAAA;IAAM,gBAAA,EAAA,gBAAA;IAAX,gBAAA,EAAA,gBAAA;IACU,gBAAA,EAAA,gBAAA;IAAd,gBAAA,EAAA,gBAAA;IAGR,cAAA,EAAA,cAAA;IACA,cAAA,EAAA,cAAA;IACE,cAAA,EAAA,cAAA;IACD,WAAA,EAAA,WAAA;IACF,WAAA,EAAA,WAAA;IAAW,WAAA,EAAA,WAAA;IA+FH,YAAA,EAAe,YAAA;IAAA,YAAA,EAAA,YAAA;IAKV,YAAA,EAAA,YAAA;IAAf,YAAA,EAAA,YAAA;IAGG,cAAA,EAAA,cAAA;IAGA,WAAA,EAAA,WAAA;EAAY,CAAA,CAAA,CAGV;EAAc,OAGf,eAAA,YAAA,CAAA;EAAa,YAGf,eAAA,YAAA,CAAA;EAAW,GAAA,eAAA,YAAA,CAAA;AASpB,CAAA,eAAiB,CAAA,aAAoB,CAAA;EAAA,QAAA,cAAA,CAAA,YAAA,CAAA;EAAA,GAAa,eAAA,YAAA,CAAA;CAAa,eAUxC,CAAA,aAAA,CAAA;EAAY,QAItB,cAAA,CAAA,QAAA,CAAA;CAAgB,eAAG,CAAA,CAAA,EAAA,UAAA,CAAA,aAAA,CAAA;EAAiB,QAEvC,EDhlBe,CAAA,CAAA,SCglBf,CAAA;IAhBmC,IAAA,EAAA,MAAA;IAAI,UAAA,EDjkBnC,QCikBmC;IA2BhC,aAAA,ED3lBA,QC2lBmB;EAAA,CAAA,EAAA;IAMd,IAAA,EAAA,MAAA;IAAf,UAAA,EDlmBO,QCkmBP;IAEI,aAAA,EDnmBM,QCmmBN;EAAc,CAAA,CAAA;EAEJ,GAEZ,eAAA,YAAA,CAAA;CAAY,eAEX,CAAA,CAAA,CAAA,CAAA,YAAA,CAAA,SAAA,wBAAA,CAAA,YAAA,CAAA;EAAa,QAEd,EDrhB6B,CAAA,CAAA,UCqhB7B,CAAA,WAAA,CAAA;EAAW,GAAA,eAAA,YAAA,CAAA;EAMH,MAAA,aAAY;CAAA,eAAA,CAAA,aAAA,CAAA;EAAA,QAIvB,cAAA,CAAA,SAAA,CAAA;EAAS,MAAG,eAAA,UAAA,CAAA;IAEN,WAAA,EAAA,WAAA;IAAmB,WAAA,EAAA,WAAA;IAef,WAAA,EAAA,WAAiB;IAAA,WAAA,EAAA,WAAA;IACxB,YAAA,EAAA,YAAA;IAAY,WAAA,EAAA,WAAA;IACR,YAAA,EAAA,YAAA;IAAe,YAAA,EAAA,YAAA;;;;ICl1BZ,gBAAe,EAAA,gBAAA;IAAA,gBAAA,EAAA,gBAAA;IAAqB,gBAAA,EAAA,gBAAA;IAC5B,gBAAA,EAAA,gBAAA;IAAf,cAAA,EAAA,cAAA;IACkB,cAAA,EAAA,cAAA;IAAxB,cAAA,EAAA,cAAA;IAAuB,WAAA,EAAA,WAAA;IA8BV,WAAA,EAAA,WAAkB;IAAA,WAAA,EAAA,WAAA;IACzB,YAAA,EAAA,YAAA;IAEN,YAAA,EAAA,YAAA;IAAmB,YAAA,EAAA,YAAA;IA6CN,YAAA,EAAA,YAAwB;IAAA,cAAA,EAAA,cAAA;IAC/B,WAAA,EAAA,WAAA;EAAS,CAAA,CAAA,CAEf;EAAmB,OAAA,eAAA,YAAA,CAAA;EAyDN,YAAA,eAAa,YAAA,CAAA;EAAA,GAAA,eAAA,YAAA,CAAA;EAAA,MACpB,aAAA;CAAS,eAAG,CAAA,aAAA,CAAA;EAAe,QAEjC,cAAA,CAAA,YAAA,CAAA;EAAY,GAAA,eAAA,YAAA,CAAA;EA2BC,MAAA,aAAe;CAAA,eAAA,CAAA,aAAA,CAAA;EAAA,QACnB,cAAA,CAAA,QAAA,CAAA;EAAmB,MAE5B,aAAA;AAAS,CAAA,eAAA,CAAA,CAAA,EAAA,UAAA,CAAA,aAAA,CAAA;EA2BI,QAAA,EFES,CAAA,CAAA,SEFO,CAAA;IA8BhB,IAAA,EAAA,MAAA;IAAoB,UAAA,EF7BtB,QE6BsB;IACxB,aAAA,EF7BK,QE6BL;EAAmB,CAAA,EAG5B;IAAM,IAAA,EAAA,MAAA;IA2CO,UAAA,EF5EF,QE4EqB;mBF3ElB;;;;;;;;cAgQJ,uBAAqB,CAAA,CAAA;sBAsG/B,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAtWsB,CAAA,CAAA;;oBADX;uBACG;;;oBADH;uBACG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAAQ,CAAA,CAAA;;oBADX;uBACG;;;oBADH;uBACG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAwJoC,CAAA,CAAA;YAAzB;aAAiB;;YAAjB;aAAiB;;;;;;;;iBAoN7B,uBAAA,mBAEb,CAAA,CAAE,aAAa;;;;iBAOF,2BAAA;;SAER,CAAA,CAAE,aAAa;UACd,CAAA,CAAE;;;;;iBAYK,sBAAA,QAA8B,CAAA,CAAE;;;AF9rBhD;AAQA;AAQA;;;;;;;;;AAgBqB;;;;AC5BJ,KEYL,YAAA,GFZkB,SAAA,GAAA,QAAA,GAAA,YAAA;;;;;;AAe0B;AAMxD;AAgCA;AAOA;AAWA;AAQA;;;;;AAA+E;;;;AChGpD;AA4F0B;AAUrD;AASgB,KC1DJ,gBAAA,GD0DwB,MAAA,GAAA,aAAA,GAAA,SAAA,GAAA,SAAA;AASpC;AAqSA;;;;;;;;;;;;;;;;;;;KClVY,iBAAA;;;;;;;;;;;;;AD4Pa,UC9OR,kBAAA,CD8OQ;;;;;;;;;;;;;;;;;;;;;;;;;;UCnNR,iBAAA,SAA0B;;;;;;;;;;;;;;;;;;;;;;ADySL;AA0KtC;;;;;;;;;;;;;;;;;;;UCxaiB,cAAA;;iBAED;;oBAEG;;mBAED;;;;;;;;;;;;;;;;;;;;;;KAuBN,oBAAA,GAAuB;;;;;;;;;;;;;;;;;;;;KAqBvB,eAAA,YAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAkCtB,sBAAA;;;;cAIJ;;;;;;;;;;YAUF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuCC,SAAA,GAAY,CAAA,CAAE,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA8BtB,YAAA;;YAEN;;YAEA;;QAEJ;;;;;;;;;;;;;;;;;;UAmBU,YAAA;;;;;;;;QDzBH,CAAA,EAAA,KAAA;;;;;;;;;;;;;;;;;;;UCqDG,YAAA;;;;WAIP;;;;;;;;;;;;;;;;;;UAmBO,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;UA2BA,YAAA;;;;;;;;;;;;;;;;;;AD0JiB;AA4GlC;;;;AAEU;AAOV;;;;;AAGmB;AAYnB;;;;AC9qBA;AAwBA;AAsBA;AAcA;AA2BA;AA2CA,UAsTU,aAAA,CAtTqB;EAAA;;;;AAMI;AAuBnC;EAqBY,IAAA,CAAA,EAAA,SAAA,GAAe,UAAA;EAkCV;;;;EAcc,IAAA,EAAA,MAAA;EAuCnB;;;;AAAmB;EA8Bd,IAAA,EAAA,MAAA;EAAY;;;;AAMb;EAmBC,MAAA,CAAA,EAiJP,YAjJmB;EA4BZ;AAuBjB;AA2BA;AAGC;EAqCsB,MAAA,CAAA,EAqCb,MArCa;EAAA;;;;EAiDR,SAMA,CAAA,EAZF,MAYE;EAAM;;;;EAiCoB,KAMpB,CAAA,EA7CZ,MA6CY;EAAa;;;;EAmDZ,WAwBZ,CAAA,EAlHK,MAkHL;EAAe;AAmCzB;;;EAGyB,SAFhB,CAAA,EAAA,MAAA;EAAa;AAStB;AAQA;AAOA;EAAsB,MAAA,CAAA,EAAA,MAAA;EAAA;EAA0B,SAAvB,CAAA,EA/JZ,eA+JY;EAAM;AAM/B;;;EAAoD,KACvC,CAAA,EAhKJ,WAgKI;EAAK;;;;EACoB,SAAA,CAAA,EAAA,MAAA,GAAA,OAAA,GA3JN,eA2JM;EAqC1B;;;;EAIgB,MAArB,CAAA,EAAA,MAAA,GAAA,OAAA,GA9LsB,YA8LtB;EAAe;;;;EAQE,OAEf,CAAA,EAAA,OAAA,GAlMY,aAkMZ;EAAW;AAMpB;;;EAAkD,OAAU,CAAA,EAlMjD,OAkMiD;EAAK;AAKjE;;;EAA4D,GAG9C,CAAA,EAAA,MAAA,GAAA,MAAA,EAAA;EAAK;;;;;;;;;;AAQC;AA+FpB;;EAAgC,KAKV,CAAA,EAAA,MAAA;EAAS;;;;;;AAeX;AASpB;EAAqC,SAAA,CAAA,EAvSxB,gBAuSwB,GAvSL,iBAuSK;EAAA;;;;EAcY,MAEvC,CAAA,EAjTA,YAiTA;EAAe;AAhBwB;AA2BjD;;;;;;;;;AAgBoB;AAMpB;;;;;AAM+B;EAef,MAAA,CAAA,EA/UN,eA+UuB;EAAA;;;;AAEL;;;;ACl1B5B;EAA+B,WAAA,CAAA,EAAA,MAAA,EAAA;;;;;;AAEL;AA8B1B;;;;AAGsB;AA6CtB;;;;AAGsB;AAyDtB;;;;;AAGe;AA2BC,UD0XC,cC1Xc,CAAA,kBAAA,MAAA,GAAA,MAAA,CAAA,SD2XtB,aC3XsB,CAAA;EAAA;EAAA,YACnB,CAAA,ED4XI,SC5XJ,EAAA;;AAEA;AA2BZ;AA8BA;;AACY,UDuUK,SAAA,SAAkB,aCvUvB,CAAA;EAAmB;EAGtB,YAAA,CAAA,EAAA,MAAA,EAAA;AA2CT;;;;KDiSY,QAAA,GAAW;;;;;;KAOX,UAAA,GAAa,eAAe;;;;;KAM5B,8BAA8B,4BAC7B,QAAQ,KAAK,MAAM;iCACC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqCrB,6BAA6B;;;;QAIlC,gBAAgB;;WAEb;;WAEA;;aAEE;;YAED;;UAEF;;;;;KAMG,4BAA4B,oBAAoB;;;;KAKhD,sCAAsC;;sBAGpC,QAAQ,KAAK,MAAM;mBACf,cAAc;;WAGtB;WACA;aACE;YACD;UACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA+FQ,eAAA;;;;QAKV,eAAe;;WAGZ;;WAGA;;aAGE;;YAGD;;UAGF;;;;;;;;UASQ,mBAAA,SAA4B,KAAK;;;;;;;;;;wBAU3B;;;;cAIV,mBAAmB;;WAEtB;;;;;;;;;;UAWO,mBAAA;;;;;;QAMV,eAAe;;YAEX;;UAEF;;UAEA;;WAEC;;UAED;;;;;UAMQ,YAAA;;;;OAIX,YAAY;;aAEN;;;;;;;;;;;;;;iBAeI,iBAAA,SACP,YAAY,4BACR;;;AH17Bb;AAQA;;;;;;;;;AAgBqB;;;;AC5BrB;;;;;;AAewD;AAMxD;AAgCA;AAOA;AAWA;AAQA;;;;;AAA+E;;;;AChGpD;AA4F0B;AAUrD;AASA;AASA;AAqSA;;;AAAsC,iBEhStB,eFgSsB,CAAA,oBEhSc,UFgSd,CAAA,CAAA,MAAA,EE/R7B,cF+R6B,CE/Rd,KF+Rc,CAAA,CAAA,EE9RnC,uBF8RmC,CE9RX,KF8RW,CAAA;;;;AAAA,iBEhQtB,kBAAA,CFgQsB,MAAA,EE/P7B,eF+P6B,EAAA,GAAA,EAAA,MAAA,CAAA,EE7PnC,mBF6PmC;;;;;iBEhNtB,wBAAA,SACP,yBAEN;;;;;iBAyDa,aAAA,SACP,YAAY,+BAElB;;;;;iBA2Ba,eAAA,YACJ,uCAET;;;;;AFmHmC,iBExFtB,gBAAA,CFwFsB,SAAA,EExFM,mBFwFN,CAAA,EAAA,MAAA,EAAA;;;;;AAtFb,iBE4BT,oBAAA,CF5BS,SAAA,EE6Bb,mBF7Ba,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,MAAA,CAAA,EEgCtB,MFhCsB,CAAA,MAAA,EAAA,MAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;iBE2ET,mBAAA;;cAEqB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DzmZ6SUW.d.cts","names":[],"sources":["../src/deploy/state.ts","../src/deploy/StateProvider.ts","../src/workspace/schema.ts","../src/workspace/types.ts","../src/workspace/index.ts"],"sourcesContent":[],"mappings":"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"}