@authrim/setup 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +303 -0
  2. package/dist/__tests__/config.test.d.ts +5 -0
  3. package/dist/__tests__/config.test.d.ts.map +1 -0
  4. package/dist/__tests__/config.test.js +115 -0
  5. package/dist/__tests__/config.test.js.map +1 -0
  6. package/dist/__tests__/keys.test.d.ts +5 -0
  7. package/dist/__tests__/keys.test.d.ts.map +1 -0
  8. package/dist/__tests__/keys.test.js +87 -0
  9. package/dist/__tests__/keys.test.js.map +1 -0
  10. package/dist/__tests__/naming.test.d.ts +5 -0
  11. package/dist/__tests__/naming.test.d.ts.map +1 -0
  12. package/dist/__tests__/naming.test.js +84 -0
  13. package/dist/__tests__/naming.test.js.map +1 -0
  14. package/dist/cli/commands/config.d.ts +13 -0
  15. package/dist/cli/commands/config.d.ts.map +1 -0
  16. package/dist/cli/commands/config.js +231 -0
  17. package/dist/cli/commands/config.js.map +1 -0
  18. package/dist/cli/commands/deploy.d.ts +21 -0
  19. package/dist/cli/commands/deploy.d.ts.map +1 -0
  20. package/dist/cli/commands/deploy.js +304 -0
  21. package/dist/cli/commands/deploy.js.map +1 -0
  22. package/dist/cli/commands/init.d.ts +14 -0
  23. package/dist/cli/commands/init.d.ts.map +1 -0
  24. package/dist/cli/commands/init.js +1248 -0
  25. package/dist/cli/commands/init.js.map +1 -0
  26. package/dist/core/admin.d.ts +64 -0
  27. package/dist/core/admin.d.ts.map +1 -0
  28. package/dist/core/admin.js +247 -0
  29. package/dist/core/admin.js.map +1 -0
  30. package/dist/core/cloudflare.d.ts +157 -0
  31. package/dist/core/cloudflare.d.ts.map +1 -0
  32. package/dist/core/cloudflare.js +452 -0
  33. package/dist/core/cloudflare.js.map +1 -0
  34. package/dist/core/config.d.ts +891 -0
  35. package/dist/core/config.d.ts.map +1 -0
  36. package/dist/core/config.js +208 -0
  37. package/dist/core/config.js.map +1 -0
  38. package/dist/core/deploy.d.ts +81 -0
  39. package/dist/core/deploy.d.ts.map +1 -0
  40. package/dist/core/deploy.js +389 -0
  41. package/dist/core/deploy.js.map +1 -0
  42. package/dist/core/keys.d.ts +111 -0
  43. package/dist/core/keys.d.ts.map +1 -0
  44. package/dist/core/keys.js +287 -0
  45. package/dist/core/keys.js.map +1 -0
  46. package/dist/core/lock.d.ts +220 -0
  47. package/dist/core/lock.d.ts.map +1 -0
  48. package/dist/core/lock.js +230 -0
  49. package/dist/core/lock.js.map +1 -0
  50. package/dist/core/naming.d.ts +151 -0
  51. package/dist/core/naming.d.ts.map +1 -0
  52. package/dist/core/naming.js +209 -0
  53. package/dist/core/naming.js.map +1 -0
  54. package/dist/core/source.d.ts +68 -0
  55. package/dist/core/source.d.ts.map +1 -0
  56. package/dist/core/source.js +285 -0
  57. package/dist/core/source.js.map +1 -0
  58. package/dist/core/wrangler.d.ts +87 -0
  59. package/dist/core/wrangler.d.ts.map +1 -0
  60. package/dist/core/wrangler.js +398 -0
  61. package/dist/core/wrangler.js.map +1 -0
  62. package/dist/index.d.ts +11 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +117 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/web/api.d.ts +21 -0
  67. package/dist/web/api.d.ts.map +1 -0
  68. package/dist/web/api.js +423 -0
  69. package/dist/web/api.js.map +1 -0
  70. package/dist/web/server.d.ts +12 -0
  71. package/dist/web/server.d.ts.map +1 -0
  72. package/dist/web/server.js +112 -0
  73. package/dist/web/server.js.map +1 -0
  74. package/dist/web/ui.d.ts +7 -0
  75. package/dist/web/ui.d.ts.map +1 -0
  76. package/dist/web/ui.js +765 -0
  77. package/dist/web/ui.js.map +1 -0
  78. package/package.json +61 -0
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Authrim Key Generation Module
3
+ *
4
+ * Generates RSA key pairs for JWT signing and other cryptographic secrets.
5
+ * Based on the existing setup-keys.sh script functionality.
6
+ */
7
+ import { randomBytes, generateKeyPairSync, createPublicKey, createPrivateKey } from 'node:crypto';
8
+ import { writeFile, mkdir, readFile } from 'node:fs/promises';
9
+ import { existsSync } from 'node:fs';
10
+ import { join, resolve } from 'node:path';
11
+ // =============================================================================
12
+ // Key ID Generation
13
+ // =============================================================================
14
+ /**
15
+ * Generate a unique key ID (kid)
16
+ *
17
+ * Format: {prefix}-key-{timestamp}-{random}
18
+ */
19
+ export function generateKeyId(prefix = 'dev') {
20
+ const timestamp = Math.floor(Date.now() / 1000);
21
+ const randomStr = randomBytes(4).toString('base64url').slice(0, 6);
22
+ return `${prefix}-key-${timestamp}-${randomStr}`;
23
+ }
24
+ // =============================================================================
25
+ // RSA Key Pair Generation
26
+ // =============================================================================
27
+ /**
28
+ * Generate an RSA key pair for JWT signing
29
+ *
30
+ * @param keyId - Custom key ID or auto-generated
31
+ * @param keySize - RSA key size in bits (default: 2048)
32
+ */
33
+ export function generateRsaKeyPair(keyId, keySize = 2048) {
34
+ const kid = keyId || generateKeyId();
35
+ // Generate RSA key pair
36
+ const { privateKey, publicKey } = generateKeyPairSync('rsa', {
37
+ modulusLength: keySize,
38
+ publicKeyEncoding: {
39
+ type: 'spki',
40
+ format: 'pem',
41
+ },
42
+ privateKeyEncoding: {
43
+ type: 'pkcs8',
44
+ format: 'pem',
45
+ },
46
+ });
47
+ // Convert public key to JWK format
48
+ const publicKeyObject = createPublicKey({
49
+ key: publicKey,
50
+ format: 'pem',
51
+ });
52
+ const publicJwk = publicKeyObject.export({ format: 'jwk' });
53
+ // Add standard JWK properties
54
+ const jwkWithMetadata = {
55
+ ...publicJwk,
56
+ kid,
57
+ use: 'sig',
58
+ alg: 'RS256',
59
+ };
60
+ return {
61
+ privateKeyPem: privateKey,
62
+ publicKeyJwk: jwkWithMetadata,
63
+ keyId: kid,
64
+ createdAt: new Date().toISOString(),
65
+ };
66
+ }
67
+ // =============================================================================
68
+ // Secret Generation
69
+ // =============================================================================
70
+ /**
71
+ * Generate a random hex-encoded secret
72
+ *
73
+ * @param bytes - Number of random bytes (default: 32 = 256 bits)
74
+ */
75
+ export function generateHexSecret(bytes = 32) {
76
+ return randomBytes(bytes).toString('hex');
77
+ }
78
+ /**
79
+ * Generate a random base64url-encoded secret
80
+ *
81
+ * @param bytes - Number of random bytes (default: 32 = 256 bits)
82
+ */
83
+ export function generateBase64Secret(bytes = 32) {
84
+ return randomBytes(bytes).toString('base64url');
85
+ }
86
+ /**
87
+ * Generate all required secrets for Authrim
88
+ */
89
+ export function generateAllSecrets(keyId) {
90
+ const keyPair = generateRsaKeyPair(keyId);
91
+ return {
92
+ keyPair,
93
+ rpTokenEncryptionKey: generateHexSecret(32), // 256-bit key
94
+ adminApiSecret: generateBase64Secret(32), // 256-bit secret
95
+ keyManagerSecret: generateBase64Secret(32), // 256-bit secret
96
+ setupToken: generateHexSecret(32), // 256-bit token for initial setup
97
+ };
98
+ }
99
+ // =============================================================================
100
+ // File Operations
101
+ // =============================================================================
102
+ /**
103
+ * Validate that a directory path is safe for writing keys
104
+ * - Must not contain path traversal patterns
105
+ * - Must be within the current working directory or an absolute path that's safe
106
+ */
107
+ function validateKeysDirectory(keysDir) {
108
+ // Reject path traversal patterns
109
+ if (keysDir.includes('..')) {
110
+ throw new Error('Invalid keys directory: path traversal (..) not allowed');
111
+ }
112
+ // Reject null bytes (path truncation attack)
113
+ if (keysDir.includes('\0')) {
114
+ throw new Error('Invalid keys directory: null bytes not allowed');
115
+ }
116
+ // Reject shell metacharacters
117
+ if (/[;&|`$(){}[\]<>!#*?]/.test(keysDir)) {
118
+ throw new Error('Invalid keys directory: shell metacharacters not allowed');
119
+ }
120
+ // Reject absolute paths to system directories (Unix)
121
+ const absolutePath = resolve(keysDir);
122
+ const dangerousPaths = ['/etc', '/usr', '/bin', '/sbin', '/var', '/tmp', '/root', '/home'];
123
+ for (const dangerous of dangerousPaths) {
124
+ if (absolutePath.startsWith(dangerous + '/') || absolutePath === dangerous) {
125
+ throw new Error(`Invalid keys directory: writing to ${dangerous} is not allowed`);
126
+ }
127
+ }
128
+ // Reject Windows system directories
129
+ const windowsDangerous = ['C:\\Windows', 'C:\\Program Files', 'C:\\System32'];
130
+ for (const dangerous of windowsDangerous) {
131
+ if (absolutePath.toLowerCase().startsWith(dangerous.toLowerCase())) {
132
+ throw new Error(`Invalid keys directory: writing to system directories is not allowed`);
133
+ }
134
+ }
135
+ }
136
+ /**
137
+ * Save keys and secrets to the .keys directory
138
+ */
139
+ export async function saveKeysToDirectory(secrets, keysDir = '.keys') {
140
+ // Security: Validate directory path to prevent path traversal
141
+ validateKeysDirectory(keysDir);
142
+ // Ensure directory exists
143
+ if (!existsSync(keysDir)) {
144
+ await mkdir(keysDir, { recursive: true });
145
+ }
146
+ const paths = {
147
+ privateKey: join(keysDir, 'private.pem'),
148
+ publicKey: join(keysDir, 'public.jwk.json'),
149
+ rpTokenEncryptionKey: join(keysDir, 'rp_token_encryption_key.txt'),
150
+ adminApiSecret: join(keysDir, 'admin_api_secret.txt'),
151
+ keyManagerSecret: join(keysDir, 'key_manager_secret.txt'),
152
+ setupToken: join(keysDir, 'setup_token.txt'),
153
+ metadata: join(keysDir, 'metadata.json'),
154
+ };
155
+ // Write private key
156
+ await writeFile(paths.privateKey, secrets.keyPair.privateKeyPem, 'utf-8');
157
+ // Write public key (JWK)
158
+ await writeFile(paths.publicKey, JSON.stringify(secrets.keyPair.publicKeyJwk, null, 2), 'utf-8');
159
+ // Write other secrets
160
+ await writeFile(paths.rpTokenEncryptionKey, secrets.rpTokenEncryptionKey, 'utf-8');
161
+ await writeFile(paths.adminApiSecret, secrets.adminApiSecret, 'utf-8');
162
+ await writeFile(paths.keyManagerSecret, secrets.keyManagerSecret, 'utf-8');
163
+ if (secrets.setupToken) {
164
+ await writeFile(paths.setupToken, secrets.setupToken, 'utf-8');
165
+ }
166
+ // Write metadata
167
+ const metadata = {
168
+ kid: secrets.keyPair.keyId,
169
+ algorithm: 'RS256',
170
+ keySize: 2048,
171
+ createdAt: secrets.keyPair.createdAt,
172
+ files: {
173
+ privateKey: paths.privateKey,
174
+ publicKey: paths.publicKey,
175
+ rpTokenEncryptionKey: paths.rpTokenEncryptionKey,
176
+ },
177
+ };
178
+ await writeFile(paths.metadata, JSON.stringify(metadata, null, 2), 'utf-8');
179
+ }
180
+ /**
181
+ * Load existing keys from directory
182
+ */
183
+ export async function loadKeysFromDirectory(keysDir = '.keys') {
184
+ const metadataPath = join(keysDir, 'metadata.json');
185
+ if (!existsSync(metadataPath)) {
186
+ return {};
187
+ }
188
+ try {
189
+ const metadataContent = await readFile(metadataPath, 'utf-8');
190
+ const metadata = JSON.parse(metadataContent);
191
+ // Load public key JWK
192
+ const publicKeyPath = join(keysDir, 'public.jwk.json');
193
+ let publicKeyJwk;
194
+ if (existsSync(publicKeyPath)) {
195
+ const publicKeyContent = await readFile(publicKeyPath, 'utf-8');
196
+ publicKeyJwk = JSON.parse(publicKeyContent);
197
+ }
198
+ return {
199
+ keyPair: {
200
+ keyId: metadata.kid,
201
+ publicKeyJwk,
202
+ createdAt: metadata.createdAt,
203
+ },
204
+ metadata,
205
+ };
206
+ }
207
+ catch {
208
+ return {};
209
+ }
210
+ }
211
+ // =============================================================================
212
+ // Wrangler Secret Commands
213
+ // =============================================================================
214
+ /**
215
+ * Validate a path parameter to prevent path traversal attacks
216
+ */
217
+ function validatePath(path, paramName) {
218
+ // Reject paths with traversal patterns
219
+ if (path.includes('..') || path.includes('\0')) {
220
+ throw new Error(`Invalid ${paramName}: path traversal detected`);
221
+ }
222
+ // Reject shell metacharacters
223
+ if (/[;&|`$(){}[\]<>!#*?]/.test(path)) {
224
+ throw new Error(`Invalid ${paramName}: shell metacharacters not allowed`);
225
+ }
226
+ }
227
+ /**
228
+ * Validate environment name
229
+ */
230
+ function validateEnvName(env) {
231
+ if (!/^[a-z][a-z0-9-]*$/.test(env)) {
232
+ throw new Error(`Invalid environment name: must be lowercase alphanumeric with hyphens`);
233
+ }
234
+ }
235
+ /**
236
+ * Generate wrangler commands for uploading secrets
237
+ * @deprecated Use uploadSecrets from deploy.ts instead for programmatic upload
238
+ */
239
+ export function generateWranglerSecretCommands(secrets, keysDir = '.keys', env) {
240
+ // Validate inputs to prevent command injection
241
+ validatePath(keysDir, 'keysDir');
242
+ if (env) {
243
+ validateEnvName(env);
244
+ }
245
+ const envFlag = env ? ` --env ${env}` : '';
246
+ const commands = [];
247
+ // Private key (multiline secret)
248
+ commands.push(`cat ${join(keysDir, 'private.pem')} | wrangler secret put PRIVATE_KEY_PEM${envFlag}`);
249
+ // RP Token encryption key
250
+ commands.push(`echo -n "$(cat ${join(keysDir, 'rp_token_encryption_key.txt')})" | wrangler secret put RP_TOKEN_ENCRYPTION_KEY${envFlag}`);
251
+ // Admin API secret
252
+ commands.push(`echo -n "$(cat ${join(keysDir, 'admin_api_secret.txt')})" | wrangler secret put ADMIN_API_SECRET${envFlag}`);
253
+ // Key Manager secret
254
+ commands.push(`echo -n "$(cat ${join(keysDir, 'key_manager_secret.txt')})" | wrangler secret put KEY_MANAGER_SECRET${envFlag}`);
255
+ return commands;
256
+ }
257
+ // =============================================================================
258
+ // Validation
259
+ // =============================================================================
260
+ /**
261
+ * Validate that a private key PEM is valid RSA
262
+ */
263
+ export function validatePrivateKey(pem) {
264
+ try {
265
+ const key = createPrivateKey({
266
+ key: pem,
267
+ format: 'pem',
268
+ });
269
+ return key.type === 'private' && key.asymmetricKeyType === 'rsa';
270
+ }
271
+ catch {
272
+ return false;
273
+ }
274
+ }
275
+ /**
276
+ * Validate that a public key JWK has required properties
277
+ */
278
+ export function validatePublicKeyJwk(jwk) {
279
+ if (!jwk.kty || jwk.kty !== 'RSA')
280
+ return false;
281
+ if (!jwk.n || !jwk.e)
282
+ return false;
283
+ if (!jwk.kid)
284
+ return false;
285
+ return true;
286
+ }
287
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/core/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Authrim Lock File Module
3
+ *
4
+ * Manages authrim-lock.json which records created resource IDs.
5
+ * This file allows re-deployment and resource management.
6
+ */
7
+ import { z } from 'zod';
8
+ import type { ProvisionedResources } from './cloudflare.js';
9
+ declare const ResourceEntrySchema: z.ZodObject<{
10
+ name: z.ZodString;
11
+ id: z.ZodString;
12
+ }, "strip", z.ZodTypeAny, {
13
+ name: string;
14
+ id: string;
15
+ }, {
16
+ name: string;
17
+ id: string;
18
+ }>;
19
+ declare const KVResourceEntrySchema: z.ZodObject<{
20
+ name: z.ZodString;
21
+ id: z.ZodString;
22
+ } & {
23
+ previewId: z.ZodOptional<z.ZodString>;
24
+ }, "strip", z.ZodTypeAny, {
25
+ name: string;
26
+ id: string;
27
+ previewId?: string | undefined;
28
+ }, {
29
+ name: string;
30
+ id: string;
31
+ previewId?: string | undefined;
32
+ }>;
33
+ declare const WorkerEntrySchema: z.ZodObject<{
34
+ name: z.ZodString;
35
+ deployedAt: z.ZodOptional<z.ZodString>;
36
+ version: z.ZodOptional<z.ZodString>;
37
+ }, "strip", z.ZodTypeAny, {
38
+ name: string;
39
+ version?: string | undefined;
40
+ deployedAt?: string | undefined;
41
+ }, {
42
+ name: string;
43
+ version?: string | undefined;
44
+ deployedAt?: string | undefined;
45
+ }>;
46
+ export declare const AuthrimLockSchema: z.ZodObject<{
47
+ version: z.ZodDefault<z.ZodString>;
48
+ createdAt: z.ZodString;
49
+ updatedAt: z.ZodOptional<z.ZodString>;
50
+ env: z.ZodString;
51
+ d1: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
52
+ name: z.ZodString;
53
+ id: z.ZodString;
54
+ }, "strip", z.ZodTypeAny, {
55
+ name: string;
56
+ id: string;
57
+ }, {
58
+ name: string;
59
+ id: string;
60
+ }>>>;
61
+ kv: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
62
+ name: z.ZodString;
63
+ id: z.ZodString;
64
+ } & {
65
+ previewId: z.ZodOptional<z.ZodString>;
66
+ }, "strip", z.ZodTypeAny, {
67
+ name: string;
68
+ id: string;
69
+ previewId?: string | undefined;
70
+ }, {
71
+ name: string;
72
+ id: string;
73
+ previewId?: string | undefined;
74
+ }>>>;
75
+ queues: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
76
+ name: z.ZodString;
77
+ id: z.ZodString;
78
+ }, "strip", z.ZodTypeAny, {
79
+ name: string;
80
+ id: string;
81
+ }, {
82
+ name: string;
83
+ id: string;
84
+ }>>>;
85
+ r2: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
86
+ name: z.ZodString;
87
+ }, "strip", z.ZodTypeAny, {
88
+ name: string;
89
+ }, {
90
+ name: string;
91
+ }>>>;
92
+ workers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
93
+ name: z.ZodString;
94
+ deployedAt: z.ZodOptional<z.ZodString>;
95
+ version: z.ZodOptional<z.ZodString>;
96
+ }, "strip", z.ZodTypeAny, {
97
+ name: string;
98
+ version?: string | undefined;
99
+ deployedAt?: string | undefined;
100
+ }, {
101
+ name: string;
102
+ version?: string | undefined;
103
+ deployedAt?: string | undefined;
104
+ }>>>;
105
+ }, "strip", z.ZodTypeAny, {
106
+ version: string;
107
+ createdAt: string;
108
+ env: string;
109
+ d1: Record<string, {
110
+ name: string;
111
+ id: string;
112
+ }>;
113
+ kv: Record<string, {
114
+ name: string;
115
+ id: string;
116
+ previewId?: string | undefined;
117
+ }>;
118
+ r2?: Record<string, {
119
+ name: string;
120
+ }> | undefined;
121
+ updatedAt?: string | undefined;
122
+ queues?: Record<string, {
123
+ name: string;
124
+ id: string;
125
+ }> | undefined;
126
+ workers?: Record<string, {
127
+ name: string;
128
+ version?: string | undefined;
129
+ deployedAt?: string | undefined;
130
+ }> | undefined;
131
+ }, {
132
+ createdAt: string;
133
+ env: string;
134
+ r2?: Record<string, {
135
+ name: string;
136
+ }> | undefined;
137
+ version?: string | undefined;
138
+ updatedAt?: string | undefined;
139
+ d1?: Record<string, {
140
+ name: string;
141
+ id: string;
142
+ }> | undefined;
143
+ kv?: Record<string, {
144
+ name: string;
145
+ id: string;
146
+ previewId?: string | undefined;
147
+ }> | undefined;
148
+ queues?: Record<string, {
149
+ name: string;
150
+ id: string;
151
+ }> | undefined;
152
+ workers?: Record<string, {
153
+ name: string;
154
+ version?: string | undefined;
155
+ deployedAt?: string | undefined;
156
+ }> | undefined;
157
+ }>;
158
+ export type AuthrimLock = z.infer<typeof AuthrimLockSchema>;
159
+ export type ResourceEntry = z.infer<typeof ResourceEntrySchema>;
160
+ export type KVResourceEntry = z.infer<typeof KVResourceEntrySchema>;
161
+ export type WorkerEntry = z.infer<typeof WorkerEntrySchema>;
162
+ /**
163
+ * Create a new lock file from provisioned resources
164
+ */
165
+ export declare function createLockFile(env: string, resources: ProvisionedResources): AuthrimLock;
166
+ /**
167
+ * Save lock file to disk
168
+ */
169
+ export declare function saveLockFile(lock: AuthrimLock, path?: string): Promise<void>;
170
+ /** Error class for lock file operations */
171
+ export declare class LockFileError extends Error {
172
+ readonly cause?: Error | undefined;
173
+ constructor(message: string, cause?: Error | undefined);
174
+ }
175
+ /**
176
+ * Load lock file from disk
177
+ * @throws LockFileError if file exists but cannot be parsed
178
+ */
179
+ export declare function loadLockFile(path?: string): Promise<AuthrimLock | null>;
180
+ /**
181
+ * Update worker deployment info in lock file
182
+ */
183
+ export declare function updateWorkerDeployment(lock: AuthrimLock, workerName: string, deploymentName: string, version?: string): AuthrimLock;
184
+ /**
185
+ * Convert lock file to ResourceIds format for wrangler.ts
186
+ */
187
+ export declare function lockToResourceIds(lock: AuthrimLock): {
188
+ d1: Record<string, {
189
+ id: string;
190
+ name: string;
191
+ }>;
192
+ kv: Record<string, {
193
+ id: string;
194
+ name: string;
195
+ }>;
196
+ queues?: Record<string, {
197
+ id: string;
198
+ name: string;
199
+ }>;
200
+ r2?: Record<string, {
201
+ name: string;
202
+ }>;
203
+ };
204
+ /**
205
+ * Merge two lock files (for updating existing)
206
+ */
207
+ export declare function mergeLockFiles(existing: AuthrimLock, newData: Partial<AuthrimLock>): AuthrimLock;
208
+ /**
209
+ * Validate that all required resources exist in lock file
210
+ */
211
+ export declare function validateLockFile(lock: AuthrimLock): {
212
+ valid: boolean;
213
+ missing: string[];
214
+ };
215
+ /**
216
+ * Generate summary of resources in lock file
217
+ */
218
+ export declare function getLockFileSummary(lock: AuthrimLock): string;
219
+ export {};
220
+ //# sourceMappingURL=lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/core/lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAM5D,QAAA,MAAM,mBAAmB;;;;;;;;;EAGvB,CAAC;AAEH,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;EAEzB,CAAC;AAEH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;EAIrB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAM5D;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,GAAG,WAAW,CAmDxF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,WAAW,EACjB,IAAI,GAAE,MAA4B,GACjC,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,2CAA2C;AAC3C,qBAAa,aAAc,SAAQ,KAAK;aAGpB,KAAK,CAAC,EAAE,KAAK;gBAD7B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,GAAE,MAA4B,GACjC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAsB7B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,MAAM,GACf,WAAW,CAYb;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG;IACpD,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvC,CASA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAWhG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG;IACnD,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAuBA;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAwC5D"}