Skip to content

Commit 7bbe82e

Browse files
authored
feat(lex-cli): support new Permission and PermissionSet types (#110)
1 parent b83622d commit 7bbe82e

File tree

7 files changed

+772
-29
lines changed

7 files changed

+772
-29
lines changed

packages/lex-cli/src/generator/index.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { readFile } from 'node:fs/promises';
22
import {
3-
toNamespace,
43
getDescriptions,
5-
writeJsdoc,
64
mainPrelude,
75
sortDefinition,
86
sortName,
97
sortPropertyKeys,
8+
toNamespace,
9+
writeJsdoc,
1010
} from '../utils/index.js';
1111
import { resolveType } from './resolvers/index.js';
1212
import { type DocumentSchema, documentSchema } from './schema.js';
@@ -167,6 +167,10 @@ ${metadataLines.join('\n')}`;
167167

168168
chunk += '}';
169169

170+
if (key === 'main') {
171+
chunk += 'type Main = Record;';
172+
}
173+
170174
records += `\n'${nsid}': ${tsNamespace}.Record;`;
171175
} else if (type === 'query' || type === 'procedure') {
172176
let parameters = def.parameters;
@@ -264,6 +268,11 @@ ${metadataLines.join('\n')}`;
264268
} else if (type === 'bytes') {
265269
const { value, descriptions } = resolveType(nsid, def);
266270

271+
chunk += writeJsdoc(descriptions);
272+
chunk += `type ${typeName} = ${value};`;
273+
} else if (type === 'permission' || type === 'permission-set') {
274+
const { value, descriptions } = resolveType(nsid, def);
275+
267276
chunk += writeJsdoc(descriptions);
268277
chunk += `type ${typeName} = ${value};`;
269278
} else if (type === 'subscription') {

packages/lex-cli/src/generator/resolvers/primitives.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ export function resolvePrimitiveType(type: string): string {
88
return 'At.Bytes';
99
case 'blob':
1010
return 'At.Blob';
11+
case 'permission':
12+
return 'At.Permission';
13+
case 'permission-set':
14+
return 'At.PermissionSet';
1115
default:
1216
return 'unknown';
1317
}

packages/lex-cli/src/generator/resolvers/type.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,11 @@ export function resolveType(
2929
case 'cid-link':
3030
case 'blob':
3131
case 'bytes':
32+
case 'permission':
33+
case 'permission-set':
3234
val = resolvePrimitiveType(def.type);
3335
break;
36+
3437
case 'integer':
3538
val = resolveIntegerType(def, descs);
3639
break;

packages/lex-cli/src/generator/schema.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,30 @@ export const recordSchema = t.isObject({
349349

350350
export type RecordSchema = t.InferType<typeof objectSchema>;
351351

352+
export const permissionSchema = t.isObject({
353+
type: t.isLiteral('permission'),
354+
description: t.isOptional(t.isString()),
355+
resource: t.isString(),
356+
lxm: t.isOptional(t.isArray(t.isString())),
357+
action: t.isOptional(t.isArray(t.isString())),
358+
collection: t.isOptional(t.isArray(t.isString())),
359+
inheritAud: t.isOptional(t.isBoolean()),
360+
});
361+
362+
export type PermissionSchema = t.InferType<typeof permissionSchema>;
363+
364+
export const permissionSetSchema = t.isObject({
365+
type: t.isLiteral('permission-set'),
366+
description: t.isOptional(t.isString()),
367+
title: t.isOptional(t.isString()),
368+
'title:lang': t.isOptional(t.isRecord(t.isUnknown())),
369+
detail: t.isOptional(t.isString()),
370+
'detail:lang': t.isOptional(t.isRecord(t.isUnknown())),
371+
permissions: t.isArray(permissionSchema),
372+
});
373+
374+
export type PermissionSetSchema = t.InferType<typeof permissionSetSchema>;
375+
352376
export const userTypeSchema = t.isOneOf([
353377
recordSchema,
354378
xrpcQuerySchema,
@@ -364,6 +388,8 @@ export const userTypeSchema = t.isOneOf([
364388
bytesSchema,
365389
cidLinkSchema,
366390
unknownSchema,
391+
permissionSchema,
392+
permissionSetSchema,
367393
]);
368394

369395
export type UserTypeSchema = t.InferType<typeof userTypeSchema>;

packages/lex-cli/src/utils/formats.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,7 @@ export const IGNORED_FORMATS = new Set([
1212
'datetime',
1313
'language',
1414
'nsid',
15+
'record-key',
16+
'tid',
1517
'uri',
1618
]);

packages/lex-cli/src/utils/prelude.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,20 @@ export declare namespace At {
6060
};
6161
size: number;
6262
}
63+
64+
/** Individual permission entry */
65+
interface Permission {
66+
resource: string;
67+
lxm?: string[];
68+
action?: string[];
69+
collection?: string[];
70+
inheritAud?: boolean;
71+
}
72+
73+
/** Set of permissions */
74+
interface PermissionSet {
75+
title?: string;
76+
detail?: string;
77+
permissions: Permission[];
78+
}
6379
}`;

0 commit comments

Comments
 (0)