@openpronoun/core 0.0.0 → 0.0.1

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/index.cjs CHANGED
@@ -25,15 +25,15 @@ __export(index_exports, {
25
25
  PLACEHOLDER_STRINGS: () => PLACEHOLDER_STRINGS,
26
26
  PRONOUN_DICTIONARY: () => PRONOUN_DICTIONARY,
27
27
  SPECIAL_KEYWORDS: () => SPECIAL_KEYWORDS,
28
- SPECIAL_TYPES: () => import_zod.SPECIAL_TYPES,
29
- customEntrySchema: () => import_zod.customEntrySchema,
28
+ SPECIAL_TYPES: () => SPECIAL_TYPES,
29
+ customEntrySchema: () => customEntrySchema,
30
30
  filterByAudience: () => filterByAudience,
31
31
  format: () => format,
32
32
  parse: () => parse,
33
- pronounEntrySchema: () => import_zod.pronounEntrySchema,
34
- pronounPreferenceSchema: () => import_zod.pronounPreferenceSchema,
35
- pronounSetSchema: () => import_zod.pronounSetSchema,
36
- specialPreferenceSchema: () => import_zod.specialPreferenceSchema,
33
+ pronounEntrySchema: () => pronounEntrySchema,
34
+ pronounPreferenceSchema: () => pronounPreferenceSchema,
35
+ pronounSetSchema: () => pronounSetSchema,
36
+ specialPreferenceSchema: () => specialPreferenceSchema,
37
37
  validate: () => validate,
38
38
  validateOrThrow: () => validateOrThrow,
39
39
  validationErrors: () => validationErrors
@@ -490,18 +490,75 @@ function format(preference, options = {}) {
490
490
  return displayable.map((e) => formatSingleEntry(e, form)).filter(Boolean).join(", ");
491
491
  }
492
492
 
493
- // src/types.ts
494
- var import_zod = require("@openpronoun/zod");
493
+ // ../zod/dist/index.js
494
+ var import_zod = require("zod");
495
+ var nonEmpty = import_zod.z.string().min(1);
496
+ var iso6391 = import_zod.z.string().regex(/^[a-z]{2}$/, "expected an ISO 639-1 code");
497
+ var metadata = {
498
+ ranking: import_zod.z.number().int().optional(),
499
+ rnk: import_zod.z.number().int().optional(),
500
+ context: import_zod.z.string().optional(),
501
+ ctx: import_zod.z.string().optional(),
502
+ privacy: import_zod.z.number().int().min(0).optional(),
503
+ pvc: import_zod.z.number().int().min(0).optional(),
504
+ language: iso6391.optional(),
505
+ lang: iso6391.optional(),
506
+ exclude: import_zod.z.boolean().optional(),
507
+ exc: import_zod.z.boolean().optional()
508
+ };
509
+ var fullForms = {
510
+ subjective: nonEmpty,
511
+ objective: nonEmpty,
512
+ possessive_adjective: nonEmpty,
513
+ possessive_pronoun: nonEmpty,
514
+ reflexive: nonEmpty
515
+ };
516
+ var compactForms = {
517
+ sub: nonEmpty,
518
+ obj: nonEmpty,
519
+ p_a: nonEmpty,
520
+ p_pn: nonEmpty,
521
+ ref: nonEmpty
522
+ };
523
+ var fullPronounSetSchema = import_zod.z.strictObject({ ...fullForms, ...metadata });
524
+ var compactPronounSetSchema = import_zod.z.strictObject({ ...compactForms, ...metadata });
525
+ var pronounSetSchema = import_zod.z.union([fullPronounSetSchema, compactPronounSetSchema]);
526
+ var SPECIAL_TYPES = ["any", "none", "ask", "unspecified"];
527
+ var specialPreferenceSchema = import_zod.z.strictObject({
528
+ type: import_zod.z.enum(SPECIAL_TYPES),
529
+ ...metadata
530
+ });
531
+ var customEntrySchema = import_zod.z.strictObject({
532
+ type: import_zod.z.literal("custom"),
533
+ display: nonEmpty,
534
+ subjective: nonEmpty.optional(),
535
+ objective: nonEmpty.optional(),
536
+ possessive_adjective: nonEmpty.optional(),
537
+ possessive_pronoun: nonEmpty.optional(),
538
+ reflexive: nonEmpty.optional(),
539
+ sub: nonEmpty.optional(),
540
+ obj: nonEmpty.optional(),
541
+ p_a: nonEmpty.optional(),
542
+ p_pn: nonEmpty.optional(),
543
+ ref: nonEmpty.optional(),
544
+ ...metadata
545
+ });
546
+ var pronounEntrySchema = import_zod.z.union([
547
+ specialPreferenceSchema,
548
+ customEntrySchema,
549
+ pronounSetSchema
550
+ ]);
551
+ var pronounPreferenceSchema = import_zod.z.array(pronounEntrySchema).min(1);
495
552
 
496
553
  // src/validator.ts
497
554
  function validate(input) {
498
- return import_zod.pronounPreferenceSchema.safeParse(input).success;
555
+ return pronounPreferenceSchema.safeParse(input).success;
499
556
  }
500
557
  function validateOrThrow(input) {
501
- return import_zod.pronounPreferenceSchema.parse(input);
558
+ return pronounPreferenceSchema.parse(input);
502
559
  }
503
560
  function validationErrors(input) {
504
- const result = import_zod.pronounPreferenceSchema.safeParse(input);
561
+ const result = pronounPreferenceSchema.safeParse(input);
505
562
  if (result.success) return [];
506
563
  return result.error.issues.map(
507
564
  (e) => `${e.path.map(String).join(".")}: ${e.message}`
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/parser/index.ts","../src/formatter.ts","../src/types.ts","../src/validator.ts","../src/privacy.ts"],"sourcesContent":["export { parse } from \"./parser\";\nexport { format } from \"./formatter\";\nexport { validate, validateOrThrow, validationErrors } from \"./validator\";\nexport { filterByAudience } from \"./privacy\";\nexport {\n PRONOUN_DICTIONARY,\n FORM_TO_SET,\n SPECIAL_KEYWORDS,\n PLACEHOLDER_STRINGS,\n FILLER_PATTERNS,\n} from \"./constants\";\nexport type { CanonicalEntry } from \"./constants\";\nexport type {\n PronounPreference,\n PronounEntry,\n PronounSet,\n SpecialPreference,\n CustomEntry,\n FormatOptions,\n} from \"./types\";\nexport {\n pronounPreferenceSchema,\n pronounEntrySchema,\n pronounSetSchema,\n specialPreferenceSchema,\n customEntrySchema,\n SPECIAL_TYPES,\n} from \"./types\";\n","export interface CanonicalEntry {\n readonly subjective: string;\n readonly objective: string;\n readonly possessive_adjective: string;\n readonly possessive_pronoun: string;\n readonly reflexive: string;\n}\n\nexport const PRONOUN_DICTIONARY: readonly CanonicalEntry[] = [\n // Common sets\n {\n subjective: \"she\",\n objective: \"her\",\n possessive_adjective: \"her\",\n possessive_pronoun: \"hers\",\n reflexive: \"herself\",\n },\n {\n subjective: \"he\",\n objective: \"him\",\n possessive_adjective: \"his\",\n possessive_pronoun: \"his\",\n reflexive: \"himself\",\n },\n {\n subjective: \"they\",\n objective: \"them\",\n possessive_adjective: \"their\",\n possessive_pronoun: \"theirs\",\n reflexive: \"themselves\",\n },\n {\n subjective: \"it\",\n objective: \"it\",\n possessive_adjective: \"its\",\n possessive_pronoun: \"its\",\n reflexive: \"itself\",\n },\n // Neopronouns\n {\n subjective: \"xe\",\n objective: \"xem\",\n possessive_adjective: \"xyr\",\n possessive_pronoun: \"xyrs\",\n reflexive: \"xemself\",\n },\n {\n subjective: \"ze\",\n objective: \"zir\",\n possessive_adjective: \"zir\",\n possessive_pronoun: \"zirs\",\n reflexive: \"zirself\",\n },\n {\n subjective: \"fae\",\n objective: \"faer\",\n possessive_adjective: \"faer\",\n possessive_pronoun: \"faers\",\n reflexive: \"faerself\",\n },\n {\n subjective: \"per\",\n objective: \"per\",\n possessive_adjective: \"per\",\n possessive_pronoun: \"pers\",\n reflexive: \"perself\",\n },\n {\n subjective: \"ey\",\n objective: \"em\",\n possessive_adjective: \"eir\",\n possessive_pronoun: \"eirs\",\n reflexive: \"emself\",\n },\n {\n subjective: \"e\",\n objective: \"em\",\n possessive_adjective: \"eir\",\n possessive_pronoun: \"eirs\",\n reflexive: \"emself\",\n },\n {\n subjective: \"ze\",\n objective: \"hir\",\n possessive_adjective: \"hir\",\n possessive_pronoun: \"hirs\",\n reflexive: \"hirself\",\n },\n {\n subjective: \"ae\",\n objective: \"aer\",\n possessive_adjective: \"aer\",\n possessive_pronoun: \"aers\",\n reflexive: \"aerself\",\n },\n {\n subjective: \"co\",\n objective: \"co\",\n possessive_adjective: \"cos\",\n possessive_pronoun: \"cos\",\n reflexive: \"coself\",\n },\n {\n subjective: \"ne\",\n objective: \"nem\",\n possessive_adjective: \"nir\",\n possessive_pronoun: \"nirs\",\n reflexive: \"nemself\",\n },\n {\n subjective: \"thon\",\n objective: \"thon\",\n possessive_adjective: \"thons\",\n possessive_pronoun: \"thons\",\n reflexive: \"thonself\",\n },\n {\n subjective: \"ve\",\n objective: \"ver\",\n possessive_adjective: \"vis\",\n possessive_pronoun: \"vis\",\n reflexive: \"verself\",\n },\n] as const;\n\n// Reverse lookup: any known form → its canonical entry.\n// Subjective always takes priority; other forms use first-write-wins.\nfunction buildFormToSet(): Map<string, CanonicalEntry> {\n const map = new Map<string, CanonicalEntry>();\n for (const entry of PRONOUN_DICTIONARY) {\n // Subjective always wins (overwrite)\n map.set(entry.subjective, entry);\n }\n for (const entry of PRONOUN_DICTIONARY) {\n for (const form of [\n entry.objective,\n entry.possessive_adjective,\n entry.possessive_pronoun,\n entry.reflexive,\n ]) {\n if (!map.has(form)) {\n map.set(form, entry);\n }\n }\n }\n return map;\n}\n\nexport const FORM_TO_SET: ReadonlyMap<string, CanonicalEntry> =\n buildFormToSet();\n\nexport const SPECIAL_KEYWORDS = {\n any: [\n \"any\",\n \"any pronoun\",\n \"any pronouns\",\n \"any/all\",\n \"all/any\",\n \"any and all\",\n \"any and all pronouns\",\n \"all\",\n \"all pronouns\",\n \"no preference\",\n \"whatever\",\n \"whatever you want\",\n \"whatever you prefer\",\n \"whatever is fine\",\n \"whatever you feel comfortable\",\n \"i don't care\",\n \"i dont care\",\n \"idc\",\n \"doesn't matter\",\n \"doesnt matter\",\n \"i go by all\",\n \"most are acceptable\",\n ],\n none: [\n \"none\",\n \"no pronouns\",\n \"avoid pronouns\",\n \"use my name\",\n \"name only\",\n \"just my name\",\n \"refer to me by name\",\n ],\n ask: [\"ask\", \"ask me\", \"ask my pronouns\", \"ask me my pronouns\", \"please ask\"],\n unspecified: [\n \"unsure\",\n \"not sure\",\n \"not sure yet\",\n \"prefer not to disclose\",\n \"prefer not to say\",\n \"choose not to disclose\",\n \"undecided\",\n \"i don't know\",\n \"i dont know\",\n \"don't know\",\n \"dont know\",\n \"don't know yet\",\n \"dont know yet\",\n \"dunno\",\n \"private\",\n ],\n} as const;\n\nexport const PLACEHOLDER_STRINGS: readonly string[] = [\n \"n/a\",\n \"na\",\n \"tbd\",\n \"-\",\n \"none given\",\n];\n\nexport const FILLER_PATTERNS: readonly RegExp[] = [\n // suffix fillers\n /\\s+is\\s+fine\\s*$/i,\n /\\s+are\\s+fine\\s*$/i,\n /\\s+also\\s*$/i,\n /\\s+as\\s+well\\s*$/i,\n /\\s+preferred\\s*$/i,\n /\\s+only\\s*$/i,\n /\\s+please\\s*$/i,\n /\\s+now\\s*$/i,\n // prefix fillers\n /^please\\s+/i,\n /^only\\s+/i,\n /^just\\s+use\\s+/i,\n /^i\\s+use\\s+/i,\n /^i\\s+go\\s+by\\s+/i,\n // whole-segment filler phrase\n /^relevant\\s+pronouns\\s+are\\s+fine\\s*$/i,\n];\n","import type {\n CustomEntry,\n PronounEntry,\n PronounPreference,\n SpecialPreference,\n} from \"../types\";\n\nimport {\n FILLER_PATTERNS,\n FORM_TO_SET,\n PLACEHOLDER_STRINGS,\n SPECIAL_KEYWORDS,\n type CanonicalEntry,\n} from \"../constants\";\n\ntype SpecialType = \"any\" | \"none\" | \"ask\" | \"unspecified\";\n\nfunction matchSpecialKeyword(text: string): SpecialType | undefined {\n for (const [type, keywords] of Object.entries(SPECIAL_KEYWORDS) as [\n SpecialType,\n readonly string[],\n ][]) {\n if ((keywords as readonly string[]).includes(text)) return type;\n }\n return undefined;\n}\n\nfunction stripFiller(text: string): string {\n let s = text;\n for (const pattern of FILLER_PATTERNS) {\n s = s.replace(pattern, \"\").trim();\n }\n return s;\n}\n\nfunction isPlaceholder(text: string): boolean {\n return PLACEHOLDER_STRINGS.includes(text);\n}\n\nfunction formBelongsToEntry(form: string, entry: CanonicalEntry): boolean {\n return (\n entry.subjective === form ||\n entry.objective === form ||\n entry.possessive_adjective === form ||\n entry.possessive_pronoun === form ||\n entry.reflexive === form\n );\n}\n\nfunction makeStandardEntry(\n set: CanonicalEntry,\n context: string | undefined,\n excluded: boolean,\n): PronounEntry {\n const entry: Record<string, unknown> = {\n subjective: set.subjective,\n objective: set.objective,\n possessive_adjective: set.possessive_adjective,\n possessive_pronoun: set.possessive_pronoun,\n reflexive: set.reflexive,\n };\n if (context !== undefined) entry[\"context\"] = context;\n if (excluded) entry[\"exclude\"] = true;\n return entry as PronounEntry;\n}\n\nfunction resolveTokens(\n tokensLc: string[],\n originalText: string,\n context: string | undefined,\n excluded: boolean,\n): PronounEntry[] {\n const hasKnownToken = tokensLc.some((t) => FORM_TO_SET.has(t));\n\n if (!hasKnownToken) {\n const entry: CustomEntry = { type: \"custom\", display: originalText };\n if (context !== undefined) entry.context = context;\n if (excluded) entry.exclude = true;\n return [entry];\n }\n\n const result: PronounEntry[] = [];\n let currentSet: CanonicalEntry | null = null;\n\n for (const token of tokensLc) {\n const candidate = FORM_TO_SET.get(token);\n if (!candidate) continue;\n\n if (currentSet === null) {\n currentSet = candidate;\n } else if (\n candidate === currentSet ||\n formBelongsToEntry(token, currentSet)\n ) {\n // same set or an alternate form of the current set — keep accumulating\n } else if (candidate.subjective === currentSet.subjective) {\n // same subjective, different set — disambiguation token (e.g. \"zir\" after \"ze\")\n currentSet = candidate;\n } else {\n result.push(makeStandardEntry(currentSet, context, excluded));\n currentSet = candidate;\n }\n }\n\n if (currentSet !== null) {\n result.push(makeStandardEntry(currentSet, context, excluded));\n }\n\n return result;\n}\n\nfunction deduplicateEntries(entries: PronounEntry[]): PronounEntry[] {\n const seen = new Set<string>();\n return entries.filter((entry) => {\n let key: string;\n if (\"type\" in entry && entry.type !== \"custom\") {\n key = `special:${entry.type}`;\n } else if (\"type\" in entry && entry.type === \"custom\") {\n key = `custom:${(entry as CustomEntry).display}`;\n } else if (\"subjective\" in entry && entry.subjective) {\n key = `sub:${entry.subjective}`;\n } else if (\"sub\" in entry && (entry as { sub?: string }).sub) {\n key = `sub:${(entry as { sub?: string }).sub}`;\n } else {\n return true;\n }\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nexport function parse(\n input: string | null | undefined,\n): PronounPreference | null {\n if (!input?.trim()) return null;\n\n // Normalize: smart quotes, surrounding quotes, backslash→slash,\n // spaces around slashes, collapsed whitespace.\n const text = input\n .replace(/[‘’‛]/g, \"'\")\n .replace(/^[\"'](.+)[\"']$/, \"$1\")\n .replace(/\\\\/g, \"/\")\n .replace(/\\s*\\/\\s*/g, \"/\")\n .replace(/\\s+/g, \" \")\n .trim();\n\n if (!text) return null;\n\n const textLc = text.toLowerCase();\n\n if (isPlaceholder(textLc)) return null;\n\n // Check whole input against special keywords before splitting.\n const wholeSpecialType = matchSpecialKeyword(textLc);\n if (wholeSpecialType) return [{ type: wholeSpecialType }];\n\n // Split on set-level separators: comma, semicolon, ampersand, \"and\", \"or\".\n const segments = text.split(/,\\s*|;\\s*|\\s+&\\s+|\\s+and\\s+|\\s+or\\s+/i);\n\n const entries: PronounEntry[] = [];\n\n for (const rawSeg of segments) {\n const seg = rawSeg.trim();\n if (!seg) continue;\n\n let workSeg = seg;\n let workLc = seg.toLowerCase();\n\n // Extract parenthetical or bracketed context: \"she/her (at work)\" or \"[at work]\".\n let context: string | undefined;\n const parenMatch =\n workSeg.match(/\\s*\\(([^)]+)\\)\\s*$/) ??\n workSeg.match(/\\s*\\[([^\\]]+)\\]\\s*$/);\n if (parenMatch) {\n context = parenMatch[1]!.trim() || undefined;\n workSeg = workSeg.slice(0, parenMatch.index!).trim();\n workLc = workSeg.toLowerCase();\n }\n\n // Strip filler phrases — apply FILLER_PATTERNS to the original-case workSeg\n // (all patterns have /i), then re-derive workLc.\n for (const pattern of FILLER_PATTERNS) {\n workSeg = workSeg.replace(pattern, \"\").trim();\n }\n workLc = workSeg.toLowerCase();\n\n if (!workLc) continue;\n\n // Check special keyword BEFORE exclusion detection so that phrases like\n // \"not sure yet\" are caught here and not misread as exclusions.\n const segSpecialType = matchSpecialKeyword(workLc);\n if (segSpecialType) {\n const entry: SpecialPreference = { type: segSpecialType };\n if (context !== undefined)\n (entry as Record<string, unknown>)[\"context\"] = context;\n entries.push(entry);\n continue;\n }\n\n // Placeholder check.\n if (isPlaceholder(workLc)) continue;\n\n // Detect and strip exclusion prefix (\"just not\", \"not\", \"never\", \"except\").\n let excluded = false;\n const exclusionMatch = workLc.match(\n /^(?:just\\s+not|not|never|except)\\s+(.+)$/,\n );\n if (exclusionMatch) {\n excluded = true;\n const remainder = exclusionMatch[1]!;\n workSeg = workSeg.slice(workSeg.length - remainder.length);\n workLc = remainder;\n }\n\n // Tokenize by \"/\" and space, resolve to known sets.\n const tokensLc = workLc.split(/[/ ]+/).filter(Boolean);\n if (tokensLc.length === 0) continue;\n\n const resolved = resolveTokens(tokensLc, workSeg, context, excluded);\n entries.push(...resolved);\n }\n\n const deduped = deduplicateEntries(entries);\n return deduped.length > 0 ? deduped : null;\n}\n","import type { FormatOptions, PronounEntry, PronounPreference } from \"./types\";\n\n// Helpers for reading either full or compact key styles.\n\nfunction sub(e: PronounEntry): string | undefined {\n if (\"subjective\" in e) return e.subjective;\n if (\"sub\" in e) return (e as { sub?: string }).sub;\n return undefined;\n}\n\nfunction obj(e: PronounEntry): string | undefined {\n if (\"objective\" in e) return e.objective;\n if (\"obj\" in e) return (e as { obj?: string }).obj;\n return undefined;\n}\n\nfunction ppn(e: PronounEntry): string | undefined {\n if (\"possessive_pronoun\" in e) return e.possessive_pronoun;\n if (\"p_pn\" in e) return (e as { p_pn?: string }).p_pn;\n return undefined;\n}\n\nfunction ctx(e: PronounEntry): string | undefined {\n if (\"context\" in e && e.context) return e.context;\n if (\"ctx\" in e && (e as { ctx?: string }).ctx)\n return (e as { ctx?: string }).ctx;\n return undefined;\n}\n\nfunction ranking(e: PronounEntry): number | undefined {\n if (\"ranking\" in e && e.ranking !== undefined) return e.ranking;\n if (\"rnk\" in e && (e as { rnk?: number }).rnk !== undefined)\n return (e as { rnk?: number }).rnk;\n return undefined;\n}\n\nfunction privacy(e: PronounEntry): number | undefined {\n if (\"privacy\" in e && e.privacy !== undefined) return e.privacy;\n if (\"pvc\" in e && (e as { pvc?: number }).pvc !== undefined)\n return (e as { pvc?: number }).pvc;\n return undefined;\n}\n\nfunction excluded(e: PronounEntry): boolean {\n if (\"exclude\" in e && e.exclude === true) return true;\n if (\"exc\" in e && (e as { exc?: boolean }).exc === true) return true;\n return false;\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction capitalizeSlashSeparated(s: string): string {\n return s.split(\"/\").map(capitalize).join(\"/\");\n}\n\nfunction formatSingleEntry(\n entry: PronounEntry,\n form: \"short\" | \"expanded\" | \"detailed\",\n): string {\n if (\"type\" in entry) {\n const t = entry.type;\n if (t === \"any\") return \"Any pronouns\";\n if (t === \"none\") return \"No pronouns (use name)\";\n if (t === \"ask\") return \"Ask me my pronouns\";\n if (t === \"unspecified\") return \"Unspecified\";\n if (t === \"custom\") {\n const display = (entry as { type: \"custom\"; display: string }).display;\n return capitalizeSlashSeparated(display);\n }\n }\n\n const s = sub(entry);\n const o = obj(entry);\n const p = ppn(entry);\n\n if (!s || !o) return \"\";\n\n let base: string;\n if (form === \"expanded\") {\n base = `${capitalize(s)}/${capitalize(o)}/${capitalize(p ?? o)}`;\n } else {\n base = `${capitalize(s)}/${capitalize(o)}`;\n }\n\n const context = ctx(entry);\n if (context) base += ` (${context})`;\n\n return base;\n}\n\nexport function format(\n preference: PronounPreference,\n options: FormatOptions = {},\n): string {\n const form = options.form ?? \"short\";\n const isPublic = options.audience === \"public\";\n\n // Filter by privacy for public audience.\n let visible = preference.filter((e) => {\n if (isPublic) {\n const p = privacy(e);\n if (p !== undefined && p >= 1) return false;\n }\n return true;\n });\n\n // Sort by ranking (ascending — lower number = higher preference).\n // Entries without ranking stay at the end in their original order.\n visible = [...visible].sort((a, b) => {\n const ra = ranking(a);\n const rb = ranking(b);\n if (ra !== undefined && rb !== undefined) return ra - rb;\n if (ra !== undefined) return -1;\n if (rb !== undefined) return 1;\n return 0;\n });\n\n if (form === \"detailed\") {\n const positive = visible.filter((e) => !excluded(e));\n const negative = visible.filter((e) => excluded(e));\n\n const posStr = positive\n .map((e) => formatSingleEntry(e, \"short\"))\n .filter(Boolean)\n .join(\", \");\n\n if (negative.length === 0) return posStr;\n\n const negStr = negative\n .map((e) => {\n const s = sub(e);\n const o = obj(e);\n return s && o ? `not ${capitalize(s)}/${capitalize(o)}` : \"\";\n })\n .filter(Boolean)\n .join(\", \");\n\n return negStr ? `${posStr} (${negStr})` : posStr;\n }\n\n // short / expanded: omit excluded entries.\n const displayable = visible.filter((e) => !excluded(e));\n\n return displayable\n .map((e) => formatSingleEntry(e, form))\n .filter(Boolean)\n .join(\", \");\n}\n","export type {\n PronounPreference,\n PronounEntry,\n PronounSet,\n SpecialPreference,\n CustomEntry,\n} from \"@openpronoun/zod\";\n\nexport {\n pronounPreferenceSchema,\n pronounEntrySchema,\n pronounSetSchema,\n specialPreferenceSchema,\n customEntrySchema,\n SPECIAL_TYPES,\n} from \"@openpronoun/zod\";\n\nexport interface FormatOptions {\n form?: \"short\" | \"expanded\" | \"detailed\";\n audience?: string;\n}\n","import type { PronounPreference } from \"./types\";\n\nimport { pronounPreferenceSchema } from \"./types\";\n\nexport function validate(input: unknown): input is PronounPreference {\n return pronounPreferenceSchema.safeParse(input).success;\n}\n\nexport function validateOrThrow(input: unknown): PronounPreference {\n return pronounPreferenceSchema.parse(input);\n}\n\nexport function validationErrors(input: unknown): string[] {\n const result = pronounPreferenceSchema.safeParse(input);\n if (result.success) return [];\n return result.error.issues.map(\n (e) => `${e.path.map(String).join(\".\")}: ${e.message}`,\n );\n}\n","import type { PronounPreference } from \"./types\";\n\nexport function filterByAudience(\n preference: PronounPreference,\n audience: string,\n): PronounPreference {\n if (audience !== \"public\") return preference;\n return preference.filter((entry) => {\n const p =\n \"privacy\" in entry\n ? entry.privacy\n : \"pvc\" in entry\n ? (entry as { pvc?: number }).pvc\n : undefined;\n return p === undefined || p < 1;\n });\n}\n"],"mappings":"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","names":["excluded"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/parser/index.ts","../src/formatter.ts","../../zod/src/index.ts","../src/validator.ts","../src/privacy.ts"],"sourcesContent":["export { parse } from \"./parser\";\nexport { format } from \"./formatter\";\nexport { validate, validateOrThrow, validationErrors } from \"./validator\";\nexport { filterByAudience } from \"./privacy\";\nexport {\n PRONOUN_DICTIONARY,\n FORM_TO_SET,\n SPECIAL_KEYWORDS,\n PLACEHOLDER_STRINGS,\n FILLER_PATTERNS,\n} from \"./constants\";\nexport type { CanonicalEntry } from \"./constants\";\nexport type {\n PronounPreference,\n PronounEntry,\n PronounSet,\n SpecialPreference,\n CustomEntry,\n FormatOptions,\n} from \"./types\";\nexport {\n pronounPreferenceSchema,\n pronounEntrySchema,\n pronounSetSchema,\n specialPreferenceSchema,\n customEntrySchema,\n SPECIAL_TYPES,\n} from \"./types\";\n","export interface CanonicalEntry {\n readonly subjective: string;\n readonly objective: string;\n readonly possessive_adjective: string;\n readonly possessive_pronoun: string;\n readonly reflexive: string;\n}\n\nexport const PRONOUN_DICTIONARY: readonly CanonicalEntry[] = [\n // Common sets\n {\n subjective: \"she\",\n objective: \"her\",\n possessive_adjective: \"her\",\n possessive_pronoun: \"hers\",\n reflexive: \"herself\",\n },\n {\n subjective: \"he\",\n objective: \"him\",\n possessive_adjective: \"his\",\n possessive_pronoun: \"his\",\n reflexive: \"himself\",\n },\n {\n subjective: \"they\",\n objective: \"them\",\n possessive_adjective: \"their\",\n possessive_pronoun: \"theirs\",\n reflexive: \"themselves\",\n },\n {\n subjective: \"it\",\n objective: \"it\",\n possessive_adjective: \"its\",\n possessive_pronoun: \"its\",\n reflexive: \"itself\",\n },\n // Neopronouns\n {\n subjective: \"xe\",\n objective: \"xem\",\n possessive_adjective: \"xyr\",\n possessive_pronoun: \"xyrs\",\n reflexive: \"xemself\",\n },\n {\n subjective: \"ze\",\n objective: \"zir\",\n possessive_adjective: \"zir\",\n possessive_pronoun: \"zirs\",\n reflexive: \"zirself\",\n },\n {\n subjective: \"fae\",\n objective: \"faer\",\n possessive_adjective: \"faer\",\n possessive_pronoun: \"faers\",\n reflexive: \"faerself\",\n },\n {\n subjective: \"per\",\n objective: \"per\",\n possessive_adjective: \"per\",\n possessive_pronoun: \"pers\",\n reflexive: \"perself\",\n },\n {\n subjective: \"ey\",\n objective: \"em\",\n possessive_adjective: \"eir\",\n possessive_pronoun: \"eirs\",\n reflexive: \"emself\",\n },\n {\n subjective: \"e\",\n objective: \"em\",\n possessive_adjective: \"eir\",\n possessive_pronoun: \"eirs\",\n reflexive: \"emself\",\n },\n {\n subjective: \"ze\",\n objective: \"hir\",\n possessive_adjective: \"hir\",\n possessive_pronoun: \"hirs\",\n reflexive: \"hirself\",\n },\n {\n subjective: \"ae\",\n objective: \"aer\",\n possessive_adjective: \"aer\",\n possessive_pronoun: \"aers\",\n reflexive: \"aerself\",\n },\n {\n subjective: \"co\",\n objective: \"co\",\n possessive_adjective: \"cos\",\n possessive_pronoun: \"cos\",\n reflexive: \"coself\",\n },\n {\n subjective: \"ne\",\n objective: \"nem\",\n possessive_adjective: \"nir\",\n possessive_pronoun: \"nirs\",\n reflexive: \"nemself\",\n },\n {\n subjective: \"thon\",\n objective: \"thon\",\n possessive_adjective: \"thons\",\n possessive_pronoun: \"thons\",\n reflexive: \"thonself\",\n },\n {\n subjective: \"ve\",\n objective: \"ver\",\n possessive_adjective: \"vis\",\n possessive_pronoun: \"vis\",\n reflexive: \"verself\",\n },\n] as const;\n\n// Reverse lookup: any known form → its canonical entry.\n// Subjective always takes priority; other forms use first-write-wins.\nfunction buildFormToSet(): Map<string, CanonicalEntry> {\n const map = new Map<string, CanonicalEntry>();\n for (const entry of PRONOUN_DICTIONARY) {\n // Subjective always wins (overwrite)\n map.set(entry.subjective, entry);\n }\n for (const entry of PRONOUN_DICTIONARY) {\n for (const form of [\n entry.objective,\n entry.possessive_adjective,\n entry.possessive_pronoun,\n entry.reflexive,\n ]) {\n if (!map.has(form)) {\n map.set(form, entry);\n }\n }\n }\n return map;\n}\n\nexport const FORM_TO_SET: ReadonlyMap<string, CanonicalEntry> =\n buildFormToSet();\n\nexport const SPECIAL_KEYWORDS = {\n any: [\n \"any\",\n \"any pronoun\",\n \"any pronouns\",\n \"any/all\",\n \"all/any\",\n \"any and all\",\n \"any and all pronouns\",\n \"all\",\n \"all pronouns\",\n \"no preference\",\n \"whatever\",\n \"whatever you want\",\n \"whatever you prefer\",\n \"whatever is fine\",\n \"whatever you feel comfortable\",\n \"i don't care\",\n \"i dont care\",\n \"idc\",\n \"doesn't matter\",\n \"doesnt matter\",\n \"i go by all\",\n \"most are acceptable\",\n ],\n none: [\n \"none\",\n \"no pronouns\",\n \"avoid pronouns\",\n \"use my name\",\n \"name only\",\n \"just my name\",\n \"refer to me by name\",\n ],\n ask: [\"ask\", \"ask me\", \"ask my pronouns\", \"ask me my pronouns\", \"please ask\"],\n unspecified: [\n \"unsure\",\n \"not sure\",\n \"not sure yet\",\n \"prefer not to disclose\",\n \"prefer not to say\",\n \"choose not to disclose\",\n \"undecided\",\n \"i don't know\",\n \"i dont know\",\n \"don't know\",\n \"dont know\",\n \"don't know yet\",\n \"dont know yet\",\n \"dunno\",\n \"private\",\n ],\n} as const;\n\nexport const PLACEHOLDER_STRINGS: readonly string[] = [\n \"n/a\",\n \"na\",\n \"tbd\",\n \"-\",\n \"none given\",\n];\n\nexport const FILLER_PATTERNS: readonly RegExp[] = [\n // suffix fillers\n /\\s+is\\s+fine\\s*$/i,\n /\\s+are\\s+fine\\s*$/i,\n /\\s+also\\s*$/i,\n /\\s+as\\s+well\\s*$/i,\n /\\s+preferred\\s*$/i,\n /\\s+only\\s*$/i,\n /\\s+please\\s*$/i,\n /\\s+now\\s*$/i,\n // prefix fillers\n /^please\\s+/i,\n /^only\\s+/i,\n /^just\\s+use\\s+/i,\n /^i\\s+use\\s+/i,\n /^i\\s+go\\s+by\\s+/i,\n // whole-segment filler phrase\n /^relevant\\s+pronouns\\s+are\\s+fine\\s*$/i,\n];\n","import type {\n CustomEntry,\n PronounEntry,\n PronounPreference,\n SpecialPreference,\n} from \"../types\";\n\nimport {\n FILLER_PATTERNS,\n FORM_TO_SET,\n PLACEHOLDER_STRINGS,\n SPECIAL_KEYWORDS,\n type CanonicalEntry,\n} from \"../constants\";\n\ntype SpecialType = \"any\" | \"none\" | \"ask\" | \"unspecified\";\n\nfunction matchSpecialKeyword(text: string): SpecialType | undefined {\n for (const [type, keywords] of Object.entries(SPECIAL_KEYWORDS) as [\n SpecialType,\n readonly string[],\n ][]) {\n if ((keywords as readonly string[]).includes(text)) return type;\n }\n return undefined;\n}\n\nfunction stripFiller(text: string): string {\n let s = text;\n for (const pattern of FILLER_PATTERNS) {\n s = s.replace(pattern, \"\").trim();\n }\n return s;\n}\n\nfunction isPlaceholder(text: string): boolean {\n return PLACEHOLDER_STRINGS.includes(text);\n}\n\nfunction formBelongsToEntry(form: string, entry: CanonicalEntry): boolean {\n return (\n entry.subjective === form ||\n entry.objective === form ||\n entry.possessive_adjective === form ||\n entry.possessive_pronoun === form ||\n entry.reflexive === form\n );\n}\n\nfunction makeStandardEntry(\n set: CanonicalEntry,\n context: string | undefined,\n excluded: boolean,\n): PronounEntry {\n const entry: Record<string, unknown> = {\n subjective: set.subjective,\n objective: set.objective,\n possessive_adjective: set.possessive_adjective,\n possessive_pronoun: set.possessive_pronoun,\n reflexive: set.reflexive,\n };\n if (context !== undefined) entry[\"context\"] = context;\n if (excluded) entry[\"exclude\"] = true;\n return entry as PronounEntry;\n}\n\nfunction resolveTokens(\n tokensLc: string[],\n originalText: string,\n context: string | undefined,\n excluded: boolean,\n): PronounEntry[] {\n const hasKnownToken = tokensLc.some((t) => FORM_TO_SET.has(t));\n\n if (!hasKnownToken) {\n const entry: CustomEntry = { type: \"custom\", display: originalText };\n if (context !== undefined) entry.context = context;\n if (excluded) entry.exclude = true;\n return [entry];\n }\n\n const result: PronounEntry[] = [];\n let currentSet: CanonicalEntry | null = null;\n\n for (const token of tokensLc) {\n const candidate = FORM_TO_SET.get(token);\n if (!candidate) continue;\n\n if (currentSet === null) {\n currentSet = candidate;\n } else if (\n candidate === currentSet ||\n formBelongsToEntry(token, currentSet)\n ) {\n // same set or an alternate form of the current set — keep accumulating\n } else if (candidate.subjective === currentSet.subjective) {\n // same subjective, different set — disambiguation token (e.g. \"zir\" after \"ze\")\n currentSet = candidate;\n } else {\n result.push(makeStandardEntry(currentSet, context, excluded));\n currentSet = candidate;\n }\n }\n\n if (currentSet !== null) {\n result.push(makeStandardEntry(currentSet, context, excluded));\n }\n\n return result;\n}\n\nfunction deduplicateEntries(entries: PronounEntry[]): PronounEntry[] {\n const seen = new Set<string>();\n return entries.filter((entry) => {\n let key: string;\n if (\"type\" in entry && entry.type !== \"custom\") {\n key = `special:${entry.type}`;\n } else if (\"type\" in entry && entry.type === \"custom\") {\n key = `custom:${(entry as CustomEntry).display}`;\n } else if (\"subjective\" in entry && entry.subjective) {\n key = `sub:${entry.subjective}`;\n } else if (\"sub\" in entry && (entry as { sub?: string }).sub) {\n key = `sub:${(entry as { sub?: string }).sub}`;\n } else {\n return true;\n }\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nexport function parse(\n input: string | null | undefined,\n): PronounPreference | null {\n if (!input?.trim()) return null;\n\n // Normalize: smart quotes, surrounding quotes, backslash→slash,\n // spaces around slashes, collapsed whitespace.\n const text = input\n .replace(/[‘’‛]/g, \"'\")\n .replace(/^[\"'](.+)[\"']$/, \"$1\")\n .replace(/\\\\/g, \"/\")\n .replace(/\\s*\\/\\s*/g, \"/\")\n .replace(/\\s+/g, \" \")\n .trim();\n\n if (!text) return null;\n\n const textLc = text.toLowerCase();\n\n if (isPlaceholder(textLc)) return null;\n\n // Check whole input against special keywords before splitting.\n const wholeSpecialType = matchSpecialKeyword(textLc);\n if (wholeSpecialType) return [{ type: wholeSpecialType }];\n\n // Split on set-level separators: comma, semicolon, ampersand, \"and\", \"or\".\n const segments = text.split(/,\\s*|;\\s*|\\s+&\\s+|\\s+and\\s+|\\s+or\\s+/i);\n\n const entries: PronounEntry[] = [];\n\n for (const rawSeg of segments) {\n const seg = rawSeg.trim();\n if (!seg) continue;\n\n let workSeg = seg;\n let workLc = seg.toLowerCase();\n\n // Extract parenthetical or bracketed context: \"she/her (at work)\" or \"[at work]\".\n let context: string | undefined;\n const parenMatch =\n workSeg.match(/\\s*\\(([^)]+)\\)\\s*$/) ??\n workSeg.match(/\\s*\\[([^\\]]+)\\]\\s*$/);\n if (parenMatch) {\n context = parenMatch[1]!.trim() || undefined;\n workSeg = workSeg.slice(0, parenMatch.index!).trim();\n workLc = workSeg.toLowerCase();\n }\n\n // Strip filler phrases — apply FILLER_PATTERNS to the original-case workSeg\n // (all patterns have /i), then re-derive workLc.\n for (const pattern of FILLER_PATTERNS) {\n workSeg = workSeg.replace(pattern, \"\").trim();\n }\n workLc = workSeg.toLowerCase();\n\n if (!workLc) continue;\n\n // Check special keyword BEFORE exclusion detection so that phrases like\n // \"not sure yet\" are caught here and not misread as exclusions.\n const segSpecialType = matchSpecialKeyword(workLc);\n if (segSpecialType) {\n const entry: SpecialPreference = { type: segSpecialType };\n if (context !== undefined)\n (entry as Record<string, unknown>)[\"context\"] = context;\n entries.push(entry);\n continue;\n }\n\n // Placeholder check.\n if (isPlaceholder(workLc)) continue;\n\n // Detect and strip exclusion prefix (\"just not\", \"not\", \"never\", \"except\").\n let excluded = false;\n const exclusionMatch = workLc.match(\n /^(?:just\\s+not|not|never|except)\\s+(.+)$/,\n );\n if (exclusionMatch) {\n excluded = true;\n const remainder = exclusionMatch[1]!;\n workSeg = workSeg.slice(workSeg.length - remainder.length);\n workLc = remainder;\n }\n\n // Tokenize by \"/\" and space, resolve to known sets.\n const tokensLc = workLc.split(/[/ ]+/).filter(Boolean);\n if (tokensLc.length === 0) continue;\n\n const resolved = resolveTokens(tokensLc, workSeg, context, excluded);\n entries.push(...resolved);\n }\n\n const deduped = deduplicateEntries(entries);\n return deduped.length > 0 ? deduped : null;\n}\n","import type { FormatOptions, PronounEntry, PronounPreference } from \"./types\";\n\n// Helpers for reading either full or compact key styles.\n\nfunction sub(e: PronounEntry): string | undefined {\n if (\"subjective\" in e) return e.subjective;\n if (\"sub\" in e) return (e as { sub?: string }).sub;\n return undefined;\n}\n\nfunction obj(e: PronounEntry): string | undefined {\n if (\"objective\" in e) return e.objective;\n if (\"obj\" in e) return (e as { obj?: string }).obj;\n return undefined;\n}\n\nfunction ppn(e: PronounEntry): string | undefined {\n if (\"possessive_pronoun\" in e) return e.possessive_pronoun;\n if (\"p_pn\" in e) return (e as { p_pn?: string }).p_pn;\n return undefined;\n}\n\nfunction ctx(e: PronounEntry): string | undefined {\n if (\"context\" in e && e.context) return e.context;\n if (\"ctx\" in e && (e as { ctx?: string }).ctx)\n return (e as { ctx?: string }).ctx;\n return undefined;\n}\n\nfunction ranking(e: PronounEntry): number | undefined {\n if (\"ranking\" in e && e.ranking !== undefined) return e.ranking;\n if (\"rnk\" in e && (e as { rnk?: number }).rnk !== undefined)\n return (e as { rnk?: number }).rnk;\n return undefined;\n}\n\nfunction privacy(e: PronounEntry): number | undefined {\n if (\"privacy\" in e && e.privacy !== undefined) return e.privacy;\n if (\"pvc\" in e && (e as { pvc?: number }).pvc !== undefined)\n return (e as { pvc?: number }).pvc;\n return undefined;\n}\n\nfunction excluded(e: PronounEntry): boolean {\n if (\"exclude\" in e && e.exclude === true) return true;\n if (\"exc\" in e && (e as { exc?: boolean }).exc === true) return true;\n return false;\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction capitalizeSlashSeparated(s: string): string {\n return s.split(\"/\").map(capitalize).join(\"/\");\n}\n\nfunction formatSingleEntry(\n entry: PronounEntry,\n form: \"short\" | \"expanded\" | \"detailed\",\n): string {\n if (\"type\" in entry) {\n const t = entry.type;\n if (t === \"any\") return \"Any pronouns\";\n if (t === \"none\") return \"No pronouns (use name)\";\n if (t === \"ask\") return \"Ask me my pronouns\";\n if (t === \"unspecified\") return \"Unspecified\";\n if (t === \"custom\") {\n const display = (entry as { type: \"custom\"; display: string }).display;\n return capitalizeSlashSeparated(display);\n }\n }\n\n const s = sub(entry);\n const o = obj(entry);\n const p = ppn(entry);\n\n if (!s || !o) return \"\";\n\n let base: string;\n if (form === \"expanded\") {\n base = `${capitalize(s)}/${capitalize(o)}/${capitalize(p ?? o)}`;\n } else {\n base = `${capitalize(s)}/${capitalize(o)}`;\n }\n\n const context = ctx(entry);\n if (context) base += ` (${context})`;\n\n return base;\n}\n\nexport function format(\n preference: PronounPreference,\n options: FormatOptions = {},\n): string {\n const form = options.form ?? \"short\";\n const isPublic = options.audience === \"public\";\n\n // Filter by privacy for public audience.\n let visible = preference.filter((e) => {\n if (isPublic) {\n const p = privacy(e);\n if (p !== undefined && p >= 1) return false;\n }\n return true;\n });\n\n // Sort by ranking (ascending — lower number = higher preference).\n // Entries without ranking stay at the end in their original order.\n visible = [...visible].sort((a, b) => {\n const ra = ranking(a);\n const rb = ranking(b);\n if (ra !== undefined && rb !== undefined) return ra - rb;\n if (ra !== undefined) return -1;\n if (rb !== undefined) return 1;\n return 0;\n });\n\n if (form === \"detailed\") {\n const positive = visible.filter((e) => !excluded(e));\n const negative = visible.filter((e) => excluded(e));\n\n const posStr = positive\n .map((e) => formatSingleEntry(e, \"short\"))\n .filter(Boolean)\n .join(\", \");\n\n if (negative.length === 0) return posStr;\n\n const negStr = negative\n .map((e) => {\n const s = sub(e);\n const o = obj(e);\n return s && o ? `not ${capitalize(s)}/${capitalize(o)}` : \"\";\n })\n .filter(Boolean)\n .join(\", \");\n\n return negStr ? `${posStr} (${negStr})` : posStr;\n }\n\n // short / expanded: omit excluded entries.\n const displayable = visible.filter((e) => !excluded(e));\n\n return displayable\n .map((e) => formatSingleEntry(e, form))\n .filter(Boolean)\n .join(\", \");\n}\n","import { z } from \"zod\";\n\n/**\n * Zod mirror of the canonical OpenPronoun JSON Schema (`@openpronoun/schema`).\n *\n * This is a hand-written, idiomatic Zod port kept in sync with\n * `pronoun-set.schema.json` via the parity test (see `test/parity.test.ts`),\n * which checks that both validators agree across the `@openpronoun/conformance`\n * fixtures. The JSON Schema remains the canonical, cross-language artifact;\n * this package exists for TypeScript ergonomics (inferred types + nicer errors).\n *\n * Intentional difference from the JSON Schema: special preferences here are\n * strict (no stray pronoun-form fields), whereas the JSON Schema is looser on\n * that pathological case. Both agree on every conformance fixture.\n */\n\nconst nonEmpty = z.string().min(1);\nconst iso6391 = z.string().regex(/^[a-z]{2}$/, \"expected an ISO 639-1 code\");\n\n/** Optional per-entry metadata, in both full and compact key styles. */\nconst metadata = {\n ranking: z.number().int().optional(),\n rnk: z.number().int().optional(),\n context: z.string().optional(),\n ctx: z.string().optional(),\n privacy: z.number().int().min(0).optional(),\n pvc: z.number().int().min(0).optional(),\n language: iso6391.optional(),\n lang: iso6391.optional(),\n exclude: z.boolean().optional(),\n exc: z.boolean().optional(),\n} as const;\n\nconst fullForms = {\n subjective: nonEmpty,\n objective: nonEmpty,\n possessive_adjective: nonEmpty,\n possessive_pronoun: nonEmpty,\n reflexive: nonEmpty,\n} as const;\n\nconst compactForms = {\n sub: nonEmpty,\n obj: nonEmpty,\n p_a: nonEmpty,\n p_pn: nonEmpty,\n ref: nonEmpty,\n} as const;\n\n/** A standard pronoun set in full keys. */\nexport const fullPronounSetSchema = z.strictObject({ ...fullForms, ...metadata });\n\n/** A standard pronoun set in compact keys. */\nexport const compactPronounSetSchema = z.strictObject({ ...compactForms, ...metadata });\n\n/** A standard pronoun set (either key style). */\nexport const pronounSetSchema = z.union([fullPronounSetSchema, compactPronounSetSchema]);\n\n/** The non-set special preferences. */\nexport const SPECIAL_TYPES = [\"any\", \"none\", \"ask\", \"unspecified\"] as const;\n\n/** A special preference: any / none / ask / unspecified. */\nexport const specialPreferenceSchema = z.strictObject({\n type: z.enum(SPECIAL_TYPES),\n ...metadata,\n});\n\n/**\n * A custom entry: requires `display`, and may additionally carry pronoun-form\n * fields (a merged or partially specified set).\n */\nexport const customEntrySchema = z.strictObject({\n type: z.literal(\"custom\"),\n display: nonEmpty,\n subjective: nonEmpty.optional(),\n objective: nonEmpty.optional(),\n possessive_adjective: nonEmpty.optional(),\n possessive_pronoun: nonEmpty.optional(),\n reflexive: nonEmpty.optional(),\n sub: nonEmpty.optional(),\n obj: nonEmpty.optional(),\n p_a: nonEmpty.optional(),\n p_pn: nonEmpty.optional(),\n ref: nonEmpty.optional(),\n ...metadata,\n});\n\n/** A single entry: a standard set, a special preference, or a custom entry. */\nexport const pronounEntrySchema = z.union([\n specialPreferenceSchema,\n customEntrySchema,\n pronounSetSchema,\n]);\n\n/** A pronoun preference: one or more entries, in user-preferred order. */\nexport const pronounPreferenceSchema = z.array(pronounEntrySchema).min(1);\n\nexport type PronounSet = z.infer<typeof pronounSetSchema>;\nexport type SpecialPreference = z.infer<typeof specialPreferenceSchema>;\nexport type CustomEntry = z.infer<typeof customEntrySchema>;\nexport type PronounEntry = z.infer<typeof pronounEntrySchema>;\nexport type PronounPreference = z.infer<typeof pronounPreferenceSchema>;\n","import type { PronounPreference } from \"./types\";\n\nimport { pronounPreferenceSchema } from \"./types\";\n\nexport function validate(input: unknown): input is PronounPreference {\n return pronounPreferenceSchema.safeParse(input).success;\n}\n\nexport function validateOrThrow(input: unknown): PronounPreference {\n return pronounPreferenceSchema.parse(input);\n}\n\nexport function validationErrors(input: unknown): string[] {\n const result = pronounPreferenceSchema.safeParse(input);\n if (result.success) return [];\n return result.error.issues.map(\n (e) => `${e.path.map(String).join(\".\")}: ${e.message}`,\n );\n}\n","import type { PronounPreference } from \"./types\";\n\nexport function filterByAudience(\n preference: PronounPreference,\n audience: string,\n): PronounPreference {\n if (audience !== \"public\") return preference;\n return preference.filter((entry) => {\n const p =\n \"privacy\" in entry\n ? entry.privacy\n : \"pvc\" in entry\n ? (entry as { pvc?: number }).pvc\n : undefined;\n return p === undefined || p < 1;\n });\n}\n"],"mappings":"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","names":["excluded"]}
package/dist/index.js CHANGED
@@ -448,15 +448,65 @@ function format(preference, options = {}) {
448
448
  return displayable.map((e) => formatSingleEntry(e, form)).filter(Boolean).join(", ");
449
449
  }
450
450
 
451
- // src/types.ts
452
- import {
453
- pronounPreferenceSchema,
454
- pronounEntrySchema,
455
- pronounSetSchema,
451
+ // ../zod/dist/index.js
452
+ import { z } from "zod";
453
+ var nonEmpty = z.string().min(1);
454
+ var iso6391 = z.string().regex(/^[a-z]{2}$/, "expected an ISO 639-1 code");
455
+ var metadata = {
456
+ ranking: z.number().int().optional(),
457
+ rnk: z.number().int().optional(),
458
+ context: z.string().optional(),
459
+ ctx: z.string().optional(),
460
+ privacy: z.number().int().min(0).optional(),
461
+ pvc: z.number().int().min(0).optional(),
462
+ language: iso6391.optional(),
463
+ lang: iso6391.optional(),
464
+ exclude: z.boolean().optional(),
465
+ exc: z.boolean().optional()
466
+ };
467
+ var fullForms = {
468
+ subjective: nonEmpty,
469
+ objective: nonEmpty,
470
+ possessive_adjective: nonEmpty,
471
+ possessive_pronoun: nonEmpty,
472
+ reflexive: nonEmpty
473
+ };
474
+ var compactForms = {
475
+ sub: nonEmpty,
476
+ obj: nonEmpty,
477
+ p_a: nonEmpty,
478
+ p_pn: nonEmpty,
479
+ ref: nonEmpty
480
+ };
481
+ var fullPronounSetSchema = z.strictObject({ ...fullForms, ...metadata });
482
+ var compactPronounSetSchema = z.strictObject({ ...compactForms, ...metadata });
483
+ var pronounSetSchema = z.union([fullPronounSetSchema, compactPronounSetSchema]);
484
+ var SPECIAL_TYPES = ["any", "none", "ask", "unspecified"];
485
+ var specialPreferenceSchema = z.strictObject({
486
+ type: z.enum(SPECIAL_TYPES),
487
+ ...metadata
488
+ });
489
+ var customEntrySchema = z.strictObject({
490
+ type: z.literal("custom"),
491
+ display: nonEmpty,
492
+ subjective: nonEmpty.optional(),
493
+ objective: nonEmpty.optional(),
494
+ possessive_adjective: nonEmpty.optional(),
495
+ possessive_pronoun: nonEmpty.optional(),
496
+ reflexive: nonEmpty.optional(),
497
+ sub: nonEmpty.optional(),
498
+ obj: nonEmpty.optional(),
499
+ p_a: nonEmpty.optional(),
500
+ p_pn: nonEmpty.optional(),
501
+ ref: nonEmpty.optional(),
502
+ ...metadata
503
+ });
504
+ var pronounEntrySchema = z.union([
456
505
  specialPreferenceSchema,
457
506
  customEntrySchema,
458
- SPECIAL_TYPES
459
- } from "@openpronoun/zod";
507
+ pronounSetSchema
508
+ ]);
509
+ var pronounPreferenceSchema = z.array(pronounEntrySchema).min(1);
460
510
 
461
511
  // src/validator.ts
462
512
  function validate(input) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/parser/index.ts","../src/formatter.ts","../src/types.ts","../src/validator.ts","../src/privacy.ts"],"sourcesContent":["export interface CanonicalEntry {\n readonly subjective: string;\n readonly objective: string;\n readonly possessive_adjective: string;\n readonly possessive_pronoun: string;\n readonly reflexive: string;\n}\n\nexport const PRONOUN_DICTIONARY: readonly CanonicalEntry[] = [\n // Common sets\n {\n subjective: \"she\",\n objective: \"her\",\n possessive_adjective: \"her\",\n possessive_pronoun: \"hers\",\n reflexive: \"herself\",\n },\n {\n subjective: \"he\",\n objective: \"him\",\n possessive_adjective: \"his\",\n possessive_pronoun: \"his\",\n reflexive: \"himself\",\n },\n {\n subjective: \"they\",\n objective: \"them\",\n possessive_adjective: \"their\",\n possessive_pronoun: \"theirs\",\n reflexive: \"themselves\",\n },\n {\n subjective: \"it\",\n objective: \"it\",\n possessive_adjective: \"its\",\n possessive_pronoun: \"its\",\n reflexive: \"itself\",\n },\n // Neopronouns\n {\n subjective: \"xe\",\n objective: \"xem\",\n possessive_adjective: \"xyr\",\n possessive_pronoun: \"xyrs\",\n reflexive: \"xemself\",\n },\n {\n subjective: \"ze\",\n objective: \"zir\",\n possessive_adjective: \"zir\",\n possessive_pronoun: \"zirs\",\n reflexive: \"zirself\",\n },\n {\n subjective: \"fae\",\n objective: \"faer\",\n possessive_adjective: \"faer\",\n possessive_pronoun: \"faers\",\n reflexive: \"faerself\",\n },\n {\n subjective: \"per\",\n objective: \"per\",\n possessive_adjective: \"per\",\n possessive_pronoun: \"pers\",\n reflexive: \"perself\",\n },\n {\n subjective: \"ey\",\n objective: \"em\",\n possessive_adjective: \"eir\",\n possessive_pronoun: \"eirs\",\n reflexive: \"emself\",\n },\n {\n subjective: \"e\",\n objective: \"em\",\n possessive_adjective: \"eir\",\n possessive_pronoun: \"eirs\",\n reflexive: \"emself\",\n },\n {\n subjective: \"ze\",\n objective: \"hir\",\n possessive_adjective: \"hir\",\n possessive_pronoun: \"hirs\",\n reflexive: \"hirself\",\n },\n {\n subjective: \"ae\",\n objective: \"aer\",\n possessive_adjective: \"aer\",\n possessive_pronoun: \"aers\",\n reflexive: \"aerself\",\n },\n {\n subjective: \"co\",\n objective: \"co\",\n possessive_adjective: \"cos\",\n possessive_pronoun: \"cos\",\n reflexive: \"coself\",\n },\n {\n subjective: \"ne\",\n objective: \"nem\",\n possessive_adjective: \"nir\",\n possessive_pronoun: \"nirs\",\n reflexive: \"nemself\",\n },\n {\n subjective: \"thon\",\n objective: \"thon\",\n possessive_adjective: \"thons\",\n possessive_pronoun: \"thons\",\n reflexive: \"thonself\",\n },\n {\n subjective: \"ve\",\n objective: \"ver\",\n possessive_adjective: \"vis\",\n possessive_pronoun: \"vis\",\n reflexive: \"verself\",\n },\n] as const;\n\n// Reverse lookup: any known form → its canonical entry.\n// Subjective always takes priority; other forms use first-write-wins.\nfunction buildFormToSet(): Map<string, CanonicalEntry> {\n const map = new Map<string, CanonicalEntry>();\n for (const entry of PRONOUN_DICTIONARY) {\n // Subjective always wins (overwrite)\n map.set(entry.subjective, entry);\n }\n for (const entry of PRONOUN_DICTIONARY) {\n for (const form of [\n entry.objective,\n entry.possessive_adjective,\n entry.possessive_pronoun,\n entry.reflexive,\n ]) {\n if (!map.has(form)) {\n map.set(form, entry);\n }\n }\n }\n return map;\n}\n\nexport const FORM_TO_SET: ReadonlyMap<string, CanonicalEntry> =\n buildFormToSet();\n\nexport const SPECIAL_KEYWORDS = {\n any: [\n \"any\",\n \"any pronoun\",\n \"any pronouns\",\n \"any/all\",\n \"all/any\",\n \"any and all\",\n \"any and all pronouns\",\n \"all\",\n \"all pronouns\",\n \"no preference\",\n \"whatever\",\n \"whatever you want\",\n \"whatever you prefer\",\n \"whatever is fine\",\n \"whatever you feel comfortable\",\n \"i don't care\",\n \"i dont care\",\n \"idc\",\n \"doesn't matter\",\n \"doesnt matter\",\n \"i go by all\",\n \"most are acceptable\",\n ],\n none: [\n \"none\",\n \"no pronouns\",\n \"avoid pronouns\",\n \"use my name\",\n \"name only\",\n \"just my name\",\n \"refer to me by name\",\n ],\n ask: [\"ask\", \"ask me\", \"ask my pronouns\", \"ask me my pronouns\", \"please ask\"],\n unspecified: [\n \"unsure\",\n \"not sure\",\n \"not sure yet\",\n \"prefer not to disclose\",\n \"prefer not to say\",\n \"choose not to disclose\",\n \"undecided\",\n \"i don't know\",\n \"i dont know\",\n \"don't know\",\n \"dont know\",\n \"don't know yet\",\n \"dont know yet\",\n \"dunno\",\n \"private\",\n ],\n} as const;\n\nexport const PLACEHOLDER_STRINGS: readonly string[] = [\n \"n/a\",\n \"na\",\n \"tbd\",\n \"-\",\n \"none given\",\n];\n\nexport const FILLER_PATTERNS: readonly RegExp[] = [\n // suffix fillers\n /\\s+is\\s+fine\\s*$/i,\n /\\s+are\\s+fine\\s*$/i,\n /\\s+also\\s*$/i,\n /\\s+as\\s+well\\s*$/i,\n /\\s+preferred\\s*$/i,\n /\\s+only\\s*$/i,\n /\\s+please\\s*$/i,\n /\\s+now\\s*$/i,\n // prefix fillers\n /^please\\s+/i,\n /^only\\s+/i,\n /^just\\s+use\\s+/i,\n /^i\\s+use\\s+/i,\n /^i\\s+go\\s+by\\s+/i,\n // whole-segment filler phrase\n /^relevant\\s+pronouns\\s+are\\s+fine\\s*$/i,\n];\n","import type {\n CustomEntry,\n PronounEntry,\n PronounPreference,\n SpecialPreference,\n} from \"../types\";\n\nimport {\n FILLER_PATTERNS,\n FORM_TO_SET,\n PLACEHOLDER_STRINGS,\n SPECIAL_KEYWORDS,\n type CanonicalEntry,\n} from \"../constants\";\n\ntype SpecialType = \"any\" | \"none\" | \"ask\" | \"unspecified\";\n\nfunction matchSpecialKeyword(text: string): SpecialType | undefined {\n for (const [type, keywords] of Object.entries(SPECIAL_KEYWORDS) as [\n SpecialType,\n readonly string[],\n ][]) {\n if ((keywords as readonly string[]).includes(text)) return type;\n }\n return undefined;\n}\n\nfunction stripFiller(text: string): string {\n let s = text;\n for (const pattern of FILLER_PATTERNS) {\n s = s.replace(pattern, \"\").trim();\n }\n return s;\n}\n\nfunction isPlaceholder(text: string): boolean {\n return PLACEHOLDER_STRINGS.includes(text);\n}\n\nfunction formBelongsToEntry(form: string, entry: CanonicalEntry): boolean {\n return (\n entry.subjective === form ||\n entry.objective === form ||\n entry.possessive_adjective === form ||\n entry.possessive_pronoun === form ||\n entry.reflexive === form\n );\n}\n\nfunction makeStandardEntry(\n set: CanonicalEntry,\n context: string | undefined,\n excluded: boolean,\n): PronounEntry {\n const entry: Record<string, unknown> = {\n subjective: set.subjective,\n objective: set.objective,\n possessive_adjective: set.possessive_adjective,\n possessive_pronoun: set.possessive_pronoun,\n reflexive: set.reflexive,\n };\n if (context !== undefined) entry[\"context\"] = context;\n if (excluded) entry[\"exclude\"] = true;\n return entry as PronounEntry;\n}\n\nfunction resolveTokens(\n tokensLc: string[],\n originalText: string,\n context: string | undefined,\n excluded: boolean,\n): PronounEntry[] {\n const hasKnownToken = tokensLc.some((t) => FORM_TO_SET.has(t));\n\n if (!hasKnownToken) {\n const entry: CustomEntry = { type: \"custom\", display: originalText };\n if (context !== undefined) entry.context = context;\n if (excluded) entry.exclude = true;\n return [entry];\n }\n\n const result: PronounEntry[] = [];\n let currentSet: CanonicalEntry | null = null;\n\n for (const token of tokensLc) {\n const candidate = FORM_TO_SET.get(token);\n if (!candidate) continue;\n\n if (currentSet === null) {\n currentSet = candidate;\n } else if (\n candidate === currentSet ||\n formBelongsToEntry(token, currentSet)\n ) {\n // same set or an alternate form of the current set — keep accumulating\n } else if (candidate.subjective === currentSet.subjective) {\n // same subjective, different set — disambiguation token (e.g. \"zir\" after \"ze\")\n currentSet = candidate;\n } else {\n result.push(makeStandardEntry(currentSet, context, excluded));\n currentSet = candidate;\n }\n }\n\n if (currentSet !== null) {\n result.push(makeStandardEntry(currentSet, context, excluded));\n }\n\n return result;\n}\n\nfunction deduplicateEntries(entries: PronounEntry[]): PronounEntry[] {\n const seen = new Set<string>();\n return entries.filter((entry) => {\n let key: string;\n if (\"type\" in entry && entry.type !== \"custom\") {\n key = `special:${entry.type}`;\n } else if (\"type\" in entry && entry.type === \"custom\") {\n key = `custom:${(entry as CustomEntry).display}`;\n } else if (\"subjective\" in entry && entry.subjective) {\n key = `sub:${entry.subjective}`;\n } else if (\"sub\" in entry && (entry as { sub?: string }).sub) {\n key = `sub:${(entry as { sub?: string }).sub}`;\n } else {\n return true;\n }\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nexport function parse(\n input: string | null | undefined,\n): PronounPreference | null {\n if (!input?.trim()) return null;\n\n // Normalize: smart quotes, surrounding quotes, backslash→slash,\n // spaces around slashes, collapsed whitespace.\n const text = input\n .replace(/[‘’‛]/g, \"'\")\n .replace(/^[\"'](.+)[\"']$/, \"$1\")\n .replace(/\\\\/g, \"/\")\n .replace(/\\s*\\/\\s*/g, \"/\")\n .replace(/\\s+/g, \" \")\n .trim();\n\n if (!text) return null;\n\n const textLc = text.toLowerCase();\n\n if (isPlaceholder(textLc)) return null;\n\n // Check whole input against special keywords before splitting.\n const wholeSpecialType = matchSpecialKeyword(textLc);\n if (wholeSpecialType) return [{ type: wholeSpecialType }];\n\n // Split on set-level separators: comma, semicolon, ampersand, \"and\", \"or\".\n const segments = text.split(/,\\s*|;\\s*|\\s+&\\s+|\\s+and\\s+|\\s+or\\s+/i);\n\n const entries: PronounEntry[] = [];\n\n for (const rawSeg of segments) {\n const seg = rawSeg.trim();\n if (!seg) continue;\n\n let workSeg = seg;\n let workLc = seg.toLowerCase();\n\n // Extract parenthetical or bracketed context: \"she/her (at work)\" or \"[at work]\".\n let context: string | undefined;\n const parenMatch =\n workSeg.match(/\\s*\\(([^)]+)\\)\\s*$/) ??\n workSeg.match(/\\s*\\[([^\\]]+)\\]\\s*$/);\n if (parenMatch) {\n context = parenMatch[1]!.trim() || undefined;\n workSeg = workSeg.slice(0, parenMatch.index!).trim();\n workLc = workSeg.toLowerCase();\n }\n\n // Strip filler phrases — apply FILLER_PATTERNS to the original-case workSeg\n // (all patterns have /i), then re-derive workLc.\n for (const pattern of FILLER_PATTERNS) {\n workSeg = workSeg.replace(pattern, \"\").trim();\n }\n workLc = workSeg.toLowerCase();\n\n if (!workLc) continue;\n\n // Check special keyword BEFORE exclusion detection so that phrases like\n // \"not sure yet\" are caught here and not misread as exclusions.\n const segSpecialType = matchSpecialKeyword(workLc);\n if (segSpecialType) {\n const entry: SpecialPreference = { type: segSpecialType };\n if (context !== undefined)\n (entry as Record<string, unknown>)[\"context\"] = context;\n entries.push(entry);\n continue;\n }\n\n // Placeholder check.\n if (isPlaceholder(workLc)) continue;\n\n // Detect and strip exclusion prefix (\"just not\", \"not\", \"never\", \"except\").\n let excluded = false;\n const exclusionMatch = workLc.match(\n /^(?:just\\s+not|not|never|except)\\s+(.+)$/,\n );\n if (exclusionMatch) {\n excluded = true;\n const remainder = exclusionMatch[1]!;\n workSeg = workSeg.slice(workSeg.length - remainder.length);\n workLc = remainder;\n }\n\n // Tokenize by \"/\" and space, resolve to known sets.\n const tokensLc = workLc.split(/[/ ]+/).filter(Boolean);\n if (tokensLc.length === 0) continue;\n\n const resolved = resolveTokens(tokensLc, workSeg, context, excluded);\n entries.push(...resolved);\n }\n\n const deduped = deduplicateEntries(entries);\n return deduped.length > 0 ? deduped : null;\n}\n","import type { FormatOptions, PronounEntry, PronounPreference } from \"./types\";\n\n// Helpers for reading either full or compact key styles.\n\nfunction sub(e: PronounEntry): string | undefined {\n if (\"subjective\" in e) return e.subjective;\n if (\"sub\" in e) return (e as { sub?: string }).sub;\n return undefined;\n}\n\nfunction obj(e: PronounEntry): string | undefined {\n if (\"objective\" in e) return e.objective;\n if (\"obj\" in e) return (e as { obj?: string }).obj;\n return undefined;\n}\n\nfunction ppn(e: PronounEntry): string | undefined {\n if (\"possessive_pronoun\" in e) return e.possessive_pronoun;\n if (\"p_pn\" in e) return (e as { p_pn?: string }).p_pn;\n return undefined;\n}\n\nfunction ctx(e: PronounEntry): string | undefined {\n if (\"context\" in e && e.context) return e.context;\n if (\"ctx\" in e && (e as { ctx?: string }).ctx)\n return (e as { ctx?: string }).ctx;\n return undefined;\n}\n\nfunction ranking(e: PronounEntry): number | undefined {\n if (\"ranking\" in e && e.ranking !== undefined) return e.ranking;\n if (\"rnk\" in e && (e as { rnk?: number }).rnk !== undefined)\n return (e as { rnk?: number }).rnk;\n return undefined;\n}\n\nfunction privacy(e: PronounEntry): number | undefined {\n if (\"privacy\" in e && e.privacy !== undefined) return e.privacy;\n if (\"pvc\" in e && (e as { pvc?: number }).pvc !== undefined)\n return (e as { pvc?: number }).pvc;\n return undefined;\n}\n\nfunction excluded(e: PronounEntry): boolean {\n if (\"exclude\" in e && e.exclude === true) return true;\n if (\"exc\" in e && (e as { exc?: boolean }).exc === true) return true;\n return false;\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction capitalizeSlashSeparated(s: string): string {\n return s.split(\"/\").map(capitalize).join(\"/\");\n}\n\nfunction formatSingleEntry(\n entry: PronounEntry,\n form: \"short\" | \"expanded\" | \"detailed\",\n): string {\n if (\"type\" in entry) {\n const t = entry.type;\n if (t === \"any\") return \"Any pronouns\";\n if (t === \"none\") return \"No pronouns (use name)\";\n if (t === \"ask\") return \"Ask me my pronouns\";\n if (t === \"unspecified\") return \"Unspecified\";\n if (t === \"custom\") {\n const display = (entry as { type: \"custom\"; display: string }).display;\n return capitalizeSlashSeparated(display);\n }\n }\n\n const s = sub(entry);\n const o = obj(entry);\n const p = ppn(entry);\n\n if (!s || !o) return \"\";\n\n let base: string;\n if (form === \"expanded\") {\n base = `${capitalize(s)}/${capitalize(o)}/${capitalize(p ?? o)}`;\n } else {\n base = `${capitalize(s)}/${capitalize(o)}`;\n }\n\n const context = ctx(entry);\n if (context) base += ` (${context})`;\n\n return base;\n}\n\nexport function format(\n preference: PronounPreference,\n options: FormatOptions = {},\n): string {\n const form = options.form ?? \"short\";\n const isPublic = options.audience === \"public\";\n\n // Filter by privacy for public audience.\n let visible = preference.filter((e) => {\n if (isPublic) {\n const p = privacy(e);\n if (p !== undefined && p >= 1) return false;\n }\n return true;\n });\n\n // Sort by ranking (ascending — lower number = higher preference).\n // Entries without ranking stay at the end in their original order.\n visible = [...visible].sort((a, b) => {\n const ra = ranking(a);\n const rb = ranking(b);\n if (ra !== undefined && rb !== undefined) return ra - rb;\n if (ra !== undefined) return -1;\n if (rb !== undefined) return 1;\n return 0;\n });\n\n if (form === \"detailed\") {\n const positive = visible.filter((e) => !excluded(e));\n const negative = visible.filter((e) => excluded(e));\n\n const posStr = positive\n .map((e) => formatSingleEntry(e, \"short\"))\n .filter(Boolean)\n .join(\", \");\n\n if (negative.length === 0) return posStr;\n\n const negStr = negative\n .map((e) => {\n const s = sub(e);\n const o = obj(e);\n return s && o ? `not ${capitalize(s)}/${capitalize(o)}` : \"\";\n })\n .filter(Boolean)\n .join(\", \");\n\n return negStr ? `${posStr} (${negStr})` : posStr;\n }\n\n // short / expanded: omit excluded entries.\n const displayable = visible.filter((e) => !excluded(e));\n\n return displayable\n .map((e) => formatSingleEntry(e, form))\n .filter(Boolean)\n .join(\", \");\n}\n","export type {\n PronounPreference,\n PronounEntry,\n PronounSet,\n SpecialPreference,\n CustomEntry,\n} from \"@openpronoun/zod\";\n\nexport {\n pronounPreferenceSchema,\n pronounEntrySchema,\n pronounSetSchema,\n specialPreferenceSchema,\n customEntrySchema,\n SPECIAL_TYPES,\n} from \"@openpronoun/zod\";\n\nexport interface FormatOptions {\n form?: \"short\" | \"expanded\" | \"detailed\";\n audience?: string;\n}\n","import type { PronounPreference } from \"./types\";\n\nimport { pronounPreferenceSchema } from \"./types\";\n\nexport function validate(input: unknown): input is PronounPreference {\n return pronounPreferenceSchema.safeParse(input).success;\n}\n\nexport function validateOrThrow(input: unknown): PronounPreference {\n return pronounPreferenceSchema.parse(input);\n}\n\nexport function validationErrors(input: unknown): string[] {\n const result = pronounPreferenceSchema.safeParse(input);\n if (result.success) return [];\n return result.error.issues.map(\n (e) => `${e.path.map(String).join(\".\")}: ${e.message}`,\n );\n}\n","import type { PronounPreference } from \"./types\";\n\nexport function filterByAudience(\n preference: PronounPreference,\n audience: string,\n): PronounPreference {\n if (audience !== \"public\") return preference;\n return preference.filter((entry) => {\n const p =\n \"privacy\" in entry\n ? entry.privacy\n : \"pvc\" in entry\n ? (entry as { pvc?: number }).pvc\n : undefined;\n return p === undefined || p < 1;\n });\n}\n"],"mappings":"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","names":["excluded"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/parser/index.ts","../src/formatter.ts","../../zod/src/index.ts","../src/validator.ts","../src/privacy.ts"],"sourcesContent":["export interface CanonicalEntry {\n readonly subjective: string;\n readonly objective: string;\n readonly possessive_adjective: string;\n readonly possessive_pronoun: string;\n readonly reflexive: string;\n}\n\nexport const PRONOUN_DICTIONARY: readonly CanonicalEntry[] = [\n // Common sets\n {\n subjective: \"she\",\n objective: \"her\",\n possessive_adjective: \"her\",\n possessive_pronoun: \"hers\",\n reflexive: \"herself\",\n },\n {\n subjective: \"he\",\n objective: \"him\",\n possessive_adjective: \"his\",\n possessive_pronoun: \"his\",\n reflexive: \"himself\",\n },\n {\n subjective: \"they\",\n objective: \"them\",\n possessive_adjective: \"their\",\n possessive_pronoun: \"theirs\",\n reflexive: \"themselves\",\n },\n {\n subjective: \"it\",\n objective: \"it\",\n possessive_adjective: \"its\",\n possessive_pronoun: \"its\",\n reflexive: \"itself\",\n },\n // Neopronouns\n {\n subjective: \"xe\",\n objective: \"xem\",\n possessive_adjective: \"xyr\",\n possessive_pronoun: \"xyrs\",\n reflexive: \"xemself\",\n },\n {\n subjective: \"ze\",\n objective: \"zir\",\n possessive_adjective: \"zir\",\n possessive_pronoun: \"zirs\",\n reflexive: \"zirself\",\n },\n {\n subjective: \"fae\",\n objective: \"faer\",\n possessive_adjective: \"faer\",\n possessive_pronoun: \"faers\",\n reflexive: \"faerself\",\n },\n {\n subjective: \"per\",\n objective: \"per\",\n possessive_adjective: \"per\",\n possessive_pronoun: \"pers\",\n reflexive: \"perself\",\n },\n {\n subjective: \"ey\",\n objective: \"em\",\n possessive_adjective: \"eir\",\n possessive_pronoun: \"eirs\",\n reflexive: \"emself\",\n },\n {\n subjective: \"e\",\n objective: \"em\",\n possessive_adjective: \"eir\",\n possessive_pronoun: \"eirs\",\n reflexive: \"emself\",\n },\n {\n subjective: \"ze\",\n objective: \"hir\",\n possessive_adjective: \"hir\",\n possessive_pronoun: \"hirs\",\n reflexive: \"hirself\",\n },\n {\n subjective: \"ae\",\n objective: \"aer\",\n possessive_adjective: \"aer\",\n possessive_pronoun: \"aers\",\n reflexive: \"aerself\",\n },\n {\n subjective: \"co\",\n objective: \"co\",\n possessive_adjective: \"cos\",\n possessive_pronoun: \"cos\",\n reflexive: \"coself\",\n },\n {\n subjective: \"ne\",\n objective: \"nem\",\n possessive_adjective: \"nir\",\n possessive_pronoun: \"nirs\",\n reflexive: \"nemself\",\n },\n {\n subjective: \"thon\",\n objective: \"thon\",\n possessive_adjective: \"thons\",\n possessive_pronoun: \"thons\",\n reflexive: \"thonself\",\n },\n {\n subjective: \"ve\",\n objective: \"ver\",\n possessive_adjective: \"vis\",\n possessive_pronoun: \"vis\",\n reflexive: \"verself\",\n },\n] as const;\n\n// Reverse lookup: any known form → its canonical entry.\n// Subjective always takes priority; other forms use first-write-wins.\nfunction buildFormToSet(): Map<string, CanonicalEntry> {\n const map = new Map<string, CanonicalEntry>();\n for (const entry of PRONOUN_DICTIONARY) {\n // Subjective always wins (overwrite)\n map.set(entry.subjective, entry);\n }\n for (const entry of PRONOUN_DICTIONARY) {\n for (const form of [\n entry.objective,\n entry.possessive_adjective,\n entry.possessive_pronoun,\n entry.reflexive,\n ]) {\n if (!map.has(form)) {\n map.set(form, entry);\n }\n }\n }\n return map;\n}\n\nexport const FORM_TO_SET: ReadonlyMap<string, CanonicalEntry> =\n buildFormToSet();\n\nexport const SPECIAL_KEYWORDS = {\n any: [\n \"any\",\n \"any pronoun\",\n \"any pronouns\",\n \"any/all\",\n \"all/any\",\n \"any and all\",\n \"any and all pronouns\",\n \"all\",\n \"all pronouns\",\n \"no preference\",\n \"whatever\",\n \"whatever you want\",\n \"whatever you prefer\",\n \"whatever is fine\",\n \"whatever you feel comfortable\",\n \"i don't care\",\n \"i dont care\",\n \"idc\",\n \"doesn't matter\",\n \"doesnt matter\",\n \"i go by all\",\n \"most are acceptable\",\n ],\n none: [\n \"none\",\n \"no pronouns\",\n \"avoid pronouns\",\n \"use my name\",\n \"name only\",\n \"just my name\",\n \"refer to me by name\",\n ],\n ask: [\"ask\", \"ask me\", \"ask my pronouns\", \"ask me my pronouns\", \"please ask\"],\n unspecified: [\n \"unsure\",\n \"not sure\",\n \"not sure yet\",\n \"prefer not to disclose\",\n \"prefer not to say\",\n \"choose not to disclose\",\n \"undecided\",\n \"i don't know\",\n \"i dont know\",\n \"don't know\",\n \"dont know\",\n \"don't know yet\",\n \"dont know yet\",\n \"dunno\",\n \"private\",\n ],\n} as const;\n\nexport const PLACEHOLDER_STRINGS: readonly string[] = [\n \"n/a\",\n \"na\",\n \"tbd\",\n \"-\",\n \"none given\",\n];\n\nexport const FILLER_PATTERNS: readonly RegExp[] = [\n // suffix fillers\n /\\s+is\\s+fine\\s*$/i,\n /\\s+are\\s+fine\\s*$/i,\n /\\s+also\\s*$/i,\n /\\s+as\\s+well\\s*$/i,\n /\\s+preferred\\s*$/i,\n /\\s+only\\s*$/i,\n /\\s+please\\s*$/i,\n /\\s+now\\s*$/i,\n // prefix fillers\n /^please\\s+/i,\n /^only\\s+/i,\n /^just\\s+use\\s+/i,\n /^i\\s+use\\s+/i,\n /^i\\s+go\\s+by\\s+/i,\n // whole-segment filler phrase\n /^relevant\\s+pronouns\\s+are\\s+fine\\s*$/i,\n];\n","import type {\n CustomEntry,\n PronounEntry,\n PronounPreference,\n SpecialPreference,\n} from \"../types\";\n\nimport {\n FILLER_PATTERNS,\n FORM_TO_SET,\n PLACEHOLDER_STRINGS,\n SPECIAL_KEYWORDS,\n type CanonicalEntry,\n} from \"../constants\";\n\ntype SpecialType = \"any\" | \"none\" | \"ask\" | \"unspecified\";\n\nfunction matchSpecialKeyword(text: string): SpecialType | undefined {\n for (const [type, keywords] of Object.entries(SPECIAL_KEYWORDS) as [\n SpecialType,\n readonly string[],\n ][]) {\n if ((keywords as readonly string[]).includes(text)) return type;\n }\n return undefined;\n}\n\nfunction stripFiller(text: string): string {\n let s = text;\n for (const pattern of FILLER_PATTERNS) {\n s = s.replace(pattern, \"\").trim();\n }\n return s;\n}\n\nfunction isPlaceholder(text: string): boolean {\n return PLACEHOLDER_STRINGS.includes(text);\n}\n\nfunction formBelongsToEntry(form: string, entry: CanonicalEntry): boolean {\n return (\n entry.subjective === form ||\n entry.objective === form ||\n entry.possessive_adjective === form ||\n entry.possessive_pronoun === form ||\n entry.reflexive === form\n );\n}\n\nfunction makeStandardEntry(\n set: CanonicalEntry,\n context: string | undefined,\n excluded: boolean,\n): PronounEntry {\n const entry: Record<string, unknown> = {\n subjective: set.subjective,\n objective: set.objective,\n possessive_adjective: set.possessive_adjective,\n possessive_pronoun: set.possessive_pronoun,\n reflexive: set.reflexive,\n };\n if (context !== undefined) entry[\"context\"] = context;\n if (excluded) entry[\"exclude\"] = true;\n return entry as PronounEntry;\n}\n\nfunction resolveTokens(\n tokensLc: string[],\n originalText: string,\n context: string | undefined,\n excluded: boolean,\n): PronounEntry[] {\n const hasKnownToken = tokensLc.some((t) => FORM_TO_SET.has(t));\n\n if (!hasKnownToken) {\n const entry: CustomEntry = { type: \"custom\", display: originalText };\n if (context !== undefined) entry.context = context;\n if (excluded) entry.exclude = true;\n return [entry];\n }\n\n const result: PronounEntry[] = [];\n let currentSet: CanonicalEntry | null = null;\n\n for (const token of tokensLc) {\n const candidate = FORM_TO_SET.get(token);\n if (!candidate) continue;\n\n if (currentSet === null) {\n currentSet = candidate;\n } else if (\n candidate === currentSet ||\n formBelongsToEntry(token, currentSet)\n ) {\n // same set or an alternate form of the current set — keep accumulating\n } else if (candidate.subjective === currentSet.subjective) {\n // same subjective, different set — disambiguation token (e.g. \"zir\" after \"ze\")\n currentSet = candidate;\n } else {\n result.push(makeStandardEntry(currentSet, context, excluded));\n currentSet = candidate;\n }\n }\n\n if (currentSet !== null) {\n result.push(makeStandardEntry(currentSet, context, excluded));\n }\n\n return result;\n}\n\nfunction deduplicateEntries(entries: PronounEntry[]): PronounEntry[] {\n const seen = new Set<string>();\n return entries.filter((entry) => {\n let key: string;\n if (\"type\" in entry && entry.type !== \"custom\") {\n key = `special:${entry.type}`;\n } else if (\"type\" in entry && entry.type === \"custom\") {\n key = `custom:${(entry as CustomEntry).display}`;\n } else if (\"subjective\" in entry && entry.subjective) {\n key = `sub:${entry.subjective}`;\n } else if (\"sub\" in entry && (entry as { sub?: string }).sub) {\n key = `sub:${(entry as { sub?: string }).sub}`;\n } else {\n return true;\n }\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nexport function parse(\n input: string | null | undefined,\n): PronounPreference | null {\n if (!input?.trim()) return null;\n\n // Normalize: smart quotes, surrounding quotes, backslash→slash,\n // spaces around slashes, collapsed whitespace.\n const text = input\n .replace(/[‘’‛]/g, \"'\")\n .replace(/^[\"'](.+)[\"']$/, \"$1\")\n .replace(/\\\\/g, \"/\")\n .replace(/\\s*\\/\\s*/g, \"/\")\n .replace(/\\s+/g, \" \")\n .trim();\n\n if (!text) return null;\n\n const textLc = text.toLowerCase();\n\n if (isPlaceholder(textLc)) return null;\n\n // Check whole input against special keywords before splitting.\n const wholeSpecialType = matchSpecialKeyword(textLc);\n if (wholeSpecialType) return [{ type: wholeSpecialType }];\n\n // Split on set-level separators: comma, semicolon, ampersand, \"and\", \"or\".\n const segments = text.split(/,\\s*|;\\s*|\\s+&\\s+|\\s+and\\s+|\\s+or\\s+/i);\n\n const entries: PronounEntry[] = [];\n\n for (const rawSeg of segments) {\n const seg = rawSeg.trim();\n if (!seg) continue;\n\n let workSeg = seg;\n let workLc = seg.toLowerCase();\n\n // Extract parenthetical or bracketed context: \"she/her (at work)\" or \"[at work]\".\n let context: string | undefined;\n const parenMatch =\n workSeg.match(/\\s*\\(([^)]+)\\)\\s*$/) ??\n workSeg.match(/\\s*\\[([^\\]]+)\\]\\s*$/);\n if (parenMatch) {\n context = parenMatch[1]!.trim() || undefined;\n workSeg = workSeg.slice(0, parenMatch.index!).trim();\n workLc = workSeg.toLowerCase();\n }\n\n // Strip filler phrases — apply FILLER_PATTERNS to the original-case workSeg\n // (all patterns have /i), then re-derive workLc.\n for (const pattern of FILLER_PATTERNS) {\n workSeg = workSeg.replace(pattern, \"\").trim();\n }\n workLc = workSeg.toLowerCase();\n\n if (!workLc) continue;\n\n // Check special keyword BEFORE exclusion detection so that phrases like\n // \"not sure yet\" are caught here and not misread as exclusions.\n const segSpecialType = matchSpecialKeyword(workLc);\n if (segSpecialType) {\n const entry: SpecialPreference = { type: segSpecialType };\n if (context !== undefined)\n (entry as Record<string, unknown>)[\"context\"] = context;\n entries.push(entry);\n continue;\n }\n\n // Placeholder check.\n if (isPlaceholder(workLc)) continue;\n\n // Detect and strip exclusion prefix (\"just not\", \"not\", \"never\", \"except\").\n let excluded = false;\n const exclusionMatch = workLc.match(\n /^(?:just\\s+not|not|never|except)\\s+(.+)$/,\n );\n if (exclusionMatch) {\n excluded = true;\n const remainder = exclusionMatch[1]!;\n workSeg = workSeg.slice(workSeg.length - remainder.length);\n workLc = remainder;\n }\n\n // Tokenize by \"/\" and space, resolve to known sets.\n const tokensLc = workLc.split(/[/ ]+/).filter(Boolean);\n if (tokensLc.length === 0) continue;\n\n const resolved = resolveTokens(tokensLc, workSeg, context, excluded);\n entries.push(...resolved);\n }\n\n const deduped = deduplicateEntries(entries);\n return deduped.length > 0 ? deduped : null;\n}\n","import type { FormatOptions, PronounEntry, PronounPreference } from \"./types\";\n\n// Helpers for reading either full or compact key styles.\n\nfunction sub(e: PronounEntry): string | undefined {\n if (\"subjective\" in e) return e.subjective;\n if (\"sub\" in e) return (e as { sub?: string }).sub;\n return undefined;\n}\n\nfunction obj(e: PronounEntry): string | undefined {\n if (\"objective\" in e) return e.objective;\n if (\"obj\" in e) return (e as { obj?: string }).obj;\n return undefined;\n}\n\nfunction ppn(e: PronounEntry): string | undefined {\n if (\"possessive_pronoun\" in e) return e.possessive_pronoun;\n if (\"p_pn\" in e) return (e as { p_pn?: string }).p_pn;\n return undefined;\n}\n\nfunction ctx(e: PronounEntry): string | undefined {\n if (\"context\" in e && e.context) return e.context;\n if (\"ctx\" in e && (e as { ctx?: string }).ctx)\n return (e as { ctx?: string }).ctx;\n return undefined;\n}\n\nfunction ranking(e: PronounEntry): number | undefined {\n if (\"ranking\" in e && e.ranking !== undefined) return e.ranking;\n if (\"rnk\" in e && (e as { rnk?: number }).rnk !== undefined)\n return (e as { rnk?: number }).rnk;\n return undefined;\n}\n\nfunction privacy(e: PronounEntry): number | undefined {\n if (\"privacy\" in e && e.privacy !== undefined) return e.privacy;\n if (\"pvc\" in e && (e as { pvc?: number }).pvc !== undefined)\n return (e as { pvc?: number }).pvc;\n return undefined;\n}\n\nfunction excluded(e: PronounEntry): boolean {\n if (\"exclude\" in e && e.exclude === true) return true;\n if (\"exc\" in e && (e as { exc?: boolean }).exc === true) return true;\n return false;\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction capitalizeSlashSeparated(s: string): string {\n return s.split(\"/\").map(capitalize).join(\"/\");\n}\n\nfunction formatSingleEntry(\n entry: PronounEntry,\n form: \"short\" | \"expanded\" | \"detailed\",\n): string {\n if (\"type\" in entry) {\n const t = entry.type;\n if (t === \"any\") return \"Any pronouns\";\n if (t === \"none\") return \"No pronouns (use name)\";\n if (t === \"ask\") return \"Ask me my pronouns\";\n if (t === \"unspecified\") return \"Unspecified\";\n if (t === \"custom\") {\n const display = (entry as { type: \"custom\"; display: string }).display;\n return capitalizeSlashSeparated(display);\n }\n }\n\n const s = sub(entry);\n const o = obj(entry);\n const p = ppn(entry);\n\n if (!s || !o) return \"\";\n\n let base: string;\n if (form === \"expanded\") {\n base = `${capitalize(s)}/${capitalize(o)}/${capitalize(p ?? o)}`;\n } else {\n base = `${capitalize(s)}/${capitalize(o)}`;\n }\n\n const context = ctx(entry);\n if (context) base += ` (${context})`;\n\n return base;\n}\n\nexport function format(\n preference: PronounPreference,\n options: FormatOptions = {},\n): string {\n const form = options.form ?? \"short\";\n const isPublic = options.audience === \"public\";\n\n // Filter by privacy for public audience.\n let visible = preference.filter((e) => {\n if (isPublic) {\n const p = privacy(e);\n if (p !== undefined && p >= 1) return false;\n }\n return true;\n });\n\n // Sort by ranking (ascending — lower number = higher preference).\n // Entries without ranking stay at the end in their original order.\n visible = [...visible].sort((a, b) => {\n const ra = ranking(a);\n const rb = ranking(b);\n if (ra !== undefined && rb !== undefined) return ra - rb;\n if (ra !== undefined) return -1;\n if (rb !== undefined) return 1;\n return 0;\n });\n\n if (form === \"detailed\") {\n const positive = visible.filter((e) => !excluded(e));\n const negative = visible.filter((e) => excluded(e));\n\n const posStr = positive\n .map((e) => formatSingleEntry(e, \"short\"))\n .filter(Boolean)\n .join(\", \");\n\n if (negative.length === 0) return posStr;\n\n const negStr = negative\n .map((e) => {\n const s = sub(e);\n const o = obj(e);\n return s && o ? `not ${capitalize(s)}/${capitalize(o)}` : \"\";\n })\n .filter(Boolean)\n .join(\", \");\n\n return negStr ? `${posStr} (${negStr})` : posStr;\n }\n\n // short / expanded: omit excluded entries.\n const displayable = visible.filter((e) => !excluded(e));\n\n return displayable\n .map((e) => formatSingleEntry(e, form))\n .filter(Boolean)\n .join(\", \");\n}\n","import { z } from \"zod\";\n\n/**\n * Zod mirror of the canonical OpenPronoun JSON Schema (`@openpronoun/schema`).\n *\n * This is a hand-written, idiomatic Zod port kept in sync with\n * `pronoun-set.schema.json` via the parity test (see `test/parity.test.ts`),\n * which checks that both validators agree across the `@openpronoun/conformance`\n * fixtures. The JSON Schema remains the canonical, cross-language artifact;\n * this package exists for TypeScript ergonomics (inferred types + nicer errors).\n *\n * Intentional difference from the JSON Schema: special preferences here are\n * strict (no stray pronoun-form fields), whereas the JSON Schema is looser on\n * that pathological case. Both agree on every conformance fixture.\n */\n\nconst nonEmpty = z.string().min(1);\nconst iso6391 = z.string().regex(/^[a-z]{2}$/, \"expected an ISO 639-1 code\");\n\n/** Optional per-entry metadata, in both full and compact key styles. */\nconst metadata = {\n ranking: z.number().int().optional(),\n rnk: z.number().int().optional(),\n context: z.string().optional(),\n ctx: z.string().optional(),\n privacy: z.number().int().min(0).optional(),\n pvc: z.number().int().min(0).optional(),\n language: iso6391.optional(),\n lang: iso6391.optional(),\n exclude: z.boolean().optional(),\n exc: z.boolean().optional(),\n} as const;\n\nconst fullForms = {\n subjective: nonEmpty,\n objective: nonEmpty,\n possessive_adjective: nonEmpty,\n possessive_pronoun: nonEmpty,\n reflexive: nonEmpty,\n} as const;\n\nconst compactForms = {\n sub: nonEmpty,\n obj: nonEmpty,\n p_a: nonEmpty,\n p_pn: nonEmpty,\n ref: nonEmpty,\n} as const;\n\n/** A standard pronoun set in full keys. */\nexport const fullPronounSetSchema = z.strictObject({ ...fullForms, ...metadata });\n\n/** A standard pronoun set in compact keys. */\nexport const compactPronounSetSchema = z.strictObject({ ...compactForms, ...metadata });\n\n/** A standard pronoun set (either key style). */\nexport const pronounSetSchema = z.union([fullPronounSetSchema, compactPronounSetSchema]);\n\n/** The non-set special preferences. */\nexport const SPECIAL_TYPES = [\"any\", \"none\", \"ask\", \"unspecified\"] as const;\n\n/** A special preference: any / none / ask / unspecified. */\nexport const specialPreferenceSchema = z.strictObject({\n type: z.enum(SPECIAL_TYPES),\n ...metadata,\n});\n\n/**\n * A custom entry: requires `display`, and may additionally carry pronoun-form\n * fields (a merged or partially specified set).\n */\nexport const customEntrySchema = z.strictObject({\n type: z.literal(\"custom\"),\n display: nonEmpty,\n subjective: nonEmpty.optional(),\n objective: nonEmpty.optional(),\n possessive_adjective: nonEmpty.optional(),\n possessive_pronoun: nonEmpty.optional(),\n reflexive: nonEmpty.optional(),\n sub: nonEmpty.optional(),\n obj: nonEmpty.optional(),\n p_a: nonEmpty.optional(),\n p_pn: nonEmpty.optional(),\n ref: nonEmpty.optional(),\n ...metadata,\n});\n\n/** A single entry: a standard set, a special preference, or a custom entry. */\nexport const pronounEntrySchema = z.union([\n specialPreferenceSchema,\n customEntrySchema,\n pronounSetSchema,\n]);\n\n/** A pronoun preference: one or more entries, in user-preferred order. */\nexport const pronounPreferenceSchema = z.array(pronounEntrySchema).min(1);\n\nexport type PronounSet = z.infer<typeof pronounSetSchema>;\nexport type SpecialPreference = z.infer<typeof specialPreferenceSchema>;\nexport type CustomEntry = z.infer<typeof customEntrySchema>;\nexport type PronounEntry = z.infer<typeof pronounEntrySchema>;\nexport type PronounPreference = z.infer<typeof pronounPreferenceSchema>;\n","import type { PronounPreference } from \"./types\";\n\nimport { pronounPreferenceSchema } from \"./types\";\n\nexport function validate(input: unknown): input is PronounPreference {\n return pronounPreferenceSchema.safeParse(input).success;\n}\n\nexport function validateOrThrow(input: unknown): PronounPreference {\n return pronounPreferenceSchema.parse(input);\n}\n\nexport function validationErrors(input: unknown): string[] {\n const result = pronounPreferenceSchema.safeParse(input);\n if (result.success) return [];\n return result.error.issues.map(\n (e) => `${e.path.map(String).join(\".\")}: ${e.message}`,\n );\n}\n","import type { PronounPreference } from \"./types\";\n\nexport function filterByAudience(\n preference: PronounPreference,\n audience: string,\n): PronounPreference {\n if (audience !== \"public\") return preference;\n return preference.filter((entry) => {\n const p =\n \"privacy\" in entry\n ? entry.privacy\n : \"pvc\" in entry\n ? (entry as { pvc?: number }).pvc\n : undefined;\n return p === undefined || p < 1;\n });\n}\n"],"mappings":"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","names":["excluded"]}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@openpronoun/core",
3
- "version": "0.0.0",
3
+ "version": "0.0.1",
4
4
  "description": "Reference TypeScript implementation of the OpenPronoun specification — parsing, formatting, and validation.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "sideEffects": false,
8
8
  "publishConfig": {
9
- "access": "public"
9
+ "access": "public",
10
+ "provenance": true
10
11
  },
11
12
  "files": [
12
13
  "dist"
@@ -51,5 +52,9 @@
51
52
  "typescript-eslint": "latest",
52
53
  "vitest": "latest",
53
54
  "zod": "^4"
55
+ },
56
+ "repository": {
57
+ "type": "git",
58
+ "url": "https://github.com/openpronoun/spec"
54
59
  }
55
60
  }