43f4cae9b5
The runtime leaves EstimatedNumberOfUsers at 0, so the pool metadata now carries a userCount from ListUsers (capped at 1000), which the delete confirmation reads.
98 lines
5.1 KiB
TypeScript
98 lines
5.1 KiB
TypeScript
import type {CloudProvider, FieldSchema, ServiceSchema, TableColumnSchema} from './types'
|
||
|
||
/** Cognito's own limit and character set for user pool names. */
|
||
export const USER_POOL_NAME_PATTERN = '^[\\w\\s+=,.@-]{1,128}$'
|
||
export const USER_POOL_SIGN_IN = ['email', 'username'] as const
|
||
export const USER_POOL_PASSWORD_POLICIES = ['default', 'relaxed'] as const
|
||
/** Cognito's group name rule: 1–128 letters, marks, symbols, digits or punctuation (no whitespace). Needs the `u` flag. */
|
||
export const USER_POOL_GROUP_NAME_PATTERN = '^[\\p{L}\\p{M}\\p{S}\\p{N}\\p{P}]{1,128}$'
|
||
|
||
const userPoolColumns: TableColumnSchema[] = [
|
||
{name: 'name', label: 'Name'},
|
||
{name: 'id', label: 'Pool ID', format: 'code'},
|
||
{name: 'status', label: 'Status', format: 'badge'},
|
||
{name: 'createdAt', label: 'Created', format: 'datetime'},
|
||
]
|
||
|
||
const userPoolFilters: FieldSchema[] = [{name: 'search', label: 'Search', type: 'text', required: false}]
|
||
|
||
export function awsUserPoolsSchema(): ServiceSchema {
|
||
return {
|
||
cloud: 'aws',
|
||
service: 'userpools',
|
||
displayName: 'Amazon Cognito user pools',
|
||
fields: [
|
||
{
|
||
name: 'name',
|
||
label: 'Pool name',
|
||
type: 'text',
|
||
required: true,
|
||
validation: {pattern: USER_POOL_NAME_PATTERN, message: 'Use up to 128 letters, digits, spaces or + = , . @ _ -'},
|
||
},
|
||
{
|
||
name: 'signInWith',
|
||
label: 'Sign in with',
|
||
type: 'select',
|
||
required: false,
|
||
defaultValue: 'email',
|
||
description: 'Email makes the address the sign-in name; username keeps a separate user name.',
|
||
options: [{label: 'Email address', value: 'email'}, {label: 'Username', value: 'username'}],
|
||
},
|
||
{
|
||
name: 'passwordPolicy',
|
||
label: 'Password policy',
|
||
type: 'select',
|
||
required: false,
|
||
defaultValue: 'default',
|
||
description: 'Relaxed only requires 8 characters, which keeps local test users quick to create.',
|
||
options: [
|
||
{label: 'AWS default (upper, lower, number, symbol)', value: 'default'},
|
||
{label: 'Relaxed (8+ characters)', value: 'relaxed'},
|
||
],
|
||
},
|
||
{
|
||
name: 'createAppClient',
|
||
label: 'App client',
|
||
type: 'select',
|
||
required: false,
|
||
defaultValue: 'yes',
|
||
description: 'A public client (no secret) with username/password and refresh-token sign-in, named <pool>-client.',
|
||
options: [{label: 'Create an app client', value: 'yes'}, {label: 'No app client', value: 'no'}],
|
||
},
|
||
],
|
||
actions: ['list', 'create', 'delete', 'inspect'],
|
||
capabilities: {
|
||
resourceActions: [
|
||
{name: 'list', label: 'List user pools', enabled: true, status: 'available', runtimeRequired: true},
|
||
{name: 'create', label: 'Create user pool', enabled: true, status: 'available', runtimeRequired: true},
|
||
{name: 'delete', label: 'Delete user pool', enabled: true, status: 'available', runtimeRequired: true},
|
||
{name: 'inspect', label: 'Inspect user pool', enabled: true, status: 'available', runtimeRequired: true},
|
||
],
|
||
itemActions: [
|
||
{name: 'list', label: 'List users', enabled: true, status: 'available', runtimeRequired: true},
|
||
{name: 'get', label: 'Get user', enabled: true, status: 'available', runtimeRequired: true},
|
||
{name: 'put', label: 'Create user', enabled: true, status: 'available', runtimeRequired: true},
|
||
{name: 'delete', label: 'Delete user', enabled: true, status: 'available', runtimeRequired: true},
|
||
],
|
||
userPoolActions: [
|
||
{name: 'updateUser', label: 'Enable, disable, confirm, sign out or reset a user', enabled: true, status: 'available', runtimeRequired: true},
|
||
{name: 'setUserGroups', label: 'Change a user\'s groups', enabled: true, status: 'available', runtimeRequired: true},
|
||
{name: 'listGroups', label: 'List groups', enabled: true, status: 'available', runtimeRequired: true},
|
||
{name: 'createGroup', label: 'Create group', enabled: true, status: 'available', runtimeRequired: true},
|
||
{name: 'deleteGroup', label: 'Delete group', enabled: true, status: 'available', runtimeRequired: true},
|
||
{name: 'testSignIn', label: 'Test sign-in', enabled: true, status: 'available', runtimeRequired: true},
|
||
],
|
||
},
|
||
filters: userPoolFilters,
|
||
columns: userPoolColumns,
|
||
deleteImpact: [
|
||
{path: 'metadata.userCount', singular: 'user', plural: 'users'},
|
||
{path: 'metadata.appClients', singular: 'app client', plural: 'app clients'},
|
||
],
|
||
}
|
||
}
|
||
|
||
export function userPoolsSchemaFor(cloud: CloudProvider): ServiceSchema | null {
|
||
return cloud === 'aws' ? awsUserPoolsSchema() : null
|
||
}
|