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 -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}, {name: 'describeClient', label: 'Show app client settings', enabled: true, status: 'available', runtimeRequired: true}, {name: 'updateClientOAuth', label: 'Change hosted sign-in and OAuth settings', 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 const USER_POOL_OAUTH_FLOWS = ['code', 'implicit', 'client_credentials'] as const /** Scopes every pool offers; resource servers can add their own. */ export const USER_POOL_STANDARD_SCOPES = ['openid', 'email', 'phone', 'profile', 'aws.cognito.signin.user.admin'] as const export function userPoolsSchemaFor(cloud: CloudProvider): ServiceSchema | null { return cloud === 'aws' ? awsUserPoolsSchema() : null }