From 6b36a91aa774446c0d7b81f239664a84249b4729 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 20 May 2025 17:02:55 +0700 Subject: [PATCH] feat: switch ids to have prefixes --- apps/api/eslint.config.js | 4 +- apps/api/src/db/index.ts | 1 - apps/api/src/db/schema.ts | 1 - packages/db/src/schema/common.test.ts | 15 ++++ packages/db/src/schema/common.ts | 73 ++++++++++++++---- packages/db/src/schema/consumer.ts | 31 +++++--- packages/db/src/schema/deployment.ts | 28 +++++-- packages/db/src/schema/log-entry.ts | 67 ++++++++++------- packages/db/src/schema/project.ts | 39 ++++++---- packages/db/src/schema/team-member.ts | 14 ++-- packages/db/src/schema/team.ts | 17 +++-- packages/db/src/schema/user.ts | 6 +- packages/db/src/schemas.ts | 46 +++++++++--- .../parse-faas-identifier.test.ts.snap | 74 +++++++++---------- .../__snapshots__/parse-faas-uri.test.ts.snap | 72 +++++++++--------- packages/validators/src/validators.ts | 20 ++--- 16 files changed, 323 insertions(+), 185 deletions(-) create mode 100644 packages/db/src/schema/common.test.ts diff --git a/apps/api/eslint.config.js b/apps/api/eslint.config.js index 41bbc990..8a891206 100644 --- a/apps/api/eslint.config.js +++ b/apps/api/eslint.config.js @@ -12,8 +12,8 @@ export default [ rules: { ...drizzle.configs.recommended.rules, 'no-console': 'error', - 'unicorn/no-array-reduce': 'off', - 'no-restricted-imports': ['error', '@agentic/platform-db'] + 'unicorn/no-array-reduce': 'off' + // 'no-restricted-imports': ['error', '@agentic/platform-db'] } } ] diff --git a/apps/api/src/db/index.ts b/apps/api/src/db/index.ts index 1dc3ff19..217f366e 100644 --- a/apps/api/src/db/index.ts +++ b/apps/api/src/db/index.ts @@ -1,4 +1,3 @@ - // The only place we allow `@agentic/platform-db` imports is in this directory. import { diff --git a/apps/api/src/db/schema.ts b/apps/api/src/db/schema.ts index 2063d66c..c28f6f5d 100644 --- a/apps/api/src/db/schema.ts +++ b/apps/api/src/db/schema.ts @@ -1,4 +1,3 @@ - // The only place we allow `@agentic/platform-db` imports is in this directory. export * from '@agentic/platform-db' diff --git a/packages/db/src/schema/common.test.ts b/packages/db/src/schema/common.test.ts new file mode 100644 index 00000000..1ccfbac8 --- /dev/null +++ b/packages/db/src/schema/common.test.ts @@ -0,0 +1,15 @@ +import { expect, test } from 'vitest' + +import { getIdSchemaForModelType } from '../schemas' +import { createId, idMaxLength, idPrefixMap, type ModelType } from './common' + +for (const modelType of Object.keys(idPrefixMap)) { + test(`${modelType} id`, () => { + for (let i = 0; i < 100; ++i) { + const id = createId(modelType as ModelType) + expect(id.startsWith(idPrefixMap[modelType as ModelType])).toBe(true) + expect(id.length).toBeLessThanOrEqual(idMaxLength) + expect(getIdSchemaForModelType(modelType as ModelType).parse(id)).toBe(id) + } + }) +} diff --git a/packages/db/src/schema/common.ts b/packages/db/src/schema/common.ts index fcb10a86..d89d9f4c 100644 --- a/packages/db/src/schema/common.ts +++ b/packages/db/src/schema/common.ts @@ -1,3 +1,4 @@ +import { assert } from '@agentic/platform-core' import { type Equal, sql, type Writable } from '@fisch0920/drizzle-orm' import { pgEnum, @@ -11,19 +12,68 @@ import { } from '@fisch0920/drizzle-orm/pg-core' import { createSchemaFactory } from '@fisch0920/drizzle-zod' import { z } from '@hono/zod-openapi' -import { createId } from '@paralleldrive/cuid2' +import { createId as createCuid2 } from '@paralleldrive/cuid2' const usernameAndTeamSlugLength = 64 as const -/** - * `cuid2` - */ -export function cuid>( - config?: PgVarcharConfig, never> -): PgVarcharBuilderInitial<'', Writable, 24> { - return varchar({ length: 24, ...config }) +// prefix is max 4 characters +// separator is 1 character +// cuid2 is max 24 characters +// so use 32 characters to be safe for storing ids +export const idMaxLength = 32 as const + +export const idPrefixMap = { + user: 'user', + team: 'team', + project: 'proj', + deployment: 'depl', + consumer: 'csmr', + logEntry: 'log' +} as const + +export type ModelType = keyof typeof idPrefixMap + +export function createId(modelType: ModelType): string { + const prefix = idPrefixMap[modelType] + assert(prefix, 500, `Invalid model type: ${modelType}`) + + return `${prefix}_${createCuid2()}` } +/** + * All of our model primary ids have the following format: + * + * `${modelPrefix}_${cuid2}` + */ +export function id>( + config?: PgVarcharConfig, never> +): PgVarcharBuilderInitial<'', Writable, typeof idMaxLength> { + return varchar({ length: idMaxLength, ...config }) +} + +/** + * Returns the `id` primary key to use for a given model type. + */ +function getPrimaryId(modelType: ModelType) { + return id() + .primaryKey() + .$defaultFn(() => createId(modelType)) +} + +export const projectPrimaryId = getPrimaryId('project') +export const deploymentPrimaryId = getPrimaryId('deployment') +export const consumerPrimaryId = getPrimaryId('consumer') +export const logEntryPrimaryId = getPrimaryId('logEntry') +export const teamPrimaryId = getPrimaryId('team') +export const userPrimaryId = getPrimaryId('user') + +export const projectId = id +export const deploymentId = id +export const consumerId = id +export const logEntryId = id +export const teamId = id +export const userId = id + export function stripeId>( config?: PgVarcharConfig, never> ): PgVarcharBuilderInitial<'', Writable, 255> { @@ -66,13 +116,6 @@ export function teamSlug>( return varchar({ length: usernameAndTeamSlugLength, ...config }) } -/** - * Default `id` primary key as a cuid2 - */ -export const id = varchar('id', { length: 24 }) - .primaryKey() - .$defaultFn(createId) - /** * Timestamp with mode `string` */ diff --git a/packages/db/src/schema/consumer.ts b/packages/db/src/schema/consumer.ts index 9289fc4e..b097896e 100644 --- a/packages/db/src/schema/consumer.ts +++ b/packages/db/src/schema/consumer.ts @@ -9,13 +9,21 @@ import { import { z } from '@hono/zod-openapi' import { + consumerIdSchema, + deploymentIdSchema, + projectIdSchema, + userIdSchema +} from '../schemas' +import { + consumerPrimaryId, createInsertSchema, createSelectSchema, createUpdateSchema, - cuid, - id, + deploymentId, + projectId, stripeId, - timestamps + timestamps, + userId } from './common' import { deployments } from './deployment' import { projects } from './project' @@ -42,7 +50,7 @@ import { users } from './user' export const consumers = pgTable( 'consumers', { - id, + id: consumerPrimaryId, ...timestamps, // API token for this consumer @@ -62,12 +70,12 @@ export const consumers = pgTable( // only used during initial creation source: text(), - userId: cuid() + userId: userId() .notNull() .references(() => users.id), // The project this user is subscribed to - projectId: cuid() + projectId: projectId() .notNull() .references(() => projects.id, { onDelete: 'cascade' @@ -75,7 +83,7 @@ export const consumers = pgTable( // The specific deployment this user is subscribed to, since pricing can // change across deployment versions) - deploymentId: cuid() + deploymentId: deploymentId() .notNull() .references(() => deployments.id, { onDelete: 'cascade' @@ -131,6 +139,11 @@ export const consumersRelations = relations(consumers, ({ one }) => ({ })) export const consumerSelectSchema = createSelectSchema(consumers, { + id: consumerIdSchema, + userId: userIdSchema, + projectId: projectIdSchema, + deploymentId: deploymentIdSchema, + _stripeSubscriptionItemIdMap: stripeSubscriptionItemIdMapSchema }) .omit({ @@ -158,7 +171,7 @@ export const consumerSelectSchema = createSelectSchema(consumers, { .openapi('Consumer') export const consumerInsertSchema = createInsertSchema(consumers, { - deploymentId: (schema) => schema.cuid2().optional(), + deploymentId: deploymentIdSchema.optional(), plan: z.string().nonempty() }) @@ -170,7 +183,7 @@ export const consumerInsertSchema = createInsertSchema(consumers, { .strict() export const consumerUpdateSchema = createUpdateSchema(consumers, { - deploymentId: (schema) => schema.cuid2().optional() + deploymentId: deploymentIdSchema.optional() }) .pick({ plan: true, diff --git a/packages/db/src/schema/deployment.ts b/packages/db/src/schema/deployment.ts index b9e90cfe..764f47f7 100644 --- a/packages/db/src/schema/deployment.ts +++ b/packages/db/src/schema/deployment.ts @@ -10,15 +10,23 @@ import { } from '@fisch0920/drizzle-orm/pg-core' import { z } from '@hono/zod-openapi' -import { deploymentIdentifierSchema, projectIdSchema } from '../schemas' +import { + deploymentIdentifierSchema, + deploymentIdSchema, + projectIdSchema, + teamIdSchema, + userIdSchema +} from '../schemas' import { createInsertSchema, createSelectSchema, createUpdateSchema, - cuid, deploymentIdentifier, - id, - timestamps + deploymentPrimaryId, + projectId, + teamId, + timestamps, + userId } from './common' import { projects } from './project' import { @@ -33,7 +41,7 @@ import { users } from './user' export const deployments = pgTable( 'deployments', { - id, + id: deploymentPrimaryId, ...timestamps, identifier: deploymentIdentifier().unique().notNull(), @@ -46,11 +54,11 @@ export const deployments = pgTable( readme: text().default('').notNull(), iconUrl: text(), - userId: cuid() + userId: userId() .notNull() .references(() => users.id), - teamId: cuid().references(() => teams.id), - projectId: cuid() + teamId: teamId().references(() => teams.id), + projectId: projectId() .notNull() .references(() => projects.id, { onDelete: 'cascade' @@ -115,6 +123,10 @@ export const deploymentsRelations = relations(deployments, ({ one }) => ({ // TODO: virtual openapi spec? (hide openapi.servers) export const deploymentSelectSchema = createSelectSchema(deployments, { + id: deploymentIdSchema, + userId: userIdSchema, + teamId: teamIdSchema.optional(), + projectId: projectIdSchema, identifier: deploymentIdentifierSchema, hash: (schema) => diff --git a/packages/db/src/schema/log-entry.ts b/packages/db/src/schema/log-entry.ts index f8751dab..f59944b4 100644 --- a/packages/db/src/schema/log-entry.ts +++ b/packages/db/src/schema/log-entry.ts @@ -1,14 +1,28 @@ import { relations } from '@fisch0920/drizzle-orm' -import { index, jsonb, pgTable, text } from '@fisch0920/drizzle-orm/pg-core' +import { + index, + jsonb, + pgTable, + text, + varchar +} from '@fisch0920/drizzle-orm/pg-core' import { - createInsertSchema, + consumerIdSchema, + deploymentIdSchema, + projectIdSchema, + userIdSchema +} from '../schemas' +import { + consumerId, createSelectSchema, - cuid, - id, + deploymentId, logEntryLevelEnum, + logEntryPrimaryId, logEntryTypeEnum, - timestamps + projectId, + timestamps, + userId } from './common' import { consumers } from './consumer' import { deployments } from './deployment' @@ -21,7 +35,7 @@ import { users } from './user' export const logEntries = pgTable( 'log_entries', { - id, + id: logEntryPrimaryId, ...timestamps, // core data (required) @@ -32,29 +46,31 @@ export const logEntries = pgTable( // context info (required) environment: text(), service: text(), - requestId: text(), - traceId: text(), + requestId: varchar({ length: 512 }), + traceId: varchar({ length: 512 }), // relations (optional) - userId: cuid(), - projectId: cuid(), - deploymentId: cuid(), - consumerId: cuid(), + userId: userId(), + projectId: projectId(), + deploymentId: deploymentId(), + consumerId: consumerId(), // misc metadata (optional) metadata: jsonb().$type>().default({}).notNull() }, (table) => [ index('log_entry_type_idx').on(table.type), - index('log_entry_level_idx').on(table.level), - index('log_entry_environment_idx').on(table.environment), - index('log_entry_service_idx').on(table.service), - index('log_entry_requestId_idx').on(table.requestId), - index('log_entry_traceId_idx').on(table.traceId), + // TODO: Don't add these extra indices until we need them. They'll become + // very large very fast. + // index('log_entry_level_idx').on(table.level), + // index('log_entry_environment_idx').on(table.environment), + // index('log_entry_service_idx').on(table.service), + // index('log_entry_requestId_idx').on(table.requestId), + // index('log_entry_traceId_idx').on(table.traceId), index('log_entry_userId_idx').on(table.userId), index('log_entry_projectId_idx').on(table.projectId), index('log_entry_deploymentId_idx').on(table.deploymentId), - index('log_entry_consumerId_idx').on(table.consumerId), + // index('log_entry_consumerId_idx').on(table.consumerId), index('log_entry_createdAt_idx').on(table.createdAt), index('log_entry_updatedAt_idx').on(table.updatedAt), index('log_entry_deletedAt_idx').on(table.deletedAt) @@ -80,7 +96,12 @@ export const logEntriesRelations = relations(logEntries, ({ one }) => ({ }) })) -export const logEntrySelectSchema = createSelectSchema(logEntries) +export const logEntrySelectSchema = createSelectSchema(logEntries, { + userId: userIdSchema.optional(), + projectId: projectIdSchema.optional(), + deploymentId: deploymentIdSchema.optional(), + consumerId: consumerIdSchema.optional() +}) // .extend({ // user: z // .lazy(() => userSelectSchema) @@ -104,11 +125,3 @@ export const logEntrySelectSchema = createSelectSchema(logEntries) // }) .strip() .openapi('LogEntry') - -export const logEntryInsertSchema = createInsertSchema(logEntries) - .omit({ - id: true, - createdAt: true, - updatedAt: true - }) - .strict() diff --git a/packages/db/src/schema/project.ts b/packages/db/src/schema/project.ts index c8675513..87fdd2cc 100644 --- a/packages/db/src/schema/project.ts +++ b/packages/db/src/schema/project.ts @@ -11,18 +11,26 @@ import { } from '@fisch0920/drizzle-orm/pg-core' import { z } from '@hono/zod-openapi' -import { projectIdentifierSchema } from '../schemas' +import { + deploymentIdSchema, + projectIdentifierSchema, + projectIdSchema, + teamIdSchema, + userIdSchema +} from '../schemas' import { createInsertSchema, createSelectSchema, createUpdateSchema, - cuid, - id, + deploymentId, pricingCurrencyEnum, pricingIntervalEnum, projectIdentifier, + projectPrimaryId, stripeId, - timestamps + teamId, + timestamps, + userId } from './common' import { deployments } from './deployment' import { @@ -40,23 +48,23 @@ import { users } from './user' export const projects = pgTable( 'projects', { - id, + id: projectPrimaryId, ...timestamps, identifier: projectIdentifier().unique().notNull(), name: text().notNull(), alias: text(), - userId: cuid() + userId: userId() .notNull() .references(() => users.id), - teamId: cuid(), + teamId: teamId(), // Most recently published Deployment if one exists - lastPublishedDeploymentId: cuid(), + lastPublishedDeploymentId: deploymentId(), // Most recent Deployment if one exists - lastDeploymentId: cuid(), + lastDeploymentId: deploymentId(), applicationFeePercent: integer().default(20).notNull(), @@ -162,16 +170,21 @@ export const projectsRelations = relations(projects, ({ one }) => ({ })) export const projectSelectSchema = createSelectSchema(projects, { + id: projectIdSchema, + userId: userIdSchema, + teamId: teamIdSchema.optional(), identifier: projectIdentifierSchema, + lastPublishedDeploymentId: deploymentIdSchema.optional(), + lastDeploymentId: deploymentIdSchema.optional(), applicationFeePercent: (schema) => schema.nonnegative(), + pricingIntervals: z.array(pricingIntervalSchema).nonempty(), + defaultPricingInterval: pricingIntervalSchema, + _stripeProductIdMap: stripeProductIdMapSchema, _stripePriceIdMap: stripePriceIdMapSchema, - _stripeMeterIdMap: stripeMeterIdMapSchema, - - pricingIntervals: z.array(pricingIntervalSchema).nonempty(), - defaultPricingInterval: pricingIntervalSchema + _stripeMeterIdMap: stripeMeterIdMapSchema }) .omit({ _secret: true, diff --git a/packages/db/src/schema/team-member.ts b/packages/db/src/schema/team-member.ts index 20b2289e..fc409ca2 100644 --- a/packages/db/src/schema/team-member.ts +++ b/packages/db/src/schema/team-member.ts @@ -6,15 +6,17 @@ import { primaryKey } from '@fisch0920/drizzle-orm/pg-core' +import { userIdSchema } from '../schemas' import { createInsertSchema, createSelectSchema, createUpdateSchema, - cuid, + teamId, teamMemberRoleEnum, teamSlug, timestamp, - timestamps + timestamps, + userId } from './common' import { teams } from './team' import { users } from './user' @@ -24,13 +26,13 @@ export const teamMembers = pgTable( { ...timestamps, - userId: cuid() + userId: userId() .notNull() .references(() => users.id, { onDelete: 'cascade' }), teamSlug: teamSlug() .notNull() .references(() => teams.slug, { onDelete: 'cascade' }), - teamId: cuid() + teamId: teamId() .notNull() .references(() => teams.id, { onDelete: 'cascade' }), role: teamMemberRoleEnum().default('user').notNull(), @@ -75,7 +77,9 @@ export const teamMemberSelectSchema = createSelectSchema(teamMembers) .strip() .openapi('TeamMember') -export const teamMemberInsertSchema = createInsertSchema(teamMembers) +export const teamMemberInsertSchema = createInsertSchema(teamMembers, { + userId: userIdSchema +}) .pick({ userId: true, role: true diff --git a/packages/db/src/schema/team.ts b/packages/db/src/schema/team.ts index 58c8f5b7..085adb2b 100644 --- a/packages/db/src/schema/team.ts +++ b/packages/db/src/schema/team.ts @@ -7,14 +7,15 @@ import { uniqueIndex } from '@fisch0920/drizzle-orm/pg-core' +import { userIdSchema } from '../schemas' import { createInsertSchema, createSelectSchema, createUpdateSchema, - cuid, - id, + teamPrimaryId, teamSlug, - timestamps + timestamps, + userId } from './common' import { teamMembers } from './team-member' import { users } from './user' @@ -22,13 +23,13 @@ import { users } from './user' export const teams = pgTable( 'teams', { - id, + id: teamPrimaryId, ...timestamps, - slug: teamSlug().notNull().unique(), + slug: teamSlug().unique().notNull(), name: text().notNull(), - ownerId: cuid().notNull() + ownerId: userId().notNull() }, (table) => [ uniqueIndex('team_slug_idx').on(table.slug), @@ -65,7 +66,9 @@ export const teamInsertSchema = createInsertSchema(teams, { .omit({ id: true, createdAt: true, updatedAt: true, ownerId: true }) .strict() -export const teamUpdateSchema = createUpdateSchema(teams) +export const teamUpdateSchema = createUpdateSchema(teams, { + ownerId: userIdSchema +}) .pick({ name: true, ownerId: true diff --git a/packages/db/src/schema/user.ts b/packages/db/src/schema/user.ts index fc557ccd..5a4d4746 100644 --- a/packages/db/src/schema/user.ts +++ b/packages/db/src/schema/user.ts @@ -15,11 +15,11 @@ import { createInsertSchema, createSelectSchema, createUpdateSchema, - id, stripeId, timestamp, timestamps, username, + userPrimaryId, userRoleEnum } from './common' import { type AuthProviders, publicAuthProvidersSchema } from './schemas' @@ -28,7 +28,7 @@ import { teams } from './team' export const users = pgTable( 'users', { - id, + id: userPrimaryId, ...timestamps, username: username().notNull().unique(), @@ -52,7 +52,7 @@ export const users = pgTable( // third-party auth providers authProviders: jsonb().$type().default({}).notNull(), - stripeCustomerId: stripeId().unique() + stripeCustomerId: stripeId() }, (table) => [ uniqueIndex('user_email_idx').on(table.email), diff --git a/packages/db/src/schemas.ts b/packages/db/src/schemas.ts index e3aa03e2..b581bd05 100644 --- a/packages/db/src/schemas.ts +++ b/packages/db/src/schemas.ts @@ -1,23 +1,47 @@ +import { assert } from '@agentic/platform-core' import { validators } from '@agentic/platform-validators' import { z } from '@hono/zod-openapi' import type { consumersRelations } from './schema/consumer' import type { deploymentsRelations } from './schema/deployment' import type { projectsRelations } from './schema/project' +import { idPrefixMap, type ModelType } from './schema/common' -function getCuidSchema(idLabel: string) { - return z.string().refine((id) => validators.cuid(id), { - message: `Invalid ${idLabel}` - }) +export function getIdSchemaForModelType(modelType: ModelType) { + const idPrefix = idPrefixMap[modelType] + assert(idPrefix, 500, `Invalid model type: ${modelType}`) + + // Convert model type to PascalCase + const modelDisplayName = + modelType.charAt(0).toUpperCase() + modelType.slice(1) + const example = `${idPrefix}_tz4a98xxat96iws9zmbrgj3a` + + return z + .string() + .refine( + (id) => { + const parts = id.split('_') + if (parts.length !== 2) return false + if (parts[0] !== idPrefix) return false + if (!validators.cuid(parts[1])) return false + + return true + }, + { + message: `Invalid ${modelDisplayName} id` + } + ) + .describe(`${modelDisplayName} id (e.g. "${example}")`) + // TODO: is this necessary? + // .openapi(`${modelDisplayName}Id`, { example }) } -export const cuidSchema = getCuidSchema('id') -export const userIdSchema = getCuidSchema('user id') -export const teamIdSchema = getCuidSchema('team id') -export const consumerIdSchema = getCuidSchema('consumer id') -export const projectIdSchema = getCuidSchema('project id') -export const deploymentIdSchema = getCuidSchema('deployment id') -export const logEntryIdSchema = getCuidSchema('log entry id') +export const userIdSchema = getIdSchemaForModelType('user') +export const teamIdSchema = getIdSchemaForModelType('team') +export const consumerIdSchema = getIdSchemaForModelType('consumer') +export const projectIdSchema = getIdSchemaForModelType('project') +export const deploymentIdSchema = getIdSchemaForModelType('deployment') +export const logEntryIdSchema = getIdSchemaForModelType('logEntry') export const projectIdentifierSchema = z .string() diff --git a/packages/validators/src/__snapshots__/parse-faas-identifier.test.ts.snap b/packages/validators/src/__snapshots__/parse-faas-identifier.test.ts.snap index 25bd5226..74564d06 100644 --- a/packages/validators/src/__snapshots__/parse-faas-identifier.test.ts.snap +++ b/packages/validators/src/__snapshots__/parse-faas-identifier.test.ts.snap @@ -3,8 +3,8 @@ exports[`URL prefix and suffix success 1`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", } `; @@ -12,8 +12,8 @@ exports[`URL prefix and suffix success 1`] = ` exports[`URL prefix and suffix success 2`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo/bar/123", } `; @@ -21,8 +21,8 @@ exports[`URL prefix and suffix success 2`] = ` exports[`URL prefix success 1`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", } `; @@ -30,8 +30,8 @@ exports[`URL prefix success 1`] = ` exports[`URL prefix success 2`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", } `; @@ -39,8 +39,8 @@ exports[`URL prefix success 2`] = ` exports[`URL prefix success 3`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo/bar/456/123", } `; @@ -48,8 +48,8 @@ exports[`URL prefix success 3`] = ` exports[`URL prefix success 4`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo/bar/456/123", } `; @@ -57,15 +57,15 @@ exports[`URL prefix success 4`] = ` exports[`URL prefix success 5`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo/bar/456/123", } `; exports[`URL prefix success 6`] = ` { - "projectId": "username/foo-bar", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo/bar/456/123", "version": "latest", } @@ -73,7 +73,7 @@ exports[`URL prefix success 6`] = ` exports[`URL prefix success 7`] = ` { - "projectId": "username/foo-bar", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo/bar/456/123", "version": "dev", } @@ -81,7 +81,7 @@ exports[`URL prefix success 7`] = ` exports[`URL prefix success 8`] = ` { - "projectId": "username/foo-bar", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo/bar/456/123", "version": "2.1.0", } @@ -90,15 +90,15 @@ exports[`URL prefix success 8`] = ` exports[`URL suffix success 1`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", } `; exports[`URL suffix success 2`] = ` { - "projectId": "username/foo-bar", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", "version": "latest", } @@ -106,7 +106,7 @@ exports[`URL suffix success 2`] = ` exports[`URL suffix success 3`] = ` { - "projectId": "username/foo-bar", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", "version": "dev", } @@ -114,7 +114,7 @@ exports[`URL suffix success 3`] = ` exports[`URL suffix success 4`] = ` { - "projectId": "username/foo-bar", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", "version": "2.1.0", } @@ -123,8 +123,8 @@ exports[`URL suffix success 4`] = ` exports[`namespace success 1`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", } `; @@ -132,8 +132,8 @@ exports[`namespace success 1`] = ` exports[`namespace success 2`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", } `; @@ -141,8 +141,8 @@ exports[`namespace success 2`] = ` exports[`namespace success 3`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", } `; @@ -150,8 +150,8 @@ exports[`namespace success 3`] = ` exports[`namespace success 4`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", } `; @@ -159,8 +159,8 @@ exports[`namespace success 4`] = ` exports[`namespace success 5`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo/bar/123", } `; @@ -168,15 +168,15 @@ exports[`namespace success 5`] = ` exports[`namespace success 6`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo/bar/123", } `; exports[`namespace success 7`] = ` { - "projectId": "username/foo-bar", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo/bar/123", "version": "latest", } @@ -184,7 +184,7 @@ exports[`namespace success 7`] = ` exports[`namespace success 8`] = ` { - "projectId": "username/foo-bar", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo/bar/123", "version": "dev", } @@ -192,7 +192,7 @@ exports[`namespace success 8`] = ` exports[`namespace success 9`] = ` { - "projectId": "username/foo-bar", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo/bar/123", "version": "1.2.3", } diff --git a/packages/validators/src/__snapshots__/parse-faas-uri.test.ts.snap b/packages/validators/src/__snapshots__/parse-faas-uri.test.ts.snap index 38c23faa..ea05e847 100644 --- a/packages/validators/src/__snapshots__/parse-faas-uri.test.ts.snap +++ b/packages/validators/src/__snapshots__/parse-faas-uri.test.ts.snap @@ -2,7 +2,7 @@ exports[`username/projectName success 1`] = ` { - "projectId": "abc/hello-world", + "projectIdentifier": "abc/hello-world", "servicePath": "/", "version": "latest", } @@ -10,7 +10,7 @@ exports[`username/projectName success 1`] = ` exports[`username/projectName success 2`] = ` { - "projectId": "a16z/foo-bar", + "projectIdentifier": "a16z/foo-bar", "servicePath": "/", "version": "latest", } @@ -18,7 +18,7 @@ exports[`username/projectName success 2`] = ` exports[`username/projectName success 3`] = ` { - "projectId": "foodoo/foo-bar", + "projectIdentifier": "foodoo/foo-bar", "servicePath": "/", "version": "latest", } @@ -26,7 +26,7 @@ exports[`username/projectName success 3`] = ` exports[`username/projectName success 4`] = ` { - "projectId": "u/foobar123-yo", + "projectIdentifier": "u/foobar123-yo", "servicePath": "/", "version": "latest", } @@ -34,7 +34,7 @@ exports[`username/projectName success 4`] = ` exports[`username/projectName success 5`] = ` { - "projectId": "abc/hello-world", + "projectIdentifier": "abc/hello-world", "servicePath": "/", "version": "latest", } @@ -42,7 +42,7 @@ exports[`username/projectName success 5`] = ` exports[`username/projectName/servicePath success 1`] = ` { - "projectId": "u/foo-bar", + "projectIdentifier": "u/foo-bar", "servicePath": "/foo", "version": "latest", } @@ -50,7 +50,7 @@ exports[`username/projectName/servicePath success 1`] = ` exports[`username/projectName/servicePath success 2`] = ` { - "projectId": "a/foo-bar", + "projectIdentifier": "a/foo-bar", "servicePath": "/foo_123", "version": "latest", } @@ -58,7 +58,7 @@ exports[`username/projectName/servicePath success 2`] = ` exports[`username/projectName/servicePath success 3`] = ` { - "projectId": "foo/foobar123-yo", + "projectIdentifier": "foo/foobar123-yo", "servicePath": "/foo_bar_BAR_901", "version": "latest", } @@ -66,7 +66,7 @@ exports[`username/projectName/servicePath success 3`] = ` exports[`username/projectName/servicePath success 4`] = ` { - "projectId": "foo/foobar123-yo", + "projectIdentifier": "foo/foobar123-yo", "servicePath": "/foo/bar/123/456", "version": "latest", } @@ -75,15 +75,15 @@ exports[`username/projectName/servicePath success 4`] = ` exports[`username/projectName@deployment success 1`] = ` { "deploymentHash": "3d2e0fd5", - "deploymentId": "abc/hello-world@3d2e0fd5", - "projectId": "abc/hello-world", + "deploymentIdentifier": "abc/hello-world@3d2e0fd5", + "projectIdentifier": "abc/hello-world", "servicePath": "/", } `; exports[`username/projectName@deployment success 2`] = ` { - "projectId": "a16z/foo-bar", + "projectIdentifier": "a16z/foo-bar", "servicePath": "/", "version": "f673db32c", } @@ -91,7 +91,7 @@ exports[`username/projectName@deployment success 2`] = ` exports[`username/projectName@deployment success 3`] = ` { - "projectId": "foodoo/foo-bar", + "projectIdentifier": "foodoo/foo-bar", "servicePath": "/", "version": "f673db32c", } @@ -100,8 +100,8 @@ exports[`username/projectName@deployment success 3`] = ` exports[`username/projectName@deployment success 4`] = ` { "deploymentHash": "673db32c", - "deploymentId": "u/foobar123-yo@673db32c", - "projectId": "u/foobar123-yo", + "deploymentIdentifier": "u/foobar123-yo@673db32c", + "projectIdentifier": "u/foobar123-yo", "servicePath": "/", } `; @@ -109,8 +109,8 @@ exports[`username/projectName@deployment success 4`] = ` exports[`username/projectName@deployment success 5`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/", } `; @@ -118,8 +118,8 @@ exports[`username/projectName@deployment success 5`] = ` exports[`username/projectName@deployment/servicePath success 1`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foo-bar@01234567", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@01234567", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", } `; @@ -127,8 +127,8 @@ exports[`username/projectName@deployment/servicePath success 1`] = ` exports[`username/projectName@deployment/servicePath success 2`] = ` { "deploymentHash": "abc123lz", - "deploymentId": "username/foo-bar@abc123lz", - "projectId": "username/foo-bar", + "deploymentIdentifier": "username/foo-bar@abc123lz", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", } `; @@ -136,8 +136,8 @@ exports[`username/projectName@deployment/servicePath success 2`] = ` exports[`username/projectName@deployment/servicePath success 3`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foobar123-yo@01234567", - "projectId": "username/foobar123-yo", + "deploymentIdentifier": "username/foobar123-yo@01234567", + "projectIdentifier": "username/foobar123-yo", "servicePath": "/foo_bar_BAR_901", } `; @@ -145,15 +145,15 @@ exports[`username/projectName@deployment/servicePath success 3`] = ` exports[`username/projectName@deployment/servicePath success 4`] = ` { "deploymentHash": "01234567", - "deploymentId": "username/foobar@01234567", - "projectId": "username/foobar", + "deploymentIdentifier": "username/foobar@01234567", + "projectIdentifier": "username/foobar", "servicePath": "/foo/bar/123/456", } `; exports[`username/projectName@version success 1`] = ` { - "projectId": "abc/hello-world", + "projectIdentifier": "abc/hello-world", "servicePath": "/", "version": "1.0.3", } @@ -161,7 +161,7 @@ exports[`username/projectName@version success 1`] = ` exports[`username/projectName@version success 2`] = ` { - "projectId": "a16z/foo-bar", + "projectIdentifier": "a16z/foo-bar", "servicePath": "/", "version": "latest", } @@ -169,7 +169,7 @@ exports[`username/projectName@version success 2`] = ` exports[`username/projectName@version success 3`] = ` { - "projectId": "a16z/foo-bar", + "projectIdentifier": "a16z/foo-bar", "servicePath": "/", "version": "dev", } @@ -177,7 +177,7 @@ exports[`username/projectName@version success 3`] = ` exports[`username/projectName@version success 4`] = ` { - "projectId": "foodoo/foo-bar", + "projectIdentifier": "foodoo/foo-bar", "servicePath": "/", "version": "1.0.1", } @@ -185,7 +185,7 @@ exports[`username/projectName@version success 4`] = ` exports[`username/projectName@version success 5`] = ` { - "projectId": "u/foobar123-yo", + "projectIdentifier": "u/foobar123-yo", "servicePath": "/", "version": "3.2.2234", } @@ -193,7 +193,7 @@ exports[`username/projectName@version success 5`] = ` exports[`username/projectName@version success 6`] = ` { - "projectId": "username/foo-bar", + "projectIdentifier": "username/foo-bar", "servicePath": "/", "version": "1.0.3", } @@ -201,7 +201,7 @@ exports[`username/projectName@version success 6`] = ` exports[`username/projectName@version/servicePath success 1`] = ` { - "projectId": "username/foo-bar", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", "version": "latest", } @@ -209,7 +209,7 @@ exports[`username/projectName@version/servicePath success 1`] = ` exports[`username/projectName@version/servicePath success 2`] = ` { - "projectId": "username/foo-bar", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", "version": "dev", } @@ -217,7 +217,7 @@ exports[`username/projectName@version/servicePath success 2`] = ` exports[`username/projectName@version/servicePath success 3`] = ` { - "projectId": "username/foo-bar", + "projectIdentifier": "username/foo-bar", "servicePath": "/foo", "version": "1.0.0", } @@ -225,7 +225,7 @@ exports[`username/projectName@version/servicePath success 3`] = ` exports[`username/projectName@version/servicePath success 4`] = ` { - "projectId": "username/foobar123-yo", + "projectIdentifier": "username/foobar123-yo", "servicePath": "/foo_bar_BAR_901", "version": "0.0.1", } @@ -233,7 +233,7 @@ exports[`username/projectName@version/servicePath success 4`] = ` exports[`username/projectName@version/servicePath success 5`] = ` { - "projectId": "username/foobar123-yo", + "projectIdentifier": "username/foobar123-yo", "servicePath": "/foo/bar/123-456", "version": "0.0.1", } diff --git a/packages/validators/src/validators.ts b/packages/validators/src/validators.ts index 10bb06e4..c53c5203 100644 --- a/packages/validators/src/validators.ts +++ b/packages/validators/src/validators.ts @@ -20,42 +20,42 @@ export function email(value: string): boolean { return emailValidator.validate(value) } -export function username(value: string): boolean { +export function username(value?: string): boolean { return !!value && usernameRe.test(value) } -export function team(value: string): boolean { +export function team(value?: string): boolean { return username(value) } -export function password(value: string): boolean { +export function password(value?: string): boolean { return !!value && passwordRe.test(value) } -export function projectName(value: string): boolean { +export function projectName(value?: string): boolean { return !!value && projectNameRe.test(value) } -export function deploymentHash(value: string): boolean { +export function deploymentHash(value?: string): boolean { return !!value && deploymentHashRe.test(value) } -export function projectIdentifier(value: string): boolean { +export function projectIdentifier(value?: string): boolean { return !!value && projectRe.test(value) } -export function deploymentIdentifier(value: string): boolean { +export function deploymentIdentifier(value?: string): boolean { return !!value && deploymentRe.test(value) } -export function serviceName(value: string): boolean { +export function serviceName(value?: string): boolean { return !!value && serviceNameRe.test(value) } -export function servicePath(value: string): boolean { +export function servicePath(value?: string): boolean { return !!value && servicePathRe.test(value) && isRelativeUrl(value) } -export function cuid(value: string): boolean { +export function cuid(value?: string): boolean { return !!value && isCuid(value) }