@takuhon/core 0.17.0 → 0.18.0
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.d.ts +215 -16
- package/dist/index.js +342 -19
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/takuhon.schema.json +74 -2
package/dist/index.js
CHANGED
|
@@ -305,7 +305,7 @@ var require_takuhon_validator = __commonJS({
|
|
|
305
305
|
"use strict";
|
|
306
306
|
module.exports = validate20;
|
|
307
307
|
module.exports.default = validate20;
|
|
308
|
-
var schema31 = { "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://takuhon.example/schemas/0.5.0/takuhon.schema.json", "title": "Takuhon Profile", "description": "Portable profile data format consumed by @takuhon/core. The canonical contract for profile content authored as takuhon.json.", "type": "object", "additionalProperties": false, "required": ["schemaVersion", "profile", "links", "careers", "projects", "skills", "contact", "settings", "meta"], "properties": { "schemaVersion": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9.-]+)?$", "description": "Semantic version of the takuhon schema this document conforms to." }, "profile": { "$ref": "#/$defs/Profile" }, "links": { "type": "array", "maxItems": 100, "items": { "$ref": "#/$defs/Link" } }, "careers": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Career" } }, "projects": { "type": "array", "maxItems": 100, "items": { "$ref": "#/$defs/Project" } }, "skills": { "type": "array", "maxItems": 200, "items": { "$ref": "#/$defs/Skill" } }, "certifications": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Certification" } }, "memberships": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Membership" } }, "volunteering": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Volunteering" } }, "honors": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Honor" } }, "education": { "type": "array", "maxItems": 30, "items": { "$ref": "#/$defs/Education" } }, "publications": { "type": "array", "maxItems": 100, "items": { "$ref": "#/$defs/Publication" } }, "languages": { "type": "array", "maxItems": 30, "items": { "$ref": "#/$defs/Language" } }, "courses": { "type": "array", "maxItems": 100, "items": { "$ref": "#/$defs/Course" } }, "patents": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Patent" } }, "testScores": { "type": "array", "maxItems": 30, "items": { "$ref": "#/$defs/TestScore" } }, "recommendations": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Recommendation" } }, "contact": { "$ref": "#/$defs/Contact" }, "settings": { "$ref": "#/$defs/Settings" }, "meta": { "$ref": "#/$defs/Meta" } }, "$defs": { "LocaleTag": { "type": "string", "minLength": 2, "maxLength": 35, "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$", "description": "BCP-47 language tag (e.g., 'en', 'ja', 'zh-Hant', 'pt-BR')." }, "Iso3166Alpha2": { "type": "string", "pattern": "^[A-Z]{2}$", "description": "ISO 3166-1 alpha-2 country code (uppercase, two letters)." }, "YearMonth": { "type": "string", "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$", "description": "Year-month in 'YYYY-MM' format (Gregorian calendar)." }, "IsoDateTime": { "type": "string", "format": "date-time", "description": "ISO 8601 date-time (e.g., 2026-05-11T12:34:56Z)." }, "Url": { "type": "string", "format": "uri", "maxLength": 2048 }, "Email": { "type": "string", "format": "email", "maxLength": 254 }, "Slug": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z0-9][a-z0-9-]*$", "description": "URL-safe identifier (lowercase alphanumerics and hyphens, must start with alphanumeric)." }, "LocalizedTitle": { "type": "object", "minProperties": 1, "propertyNames": { "type": "string", "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$" }, "additionalProperties": { "type": "string", "minLength": 1, "maxLength": 200 }, "description": "Map of BCP-47 locale tag to short title-like string (max 200 chars per value)." }, "LocalizedBody": { "type": "object", "minProperties": 1, "propertyNames": { "type": "string", "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$" }, "additionalProperties": { "type": "string", "minLength": 1, "maxLength": 5e3 }, "description": "Map of BCP-47 locale tag to body-length string (max 5000 chars per value)." }, "LinkType": { "type": "string", "enum": ["website", "blog", "github", "gitlab", "linkedin", "x", "mastodon", "bluesky", "instagram", "youtube", "threads", "facebook", "email", "rss", "custom"], "description": "Identifies the kind of link. 'custom' requires iconUrl." }, "Profile": { "type": "object", "additionalProperties": true, "required": ["displayName"], "properties": { "displayName": { "$ref": "#/$defs/LocalizedTitle" }, "tagline": { "$ref": "#/$defs/LocalizedTitle" }, "bio": { "$ref": "#/$defs/LocalizedBody" }, "avatar": { "$ref": "#/$defs/Avatar" }, "location": { "$ref": "#/$defs/Address" } } }, "Avatar": { "type": "object", "additionalProperties": true, "required": ["url"], "properties": { "url": { "type": "string", "format": "uri-reference", "maxLength": 2048, "description": "URL or path to the avatar image." }, "alt": { "$ref": "#/$defs/LocalizedTitle" } } }, "Address": { "type": "object", "additionalProperties": true, "properties": { "country": { "$ref": "#/$defs/Iso3166Alpha2" }, "region": { "type": "string", "maxLength": 100 }, "locality": { "$ref": "#/$defs/LocalizedTitle" }, "display": { "$ref": "#/$defs/LocalizedTitle" } } }, "Link": { "type": "object", "additionalProperties": false, "required": ["id", "type", "url"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "type": { "$ref": "#/$defs/LinkType" }, "label": { "$ref": "#/$defs/LocalizedTitle" }, "url": { "$ref": "#/$defs/Url" }, "featured": { "type": "boolean" }, "order": { "type": "integer", "minimum": 0 }, "iconUrl": { "$ref": "#/$defs/Url" } }, "allOf": [{ "if": { "properties": { "type": { "const": "custom" } }, "required": ["type"] }, "then": { "properties": { "iconUrl": { "$ref": "#/$defs/Url" } }, "required": ["iconUrl"] } }] }, "Career": { "type": "object", "additionalProperties": true, "required": ["id", "organization", "role", "startDate"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "organization": { "$ref": "#/$defs/LocalizedTitle" }, "role": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "startDate": { "$ref": "#/$defs/YearMonth" }, "endDate": { "anyOf": [{ "$ref": "#/$defs/YearMonth" }, { "type": "null" }] }, "isCurrent": { "type": "boolean" }, "url": { "$ref": "#/$defs/Url" }, "location": { "$ref": "#/$defs/Address" }, "order": { "type": "integer", "minimum": 0 } } }, "Project": { "type": "object", "additionalProperties": true, "required": ["id", "title"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "url": { "$ref": "#/$defs/Url" }, "tags": { "type": "array", "maxItems": 30, "items": { "type": "string", "minLength": 1, "maxLength": 50 } }, "relatedCareerId": { "$ref": "#/$defs/Slug" }, "startDate": { "$ref": "#/$defs/YearMonth" }, "endDate": { "anyOf": [{ "$ref": "#/$defs/YearMonth" }, { "type": "null" }] }, "highlighted": { "type": "boolean" }, "order": { "type": "integer", "minimum": 0 } } }, "Skill": { "type": "object", "additionalProperties": true, "required": ["id", "label"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "label": { "type": "string", "minLength": 1, "maxLength": 100 }, "category": { "type": "string", "minLength": 1, "maxLength": 64, "description": "Recommended values (extensible): programming, design, business, communication, language, music, art, sports, other." }, "order": { "type": "integer", "minimum": 0 } } }, "Contact": { "type": "object", "additionalProperties": true, "properties": { "email": { "$ref": "#/$defs/Email" }, "showEmail": { "type": "boolean", "default": false }, "formUrl": { "$ref": "#/$defs/Url" } } }, "Settings": { "type": "object", "additionalProperties": true, "required": ["defaultLocale", "availableLocales"], "properties": { "defaultLocale": { "$ref": "#/$defs/LocaleTag" }, "fallbackLocale": { "$ref": "#/$defs/LocaleTag" }, "availableLocales": { "type": "array", "minItems": 1, "maxItems": 50, "uniqueItems": true, "items": { "$ref": "#/$defs/LocaleTag" } }, "theme": { "type": "string", "minLength": 1, "maxLength": 64, "description": "UI theme identifier. 'default' is the built-in theme; adapters may add more." }, "showPoweredBy": { "type": "boolean", "default": true, "description": "Display the 'Powered by takuhon' attribution in the rendered profile." }, "enableJsonLd": { "type": "boolean", "default": true, "description": "Emit Schema.org JSON-LD on the rendered profile page." }, "enableApi": { "type": "boolean", "default": true, "description": "Expose the public read API endpoints (GET /api/profile, /api/jsonld, /api/schema, /takuhon.json)." }, "enableAnalytics": { "type": "boolean", "default": false, "description": "Opt-in flag for first-party analytics. Default is false to keep takuhon privacy-respecting by default." }, "activity": { "$ref": "#/$defs/ActivitySettings" } } }, "ActivitySettings": { "type": "object", "additionalProperties": false, "description": "Opt-in developer-activity dashboard configuration (GitHub / WakaTime). Only the owner-curated settings live here; secrets are provisioned out of band and the synced metrics are stored in a separate document, never in takuhon.json.", "properties": { "enabled": { "type": "boolean", "default": false, "description": "Master switch. When false (the default), the activity section is not rendered even if a snapshot exists." }, "github": { "type": "object", "additionalProperties": false, "required": ["username"], "properties": { "username": { "type": "string", "minLength": 1, "maxLength": 39, "description": "GitHub login whose public activity is summarized." }, "showLanguages": { "type": "boolean", "default": true }, "showContributions": { "type": "boolean", "default": true } } }, "wakatime": { "type": "object", "additionalProperties": false, "required": ["username"], "properties": { "username": { "type": "string", "minLength": 1, "maxLength": 255, "description": "WakaTime username whose coding-time stats are summarized." }, "showCodingTime": { "type": "boolean", "default": true } } }, "showRank": { "type": "boolean", "default": true, "description": "Display the derived activity rank / badge." }, "refreshHintHours": { "type": "integer", "minimum": 1, "maximum": 168, "description": "Advisory refresh cadence in hours. The real cadence is how often the sync step (CLI command or scheduled job) runs." } } }, "Meta": { "type": "object", "additionalProperties": true, "required": ["contentLicense"], "properties": { "createdAt": { "$ref": "#/$defs/IsoDateTime" }, "updatedAt": { "$ref": "#/$defs/IsoDateTime" }, "generator": { "type": "string", "minLength": 1, "maxLength": 100, "description": "Tool that produced this document (e.g. 'Takuhon', 'create-takuhon@0.1.0')." }, "contentLicense": { "$ref": "#/$defs/ContentLicense" }, "privacy": { "$ref": "#/$defs/MetaPrivacy" } } }, "ContentLicense": { "type": "object", "additionalProperties": false, "required": ["spdxId"], "properties": { "spdxId": { "type": "string", "minLength": 1, "maxLength": 64, "description": "SPDX identifier (e.g., 'CC-BY-4.0', 'CC0-1.0') or 'Proprietary'. No default; the profile owner must choose explicitly." }, "url": { "$ref": "#/$defs/Url" }, "attribution": { "type": "object", "additionalProperties": false, "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 200 }, "url": { "$ref": "#/$defs/Url" } } }, "rights": { "type": "string", "minLength": 1, "maxLength": 1e3, "description": "Free-form rights statement (used when spdxId='Proprietary' or for additional notices)." } } }, "MetaPrivacy": { "type": "object", "additionalProperties": true, "description": "Opt-out flags that strip personally identifying fields from public API output (GET /api/profile, /api/jsonld, /takuhon.json). Admin endpoints (PUT /api/admin/*, GET /api/admin/export) ignore these flags. Privacy-by-default: omitting the object or individual flags is equivalent to true.", "properties": { "hideCredentialIds": { "type": "boolean", "default": true, "description": "When true (default), strip certifications[*].credentialId from public responses." }, "hideEducationGrades": { "type": "boolean", "default": true, "description": "When true (default), strip education[*].grade from public responses." } } }, "Certification": { "type": "object", "additionalProperties": true, "required": ["id", "title", "issuingOrganization", "issueDate"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "issuingOrganization": { "$ref": "#/$defs/LocalizedTitle" }, "issueDate": { "$ref": "#/$defs/YearMonth" }, "expirationDate": { "anyOf": [{ "$ref": "#/$defs/YearMonth" }, { "type": "null" }], "description": "null = explicitly 'no expiration'. Omit if unknown/unstated." }, "credentialId": { "type": "string", "minLength": 1, "maxLength": 100, "description": "License or certificate number. Public exposure controlled by meta.privacy.hideCredentialIds." }, "url": { "$ref": "#/$defs/Url" }, "order": { "type": "integer", "minimum": 0 } } }, "Membership": { "type": "object", "additionalProperties": true, "required": ["id", "organization", "startDate"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "organization": { "$ref": "#/$defs/LocalizedTitle" }, "role": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "startDate": { "$ref": "#/$defs/YearMonth" }, "endDate": { "anyOf": [{ "$ref": "#/$defs/YearMonth" }, { "type": "null" }], "description": "null = ongoing. Omit if unknown." }, "isCurrent": { "type": "boolean" }, "url": { "$ref": "#/$defs/Url" }, "order": { "type": "integer", "minimum": 0 } } }, "Volunteering": { "type": "object", "additionalProperties": true, "required": ["id", "organization", "role", "startDate"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "organization": { "$ref": "#/$defs/LocalizedTitle" }, "role": { "$ref": "#/$defs/LocalizedTitle" }, "cause": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "startDate": { "$ref": "#/$defs/YearMonth" }, "endDate": { "anyOf": [{ "$ref": "#/$defs/YearMonth" }, { "type": "null" }] }, "isCurrent": { "type": "boolean" }, "url": { "$ref": "#/$defs/Url" }, "order": { "type": "integer", "minimum": 0 } } }, "Honor": { "type": "object", "additionalProperties": true, "required": ["id", "title", "issuer", "date"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "issuer": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "date": { "$ref": "#/$defs/YearMonth" }, "url": { "$ref": "#/$defs/Url" }, "order": { "type": "integer", "minimum": 0 } } }, "Education": { "type": "object", "additionalProperties": true, "required": ["id", "institution", "startDate"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "institution": { "$ref": "#/$defs/LocalizedTitle" }, "degree": { "$ref": "#/$defs/LocalizedTitle" }, "fieldOfStudy": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "grade": { "type": "string", "minLength": 1, "maxLength": 50, "description": "Free-form grade / class / GPA. Public exposure controlled by meta.privacy.hideEducationGrades." }, "startDate": { "$ref": "#/$defs/YearMonth" }, "endDate": { "anyOf": [{ "$ref": "#/$defs/YearMonth" }, { "type": "null" }], "description": "null = currently enrolled." }, "isCurrent": { "type": "boolean" }, "url": { "$ref": "#/$defs/Url" }, "order": { "type": "integer", "minimum": 0 } } }, "Publication": { "type": "object", "additionalProperties": true, "required": ["id", "title", "date"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "publisher": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "date": { "$ref": "#/$defs/YearMonth" }, "url": { "$ref": "#/$defs/Url" }, "doi": { "type": "string", "minLength": 1, "maxLength": 200, "description": "DOI identifier (e.g. '10.1145/3548643.3548644'). The full URL goes in 'url'." }, "coAuthors": { "type": "array", "maxItems": 50, "items": { "type": "string", "minLength": 1, "maxLength": 100 }, "description": "Co-author names in original script. Excludes the profile owner." }, "order": { "type": "integer", "minimum": 0 } } }, "Language": { "type": "object", "additionalProperties": true, "required": ["id", "language", "proficiency"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "language": { "$ref": "#/$defs/LocaleTag" }, "displayName": { "$ref": "#/$defs/LocalizedTitle" }, "proficiency": { "type": "string", "enum": ["native", "fluent", "professional", "intermediate", "basic"], "description": "LinkedIn-compatible 5-level proficiency." }, "order": { "type": "integer", "minimum": 0 } } }, "Course": { "type": "object", "additionalProperties": true, "required": ["id", "title"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "provider": { "$ref": "#/$defs/LocalizedTitle" }, "courseNumber": { "type": "string", "minLength": 1, "maxLength": 50 }, "description": { "$ref": "#/$defs/LocalizedBody" }, "completionDate": { "$ref": "#/$defs/YearMonth" }, "certificateUrl": { "$ref": "#/$defs/Url" }, "relatedEducationId": { "$ref": "#/$defs/Slug", "description": "Optional reference to an education[].id (e.g. for university coursework)." }, "order": { "type": "integer", "minimum": 0 } } }, "Patent": { "type": "object", "additionalProperties": true, "required": ["id", "title", "patentNumber", "status"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "patentNumber": { "type": "string", "minLength": 1, "maxLength": 100 }, "office": { "type": "string", "maxLength": 100, "description": "Patent office name (e.g. 'USPTO', 'JPO', 'EPO')." }, "status": { "type": "string", "enum": ["pending", "issued", "expired", "abandoned"] }, "description": { "$ref": "#/$defs/LocalizedBody" }, "filingDate": { "$ref": "#/$defs/YearMonth" }, "grantDate": { "$ref": "#/$defs/YearMonth" }, "url": { "$ref": "#/$defs/Url" }, "coInventors": { "type": "array", "maxItems": 20, "items": { "type": "string", "minLength": 1, "maxLength": 100 } }, "order": { "type": "integer", "minimum": 0 } } }, "TestScore": { "type": "object", "additionalProperties": true, "required": ["id", "title", "score", "date"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "score": { "type": "string", "minLength": 1, "maxLength": 50, "description": "Free-form score string (e.g. '112 / 120', '330', 'N1 Pass', or a percentile). The validator does not interpret its contents." }, "date": { "$ref": "#/$defs/YearMonth" }, "relatedEducationId": { "$ref": "#/$defs/Slug", "description": "Optional reference to an education[].id (e.g. for a university course exam)." }, "description": { "$ref": "#/$defs/LocalizedBody" }, "url": { "$ref": "#/$defs/Url" }, "order": { "type": "integer", "minimum": 0 } } }, "Recommendation": { "type": "object", "additionalProperties": true, "required": ["id", "body", "author"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "body": { "$ref": "#/$defs/LocalizedBody" }, "author": { "$ref": "#/$defs/RecommendationAuthor" }, "relationship": { "$ref": "#/$defs/LocalizedTitle", "description": "How the recommender relates to the profile owner (e.g. 'managed directly', 'worked together')." }, "date": { "$ref": "#/$defs/YearMonth" }, "relatedCareerId": { "$ref": "#/$defs/Slug", "description": "Optional reference to a careers[].id (the position the recommendation pertains to)." }, "relatedEducationId": { "$ref": "#/$defs/Slug", "description": "Optional reference to an education[].id (e.g. a recommendation from a professor)." }, "order": { "type": "integer", "minimum": 0 } } }, "RecommendationAuthor": { "type": "object", "additionalProperties": true, "required": ["name"], "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 100, "description": "Recommender's name, in its original script. Owner-curated; takuhon does not verify it." }, "headline": { "$ref": "#/$defs/LocalizedTitle", "description": "Recommender's title / role / organization at the time of the recommendation." }, "url": { "$ref": "#/$defs/Url", "description": "Link to the recommender's profile, for external verification by the reader." } } } } };
|
|
308
|
+
var schema31 = { "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://takuhon.example/schemas/0.6.0/takuhon.schema.json", "title": "Takuhon Profile", "description": "Portable profile data format consumed by @takuhon/core. The canonical contract for profile content authored as takuhon.json.", "type": "object", "additionalProperties": false, "required": ["schemaVersion", "profile", "links", "careers", "projects", "skills", "contact", "settings", "meta"], "properties": { "schemaVersion": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9.-]+)?$", "description": "Semantic version of the takuhon schema this document conforms to." }, "profile": { "$ref": "#/$defs/Profile" }, "links": { "type": "array", "maxItems": 100, "items": { "$ref": "#/$defs/Link" } }, "careers": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Career" } }, "projects": { "type": "array", "maxItems": 100, "items": { "$ref": "#/$defs/Project" } }, "skills": { "type": "array", "maxItems": 200, "items": { "$ref": "#/$defs/Skill" } }, "certifications": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Certification" } }, "memberships": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Membership" } }, "volunteering": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Volunteering" } }, "honors": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Honor" } }, "education": { "type": "array", "maxItems": 30, "items": { "$ref": "#/$defs/Education" } }, "publications": { "type": "array", "maxItems": 100, "items": { "$ref": "#/$defs/Publication" } }, "languages": { "type": "array", "maxItems": 30, "items": { "$ref": "#/$defs/Language" } }, "courses": { "type": "array", "maxItems": 100, "items": { "$ref": "#/$defs/Course" } }, "patents": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Patent" } }, "testScores": { "type": "array", "maxItems": 30, "items": { "$ref": "#/$defs/TestScore" } }, "recommendations": { "type": "array", "maxItems": 50, "items": { "$ref": "#/$defs/Recommendation" } }, "contact": { "$ref": "#/$defs/Contact" }, "settings": { "$ref": "#/$defs/Settings" }, "meta": { "$ref": "#/$defs/Meta" } }, "$defs": { "LocaleTag": { "type": "string", "minLength": 2, "maxLength": 35, "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$", "description": "BCP-47 language tag (e.g., 'en', 'ja', 'zh-Hant', 'pt-BR')." }, "Iso3166Alpha2": { "type": "string", "pattern": "^[A-Z]{2}$", "description": "ISO 3166-1 alpha-2 country code (uppercase, two letters)." }, "YearMonth": { "type": "string", "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$", "description": "Year-month in 'YYYY-MM' format (Gregorian calendar)." }, "IsoDateTime": { "type": "string", "format": "date-time", "description": "ISO 8601 date-time (e.g., 2026-05-11T12:34:56Z)." }, "Url": { "type": "string", "format": "uri", "maxLength": 2048 }, "Email": { "type": "string", "format": "email", "maxLength": 254 }, "Slug": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[a-z0-9][a-z0-9-]*$", "description": "URL-safe identifier (lowercase alphanumerics and hyphens, must start with alphanumeric)." }, "LocalizedTitle": { "type": "object", "minProperties": 1, "propertyNames": { "type": "string", "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$" }, "additionalProperties": { "type": "string", "minLength": 1, "maxLength": 200 }, "description": "Map of BCP-47 locale tag to short title-like string (max 200 chars per value)." }, "LocalizedBody": { "type": "object", "minProperties": 1, "propertyNames": { "type": "string", "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$" }, "additionalProperties": { "type": "string", "minLength": 1, "maxLength": 5e3 }, "description": "Map of BCP-47 locale tag to body-length string (max 5000 chars per value)." }, "LinkType": { "type": "string", "enum": ["website", "blog", "github", "gitlab", "linkedin", "x", "mastodon", "bluesky", "instagram", "youtube", "threads", "facebook", "email", "rss", "custom"], "description": "Identifies the kind of link. 'custom' requires iconUrl." }, "Profile": { "type": "object", "additionalProperties": true, "required": ["displayName"], "properties": { "displayName": { "$ref": "#/$defs/LocalizedTitle" }, "tagline": { "$ref": "#/$defs/LocalizedTitle" }, "bio": { "$ref": "#/$defs/LocalizedBody" }, "avatar": { "$ref": "#/$defs/Avatar" }, "location": { "$ref": "#/$defs/Address" } } }, "Avatar": { "type": "object", "additionalProperties": true, "required": ["url"], "properties": { "url": { "type": "string", "format": "uri-reference", "maxLength": 2048, "description": "URL or path to the avatar image." }, "alt": { "$ref": "#/$defs/LocalizedTitle" } } }, "Address": { "type": "object", "additionalProperties": true, "properties": { "country": { "$ref": "#/$defs/Iso3166Alpha2" }, "region": { "type": "string", "maxLength": 100 }, "locality": { "$ref": "#/$defs/LocalizedTitle" }, "display": { "$ref": "#/$defs/LocalizedTitle" } } }, "Link": { "type": "object", "additionalProperties": false, "required": ["id", "type", "url"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "type": { "$ref": "#/$defs/LinkType" }, "label": { "$ref": "#/$defs/LocalizedTitle" }, "url": { "$ref": "#/$defs/Url" }, "featured": { "type": "boolean" }, "order": { "type": "integer", "minimum": 0 }, "iconUrl": { "$ref": "#/$defs/Url" } }, "allOf": [{ "if": { "properties": { "type": { "const": "custom" } }, "required": ["type"] }, "then": { "properties": { "iconUrl": { "$ref": "#/$defs/Url" } }, "required": ["iconUrl"] } }] }, "Career": { "type": "object", "additionalProperties": true, "required": ["id", "organization", "role", "startDate"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "organization": { "$ref": "#/$defs/LocalizedTitle" }, "role": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "startDate": { "$ref": "#/$defs/YearMonth" }, "endDate": { "anyOf": [{ "$ref": "#/$defs/YearMonth" }, { "type": "null" }] }, "isCurrent": { "type": "boolean" }, "url": { "$ref": "#/$defs/Url" }, "location": { "$ref": "#/$defs/Address" }, "order": { "type": "integer", "minimum": 0 } } }, "Project": { "type": "object", "additionalProperties": true, "required": ["id", "title"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "url": { "$ref": "#/$defs/Url" }, "tags": { "type": "array", "maxItems": 30, "items": { "type": "string", "minLength": 1, "maxLength": 50 } }, "relatedCareerId": { "$ref": "#/$defs/Slug" }, "startDate": { "$ref": "#/$defs/YearMonth" }, "endDate": { "anyOf": [{ "$ref": "#/$defs/YearMonth" }, { "type": "null" }] }, "highlighted": { "type": "boolean" }, "order": { "type": "integer", "minimum": 0 } } }, "Skill": { "type": "object", "additionalProperties": true, "required": ["id", "label"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "label": { "type": "string", "minLength": 1, "maxLength": 100 }, "category": { "type": "string", "minLength": 1, "maxLength": 64, "description": "Recommended values (extensible): programming, design, business, communication, language, music, art, sports, other." }, "order": { "type": "integer", "minimum": 0 } } }, "Contact": { "type": "object", "additionalProperties": true, "properties": { "email": { "$ref": "#/$defs/Email" }, "showEmail": { "type": "boolean", "default": false }, "formUrl": { "$ref": "#/$defs/Url" } } }, "Settings": { "type": "object", "additionalProperties": true, "required": ["defaultLocale", "availableLocales"], "properties": { "defaultLocale": { "$ref": "#/$defs/LocaleTag" }, "fallbackLocale": { "$ref": "#/$defs/LocaleTag" }, "availableLocales": { "type": "array", "minItems": 1, "maxItems": 50, "uniqueItems": true, "items": { "$ref": "#/$defs/LocaleTag" } }, "theme": { "type": "string", "minLength": 1, "maxLength": 64, "description": "UI theme identifier. 'default' is the built-in theme; adapters may add more." }, "showPoweredBy": { "type": "boolean", "default": true, "description": "Display the 'Powered by takuhon' attribution in the rendered profile." }, "enableJsonLd": { "type": "boolean", "default": true, "description": "Emit Schema.org JSON-LD on the rendered profile page." }, "enableApi": { "type": "boolean", "default": true, "description": "Expose the public read API endpoints (GET /api/profile, /api/jsonld, /api/schema, /takuhon.json)." }, "enableAnalytics": { "type": "boolean", "default": false, "description": "Opt-in flag for first-party analytics. Default is false to keep takuhon privacy-respecting by default." }, "activity": { "$ref": "#/$defs/ActivitySettings" }, "publicVisibility": { "$ref": "#/$defs/PublicVisibility" } } }, "PublicVisibility": { "type": "object", "additionalProperties": false, "description": "Per-section public visibility (added in 0.6.0). Each key is a content section; setting it to false hides that whole section from every public surface (GET /, /api/profile, /api/jsonld, /takuhon.json, MCP, and the derived CV) via the shared applyPublicPrivacyFilter. An absent key \u2014 or an absent object \u2014 means the section is public, so the default is all-visible and omitting this block is fully backwards-compatible. The profile identity (profile.displayName, \u2026) is always public and is intentionally not a key here. Field-level controls (contact.showEmail, meta.privacy.*) still apply within a visible section: visibility is the AND of the feature toggle, this section flag, and the field flag.", "properties": { "links": { "type": "boolean", "description": "Default true. When false, links[] is emitted empty on public surfaces." }, "careers": { "type": "boolean", "description": "Default true. When false, careers[] is emitted empty on public surfaces." }, "projects": { "type": "boolean", "description": "Default true. When false, projects[] is emitted empty on public surfaces." }, "skills": { "type": "boolean", "description": "Default true. When false, skills[] is emitted empty on public surfaces." }, "certifications": { "type": "boolean", "description": "Default true. When false, certifications[] is emitted empty on public surfaces." }, "memberships": { "type": "boolean", "description": "Default true. When false, memberships[] is emitted empty on public surfaces." }, "volunteering": { "type": "boolean", "description": "Default true. When false, volunteering[] is emitted empty on public surfaces." }, "honors": { "type": "boolean", "description": "Default true. When false, honors[] is emitted empty on public surfaces." }, "education": { "type": "boolean", "description": "Default true. When false, education[] is emitted empty on public surfaces." }, "publications": { "type": "boolean", "description": "Default true. When false, publications[] is emitted empty on public surfaces." }, "languages": { "type": "boolean", "description": "Default true. When false, languages[] is emitted empty on public surfaces." }, "courses": { "type": "boolean", "description": "Default true. When false, courses[] is emitted empty on public surfaces." }, "patents": { "type": "boolean", "description": "Default true. When false, patents[] is emitted empty on public surfaces." }, "testScores": { "type": "boolean", "description": "Default true. When false, testScores[] is emitted empty on public surfaces." }, "recommendations": { "type": "boolean", "description": "Default true. When false, recommendations[] is emitted empty on public surfaces." }, "contact": { "type": "boolean", "description": "Default true. When false, the contact section (email, formUrl) is emitted empty on public surfaces." } } }, "ActivitySettings": { "type": "object", "additionalProperties": false, "description": "Opt-in developer-activity dashboard configuration (GitHub / WakaTime). Only the owner-curated settings live here; secrets are provisioned out of band and the synced metrics are stored in a separate document, never in takuhon.json.", "properties": { "enabled": { "type": "boolean", "default": false, "description": "Master switch. When false (the default), the activity section is not rendered even if a snapshot exists." }, "github": { "type": "object", "additionalProperties": false, "required": ["username"], "properties": { "username": { "type": "string", "minLength": 1, "maxLength": 39, "description": "GitHub login whose public activity is summarized." }, "showLanguages": { "type": "boolean", "default": true }, "showContributions": { "type": "boolean", "default": true } } }, "wakatime": { "type": "object", "additionalProperties": false, "required": ["username"], "properties": { "username": { "type": "string", "minLength": 1, "maxLength": 255, "description": "WakaTime username whose coding-time stats are summarized." }, "showCodingTime": { "type": "boolean", "default": true } } }, "showRank": { "type": "boolean", "default": true, "description": "Display the derived activity rank / badge." }, "refreshHintHours": { "type": "integer", "minimum": 1, "maximum": 168, "description": "Advisory refresh cadence in hours. The real cadence is how often the sync step (CLI command or scheduled job) runs." } } }, "Meta": { "type": "object", "additionalProperties": true, "required": ["contentLicense"], "properties": { "createdAt": { "$ref": "#/$defs/IsoDateTime" }, "updatedAt": { "$ref": "#/$defs/IsoDateTime" }, "generator": { "type": "string", "minLength": 1, "maxLength": 100, "description": "Tool that produced this document (e.g. 'Takuhon', 'create-takuhon@0.1.0')." }, "contentLicense": { "$ref": "#/$defs/ContentLicense" }, "privacy": { "$ref": "#/$defs/MetaPrivacy" } } }, "ContentLicense": { "type": "object", "additionalProperties": false, "required": ["spdxId"], "properties": { "spdxId": { "type": "string", "minLength": 1, "maxLength": 64, "description": "SPDX identifier (e.g., 'CC-BY-4.0', 'CC0-1.0') or 'Proprietary'. No default; the profile owner must choose explicitly." }, "url": { "$ref": "#/$defs/Url" }, "attribution": { "type": "object", "additionalProperties": false, "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 200 }, "url": { "$ref": "#/$defs/Url" } } }, "rights": { "type": "string", "minLength": 1, "maxLength": 1e3, "description": "Free-form rights statement (used when spdxId='Proprietary' or for additional notices)." } } }, "MetaPrivacy": { "type": "object", "additionalProperties": true, "description": "Opt-out flags that strip personally identifying fields from public API output (GET /api/profile, /api/jsonld, /takuhon.json). Admin endpoints (PUT /api/admin/*, GET /api/admin/export) ignore these flags. Privacy-by-default: omitting the object or individual flags is equivalent to true.", "properties": { "hideCredentialIds": { "type": "boolean", "default": true, "description": "When true (default), strip certifications[*].credentialId from public responses." }, "hideEducationGrades": { "type": "boolean", "default": true, "description": "When true (default), strip education[*].grade from public responses." } } }, "Certification": { "type": "object", "additionalProperties": true, "required": ["id", "title", "issuingOrganization", "issueDate"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "issuingOrganization": { "$ref": "#/$defs/LocalizedTitle" }, "issueDate": { "$ref": "#/$defs/YearMonth" }, "expirationDate": { "anyOf": [{ "$ref": "#/$defs/YearMonth" }, { "type": "null" }], "description": "null = explicitly 'no expiration'. Omit if unknown/unstated." }, "credentialId": { "type": "string", "minLength": 1, "maxLength": 100, "description": "License or certificate number. Public exposure controlled by meta.privacy.hideCredentialIds." }, "url": { "$ref": "#/$defs/Url" }, "order": { "type": "integer", "minimum": 0 } } }, "Membership": { "type": "object", "additionalProperties": true, "required": ["id", "organization", "startDate"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "organization": { "$ref": "#/$defs/LocalizedTitle" }, "role": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "startDate": { "$ref": "#/$defs/YearMonth" }, "endDate": { "anyOf": [{ "$ref": "#/$defs/YearMonth" }, { "type": "null" }], "description": "null = ongoing. Omit if unknown." }, "isCurrent": { "type": "boolean" }, "url": { "$ref": "#/$defs/Url" }, "order": { "type": "integer", "minimum": 0 } } }, "Volunteering": { "type": "object", "additionalProperties": true, "required": ["id", "organization", "role", "startDate"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "organization": { "$ref": "#/$defs/LocalizedTitle" }, "role": { "$ref": "#/$defs/LocalizedTitle" }, "cause": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "startDate": { "$ref": "#/$defs/YearMonth" }, "endDate": { "anyOf": [{ "$ref": "#/$defs/YearMonth" }, { "type": "null" }] }, "isCurrent": { "type": "boolean" }, "url": { "$ref": "#/$defs/Url" }, "order": { "type": "integer", "minimum": 0 } } }, "Honor": { "type": "object", "additionalProperties": true, "required": ["id", "title", "issuer", "date"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "issuer": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "date": { "$ref": "#/$defs/YearMonth" }, "url": { "$ref": "#/$defs/Url" }, "order": { "type": "integer", "minimum": 0 } } }, "Education": { "type": "object", "additionalProperties": true, "required": ["id", "institution", "startDate"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "institution": { "$ref": "#/$defs/LocalizedTitle" }, "degree": { "$ref": "#/$defs/LocalizedTitle" }, "fieldOfStudy": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "grade": { "type": "string", "minLength": 1, "maxLength": 50, "description": "Free-form grade / class / GPA. Public exposure controlled by meta.privacy.hideEducationGrades." }, "startDate": { "$ref": "#/$defs/YearMonth" }, "endDate": { "anyOf": [{ "$ref": "#/$defs/YearMonth" }, { "type": "null" }], "description": "null = currently enrolled." }, "isCurrent": { "type": "boolean" }, "url": { "$ref": "#/$defs/Url" }, "order": { "type": "integer", "minimum": 0 } } }, "Publication": { "type": "object", "additionalProperties": true, "required": ["id", "title", "date"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "publisher": { "$ref": "#/$defs/LocalizedTitle" }, "description": { "$ref": "#/$defs/LocalizedBody" }, "date": { "$ref": "#/$defs/YearMonth" }, "url": { "$ref": "#/$defs/Url" }, "doi": { "type": "string", "minLength": 1, "maxLength": 200, "description": "DOI identifier (e.g. '10.1145/3548643.3548644'). The full URL goes in 'url'." }, "coAuthors": { "type": "array", "maxItems": 50, "items": { "type": "string", "minLength": 1, "maxLength": 100 }, "description": "Co-author names in original script. Excludes the profile owner." }, "order": { "type": "integer", "minimum": 0 } } }, "Language": { "type": "object", "additionalProperties": true, "required": ["id", "language", "proficiency"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "language": { "$ref": "#/$defs/LocaleTag" }, "displayName": { "$ref": "#/$defs/LocalizedTitle" }, "proficiency": { "type": "string", "enum": ["native", "fluent", "professional", "intermediate", "basic"], "description": "LinkedIn-compatible 5-level proficiency." }, "order": { "type": "integer", "minimum": 0 } } }, "Course": { "type": "object", "additionalProperties": true, "required": ["id", "title"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "provider": { "$ref": "#/$defs/LocalizedTitle" }, "courseNumber": { "type": "string", "minLength": 1, "maxLength": 50 }, "description": { "$ref": "#/$defs/LocalizedBody" }, "completionDate": { "$ref": "#/$defs/YearMonth" }, "certificateUrl": { "$ref": "#/$defs/Url" }, "relatedEducationId": { "$ref": "#/$defs/Slug", "description": "Optional reference to an education[].id (e.g. for university coursework)." }, "order": { "type": "integer", "minimum": 0 } } }, "Patent": { "type": "object", "additionalProperties": true, "required": ["id", "title", "patentNumber", "status"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "patentNumber": { "type": "string", "minLength": 1, "maxLength": 100 }, "office": { "type": "string", "maxLength": 100, "description": "Patent office name (e.g. 'USPTO', 'JPO', 'EPO')." }, "status": { "type": "string", "enum": ["pending", "issued", "expired", "abandoned"] }, "description": { "$ref": "#/$defs/LocalizedBody" }, "filingDate": { "$ref": "#/$defs/YearMonth" }, "grantDate": { "$ref": "#/$defs/YearMonth" }, "url": { "$ref": "#/$defs/Url" }, "coInventors": { "type": "array", "maxItems": 20, "items": { "type": "string", "minLength": 1, "maxLength": 100 } }, "order": { "type": "integer", "minimum": 0 } } }, "TestScore": { "type": "object", "additionalProperties": true, "required": ["id", "title", "score", "date"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "title": { "$ref": "#/$defs/LocalizedTitle" }, "score": { "type": "string", "minLength": 1, "maxLength": 50, "description": "Free-form score string (e.g. '112 / 120', '330', 'N1 Pass', or a percentile). The validator does not interpret its contents." }, "date": { "$ref": "#/$defs/YearMonth" }, "relatedEducationId": { "$ref": "#/$defs/Slug", "description": "Optional reference to an education[].id (e.g. for a university course exam)." }, "description": { "$ref": "#/$defs/LocalizedBody" }, "url": { "$ref": "#/$defs/Url" }, "order": { "type": "integer", "minimum": 0 } } }, "Recommendation": { "type": "object", "additionalProperties": true, "required": ["id", "body", "author"], "properties": { "id": { "$ref": "#/$defs/Slug" }, "body": { "$ref": "#/$defs/LocalizedBody" }, "author": { "$ref": "#/$defs/RecommendationAuthor" }, "relationship": { "$ref": "#/$defs/LocalizedTitle", "description": "How the recommender relates to the profile owner (e.g. 'managed directly', 'worked together')." }, "date": { "$ref": "#/$defs/YearMonth" }, "relatedCareerId": { "$ref": "#/$defs/Slug", "description": "Optional reference to a careers[].id (the position the recommendation pertains to)." }, "relatedEducationId": { "$ref": "#/$defs/Slug", "description": "Optional reference to an education[].id (e.g. a recommendation from a professor)." }, "order": { "type": "integer", "minimum": 0 } } }, "RecommendationAuthor": { "type": "object", "additionalProperties": true, "required": ["name"], "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 100, "description": "Recommender's name, in its original script. Owner-curated; takuhon does not verify it." }, "headline": { "$ref": "#/$defs/LocalizedTitle", "description": "Recommender's title / role / organization at the time of the recommendation." }, "url": { "$ref": "#/$defs/Url", "description": "Link to the recommender's profile, for external verification by the reader." } } } } };
|
|
309
309
|
var func1 = Object.prototype.hasOwnProperty;
|
|
310
310
|
var pattern4 = new RegExp("^[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9.-]+)?$", "u");
|
|
311
311
|
var pattern5 = new RegExp("^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$", "u");
|
|
@@ -7947,6 +7947,7 @@ var require_takuhon_validator = __commonJS({
|
|
|
7947
7947
|
return errors === 0;
|
|
7948
7948
|
}
|
|
7949
7949
|
validate60.evaluated = { "props": true, "dynamicProps": false, "dynamicItems": false };
|
|
7950
|
+
var schema158 = { "type": "object", "additionalProperties": false, "description": "Per-section public visibility (added in 0.6.0). Each key is a content section; setting it to false hides that whole section from every public surface (GET /, /api/profile, /api/jsonld, /takuhon.json, MCP, and the derived CV) via the shared applyPublicPrivacyFilter. An absent key \u2014 or an absent object \u2014 means the section is public, so the default is all-visible and omitting this block is fully backwards-compatible. The profile identity (profile.displayName, \u2026) is always public and is intentionally not a key here. Field-level controls (contact.showEmail, meta.privacy.*) still apply within a visible section: visibility is the AND of the feature toggle, this section flag, and the field flag.", "properties": { "links": { "type": "boolean", "description": "Default true. When false, links[] is emitted empty on public surfaces." }, "careers": { "type": "boolean", "description": "Default true. When false, careers[] is emitted empty on public surfaces." }, "projects": { "type": "boolean", "description": "Default true. When false, projects[] is emitted empty on public surfaces." }, "skills": { "type": "boolean", "description": "Default true. When false, skills[] is emitted empty on public surfaces." }, "certifications": { "type": "boolean", "description": "Default true. When false, certifications[] is emitted empty on public surfaces." }, "memberships": { "type": "boolean", "description": "Default true. When false, memberships[] is emitted empty on public surfaces." }, "volunteering": { "type": "boolean", "description": "Default true. When false, volunteering[] is emitted empty on public surfaces." }, "honors": { "type": "boolean", "description": "Default true. When false, honors[] is emitted empty on public surfaces." }, "education": { "type": "boolean", "description": "Default true. When false, education[] is emitted empty on public surfaces." }, "publications": { "type": "boolean", "description": "Default true. When false, publications[] is emitted empty on public surfaces." }, "languages": { "type": "boolean", "description": "Default true. When false, languages[] is emitted empty on public surfaces." }, "courses": { "type": "boolean", "description": "Default true. When false, courses[] is emitted empty on public surfaces." }, "patents": { "type": "boolean", "description": "Default true. When false, patents[] is emitted empty on public surfaces." }, "testScores": { "type": "boolean", "description": "Default true. When false, testScores[] is emitted empty on public surfaces." }, "recommendations": { "type": "boolean", "description": "Default true. When false, recommendations[] is emitted empty on public surfaces." }, "contact": { "type": "boolean", "description": "Default true. When false, the contact section (email, formUrl) is emitted empty on public surfaces." } } };
|
|
7950
7951
|
var func0 = require_equal().default;
|
|
7951
7952
|
function validate62(data, { instancePath = "", parentData, parentDataProperty, rootData = data, dynamicAnchors = {} } = {}) {
|
|
7952
7953
|
let vErrors = null;
|
|
@@ -8461,12 +8462,212 @@ var require_takuhon_validator = __commonJS({
|
|
|
8461
8462
|
errors++;
|
|
8462
8463
|
}
|
|
8463
8464
|
}
|
|
8465
|
+
if (data.publicVisibility !== void 0) {
|
|
8466
|
+
let data20 = data.publicVisibility;
|
|
8467
|
+
if (data20 && typeof data20 == "object" && !Array.isArray(data20)) {
|
|
8468
|
+
for (const key3 in data20) {
|
|
8469
|
+
if (!func1.call(schema158.properties, key3)) {
|
|
8470
|
+
const err47 = { instancePath: instancePath + "/publicVisibility", schemaPath: "#/$defs/PublicVisibility/additionalProperties", keyword: "additionalProperties", params: { additionalProperty: key3 }, message: "must NOT have additional properties" };
|
|
8471
|
+
if (vErrors === null) {
|
|
8472
|
+
vErrors = [err47];
|
|
8473
|
+
} else {
|
|
8474
|
+
vErrors.push(err47);
|
|
8475
|
+
}
|
|
8476
|
+
errors++;
|
|
8477
|
+
}
|
|
8478
|
+
}
|
|
8479
|
+
if (data20.links !== void 0) {
|
|
8480
|
+
if (typeof data20.links !== "boolean") {
|
|
8481
|
+
const err48 = { instancePath: instancePath + "/publicVisibility/links", schemaPath: "#/$defs/PublicVisibility/properties/links/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8482
|
+
if (vErrors === null) {
|
|
8483
|
+
vErrors = [err48];
|
|
8484
|
+
} else {
|
|
8485
|
+
vErrors.push(err48);
|
|
8486
|
+
}
|
|
8487
|
+
errors++;
|
|
8488
|
+
}
|
|
8489
|
+
}
|
|
8490
|
+
if (data20.careers !== void 0) {
|
|
8491
|
+
if (typeof data20.careers !== "boolean") {
|
|
8492
|
+
const err49 = { instancePath: instancePath + "/publicVisibility/careers", schemaPath: "#/$defs/PublicVisibility/properties/careers/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8493
|
+
if (vErrors === null) {
|
|
8494
|
+
vErrors = [err49];
|
|
8495
|
+
} else {
|
|
8496
|
+
vErrors.push(err49);
|
|
8497
|
+
}
|
|
8498
|
+
errors++;
|
|
8499
|
+
}
|
|
8500
|
+
}
|
|
8501
|
+
if (data20.projects !== void 0) {
|
|
8502
|
+
if (typeof data20.projects !== "boolean") {
|
|
8503
|
+
const err50 = { instancePath: instancePath + "/publicVisibility/projects", schemaPath: "#/$defs/PublicVisibility/properties/projects/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8504
|
+
if (vErrors === null) {
|
|
8505
|
+
vErrors = [err50];
|
|
8506
|
+
} else {
|
|
8507
|
+
vErrors.push(err50);
|
|
8508
|
+
}
|
|
8509
|
+
errors++;
|
|
8510
|
+
}
|
|
8511
|
+
}
|
|
8512
|
+
if (data20.skills !== void 0) {
|
|
8513
|
+
if (typeof data20.skills !== "boolean") {
|
|
8514
|
+
const err51 = { instancePath: instancePath + "/publicVisibility/skills", schemaPath: "#/$defs/PublicVisibility/properties/skills/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8515
|
+
if (vErrors === null) {
|
|
8516
|
+
vErrors = [err51];
|
|
8517
|
+
} else {
|
|
8518
|
+
vErrors.push(err51);
|
|
8519
|
+
}
|
|
8520
|
+
errors++;
|
|
8521
|
+
}
|
|
8522
|
+
}
|
|
8523
|
+
if (data20.certifications !== void 0) {
|
|
8524
|
+
if (typeof data20.certifications !== "boolean") {
|
|
8525
|
+
const err52 = { instancePath: instancePath + "/publicVisibility/certifications", schemaPath: "#/$defs/PublicVisibility/properties/certifications/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8526
|
+
if (vErrors === null) {
|
|
8527
|
+
vErrors = [err52];
|
|
8528
|
+
} else {
|
|
8529
|
+
vErrors.push(err52);
|
|
8530
|
+
}
|
|
8531
|
+
errors++;
|
|
8532
|
+
}
|
|
8533
|
+
}
|
|
8534
|
+
if (data20.memberships !== void 0) {
|
|
8535
|
+
if (typeof data20.memberships !== "boolean") {
|
|
8536
|
+
const err53 = { instancePath: instancePath + "/publicVisibility/memberships", schemaPath: "#/$defs/PublicVisibility/properties/memberships/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8537
|
+
if (vErrors === null) {
|
|
8538
|
+
vErrors = [err53];
|
|
8539
|
+
} else {
|
|
8540
|
+
vErrors.push(err53);
|
|
8541
|
+
}
|
|
8542
|
+
errors++;
|
|
8543
|
+
}
|
|
8544
|
+
}
|
|
8545
|
+
if (data20.volunteering !== void 0) {
|
|
8546
|
+
if (typeof data20.volunteering !== "boolean") {
|
|
8547
|
+
const err54 = { instancePath: instancePath + "/publicVisibility/volunteering", schemaPath: "#/$defs/PublicVisibility/properties/volunteering/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8548
|
+
if (vErrors === null) {
|
|
8549
|
+
vErrors = [err54];
|
|
8550
|
+
} else {
|
|
8551
|
+
vErrors.push(err54);
|
|
8552
|
+
}
|
|
8553
|
+
errors++;
|
|
8554
|
+
}
|
|
8555
|
+
}
|
|
8556
|
+
if (data20.honors !== void 0) {
|
|
8557
|
+
if (typeof data20.honors !== "boolean") {
|
|
8558
|
+
const err55 = { instancePath: instancePath + "/publicVisibility/honors", schemaPath: "#/$defs/PublicVisibility/properties/honors/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8559
|
+
if (vErrors === null) {
|
|
8560
|
+
vErrors = [err55];
|
|
8561
|
+
} else {
|
|
8562
|
+
vErrors.push(err55);
|
|
8563
|
+
}
|
|
8564
|
+
errors++;
|
|
8565
|
+
}
|
|
8566
|
+
}
|
|
8567
|
+
if (data20.education !== void 0) {
|
|
8568
|
+
if (typeof data20.education !== "boolean") {
|
|
8569
|
+
const err56 = { instancePath: instancePath + "/publicVisibility/education", schemaPath: "#/$defs/PublicVisibility/properties/education/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8570
|
+
if (vErrors === null) {
|
|
8571
|
+
vErrors = [err56];
|
|
8572
|
+
} else {
|
|
8573
|
+
vErrors.push(err56);
|
|
8574
|
+
}
|
|
8575
|
+
errors++;
|
|
8576
|
+
}
|
|
8577
|
+
}
|
|
8578
|
+
if (data20.publications !== void 0) {
|
|
8579
|
+
if (typeof data20.publications !== "boolean") {
|
|
8580
|
+
const err57 = { instancePath: instancePath + "/publicVisibility/publications", schemaPath: "#/$defs/PublicVisibility/properties/publications/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8581
|
+
if (vErrors === null) {
|
|
8582
|
+
vErrors = [err57];
|
|
8583
|
+
} else {
|
|
8584
|
+
vErrors.push(err57);
|
|
8585
|
+
}
|
|
8586
|
+
errors++;
|
|
8587
|
+
}
|
|
8588
|
+
}
|
|
8589
|
+
if (data20.languages !== void 0) {
|
|
8590
|
+
if (typeof data20.languages !== "boolean") {
|
|
8591
|
+
const err58 = { instancePath: instancePath + "/publicVisibility/languages", schemaPath: "#/$defs/PublicVisibility/properties/languages/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8592
|
+
if (vErrors === null) {
|
|
8593
|
+
vErrors = [err58];
|
|
8594
|
+
} else {
|
|
8595
|
+
vErrors.push(err58);
|
|
8596
|
+
}
|
|
8597
|
+
errors++;
|
|
8598
|
+
}
|
|
8599
|
+
}
|
|
8600
|
+
if (data20.courses !== void 0) {
|
|
8601
|
+
if (typeof data20.courses !== "boolean") {
|
|
8602
|
+
const err59 = { instancePath: instancePath + "/publicVisibility/courses", schemaPath: "#/$defs/PublicVisibility/properties/courses/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8603
|
+
if (vErrors === null) {
|
|
8604
|
+
vErrors = [err59];
|
|
8605
|
+
} else {
|
|
8606
|
+
vErrors.push(err59);
|
|
8607
|
+
}
|
|
8608
|
+
errors++;
|
|
8609
|
+
}
|
|
8610
|
+
}
|
|
8611
|
+
if (data20.patents !== void 0) {
|
|
8612
|
+
if (typeof data20.patents !== "boolean") {
|
|
8613
|
+
const err60 = { instancePath: instancePath + "/publicVisibility/patents", schemaPath: "#/$defs/PublicVisibility/properties/patents/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8614
|
+
if (vErrors === null) {
|
|
8615
|
+
vErrors = [err60];
|
|
8616
|
+
} else {
|
|
8617
|
+
vErrors.push(err60);
|
|
8618
|
+
}
|
|
8619
|
+
errors++;
|
|
8620
|
+
}
|
|
8621
|
+
}
|
|
8622
|
+
if (data20.testScores !== void 0) {
|
|
8623
|
+
if (typeof data20.testScores !== "boolean") {
|
|
8624
|
+
const err61 = { instancePath: instancePath + "/publicVisibility/testScores", schemaPath: "#/$defs/PublicVisibility/properties/testScores/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8625
|
+
if (vErrors === null) {
|
|
8626
|
+
vErrors = [err61];
|
|
8627
|
+
} else {
|
|
8628
|
+
vErrors.push(err61);
|
|
8629
|
+
}
|
|
8630
|
+
errors++;
|
|
8631
|
+
}
|
|
8632
|
+
}
|
|
8633
|
+
if (data20.recommendations !== void 0) {
|
|
8634
|
+
if (typeof data20.recommendations !== "boolean") {
|
|
8635
|
+
const err62 = { instancePath: instancePath + "/publicVisibility/recommendations", schemaPath: "#/$defs/PublicVisibility/properties/recommendations/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8636
|
+
if (vErrors === null) {
|
|
8637
|
+
vErrors = [err62];
|
|
8638
|
+
} else {
|
|
8639
|
+
vErrors.push(err62);
|
|
8640
|
+
}
|
|
8641
|
+
errors++;
|
|
8642
|
+
}
|
|
8643
|
+
}
|
|
8644
|
+
if (data20.contact !== void 0) {
|
|
8645
|
+
if (typeof data20.contact !== "boolean") {
|
|
8646
|
+
const err63 = { instancePath: instancePath + "/publicVisibility/contact", schemaPath: "#/$defs/PublicVisibility/properties/contact/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
|
|
8647
|
+
if (vErrors === null) {
|
|
8648
|
+
vErrors = [err63];
|
|
8649
|
+
} else {
|
|
8650
|
+
vErrors.push(err63);
|
|
8651
|
+
}
|
|
8652
|
+
errors++;
|
|
8653
|
+
}
|
|
8654
|
+
}
|
|
8655
|
+
} else {
|
|
8656
|
+
const err64 = { instancePath: instancePath + "/publicVisibility", schemaPath: "#/$defs/PublicVisibility/type", keyword: "type", params: { type: "object" }, message: "must be object" };
|
|
8657
|
+
if (vErrors === null) {
|
|
8658
|
+
vErrors = [err64];
|
|
8659
|
+
} else {
|
|
8660
|
+
vErrors.push(err64);
|
|
8661
|
+
}
|
|
8662
|
+
errors++;
|
|
8663
|
+
}
|
|
8664
|
+
}
|
|
8464
8665
|
} else {
|
|
8465
|
-
const
|
|
8666
|
+
const err65 = { instancePath, schemaPath: "#/type", keyword: "type", params: { type: "object" }, message: "must be object" };
|
|
8466
8667
|
if (vErrors === null) {
|
|
8467
|
-
vErrors = [
|
|
8668
|
+
vErrors = [err65];
|
|
8468
8669
|
} else {
|
|
8469
|
-
vErrors.push(
|
|
8670
|
+
vErrors.push(err65);
|
|
8470
8671
|
}
|
|
8471
8672
|
errors++;
|
|
8472
8673
|
}
|
|
@@ -9451,7 +9652,7 @@ var require_takuhon_validator = __commonJS({
|
|
|
9451
9652
|
// takuhon.schema.json
|
|
9452
9653
|
var takuhon_schema_default = {
|
|
9453
9654
|
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
9454
|
-
$id: "https://takuhon.example/schemas/0.
|
|
9655
|
+
$id: "https://takuhon.example/schemas/0.6.0/takuhon.schema.json",
|
|
9455
9656
|
title: "Takuhon Profile",
|
|
9456
9657
|
description: "Portable profile data format consumed by @takuhon/core. The canonical contract for profile content authored as takuhon.json.",
|
|
9457
9658
|
type: "object",
|
|
@@ -9811,7 +10012,79 @@ var takuhon_schema_default = {
|
|
|
9811
10012
|
default: false,
|
|
9812
10013
|
description: "Opt-in flag for first-party analytics. Default is false to keep takuhon privacy-respecting by default."
|
|
9813
10014
|
},
|
|
9814
|
-
activity: { $ref: "#/$defs/ActivitySettings" }
|
|
10015
|
+
activity: { $ref: "#/$defs/ActivitySettings" },
|
|
10016
|
+
publicVisibility: { $ref: "#/$defs/PublicVisibility" }
|
|
10017
|
+
}
|
|
10018
|
+
},
|
|
10019
|
+
PublicVisibility: {
|
|
10020
|
+
type: "object",
|
|
10021
|
+
additionalProperties: false,
|
|
10022
|
+
description: "Per-section public visibility (added in 0.6.0). Each key is a content section; setting it to false hides that whole section from every public surface (GET /, /api/profile, /api/jsonld, /takuhon.json, MCP, and the derived CV) via the shared applyPublicPrivacyFilter. An absent key \u2014 or an absent object \u2014 means the section is public, so the default is all-visible and omitting this block is fully backwards-compatible. The profile identity (profile.displayName, \u2026) is always public and is intentionally not a key here. Field-level controls (contact.showEmail, meta.privacy.*) still apply within a visible section: visibility is the AND of the feature toggle, this section flag, and the field flag.",
|
|
10023
|
+
properties: {
|
|
10024
|
+
links: {
|
|
10025
|
+
type: "boolean",
|
|
10026
|
+
description: "Default true. When false, links[] is emitted empty on public surfaces."
|
|
10027
|
+
},
|
|
10028
|
+
careers: {
|
|
10029
|
+
type: "boolean",
|
|
10030
|
+
description: "Default true. When false, careers[] is emitted empty on public surfaces."
|
|
10031
|
+
},
|
|
10032
|
+
projects: {
|
|
10033
|
+
type: "boolean",
|
|
10034
|
+
description: "Default true. When false, projects[] is emitted empty on public surfaces."
|
|
10035
|
+
},
|
|
10036
|
+
skills: {
|
|
10037
|
+
type: "boolean",
|
|
10038
|
+
description: "Default true. When false, skills[] is emitted empty on public surfaces."
|
|
10039
|
+
},
|
|
10040
|
+
certifications: {
|
|
10041
|
+
type: "boolean",
|
|
10042
|
+
description: "Default true. When false, certifications[] is emitted empty on public surfaces."
|
|
10043
|
+
},
|
|
10044
|
+
memberships: {
|
|
10045
|
+
type: "boolean",
|
|
10046
|
+
description: "Default true. When false, memberships[] is emitted empty on public surfaces."
|
|
10047
|
+
},
|
|
10048
|
+
volunteering: {
|
|
10049
|
+
type: "boolean",
|
|
10050
|
+
description: "Default true. When false, volunteering[] is emitted empty on public surfaces."
|
|
10051
|
+
},
|
|
10052
|
+
honors: {
|
|
10053
|
+
type: "boolean",
|
|
10054
|
+
description: "Default true. When false, honors[] is emitted empty on public surfaces."
|
|
10055
|
+
},
|
|
10056
|
+
education: {
|
|
10057
|
+
type: "boolean",
|
|
10058
|
+
description: "Default true. When false, education[] is emitted empty on public surfaces."
|
|
10059
|
+
},
|
|
10060
|
+
publications: {
|
|
10061
|
+
type: "boolean",
|
|
10062
|
+
description: "Default true. When false, publications[] is emitted empty on public surfaces."
|
|
10063
|
+
},
|
|
10064
|
+
languages: {
|
|
10065
|
+
type: "boolean",
|
|
10066
|
+
description: "Default true. When false, languages[] is emitted empty on public surfaces."
|
|
10067
|
+
},
|
|
10068
|
+
courses: {
|
|
10069
|
+
type: "boolean",
|
|
10070
|
+
description: "Default true. When false, courses[] is emitted empty on public surfaces."
|
|
10071
|
+
},
|
|
10072
|
+
patents: {
|
|
10073
|
+
type: "boolean",
|
|
10074
|
+
description: "Default true. When false, patents[] is emitted empty on public surfaces."
|
|
10075
|
+
},
|
|
10076
|
+
testScores: {
|
|
10077
|
+
type: "boolean",
|
|
10078
|
+
description: "Default true. When false, testScores[] is emitted empty on public surfaces."
|
|
10079
|
+
},
|
|
10080
|
+
recommendations: {
|
|
10081
|
+
type: "boolean",
|
|
10082
|
+
description: "Default true. When false, recommendations[] is emitted empty on public surfaces."
|
|
10083
|
+
},
|
|
10084
|
+
contact: {
|
|
10085
|
+
type: "boolean",
|
|
10086
|
+
description: "Default true. When false, the contact section (email, formUrl) is emitted empty on public surfaces."
|
|
10087
|
+
}
|
|
9815
10088
|
}
|
|
9816
10089
|
},
|
|
9817
10090
|
ActivitySettings: {
|
|
@@ -10195,7 +10468,14 @@ var schema = takuhon_schema_default;
|
|
|
10195
10468
|
|
|
10196
10469
|
// src/validate.ts
|
|
10197
10470
|
var import_takuhon_validator = __toESM(require_takuhon_validator(), 1);
|
|
10198
|
-
var SUPPORTED_SCHEMA_VERSIONS = [
|
|
10471
|
+
var SUPPORTED_SCHEMA_VERSIONS = [
|
|
10472
|
+
"0.1.0",
|
|
10473
|
+
"0.2.0",
|
|
10474
|
+
"0.3.0",
|
|
10475
|
+
"0.4.0",
|
|
10476
|
+
"0.5.0",
|
|
10477
|
+
"0.6.0"
|
|
10478
|
+
];
|
|
10199
10479
|
function validate(data) {
|
|
10200
10480
|
if (typeof data !== "object" || data === null || Array.isArray(data)) {
|
|
10201
10481
|
return {
|
|
@@ -11164,25 +11444,55 @@ function importTakuhon(data) {
|
|
|
11164
11444
|
}
|
|
11165
11445
|
|
|
11166
11446
|
// src/privacy-filter.ts
|
|
11447
|
+
var SECTION_ARRAY_KEYS = [
|
|
11448
|
+
"links",
|
|
11449
|
+
"careers",
|
|
11450
|
+
"projects",
|
|
11451
|
+
"skills",
|
|
11452
|
+
"certifications",
|
|
11453
|
+
"memberships",
|
|
11454
|
+
"volunteering",
|
|
11455
|
+
"honors",
|
|
11456
|
+
"education",
|
|
11457
|
+
"publications",
|
|
11458
|
+
"languages",
|
|
11459
|
+
"courses",
|
|
11460
|
+
"patents",
|
|
11461
|
+
"testScores",
|
|
11462
|
+
"recommendations"
|
|
11463
|
+
];
|
|
11167
11464
|
function applyPublicPrivacyFilter(profile) {
|
|
11168
|
-
const
|
|
11169
|
-
const
|
|
11170
|
-
const
|
|
11171
|
-
const
|
|
11172
|
-
const
|
|
11173
|
-
const
|
|
11174
|
-
|
|
11465
|
+
const p = profile;
|
|
11466
|
+
const visibility = p.settings.publicVisibility;
|
|
11467
|
+
const hiddenArrays = visibility ? SECTION_ARRAY_KEYS.filter((key) => visibility[key] === false && p[key].length > 0) : [];
|
|
11468
|
+
const hideContactSection = visibility?.contact === false && Object.keys(p.contact).length > 0;
|
|
11469
|
+
const certificationsHidden = visibility?.certifications === false;
|
|
11470
|
+
const educationHidden = visibility?.education === false;
|
|
11471
|
+
const hideCredentialIds = p.meta.privacy?.hideCredentialIds !== false;
|
|
11472
|
+
const hideEducationGrades = p.meta.privacy?.hideEducationGrades !== false;
|
|
11473
|
+
const allowEmail = p.contact.showEmail === true;
|
|
11474
|
+
const stripCertifications = !certificationsHidden && hideCredentialIds && hasAnyCredentialId(p);
|
|
11475
|
+
const stripEducation = !educationHidden && hideEducationGrades && hasAnyGrade(p);
|
|
11476
|
+
const stripEmail = !hideContactSection && !allowEmail && p.contact.email !== void 0;
|
|
11477
|
+
if (hiddenArrays.length === 0 && !hideContactSection && !stripCertifications && !stripEducation && !stripEmail) {
|
|
11175
11478
|
return profile;
|
|
11176
11479
|
}
|
|
11177
11480
|
const out = { ...profile };
|
|
11481
|
+
const arrays = out;
|
|
11482
|
+
for (const key of hiddenArrays) {
|
|
11483
|
+
arrays[key] = [];
|
|
11484
|
+
}
|
|
11485
|
+
if (hideContactSection) {
|
|
11486
|
+
out.contact = {};
|
|
11487
|
+
}
|
|
11178
11488
|
if (stripCertifications) {
|
|
11179
|
-
out.certifications =
|
|
11489
|
+
out.certifications = out.certifications.map(stripCredentialId);
|
|
11180
11490
|
}
|
|
11181
11491
|
if (stripEducation) {
|
|
11182
|
-
out.education =
|
|
11492
|
+
out.education = out.education.map(stripGrade);
|
|
11183
11493
|
}
|
|
11184
11494
|
if (stripEmail) {
|
|
11185
|
-
const { email: _omit, ...rest } =
|
|
11495
|
+
const { email: _omit, ...rest } = out.contact;
|
|
11186
11496
|
out.contact = rest;
|
|
11187
11497
|
}
|
|
11188
11498
|
return out;
|
|
@@ -11285,12 +11595,25 @@ var v0_4_0_to_v0_5_0 = {
|
|
|
11285
11595
|
}
|
|
11286
11596
|
};
|
|
11287
11597
|
|
|
11598
|
+
// src/migrations/v0.5.0-to-v0.6.0.ts
|
|
11599
|
+
var v0_5_0_to_v0_6_0 = {
|
|
11600
|
+
from: "0.5.0",
|
|
11601
|
+
to: "0.6.0",
|
|
11602
|
+
migrate(data) {
|
|
11603
|
+
return {
|
|
11604
|
+
...data,
|
|
11605
|
+
schemaVersion: "0.6.0"
|
|
11606
|
+
};
|
|
11607
|
+
}
|
|
11608
|
+
};
|
|
11609
|
+
|
|
11288
11610
|
// src/migrations/index.ts
|
|
11289
11611
|
var migrations = [
|
|
11290
11612
|
v0_1_0_to_v0_2_0,
|
|
11291
11613
|
v0_2_0_to_v0_3_0,
|
|
11292
11614
|
v0_3_0_to_v0_4_0,
|
|
11293
|
-
v0_4_0_to_v0_5_0
|
|
11615
|
+
v0_4_0_to_v0_5_0,
|
|
11616
|
+
v0_5_0_to_v0_6_0
|
|
11294
11617
|
];
|
|
11295
11618
|
|
|
11296
11619
|
// src/migrate.ts
|
|
@@ -12249,7 +12572,7 @@ function stripImageMetadata(bytes, mime) {
|
|
|
12249
12572
|
}
|
|
12250
12573
|
|
|
12251
12574
|
// src/index.ts
|
|
12252
|
-
var SCHEMA_VERSION = "0.
|
|
12575
|
+
var SCHEMA_VERSION = "0.6.0";
|
|
12253
12576
|
export {
|
|
12254
12577
|
ACCEPTED_IMAGE_MIME_TYPES,
|
|
12255
12578
|
ConflictError,
|