@zonuexe/techbook-mcp 0.2.3 → 0.3.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.
Files changed (207) hide show
  1. package/CHANGELOG.md +52 -1
  2. package/README.md +54 -22
  3. package/dist/adapters/http/fetch-client.d.ts.map +1 -1
  4. package/dist/adapters/http/fetch-client.js +18 -1
  5. package/dist/adapters/http/fetch-client.js.map +1 -1
  6. package/dist/adapters/openbd.d.ts.map +1 -1
  7. package/dist/adapters/openbd.js +18 -5
  8. package/dist/adapters/openbd.js.map +1 -1
  9. package/dist/adapters/publishers/base.d.ts +2 -1
  10. package/dist/adapters/publishers/base.d.ts.map +1 -1
  11. package/dist/adapters/publishers/base.js +8 -3
  12. package/dist/adapters/publishers/base.js.map +1 -1
  13. package/dist/adapters/publishers/cq-publishing.d.ts +3 -0
  14. package/dist/adapters/publishers/cq-publishing.d.ts.map +1 -0
  15. package/dist/adapters/publishers/cq-publishing.js +120 -0
  16. package/dist/adapters/publishers/cq-publishing.js.map +1 -0
  17. package/dist/adapters/publishers/google-books.d.ts +4 -0
  18. package/dist/adapters/publishers/google-books.d.ts.map +1 -0
  19. package/dist/adapters/publishers/google-books.js +76 -0
  20. package/dist/adapters/publishers/google-books.js.map +1 -0
  21. package/dist/adapters/publishers/isbn-publisher-codes.d.ts +21 -0
  22. package/dist/adapters/publishers/isbn-publisher-codes.d.ts.map +1 -0
  23. package/dist/adapters/publishers/isbn-publisher-codes.js +49 -0
  24. package/dist/adapters/publishers/isbn-publisher-codes.js.map +1 -0
  25. package/dist/adapters/publishers/juse-p.d.ts +3 -0
  26. package/dist/adapters/publishers/juse-p.d.ts.map +1 -0
  27. package/dist/adapters/publishers/juse-p.js +110 -0
  28. package/dist/adapters/publishers/juse-p.js.map +1 -0
  29. package/dist/adapters/publishers/leanpub.d.ts +3 -0
  30. package/dist/adapters/publishers/leanpub.d.ts.map +1 -0
  31. package/dist/adapters/publishers/leanpub.js +96 -0
  32. package/dist/adapters/publishers/leanpub.js.map +1 -0
  33. package/dist/adapters/publishers/oreilly-japan.d.ts.map +1 -1
  34. package/dist/adapters/publishers/oreilly-japan.js +8 -2
  35. package/dist/adapters/publishers/oreilly-japan.js.map +1 -1
  36. package/dist/adapters/publishers/peaks.d.ts.map +1 -1
  37. package/dist/adapters/publishers/peaks.js +3 -2
  38. package/dist/adapters/publishers/peaks.js.map +1 -1
  39. package/dist/adapters/publishers/personal-media.d.ts.map +1 -1
  40. package/dist/adapters/publishers/personal-media.js +3 -2
  41. package/dist/adapters/publishers/personal-media.js.map +1 -1
  42. package/dist/adapters/publishers/pragprog.d.ts +3 -0
  43. package/dist/adapters/publishers/pragprog.d.ts.map +1 -0
  44. package/dist/adapters/publishers/pragprog.js +120 -0
  45. package/dist/adapters/publishers/pragprog.js.map +1 -0
  46. package/dist/adapters/publishers/registry.d.ts.map +1 -1
  47. package/dist/adapters/publishers/registry.js +10 -0
  48. package/dist/adapters/publishers/registry.js.map +1 -1
  49. package/dist/adapters/publishers/techbookfest.d.ts.map +1 -1
  50. package/dist/adapters/publishers/techbookfest.js +2 -1
  51. package/dist/adapters/publishers/techbookfest.js.map +1 -1
  52. package/dist/application/concurrency.d.ts +16 -0
  53. package/dist/application/concurrency.d.ts.map +1 -0
  54. package/dist/application/concurrency.js +42 -0
  55. package/dist/application/concurrency.js.map +1 -0
  56. package/dist/application/get-book-by-isbn.d.ts +0 -8
  57. package/dist/application/get-book-by-isbn.d.ts.map +1 -1
  58. package/dist/application/get-book-by-isbn.js +64 -7
  59. package/dist/application/get-book-by-isbn.js.map +1 -1
  60. package/dist/application/get-book-detail.d.ts.map +1 -1
  61. package/dist/application/get-book-detail.js +3 -0
  62. package/dist/application/get-book-detail.js.map +1 -1
  63. package/dist/application/search-books.d.ts +16 -5
  64. package/dist/application/search-books.d.ts.map +1 -1
  65. package/dist/application/search-books.js +46 -9
  66. package/dist/application/search-books.js.map +1 -1
  67. package/dist/config/credentials.d.ts +8 -0
  68. package/dist/config/credentials.d.ts.map +1 -0
  69. package/dist/config/credentials.js +32 -0
  70. package/dist/config/credentials.js.map +1 -0
  71. package/dist/domain/authors.d.ts +7 -0
  72. package/dist/domain/authors.d.ts.map +1 -0
  73. package/dist/domain/authors.js +22 -0
  74. package/dist/domain/authors.js.map +1 -0
  75. package/dist/domain/book.d.ts +2 -0
  76. package/dist/domain/book.d.ts.map +1 -1
  77. package/dist/domain/isbn.d.ts +8 -0
  78. package/dist/domain/isbn.d.ts.map +1 -0
  79. package/dist/domain/isbn.js +16 -0
  80. package/dist/domain/isbn.js.map +1 -0
  81. package/dist/domain/publisher.d.ts +16 -0
  82. package/dist/domain/publisher.d.ts.map +1 -1
  83. package/dist/domain/text-match.d.ts +32 -0
  84. package/dist/domain/text-match.d.ts.map +1 -0
  85. package/dist/domain/text-match.js +84 -0
  86. package/dist/domain/text-match.js.map +1 -0
  87. package/dist/main.js +15 -1
  88. package/dist/main.js.map +1 -1
  89. package/dist/mcp/server.d.ts +6 -0
  90. package/dist/mcp/server.d.ts.map +1 -1
  91. package/dist/mcp/server.js +40 -4
  92. package/dist/mcp/server.js.map +1 -1
  93. package/dist/mcp/tools.d.ts.map +1 -1
  94. package/dist/mcp/tools.js +9 -1
  95. package/dist/mcp/tools.js.map +1 -1
  96. package/dist/setup.d.ts +2 -0
  97. package/dist/setup.d.ts.map +1 -0
  98. package/dist/setup.js +43 -0
  99. package/dist/setup.js.map +1 -0
  100. package/dist/version.d.ts +9 -0
  101. package/dist/version.d.ts.map +1 -0
  102. package/dist/version.js +9 -0
  103. package/dist/version.js.map +1 -0
  104. package/docs/design-doc.md +127 -7
  105. package/package.json +14 -15
  106. package/.claude/settings.local.json +0 -38
  107. package/.codex/skills/techbook-mcp-release-prep/SKILL.md +0 -105
  108. package/.github/workflows/test.yml +0 -72
  109. package/.oxlintrc.json +0 -12
  110. package/AGENTS.md +0 -100
  111. package/deno.json +0 -3
  112. package/src/adapters/cache/memory-cache.ts +0 -31
  113. package/src/adapters/cache/null-cache.ts +0 -8
  114. package/src/adapters/calil.ts +0 -57
  115. package/src/adapters/html/cheerio-parser.ts +0 -50
  116. package/src/adapters/http/fetch-client.ts +0 -47
  117. package/src/adapters/http/mock-client.ts +0 -77
  118. package/src/adapters/openbd.ts +0 -142
  119. package/src/adapters/publishers/base.ts +0 -279
  120. package/src/adapters/publishers/book-tech.ts +0 -117
  121. package/src/adapters/publishers/born-digital.ts +0 -143
  122. package/src/adapters/publishers/coronasha.ts +0 -139
  123. package/src/adapters/publishers/gihyo.ts +0 -120
  124. package/src/adapters/publishers/impress.ts +0 -103
  125. package/src/adapters/publishers/lambdanote.ts +0 -146
  126. package/src/adapters/publishers/manatee.ts +0 -113
  127. package/src/adapters/publishers/maruzen-publishing.ts +0 -129
  128. package/src/adapters/publishers/optronics.ts +0 -113
  129. package/src/adapters/publishers/oreilly-japan.ts +0 -133
  130. package/src/adapters/publishers/peaks.ts +0 -98
  131. package/src/adapters/publishers/personal-media.ts +0 -168
  132. package/src/adapters/publishers/registry.ts +0 -38
  133. package/src/adapters/publishers/rutles.ts +0 -149
  134. package/src/adapters/publishers/saiensu.ts +0 -136
  135. package/src/adapters/publishers/seshop.ts +0 -121
  136. package/src/adapters/publishers/tatsu-zine.ts +0 -142
  137. package/src/adapters/publishers/techbookfest.ts +0 -179
  138. package/src/application/get-book-by-isbn.ts +0 -50
  139. package/src/application/get-book-detail.ts +0 -40
  140. package/src/application/search-books.ts +0 -64
  141. package/src/domain/book.ts +0 -35
  142. package/src/domain/publisher.ts +0 -18
  143. package/src/main.ts +0 -14
  144. package/src/mcp/server.ts +0 -113
  145. package/src/mcp/tools.ts +0 -71
  146. package/src/ports/cache.ts +0 -5
  147. package/src/ports/html-parser.ts +0 -15
  148. package/src/ports/http.ts +0 -17
  149. package/tests/fixtures/book-tech-detail.html +0 -51
  150. package/tests/fixtures/book-tech-search.html +0 -91
  151. package/tests/fixtures/born-digital-detail.html +0 -62
  152. package/tests/fixtures/born-digital-search.html +0 -51
  153. package/tests/fixtures/calil-book.html +0 -987
  154. package/tests/fixtures/coronasha-detail.html +0 -41
  155. package/tests/fixtures/coronasha-search.html +0 -61
  156. package/tests/fixtures/gihyo-detail.html +0 -42
  157. package/tests/fixtures/gihyo-search.json +0 -54
  158. package/tests/fixtures/impress-detail-epub.html +0 -746
  159. package/tests/fixtures/impress-detail-social.html +0 -689
  160. package/tests/fixtures/lambdanote-search.html +0 -66
  161. package/tests/fixtures/manatee-detail.html +0 -53
  162. package/tests/fixtures/manatee-search.html +0 -59
  163. package/tests/fixtures/maruzen-detail.html +0 -51
  164. package/tests/fixtures/maruzen-search.html +0 -60
  165. package/tests/fixtures/openbd-response.json +0 -110
  166. package/tests/fixtures/optronics-detail.html +0 -30
  167. package/tests/fixtures/optronics-search.html +0 -75
  168. package/tests/fixtures/oreilly-detail.html +0 -52
  169. package/tests/fixtures/oreilly-ebook-list.html +0 -53
  170. package/tests/fixtures/peaks-detail.html +0 -39
  171. package/tests/fixtures/peaks-top.html +0 -50
  172. package/tests/fixtures/personal-media-detail.html +0 -32
  173. package/tests/fixtures/personal-media-search.html +0 -39
  174. package/tests/fixtures/rutles-detail.html +0 -32
  175. package/tests/fixtures/rutles-search.html +0 -62
  176. package/tests/fixtures/saiensu-detail.html +0 -41
  177. package/tests/fixtures/saiensu-search.html +0 -65
  178. package/tests/fixtures/seshop-detail.html +0 -45
  179. package/tests/fixtures/seshop-search.html +0 -58
  180. package/tests/fixtures/tatsu-zine-detail-free.html +0 -24
  181. package/tests/fixtures/tatsu-zine-search.html +0 -40
  182. package/tests/fixtures/techbookfest-search.json +0 -73
  183. package/tests/unit/adapters/base.test.ts +0 -441
  184. package/tests/unit/adapters/calil.test.ts +0 -69
  185. package/tests/unit/adapters/openbd.test.ts +0 -185
  186. package/tests/unit/adapters/publishers/book-tech.test.ts +0 -186
  187. package/tests/unit/adapters/publishers/born-digital.test.ts +0 -194
  188. package/tests/unit/adapters/publishers/coronasha.test.ts +0 -207
  189. package/tests/unit/adapters/publishers/gihyo.test.ts +0 -137
  190. package/tests/unit/adapters/publishers/impress.test.ts +0 -129
  191. package/tests/unit/adapters/publishers/lambdanote.test.ts +0 -85
  192. package/tests/unit/adapters/publishers/manatee.test.ts +0 -165
  193. package/tests/unit/adapters/publishers/maruzen-publishing.test.ts +0 -179
  194. package/tests/unit/adapters/publishers/optronics.test.ts +0 -208
  195. package/tests/unit/adapters/publishers/oreilly-japan.test.ts +0 -194
  196. package/tests/unit/adapters/publishers/peaks.test.ts +0 -177
  197. package/tests/unit/adapters/publishers/personal-media.test.ts +0 -199
  198. package/tests/unit/adapters/publishers/rutles.test.ts +0 -173
  199. package/tests/unit/adapters/publishers/saiensu.test.ts +0 -169
  200. package/tests/unit/adapters/publishers/seshop.test.ts +0 -174
  201. package/tests/unit/adapters/publishers/tatsu-zine.test.ts +0 -172
  202. package/tests/unit/adapters/publishers/techbookfest.test.ts +0 -94
  203. package/tests/unit/adapters/registry.test.ts +0 -37
  204. package/tests/unit/application/get-book-by-isbn.test.ts +0 -176
  205. package/tests/unit/application/get-book-detail.test.ts +0 -102
  206. package/tests/unit/application/search-books.test.ts +0 -137
  207. package/tsconfig.json +0 -17
package/src/mcp/server.ts DELETED
@@ -1,113 +0,0 @@
1
- import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
- import {
4
- CallToolRequestSchema,
5
- ListToolsRequestSchema,
6
- } from "@modelcontextprotocol/sdk/types.js";
7
- import type { PublisherAdapter, PublisherDeps } from "../domain/publisher.js";
8
- import type { BookRecord, EbookStore, DrmType, SearchQuery } from "../domain/book.js";
9
- import { searchBooks } from "../application/search-books.js";
10
- import { getBookDetail } from "../application/get-book-detail.js";
11
- import { getBookByIsbn } from "../application/get-book-by-isbn.js";
12
- import { TOOLS } from "./tools.js";
13
-
14
- // --- 出力フォーマット ---
15
-
16
- const DRM_LABELS: Record<DrmType, string> = {
17
- free: "DRMフリー",
18
- social: "DRMフリー (ソーシャル)",
19
- password_pdf: "パスワード付きPDF",
20
- drm: "DRM付き",
21
- };
22
-
23
- function formatEbookStore(store: EbookStore): Record<string, unknown> {
24
- return { ...store, drmLabel: DRM_LABELS[store.drm] };
25
- }
26
-
27
- function formatBook(book: BookRecord): Record<string, unknown> {
28
- if (!book.ebookStores) return book as unknown as Record<string, unknown>;
29
- return { ...book, ebookStores: book.ebookStores.map(formatEbookStore) };
30
- }
31
-
32
- export function createServer(
33
- publishers: readonly PublisherAdapter[],
34
- deps: PublisherDeps,
35
- ): Server {
36
- const server = new Server(
37
- {
38
- name: "@zonuexe/techbook-mcp",
39
- version: "0.1.0",
40
- },
41
- {
42
- capabilities: { tools: {} },
43
- },
44
- );
45
-
46
- server.setRequestHandler(ListToolsRequestSchema, async () => ({
47
- tools: TOOLS,
48
- }));
49
-
50
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
51
- const { name, arguments: args = {} } = request.params;
52
-
53
- switch (name) {
54
- case "search_books": {
55
- const query: SearchQuery = {
56
- title: typeof args["title"] === "string" ? args["title"] : undefined,
57
- author: typeof args["author"] === "string" ? args["author"] : undefined,
58
- publisherId: typeof args["publisher"] === "string" ? args["publisher"] : undefined,
59
- limit: typeof args["limit"] === "number" ? Math.min(args["limit"], 50) : 10,
60
- };
61
- const { books, errors } = await searchBooks(query, publishers, deps);
62
- const output: Record<string, unknown> = { books: books.map(formatBook) };
63
- if (errors.length > 0) output["errors"] = errors;
64
- return {
65
- content: [{ type: "text", text: JSON.stringify(output, null, 2) }],
66
- };
67
- }
68
-
69
- case "get_book_detail": {
70
- const url = args["url"];
71
- if (typeof url !== "string") throw new Error("url は必須です");
72
- const book = await getBookDetail(url, publishers, deps);
73
- return {
74
- content: [{ type: "text", text: JSON.stringify(formatBook(book), null, 2) }],
75
- };
76
- }
77
-
78
- case "list_publishers": {
79
- const list = publishers.map(p => ({
80
- id: p.id,
81
- name: p.name,
82
- baseUrl: p.baseUrl,
83
- }));
84
- return {
85
- content: [{ type: "text", text: JSON.stringify(list, null, 2) }],
86
- };
87
- }
88
-
89
- case "get_book_by_isbn": {
90
- const isbn = args["isbn"];
91
- if (typeof isbn !== "string") throw new Error("isbn は必須です");
92
- const book = await getBookByIsbn(isbn, publishers, deps);
93
- return {
94
- content: [{ type: "text", text: JSON.stringify(formatBook(book), null, 2) }],
95
- };
96
- }
97
-
98
- default:
99
- throw new Error(`未知のツール: ${name}`);
100
- }
101
- });
102
-
103
- return server;
104
- }
105
-
106
- export async function startServer(
107
- publishers: readonly PublisherAdapter[],
108
- deps: PublisherDeps,
109
- ): Promise<void> {
110
- const server = createServer(publishers, deps);
111
- const transport = new StdioServerTransport();
112
- await server.connect(transport);
113
- }
package/src/mcp/tools.ts DELETED
@@ -1,71 +0,0 @@
1
- export const TOOLS = [
2
- {
3
- name: "search_books",
4
- description:
5
- "書名・著者名から日本語技術書を検索し、書誌情報の一覧を返します。" +
6
- "複数の出版社を横断して検索します。",
7
- inputSchema: {
8
- type: "object",
9
- properties: {
10
- title: {
11
- type: "string",
12
- description: "書名(部分一致)",
13
- },
14
- author: {
15
- type: "string",
16
- description: "著者名(部分一致)",
17
- },
18
- publisher: {
19
- type: "string",
20
- description:
21
- "出版社IDで検索対象を絞り込みます。指定しない場合は全出版社を検索します。" +
22
- "利用可能なIDは list_publishers で確認できます。",
23
- },
24
- limit: {
25
- type: "number",
26
- description: "1出版社あたりの最大取得件数(デフォルト: 10、最大: 50)",
27
- default: 10,
28
- },
29
- },
30
- },
31
- },
32
- {
33
- name: "get_book_detail",
34
- description: "書籍の公式ページURLから詳細な書誌情報を取得します。",
35
- inputSchema: {
36
- type: "object",
37
- required: ["url"],
38
- properties: {
39
- url: {
40
- type: "string",
41
- description: "書籍の公式ページURL(出版社サイトのURL)",
42
- },
43
- },
44
- },
45
- },
46
- {
47
- name: "list_publishers",
48
- description: "対応している出版社の一覧とIDを返します。",
49
- inputSchema: {
50
- type: "object",
51
- properties: {},
52
- },
53
- },
54
- {
55
- name: "get_book_by_isbn",
56
- description:
57
- "ISBNから書誌情報を取得します。" +
58
- "openBDで出版社を特定し、可能であれば出版社サイトから詳細情報を取得します。" +
59
- "出版社サイトから取得できない場合はopenBDのデータを返します。",
60
- inputSchema: {
61
- type: "object",
62
- required: ["isbn"],
63
- properties: {
64
- isbn: {
65
- type: "string",
66
- description: "ISBN-13(ハイフンあり・なし両対応、例: 978-4-908686-20-7)",
67
- },
68
- },
69
- },
70
- },
71
- ] as const;
@@ -1,5 +0,0 @@
1
- export interface CacheStore {
2
- get(key: string): Promise<string | null>;
3
- set(key: string, value: string, ttlSeconds?: number): Promise<void>;
4
- delete(key: string): Promise<void>;
5
- }
@@ -1,15 +0,0 @@
1
- export interface HtmlElement {
2
- text(): string;
3
- html(): string | null;
4
- attr(name: string): string | undefined;
5
- find(selector: string): HtmlElement[];
6
- }
7
-
8
- export interface HtmlDocument {
9
- select(selector: string): HtmlElement[];
10
- selectOne(selector: string): HtmlElement | null;
11
- }
12
-
13
- export interface HtmlParser {
14
- parse(html: string): HtmlDocument;
15
- }
package/src/ports/http.ts DELETED
@@ -1,17 +0,0 @@
1
- export interface RequestOptions {
2
- headers?: Record<string, string>;
3
- timeout?: number;
4
- }
5
-
6
- export interface HttpResponse {
7
- readonly status: number;
8
- readonly url: string;
9
- text(): Promise<string>;
10
- /** ヘッダー値を取得する。複数値は `, ` 結合。存在しない場合は null。 */
11
- header(name: string): string | null;
12
- }
13
-
14
- export interface HttpClient {
15
- get(url: string, options?: RequestOptions): Promise<HttpResponse>;
16
- post(url: string, body: string, options?: RequestOptions): Promise<HttpResponse>;
17
- }
@@ -1,51 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="ja">
3
- <head><meta charset="utf-8"><title>BOOK TECH | 次のステップへ!React実践開発 サクサク作って学ぶ UI/テスト/デプロイ</title></head>
4
- <body>
5
- <div class="contents-base">
6
- <div class="contents-book">
7
- <div class="contents-book-inner">
8
- <div class="contents-book-item">
9
- <div class="contents-book-item-detail-wrap">
10
- <div class="contents-book-item-detail-thumb">
11
- <img src="https://booktech-share.s3-ap-northeast-1.amazonaws.com/books/d80ffe3d.webp" class="thumb" alt="次のステップへ!React実践開発 サクサク作って学ぶ UI/テスト/デプロイ">
12
- </div>
13
- <div class="contents-book-item-detail-price_include_tax">
14
- 2,178円<span class="tax">(税込)</span>
15
- </div>
16
- </div>
17
- </div>
18
-
19
- <div class="contents-book-about">
20
- <div class="contents-book-about-title">
21
- <h1>次のステップへ!React実践開発 サクサク作って学ぶ UI/テスト/デプロイ</h1>
22
- </div>
23
-
24
- <div class="contents-book-about-publicationdate my-1" style="font-size: 0.85em;">
25
- 発売日:
26
- 2026/2/20
27
- </div>
28
-
29
- <div class="d-flex flex-wrap align-items-center gap-1">
30
- <a class="badge bg-light text-dark border" href="/books?q%5Bpublisher_relations_publisher_id_in%5D%5B%5D=4">
31
- <i class="fas fa-building me-1"></i>インプレス NextPublishing
32
- </a>
33
- <a class="badge bg-light text-dark border" href="/books?q%5Bauthor_relations_author_id_in%5D%5B%5D=2205">
34
- <i class="fas fa-user me-1"></i>philosophy (著)
35
- </a>
36
- </div>
37
-
38
- <div class="contents-book-about-id" style="font-size: 0.85em;">
39
- ISBN:
40
- 9784295604136
41
- </div>
42
-
43
- <div class="contents-book-about-description scroll">
44
- TypeScriptによる型安全な開発、各種ホスティングサービスへの公開方法などを解説します。
45
- </div>
46
- </div>
47
- </div>
48
- </div>
49
- </div>
50
- </body>
51
- </html>
@@ -1,91 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="ja">
3
- <head><meta charset="utf-8"><title>BOOK TECH | 「TypeScript」の検索結果</title></head>
4
- <body>
5
- <div class="contents-base">
6
- <div class="contents-index">
7
- <div class="contents-index-wrap">
8
-
9
- <div class="contents-index-item">
10
- <div class="contents-index-item-lang">
11
- <a class="contents-index-item-large-lang-wrap" href="/books?q%5Bbook_category_in%5D%5B%5D=%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BBIT">コンピュータ・IT</a>
12
- </div>
13
- <div class="contents-index-item-detail-wrap">
14
- <div class="contents-index-item-detail">
15
- <div class="contents-index-item-detail-thumb">
16
- <a class="book-ribbon-link" href="/books/d80ffe3d-f3fe-458b-95ee-b4dd3327fab2">
17
- <img src="https://booktech-share.s3-ap-northeast-1.amazonaws.com/books/d80ffe3d.webp" class="thumb" alt="次のステップへ!React実践開発 サクサク作って学ぶ UI/テスト/デプロイ">
18
- </a>
19
- </div>
20
- </div>
21
- <div class="contents-index-item-detail">
22
- <div class="contents-index-item-detail-title">
23
- 次のステップへ!React実践開発 サクサク作って学ぶ UI/テスト/デプロイ
24
- </div>
25
- <div class="my-1" style="font-size: 0.85em;">
26
- 発売日: 2026/2/20
27
- </div>
28
- <div class="d-none d-lg-block d-flex flex-wrap align-items-center gap-1">
29
- <a class="badge bg-light text-dark border" href="/books?q%5Bpublisher_relations_publisher_id_in%5D%5B%5D=4">
30
- <i class="fas fa-building me-1"></i>インプレス NextPublishing
31
- </a>
32
- <a class="badge bg-light text-dark border" href="/books?q%5Bauthor_relations_author_id_in%5D%5B%5D=2205">
33
- <i class="fas fa-user me-1"></i>philosophy (著)
34
- </a>
35
- </div>
36
- <div class="contents-index-item-detail-description scroll">
37
- TypeScriptによる型安全な開発を解説します。
38
- </div>
39
- <div class="contents-index-item-detail-price_include_tax">
40
- <div>
41
- 2,178円<span class="tax">(税込)</span>
42
- </div>
43
- </div>
44
- </div>
45
- </div>
46
- </div>
47
-
48
- <div class="contents-index-item">
49
- <div class="contents-index-item-lang">
50
- <a class="contents-index-item-large-lang-wrap" href="/books?q%5Bbook_category_in%5D%5B%5D=%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BBIT">コンピュータ・IT</a>
51
- </div>
52
- <div class="contents-index-item-detail-wrap">
53
- <div class="contents-index-item-detail">
54
- <div class="contents-index-item-detail-thumb">
55
- <a class="book-ribbon-link" href="/books/a52f6467-5d0c-4d76-9351-19a0ab76eb96">
56
- <img src="https://booktech-share.s3-ap-northeast-1.amazonaws.com/books/a52f6467.webp" class="thumb" alt="React環境構築の教科書">
57
- </a>
58
- </div>
59
- </div>
60
- <div class="contents-index-item-detail">
61
- <div class="contents-index-item-detail-title">
62
- React環境構築の教科書
63
- </div>
64
- <div class="my-1" style="font-size: 0.85em;">
65
- 発売日: 2020/8/21
66
- </div>
67
- <div class="d-none d-lg-block d-flex flex-wrap align-items-center gap-1">
68
- <a class="badge bg-light text-dark border" href="/books?q%5Bpublisher_relations_publisher_id_in%5D%5B%5D=4">
69
- <i class="fas fa-building me-1"></i>インプレス NextPublishing
70
- </a>
71
- <a class="badge bg-light text-dark border" href="/books?q%5Bauthor_relations_author_id_in%5D%5B%5D=107">
72
- <i class="fas fa-user me-1"></i>井手 優太 (著)
73
- </a>
74
- </div>
75
- <div class="contents-index-item-detail-description scroll">
76
- TypeScriptを使ったコンパイル環境を解説します。
77
- </div>
78
- <div class="contents-index-item-detail-price_include_tax">
79
- <div>
80
- 3,300円<span class="tax">(税込)</span>
81
- </div>
82
- </div>
83
- </div>
84
- </div>
85
- </div>
86
-
87
- </div>
88
- </div>
89
- </div>
90
- </body>
91
- </html>
@@ -1,62 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="ja">
3
- <head>
4
- <meta charset="euc-jp">
5
- <title>ボーンデジタルオンラインブックストア</title>
6
- <script>
7
- var Colorme = {"page":"product","shop":{"account_id":"PA01427945","title":"\u30dc\u30fc\u30f3\u30c7\u30b8\u30bf\u30eb\u30aa\u30f3\u30e9\u30a4\u30f3\u30d6\u30c3\u30af\u30b9\u30c8\u30a2","pixel_ids":[]},"basket":{"total_price":0,"items":[]},"customer":{"id":null},"inventory_control":"none","product":{"shop_uid":"PA01427945","id":167400957,"name":"\u3010PDF\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u7248\u3011HTML\u89e3\u4f53\u65b0\u66f8 \u30fc\u4ed5\u69d8\u304b\u3089\u7d10\u89e3\u304f\u672c\u683c\u5165\u9580","model_number":"20220061","stock_num":null,"sales_price":3200,"sales_price_including_tax":3520,"variants":[],"category":{"id_big":2520692,"id_small":0},"groups":[{"id":2072447}],"members_price":3200,"members_price_including_tax":3520}};
8
- </script>
9
- </head>
10
- <body>
11
- <div class="p-product-wrap">
12
- <div class="p-product-heading js-product-fix">
13
- <div class="theiaStickySidebar">
14
- <div class="p-product-heading__unit">
15
- <div class="p-large-image">
16
- <div class="p-large-image__image-wrap c-image-wrap">
17
- <div class="c-image-box js-thumbnail-set">
18
- <img src="https://img07.shop-pro.jp/PA01427/945/product/167400957.png?cmsp_timestamp=20220328140327" alt="" class="c-image-box__image js-lazyload" />
19
- </div>
20
- </div>
21
- </div>
22
- </div>
23
- <div id="cart-form" class="p-product-heading__unit">
24
- <div class="p-cart-form">
25
- <div class="p-cart-form__info">
26
- <div class="p-cart-form__name">
27
- 【PDFダウンロード版】HTML解体新書 ー仕様から紐解く本格入門
28
- </div>
29
- <div class="p-cart-form__price c-product-info__price">
30
- 販売価格&nbsp;3,520円(税込)
31
- </div>
32
- </div>
33
- </div>
34
- </div>
35
- </div>
36
- </div>
37
-
38
- <div class="p-product-body">
39
- <div class="p-product-body-inner">
40
- <div class="p-product-body__model">
41
- 20220061
42
- </div>
43
- <div class="p-product-body__name">
44
- 【PDFダウンロード版】HTML解体新書 ー仕様から紐解く本格入門
45
- </div>
46
- <div class="p-product-body__price">
47
- 販売価格&nbsp;3,520円(税込)
48
- </div>
49
- <div class="p-product-body__description">
50
- 判型:B5判、オール2C<br />
51
- 総ページ数:352ページ<br />
52
- 発売日:2022年4月7日<br />
53
- 著者:太田 良典、中村 直樹<br />
54
- 発行・発売:株式会社 ボーンデジタル<br />
55
- <br />
56
- HTMLによる、HTMLのための、HTMLだけの本。
57
- </div>
58
- </div>
59
- </div>
60
- </div>
61
- </body>
62
- </html>
@@ -1,51 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="ja">
3
- <head><meta charset="euc-jp"><title>ボーンデジタルオンラインブックストア</title></head>
4
- <body>
5
- <ul class="c-product-list">
6
-
7
- <li class="c-product-list__item">
8
- <a href="?pid=167400957" class="c-product-list__image-wrap c-image-wrap c-image-wrap--link">
9
- <div class="c-image-box">
10
- <img src="https://img07.shop-pro.jp/PA01427/945/product/167400957_th.png?cmsp_timestamp=20220328140327" alt="【PDFダウンロード版】HTML解体新書 ー仕様から紐解く本格入門" class="c-image-box__image js-lazyload" />
11
- </div>
12
- </a>
13
- <a href="?pid=167400957" class="c-product-list__name">
14
- 【PDFダウンロード版】HTML解体新書 ー仕様から紐解く本格入門
15
- </a>
16
- <div class="c-product-info__price c-product-list__price">
17
- 3,520円(税込)
18
- </div>
19
- </li>
20
-
21
- <li class="c-product-list__item">
22
- <a href="?pid=144269584" class="c-product-list__image-wrap c-image-wrap c-image-wrap--link">
23
- <div class="c-image-box">
24
- <img src="https://img07.shop-pro.jp/PA01427/945/product/144269584_th.jpg?cmsp_timestamp=20190920142519" alt="【電子書籍版】インクルーシブHTML+CSS &amp; JavaScript" class="c-image-box__image js-lazyload" />
25
- </div>
26
- </a>
27
- <a href="?pid=144269584" class="c-product-list__name">
28
- 【電子書籍版】インクルーシブHTML+CSS &amp; JavaScript
29
- </a>
30
- <div class="c-product-info__price c-product-list__price">
31
- 2,640円(税込)
32
- </div>
33
- </li>
34
-
35
- <li class="c-product-list__item">
36
- <a href="?pid=167401111" class="c-product-list__image-wrap c-image-wrap c-image-wrap--link">
37
- <div class="c-image-box">
38
- <img src="https://img07.shop-pro.jp/PA01427/945/product/167401111_th.png?cmsp_timestamp=20220328141320" alt="HTML解体新書 ー仕様から紐解く本格入門" class="c-image-box__image js-lazyload" />
39
- </div>
40
- </a>
41
- <a href="?pid=167401111" class="c-product-list__name">
42
- HTML解体新書 ー仕様から紐解く本格入門
43
- </a>
44
- <div class="c-product-info__price c-product-list__price">
45
- 3,520円(税込)
46
- </div>
47
- </li>
48
-
49
- </ul>
50
- </body>
51
- </html>