[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fN6zQ29ldr1vl9m-9vR0qbmmxnbkG84bg8YF70tnzlYo":3},{"id":4,"title":5,"body":6,"date":2441,"description":2442,"extension":380,"icon":2443,"meta":2444,"navigation":418,"ogImage":2445,"path":2446,"published":418,"publishedAt":2447,"seo":2448,"stem":2449,"tags":2450,"updatedAt":2454,"__hash__":2455},"tech/tech/nuxt-content-scheduled-posts.md","Nuxt Content で作ったブログの予約投稿を実装する",{"type":7,"value":8,"toc":2422},"minimark",[9,14,18,21,24,27,30,37,40,43,46,49,52,56,59,62,71,74,78,81,92,95,98,101,109,113,120,360,369,372,375,425,468,472,475,479,482,808,815,819,822,828,1567,1571,1574,1579,1666,1670,1859,1862,1866,2127,2131,2134,2228,2408,2412,2415,2418],[10,11,13],"h2",{"id":12},"intro","Intro",[15,16,17],"p",{},"「おい、今年立てた目標はなんだったか覚えているか？」",[15,19,20],{},"「覚えています。技術記事を週一ペースで更新することです...。」",[15,22,23],{},"「この記事は何本目だ？」",[15,25,26],{},"「...一本目です。」",[15,28,29],{},"「もうマクドナルドから『てりたま』が発売される季節だぞ？そもそも君は去年もそのような目標を立ててなかったか？」",[15,31,32,33,36],{},"「...はい。」",[34,35],"br",{},"\n「今年こそはやり遂げようと思ってたんですが、年始から仕事やプライベートでバタバタしていまして、気がついたらこんな時期まで何も記事を書けていませんでした...。」",[15,38,39],{},"師匠はため息をついた",[15,41,42],{},"「そうやって言い訳ばかり上手くなって。そんなんじゃいつになっても技術力が上がらないままだぞ。」",[15,44,45],{},"「...はい。おっしゃる通りです。」",[15,47,48],{},"「やれ」",[15,50,51],{},"「yes sir.」",[10,53,55],{"id":54},"overview","Overview",[15,57,58],{},"表題の通り本記事では、Nuxt Content で作ったブログに予約投稿機能を実装していきます。",[15,60,61],{},"Nuxt Content でのブログ作成については以下の記事をご覧ください。",[63,64,68],"callout",{"color":65,"icon":66,"to":67},"primary","ic:baseline-article","/tech/nuxt-content-v3-blog",[15,69,70],{},"Nuxt Content v3 + Nuxt Hub を使って爆速で個人ブログを作って公開する",[15,72,73],{},"まずは全体像から。",[75,76,77],"h3",{"id":77},"ディレクトリ構造",[15,79,80],{},"ディレクトリ構成と、それぞれの責務です。",[82,83,88],"pre",{"className":84,"code":86,"language":87},[85],"language-text","root/\n├ app\n│ ├ composables // フロント プレゼン層\n│ │ └ article\n│ │   └ index.ts\n│ └ pages\n│   └ [slug]\n│     └ index.vue\n├ content // Contents 記事を管理する\n│ └ articles\n│   └ *.md\n├ server \n│ ├ api // HTTP プレゼン層\n│ │ └ articles\n│ │   ├ [slug]\n│ │   │ └ index.get.ts // 記事詳細取得\n│ │   └ index.get.ts // 記事一覧取得\n│ └ domains\n│   ├ models // ドメイン層（Articleの概念）\n│   │ └ article\n│   │   └ index.ts\n│   └ repositories // レポジトリ層（データアクセスを抽象化する）\n│     └ article\n│       └ index.ts\n└ content.config.ts\n","text",[89,90,86],"code",{"__ignoreMap":91},"",[75,93,94],{"id":94},"方針",[15,96,97],{},"ディレクトリ構造から自明ですが、DDDに沿って実装していきます。",[15,99,100],{},"また、時刻を扱うためクライアントではなくサーバー側で記事をフィルターしていきます。",[15,102,103,104,108],{},"「",[105,106,107],"strong",{},"Nuxt Content のデータを Nuxt Server にて現在時刻をみてフィルターし、それを Composables で取得して利用する","」という流れで進めていきます。",[10,110,112],{"id":111},"collection","Collection",[15,114,115,116,119],{},"まずは ",[89,117,118],{},"content.config"," のコレクション定義から",[82,121,126],{"className":122,"code":123,"filename":124,"language":125,"meta":91,"style":91},"language-ts shiki shiki-themes material-theme-lighter github-dark-high-contrast github-dark","export default defineContentConfig({\n  collections: {\n    articles: defineCollection({\n      type: 'page',\n      source: 'articles/*.md',\n      schema: z.object({\n        title: z.string(),\n        description: z.string(),\n        date: z.date(),\n        publishedAt: z.date().optional(), // 予約投稿はこの項目の設定日時を見る\n      })\n    })\n  }\n})\n","content.config.ts","ts",[89,127,128,152,166,182,204,221,242,262,280,299,329,338,346,352],{"__ignoreMap":91},[129,130,133,137,140,144,148],"span",{"class":131,"line":132},"line",1,[129,134,136],{"class":135},"stP2V","export",[129,138,139],{"class":135}," default",[129,141,143],{"class":142},"s7KVs"," defineContentConfig",[129,145,147],{"class":146},"sipQf","(",[129,149,151],{"class":150},"sfFde","{\n",[129,153,155,159,163],{"class":131,"line":154},2,[129,156,158],{"class":157},"sLCpo","  collections",[129,160,162],{"class":161},"seLpV",":",[129,164,165],{"class":161}," {\n",[129,167,169,172,174,177,180],{"class":131,"line":168},3,[129,170,171],{"class":157},"    articles",[129,173,162],{"class":161},[129,175,176],{"class":142}," defineCollection",[129,178,147],{"class":179},"sdyPO",[129,181,151],{"class":161},[129,183,185,188,190,194,198,201],{"class":131,"line":184},4,[129,186,187],{"class":157},"      type",[129,189,162],{"class":161},[129,191,193],{"class":192},"sPUPB"," '",[129,195,197],{"class":196},"sSIes","page",[129,199,200],{"class":192},"'",[129,202,203],{"class":161},",\n",[129,205,207,210,212,214,217,219],{"class":131,"line":206},5,[129,208,209],{"class":157},"      source",[129,211,162],{"class":161},[129,213,193],{"class":192},[129,215,216],{"class":196},"articles/*.md",[129,218,200],{"class":192},[129,220,203],{"class":161},[129,222,224,227,229,232,235,238,240],{"class":131,"line":223},6,[129,225,226],{"class":157},"      schema",[129,228,162],{"class":161},[129,230,231],{"class":179}," z",[129,233,234],{"class":161},".",[129,236,237],{"class":142},"object",[129,239,147],{"class":179},[129,241,151],{"class":161},[129,243,245,248,250,252,254,257,260],{"class":131,"line":244},7,[129,246,247],{"class":157},"        title",[129,249,162],{"class":161},[129,251,231],{"class":179},[129,253,234],{"class":161},[129,255,256],{"class":142},"string",[129,258,259],{"class":179},"()",[129,261,203],{"class":161},[129,263,265,268,270,272,274,276,278],{"class":131,"line":264},8,[129,266,267],{"class":157},"        description",[129,269,162],{"class":161},[129,271,231],{"class":179},[129,273,234],{"class":161},[129,275,256],{"class":142},[129,277,259],{"class":179},[129,279,203],{"class":161},[129,281,283,286,288,290,292,295,297],{"class":131,"line":282},9,[129,284,285],{"class":157},"        date",[129,287,162],{"class":161},[129,289,231],{"class":179},[129,291,234],{"class":161},[129,293,294],{"class":142},"date",[129,296,259],{"class":179},[129,298,203],{"class":161},[129,300,302,305,307,309,311,313,315,317,320,322,325],{"class":131,"line":301},10,[129,303,304],{"class":157},"        publishedAt",[129,306,162],{"class":161},[129,308,231],{"class":179},[129,310,234],{"class":161},[129,312,294],{"class":142},[129,314,259],{"class":179},[129,316,234],{"class":161},[129,318,319],{"class":142},"optional",[129,321,259],{"class":179},[129,323,324],{"class":161},",",[129,326,328],{"class":327},"sZPSj"," // 予約投稿はこの項目の設定日時を見る\n",[129,330,332,335],{"class":131,"line":331},11,[129,333,334],{"class":161},"      }",[129,336,337],{"class":179},")\n",[129,339,341,344],{"class":131,"line":340},12,[129,342,343],{"class":161},"    }",[129,345,337],{"class":179},[129,347,349],{"class":131,"line":348},13,[129,350,351],{"class":161},"  }\n",[129,353,355,358],{"class":131,"line":354},14,[129,356,357],{"class":150},"}",[129,359,337],{"class":146},[15,361,362,365,366,368],{},[89,363,364],{},"publishedAt"," はオプショナルにしました（既存の公開済みの記事全てに ",[89,367,364],{}," を、設定するのは面倒だったので）が、その辺は都合の良いように設定してください。",[370,371],"hr",{},[15,373,374],{},"次にテスト用に何記事か追加していきます。",[82,376,381],{"className":377,"code":378,"filename":379,"language":380,"meta":91,"style":91},"language-md shiki shiki-themes material-theme-lighter github-dark-high-contrast github-dark","---\ntitle: 公開済みテスト記事\ndescritption: 公開済みのテスト記事です\ndate: 2026-03-01\npublishedAt: 2026-03-01 08:00\n---\n\n公開済みテスト記事です\n\n","~~/content/articles/hoge.md","md",[89,382,383,389,394,399,404,409,414,420],{"__ignoreMap":91},[129,384,385],{"class":131,"line":132},[129,386,388],{"class":387},"sDE9X","---\n",[129,390,391],{"class":131,"line":154},[129,392,393],{"class":179},"title: 公開済みテスト記事\n",[129,395,396],{"class":131,"line":168},[129,397,398],{"class":179},"descritption: 公開済みのテスト記事です\n",[129,400,401],{"class":131,"line":184},[129,402,403],{"class":179},"date: 2026-03-01\n",[129,405,406],{"class":131,"line":206},[129,407,408],{"class":179},"publishedAt: 2026-03-01 08:00\n",[129,410,411],{"class":131,"line":223},[129,412,388],{"class":413},"sdaUG",[129,415,416],{"class":131,"line":244},[129,417,419],{"emptyLinePlaceholder":418},true,"\n",[129,421,422],{"class":131,"line":264},[129,423,424],{"class":179},"公開済みテスト記事です\n",[82,426,429],{"className":377,"code":427,"filename":428,"language":380,"meta":91,"style":91},"---\ntitle: 公開前テスト記事\ndescritption: 公開前のテスト記事です\ndate: 2026-03-02\npublishedAt: 2026-03-02 08:00\n---\n\n公開前テスト記事です。\n","~~/content/articles/fuga.md",[89,430,431,435,440,445,450,455,459,463],{"__ignoreMap":91},[129,432,433],{"class":131,"line":132},[129,434,388],{"class":387},[129,436,437],{"class":131,"line":154},[129,438,439],{"class":179},"title: 公開前テスト記事\n",[129,441,442],{"class":131,"line":168},[129,443,444],{"class":179},"descritption: 公開前のテスト記事です\n",[129,446,447],{"class":131,"line":184},[129,448,449],{"class":179},"date: 2026-03-02\n",[129,451,452],{"class":131,"line":206},[129,453,454],{"class":179},"publishedAt: 2026-03-02 08:00\n",[129,456,457],{"class":131,"line":223},[129,458,388],{"class":413},[129,460,461],{"class":131,"line":244},[129,462,419],{"emptyLinePlaceholder":418},[129,464,465],{"class":131,"line":264},[129,466,467],{"class":179},"公開前テスト記事です。\n",[10,469,471],{"id":470},"nuxt-server","Nuxt Server",[15,473,474],{},"サーバー側にて Nuxt Content からを記事取得し、公開済み記事をフィルターしていきます。",[75,476,478],{"id":477},"repository","Repository",[15,480,481],{},"Repository では、外部リソース（今回は Nuxt Content）からのデータアクセスを抽象化します。",[82,483,486],{"className":122,"code":484,"filename":485,"language":125,"meta":91,"style":91},"import type { H3Event } from 'h3'\nimport { queryCollection } from '@nuxt/content/server'\n\nexport const findArticleBySlug = async (event: H3Event, slug: string) => {\n  const article = await queryCollection\u003C'articles'>(event, 'articles')\n    .path(`/articles/${slug}`)\n    .first()\n\n  return article\n}\n\nexport const findArticles = async (event: H3Event) => {\n  const articles = await queryCollection\u003C'articles'>(event, 'articles')\n    .order('date', 'DESC')\n    .all()\n\n  return articles\n}\n","~~/server/domains/repositories/article/index.ts",[89,487,488,515,535,539,589,632,659,669,673,681,686,690,717,754,780,790,795,803],{"__ignoreMap":91},[129,489,490,493,496,499,502,505,508,510,512],{"class":131,"line":132},[129,491,492],{"class":135},"import",[129,494,495],{"class":135}," type",[129,497,498],{"class":161}," {",[129,500,501],{"class":179}," H3Event",[129,503,504],{"class":161}," }",[129,506,507],{"class":135}," from",[129,509,193],{"class":192},[129,511,75],{"class":196},[129,513,514],{"class":192},"'\n",[129,516,517,519,521,524,526,528,530,533],{"class":131,"line":154},[129,518,492],{"class":135},[129,520,498],{"class":161},[129,522,523],{"class":179}," queryCollection",[129,525,504],{"class":161},[129,527,507],{"class":135},[129,529,193],{"class":192},[129,531,532],{"class":196},"@nuxt/content/server",[129,534,514],{"class":192},[129,536,537],{"class":131,"line":168},[129,538,419],{"emptyLinePlaceholder":418},[129,540,541,543,547,551,555,558,561,565,567,570,572,575,577,581,584,587],{"class":131,"line":184},[129,542,136],{"class":135},[129,544,546],{"class":545},"sGRfs"," const",[129,548,550],{"class":549},"s8Xov"," findArticleBySlug",[129,552,554],{"class":553},"sUBcA"," =",[129,556,557],{"class":545}," async",[129,559,560],{"class":161}," (",[129,562,564],{"class":563},"senS2","event",[129,566,162],{"class":553},[129,568,501],{"class":569},"sywW5",[129,571,324],{"class":161},[129,573,574],{"class":563}," slug",[129,576,162],{"class":553},[129,578,580],{"class":579},"snYqn"," string",[129,582,583],{"class":161},")",[129,585,586],{"class":545}," =>",[129,588,165],{"class":161},[129,590,591,594,598,600,603,605,608,610,613,615,618,620,622,624,626,628,630],{"class":131,"line":206},[129,592,593],{"class":545},"  const",[129,595,597],{"class":596},"sSuNx"," article",[129,599,554],{"class":553},[129,601,602],{"class":135}," await",[129,604,523],{"class":142},[129,606,607],{"class":161},"\u003C",[129,609,200],{"class":192},[129,611,612],{"class":196},"articles",[129,614,200],{"class":192},[129,616,617],{"class":161},">",[129,619,147],{"class":157},[129,621,564],{"class":179},[129,623,324],{"class":161},[129,625,193],{"class":192},[129,627,612],{"class":196},[129,629,200],{"class":192},[129,631,337],{"class":157},[129,633,634,637,640,642,645,648,651,654,657],{"class":131,"line":223},[129,635,636],{"class":161},"    .",[129,638,639],{"class":142},"path",[129,641,147],{"class":157},[129,643,644],{"class":192},"`",[129,646,647],{"class":196},"/articles/",[129,649,650],{"class":192},"${",[129,652,653],{"class":179},"slug",[129,655,656],{"class":192},"}`",[129,658,337],{"class":157},[129,660,661,663,666],{"class":131,"line":244},[129,662,636],{"class":161},[129,664,665],{"class":142},"first",[129,667,668],{"class":157},"()\n",[129,670,671],{"class":131,"line":264},[129,672,419],{"emptyLinePlaceholder":418},[129,674,675,678],{"class":131,"line":282},[129,676,677],{"class":135},"  return",[129,679,680],{"class":179}," article\n",[129,682,683],{"class":131,"line":301},[129,684,685],{"class":161},"}\n",[129,687,688],{"class":131,"line":331},[129,689,419],{"emptyLinePlaceholder":418},[129,691,692,694,696,699,701,703,705,707,709,711,713,715],{"class":131,"line":340},[129,693,136],{"class":135},[129,695,546],{"class":545},[129,697,698],{"class":549}," findArticles",[129,700,554],{"class":553},[129,702,557],{"class":545},[129,704,560],{"class":161},[129,706,564],{"class":563},[129,708,162],{"class":553},[129,710,501],{"class":569},[129,712,583],{"class":161},[129,714,586],{"class":545},[129,716,165],{"class":161},[129,718,719,721,724,726,728,730,732,734,736,738,740,742,744,746,748,750,752],{"class":131,"line":348},[129,720,593],{"class":545},[129,722,723],{"class":596}," articles",[129,725,554],{"class":553},[129,727,602],{"class":135},[129,729,523],{"class":142},[129,731,607],{"class":161},[129,733,200],{"class":192},[129,735,612],{"class":196},[129,737,200],{"class":192},[129,739,617],{"class":161},[129,741,147],{"class":157},[129,743,564],{"class":179},[129,745,324],{"class":161},[129,747,193],{"class":192},[129,749,612],{"class":196},[129,751,200],{"class":192},[129,753,337],{"class":157},[129,755,756,758,761,763,765,767,769,771,773,776,778],{"class":131,"line":354},[129,757,636],{"class":161},[129,759,760],{"class":142},"order",[129,762,147],{"class":157},[129,764,200],{"class":192},[129,766,294],{"class":196},[129,768,200],{"class":192},[129,770,324],{"class":161},[129,772,193],{"class":192},[129,774,775],{"class":196},"DESC",[129,777,200],{"class":192},[129,779,337],{"class":157},[129,781,783,785,788],{"class":131,"line":782},15,[129,784,636],{"class":161},[129,786,787],{"class":142},"all",[129,789,668],{"class":157},[129,791,793],{"class":131,"line":792},16,[129,794,419],{"emptyLinePlaceholder":418},[129,796,798,800],{"class":131,"line":797},17,[129,799,677],{"class":135},[129,801,802],{"class":179}," articles\n",[129,804,806],{"class":131,"line":805},18,[129,807,685],{"class":161},[15,809,810,811,814],{},"最初は、",[89,812,813],{},"queryCollection"," の where句 にて公開日時の絞り込みを行おうと考えていたのですが、日付の比較までで時刻までは比較できなそうだったのと、単一記事では where できなそうだたりで少々都合が悪かったので、モデル層にてフィルターを行うよう実装しました。",[75,816,818],{"id":817},"model","Model",[15,820,821],{},"Models では、Repository から取得したデータをドメインモデルに変換し、ビジネスロジックを提供します。",[15,823,824,825,827],{},"今回は、公開前の記事をフィルターする処理を行います。",[34,826],{},"\n日時の比較に Day.js を使用するので各自インストールお願いします。",[82,829,832],{"className":122,"code":830,"filename":831,"language":125,"meta":91,"style":91},"import type { H3Event } from 'h3'\nimport type { ArticleCollectionItem } from '@nuxt/content'\nimport dayjs from 'dayjs/esm'\nimport utc from 'dayjs/esm/plugin/utc'\nimport timezone from 'dayjs/esm/plugin/timezone'\nimport isSameOrAfter from 'dayjs/esm/plugin/isSameOrAfter'\nimport { findArticleBySlug, findArticles } from '~~/server/domains/repositories/article'\n\ndayjs.extend(utc)\ndayjs.extend(timezone)\ndayjs.extend(isSameOrAfter)\n\nconst TIME_ZONE = 'Asia/Tokyo'\n\n/**\n * 記事スラッグをもとに単一の公開記事を取得する\n * @param event H3Event\n * @param slug 記事スラッグ\n * @returns 公開記事 Get\n */\nexport const getArticle = async (event: H3Event, slug: string) => {\n  const article = await findArticleBySlug(event, slug)\n\n  if (article === null) {\n    return null\n  }\n\n  return filterPublishedArticle(article) ? article : null\n}\n\n/**\n * 公開記事の一覧を取得する\n * @param event H3Event\n * @returns 公開済み記事 List\n */\nexport const getArticles = async (event: H3Event) => {\n  const articles = await findArticles(event)\n\n  return articles.filter(filterPublishedArticle)\n}\n\n/**\n * 公開記事フィルター\n * @param article ArticleCollectionItem\n * @returns boolean\n */\nconst filterPublishedArticle = (article: ArticleCollectionItem) => {\n  // 公開日時が設定されていなければ公開済みとして扱う\n  if (!article.publishedAt) {\n    return true\n  }\n\n  const now = dayjs().tz(TIME_ZONE)\n  const publishedAt = dayjs.tz(\n    article.publishedAt,\n    TIME_ZONE,\n  )\n\n  // publishedAt が現在時刻以降か判定する\n  return now.isSameOrAfter(publishedAt)\n}\n","~~/server/domains/models/article/index.ts",[89,833,834,854,876,893,909,925,941,964,968,981,992,1003,1007,1024,1028,1033,1038,1057,1070,1083,1089,1125,1148,1153,1176,1185,1190,1195,1219,1224,1229,1234,1240,1253,1265,1270,1298,1317,1322,1341,1346,1351,1356,1362,1376,1388,1393,1416,1422,1442,1451,1456,1461,1488,1507,1519,1527,1533,1538,1544,1562],{"__ignoreMap":91},[129,835,836,838,840,842,844,846,848,850,852],{"class":131,"line":132},[129,837,492],{"class":135},[129,839,495],{"class":135},[129,841,498],{"class":161},[129,843,501],{"class":179},[129,845,504],{"class":161},[129,847,507],{"class":135},[129,849,193],{"class":192},[129,851,75],{"class":196},[129,853,514],{"class":192},[129,855,856,858,860,862,865,867,869,871,874],{"class":131,"line":154},[129,857,492],{"class":135},[129,859,495],{"class":135},[129,861,498],{"class":161},[129,863,864],{"class":179}," ArticleCollectionItem",[129,866,504],{"class":161},[129,868,507],{"class":135},[129,870,193],{"class":192},[129,872,873],{"class":196},"@nuxt/content",[129,875,514],{"class":192},[129,877,878,880,883,886,888,891],{"class":131,"line":168},[129,879,492],{"class":135},[129,881,882],{"class":179}," dayjs ",[129,884,885],{"class":135},"from",[129,887,193],{"class":192},[129,889,890],{"class":196},"dayjs/esm",[129,892,514],{"class":192},[129,894,895,897,900,902,904,907],{"class":131,"line":184},[129,896,492],{"class":135},[129,898,899],{"class":179}," utc ",[129,901,885],{"class":135},[129,903,193],{"class":192},[129,905,906],{"class":196},"dayjs/esm/plugin/utc",[129,908,514],{"class":192},[129,910,911,913,916,918,920,923],{"class":131,"line":206},[129,912,492],{"class":135},[129,914,915],{"class":179}," timezone ",[129,917,885],{"class":135},[129,919,193],{"class":192},[129,921,922],{"class":196},"dayjs/esm/plugin/timezone",[129,924,514],{"class":192},[129,926,927,929,932,934,936,939],{"class":131,"line":223},[129,928,492],{"class":135},[129,930,931],{"class":179}," isSameOrAfter ",[129,933,885],{"class":135},[129,935,193],{"class":192},[129,937,938],{"class":196},"dayjs/esm/plugin/isSameOrAfter",[129,940,514],{"class":192},[129,942,943,945,947,949,951,953,955,957,959,962],{"class":131,"line":244},[129,944,492],{"class":135},[129,946,498],{"class":161},[129,948,550],{"class":179},[129,950,324],{"class":161},[129,952,698],{"class":179},[129,954,504],{"class":161},[129,956,507],{"class":135},[129,958,193],{"class":192},[129,960,961],{"class":196},"~~/server/domains/repositories/article",[129,963,514],{"class":192},[129,965,966],{"class":131,"line":264},[129,967,419],{"emptyLinePlaceholder":418},[129,969,970,973,975,978],{"class":131,"line":282},[129,971,972],{"class":179},"dayjs",[129,974,234],{"class":161},[129,976,977],{"class":142},"extend",[129,979,980],{"class":179},"(utc)\n",[129,982,983,985,987,989],{"class":131,"line":301},[129,984,972],{"class":179},[129,986,234],{"class":161},[129,988,977],{"class":142},[129,990,991],{"class":179},"(timezone)\n",[129,993,994,996,998,1000],{"class":131,"line":331},[129,995,972],{"class":179},[129,997,234],{"class":161},[129,999,977],{"class":142},[129,1001,1002],{"class":179},"(isSameOrAfter)\n",[129,1004,1005],{"class":131,"line":340},[129,1006,419],{"emptyLinePlaceholder":418},[129,1008,1009,1012,1015,1017,1019,1022],{"class":131,"line":348},[129,1010,1011],{"class":545},"const",[129,1013,1014],{"class":596}," TIME_ZONE",[129,1016,554],{"class":553},[129,1018,193],{"class":192},[129,1020,1021],{"class":196},"Asia/Tokyo",[129,1023,514],{"class":192},[129,1025,1026],{"class":131,"line":354},[129,1027,419],{"emptyLinePlaceholder":418},[129,1029,1030],{"class":131,"line":782},[129,1031,1032],{"class":327},"/**\n",[129,1034,1035],{"class":131,"line":792},[129,1036,1037],{"class":327}," * 記事スラッグをもとに単一の公開記事を取得する\n",[129,1039,1040,1043,1046,1050,1054],{"class":131,"line":797},[129,1041,1042],{"class":327}," * ",[129,1044,1045],{"class":135},"@",[129,1047,1049],{"class":1048},"sST-Y","param",[129,1051,1053],{"class":1052},"sm6hg"," event",[129,1055,1056],{"class":327}," H3Event\n",[129,1058,1059,1061,1063,1065,1067],{"class":131,"line":805},[129,1060,1042],{"class":327},[129,1062,1045],{"class":135},[129,1064,1049],{"class":1048},[129,1066,574],{"class":1052},[129,1068,1069],{"class":327}," 記事スラッグ\n",[129,1071,1073,1075,1077,1080],{"class":131,"line":1072},19,[129,1074,1042],{"class":327},[129,1076,1045],{"class":135},[129,1078,1079],{"class":1048},"returns",[129,1081,1082],{"class":327}," 公開記事 Get\n",[129,1084,1086],{"class":131,"line":1085},20,[129,1087,1088],{"class":327}," */\n",[129,1090,1092,1094,1096,1099,1101,1103,1105,1107,1109,1111,1113,1115,1117,1119,1121,1123],{"class":131,"line":1091},21,[129,1093,136],{"class":135},[129,1095,546],{"class":545},[129,1097,1098],{"class":549}," getArticle",[129,1100,554],{"class":553},[129,1102,557],{"class":545},[129,1104,560],{"class":161},[129,1106,564],{"class":563},[129,1108,162],{"class":553},[129,1110,501],{"class":569},[129,1112,324],{"class":161},[129,1114,574],{"class":563},[129,1116,162],{"class":553},[129,1118,580],{"class":579},[129,1120,583],{"class":161},[129,1122,586],{"class":545},[129,1124,165],{"class":161},[129,1126,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146],{"class":131,"line":1127},22,[129,1129,593],{"class":545},[129,1131,597],{"class":596},[129,1133,554],{"class":553},[129,1135,602],{"class":135},[129,1137,550],{"class":142},[129,1139,147],{"class":157},[129,1141,564],{"class":179},[129,1143,324],{"class":161},[129,1145,574],{"class":179},[129,1147,337],{"class":157},[129,1149,1151],{"class":131,"line":1150},23,[129,1152,419],{"emptyLinePlaceholder":418},[129,1154,1156,1159,1161,1164,1167,1171,1174],{"class":131,"line":1155},24,[129,1157,1158],{"class":135},"  if",[129,1160,560],{"class":157},[129,1162,1163],{"class":179},"article",[129,1165,1166],{"class":553}," ===",[129,1168,1170],{"class":1169},"s4Pz2"," null",[129,1172,1173],{"class":157},") ",[129,1175,151],{"class":161},[129,1177,1179,1182],{"class":131,"line":1178},25,[129,1180,1181],{"class":135},"    return",[129,1183,1184],{"class":1169}," null\n",[129,1186,1188],{"class":131,"line":1187},26,[129,1189,351],{"class":161},[129,1191,1193],{"class":131,"line":1192},27,[129,1194,419],{"emptyLinePlaceholder":418},[129,1196,1198,1200,1203,1205,1207,1209,1212,1214,1217],{"class":131,"line":1197},28,[129,1199,677],{"class":135},[129,1201,1202],{"class":142}," filterPublishedArticle",[129,1204,147],{"class":157},[129,1206,1163],{"class":179},[129,1208,1173],{"class":157},[129,1210,1211],{"class":553},"?",[129,1213,597],{"class":179},[129,1215,1216],{"class":553}," :",[129,1218,1184],{"class":1169},[129,1220,1222],{"class":131,"line":1221},29,[129,1223,685],{"class":161},[129,1225,1227],{"class":131,"line":1226},30,[129,1228,419],{"emptyLinePlaceholder":418},[129,1230,1232],{"class":131,"line":1231},31,[129,1233,1032],{"class":327},[129,1235,1237],{"class":131,"line":1236},32,[129,1238,1239],{"class":327}," * 公開記事の一覧を取得する\n",[129,1241,1243,1245,1247,1249,1251],{"class":131,"line":1242},33,[129,1244,1042],{"class":327},[129,1246,1045],{"class":135},[129,1248,1049],{"class":1048},[129,1250,1053],{"class":1052},[129,1252,1056],{"class":327},[129,1254,1256,1258,1260,1262],{"class":131,"line":1255},34,[129,1257,1042],{"class":327},[129,1259,1045],{"class":135},[129,1261,1079],{"class":1048},[129,1263,1264],{"class":327}," 公開済み記事 List\n",[129,1266,1268],{"class":131,"line":1267},35,[129,1269,1088],{"class":327},[129,1271,1273,1275,1277,1280,1282,1284,1286,1288,1290,1292,1294,1296],{"class":131,"line":1272},36,[129,1274,136],{"class":135},[129,1276,546],{"class":545},[129,1278,1279],{"class":549}," getArticles",[129,1281,554],{"class":553},[129,1283,557],{"class":545},[129,1285,560],{"class":161},[129,1287,564],{"class":563},[129,1289,162],{"class":553},[129,1291,501],{"class":569},[129,1293,583],{"class":161},[129,1295,586],{"class":545},[129,1297,165],{"class":161},[129,1299,1301,1303,1305,1307,1309,1311,1313,1315],{"class":131,"line":1300},37,[129,1302,593],{"class":545},[129,1304,723],{"class":596},[129,1306,554],{"class":553},[129,1308,602],{"class":135},[129,1310,698],{"class":142},[129,1312,147],{"class":157},[129,1314,564],{"class":179},[129,1316,337],{"class":157},[129,1318,1320],{"class":131,"line":1319},38,[129,1321,419],{"emptyLinePlaceholder":418},[129,1323,1325,1327,1329,1331,1334,1336,1339],{"class":131,"line":1324},39,[129,1326,677],{"class":135},[129,1328,723],{"class":179},[129,1330,234],{"class":161},[129,1332,1333],{"class":142},"filter",[129,1335,147],{"class":157},[129,1337,1338],{"class":179},"filterPublishedArticle",[129,1340,337],{"class":157},[129,1342,1344],{"class":131,"line":1343},40,[129,1345,685],{"class":161},[129,1347,1349],{"class":131,"line":1348},41,[129,1350,419],{"emptyLinePlaceholder":418},[129,1352,1354],{"class":131,"line":1353},42,[129,1355,1032],{"class":327},[129,1357,1359],{"class":131,"line":1358},43,[129,1360,1361],{"class":327}," * 公開記事フィルター\n",[129,1363,1365,1367,1369,1371,1373],{"class":131,"line":1364},44,[129,1366,1042],{"class":327},[129,1368,1045],{"class":135},[129,1370,1049],{"class":1048},[129,1372,597],{"class":1052},[129,1374,1375],{"class":327}," ArticleCollectionItem\n",[129,1377,1379,1381,1383,1385],{"class":131,"line":1378},45,[129,1380,1042],{"class":327},[129,1382,1045],{"class":135},[129,1384,1079],{"class":1048},[129,1386,1387],{"class":327}," boolean\n",[129,1389,1391],{"class":131,"line":1390},46,[129,1392,1088],{"class":327},[129,1394,1396,1398,1400,1402,1404,1406,1408,1410,1412,1414],{"class":131,"line":1395},47,[129,1397,1011],{"class":545},[129,1399,1202],{"class":549},[129,1401,554],{"class":553},[129,1403,560],{"class":161},[129,1405,1163],{"class":563},[129,1407,162],{"class":553},[129,1409,864],{"class":569},[129,1411,583],{"class":161},[129,1413,586],{"class":545},[129,1415,165],{"class":161},[129,1417,1419],{"class":131,"line":1418},48,[129,1420,1421],{"class":327},"  // 公開日時が設定されていなければ公開済みとして扱う\n",[129,1423,1425,1427,1429,1432,1434,1436,1438,1440],{"class":131,"line":1424},49,[129,1426,1158],{"class":135},[129,1428,560],{"class":157},[129,1430,1431],{"class":553},"!",[129,1433,1163],{"class":179},[129,1435,234],{"class":161},[129,1437,364],{"class":179},[129,1439,1173],{"class":157},[129,1441,151],{"class":161},[129,1443,1445,1447],{"class":131,"line":1444},50,[129,1446,1181],{"class":135},[129,1448,1450],{"class":1449},"sBxIE"," true\n",[129,1452,1454],{"class":131,"line":1453},51,[129,1455,351],{"class":161},[129,1457,1459],{"class":131,"line":1458},52,[129,1460,419],{"emptyLinePlaceholder":418},[129,1462,1464,1466,1469,1471,1474,1476,1478,1481,1483,1486],{"class":131,"line":1463},53,[129,1465,593],{"class":545},[129,1467,1468],{"class":596}," now",[129,1470,554],{"class":553},[129,1472,1473],{"class":142}," dayjs",[129,1475,259],{"class":157},[129,1477,234],{"class":161},[129,1479,1480],{"class":142},"tz",[129,1482,147],{"class":157},[129,1484,1485],{"class":596},"TIME_ZONE",[129,1487,337],{"class":157},[129,1489,1491,1493,1496,1498,1500,1502,1504],{"class":131,"line":1490},54,[129,1492,593],{"class":545},[129,1494,1495],{"class":596}," publishedAt",[129,1497,554],{"class":553},[129,1499,1473],{"class":179},[129,1501,234],{"class":161},[129,1503,1480],{"class":142},[129,1505,1506],{"class":157},"(\n",[129,1508,1510,1513,1515,1517],{"class":131,"line":1509},55,[129,1511,1512],{"class":179},"    article",[129,1514,234],{"class":161},[129,1516,364],{"class":179},[129,1518,203],{"class":161},[129,1520,1522,1525],{"class":131,"line":1521},56,[129,1523,1524],{"class":596},"    TIME_ZONE",[129,1526,203],{"class":161},[129,1528,1530],{"class":131,"line":1529},57,[129,1531,1532],{"class":157},"  )\n",[129,1534,1536],{"class":131,"line":1535},58,[129,1537,419],{"emptyLinePlaceholder":418},[129,1539,1541],{"class":131,"line":1540},59,[129,1542,1543],{"class":327},"  // publishedAt が現在時刻以降か判定する\n",[129,1545,1547,1549,1551,1553,1556,1558,1560],{"class":131,"line":1546},60,[129,1548,677],{"class":135},[129,1550,1468],{"class":179},[129,1552,234],{"class":161},[129,1554,1555],{"class":142},"isSameOrAfter",[129,1557,147],{"class":157},[129,1559,364],{"class":179},[129,1561,337],{"class":157},[129,1563,1565],{"class":131,"line":1564},61,[129,1566,685],{"class":161},[75,1568,1570],{"id":1569},"api-handler","API Handler",[15,1572,1573],{},"一覧と詳細用に List と Get API ハンドラーを用意します。",[1575,1576,1578],"h4",{"id":1577},"list-api","List API",[82,1580,1583],{"className":122,"code":1581,"filename":1582,"language":125,"meta":91,"style":91},"import { getArticles } from '~~/server/domains/models/article'\n\nexport default defineEventHandler(async (event) => {\n  const articles = await getArticles(event)\n\n  return articles\n})\n","~~/server/api/articles/index.get.ts",[89,1584,1585,1604,1608,1632,1650,1654,1660],{"__ignoreMap":91},[129,1586,1587,1589,1591,1593,1595,1597,1599,1602],{"class":131,"line":132},[129,1588,492],{"class":135},[129,1590,498],{"class":161},[129,1592,1279],{"class":179},[129,1594,504],{"class":161},[129,1596,507],{"class":135},[129,1598,193],{"class":192},[129,1600,1601],{"class":196},"~~/server/domains/models/article",[129,1603,514],{"class":192},[129,1605,1606],{"class":131,"line":154},[129,1607,419],{"emptyLinePlaceholder":418},[129,1609,1610,1612,1614,1617,1619,1622,1624,1626,1628,1630],{"class":131,"line":168},[129,1611,136],{"class":135},[129,1613,139],{"class":135},[129,1615,1616],{"class":142}," defineEventHandler",[129,1618,147],{"class":146},[129,1620,1621],{"class":545},"async",[129,1623,560],{"class":150},[129,1625,564],{"class":563},[129,1627,583],{"class":150},[129,1629,586],{"class":545},[129,1631,165],{"class":161},[129,1633,1634,1636,1638,1640,1642,1644,1646,1648],{"class":131,"line":184},[129,1635,593],{"class":545},[129,1637,723],{"class":596},[129,1639,554],{"class":553},[129,1641,602],{"class":135},[129,1643,1279],{"class":142},[129,1645,147],{"class":157},[129,1647,564],{"class":179},[129,1649,337],{"class":157},[129,1651,1652],{"class":131,"line":206},[129,1653,419],{"emptyLinePlaceholder":418},[129,1655,1656,1658],{"class":131,"line":223},[129,1657,677],{"class":135},[129,1659,802],{"class":179},[129,1661,1662,1664],{"class":131,"line":244},[129,1663,357],{"class":161},[129,1665,337],{"class":146},[1575,1667,1669],{"id":1668},"get-api","Get API",[82,1671,1674],{"className":122,"code":1672,"filename":1673,"language":125,"meta":91,"style":91},"import { z } from 'zod'\nimport { getArticle } from '~~/server/domains/models/article'\n\nconst PARAMETER_SCHEMA = z.object({\n  slug: z.string(),\n})\n\nexport default defineEventHandler(async (event) => {\n  const { slug } = await getValidatedRouterParams(event, PARAMETER_SCHEMA.parse)\n\n  const article = await getArticle(event, slug)\n\n  return article\n})\n","~~/server/api/articles/[slug]/index.get.ts",[89,1675,1676,1695,1713,1717,1736,1753,1759,1763,1785,1817,1821,1843,1847,1853],{"__ignoreMap":91},[129,1677,1678,1680,1682,1684,1686,1688,1690,1693],{"class":131,"line":132},[129,1679,492],{"class":135},[129,1681,498],{"class":161},[129,1683,231],{"class":179},[129,1685,504],{"class":161},[129,1687,507],{"class":135},[129,1689,193],{"class":192},[129,1691,1692],{"class":196},"zod",[129,1694,514],{"class":192},[129,1696,1697,1699,1701,1703,1705,1707,1709,1711],{"class":131,"line":154},[129,1698,492],{"class":135},[129,1700,498],{"class":161},[129,1702,1098],{"class":179},[129,1704,504],{"class":161},[129,1706,507],{"class":135},[129,1708,193],{"class":192},[129,1710,1601],{"class":196},[129,1712,514],{"class":192},[129,1714,1715],{"class":131,"line":168},[129,1716,419],{"emptyLinePlaceholder":418},[129,1718,1719,1721,1724,1726,1728,1730,1732,1734],{"class":131,"line":184},[129,1720,1011],{"class":545},[129,1722,1723],{"class":596}," PARAMETER_SCHEMA",[129,1725,554],{"class":553},[129,1727,231],{"class":179},[129,1729,234],{"class":161},[129,1731,237],{"class":142},[129,1733,147],{"class":179},[129,1735,151],{"class":161},[129,1737,1738,1741,1743,1745,1747,1749,1751],{"class":131,"line":206},[129,1739,1740],{"class":157},"  slug",[129,1742,162],{"class":161},[129,1744,231],{"class":179},[129,1746,234],{"class":161},[129,1748,256],{"class":142},[129,1750,259],{"class":179},[129,1752,203],{"class":161},[129,1754,1755,1757],{"class":131,"line":223},[129,1756,357],{"class":161},[129,1758,337],{"class":179},[129,1760,1761],{"class":131,"line":244},[129,1762,419],{"emptyLinePlaceholder":418},[129,1764,1765,1767,1769,1771,1773,1775,1777,1779,1781,1783],{"class":131,"line":264},[129,1766,136],{"class":135},[129,1768,139],{"class":135},[129,1770,1616],{"class":142},[129,1772,147],{"class":146},[129,1774,1621],{"class":545},[129,1776,560],{"class":150},[129,1778,564],{"class":563},[129,1780,583],{"class":150},[129,1782,586],{"class":545},[129,1784,165],{"class":161},[129,1786,1787,1789,1791,1793,1795,1797,1799,1802,1804,1806,1808,1810,1812,1815],{"class":131,"line":282},[129,1788,593],{"class":545},[129,1790,498],{"class":161},[129,1792,574],{"class":596},[129,1794,504],{"class":161},[129,1796,554],{"class":553},[129,1798,602],{"class":135},[129,1800,1801],{"class":142}," getValidatedRouterParams",[129,1803,147],{"class":157},[129,1805,564],{"class":179},[129,1807,324],{"class":161},[129,1809,1723],{"class":596},[129,1811,234],{"class":161},[129,1813,1814],{"class":179},"parse",[129,1816,337],{"class":157},[129,1818,1819],{"class":131,"line":301},[129,1820,419],{"emptyLinePlaceholder":418},[129,1822,1823,1825,1827,1829,1831,1833,1835,1837,1839,1841],{"class":131,"line":331},[129,1824,593],{"class":545},[129,1826,597],{"class":596},[129,1828,554],{"class":553},[129,1830,602],{"class":135},[129,1832,1098],{"class":142},[129,1834,147],{"class":157},[129,1836,564],{"class":179},[129,1838,324],{"class":161},[129,1840,574],{"class":179},[129,1842,337],{"class":157},[129,1844,1845],{"class":131,"line":340},[129,1846,419],{"emptyLinePlaceholder":418},[129,1848,1849,1851],{"class":131,"line":348},[129,1850,677],{"class":135},[129,1852,680],{"class":179},[129,1854,1855,1857],{"class":131,"line":354},[129,1856,357],{"class":161},[129,1858,337],{"class":146},[15,1860,1861],{},"エンドポイントを叩いてみて、レスポンスが公開済み記事のみになっていればサーバー側の実装完了です。",[10,1863,1865],{"id":1864},"composables","Composables",[82,1867,1870],{"className":122,"code":1868,"filename":1869,"language":125,"meta":91,"style":91},"import type { ArticleCollectionItem } from '@nuxt/content'\n\nexport const useArticles = async () => {\n  const { data: articles } = await useFetch('/api/articles', {\n    default: (): ArticleCollectionItem[] => [],\n  })\n\n  return { articles }\n}\n\nexport const useArticle = async (path: string) => {\n  const { data: article } = await useFetch\u003CArticleCollectionItem | null>(`/api/articles/${path}`,\n    {\n      default: () => null,\n    }\n  )\n\n  return { article }\n}\n","~/app/composables/articles/index.ts",[89,1871,1872,1892,1896,1916,1952,1976,1983,1987,1998,2002,2006,2033,2080,2085,2100,2105,2109,2113,2123],{"__ignoreMap":91},[129,1873,1874,1876,1878,1880,1882,1884,1886,1888,1890],{"class":131,"line":132},[129,1875,492],{"class":135},[129,1877,495],{"class":135},[129,1879,498],{"class":161},[129,1881,864],{"class":179},[129,1883,504],{"class":161},[129,1885,507],{"class":135},[129,1887,193],{"class":192},[129,1889,873],{"class":196},[129,1891,514],{"class":192},[129,1893,1894],{"class":131,"line":154},[129,1895,419],{"emptyLinePlaceholder":418},[129,1897,1898,1900,1902,1905,1907,1909,1912,1914],{"class":131,"line":168},[129,1899,136],{"class":135},[129,1901,546],{"class":545},[129,1903,1904],{"class":549}," useArticles",[129,1906,554],{"class":553},[129,1908,557],{"class":545},[129,1910,1911],{"class":161}," ()",[129,1913,586],{"class":545},[129,1915,165],{"class":161},[129,1917,1918,1920,1922,1926,1928,1930,1932,1934,1936,1939,1941,1943,1946,1948,1950],{"class":131,"line":184},[129,1919,593],{"class":545},[129,1921,498],{"class":161},[129,1923,1925],{"class":1924},"s-3tI"," data",[129,1927,162],{"class":161},[129,1929,723],{"class":596},[129,1931,504],{"class":161},[129,1933,554],{"class":553},[129,1935,602],{"class":135},[129,1937,1938],{"class":142}," useFetch",[129,1940,147],{"class":157},[129,1942,200],{"class":192},[129,1944,1945],{"class":196},"/api/articles",[129,1947,200],{"class":192},[129,1949,324],{"class":161},[129,1951,165],{"class":161},[129,1953,1954,1957,1959,1961,1963,1965,1968,1971,1974],{"class":131,"line":206},[129,1955,1956],{"class":142},"    default",[129,1958,162],{"class":161},[129,1960,1911],{"class":161},[129,1962,162],{"class":553},[129,1964,864],{"class":569},[129,1966,1967],{"class":157},"[] ",[129,1969,1970],{"class":545},"=>",[129,1972,1973],{"class":157}," []",[129,1975,203],{"class":161},[129,1977,1978,1981],{"class":131,"line":223},[129,1979,1980],{"class":161},"  }",[129,1982,337],{"class":157},[129,1984,1985],{"class":131,"line":244},[129,1986,419],{"emptyLinePlaceholder":418},[129,1988,1989,1991,1993,1995],{"class":131,"line":264},[129,1990,677],{"class":135},[129,1992,498],{"class":161},[129,1994,723],{"class":179},[129,1996,1997],{"class":161}," }\n",[129,1999,2000],{"class":131,"line":282},[129,2001,685],{"class":161},[129,2003,2004],{"class":131,"line":301},[129,2005,419],{"emptyLinePlaceholder":418},[129,2007,2008,2010,2012,2015,2017,2019,2021,2023,2025,2027,2029,2031],{"class":131,"line":331},[129,2009,136],{"class":135},[129,2011,546],{"class":545},[129,2013,2014],{"class":549}," useArticle",[129,2016,554],{"class":553},[129,2018,557],{"class":545},[129,2020,560],{"class":161},[129,2022,639],{"class":563},[129,2024,162],{"class":553},[129,2026,580],{"class":579},[129,2028,583],{"class":161},[129,2030,586],{"class":545},[129,2032,165],{"class":161},[129,2034,2035,2037,2039,2041,2043,2045,2047,2049,2051,2053,2055,2058,2061,2063,2065,2067,2069,2072,2074,2076,2078],{"class":131,"line":340},[129,2036,593],{"class":545},[129,2038,498],{"class":161},[129,2040,1925],{"class":1924},[129,2042,162],{"class":161},[129,2044,597],{"class":596},[129,2046,504],{"class":161},[129,2048,554],{"class":553},[129,2050,602],{"class":135},[129,2052,1938],{"class":142},[129,2054,607],{"class":161},[129,2056,2057],{"class":569},"ArticleCollectionItem",[129,2059,2060],{"class":553}," |",[129,2062,1170],{"class":579},[129,2064,617],{"class":161},[129,2066,147],{"class":157},[129,2068,644],{"class":192},[129,2070,2071],{"class":196},"/api/articles/",[129,2073,650],{"class":192},[129,2075,639],{"class":179},[129,2077,656],{"class":192},[129,2079,203],{"class":161},[129,2081,2082],{"class":131,"line":348},[129,2083,2084],{"class":161},"    {\n",[129,2086,2087,2090,2092,2094,2096,2098],{"class":131,"line":354},[129,2088,2089],{"class":142},"      default",[129,2091,162],{"class":161},[129,2093,1911],{"class":161},[129,2095,586],{"class":545},[129,2097,1170],{"class":1169},[129,2099,203],{"class":161},[129,2101,2102],{"class":131,"line":782},[129,2103,2104],{"class":161},"    }\n",[129,2106,2107],{"class":131,"line":792},[129,2108,1532],{"class":157},[129,2110,2111],{"class":131,"line":797},[129,2112,419],{"emptyLinePlaceholder":418},[129,2114,2115,2117,2119,2121],{"class":131,"line":805},[129,2116,677],{"class":135},[129,2118,498],{"class":161},[129,2120,597],{"class":179},[129,2122,1997],{"class":161},[129,2124,2125],{"class":131,"line":1072},[129,2126,685],{"class":161},[10,2128,2130],{"id":2129},"template","Template",[15,2132,2133],{},"Composables を呼ぶだけですが、一応テンプレートです。",[82,2135,2140],{"className":2136,"code":2137,"filename":2138,"language":2139,"meta":91,"style":91},"language-vue shiki shiki-themes material-theme-lighter github-dark-high-contrast github-dark","\u003Cscritp setup lang=\"ts\">\nconst { articles } = await useArticles()\n\u003C/scritp>\n\n\u003Ctemplate>\n  \u003C!-- 割愛します -->\n\u003C/template>\n","~/app/pages/index.vue","vue",[89,2141,2142,2170,2188,2197,2201,2209,2220],{"__ignoreMap":91},[129,2143,2144,2146,2150,2154,2157,2160,2163,2165,2167],{"class":131,"line":132},[129,2145,607],{"class":161},[129,2147,2149],{"class":2148},"siCa7","scritp",[129,2151,2153],{"class":2152},"sOohs"," setup",[129,2155,2156],{"class":2152}," lang",[129,2158,2159],{"class":161},"=",[129,2161,2162],{"class":192},"\"",[129,2164,125],{"class":196},[129,2166,2162],{"class":192},[129,2168,2169],{"class":161},">\n",[129,2171,2172,2174,2176,2178,2180,2182,2184,2186],{"class":131,"line":154},[129,2173,1011],{"class":545},[129,2175,498],{"class":161},[129,2177,723],{"class":596},[129,2179,504],{"class":161},[129,2181,554],{"class":553},[129,2183,602],{"class":135},[129,2185,1904],{"class":142},[129,2187,668],{"class":179},[129,2189,2190,2193,2195],{"class":131,"line":168},[129,2191,2192],{"class":553},"\u003C/",[129,2194,2149],{"class":179},[129,2196,2169],{"class":553},[129,2198,2199],{"class":131,"line":184},[129,2200,419],{"emptyLinePlaceholder":418},[129,2202,2203,2205,2207],{"class":131,"line":206},[129,2204,607],{"class":179},[129,2206,2129],{"class":569},[129,2208,2169],{"class":179},[129,2210,2211,2214,2217],{"class":131,"line":223},[129,2212,2213],{"class":553},"  \u003C!--",[129,2215,2216],{"class":179}," 割愛します ",[129,2218,2219],{"class":553},"-->\n",[129,2221,2222,2224,2226],{"class":131,"line":244},[129,2223,2192],{"class":553},[129,2225,2129],{"class":179},[129,2227,2169],{"class":553},[82,2229,2232],{"className":2136,"code":2230,"filename":2231,"language":2139,"meta":91,"style":91},"\u003Cscritp setup lang=\"ts\">\nconst route = useRoute()\nconst slug = route.params.slug\nconst { article } = await useArticle(slug)\n\nif (article === null) {\n  throw createError({ statusCode: 404, message: 'Article Not Found.' })\n}\n\u003C/scritp>\n\n\u003Ctemplate>\n  \u003C!-- 割愛します -->\n\u003C/template>\n","~/app/pages/[slug]/index.vue",[89,2233,2234,2254,2268,2288,2307,2311,2328,2368,2372,2380,2384,2392,2400],{"__ignoreMap":91},[129,2235,2236,2238,2240,2242,2244,2246,2248,2250,2252],{"class":131,"line":132},[129,2237,607],{"class":161},[129,2239,2149],{"class":2148},[129,2241,2153],{"class":2152},[129,2243,2156],{"class":2152},[129,2245,2159],{"class":161},[129,2247,2162],{"class":192},[129,2249,125],{"class":196},[129,2251,2162],{"class":192},[129,2253,2169],{"class":161},[129,2255,2256,2258,2261,2263,2266],{"class":131,"line":154},[129,2257,1011],{"class":545},[129,2259,2260],{"class":596}," route",[129,2262,554],{"class":553},[129,2264,2265],{"class":142}," useRoute",[129,2267,668],{"class":179},[129,2269,2270,2272,2274,2276,2278,2280,2283,2285],{"class":131,"line":168},[129,2271,1011],{"class":545},[129,2273,574],{"class":596},[129,2275,554],{"class":553},[129,2277,2260],{"class":179},[129,2279,234],{"class":161},[129,2281,2282],{"class":179},"params",[129,2284,234],{"class":161},[129,2286,2287],{"class":179},"slug\n",[129,2289,2290,2292,2294,2296,2298,2300,2302,2304],{"class":131,"line":184},[129,2291,1011],{"class":545},[129,2293,498],{"class":161},[129,2295,597],{"class":596},[129,2297,504],{"class":161},[129,2299,554],{"class":553},[129,2301,602],{"class":135},[129,2303,2014],{"class":142},[129,2305,2306],{"class":179},"(slug)\n",[129,2308,2309],{"class":131,"line":206},[129,2310,419],{"emptyLinePlaceholder":418},[129,2312,2313,2316,2319,2322,2324,2326],{"class":131,"line":223},[129,2314,2315],{"class":135},"if",[129,2317,2318],{"class":179}," (article ",[129,2320,2321],{"class":553},"===",[129,2323,1170],{"class":1169},[129,2325,1173],{"class":179},[129,2327,151],{"class":161},[129,2329,2330,2333,2336,2338,2341,2344,2346,2350,2352,2355,2357,2359,2362,2364,2366],{"class":131,"line":244},[129,2331,2332],{"class":135},"  throw",[129,2334,2335],{"class":142}," createError",[129,2337,147],{"class":157},[129,2339,2340],{"class":161},"{",[129,2342,2343],{"class":157}," statusCode",[129,2345,162],{"class":161},[129,2347,2349],{"class":2348},"sFHE5"," 404",[129,2351,324],{"class":161},[129,2353,2354],{"class":157}," message",[129,2356,162],{"class":161},[129,2358,193],{"class":192},[129,2360,2361],{"class":196},"Article Not Found.",[129,2363,200],{"class":192},[129,2365,504],{"class":161},[129,2367,337],{"class":157},[129,2369,2370],{"class":131,"line":264},[129,2371,685],{"class":161},[129,2373,2374,2376,2378],{"class":131,"line":282},[129,2375,2192],{"class":553},[129,2377,2149],{"class":179},[129,2379,2169],{"class":553},[129,2381,2382],{"class":131,"line":301},[129,2383,419],{"emptyLinePlaceholder":418},[129,2385,2386,2388,2390],{"class":131,"line":331},[129,2387,607],{"class":179},[129,2389,2129],{"class":569},[129,2391,2169],{"class":179},[129,2393,2394,2396,2398],{"class":131,"line":340},[129,2395,2213],{"class":553},[129,2397,2216],{"class":179},[129,2399,2219],{"class":553},[129,2401,2402,2404,2406],{"class":131,"line":348},[129,2403,2192],{"class":553},[129,2405,2129],{"class":179},[129,2407,2169],{"class":553},[10,2409,2411],{"id":2410},"outro","Outro",[15,2413,2414],{},"以上です。",[15,2416,2417],{},"予約投稿が実装されたので来週からは記事が勝手に投稿されるに違いあるまい。",[2419,2420,2421],"style",{},"html pre.shiki code .stP2V, html code.shiki .stP2V{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#FF9492;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .s7KVs, html code.shiki .s7KVs{--shiki-light:#6182B8;--shiki-default:#DBB7FF;--shiki-dark:#B392F0}html pre.shiki code .sipQf, html code.shiki .sipQf{--shiki-light:#90A4AE;--shiki-default:#FFB757;--shiki-dark:#E1E4E8}html pre.shiki code .sfFde, html code.shiki .sfFde{--shiki-light:#39ADB5;--shiki-default:#FFB757;--shiki-dark:#E1E4E8}html pre.shiki code .sLCpo, html code.shiki .sLCpo{--shiki-light:#E53935;--shiki-default:#F0F3F6;--shiki-dark:#E1E4E8}html pre.shiki code .seLpV, html code.shiki .seLpV{--shiki-light:#39ADB5;--shiki-default:#F0F3F6;--shiki-dark:#E1E4E8}html pre.shiki code .sdyPO, html code.shiki .sdyPO{--shiki-light:#90A4AE;--shiki-default:#F0F3F6;--shiki-dark:#E1E4E8}html pre.shiki code .sPUPB, html code.shiki .sPUPB{--shiki-light:#39ADB5;--shiki-default:#ADDCFF;--shiki-dark:#9ECBFF}html pre.shiki code .sSIes, html code.shiki .sSIes{--shiki-light:#91B859;--shiki-default:#ADDCFF;--shiki-dark:#9ECBFF}html pre.shiki code .sZPSj, html code.shiki .sZPSj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#BDC4CC;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sDE9X, html code.shiki .sDE9X{--shiki-light:#90A4AE;--shiki-light-font-weight:inherit;--shiki-default:#91CBFF;--shiki-default-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold}html pre.shiki code .sdaUG, html code.shiki .sdaUG{--shiki-light:#39ADB5;--shiki-light-font-weight:inherit;--shiki-default:#91CBFF;--shiki-default-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold}html pre.shiki code .sGRfs, html code.shiki .sGRfs{--shiki-light:#9C3EDA;--shiki-default:#FF9492;--shiki-dark:#F97583}html pre.shiki code .s8Xov, html code.shiki .s8Xov{--shiki-light:#90A4AE;--shiki-default:#DBB7FF;--shiki-dark:#B392F0}html pre.shiki code .sUBcA, html code.shiki .sUBcA{--shiki-light:#39ADB5;--shiki-default:#FF9492;--shiki-dark:#F97583}html pre.shiki code .senS2, html code.shiki .senS2{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#FFB757;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sywW5, html code.shiki .sywW5{--shiki-light:#E2931D;--shiki-default:#FFB757;--shiki-dark:#B392F0}html pre.shiki code .snYqn, html code.shiki .snYqn{--shiki-light:#E2931D;--shiki-default:#91CBFF;--shiki-dark:#79B8FF}html pre.shiki code .sSuNx, html code.shiki .sSuNx{--shiki-light:#90A4AE;--shiki-default:#91CBFF;--shiki-dark:#79B8FF}html pre.shiki code .sST-Y, html code.shiki .sST-Y{--shiki-light:#9C3EDA;--shiki-light-font-style:italic;--shiki-default:#FF9492;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sm6hg, html code.shiki .sm6hg{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#F0F3F6;--shiki-default-font-style:inherit;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit}html pre.shiki code .s4Pz2, html code.shiki .s4Pz2{--shiki-light:#39ADB5;--shiki-default:#91CBFF;--shiki-dark:#79B8FF}html pre.shiki code .sBxIE, html code.shiki .sBxIE{--shiki-light:#FF5370;--shiki-default:#91CBFF;--shiki-dark:#79B8FF}html pre.shiki code .s-3tI, html code.shiki .s-3tI{--shiki-light:#E53935;--shiki-default:#FFB757;--shiki-dark:#FFAB70}html pre.shiki code .siCa7, html code.shiki .siCa7{--shiki-light:#E53935;--shiki-default:#72F088;--shiki-dark:#85E89D}html pre.shiki code .sOohs, html code.shiki .sOohs{--shiki-light:#9C3EDA;--shiki-default:#91CBFF;--shiki-dark:#B392F0}html pre.shiki code .sFHE5, html code.shiki .sFHE5{--shiki-light:#F76D47;--shiki-default:#91CBFF;--shiki-dark:#79B8FF}",{"title":91,"searchDepth":168,"depth":168,"links":2423},[2424,2425,2429,2430,2438,2439,2440],{"id":12,"depth":154,"text":13},{"id":54,"depth":154,"text":55,"children":2426},[2427,2428],{"id":77,"depth":168,"text":77},{"id":94,"depth":168,"text":94},{"id":111,"depth":154,"text":112},{"id":470,"depth":154,"text":471,"children":2431},[2432,2433,2434],{"id":477,"depth":168,"text":478},{"id":817,"depth":168,"text":818},{"id":1569,"depth":168,"text":1570,"children":2435},[2436,2437],{"id":1577,"depth":184,"text":1578},{"id":1668,"depth":184,"text":1669},{"id":1864,"depth":154,"text":1865},{"id":2129,"depth":154,"text":2130},{"id":2410,"depth":154,"text":2411},"2026-03-02T00:00:00.000Z","予約投稿、それは希望。未来を信じるもののみに許された「祈り」「願い」「誓い」。僕はそれを実装しようと思う。","/avatar_green_oab8qx.webp",{},"https://res.cloudinary.com/dyoyv8djx/image/upload/v1772369627/tsukiyama-blog/nuxt-content-scheduled-posts/nuxt-content-scheduled-posts_phjsvn.webp","/tech/nuxt-content-scheduled-posts","2026-03-02T08:00:00.000Z",{"title":5,"description":2442},"tech/nuxt-content-scheduled-posts",[2451,2452,2453],"Nuxt.js","Nuxt Content","Day.js",null,"mBwY_VreOiSGnKHu370nVi_e6n8uUFvqyM8lqu0JcwU"]