@happyvertical/smrt-profiles 0.57.15 → 0.57.17
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.
- package/dist/chunks/{ApiKey-CVmlf3V6.js → ApiKey-9YuYcpWy.js} +3 -3
- package/dist/chunks/{ApiKey-CVmlf3V6.js.map → ApiKey-9YuYcpWy.js.map} +1 -1
- package/dist/chunks/{ApiKeyCollection-CiiDNFdD.js → ApiKeyCollection-BrJT9vo_.js} +3 -3
- package/dist/chunks/{ApiKeyCollection-CiiDNFdD.js.map → ApiKeyCollection-BrJT9vo_.js.map} +1 -1
- package/dist/chunks/{AuditLogCollection-WDHL-_AF.js → AuditLogCollection-BBbvr8Qc.js} +2 -2
- package/dist/chunks/{AuditLogCollection-WDHL-_AF.js.map → AuditLogCollection-BBbvr8Qc.js.map} +1 -1
- package/dist/chunks/{NostrIdentity-AC8fAdxe.js → NostrIdentity-RJaATTCt.js} +20 -9
- package/dist/chunks/{NostrIdentity-AC8fAdxe.js.map → NostrIdentity-RJaATTCt.js.map} +1 -1
- package/dist/chunks/{NostrIdentityCollection-CctlECpX.js → NostrIdentityCollection-BPNgPOBE.js} +2 -2
- package/dist/chunks/{NostrIdentityCollection-CctlECpX.js.map → NostrIdentityCollection-BPNgPOBE.js.map} +1 -1
- package/dist/chunks/{OidcIdentity-BUblgQLs.js → OidcIdentity-MVVO3MfG.js} +3 -3
- package/dist/chunks/{OidcIdentity-BUblgQLs.js.map → OidcIdentity-MVVO3MfG.js.map} +1 -1
- package/dist/chunks/{OidcIdentityCollection-ClOyaHeF.js → OidcIdentityCollection-s4mp3n62.js} +3 -3
- package/dist/chunks/{OidcIdentityCollection-ClOyaHeF.js.map → OidcIdentityCollection-s4mp3n62.js.map} +1 -1
- package/dist/chunks/{ProfileAssetCollection-CRMcjLJ-.js → ProfileAssetCollection-BuVAdOiv.js} +3 -3
- package/dist/chunks/{ProfileAssetCollection-CRMcjLJ-.js.map → ProfileAssetCollection-BuVAdOiv.js.map} +1 -1
- package/dist/chunks/{ProfileCollection-C4INKh7Y.js → ProfileCollection-CMS9dFc0.js} +26 -26
- package/dist/chunks/{ProfileCollection-C4INKh7Y.js.map → ProfileCollection-CMS9dFc0.js.map} +1 -1
- package/dist/chunks/{ProfileLinkCollection-DFfZRsgv.js → ProfileLinkCollection-ChK9iEBp.js} +3 -3
- package/dist/chunks/{ProfileLinkCollection-DFfZRsgv.js.map → ProfileLinkCollection-ChK9iEBp.js.map} +1 -1
- package/dist/chunks/{ProfileMetadataCollection-BIYKy4Y3.js → ProfileMetadataCollection-CAgJyjze.js} +2 -2
- package/dist/chunks/{ProfileMetadataCollection-BIYKy4Y3.js.map → ProfileMetadataCollection-CAgJyjze.js.map} +1 -1
- package/dist/chunks/{ProfileMetafieldCollection-Buz7gzag.js → ProfileMetafieldCollection-19ae6Lpf.js} +2 -2
- package/dist/chunks/{ProfileMetafieldCollection-Buz7gzag.js.map → ProfileMetafieldCollection-19ae6Lpf.js.map} +1 -1
- package/dist/chunks/{ProfileRelationshipCollection-C4g_QLI4.js → ProfileRelationshipCollection-BFSlTQ7J.js} +5 -5
- package/dist/chunks/{ProfileRelationshipCollection-C4g_QLI4.js.map → ProfileRelationshipCollection-BFSlTQ7J.js.map} +1 -1
- package/dist/chunks/{ProfileRelationshipTermCollection-C9J7mC7P.js → ProfileRelationshipTermCollection-OluL8BGP.js} +2 -2
- package/dist/chunks/{ProfileRelationshipTermCollection-C9J7mC7P.js.map → ProfileRelationshipTermCollection-OluL8BGP.js.map} +1 -1
- package/dist/chunks/{ProfileRelationshipType-U7IwF6Wf.js → ProfileRelationshipType-Cevy-vaF.js} +2 -2
- package/dist/chunks/{ProfileRelationshipType-U7IwF6Wf.js.map → ProfileRelationshipType-Cevy-vaF.js.map} +1 -1
- package/dist/chunks/{ProfileRelationshipTypeCollection-_n22WqTb.js → ProfileRelationshipTypeCollection-BRBpX00F.js} +3 -3
- package/dist/chunks/{ProfileRelationshipTypeCollection-_n22WqTb.js.map → ProfileRelationshipTypeCollection-BRBpX00F.js.map} +1 -1
- package/dist/chunks/{ProfileTypeCollection-B7kwi1mU.js → ProfileTypeCollection-B7m698Bl.js} +3 -3
- package/dist/chunks/{ProfileTypeCollection-B7kwi1mU.js.map → ProfileTypeCollection-B7m698Bl.js.map} +1 -1
- package/dist/chunks/{oidcProvisioningPrimitives-DNP9EZlU.js → oidcProvisioningPrimitives-Dl9qIcYS.js} +5 -5
- package/dist/chunks/{oidcProvisioningPrimitives-DNP9EZlU.js.map → oidcProvisioningPrimitives-Dl9qIcYS.js.map} +1 -1
- package/dist/chunks/{resolveIdentity-CkyqvctR.js → resolveIdentity-CR5p_g7K.js} +16 -16
- package/dist/chunks/{resolveIdentity-CkyqvctR.js.map → resolveIdentity-CR5p_g7K.js.map} +1 -1
- package/dist/index.js +24 -24
- package/dist/index.js.map +1 -1
- package/dist/internal/oidc-provisioning.js +2 -2
- package/dist/manifest.json +1 -1
- package/dist/smrt-knowledge.json +4 -4
- package/dist/utils.js +4 -4
- package/package.json +7 -7
package/dist/chunks/{NostrIdentityCollection-CctlECpX.js → NostrIdentityCollection-BPNgPOBE.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as generateNostrKeypair, s as encryptPrivkey, t as NostrIdentity, y as __exportAll } from "./NostrIdentity-
|
|
1
|
+
import { c as generateNostrKeypair, s as encryptPrivkey, t as NostrIdentity, y as __exportAll } from "./NostrIdentity-RJaATTCt.js";
|
|
2
2
|
import { SmrtCollection } from "@happyvertical/smrt-core";
|
|
3
3
|
//#region src/collections/NostrIdentityCollection.ts
|
|
4
4
|
var NostrIdentityCollection_exports = /* @__PURE__ */ __exportAll({ NostrIdentityCollection: () => NostrIdentityCollection });
|
|
@@ -121,4 +121,4 @@ var NostrIdentityCollection = class extends SmrtCollection {
|
|
|
121
121
|
//#endregion
|
|
122
122
|
export { NostrIdentityCollection_exports as n, NostrIdentityCollection as t };
|
|
123
123
|
|
|
124
|
-
//# sourceMappingURL=NostrIdentityCollection-
|
|
124
|
+
//# sourceMappingURL=NostrIdentityCollection-BPNgPOBE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NostrIdentityCollection-
|
|
1
|
+
{"version":3,"file":"NostrIdentityCollection-BPNgPOBE.js","names":[],"sources":["../../src/collections/NostrIdentityCollection.ts"],"sourcesContent":["/**\n * NostrIdentityCollection - Collection for managing Nostr identity records\n */\n\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { encryptPrivkey, generateNostrKeypair } from '../auth/nostrCrypto';\nimport { NostrIdentity } from '../models/NostrIdentity';\nimport type { Profile } from '../models/Profile';\n\nexport interface Nip05Response {\n names: Record<string, string>;\n relays?: Record<string, string[]>;\n}\n\nexport class NostrIdentityCollection extends SmrtCollection<NostrIdentity> {\n static readonly _itemClass = NostrIdentity;\n\n /**\n * Find identities for a profile\n */\n async findByProfile(profileId: string): Promise<NostrIdentity[]> {\n return await this.list({\n where: { profileId },\n });\n }\n\n /**\n * Find identity by public key\n */\n async findByPubkey(pubkey: string): Promise<NostrIdentity | null> {\n return await this.findOne({\n where: { pubkey },\n });\n }\n\n /**\n * Find identity by email\n */\n async findByEmail(email: string): Promise<NostrIdentity | null> {\n return await this.findOne({\n where: { email: email.toLowerCase() },\n });\n }\n\n /**\n * Find identity by NIP-05 username\n */\n async findByNip05(username: string): Promise<NostrIdentity | null> {\n return await this.findOne({\n where: { nip05Username: username.toLowerCase() },\n });\n }\n\n /**\n * Link a new Nostr identity to a profile with a new keypair\n * @param profile - The profile to link to\n * @param email - Email address for this identity\n * @param masterSecret - Server master secret for encryption\n * @param nip05Username - Optional NIP-05 username (defaults to email local part)\n */\n async createForProfile(\n profile: Profile,\n email: string,\n masterSecret: string,\n nip05Username?: string,\n ): Promise<NostrIdentity> {\n const normalizedEmail = email.toLowerCase();\n\n // Check if already exists for this email\n const existing = await this.findByEmail(normalizedEmail);\n if (existing) {\n throw new Error(`Nostr identity already exists for email: ${email}`);\n }\n\n // Generate new keypair\n const keypair = generateNostrKeypair();\n\n // Encrypt private key\n const encrypted = encryptPrivkey(keypair.privkey, masterSecret);\n\n // Derive NIP-05 username from email if not provided\n const username =\n nip05Username?.toLowerCase() || normalizedEmail.split('@')[0];\n\n // Create identity\n const identity = new NostrIdentity({\n ...this.options,\n profileId: profile.id as string,\n pubkey: keypair.pubkey,\n encryptedPrivkey: encrypted.ciphertext,\n encryptionIv: encrypted.iv,\n encryptionTag: encrypted.tag,\n email: normalizedEmail,\n nip05Username: username,\n });\n\n await identity.initialize();\n await identity.save();\n\n return identity;\n }\n\n /**\n * Link an existing Nostr identity (with encrypted keypair) to a profile\n */\n async linkToProfile(\n profile: Profile,\n nostrData: {\n pubkey: string;\n encryptedPrivkey: string;\n encryptionIv: string;\n encryptionTag: string;\n email: string;\n nip05Username?: string;\n },\n ): Promise<NostrIdentity> {\n // Check if pubkey already exists\n const existingPubkey = await this.findByPubkey(nostrData.pubkey);\n if (existingPubkey) {\n throw new Error('Nostr identity with this public key already exists');\n }\n\n // Check if email already exists\n const existingEmail = await this.findByEmail(nostrData.email);\n if (existingEmail) {\n throw new Error('Nostr identity with this email already exists');\n }\n\n const identity = new NostrIdentity({\n ...this.options,\n profileId: profile.id as string,\n pubkey: nostrData.pubkey,\n encryptedPrivkey: nostrData.encryptedPrivkey,\n encryptionIv: nostrData.encryptionIv,\n encryptionTag: nostrData.encryptionTag,\n email: nostrData.email.toLowerCase(),\n nip05Username:\n nostrData.nip05Username?.toLowerCase() ||\n nostrData.email.toLowerCase().split('@')[0],\n });\n\n await identity.initialize();\n await identity.save();\n\n return identity;\n }\n\n /**\n * Unlink a Nostr identity from a profile\n */\n async unlinkFromProfile(profileId: string, pubkey: string): Promise<boolean> {\n const identity = await this.findOne({\n where: { profileId, pubkey },\n });\n\n if (identity) {\n await identity.delete();\n return true;\n }\n return false;\n }\n\n /**\n * Get NIP-05 response data for the /.well-known/nostr.json endpoint\n * @param username - Optional username filter, returns all if not provided\n */\n async getNip05Response(username?: string): Promise<Nip05Response> {\n const where = username ? { nip05Username: username.toLowerCase() } : {};\n\n const identities = await this.list({\n where,\n // Only return verified identities for NIP-05\n // Uncomment if you want to require verification:\n // where: { ...where, 'verifiedAt IS NOT': null },\n });\n\n const names: Record<string, string> = {};\n for (const identity of identities) {\n if (identity.nip05Username && identity.pubkey) {\n names[identity.nip05Username] = identity.pubkey;\n }\n }\n\n return { names };\n }\n\n /**\n * Check if a NIP-05 username is available\n */\n async isNip05Available(username: string): Promise<boolean> {\n const existing = await this.findByNip05(username);\n return existing === null;\n }\n\n /**\n * Update NIP-05 username for an identity\n */\n async updateNip05Username(\n identity: NostrIdentity,\n newUsername: string,\n ): Promise<NostrIdentity> {\n const normalizedUsername = newUsername.toLowerCase();\n\n // Check if username is available\n const existing = await this.findByNip05(normalizedUsername);\n if (existing && existing.id !== identity.id) {\n throw new Error(`NIP-05 username \"${newUsername}\" is already taken`);\n }\n\n identity.nip05Username = normalizedUsername;\n await identity.save();\n\n return identity;\n }\n}\n"],"mappings":"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"}
|
|
@@ -42,7 +42,7 @@ var OidcIdentity = class extends SmrtObject {
|
|
|
42
42
|
* Find identity by issuer and subject
|
|
43
43
|
*/
|
|
44
44
|
static async findBySubject(issuer, subject, options = {}) {
|
|
45
|
-
const { OidcIdentityCollection } = await import("./OidcIdentityCollection-
|
|
45
|
+
const { OidcIdentityCollection } = await import("./OidcIdentityCollection-s4mp3n62.js").then((n) => n.r);
|
|
46
46
|
return await (await OidcIdentityCollection.create(options)).findBySubject(issuer, subject);
|
|
47
47
|
}
|
|
48
48
|
/** Build the collision-free natural key for one OIDC issuer subject. */
|
|
@@ -65,7 +65,7 @@ var OidcIdentity = class extends SmrtObject {
|
|
|
65
65
|
static async findOrCreate(profile, oidcData, options = {}) {
|
|
66
66
|
const profileId = profile.id;
|
|
67
67
|
if (typeof profileId !== "string" || !profileId) throw new Error("OidcIdentity.findOrCreate() requires a saved Profile.");
|
|
68
|
-
const { reuseExistingOidcIdentityForProfile } = await import("./resolveIdentity-
|
|
68
|
+
const { reuseExistingOidcIdentityForProfile } = await import("./resolveIdentity-CR5p_g7K.js").then((n) => n.i);
|
|
69
69
|
const profileOptions = profile.options ?? {};
|
|
70
70
|
return (await reuseExistingOidcIdentityForProfile(profileId, {
|
|
71
71
|
email: oidcData.email,
|
|
@@ -124,4 +124,4 @@ OidcIdentity = __decorateClass([smrt({
|
|
|
124
124
|
//#endregion
|
|
125
125
|
export { OidcIdentity as t };
|
|
126
126
|
|
|
127
|
-
//# sourceMappingURL=OidcIdentity-
|
|
127
|
+
//# sourceMappingURL=OidcIdentity-MVVO3MfG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OidcIdentity-
|
|
1
|
+
{"version":3,"file":"OidcIdentity-MVVO3MfG.js","names":[],"sources":["../../src/models/OidcIdentity.ts"],"sourcesContent":["/**\n * OidcIdentity - Links OIDC provider identities to Profile\n *\n * Stores the mapping between external OIDC providers (Keycloak, Google, GitHub)\n * and internal Profile records. Multiple identities can link to a single profile.\n */\n\nimport {\n field,\n foreignKey,\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport type { Profile } from './Profile';\n\nexport interface OidcIdentityOptions extends SmrtObjectOptions {\n profileId?: string;\n provider?: string;\n issuer?: string;\n subject?: string;\n email?: string;\n lastUsedAt?: Date | null;\n}\n\n@smrt({\n tableName: 'oidc_identities',\n // Identity linking is an authentication authority change. Generated routes\n // authenticate callers but do not authorize Profile ownership, so mutations\n // must stay behind the trusted provisioning APIs below.\n api: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n})\nexport class OidcIdentity extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-profiles\";\n /**\n * Link to the Profile (Person, Organization, Bot)\n */\n @foreignKey('Profile', { required: true })\n profileId?: string;\n\n /**\n * Provider name (e.g., 'keycloak', 'google', 'github')\n */\n @field({ type: 'text' })\n provider: string = '';\n\n /**\n * OIDC issuer URL (e.g., https://keycloak.example.com/realms/bmp)\n */\n @field({ type: 'text', indexed: true })\n issuer: string = '';\n\n /**\n * OIDC subject claim - unique identifier from the provider\n */\n @field({ type: 'text', indexed: true })\n subject: string = '';\n\n /**\n * Stable issuer+subject key used as the database race arbiter.\n *\n * Nullable for legacy rows; every newly linked or reused identity backfills\n * it. A separate unique constraint makes concurrent first login fail with a\n * retryable conflict instead of creating two identities.\n */\n @field({ type: 'text', nullable: true, unique: true, readonly: true })\n identityKey: string | null = null;\n\n /**\n * Cached email from the IdP (for display/lookup)\n */\n @field({ type: 'text' })\n email: string = '';\n\n /**\n * Last time this identity was used for authentication\n */\n @field({ type: 'datetime', nullable: true })\n lastUsedAt: Date | null = null;\n\n constructor(options: OidcIdentityOptions = {}) {\n super(options);\n if (options.profileId) this.profileId = options.profileId;\n if (options.provider) this.provider = options.provider;\n if (options.issuer) this.issuer = options.issuer;\n if (options.subject) this.subject = options.subject;\n if (options.email) this.email = options.email;\n if (options.lastUsedAt !== undefined) this.lastUsedAt = options.lastUsedAt;\n }\n\n /**\n * Get the linked Profile\n */\n async getProfile(): Promise<Profile | null> {\n return (await this.getRelated('profileId')) as Profile | null;\n }\n\n /**\n * Find identity by issuer and subject\n */\n static async findBySubject(\n issuer: string,\n subject: string,\n options: SmrtObjectOptions = {},\n ): Promise<OidcIdentity | null> {\n const { OidcIdentityCollection } = await import(\n '../collections/OidcIdentityCollection'\n );\n const collection = await OidcIdentityCollection.create(options);\n return await collection.findBySubject(issuer, subject);\n }\n\n /** Build the collision-free natural key for one OIDC issuer subject. */\n static buildIdentityKey(issuer: string, subject: string): string {\n return JSON.stringify([issuer, subject]);\n }\n\n /** Keep the durable key derived from its natural-key source fields. */\n override async save(): Promise<this> {\n this.identityKey =\n this.issuer.trim() && this.subject.trim()\n ? OidcIdentity.buildIdentityKey(this.issuer, this.subject)\n : null;\n return super.save();\n }\n\n /**\n * Reuse an existing exact identity for its unchanged Profile.\n *\n * @deprecated Authentication links must be created through transactional\n * provisioning. This compatibility method only refreshes a unique mapping\n * that already belongs to the supplied Profile, including legacy Profile\n * types, and deliberately refuses to create or rebind authority.\n */\n static async findOrCreate(\n profile: Profile,\n oidcData: {\n provider: string;\n issuer: string;\n subject: string;\n email?: string;\n },\n options: SmrtObjectOptions = {},\n ): Promise<OidcIdentity> {\n const profileId = profile.id;\n if (typeof profileId !== 'string' || !profileId) {\n throw new Error('OidcIdentity.findOrCreate() requires a saved Profile.');\n }\n const { reuseExistingOidcIdentityForProfile } = await import(\n '../auth/resolveIdentity'\n );\n const profileOptions = profile.options ?? {};\n const result = await reuseExistingOidcIdentityForProfile(\n profileId,\n {\n email: oidcData.email,\n iss: oidcData.issuer,\n sub: oidcData.subject,\n },\n oidcData.provider,\n {\n ...profileOptions,\n ...options,\n db: options.db ?? profileOptions.db,\n },\n );\n return result.oidcIdentity;\n }\n\n /**\n * Record usage of this identity\n */\n async recordUsage(): Promise<void> {\n // Trusted provisioning or another authentication may refresh this exact\n // identity through a second instance. Rehydrate before each bounded attempt\n // so this usage-only write preserves those changes while retaining CAS.\n for (let attempt = 0; attempt < 4; attempt += 1) {\n await this.loadFromId();\n this.lastUsedAt = new Date();\n try {\n await this.save();\n return;\n } catch (error) {\n if (\n attempt === 3 ||\n !(\n error instanceof Error &&\n 'code' in error &&\n error.code === 'RUNTIME_REVISION_CONFLICT'\n )\n ) {\n throw error;\n }\n }\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/chunks/{OidcIdentityCollection-ClOyaHeF.js → OidcIdentityCollection-s4mp3n62.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { y as __exportAll } from "./NostrIdentity-
|
|
2
|
-
import { t as OidcIdentity } from "./OidcIdentity-
|
|
1
|
+
import { y as __exportAll } from "./NostrIdentity-RJaATTCt.js";
|
|
2
|
+
import { t as OidcIdentity } from "./OidcIdentity-MVVO3MfG.js";
|
|
3
3
|
import { SmrtCollection } from "@happyvertical/smrt-core";
|
|
4
4
|
//#region src/collections/OidcIdentityCollection.ts
|
|
5
5
|
var OidcIdentityCollection_exports = /* @__PURE__ */ __exportAll({
|
|
@@ -79,4 +79,4 @@ var OidcIdentityCollection = class extends SmrtCollection {
|
|
|
79
79
|
//#endregion
|
|
80
80
|
export { OidcIdentityCollection as n, OidcIdentityCollection_exports as r, AmbiguousOidcIdentityError as t };
|
|
81
81
|
|
|
82
|
-
//# sourceMappingURL=OidcIdentityCollection-
|
|
82
|
+
//# sourceMappingURL=OidcIdentityCollection-s4mp3n62.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OidcIdentityCollection-
|
|
1
|
+
{"version":3,"file":"OidcIdentityCollection-s4mp3n62.js","names":[],"sources":["../../src/collections/OidcIdentityCollection.ts"],"sourcesContent":["/**\n * OidcIdentityCollection - Collection for managing OIDC identity records\n */\n\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { OidcIdentity } from '../models/OidcIdentity';\nimport type { Profile } from '../models/Profile';\n\n/** More than one legacy row maps the same opaque OIDC issuer and subject. */\nexport class AmbiguousOidcIdentityError extends Error {\n constructor(\n readonly issuer: string,\n readonly subject: string,\n ) {\n super('Multiple OIDC identities match the same issuer and subject.');\n this.name = 'AmbiguousOidcIdentityError';\n }\n}\n\nexport class OidcIdentityCollection extends SmrtCollection<OidcIdentity> {\n static readonly _itemClass = OidcIdentity;\n\n /**\n * Find identities for a profile\n */\n async findByProfile(profileId: string): Promise<OidcIdentity[]> {\n return await this.list({\n where: { profileId },\n });\n }\n\n /**\n * Find identity by issuer and subject\n */\n async findBySubject(\n issuer: string,\n subject: string,\n ): Promise<OidcIdentity | null> {\n const result = await this.db.query(\n `SELECT CAST(id AS VARCHAR) AS id,\n CAST(profile_id AS VARCHAR) AS profile_id\n FROM oidc_identities\n WHERE issuer = ? AND subject = ?\n LIMIT 2`,\n issuer,\n subject,\n );\n if (result.rows.length > 1) {\n throw new AmbiguousOidcIdentityError(issuer, subject);\n }\n const row = result.rows[0];\n const id = row?.id;\n const profileId = row?.profile_id;\n if (typeof id !== 'string' || typeof profileId !== 'string') return null;\n const identity = await this.get({ id });\n if (!identity) return null;\n // Preserve portable identities at this authentication boundary when\n // native DuckDB exposes UUID results through internal objects.\n identity.id = id;\n identity.profileId = profileId;\n return identity;\n }\n\n /**\n * Find identities by provider\n */\n async findByProvider(provider: string): Promise<OidcIdentity[]> {\n return await this.list({\n where: { provider },\n });\n }\n\n /**\n * Reuse an existing exact OIDC identity for its unchanged Profile.\n *\n * @deprecated New authentication links require the owner-aware,\n * transactional provisioning APIs. This compatibility helper may refresh a\n * legacy Profile type, but refuses to create or rebind authority.\n */\n async linkToProfile(\n profile: Profile,\n oidcData: {\n provider: string;\n issuer: string;\n subject: string;\n email?: string;\n },\n ): Promise<OidcIdentity> {\n return OidcIdentity.findOrCreate(profile, oidcData, this.options);\n }\n\n /**\n * Unlink an OIDC identity from a profile\n */\n async unlinkFromProfile(\n profileId: string,\n issuer: string,\n subject: string,\n ): Promise<boolean> {\n const identity = await this.findOne({\n where: { profileId, issuer, subject },\n });\n\n if (identity) {\n await identity.delete();\n return true;\n }\n return false;\n }\n}\n"],"mappings":";;;;;;;;AASO,IAAM,6BAAN,cAAyC,MAAM;CACpD,YACW,QACA,SACT;EACA,MAAM,6DAA6D;EAH1D,KAAA,SAAA;EACA,KAAA,UAAA;EAGT,KAAK,OAAO;CACd;CALW;CACA;AAKb;AAEO,IAAM,yBAAN,cAAqC,eAA6B;CACvE,OAAgB,aAAa;;;;CAK7B,MAAM,cAAc,WAA4C;EAC9D,OAAO,MAAM,KAAK,KAAK,EACrB,OAAO,EAAE,UAAU,EACrB,CAAC;CACH;;;;CAKA,MAAM,cACJ,QACA,SAC8B;EAC9B,MAAM,SAAS,MAAM,KAAK,GAAG,MAC3B;;;;kBAKA,QACA,OACF;EACA,IAAI,OAAO,KAAK,SAAS,GACvB,MAAM,IAAI,2BAA2B,QAAQ,OAAO;EAEtD,MAAM,MAAM,OAAO,KAAK;EACxB,MAAM,KAAK,KAAK;EAChB,MAAM,YAAY,KAAK;EACvB,IAAI,OAAO,OAAO,YAAY,OAAO,cAAc,UAAU,OAAO;EACpE,MAAM,WAAW,MAAM,KAAK,IAAI,EAAE,GAAG,CAAC;EACtC,IAAI,CAAC,UAAU,OAAO;EAGtB,SAAS,KAAK;EACd,SAAS,YAAY;EACrB,OAAO;CACT;;;;CAKA,MAAM,eAAe,UAA2C;EAC9D,OAAO,MAAM,KAAK,KAAK,EACrB,OAAO,EAAE,SAAS,EACpB,CAAC;CACH;;;;;;;;CASA,MAAM,cACJ,SACA,UAMuB;EACvB,OAAO,aAAa,aAAa,SAAS,UAAU,KAAK,OAAO;CAClE;;;;CAKA,MAAM,kBACJ,WACA,QACA,SACkB;EAClB,MAAM,WAAW,MAAM,KAAK,QAAQ,EAClC,OAAO;GAAE;GAAW;GAAQ;EAAQ,EACtC,CAAC;EAED,IAAI,UAAU;GACZ,MAAM,SAAS,OAAO;GACtB,OAAO;EACT;EACA,OAAO;CACT;AACF"}
|
package/dist/chunks/{ProfileAssetCollection-CRMcjLJ-.js → ProfileAssetCollection-BuVAdOiv.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { y as __exportAll } from "./NostrIdentity-
|
|
1
|
+
import { y as __exportAll } from "./NostrIdentity-RJaATTCt.js";
|
|
2
2
|
import { SmrtJunction, SmrtObject, crossPackageRef, field, foreignKey, smrt } from "@happyvertical/smrt-core";
|
|
3
3
|
import { TenantScoped, tenantId } from "@happyvertical/smrt-tenancy";
|
|
4
4
|
import { addOwnedAssetFromCollection, getOwnedAssetsFromCollection, removeOwnedAssetFromCollection } from "@happyvertical/smrt-assets";
|
|
@@ -80,7 +80,7 @@ var ProfileAssetCollection = class extends SmrtJunction {
|
|
|
80
80
|
profileCollectionPromise = null;
|
|
81
81
|
async getProfileCollection() {
|
|
82
82
|
if (!this.profileCollectionPromise) {
|
|
83
|
-
const { ProfileCollection } = await import("./ProfileCollection-
|
|
83
|
+
const { ProfileCollection } = await import("./ProfileCollection-CMS9dFc0.js").then((n) => n.r);
|
|
84
84
|
this.profileCollectionPromise = ProfileCollection.create({ db: this.db });
|
|
85
85
|
}
|
|
86
86
|
return this.profileCollectionPromise;
|
|
@@ -105,4 +105,4 @@ ProfileAssetCollection = __decorateClass([smrt({
|
|
|
105
105
|
//#endregion
|
|
106
106
|
export { ProfileAssetCollection_exports as n, ProfileAsset as r, ProfileAssetCollection as t };
|
|
107
107
|
|
|
108
|
-
//# sourceMappingURL=ProfileAssetCollection-
|
|
108
|
+
//# sourceMappingURL=ProfileAssetCollection-BuVAdOiv.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProfileAssetCollection-
|
|
1
|
+
{"version":3,"file":"ProfileAssetCollection-BuVAdOiv.js","names":[],"sources":["../../src/models/ProfileAsset.ts","../../src/collections/ProfileAssetCollection.ts"],"sourcesContent":["import type { SmrtObjectOptions } from '@happyvertical/smrt-core';\nimport {\n crossPackageRef,\n field,\n foreignKey,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\n\nexport interface ProfileAssetOptions extends SmrtObjectOptions {\n profileId?: string;\n assetId?: string;\n relationship?: string;\n sortOrder?: number;\n tenantId?: string | null;\n}\n\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableName: 'profile_assets',\n conflictColumns: ['profile_id', 'asset_id', 'relationship'],\n api: false,\n mcp: false,\n cli: false,\n})\nexport class ProfileAsset extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-profiles\";\n @tenantId({ nullable: true })\n tenantId: string | null = null;\n\n @foreignKey('Profile', { required: true, onDelete: 'CASCADE' })\n profileId = '';\n\n @crossPackageRef('@happyvertical/smrt-assets:Asset', {\n required: true,\n onDelete: 'CASCADE',\n })\n assetId = '';\n\n @field({ required: true })\n relationship = 'attachment';\n\n @field()\n sortOrder = 0;\n\n constructor(options: ProfileAssetOptions = {}) {\n super(options);\n if (options.profileId) this.profileId = options.profileId;\n if (options.assetId) this.assetId = options.assetId;\n if (options.relationship) this.relationship = options.relationship;\n if (options.sortOrder !== undefined) this.sortOrder = options.sortOrder;\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n }\n}\n","import type { Asset } from '@happyvertical/smrt-assets';\nimport {\n addOwnedAssetFromCollection,\n getOwnedAssetsFromCollection,\n removeOwnedAssetFromCollection,\n} from '@happyvertical/smrt-assets';\nimport type { SmrtCollectionOptions } from '@happyvertical/smrt-core';\nimport { SmrtJunction, smrt } from '@happyvertical/smrt-core';\nimport { ProfileAsset } from '../models/ProfileAsset';\nimport type { ProfileCollection } from './ProfileCollection';\n\nexport interface ProfileAssetCollectionOptions extends SmrtCollectionOptions {}\n\n@smrt({\n api: false,\n mcp: false,\n cli: false,\n})\nexport class ProfileAssetCollection extends SmrtJunction<ProfileAsset> { static __smrtPackage__ = \"@happyvertical/smrt-profiles\";\n static readonly _itemClass = ProfileAsset;\n protected leftField = 'profileId';\n protected rightField = 'assetId';\n\n private profileCollectionPromise: Promise<ProfileCollection> | null = null;\n\n private async getProfileCollection(): Promise<ProfileCollection> {\n if (!this.profileCollectionPromise) {\n const { ProfileCollection } = await import('./ProfileCollection');\n this.profileCollectionPromise = ProfileCollection.create({ db: this.db });\n }\n\n return this.profileCollectionPromise;\n }\n\n async getAssets(profileId: string, relationship?: string): Promise<Asset[]> {\n return getOwnedAssetsFromCollection(\n await this.getProfileCollection(),\n profileId,\n relationship,\n );\n }\n\n async addAsset(\n profileId: string,\n asset: Asset,\n relationship = 'attachment',\n sortOrder = 0,\n ): Promise<void> {\n await addOwnedAssetFromCollection(\n await this.getProfileCollection(),\n 'Profile',\n profileId,\n asset,\n relationship,\n sortOrder,\n );\n }\n\n async removeAsset(\n profileId: string,\n assetId: string,\n relationship?: string,\n ): Promise<void> {\n await removeOwnedAssetFromCollection(\n await this.getProfileCollection(),\n 'Profile',\n profileId,\n assetId,\n relationship,\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA0BO,IAAM,eAAN,cAA2B,WAAW;CAE3C,WAA0B;CAG1B,YAAY;CAMZ,UAAU;CAGV,eAAe;CAGf,YAAY;CAEZ,YAAY,UAA+B,CAAC,GAAG;EAC7C,MAAM,OAAO;EACb,IAAI,QAAQ,WAAW,KAAK,YAAY,QAAQ;EAChD,IAAI,QAAQ,SAAS,KAAK,UAAU,QAAQ;EAC5C,IAAI,QAAQ,cAAc,KAAK,eAAe,QAAQ;EACtD,IAAI,QAAQ,cAAc,KAAA,GAAW,KAAK,YAAY,QAAQ;EAC9D,IAAI,QAAQ,aAAa,KAAA,GAAW,KAAK,WAAW,QAAQ;CAC9D;AACF;AA3B+C,gBAAlC,cAAyC,mBAAkB,8BAAA;AAEtE,kBAAA,CADC,SAAS,EAAE,UAAU,KAAK,CAAC,CAAA,GADjB,aAEX,WAAA,YAAA,CAAA;AAGA,kBAAA,CADC,WAAW,WAAW;CAAE,UAAU;CAAM,UAAU;AAAU,CAAC,CAAA,GAJnD,aAKX,WAAA,aAAA,CAAA;AAMA,kBAAA,CAJC,gBAAgB,oCAAoC;CACnD,UAAU;CACV,UAAU;AACZ,CAAC,CAAA,GAVU,aAWX,WAAA,WAAA,CAAA;AAGA,kBAAA,CADC,MAAM,EAAE,UAAU,KAAK,CAAC,CAAA,GAbd,aAcX,WAAA,gBAAA,CAAA;AAGA,kBAAA,CADC,MAAM,CAAA,GAhBI,aAiBX,WAAA,aAAA,CAAA;AAjBW,eAAN,kBAAA,CARN,aAAa,EAAE,MAAM,WAAW,CAAC,GACjC,KAAK;CACJ,WAAW;CACX,iBAAiB;EAAC;EAAc;EAAY;CAAc;CAC1D,KAAK;CACL,KAAK;CACL,KAAK;AACP,CAAC,CAAA,GACY,YAAA;;;;;;;;;;;;;;;;;;;ACRN,IAAM,yBAAN,cAAqC,aAA2B;CAE3D,YAAY;CACZ,aAAa;CAEf,2BAA8D;CAEtE,MAAc,uBAAmD;EAC/D,IAAI,CAAC,KAAK,0BAA0B;GAClC,MAAM,EAAE,sBAAsB,MAAM,OAAO,kCAAA,CAAA,MAAA,MAAA,EAAA,CAAA;GAC3C,KAAK,2BAA2B,kBAAkB,OAAO,EAAE,IAAI,KAAK,GAAG,CAAC;EAC1E;EAEA,OAAO,KAAK;CACd;CAEA,MAAM,UAAU,WAAmB,cAAyC;EAC1E,OAAO,6BACL,MAAM,KAAK,qBAAqB,GAChC,WACA,YACF;CACF;CAEA,MAAM,SACJ,WACA,OACA,eAAe,cACf,YAAY,GACG;EACf,MAAM,4BACJ,MAAM,KAAK,qBAAqB,GAChC,WACA,WACA,OACA,cACA,SACF;CACF;CAEA,MAAM,YACJ,WACA,SACA,cACe;EACf,MAAM,+BACJ,MAAM,KAAK,qBAAqB,GAChC,WACA,WACA,SACA,YACF;CACF;AACF;AArDyE,cAA5D,wBAAmE,mBAAkB,8BAAA;AAChG,cADW,wBACK,cAAa,YAAA;AADlB,yBAAN,gBAAA,CALN,KAAK;CACJ,KAAK;CACL,KAAK;CACL,KAAK;AACP,CAAC,CAAA,GACY,sBAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { y as __exportAll } from "./NostrIdentity-
|
|
1
|
+
import { y as __exportAll } from "./NostrIdentity-RJaATTCt.js";
|
|
2
2
|
import { RuntimeError, SmrtCollection, SmrtObject, ValidationError, field, foreignKey, isAbortedTransactionError, oneToMany, smrt } from "@happyvertical/smrt-core";
|
|
3
3
|
import { definePrompt, resolvePrompt } from "@happyvertical/smrt-prompts";
|
|
4
4
|
import { TenantScoped, getTenantId, queryGlobal, queryWithGlobals, tenantId, withSystemContext } from "@happyvertical/smrt-tenancy";
|
|
@@ -455,7 +455,7 @@ var Profile = class extends SmrtObject {
|
|
|
455
455
|
async getTypeSlug() {
|
|
456
456
|
const tenantId2 = this.tenantId || getTenantId();
|
|
457
457
|
if (this.typeId && tenantId2) {
|
|
458
|
-
const { ProfileTypeCollection } = await import("./ProfileTypeCollection-
|
|
458
|
+
const { ProfileTypeCollection } = await import("./ProfileTypeCollection-B7m698Bl.js").then((n) => n.n);
|
|
459
459
|
return (await (await ProfileTypeCollection.create(this.options)).getAvailableById(this.typeId, tenantId2))?.slug ?? "";
|
|
460
460
|
}
|
|
461
461
|
return (await this.loadRelated("typeId"))?.slug || "";
|
|
@@ -478,8 +478,8 @@ var Profile = class extends SmrtObject {
|
|
|
478
478
|
* @param value - The value to set
|
|
479
479
|
*/
|
|
480
480
|
async addMetadata(metafieldSlug, value) {
|
|
481
|
-
const { ProfileMetafieldCollection } = await import("./ProfileMetafieldCollection-
|
|
482
|
-
const { ProfileMetadataCollection } = await import("./ProfileMetadataCollection-
|
|
481
|
+
const { ProfileMetafieldCollection } = await import("./ProfileMetafieldCollection-19ae6Lpf.js").then((n) => n.n);
|
|
482
|
+
const { ProfileMetadataCollection } = await import("./ProfileMetadataCollection-CAgJyjze.js").then((n) => n.n);
|
|
483
483
|
const metafield = await this.resolveMetafield(await ProfileMetafieldCollection.create(this.options), metafieldSlug);
|
|
484
484
|
if (!metafield) throw new Error(`Metafield '${metafieldSlug}' not found`);
|
|
485
485
|
await metafield.validateValue(value);
|
|
@@ -512,7 +512,7 @@ var Profile = class extends SmrtObject {
|
|
|
512
512
|
* @returns Object with metafield slugs as keys
|
|
513
513
|
*/
|
|
514
514
|
async getMetadata() {
|
|
515
|
-
const { ProfileMetadataCollection } = await import("./ProfileMetadataCollection-
|
|
515
|
+
const { ProfileMetadataCollection } = await import("./ProfileMetadataCollection-CAgJyjze.js").then((n) => n.n);
|
|
516
516
|
return await (await ProfileMetadataCollection.create(this.options)).getMetadataObject(this.id);
|
|
517
517
|
}
|
|
518
518
|
/**
|
|
@@ -529,8 +529,8 @@ var Profile = class extends SmrtObject {
|
|
|
529
529
|
* @param metafieldSlug - The slug of the metafield to remove
|
|
530
530
|
*/
|
|
531
531
|
async removeMetadata(metafieldSlug) {
|
|
532
|
-
const { ProfileMetafieldCollection } = await import("./ProfileMetafieldCollection-
|
|
533
|
-
const { ProfileMetadataCollection } = await import("./ProfileMetadataCollection-
|
|
532
|
+
const { ProfileMetafieldCollection } = await import("./ProfileMetafieldCollection-19ae6Lpf.js").then((n) => n.n);
|
|
533
|
+
const { ProfileMetadataCollection } = await import("./ProfileMetadataCollection-CAgJyjze.js").then((n) => n.n);
|
|
534
534
|
const metafield = await this.resolveMetafield(await ProfileMetafieldCollection.create(this.options), metafieldSlug);
|
|
535
535
|
if (!metafield) throw new Error(`Metafield '${metafieldSlug}' not found`);
|
|
536
536
|
const existing = await (await ProfileMetadataCollection.create(this.options)).list({
|
|
@@ -555,7 +555,7 @@ var Profile = class extends SmrtObject {
|
|
|
555
555
|
return candidates.find((candidate) => ownerTenantId && candidate.tenantId === ownerTenantId) ?? candidates.find((candidate) => !candidate.tenantId) ?? null;
|
|
556
556
|
}
|
|
557
557
|
async getProfileLinkCollection() {
|
|
558
|
-
const { ProfileLinkCollection } = await import("./ProfileLinkCollection-
|
|
558
|
+
const { ProfileLinkCollection } = await import("./ProfileLinkCollection-ChK9iEBp.js").then((n) => n.r);
|
|
559
559
|
return ProfileLinkCollection.create({ db: this.db });
|
|
560
560
|
}
|
|
561
561
|
/** This profile's web links in display order. */
|
|
@@ -572,7 +572,7 @@ var Profile = class extends SmrtObject {
|
|
|
572
572
|
return (await this.getProfileLinkCollection()).replaceForProfile(this.id, links);
|
|
573
573
|
}
|
|
574
574
|
async getProfileAssetCollection() {
|
|
575
|
-
const { ProfileAssetCollection } = await import("./ProfileAssetCollection-
|
|
575
|
+
const { ProfileAssetCollection } = await import("./ProfileAssetCollection-BuVAdOiv.js").then((n) => n.n);
|
|
576
576
|
return ProfileAssetCollection.create({ db: this.db });
|
|
577
577
|
}
|
|
578
578
|
async getAssets(relationship) {
|
|
@@ -603,9 +603,9 @@ var Profile = class extends SmrtObject {
|
|
|
603
603
|
* @param contextProfile - Optional context profile for tertiary relationships
|
|
604
604
|
*/
|
|
605
605
|
async addRelationship(toProfile, relationshipSlug, contextProfile) {
|
|
606
|
-
const { ProfileRelationshipTypeCollection } = await import("./ProfileRelationshipTypeCollection-
|
|
607
|
-
const { ProfileRelationshipCollection } = await import("./ProfileRelationshipCollection-
|
|
608
|
-
const { ProfileRelationshipType } = await import("./ProfileRelationshipType-
|
|
606
|
+
const { ProfileRelationshipTypeCollection } = await import("./ProfileRelationshipTypeCollection-BRBpX00F.js").then((n) => n.n);
|
|
607
|
+
const { ProfileRelationshipCollection } = await import("./ProfileRelationshipCollection-BFSlTQ7J.js").then((n) => n.n);
|
|
608
|
+
const { ProfileRelationshipType } = await import("./ProfileRelationshipType-Cevy-vaF.js").then((n) => n.n);
|
|
609
609
|
const relationshipType = await (await ProfileRelationshipTypeCollection.create(this.options)).getBySlug(relationshipSlug);
|
|
610
610
|
if (!relationshipType) throw new Error(`Relationship type '${relationshipSlug}' not found`);
|
|
611
611
|
const relationshipCollection = await ProfileRelationshipCollection.create(this.options);
|
|
@@ -629,8 +629,8 @@ var Profile = class extends SmrtObject {
|
|
|
629
629
|
* @returns Array of ProfileRelationship instances
|
|
630
630
|
*/
|
|
631
631
|
async getRelationships(options) {
|
|
632
|
-
const { ProfileRelationshipCollection } = await import("./ProfileRelationshipCollection-
|
|
633
|
-
const { ProfileRelationshipTypeCollection } = await import("./ProfileRelationshipTypeCollection-
|
|
632
|
+
const { ProfileRelationshipCollection } = await import("./ProfileRelationshipCollection-BFSlTQ7J.js").then((n) => n.n);
|
|
633
|
+
const { ProfileRelationshipTypeCollection } = await import("./ProfileRelationshipTypeCollection-BRBpX00F.js").then((n) => n.n);
|
|
634
634
|
const relationshipCollection = await ProfileRelationshipCollection.create(this.options);
|
|
635
635
|
const direction = options?.direction || "all";
|
|
636
636
|
let typeId;
|
|
@@ -673,8 +673,8 @@ var Profile = class extends SmrtObject {
|
|
|
673
673
|
* @param relationshipSlug - The type of relationship to remove
|
|
674
674
|
*/
|
|
675
675
|
async removeRelationship(toProfile, relationshipSlug) {
|
|
676
|
-
const { ProfileRelationshipTypeCollection } = await import("./ProfileRelationshipTypeCollection-
|
|
677
|
-
const { ProfileRelationshipCollection } = await import("./ProfileRelationshipCollection-
|
|
676
|
+
const { ProfileRelationshipTypeCollection } = await import("./ProfileRelationshipTypeCollection-BRBpX00F.js").then((n) => n.n);
|
|
677
|
+
const { ProfileRelationshipCollection } = await import("./ProfileRelationshipCollection-BFSlTQ7J.js").then((n) => n.n);
|
|
678
678
|
const relationshipType = await (await ProfileRelationshipTypeCollection.create(this.options)).getBySlug(relationshipSlug);
|
|
679
679
|
if (!relationshipType) throw new Error(`Relationship type '${relationshipSlug}' not found`);
|
|
680
680
|
const relationshipCollection = await ProfileRelationshipCollection.create(this.options);
|
|
@@ -767,7 +767,7 @@ var Profile = class extends SmrtObject {
|
|
|
767
767
|
* @returns Array of API keys
|
|
768
768
|
*/
|
|
769
769
|
async getApiKeys() {
|
|
770
|
-
const { ApiKeyCollection } = await import("./ApiKeyCollection-
|
|
770
|
+
const { ApiKeyCollection } = await import("./ApiKeyCollection-BrJT9vo_.js").then((n) => n.n);
|
|
771
771
|
return await (await ApiKeyCollection.create(this.options)).findByProfile(this.id);
|
|
772
772
|
}
|
|
773
773
|
/**
|
|
@@ -776,7 +776,7 @@ var Profile = class extends SmrtObject {
|
|
|
776
776
|
* @returns Array of active API keys
|
|
777
777
|
*/
|
|
778
778
|
async getActiveApiKeys() {
|
|
779
|
-
const { ApiKeyCollection } = await import("./ApiKeyCollection-
|
|
779
|
+
const { ApiKeyCollection } = await import("./ApiKeyCollection-BrJT9vo_.js").then((n) => n.n);
|
|
780
780
|
return await (await ApiKeyCollection.create(this.options)).findActiveByProfile(this.id);
|
|
781
781
|
}
|
|
782
782
|
/**
|
|
@@ -786,7 +786,7 @@ var Profile = class extends SmrtObject {
|
|
|
786
786
|
* @returns The generated key (plaintext) and ApiKey record
|
|
787
787
|
*/
|
|
788
788
|
async generateApiKey(options) {
|
|
789
|
-
const { ApiKey } = await import("./ApiKey-
|
|
789
|
+
const { ApiKey } = await import("./ApiKey-9YuYcpWy.js").then((n) => n.n);
|
|
790
790
|
return await ApiKey.generate(this, {
|
|
791
791
|
...options,
|
|
792
792
|
db: this.options?.db
|
|
@@ -798,7 +798,7 @@ var Profile = class extends SmrtObject {
|
|
|
798
798
|
* @returns Array of OIDC identity records
|
|
799
799
|
*/
|
|
800
800
|
async getOidcIdentities() {
|
|
801
|
-
const { OidcIdentityCollection } = await import("./OidcIdentityCollection-
|
|
801
|
+
const { OidcIdentityCollection } = await import("./OidcIdentityCollection-s4mp3n62.js").then((n) => n.r);
|
|
802
802
|
return await (await OidcIdentityCollection.create(this.options)).findByProfile(this.id);
|
|
803
803
|
}
|
|
804
804
|
/**
|
|
@@ -811,7 +811,7 @@ var Profile = class extends SmrtObject {
|
|
|
811
811
|
* type, but refuses to create or rebind authority.
|
|
812
812
|
*/
|
|
813
813
|
async linkOidcIdentity(oidcData) {
|
|
814
|
-
const { OidcIdentityCollection } = await import("./OidcIdentityCollection-
|
|
814
|
+
const { OidcIdentityCollection } = await import("./OidcIdentityCollection-s4mp3n62.js").then((n) => n.r);
|
|
815
815
|
return await (await OidcIdentityCollection.create(this.options)).linkToProfile(this, oidcData);
|
|
816
816
|
}
|
|
817
817
|
/**
|
|
@@ -820,7 +820,7 @@ var Profile = class extends SmrtObject {
|
|
|
820
820
|
* @returns Array of Nostr identity records
|
|
821
821
|
*/
|
|
822
822
|
async getNostrIdentities() {
|
|
823
|
-
const { NostrIdentityCollection } = await import("./NostrIdentityCollection-
|
|
823
|
+
const { NostrIdentityCollection } = await import("./NostrIdentityCollection-BPNgPOBE.js").then((n) => n.n);
|
|
824
824
|
return await (await NostrIdentityCollection.create(this.options)).findByProfile(this.id);
|
|
825
825
|
}
|
|
826
826
|
/**
|
|
@@ -830,7 +830,7 @@ var Profile = class extends SmrtObject {
|
|
|
830
830
|
* @returns The linked Nostr identity record
|
|
831
831
|
*/
|
|
832
832
|
async linkNostrIdentity(nostrData) {
|
|
833
|
-
const { NostrIdentityCollection } = await import("./NostrIdentityCollection-
|
|
833
|
+
const { NostrIdentityCollection } = await import("./NostrIdentityCollection-BPNgPOBE.js").then((n) => n.n);
|
|
834
834
|
return await (await NostrIdentityCollection.create(this.options)).linkToProfile(this, nostrData);
|
|
835
835
|
}
|
|
836
836
|
/**
|
|
@@ -840,7 +840,7 @@ var Profile = class extends SmrtObject {
|
|
|
840
840
|
* @returns Array of audit log entries
|
|
841
841
|
*/
|
|
842
842
|
async getAuditLogs(limit = 50) {
|
|
843
|
-
const { AuditLogCollection } = await import("./AuditLogCollection-
|
|
843
|
+
const { AuditLogCollection } = await import("./AuditLogCollection-BBbvr8Qc.js").then((n) => n.n);
|
|
844
844
|
return await (await AuditLogCollection.create(this.options)).getRecentActivity(this.id, limit);
|
|
845
845
|
}
|
|
846
846
|
/**
|
|
@@ -850,7 +850,7 @@ var Profile = class extends SmrtObject {
|
|
|
850
850
|
* @returns The created audit log entry
|
|
851
851
|
*/
|
|
852
852
|
async recordAction(options) {
|
|
853
|
-
const { AuditLogCollection } = await import("./AuditLogCollection-
|
|
853
|
+
const { AuditLogCollection } = await import("./AuditLogCollection-BBbvr8Qc.js").then((n) => n.n);
|
|
854
854
|
return await (await AuditLogCollection.create(this.options)).record({
|
|
855
855
|
profile: this,
|
|
856
856
|
...options
|
|
@@ -1220,4 +1220,4 @@ function readRequiredString(row, key) {
|
|
|
1220
1220
|
//#endregion
|
|
1221
1221
|
export { smrtProfilesGenerateBioPrompt as _, Profile as a, backfillProfileEmailKeys as c, isOidcProvisioningRaceConflict as d, saveOidcRaceArbiter as f, promptMessageOptions as g, ProfileType_exports as h, OidcProfileEmailReservationCollection as i, coordinateOidcProvisioning as l, ProfileType as m, ProfileCollection as n, OidcProfileEmailReservation as o, normalizeIdentityEmail as p, ProfileCollection_exports as r, PROFILE_EMAIL_KEY_BACKFILL_NAME as s, CanonicalPersonProfileError as t, isOidcAbortedTransactionError as u };
|
|
1222
1222
|
|
|
1223
|
-
//# sourceMappingURL=ProfileCollection-
|
|
1223
|
+
//# sourceMappingURL=ProfileCollection-CMS9dFc0.js.map
|