@takuhon/vercel 1.3.0 → 1.4.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.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { PublicAppDeps } from '@takuhon/api';
1
+ import { PublicAppDeps, PublicRenderOptions } from '@takuhon/api';
2
2
  import { Hono } from 'hono';
3
3
  import { TakuhonStorage, Takuhon } from '@takuhon/core';
4
4
 
@@ -94,6 +94,13 @@ interface CreateTakuhonVercelAppOptions {
94
94
  * Rarely needed for the bundled case, where the document is always present.
95
95
  */
96
96
  fallback?: PublicAppDeps['fallback'];
97
+ /**
98
+ * First-party host composition for the profile page: renderer `slots` /
99
+ * `labels` / `omitSections` plus an optional CSP extension (see
100
+ * {@link PublicRenderOptions}). Omitted (the default) leaves the page and its
101
+ * strict CSP untouched.
102
+ */
103
+ render?: PublicRenderOptions;
97
104
  }
98
105
  /**
99
106
  * Build the Hono app for a read-only Vercel deployment.
package/dist/index.js CHANGED
@@ -1,5 +1,8 @@
1
1
  // src/index.ts
2
- import { createPublicApp, localePrefixGetPath } from "@takuhon/api";
2
+ import {
3
+ createPublicApp,
4
+ localePrefixGetPath
5
+ } from "@takuhon/api";
3
6
  import { Hono } from "hono";
4
7
 
5
8
  // src/storage.ts
@@ -68,7 +71,14 @@ var UrlTakuhonStorage = class {
68
71
  // src/index.ts
69
72
  function createTakuhonVercelApp(options) {
70
73
  const app = new Hono({ getPath: localePrefixGetPath });
71
- app.route("/", createPublicApp({ storage: options.storage, fallback: options.fallback }));
74
+ app.route(
75
+ "/",
76
+ createPublicApp({
77
+ storage: options.storage,
78
+ fallback: options.fallback,
79
+ render: options.render
80
+ })
81
+ );
72
82
  return app;
73
83
  }
74
84
  export {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/storage.ts"],"sourcesContent":["/**\n * `@takuhon/vercel` — read-only Vercel adapter for takuhon.\n *\n * Publishes a profile on Vercel by mounting the framework-agnostic public app\n * from `@takuhon/api` — the server-rendered profile page (with embedded\n * JSON-LD), the public read API (`/api/profile`, `/api/jsonld`, `/api/schema`),\n * and `GET /takuhon.json` / `/.well-known/takuhon.json` — on the Vercel\n * runtime. It carries no database, admin UI, or auth: the canonical\n * `takuhon.json` is bundled into the repository or fetched from\n * `TAKUHON_DATA_URL`, and editing happens through Git (edit, push, redeploy).\n *\n * Cloudflare-only surfaces are intentionally absent: image uploads\n * (`/assets/*`), the MCP endpoint (`/mcp`), and the activity badge / sync\n * (`/activity.svg`, cron). `createPublicApp` answers 404 for `GET /api/activity`\n * when no activity snapshot is supplied, and omits `mcp` from the discovery\n * document, so a Vercel deployment never advertises an endpoint it does not\n * host.\n */\n\nimport { createPublicApp, localePrefixGetPath, type PublicAppDeps } from '@takuhon/api';\nimport { Hono } from 'hono';\n\nexport { BundledTakuhonStorage, UrlTakuhonStorage } from './storage.js';\nexport type { UrlTakuhonStorageOptions } from './storage.js';\n\n/**\n * Options for {@link createTakuhonVercelApp}: a read-only subset of\n * {@link PublicAppDeps}. Only `storage` (required) and `fallback` (optional)\n * are accepted; `activityStorage` and `mcpPath` are deliberately omitted\n * because those surfaces are not part of a read-only Vercel deployment.\n */\nexport interface CreateTakuhonVercelAppOptions {\n /** Read-only profile source (e.g. {@link BundledTakuhonStorage}). */\n storage: PublicAppDeps['storage'];\n /**\n * Profile returned when `storage` reports {@link import('@takuhon/core').NotFoundError}.\n * Rarely needed for the bundled case, where the document is always present.\n */\n fallback?: PublicAppDeps['fallback'];\n}\n\n/**\n * Build the Hono app for a read-only Vercel deployment.\n *\n * Mount it with `hono/vercel`'s `handle` in an App Router catch-all route:\n *\n * ```ts\n * // app/[[...route]]/route.ts\n * import { createTakuhonVercelApp, BundledTakuhonStorage } from '@takuhon/vercel';\n * import { handle } from 'hono/vercel';\n * import profile from '../../takuhon.json';\n *\n * const app = createTakuhonVercelApp({ storage: new BundledTakuhonStorage(profile) });\n * export const GET = handle(app);\n * ```\n *\n * The top-level router sets the same `getPath` as the public app so that\n * locale-prefixed URLs (e.g. `/ja/api/profile`) dispatch correctly: Hono\n * flattens a `route()`d sub-app into the parent and dispatches using the\n * parent's `getPath`, so it must be set here too — setting it only inside\n * `createPublicApp` is honored for direct `app.fetch()` but not once mounted.\n */\nexport function createTakuhonVercelApp(options: CreateTakuhonVercelAppOptions): Hono {\n const app = new Hono({ getPath: localePrefixGetPath });\n app.route('/', createPublicApp({ storage: options.storage, fallback: options.fallback }));\n return app;\n}\n","/**\n * Read-only profile storage for the Vercel adapter.\n *\n * The Vercel adapter publishes a profile without a database: the canonical\n * `takuhon.json` is either bundled into the repository or fetched once from\n * `TAKUHON_DATA_URL`. Both are read-only — the public surface only ever calls\n * `getProfile()`. Writes are unsupported, so the optimistic-locking\n * `saveProfile` / `deleteProfile` methods reject; editing goes through Git\n * (edit `takuhon.json`, push, let Vercel redeploy).\n *\n * Each storage validates its document so a malformed profile fails fast — at\n * construction for the bundled case, at first request for the URL case — rather\n * than surfacing a confusing render error later.\n */\n\nimport { validate, type Takuhon, type TakuhonStorage } from '@takuhon/core';\n\n/**\n * Opaque version token for a read-only profile. Reads never use optimistic\n * locking, so a constant is sufficient (it only feeds response ETags).\n */\nconst READ_ONLY_VERSION = 'read-only';\n\n/** Raised when a write is attempted against the read-only Vercel adapter. */\nclass ReadOnlyError extends Error {\n constructor() {\n super('The Vercel adapter is read-only. Edit takuhon.json and redeploy to publish changes.');\n this.name = 'ReadOnlyError';\n }\n}\n\nfunction assertValid(profile: unknown, source: string): Takuhon {\n const result = validate(profile);\n if (!result.ok) {\n const detail = result.errors.map((e) => `${e.pointer || '/'}: ${e.message}`).join('; ');\n throw new Error(`${source} is not a valid takuhon profile: ${detail}`);\n }\n return result.data;\n}\n\n/**\n * A read-only {@link TakuhonStorage} backed by an in-memory profile document,\n * typically the repository's bundled `takuhon.json`.\n *\n * The document is validated once at construction, so an invalid profile throws\n * at cold start instead of on the first request.\n */\nexport class BundledTakuhonStorage implements TakuhonStorage {\n readonly #profile: Takuhon;\n\n constructor(profile: unknown) {\n this.#profile = assertValid(profile, 'Bundled takuhon.json');\n }\n\n getProfile(): Promise<{ data: Takuhon; version: string }> {\n return Promise.resolve({ data: this.#profile, version: READ_ONLY_VERSION });\n }\n\n saveProfile(): Promise<{ version: string }> {\n return Promise.reject(new ReadOnlyError());\n }\n\n deleteProfile(): Promise<void> {\n return Promise.reject(new ReadOnlyError());\n }\n}\n\n/** Options for {@link UrlTakuhonStorage}. */\nexport interface UrlTakuhonStorageOptions {\n /** HTTP client. Defaults to the global `fetch`. Injectable for tests. */\n fetch?: typeof fetch;\n}\n\n/**\n * A read-only {@link TakuhonStorage} that fetches the profile once from a URL\n * (`TAKUHON_DATA_URL`) and caches it for the lifetime of the serverless\n * instance. The fetch is lazy and de-duplicated: concurrent first calls share a\n * single in-flight request, and a failed fetch clears the cache so a later\n * request can retry.\n */\nexport class UrlTakuhonStorage implements TakuhonStorage {\n readonly #url: string;\n readonly #fetch: typeof fetch;\n #cached?: Promise<{ data: Takuhon; version: string }>;\n\n constructor(url: string, options?: UrlTakuhonStorageOptions) {\n this.#url = url;\n this.#fetch = options?.fetch ?? fetch;\n }\n\n getProfile(): Promise<{ data: Takuhon; version: string }> {\n this.#cached ??= this.#load().catch((e: unknown) => {\n this.#cached = undefined;\n throw e;\n });\n return this.#cached;\n }\n\n async #load(): Promise<{ data: Takuhon; version: string }> {\n const res = await this.#fetch(this.#url);\n if (!res.ok) {\n throw new Error(`Failed to fetch TAKUHON_DATA_URL (${this.#url}): HTTP ${res.status}`);\n }\n const json: unknown = await res.json();\n return { data: assertValid(json, 'TAKUHON_DATA_URL profile'), version: READ_ONLY_VERSION };\n }\n\n saveProfile(): Promise<{ version: string }> {\n return Promise.reject(new ReadOnlyError());\n }\n\n deleteProfile(): Promise<void> {\n return Promise.reject(new ReadOnlyError());\n }\n}\n"],"mappings":";AAmBA,SAAS,iBAAiB,2BAA+C;AACzE,SAAS,YAAY;;;ACLrB,SAAS,gBAAmD;AAM5D,IAAM,oBAAoB;AAG1B,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAChC,cAAc;AACZ,UAAM,qFAAqF;AAC3F,SAAK,OAAO;AAAA,EACd;AACF;AAEA,SAAS,YAAY,SAAkB,QAAyB;AAC9D,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,SAAS,OAAO,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,WAAW,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AACtF,UAAM,IAAI,MAAM,GAAG,MAAM,oCAAoC,MAAM,EAAE;AAAA,EACvE;AACA,SAAO,OAAO;AAChB;AASO,IAAM,wBAAN,MAAsD;AAAA,EAClD;AAAA,EAET,YAAY,SAAkB;AAC5B,SAAK,WAAW,YAAY,SAAS,sBAAsB;AAAA,EAC7D;AAAA,EAEA,aAA0D;AACxD,WAAO,QAAQ,QAAQ,EAAE,MAAM,KAAK,UAAU,SAAS,kBAAkB,CAAC;AAAA,EAC5E;AAAA,EAEA,cAA4C;AAC1C,WAAO,QAAQ,OAAO,IAAI,cAAc,CAAC;AAAA,EAC3C;AAAA,EAEA,gBAA+B;AAC7B,WAAO,QAAQ,OAAO,IAAI,cAAc,CAAC;AAAA,EAC3C;AACF;AAeO,IAAM,oBAAN,MAAkD;AAAA,EAC9C;AAAA,EACA;AAAA,EACT;AAAA,EAEA,YAAY,KAAa,SAAoC;AAC3D,SAAK,OAAO;AACZ,SAAK,SAAS,SAAS,SAAS;AAAA,EAClC;AAAA,EAEA,aAA0D;AACxD,SAAK,YAAY,KAAK,MAAM,EAAE,MAAM,CAAC,MAAe;AAClD,WAAK,UAAU;AACf,YAAM;AAAA,IACR,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAAqD;AACzD,UAAM,MAAM,MAAM,KAAK,OAAO,KAAK,IAAI;AACvC,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,qCAAqC,KAAK,IAAI,WAAW,IAAI,MAAM,EAAE;AAAA,IACvF;AACA,UAAM,OAAgB,MAAM,IAAI,KAAK;AACrC,WAAO,EAAE,MAAM,YAAY,MAAM,0BAA0B,GAAG,SAAS,kBAAkB;AAAA,EAC3F;AAAA,EAEA,cAA4C;AAC1C,WAAO,QAAQ,OAAO,IAAI,cAAc,CAAC;AAAA,EAC3C;AAAA,EAEA,gBAA+B;AAC7B,WAAO,QAAQ,OAAO,IAAI,cAAc,CAAC;AAAA,EAC3C;AACF;;;ADpDO,SAAS,uBAAuB,SAA8C;AACnF,QAAM,MAAM,IAAI,KAAK,EAAE,SAAS,oBAAoB,CAAC;AACrD,MAAI,MAAM,KAAK,gBAAgB,EAAE,SAAS,QAAQ,SAAS,UAAU,QAAQ,SAAS,CAAC,CAAC;AACxF,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/storage.ts"],"sourcesContent":["/**\n * `@takuhon/vercel` — read-only Vercel adapter for takuhon.\n *\n * Publishes a profile on Vercel by mounting the framework-agnostic public app\n * from `@takuhon/api` — the server-rendered profile page (with embedded\n * JSON-LD), the public read API (`/api/profile`, `/api/jsonld`, `/api/schema`),\n * and `GET /takuhon.json` / `/.well-known/takuhon.json` — on the Vercel\n * runtime. It carries no database, admin UI, or auth: the canonical\n * `takuhon.json` is bundled into the repository or fetched from\n * `TAKUHON_DATA_URL`, and editing happens through Git (edit, push, redeploy).\n *\n * Cloudflare-only surfaces are intentionally absent: image uploads\n * (`/assets/*`), the MCP endpoint (`/mcp`), and the activity badge / sync\n * (`/activity.svg`, cron). `createPublicApp` answers 404 for `GET /api/activity`\n * when no activity snapshot is supplied, and omits `mcp` from the discovery\n * document, so a Vercel deployment never advertises an endpoint it does not\n * host.\n */\n\nimport {\n createPublicApp,\n localePrefixGetPath,\n type PublicAppDeps,\n type PublicRenderOptions,\n} from '@takuhon/api';\nimport { Hono } from 'hono';\n\nexport { BundledTakuhonStorage, UrlTakuhonStorage } from './storage.js';\nexport type { UrlTakuhonStorageOptions } from './storage.js';\n\n/**\n * Options for {@link createTakuhonVercelApp}: a read-only subset of\n * {@link PublicAppDeps}. Only `storage` (required) and `fallback` (optional)\n * are accepted; `activityStorage` and `mcpPath` are deliberately omitted\n * because those surfaces are not part of a read-only Vercel deployment.\n */\nexport interface CreateTakuhonVercelAppOptions {\n /** Read-only profile source (e.g. {@link BundledTakuhonStorage}). */\n storage: PublicAppDeps['storage'];\n /**\n * Profile returned when `storage` reports {@link import('@takuhon/core').NotFoundError}.\n * Rarely needed for the bundled case, where the document is always present.\n */\n fallback?: PublicAppDeps['fallback'];\n /**\n * First-party host composition for the profile page: renderer `slots` /\n * `labels` / `omitSections` plus an optional CSP extension (see\n * {@link PublicRenderOptions}). Omitted (the default) leaves the page and its\n * strict CSP untouched.\n */\n render?: PublicRenderOptions;\n}\n\n/**\n * Build the Hono app for a read-only Vercel deployment.\n *\n * Mount it with `hono/vercel`'s `handle` in an App Router catch-all route:\n *\n * ```ts\n * // app/[[...route]]/route.ts\n * import { createTakuhonVercelApp, BundledTakuhonStorage } from '@takuhon/vercel';\n * import { handle } from 'hono/vercel';\n * import profile from '../../takuhon.json';\n *\n * const app = createTakuhonVercelApp({ storage: new BundledTakuhonStorage(profile) });\n * export const GET = handle(app);\n * ```\n *\n * The top-level router sets the same `getPath` as the public app so that\n * locale-prefixed URLs (e.g. `/ja/api/profile`) dispatch correctly: Hono\n * flattens a `route()`d sub-app into the parent and dispatches using the\n * parent's `getPath`, so it must be set here too — setting it only inside\n * `createPublicApp` is honored for direct `app.fetch()` but not once mounted.\n */\nexport function createTakuhonVercelApp(options: CreateTakuhonVercelAppOptions): Hono {\n const app = new Hono({ getPath: localePrefixGetPath });\n app.route(\n '/',\n createPublicApp({\n storage: options.storage,\n fallback: options.fallback,\n render: options.render,\n }),\n );\n return app;\n}\n","/**\n * Read-only profile storage for the Vercel adapter.\n *\n * The Vercel adapter publishes a profile without a database: the canonical\n * `takuhon.json` is either bundled into the repository or fetched once from\n * `TAKUHON_DATA_URL`. Both are read-only — the public surface only ever calls\n * `getProfile()`. Writes are unsupported, so the optimistic-locking\n * `saveProfile` / `deleteProfile` methods reject; editing goes through Git\n * (edit `takuhon.json`, push, let Vercel redeploy).\n *\n * Each storage validates its document so a malformed profile fails fast — at\n * construction for the bundled case, at first request for the URL case — rather\n * than surfacing a confusing render error later.\n */\n\nimport { validate, type Takuhon, type TakuhonStorage } from '@takuhon/core';\n\n/**\n * Opaque version token for a read-only profile. Reads never use optimistic\n * locking, so a constant is sufficient (it only feeds response ETags).\n */\nconst READ_ONLY_VERSION = 'read-only';\n\n/** Raised when a write is attempted against the read-only Vercel adapter. */\nclass ReadOnlyError extends Error {\n constructor() {\n super('The Vercel adapter is read-only. Edit takuhon.json and redeploy to publish changes.');\n this.name = 'ReadOnlyError';\n }\n}\n\nfunction assertValid(profile: unknown, source: string): Takuhon {\n const result = validate(profile);\n if (!result.ok) {\n const detail = result.errors.map((e) => `${e.pointer || '/'}: ${e.message}`).join('; ');\n throw new Error(`${source} is not a valid takuhon profile: ${detail}`);\n }\n return result.data;\n}\n\n/**\n * A read-only {@link TakuhonStorage} backed by an in-memory profile document,\n * typically the repository's bundled `takuhon.json`.\n *\n * The document is validated once at construction, so an invalid profile throws\n * at cold start instead of on the first request.\n */\nexport class BundledTakuhonStorage implements TakuhonStorage {\n readonly #profile: Takuhon;\n\n constructor(profile: unknown) {\n this.#profile = assertValid(profile, 'Bundled takuhon.json');\n }\n\n getProfile(): Promise<{ data: Takuhon; version: string }> {\n return Promise.resolve({ data: this.#profile, version: READ_ONLY_VERSION });\n }\n\n saveProfile(): Promise<{ version: string }> {\n return Promise.reject(new ReadOnlyError());\n }\n\n deleteProfile(): Promise<void> {\n return Promise.reject(new ReadOnlyError());\n }\n}\n\n/** Options for {@link UrlTakuhonStorage}. */\nexport interface UrlTakuhonStorageOptions {\n /** HTTP client. Defaults to the global `fetch`. Injectable for tests. */\n fetch?: typeof fetch;\n}\n\n/**\n * A read-only {@link TakuhonStorage} that fetches the profile once from a URL\n * (`TAKUHON_DATA_URL`) and caches it for the lifetime of the serverless\n * instance. The fetch is lazy and de-duplicated: concurrent first calls share a\n * single in-flight request, and a failed fetch clears the cache so a later\n * request can retry.\n */\nexport class UrlTakuhonStorage implements TakuhonStorage {\n readonly #url: string;\n readonly #fetch: typeof fetch;\n #cached?: Promise<{ data: Takuhon; version: string }>;\n\n constructor(url: string, options?: UrlTakuhonStorageOptions) {\n this.#url = url;\n this.#fetch = options?.fetch ?? fetch;\n }\n\n getProfile(): Promise<{ data: Takuhon; version: string }> {\n this.#cached ??= this.#load().catch((e: unknown) => {\n this.#cached = undefined;\n throw e;\n });\n return this.#cached;\n }\n\n async #load(): Promise<{ data: Takuhon; version: string }> {\n const res = await this.#fetch(this.#url);\n if (!res.ok) {\n throw new Error(`Failed to fetch TAKUHON_DATA_URL (${this.#url}): HTTP ${res.status}`);\n }\n const json: unknown = await res.json();\n return { data: assertValid(json, 'TAKUHON_DATA_URL profile'), version: READ_ONLY_VERSION };\n }\n\n saveProfile(): Promise<{ version: string }> {\n return Promise.reject(new ReadOnlyError());\n }\n\n deleteProfile(): Promise<void> {\n return Promise.reject(new ReadOnlyError());\n }\n}\n"],"mappings":";AAmBA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP,SAAS,YAAY;;;ACVrB,SAAS,gBAAmD;AAM5D,IAAM,oBAAoB;AAG1B,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAChC,cAAc;AACZ,UAAM,qFAAqF;AAC3F,SAAK,OAAO;AAAA,EACd;AACF;AAEA,SAAS,YAAY,SAAkB,QAAyB;AAC9D,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,SAAS,OAAO,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,WAAW,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AACtF,UAAM,IAAI,MAAM,GAAG,MAAM,oCAAoC,MAAM,EAAE;AAAA,EACvE;AACA,SAAO,OAAO;AAChB;AASO,IAAM,wBAAN,MAAsD;AAAA,EAClD;AAAA,EAET,YAAY,SAAkB;AAC5B,SAAK,WAAW,YAAY,SAAS,sBAAsB;AAAA,EAC7D;AAAA,EAEA,aAA0D;AACxD,WAAO,QAAQ,QAAQ,EAAE,MAAM,KAAK,UAAU,SAAS,kBAAkB,CAAC;AAAA,EAC5E;AAAA,EAEA,cAA4C;AAC1C,WAAO,QAAQ,OAAO,IAAI,cAAc,CAAC;AAAA,EAC3C;AAAA,EAEA,gBAA+B;AAC7B,WAAO,QAAQ,OAAO,IAAI,cAAc,CAAC;AAAA,EAC3C;AACF;AAeO,IAAM,oBAAN,MAAkD;AAAA,EAC9C;AAAA,EACA;AAAA,EACT;AAAA,EAEA,YAAY,KAAa,SAAoC;AAC3D,SAAK,OAAO;AACZ,SAAK,SAAS,SAAS,SAAS;AAAA,EAClC;AAAA,EAEA,aAA0D;AACxD,SAAK,YAAY,KAAK,MAAM,EAAE,MAAM,CAAC,MAAe;AAClD,WAAK,UAAU;AACf,YAAM;AAAA,IACR,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAAqD;AACzD,UAAM,MAAM,MAAM,KAAK,OAAO,KAAK,IAAI;AACvC,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,qCAAqC,KAAK,IAAI,WAAW,IAAI,MAAM,EAAE;AAAA,IACvF;AACA,UAAM,OAAgB,MAAM,IAAI,KAAK;AACrC,WAAO,EAAE,MAAM,YAAY,MAAM,0BAA0B,GAAG,SAAS,kBAAkB;AAAA,EAC3F;AAAA,EAEA,cAA4C;AAC1C,WAAO,QAAQ,OAAO,IAAI,cAAc,CAAC;AAAA,EAC3C;AAAA,EAEA,gBAA+B;AAC7B,WAAO,QAAQ,OAAO,IAAI,cAAc,CAAC;AAAA,EAC3C;AACF;;;ADxCO,SAAS,uBAAuB,SAA8C;AACnF,QAAM,MAAM,IAAI,KAAK,EAAE,SAAS,oBAAoB,CAAC;AACrD,MAAI;AAAA,IACF;AAAA,IACA,gBAAgB;AAAA,MACd,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AACA,SAAO;AACT;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takuhon/vercel",
3
- "version": "1.3.0",
3
+ "version": "1.4.1",
4
4
  "description": "Vercel adapter for takuhon — read-only public profile page, API, and JSON-LD on the Vercel runtime",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Takuhon contributors",
@@ -44,8 +44,8 @@
44
44
  },
45
45
  "dependencies": {
46
46
  "hono": "^4.12.21",
47
- "@takuhon/api": "1.3.0",
48
- "@takuhon/core": "1.3.0"
47
+ "@takuhon/api": "1.4.1",
48
+ "@takuhon/core": "1.4.1"
49
49
  },
50
50
  "scripts": {
51
51
  "typecheck": "tsc",