@konomi-app/k2 4.1.4 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -21,56 +21,37 @@ var PLUGIN_PRODUCTION_DIRECTORY = path.join(PLUGIN_WORKSPACE_DIRECTORY, "prod");
21
21
  var DEFAULT_PORT = 32767;
22
22
 
23
23
  // src/commands/build-tailwind.ts
24
- import path4 from "path";
25
-
26
- // src/lib/import.ts
27
- import { pathToFileURL } from "url";
28
- import path2 from "path";
29
- var esmImport = (path11) => {
30
- if (process.platform === "win32") {
31
- return import(pathToFileURL(path11).toString());
32
- } else {
33
- return import(path11);
34
- }
35
- };
36
- var importK2Config = async (configFileName) => {
37
- return (await esmImport(path2.resolve(configFileName ?? CONFIG_FILE_NAME))).default;
38
- };
24
+ import path3 from "path";
39
25
 
40
26
  // src/lib/tailwind.ts
41
27
  import chokidar from "chokidar";
42
28
  import cssnanoPlugin from "cssnano";
43
29
  import fs from "fs-extra";
44
30
  import { glob } from "glob";
45
- import path3 from "path";
31
+ import path2 from "path";
46
32
  import postcss from "postcss";
47
33
  import { debounce } from "remeda";
48
- import tailwindcss from "tailwindcss";
34
+ import tailwindcss from "@tailwindcss/postcss";
49
35
  import invariant from "tiny-invariant";
50
- var getTailwindConfigFromK2Config = async (k2Config) => {
51
- invariant(k2Config?.config, "tailwind.config is required");
52
- const config = (await esmImport(path3.resolve(k2Config?.config))).default;
53
- return config;
54
- };
55
36
  var outputCss = async (params) => {
56
- const { inputPath, outputPath, config, minify = false } = params;
37
+ const { inputPath, outputPath, minify = false } = params;
57
38
  const css = await fs.readFile(inputPath, "utf8");
58
- const result = await postcss([tailwindcss(config), ...minify ? [cssnanoPlugin()] : []]).process(
59
- css,
60
- {
61
- from: inputPath,
62
- to: outputPath
63
- }
64
- );
39
+ const result = await postcss([
40
+ tailwindcss({ base: path2.dirname(inputPath), optimize: minify }),
41
+ ...minify ? [cssnanoPlugin()] : []
42
+ ]).process(css, {
43
+ from: inputPath,
44
+ to: outputPath
45
+ });
65
46
  await fs.writeFile(outputPath, result.css);
66
47
  if (result.map) {
67
48
  await fs.writeFile(`${outputPath}.map`, result.map.toString());
68
49
  }
69
50
  };
70
51
  var watchTailwindCSS = async (params) => {
71
- const { input, output, config } = params;
72
- const content = config.content ?? ["./src/**/*.{ts,tsx}"];
73
- const files = await glob([...content, input], { ignore: ["**/node_modules/**"] });
52
+ const { input, output, contentPatterns } = params;
53
+ const patterns = contentPatterns ?? ["./src/**/*.{ts,tsx}"];
54
+ const files = await glob([...patterns, input], { ignore: ["**/node_modules/**"] });
74
55
  const watcher = chokidar.watch(files, {
75
56
  persistent: true,
76
57
  ignoreInitial: true
@@ -78,7 +59,7 @@ var watchTailwindCSS = async (params) => {
78
59
  let isInitialized = false;
79
60
  const processChanges = async (type) => {
80
61
  try {
81
- await outputCss({ inputPath: input, outputPath: output, config });
62
+ await outputCss({ inputPath: input, outputPath: output });
82
63
  params.onChanges?.({ input, output, type });
83
64
  } catch (error) {
84
65
  console.error("Error building Tailwind CSS:", error);
@@ -111,21 +92,33 @@ var watchTailwindCSS = async (params) => {
111
92
 
112
93
  // src/commands/build-tailwind.ts
113
94
  var buildTailwind = async (config) => {
114
- if (!config.tailwind?.css || !config.tailwind?.config) {
95
+ if (!config.tailwind?.css) {
115
96
  return;
116
97
  }
117
- const tailwindConfig = (await esmImport(path4.resolve(config.tailwind.config))).default;
118
- const inputPath = path4.resolve(config.tailwind.css);
98
+ const inputPath = path3.resolve(config.tailwind.css);
119
99
  const fileName = config.tailwind.fileName ?? "tailwind.css";
120
100
  await outputCss({
121
101
  inputPath,
122
- outputPath: path4.join(config.outDir, fileName),
123
- config: tailwindConfig,
102
+ outputPath: path3.join(config.outDir, fileName),
124
103
  minify: true
125
104
  });
126
105
  console.log(`\u2728 Built ${fileName}`);
127
106
  };
128
107
 
108
+ // src/lib/import.ts
109
+ import { pathToFileURL } from "url";
110
+ import path4 from "path";
111
+ var esmImport = (path11) => {
112
+ if (process.platform === "win32") {
113
+ return import(pathToFileURL(path11).toString());
114
+ } else {
115
+ return import(path11);
116
+ }
117
+ };
118
+ var importK2Config = async (configFileName) => {
119
+ return (await esmImport(path4.resolve(configFileName ?? CONFIG_FILE_NAME))).default;
120
+ };
121
+
129
122
  // src/lib/k2.ts
130
123
  var getDefaultK2Config = () => {
131
124
  return {
@@ -316,11 +309,10 @@ import chalk2 from "chalk";
316
309
  import fs3 from "fs-extra";
317
310
  var watchCss = async (params) => {
318
311
  const { k2Config, outdir } = params;
319
- if (!k2Config.tailwind?.css || !k2Config.tailwind?.config) {
320
- console.log("\u{1F6AB} missing tailwind config. Skip watching css.");
312
+ if (!k2Config.tailwind?.css) {
313
+ console.log("\u{1F6AB} missing tailwind css config. Skip watching css.");
321
314
  return;
322
315
  }
323
- const tailwindConfig = await getTailwindConfigFromK2Config(k2Config.tailwind);
324
316
  const input = path7.resolve(k2Config.tailwind.css);
325
317
  const output = path7.join(outdir, "tailwind.css");
326
318
  if (!await fs3.pathExists(output)) {
@@ -329,7 +321,6 @@ var watchCss = async (params) => {
329
321
  return watchTailwindCSS({
330
322
  input,
331
323
  output: path7.join(outdir, "tailwind.css"),
332
- config: tailwindConfig,
333
324
  onChanges: ({ output: output2, type }) => {
334
325
  const outputFileName = path7.basename(output2);
335
326
  console.log(
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/build.ts","../src/lib/constants.ts","../src/commands/build-tailwind.ts","../src/lib/import.ts","../src/lib/tailwind.ts","../src/lib/k2.ts","../src/lib/rsbuild.ts","../src/commands/dev/index.ts","../src/commands/dev/tailwind.ts","../src/lib/cert/index.ts","../src/lib/cert/cert.ts","../src/lib/cert/constants.ts","../src/lib/cert/platforms.ts","../src/lib/logger.ts","../src/commands/genkey.ts","../src/commands/lint.ts","../src/lib/lint.ts"],"sourcesContent":["#!/usr/bin/env node\r\nimport { program } from 'commander';\r\nimport build from './commands/build.js';\r\nimport dev from './commands/dev/index.js';\r\nimport genkey from './commands/genkey.js';\r\nimport lint from './commands/lint.js';\r\n\r\nprogram.name('k2').version('4.0.0').description('k2 - 🍳 kintone kitchen 🍳');\r\n\r\nbuild();\r\ndev();\r\ngenkey();\r\nlint();\r\n\r\nprogram.parse(process.argv);\r\n","import { program } from 'commander';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { WORKSPACE_DIRECTORY } from '../lib/constants.js';\nimport { buildTailwind } from './build-tailwind.js';\nimport { importK2Config } from '../lib/import.js';\nimport { getDefaultK2Config } from '../lib/k2.js';\nimport { buildWithRsbuild, getAppEntryPoints } from '../lib/rsbuild.js';\n\nexport default function command() {\n program\n .command('build')\n .option('-o, --outdir <outdir>', 'Output directory.', path.join(WORKSPACE_DIRECTORY, 'prod'))\n .option('-i, --input <input>', 'Input directory.', path.join('src', 'apps'))\n .option('--config <config>', 'k2 config file path')\n .description('Build the project for production with rsbuild.')\n .action(action);\n}\n\nexport async function action(options: { outdir: string; input: string; config?: string }) {\n console.group('🍳 Build the project for production');\n\n try {\n const { outdir, input, config } = options;\n const outDir = path.resolve(outdir);\n\n const entries = getAppEntryPoints(path.resolve(input));\n const entryNames = Object.keys(entries);\n\n if (entryNames.length === 0) {\n throw new Error(`No entry points found in ${input}`);\n }\n\n console.log(chalk.gray(` Entry points: ${entryNames.join(', ')}`));\n\n const k2Config = config ? await importK2Config(config) : getDefaultK2Config();\n const fullConfig: K2.FullConfig = { ...k2Config, outDir };\n\n const results = await Promise.allSettled([\n buildWithRsbuild({\n entries,\n outDir,\n minify: true,\n sourcemap: false,\n injectStyles: true,\n }),\n buildTailwind(fullConfig),\n ]);\n\n for (const result of results) {\n if (result.status === 'rejected') {\n throw result.reason;\n }\n }\n console.log('✨ Build success.');\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import path from 'path';\n\nexport const WORKSPACE_DIRECTORY = '.k2';\nexport const DEVELOPMENT_DIRECTORY = path.join(WORKSPACE_DIRECTORY, 'dev');\nexport const PRODUCTION_DIRECTORY = path.join(WORKSPACE_DIRECTORY, 'prod');\n\nexport const CONFIG_FILE_NAME = 'k2.config.mjs';\nexport const PLUGIN_CONFIG_FILE_NAME = 'plugin.config.mjs';\n\n/** kintoneプラグインの一時ファイルを管理するフォルダ */\nexport const PLUGIN_WORKSPACE_DIRECTORY = '.plugin';\n/** kintoneプラグインのcontents.zipに格納するファイルを管理するフォルダ */\nexport const PLUGIN_CONTENTS_DIRECTORY = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'contents');\n/** kintoneプラグインの開発時、ローカルサーバーに反映するファイルを管理するフォルダ */\nexport const PLUGIN_DEVELOPMENT_DIRECTORY = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'dev');\n/** kintoneプラグインの本番ビルド出力ディレクトリ */\nexport const PLUGIN_PRODUCTION_DIRECTORY = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'prod');\n\n/** ローカルサーバーのデフォルトポート番号 */\nexport const DEFAULT_PORT = 32767;\n","import path from 'path';\nimport { esmImport } from '../lib/import.js';\nimport { outputCss } from '../lib/tailwind.js';\n\nexport const buildTailwind = async (config: K2.FullConfig) => {\n if (!config.tailwind?.css || !config.tailwind?.config) {\n return;\n }\n const tailwindConfig = (await esmImport(path.resolve(config.tailwind.config))).default;\n\n const inputPath = path.resolve(config.tailwind.css);\n\n const fileName = config.tailwind.fileName ?? 'tailwind.css';\n\n await outputCss({\n inputPath,\n outputPath: path.join(config.outDir, fileName),\n config: tailwindConfig,\n minify: true,\n });\n console.log(`✨ Built ${fileName}`);\n};\n","import { pathToFileURL } from 'url';\nimport { CONFIG_FILE_NAME, PLUGIN_CONFIG_FILE_NAME } from './constants.js';\nimport path from 'path';\n\nexport const esmImport = (path: string) => {\n if (process.platform === 'win32') {\n return import(pathToFileURL(path).toString());\n } else {\n return import(path);\n }\n};\n\nexport const importK2Config = async (configFileName?: string): Promise<K2.Config> => {\n return (await esmImport(path.resolve(configFileName ?? CONFIG_FILE_NAME))).default;\n};\n\nexport const importK2PluginConfig = async (\n configFileName?: string\n): Promise<Plugin.Meta.Config> => {\n return (await esmImport(path.resolve(configFileName ?? PLUGIN_CONFIG_FILE_NAME))).default;\n};\n","import chokidar from 'chokidar';\nimport cssnanoPlugin from 'cssnano';\nimport fs from 'fs-extra';\nimport { glob } from 'glob';\nimport path from 'path';\nimport postcss from 'postcss';\nimport { debounce } from 'remeda';\nimport tailwindcss, { type Config as TailwindConfig } from 'tailwindcss';\nimport invariant from 'tiny-invariant';\nimport { esmImport } from './import.js';\n\nexport const getTailwindConfigFromK2Config = async (\n k2Config: K2.Config['tailwind']\n): Promise<TailwindConfig> => {\n invariant(k2Config?.config, 'tailwind.config is required');\n const config = (await esmImport(path.resolve(k2Config?.config))).default;\n return config;\n};\n\nexport const getTailwindInputCss = (\n config: Plugin.Meta.Config['tailwind']\n): { desktop: string; config: string } => {\n invariant(config?.css, 'tailwind.css is required');\n const { css } = config;\n if (typeof css === 'string') {\n const resolved = path.resolve(css);\n return { desktop: resolved, config: resolved };\n }\n return {\n desktop: path.resolve(css.desktop),\n config: path.resolve(css.config),\n };\n};\n\nexport const getTailwindConfig = async (\n config: Plugin.Meta.Config['tailwind']\n): Promise<{\n desktop: TailwindConfig;\n config: TailwindConfig;\n}> => {\n invariant(config?.config, 'tailwind.config is required');\n\n const { config: configPath } = config;\n\n const configPathForDesktop = typeof configPath === 'string' ? configPath : configPath.desktop;\n const configPathForConfig = typeof configPath === 'string' ? configPath : configPath.config;\n\n const desktopConfig = (await esmImport(path.resolve(configPathForDesktop))).default;\n const configConfig = (await esmImport(path.resolve(configPathForConfig))).default;\n\n return { desktop: desktopConfig, config: configConfig };\n};\n\nexport const outputCss = async (params: {\n inputPath: string;\n outputPath: string;\n config: TailwindConfig;\n minify?: boolean;\n}) => {\n const { inputPath, outputPath, config, minify = false } = params;\n\n const css = await fs.readFile(inputPath, 'utf8');\n\n const result = await postcss([tailwindcss(config), ...(minify ? [cssnanoPlugin()] : [])]).process(\n css,\n {\n from: inputPath,\n to: outputPath,\n }\n );\n\n await fs.writeFile(outputPath, result.css);\n\n if (result.map) {\n await fs.writeFile(`${outputPath}.map`, result.map.toString());\n }\n};\n\ntype WatchType = 'init' | 'add' | 'change' | 'unlink';\n\nexport const watchTailwindCSS = async (params: {\n /** input path */\n input: string;\n /** output path */\n output: string;\n /** tailwindcss config file */\n config: TailwindConfig;\n /** callback function */\n onChanges?: (params: { input: string; output: string; type: WatchType }) => void;\n}) => {\n const { input, output, config } = params;\n\n const content = (config.content as string[] | undefined) ?? ['./src/**/*.{ts,tsx}'];\n\n const files = await glob([...content, input], { ignore: ['**/node_modules/**'] });\n\n const watcher = chokidar.watch(files, {\n persistent: true,\n ignoreInitial: true,\n });\n\n let isInitialized = false;\n\n const processChanges = async (type: WatchType) => {\n try {\n await outputCss({ inputPath: input, outputPath: output, config });\n params.onChanges?.({ input, output, type });\n } catch (error) {\n console.error('Error building Tailwind CSS:', error);\n }\n };\n\n const debouncedProcessChanges = debounce(processChanges, { waitMs: 1000 });\n\n watcher.on('ready', async () => {\n if (!isInitialized) {\n isInitialized = true;\n await processChanges('init');\n }\n });\n\n watcher.on('error', (error) => {\n console.error('Error watching Tailwind CSS:', error);\n });\n\n watcher.on('add', (path) => {\n debouncedProcessChanges.call('add');\n });\n watcher.on('change', (path) => {\n debouncedProcessChanges.call('change');\n });\n watcher.on('unlink', (path) => {\n debouncedProcessChanges.call('unlink');\n });\n watcher.on('unlinkDir', (path) => {\n debouncedProcessChanges.call('unlink');\n });\n\n return watcher;\n};\n","export const getDefaultK2Config = (): K2.Config => {\n return {\n version: 1,\n server: {\n port: 32768,\n },\n };\n};\n","import { createRsbuild, type RsbuildConfig } from '@rsbuild/core';\nimport { pluginReact } from '@rsbuild/plugin-react';\nimport path from 'path';\nimport fs from 'fs-extra';\n\nfunction getRsbuildPlugins() {\n return [\n pluginReact({\n swcReactOptions: {\n runtime: 'automatic',\n },\n }),\n ];\n}\n\nfunction shouldWriteDevAssetToDisk(file: string): boolean {\n return !file.includes('.hot-update.');\n}\n\nasync function removeHotUpdateFiles(outDir: string): Promise<void> {\n if (!fs.existsSync(outDir)) {\n return;\n }\n\n const fileNames = (await fs.readdir(outDir, { encoding: 'utf8' })).map((fileName) =>\n fileName.toString()\n );\n await Promise.all(\n fileNames\n .filter((fileName) => fileName.includes('.hot-update.'))\n .map((fileName) => fs.remove(path.join(outDir, fileName)))\n );\n}\n\n/**\n * rsbuild で本番ビルドを実行します\n */\nexport async function buildWithRsbuild(params: {\n entries: Record<string, string>;\n outDir: string;\n minify?: boolean;\n sourcemap?: boolean | 'inline';\n injectStyles?: boolean;\n}): Promise<void> {\n const { entries, outDir, minify = true, sourcemap = false, injectStyles = true } = params;\n\n const sourceMapConfig =\n sourcemap === 'inline' ? 'cheap-module-source-map' : sourcemap ? 'source-map' : false;\n\n const rsbuild = await createRsbuild({\n rsbuildConfig: {\n plugins: getRsbuildPlugins(),\n source: { entry: entries },\n output: {\n target: 'web',\n distPath: { root: outDir, js: '' },\n filename: { js: '[name].js' },\n filenameHash: false,\n cleanDistPath: true,\n injectStyles,\n sourceMap: { js: sourceMapConfig as any },\n minify,\n },\n performance: {\n chunkSplit: { strategy: 'all-in-one' },\n },\n tools: {\n htmlPlugin: false,\n },\n },\n });\n\n await rsbuild.build();\n}\n\n/**\n * rsbuild 開発サーバーを起動します\n */\nexport async function startRsbuildDevServer(params: {\n entries: Record<string, string>;\n outDir: string;\n port: number;\n https?: { key: Buffer; cert: Buffer };\n publicDir?: string;\n onFirstCompile?: () => void | Promise<void>;\n onRecompile?: () => void | Promise<void>;\n}): Promise<{ port: number; close: () => Promise<void> }> {\n const { entries, outDir, port, https, publicDir, onFirstCompile, onRecompile } = params;\n\n await removeHotUpdateFiles(outDir);\n\n const rsbuildConfig: RsbuildConfig = {\n plugins: getRsbuildPlugins(),\n source: { entry: entries },\n output: {\n target: 'web',\n distPath: { root: outDir, js: '' },\n filename: { js: '[name].js' },\n filenameHash: false,\n cleanDistPath: false,\n injectStyles: true,\n sourceMap: { js: 'cheap-module-source-map' as any },\n minify: false,\n },\n performance: {\n chunkSplit: { strategy: 'all-in-one' },\n },\n tools: {\n htmlPlugin: false,\n },\n server: {\n port,\n host: '0.0.0.0',\n ...(https ? { https } : {}),\n ...(publicDir && fs.existsSync(publicDir) ? { publicDir: { name: publicDir } } : {}),\n },\n dev: {\n writeToDisk: shouldWriteDevAssetToDisk,\n },\n };\n\n const rsbuild = await createRsbuild({ rsbuildConfig });\n\n if (onFirstCompile || onRecompile) {\n rsbuild.addPlugins([\n {\n name: 'k2-dev-hooks',\n setup(api) {\n api.onAfterDevCompile(async ({ isFirstCompile }) => {\n if (isFirstCompile && onFirstCompile) {\n await onFirstCompile();\n } else if (!isFirstCompile && onRecompile) {\n await onRecompile();\n }\n });\n },\n },\n ]);\n }\n\n const result = await rsbuild.startDevServer();\n\n return {\n port: result.port,\n close: result.server.close,\n };\n}\n\n/**\n * プラグインのエントリーポイントを取得します (config, desktop)\n */\nexport function getPluginEntryPoints(params: {\n configEntry: string;\n desktopEntry: string;\n}): Record<string, string> {\n const { configEntry, desktopEntry } = params;\n const entries: Record<string, string> = {};\n\n for (const ext of ['index.ts', 'index.tsx', 'index.js', 'index.jsx']) {\n const configPath = path.join(configEntry, ext);\n if (fs.existsSync(configPath)) {\n entries.config = configPath;\n break;\n }\n }\n\n for (const ext of ['index.ts', 'index.tsx', 'index.js', 'index.jsx']) {\n const desktopPath = path.join(desktopEntry, ext);\n if (fs.existsSync(desktopPath)) {\n entries.desktop = desktopPath;\n break;\n }\n }\n\n return entries;\n}\n\n/**\n * アプリのエントリーポイントをディレクトリから取得します\n */\nexport function getAppEntryPoints(inputDir: string): Record<string, string> {\n if (!fs.existsSync(inputDir)) {\n return {};\n }\n\n const allProjects = fs.readdirSync(inputDir);\n return allProjects.reduce<Record<string, string>>((acc, dir) => {\n const dirPath = path.join(inputDir, dir);\n if (!fs.statSync(dirPath).isDirectory()) return acc;\n\n for (const filename of ['index.ts', 'index.tsx', 'index.js', 'index.jsx', 'index.mjs']) {\n const filePath = path.join(inputDir, dir, filename);\n if (fs.existsSync(filePath)) {\n return { ...acc, [dir]: filePath };\n }\n }\n return acc;\n }, {});\n}\n","import { program } from 'commander';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\nimport {\n CONFIG_FILE_NAME,\n DEFAULT_PORT,\n DEVELOPMENT_DIRECTORY,\n WORKSPACE_DIRECTORY,\n} from '../../lib/constants.js';\nimport { importK2Config } from '../../lib/import.js';\nimport { watchCss } from './tailwind.js';\nimport { generateCert, hasCertificates, loadCertificates } from '../../lib/cert/index.js';\nimport { startRsbuildDevServer, getAppEntryPoints } from '../../lib/rsbuild.js';\n\nexport default function command() {\n program\n .command('dev')\n .description('Start development server with rsbuild.')\n .option('-i, --input <input>', 'Input directory', 'src/apps')\n .option('-o, --outdir <outdir>', 'Output directory.', DEVELOPMENT_DIRECTORY)\n .option('-c, --certdir <certdir>', 'Certificate directory', WORKSPACE_DIRECTORY)\n .option('--config <config>', 'k2 config file path')\n .option('-p, --port <port>', 'Port number')\n .action(action);\n}\n\nexport async function action(options: {\n outdir: string;\n certdir: string;\n port?: string;\n config?: string;\n input: string;\n}) {\n const { certdir, outdir, config, port: specifiedPort, input } = options;\n console.group('🍳 Start development server');\n try {\n console.log(`📂 Output directory: ${outdir}`);\n console.log(`🔑 Certificate directory: ${certdir}`);\n\n let k2Config: null | K2.Config = null;\n try {\n k2Config = await importK2Config(config);\n } catch (error) {\n console.log(`⚙ ${CONFIG_FILE_NAME} not found. use default settings.`);\n }\n\n const port = Number(specifiedPort ?? k2Config?.server?.port ?? DEFAULT_PORT);\n const certDirPath = path.resolve(certdir);\n const outputDir = path.resolve(outdir);\n const inputDir = path.resolve(input);\n\n // SSL証明書の確認・生成 (node-forge使用、mkcert不要)\n if (!hasCertificates(certDirPath)) {\n console.log(chalk.yellow('📜 SSL certificates not found. Generating with node-forge...'));\n try {\n generateCert(certDirPath);\n console.log(chalk.green('✅ SSL certificates generated successfully'));\n } catch (error) {\n console.log(chalk.red('❌ Failed to generate SSL certificates.'));\n throw error;\n }\n }\n\n const entries = getAppEntryPoints(inputDir);\n const entryNames = Object.keys(entries);\n\n if (entryNames.length === 0) {\n throw new Error(`No entry points found in ${input}`);\n }\n\n console.log(chalk.gray(` Entry points: ${entryNames.join(', ')}`));\n\n const { key, cert } = loadCertificates(certDirPath);\n\n // rsbuild 開発サーバー起動 (ビルド + ファイル監視 + 配信を自動で行う)\n const { port: actualPort } = await startRsbuildDevServer({\n entries,\n outDir: outputDir,\n port,\n https: { key, cert },\n publicDir: outputDir,\n onFirstCompile: () => {\n console.log(chalk.green(`\\n✨ Development server ready!`));\n console.log(chalk.cyan(` Local: https://localhost:${actualPort}`));\n console.log(chalk.gray(` Output: ${outputDir}`));\n console.log(chalk.gray('\\n Watching for changes...\\n'));\n },\n onRecompile: () => {\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[rsbuild] `) +\n `rebuild complete`\n );\n },\n });\n\n // TailwindCSS監視\n if (k2Config) {\n await watchCss({ k2Config, outdir });\n }\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import path from 'path';\nimport chalk from 'chalk';\nimport { getTailwindConfigFromK2Config, watchTailwindCSS } from '../../lib/tailwind.js';\nimport fs from 'fs-extra';\n\nexport const watchCss = async (params: { k2Config: K2.Config; outdir: string }) => {\n const { k2Config, outdir } = params;\n if (!k2Config.tailwind?.css || !k2Config.tailwind?.config) {\n console.log('🚫 missing tailwind config. Skip watching css.');\n return;\n }\n\n const tailwindConfig = await getTailwindConfigFromK2Config(k2Config.tailwind);\n\n const input = path.resolve(k2Config.tailwind.css);\n const output = path.join(outdir, 'tailwind.css');\n\n if (!(await fs.pathExists(output))) {\n await fs.outputFile(output, '');\n }\n\n return watchTailwindCSS({\n input,\n output: path.join(outdir, 'tailwind.css'),\n config: tailwindConfig,\n onChanges: ({ output, type }) => {\n const outputFileName = path.basename(output);\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[css] `) +\n outputFileName +\n (type === 'init' ? ' init' : ` rebuilt(${type})`)\n );\n },\n });\n};\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { createCA, createCert } from './cert.js';\nimport { isSupported, pkgDir, rootCAPath, rootCAKeyPath } from './constants.js';\nimport { addToTrustStores, removeFromTrustStores } from './platforms.js';\n\n/** SSL証明書のファイル名 */\nexport const CERT_KEY_FILENAME = 'localhost-key.pem';\nexport const CERT_FILENAME = 'localhost-cert.pem';\n\n/**\n * CA証明書を信頼ストアから削除します\n */\nexport function uninstall(): void {\n removeFromTrustStores(rootCAPath);\n fs.removeSync(pkgDir);\n}\n\n/**\n * ルートCA証明書をインストールし、システムの信頼ストアに追加します\n */\nexport function install(options: { validity?: number } = {}): void {\n const { validity = 7300 } = options;\n\n if (!isSupported) {\n throw new Error(`Platform not supported: \"${process.platform}\"`);\n }\n\n if (!fs.existsSync(rootCAPath) && !fs.existsSync(rootCAKeyPath)) {\n const ca = createCA({ validity });\n fs.outputFileSync(rootCAPath, ca.cert);\n fs.outputFileSync(rootCAKeyPath, ca.key);\n try {\n addToTrustStores(rootCAPath);\n } catch {\n console.warn(\n '⚠ Failed to add CA to system trust store. You may need to trust the certificate manually.'\n );\n }\n }\n}\n\n/**\n * 指定されたドメインのSSL証明書を生成します\n */\nexport function certificateFor(requestedDomains: string | string[] = []): {\n key: string;\n cert: string;\n} {\n const validity = 7300;\n install({ validity });\n\n const requests = Array.isArray(requestedDomains) ? requestedDomains : [requestedDomains];\n const domains = [\n ...new Set(['localhost', 'localhost.localdomain', '127.0.0.1', '0.0.0.0', '::1', ...requests]),\n ];\n\n const ca = {\n cert: fs.readFileSync(rootCAPath),\n key: fs.readFileSync(rootCAKeyPath),\n };\n\n return createCert({ ca, domains, validity });\n}\n\n/**\n * SSL証明書を生成し、指定ディレクトリに保存します\n */\nexport function generateCert(outDir: string): { key: string; cert: string } {\n fs.ensureDirSync(outDir);\n const result = certificateFor();\n fs.outputFileSync(path.join(outDir, CERT_FILENAME), result.cert);\n fs.outputFileSync(path.join(outDir, CERT_KEY_FILENAME), result.key);\n return result;\n}\n\n/**\n * SSL証明書が存在するか確認します\n */\nexport function hasCertificates(certDir: string): boolean {\n return (\n fs.existsSync(path.join(certDir, CERT_KEY_FILENAME)) &&\n fs.existsSync(path.join(certDir, CERT_FILENAME))\n );\n}\n\n/**\n * SSL証明書を読み込みます\n */\nexport function loadCertificates(certDir: string): { key: Buffer; cert: Buffer } {\n return {\n key: fs.readFileSync(path.join(certDir, CERT_KEY_FILENAME)),\n cert: fs.readFileSync(path.join(certDir, CERT_FILENAME)),\n };\n}\n","import forge from 'node-forge';\nimport net from 'node:net';\n\nconst { md, pki } = forge;\n\nfunction createCertificate(\n serial: string,\n publicKey: forge.pki.rsa.PublicKey,\n subject: forge.pki.CertificateField[],\n issuer: forge.pki.CertificateField[],\n extensions: any[],\n validity: number,\n signWith: forge.pki.rsa.PrivateKey\n): forge.pki.Certificate {\n const cert = pki.createCertificate();\n cert.serialNumber = Buffer.from(serial).toString('hex');\n cert.publicKey = publicKey;\n cert.setSubject(subject);\n cert.setIssuer(issuer);\n cert.setExtensions(extensions);\n cert.validity.notBefore = new Date();\n cert.validity.notAfter = new Date();\n cert.validity.notAfter.setDate(cert.validity.notAfter.getDate() + validity);\n cert.sign(signWith, md.sha256.create());\n return cert;\n}\n\nfunction generateCertInternal(params: {\n subject: forge.pki.CertificateField[];\n issuer: forge.pki.CertificateField[];\n extensions: any[];\n validity: number;\n signWith?: string;\n}): { key: string; cert: string } {\n const { subject, issuer, extensions, validity, signWith } = params;\n const serial = Math.floor(Math.random() * 95000 + 50000).toString();\n const keyPair = pki.rsa.generateKeyPair(2048);\n const privateKey = signWith ? pki.privateKeyFromPem(signWith) : keyPair.privateKey;\n\n const cert = createCertificate(\n serial,\n keyPair.publicKey,\n subject,\n issuer,\n extensions,\n validity,\n privateKey\n );\n\n return {\n key: pki.privateKeyToPem(keyPair.privateKey),\n cert: pki.certificateToPem(cert),\n };\n}\n\n/**\n * ルートCA証明書を生成します\n */\nexport function createCA(\n params: {\n organization?: string;\n countryCode?: string;\n state?: string;\n locality?: string;\n validity?: number;\n } = {}\n): { key: string; cert: string } {\n const {\n organization = 'K2 Development CA',\n countryCode = 'JP',\n state = 'Tokyo',\n locality = 'Tokyo',\n validity = 7300,\n } = params;\n\n const attributes: forge.pki.CertificateField[] = [\n { name: 'commonName', value: organization },\n { name: 'countryName', value: countryCode },\n { name: 'stateOrProvinceName', value: state },\n { name: 'localityName', value: locality },\n { name: 'organizationName', value: organization },\n ];\n\n const extensions = [\n { name: 'basicConstraints', cA: true, critical: true },\n { name: 'keyUsage', keyCertSign: true, critical: true },\n ];\n\n return generateCertInternal({\n subject: attributes,\n issuer: attributes,\n extensions,\n validity,\n });\n}\n\n/**\n * CA証明書で署名されたサーバー証明書を生成します\n */\nexport function createCert(params: {\n ca: { cert: string | Buffer; key: string | Buffer };\n domains: string[];\n validity?: number;\n}): { key: string; cert: string } {\n const { ca, domains, validity = 7300 } = params;\n\n const attributes: forge.pki.CertificateField[] = [{ name: 'commonName', value: domains[0] }];\n\n const extensions = [\n { name: 'basicConstraints', cA: false, critical: true },\n {\n name: 'keyUsage',\n digitalSignature: true,\n keyEncipherment: true,\n critical: true,\n },\n { name: 'extKeyUsage', serverAuth: true, clientAuth: true },\n {\n name: 'subjectAltName',\n altNames: domains.map((domain) => {\n const TYPE_DOMAIN = 2;\n const TYPE_IP = 7;\n return net.isIP(domain)\n ? { type: TYPE_IP, ip: domain }\n : { type: TYPE_DOMAIN, value: domain };\n }),\n },\n ];\n\n const caCert = pki.certificateFromPem(ca.cert.toString());\n\n return generateCertInternal({\n subject: attributes,\n issuer: caCert.subject.attributes,\n extensions,\n validity,\n signWith: ca.key.toString(),\n });\n}\n","import path from 'path';\n\nconst PKG_NAME = 'k2';\n\nexport const isSupported =\n process.platform === 'darwin' || process.platform === 'linux' || process.platform === 'win32';\n\nfunction getApplicationConfigPath(name: string): string {\n if (process.platform === 'darwin') {\n return path.join(process.env.HOME!, 'Library', 'Application Support', name);\n }\n if (process.platform === 'win32') {\n return process.env.LOCALAPPDATA\n ? path.join(process.env.LOCALAPPDATA, name)\n : path.join(process.env.USERPROFILE!, 'Local Settings', 'Application Data', name);\n }\n // linux\n return process.env.XDG_CONFIG_HOME\n ? path.join(process.env.XDG_CONFIG_HOME, name)\n : path.join(process.env.HOME!, '.config', name);\n}\n\nexport const pkgDir = getApplicationConfigPath(PKG_NAME);\nexport const rootCAPath = path.resolve(pkgDir, 'rootCA.pem');\nexport const rootCAKeyPath = path.resolve(pkgDir, 'rootCA-key.pem');\nexport { PKG_NAME };\n","import { spawnSync } from 'node:child_process';\nimport { PKG_NAME } from './constants.js';\nimport logger from '../logger.js';\n\n// --- macOS ---\nfunction addToTrustStoresDarwin(certPath: string): void {\n logger.log('Adding certificate to trusted store. Admin rights may be required.');\n spawnSync(\n 'sudo',\n [\n 'security',\n 'add-trusted-cert',\n '-d',\n '-r',\n 'trustRoot',\n '-k',\n '/Library/Keychains/System.keychain',\n '-p',\n 'ssl',\n '-p',\n 'basic',\n certPath,\n ],\n { stdio: 'inherit' }\n );\n}\n\nfunction removeFromTrustStoresDarwin(certPath: string): void {\n logger.log('Removing certificate from trusted store. Admin rights may be required.');\n spawnSync('sudo', ['security', 'remove-trusted-cert', '-d', certPath], {\n stdio: 'ignore',\n });\n}\n\n// --- Linux ---\nconst targetCA = `/usr/local/share/ca-certificates/${PKG_NAME}.crt`;\n\nfunction addToTrustStoresLinux(certPath: string): void {\n logger.log('Adding certificate to trusted store. Admin rights may be required.');\n spawnSync('sudo', ['cp', certPath, targetCA]);\n spawnSync('sudo', ['update-ca-certificates']);\n}\n\nfunction removeFromTrustStoresLinux(): void {\n logger.log('Removing certificate from trusted store. Admin rights may be required.');\n spawnSync('sudo', ['rm', targetCA], { stdio: 'inherit' });\n spawnSync('sudo', ['update-ca-certificates']);\n}\n\n// --- Windows ---\nfunction addToTrustStoresWin32(certPath: string): void {\n spawnSync('certutil', ['-addstore', '-user', 'root', certPath], {\n stdio: 'inherit',\n });\n}\n\nfunction removeFromTrustStoresWin32(): void {\n spawnSync('certutil', ['-delstore', '-user', 'root', PKG_NAME], {\n stdio: 'inherit',\n });\n}\n\n// --- Platform dispatcher ---\nexport function addToTrustStores(certPath: string): void {\n switch (process.platform) {\n case 'darwin':\n return addToTrustStoresDarwin(certPath);\n case 'linux':\n return addToTrustStoresLinux(certPath);\n case 'win32':\n return addToTrustStoresWin32(certPath);\n }\n}\n\nexport function removeFromTrustStores(certPath?: string): void {\n switch (process.platform) {\n case 'darwin':\n if (certPath) removeFromTrustStoresDarwin(certPath);\n return;\n case 'linux':\n return removeFromTrustStoresLinux();\n case 'win32':\n return removeFromTrustStoresWin32();\n }\n}\n","const PKG_NAME = '@konomi-app/k2';\n\nexport function createLogger(prefix = PKG_NAME) {\n return {\n log: (...args: unknown[]) => console.log(`[${prefix}]`, ...args),\n info: (...args: unknown[]) => console.info(`[${prefix}]`, ...args),\n warn: (...args: unknown[]) => console.warn(`[${prefix}]`, ...args),\n error: (...args: unknown[]) => console.error(`[${prefix}]`, ...args),\n };\n}\n\nexport default createLogger();\n","import { program } from 'commander';\nimport { WORKSPACE_DIRECTORY } from '../lib/constants.js';\nimport { generateCert } from '../lib/cert/index.js';\n\nexport default function command() {\n program\n .command('genkey')\n .description('Generate SSL certificate for localhost using node-forge.')\n .option('-o, --output <output>', 'Output directory.', WORKSPACE_DIRECTORY)\n .action(action);\n}\n\nexport async function action(options: { output: string }) {\n const { output } = options;\n\n console.group('🍳 Generate SSL certificate for localhost');\n try {\n generateCert(output);\n console.log(`🔑 Certificate generated. Output to ./${output}`);\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import { program } from 'commander';\nimport { lint } from '../lib/lint.js';\n\nexport default function command() {\n program\n .command('lint')\n .description('Lint source files')\n .option('-c, --config <config>', 'Config file path')\n .action(action);\n}\n\nexport async function action(options: {\n outdir: string;\n certdir: string;\n port: string;\n input: string;\n}) {\n try {\n lint();\n } catch (error) {\n throw error;\n } finally {\n }\n}\n","import { ESLint } from 'eslint';\nimport globals from 'globals';\nimport pluginJs from '@eslint/js';\nimport tseslint from 'typescript-eslint';\nimport pluginReact from 'eslint-plugin-react';\n\nexport async function lint() {\n const eslint = new ESLint({\n baseConfig: [\n { files: ['**/*.{js,mjs,cjs,ts,jsx,tsx}'] },\n { languageOptions: { globals: globals.browser } },\n pluginJs.configs.recommended,\n // ...tseslint.configs.recommended,\n ...(pluginReact.configs.flat?.recommended ? [pluginReact.configs.flat.recommended] : []),\n ],\n });\n\n const results = await eslint.lintFiles(['src/**/*.{ts,tsx?}']);\n\n const formatter = await eslint.loadFormatter('stylish');\n const resultText = formatter.format(results);\n\n console.group('👕 Lint Results');\n console.log(resultText);\n console.groupEnd();\n\n const hasErrors = results.some((result) => result.errorCount > 0);\n if (hasErrors) {\n console.error('🚨 Lint errors found');\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["program","path","path","path","path","path","path","path","path","fs","fs","path","path","program","path","chalk","path","chalk","fs","path","output","chalk","fs","path","path","PKG_NAME","fs","path","command","program","action","path","chalk","program","command","program","action","program","pluginReact","command","program","action","program","command"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/build.ts","../src/lib/constants.ts","../src/commands/build-tailwind.ts","../src/lib/tailwind.ts","../src/lib/import.ts","../src/lib/k2.ts","../src/lib/rsbuild.ts","../src/commands/dev/index.ts","../src/commands/dev/tailwind.ts","../src/lib/cert/index.ts","../src/lib/cert/cert.ts","../src/lib/cert/constants.ts","../src/lib/cert/platforms.ts","../src/lib/logger.ts","../src/commands/genkey.ts","../src/commands/lint.ts","../src/lib/lint.ts"],"sourcesContent":["#!/usr/bin/env node\r\nimport { program } from 'commander';\r\nimport build from './commands/build.js';\r\nimport dev from './commands/dev/index.js';\r\nimport genkey from './commands/genkey.js';\r\nimport lint from './commands/lint.js';\r\n\r\nprogram.name('k2').version('4.0.0').description('k2 - 🍳 kintone kitchen 🍳');\r\n\r\nbuild();\r\ndev();\r\ngenkey();\r\nlint();\r\n\r\nprogram.parse(process.argv);\r\n","import { program } from 'commander';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { WORKSPACE_DIRECTORY } from '../lib/constants.js';\nimport { buildTailwind } from './build-tailwind.js';\nimport { importK2Config } from '../lib/import.js';\nimport { getDefaultK2Config } from '../lib/k2.js';\nimport { buildWithRsbuild, getAppEntryPoints } from '../lib/rsbuild.js';\n\nexport default function command() {\n program\n .command('build')\n .option('-o, --outdir <outdir>', 'Output directory.', path.join(WORKSPACE_DIRECTORY, 'prod'))\n .option('-i, --input <input>', 'Input directory.', path.join('src', 'apps'))\n .option('--config <config>', 'k2 config file path')\n .description('Build the project for production with rsbuild.')\n .action(action);\n}\n\nexport async function action(options: { outdir: string; input: string; config?: string }) {\n console.group('🍳 Build the project for production');\n\n try {\n const { outdir, input, config } = options;\n const outDir = path.resolve(outdir);\n\n const entries = getAppEntryPoints(path.resolve(input));\n const entryNames = Object.keys(entries);\n\n if (entryNames.length === 0) {\n throw new Error(`No entry points found in ${input}`);\n }\n\n console.log(chalk.gray(` Entry points: ${entryNames.join(', ')}`));\n\n const k2Config = config ? await importK2Config(config) : getDefaultK2Config();\n const fullConfig: K2.FullConfig = { ...k2Config, outDir };\n\n const results = await Promise.allSettled([\n buildWithRsbuild({\n entries,\n outDir,\n minify: true,\n sourcemap: false,\n injectStyles: true,\n }),\n buildTailwind(fullConfig),\n ]);\n\n for (const result of results) {\n if (result.status === 'rejected') {\n throw result.reason;\n }\n }\n console.log('✨ Build success.');\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import path from 'path';\n\nexport const WORKSPACE_DIRECTORY = '.k2';\nexport const DEVELOPMENT_DIRECTORY = path.join(WORKSPACE_DIRECTORY, 'dev');\nexport const PRODUCTION_DIRECTORY = path.join(WORKSPACE_DIRECTORY, 'prod');\n\nexport const CONFIG_FILE_NAME = 'k2.config.mjs';\nexport const PLUGIN_CONFIG_FILE_NAME = 'plugin.config.mjs';\n\n/** kintoneプラグインの一時ファイルを管理するフォルダ */\nexport const PLUGIN_WORKSPACE_DIRECTORY = '.plugin';\n/** kintoneプラグインのcontents.zipに格納するファイルを管理するフォルダ */\nexport const PLUGIN_CONTENTS_DIRECTORY = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'contents');\n/** kintoneプラグインの開発時、ローカルサーバーに反映するファイルを管理するフォルダ */\nexport const PLUGIN_DEVELOPMENT_DIRECTORY = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'dev');\n/** kintoneプラグインの本番ビルド出力ディレクトリ */\nexport const PLUGIN_PRODUCTION_DIRECTORY = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'prod');\n\n/** ローカルサーバーのデフォルトポート番号 */\nexport const DEFAULT_PORT = 32767;\n","import path from 'path';\nimport { outputCss } from '../lib/tailwind.js';\n\nexport const buildTailwind = async (config: K2.FullConfig) => {\n if (!config.tailwind?.css) {\n return;\n }\n\n const inputPath = path.resolve(config.tailwind.css);\n const fileName = config.tailwind.fileName ?? 'tailwind.css';\n\n await outputCss({\n inputPath,\n outputPath: path.join(config.outDir, fileName),\n minify: true,\n });\n console.log(`✨ Built ${fileName}`);\n};\n","import chokidar from 'chokidar';\nimport cssnanoPlugin from 'cssnano';\nimport fs from 'fs-extra';\nimport { glob } from 'glob';\nimport path from 'path';\nimport postcss from 'postcss';\nimport { debounce } from 'remeda';\nimport tailwindcss from '@tailwindcss/postcss';\nimport invariant from 'tiny-invariant';\n\nexport const getTailwindInputCss = (\n config: Plugin.Meta.Config['tailwind']\n): { desktop: string; config: string } => {\n invariant(config?.css, 'tailwind.css is required');\n const { css } = config;\n if (typeof css === 'string') {\n const resolved = path.resolve(css);\n return { desktop: resolved, config: resolved };\n }\n return {\n desktop: path.resolve(css.desktop),\n config: path.resolve(css.config),\n };\n};\n\nexport const outputCss = async (params: {\n inputPath: string;\n outputPath: string;\n minify?: boolean;\n}) => {\n const { inputPath, outputPath, minify = false } = params;\n\n const css = await fs.readFile(inputPath, 'utf8');\n\n const result = await postcss([\n tailwindcss({ base: path.dirname(inputPath), optimize: minify }),\n ...(minify ? [cssnanoPlugin()] : []),\n ]).process(css, {\n from: inputPath,\n to: outputPath,\n });\n\n await fs.writeFile(outputPath, result.css);\n\n if (result.map) {\n await fs.writeFile(`${outputPath}.map`, result.map.toString());\n }\n};\n\ntype WatchType = 'init' | 'add' | 'change' | 'unlink';\n\nexport const watchTailwindCSS = async (params: {\n /** input path */\n input: string;\n /** output path */\n output: string;\n /** content glob patterns for file watching */\n contentPatterns?: string[];\n /** callback function */\n onChanges?: (params: { input: string; output: string; type: WatchType }) => void;\n}) => {\n const { input, output, contentPatterns } = params;\n\n const patterns = contentPatterns ?? ['./src/**/*.{ts,tsx}'];\n\n const files = await glob([...patterns, input], { ignore: ['**/node_modules/**'] });\n\n const watcher = chokidar.watch(files, {\n persistent: true,\n ignoreInitial: true,\n });\n\n let isInitialized = false;\n\n const processChanges = async (type: WatchType) => {\n try {\n await outputCss({ inputPath: input, outputPath: output });\n params.onChanges?.({ input, output, type });\n } catch (error) {\n console.error('Error building Tailwind CSS:', error);\n }\n };\n\n const debouncedProcessChanges = debounce(processChanges, { waitMs: 1000 });\n\n watcher.on('ready', async () => {\n if (!isInitialized) {\n isInitialized = true;\n await processChanges('init');\n }\n });\n\n watcher.on('error', (error) => {\n console.error('Error watching Tailwind CSS:', error);\n });\n\n watcher.on('add', (path) => {\n debouncedProcessChanges.call('add');\n });\n watcher.on('change', (path) => {\n debouncedProcessChanges.call('change');\n });\n watcher.on('unlink', (path) => {\n debouncedProcessChanges.call('unlink');\n });\n watcher.on('unlinkDir', (path) => {\n debouncedProcessChanges.call('unlink');\n });\n\n return watcher;\n};\n","import { pathToFileURL } from 'url';\nimport { CONFIG_FILE_NAME, PLUGIN_CONFIG_FILE_NAME } from './constants.js';\nimport path from 'path';\n\nexport const esmImport = (path: string) => {\n if (process.platform === 'win32') {\n return import(pathToFileURL(path).toString());\n } else {\n return import(path);\n }\n};\n\nexport const importK2Config = async (configFileName?: string): Promise<K2.Config> => {\n return (await esmImport(path.resolve(configFileName ?? CONFIG_FILE_NAME))).default;\n};\n\nexport const importK2PluginConfig = async (\n configFileName?: string\n): Promise<Plugin.Meta.Config> => {\n return (await esmImport(path.resolve(configFileName ?? PLUGIN_CONFIG_FILE_NAME))).default;\n};\n","export const getDefaultK2Config = (): K2.Config => {\n return {\n version: 1,\n server: {\n port: 32768,\n },\n };\n};\n","import { createRsbuild, type RsbuildConfig } from '@rsbuild/core';\nimport { pluginReact } from '@rsbuild/plugin-react';\nimport path from 'path';\nimport fs from 'fs-extra';\n\nfunction getRsbuildPlugins() {\n return [\n pluginReact({\n swcReactOptions: {\n runtime: 'automatic',\n },\n }),\n ];\n}\n\nfunction shouldWriteDevAssetToDisk(file: string): boolean {\n return !file.includes('.hot-update.');\n}\n\nasync function removeHotUpdateFiles(outDir: string): Promise<void> {\n if (!fs.existsSync(outDir)) {\n return;\n }\n\n const fileNames = (await fs.readdir(outDir, { encoding: 'utf8' })).map((fileName) =>\n fileName.toString()\n );\n await Promise.all(\n fileNames\n .filter((fileName) => fileName.includes('.hot-update.'))\n .map((fileName) => fs.remove(path.join(outDir, fileName)))\n );\n}\n\n/**\n * rsbuild で本番ビルドを実行します\n */\nexport async function buildWithRsbuild(params: {\n entries: Record<string, string>;\n outDir: string;\n minify?: boolean;\n sourcemap?: boolean | 'inline';\n injectStyles?: boolean;\n}): Promise<void> {\n const { entries, outDir, minify = true, sourcemap = false, injectStyles = true } = params;\n\n const sourceMapConfig =\n sourcemap === 'inline' ? 'cheap-module-source-map' : sourcemap ? 'source-map' : false;\n\n const rsbuild = await createRsbuild({\n rsbuildConfig: {\n plugins: getRsbuildPlugins(),\n source: { entry: entries },\n output: {\n target: 'web',\n distPath: { root: outDir, js: '' },\n filename: { js: '[name].js' },\n filenameHash: false,\n cleanDistPath: true,\n injectStyles,\n sourceMap: { js: sourceMapConfig as any },\n minify,\n },\n performance: {\n chunkSplit: { strategy: 'all-in-one' },\n },\n tools: {\n htmlPlugin: false,\n },\n },\n });\n\n await rsbuild.build();\n}\n\n/**\n * rsbuild 開発サーバーを起動します\n */\nexport async function startRsbuildDevServer(params: {\n entries: Record<string, string>;\n outDir: string;\n port: number;\n https?: { key: Buffer; cert: Buffer };\n publicDir?: string;\n onFirstCompile?: () => void | Promise<void>;\n onRecompile?: () => void | Promise<void>;\n}): Promise<{ port: number; close: () => Promise<void> }> {\n const { entries, outDir, port, https, publicDir, onFirstCompile, onRecompile } = params;\n\n await removeHotUpdateFiles(outDir);\n\n const rsbuildConfig: RsbuildConfig = {\n plugins: getRsbuildPlugins(),\n source: { entry: entries },\n output: {\n target: 'web',\n distPath: { root: outDir, js: '' },\n filename: { js: '[name].js' },\n filenameHash: false,\n cleanDistPath: false,\n injectStyles: true,\n sourceMap: { js: 'cheap-module-source-map' as any },\n minify: false,\n },\n performance: {\n chunkSplit: { strategy: 'all-in-one' },\n },\n tools: {\n htmlPlugin: false,\n },\n server: {\n port,\n host: '0.0.0.0',\n ...(https ? { https } : {}),\n ...(publicDir && fs.existsSync(publicDir) ? { publicDir: { name: publicDir } } : {}),\n },\n dev: {\n writeToDisk: shouldWriteDevAssetToDisk,\n },\n };\n\n const rsbuild = await createRsbuild({ rsbuildConfig });\n\n if (onFirstCompile || onRecompile) {\n rsbuild.addPlugins([\n {\n name: 'k2-dev-hooks',\n setup(api) {\n api.onAfterDevCompile(async ({ isFirstCompile }) => {\n if (isFirstCompile && onFirstCompile) {\n await onFirstCompile();\n } else if (!isFirstCompile && onRecompile) {\n await onRecompile();\n }\n });\n },\n },\n ]);\n }\n\n const result = await rsbuild.startDevServer();\n\n return {\n port: result.port,\n close: result.server.close,\n };\n}\n\n/**\n * プラグインのエントリーポイントを取得します (config, desktop)\n */\nexport function getPluginEntryPoints(params: {\n configEntry: string;\n desktopEntry: string;\n}): Record<string, string> {\n const { configEntry, desktopEntry } = params;\n const entries: Record<string, string> = {};\n\n for (const ext of ['index.ts', 'index.tsx', 'index.js', 'index.jsx']) {\n const configPath = path.join(configEntry, ext);\n if (fs.existsSync(configPath)) {\n entries.config = configPath;\n break;\n }\n }\n\n for (const ext of ['index.ts', 'index.tsx', 'index.js', 'index.jsx']) {\n const desktopPath = path.join(desktopEntry, ext);\n if (fs.existsSync(desktopPath)) {\n entries.desktop = desktopPath;\n break;\n }\n }\n\n return entries;\n}\n\n/**\n * アプリのエントリーポイントをディレクトリから取得します\n */\nexport function getAppEntryPoints(inputDir: string): Record<string, string> {\n if (!fs.existsSync(inputDir)) {\n return {};\n }\n\n const allProjects = fs.readdirSync(inputDir);\n return allProjects.reduce<Record<string, string>>((acc, dir) => {\n const dirPath = path.join(inputDir, dir);\n if (!fs.statSync(dirPath).isDirectory()) return acc;\n\n for (const filename of ['index.ts', 'index.tsx', 'index.js', 'index.jsx', 'index.mjs']) {\n const filePath = path.join(inputDir, dir, filename);\n if (fs.existsSync(filePath)) {\n return { ...acc, [dir]: filePath };\n }\n }\n return acc;\n }, {});\n}\n","import { program } from 'commander';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\nimport {\n CONFIG_FILE_NAME,\n DEFAULT_PORT,\n DEVELOPMENT_DIRECTORY,\n WORKSPACE_DIRECTORY,\n} from '../../lib/constants.js';\nimport { importK2Config } from '../../lib/import.js';\nimport { watchCss } from './tailwind.js';\nimport { generateCert, hasCertificates, loadCertificates } from '../../lib/cert/index.js';\nimport { startRsbuildDevServer, getAppEntryPoints } from '../../lib/rsbuild.js';\n\nexport default function command() {\n program\n .command('dev')\n .description('Start development server with rsbuild.')\n .option('-i, --input <input>', 'Input directory', 'src/apps')\n .option('-o, --outdir <outdir>', 'Output directory.', DEVELOPMENT_DIRECTORY)\n .option('-c, --certdir <certdir>', 'Certificate directory', WORKSPACE_DIRECTORY)\n .option('--config <config>', 'k2 config file path')\n .option('-p, --port <port>', 'Port number')\n .action(action);\n}\n\nexport async function action(options: {\n outdir: string;\n certdir: string;\n port?: string;\n config?: string;\n input: string;\n}) {\n const { certdir, outdir, config, port: specifiedPort, input } = options;\n console.group('🍳 Start development server');\n try {\n console.log(`📂 Output directory: ${outdir}`);\n console.log(`🔑 Certificate directory: ${certdir}`);\n\n let k2Config: null | K2.Config = null;\n try {\n k2Config = await importK2Config(config);\n } catch (error) {\n console.log(`⚙ ${CONFIG_FILE_NAME} not found. use default settings.`);\n }\n\n const port = Number(specifiedPort ?? k2Config?.server?.port ?? DEFAULT_PORT);\n const certDirPath = path.resolve(certdir);\n const outputDir = path.resolve(outdir);\n const inputDir = path.resolve(input);\n\n // SSL証明書の確認・生成 (node-forge使用、mkcert不要)\n if (!hasCertificates(certDirPath)) {\n console.log(chalk.yellow('📜 SSL certificates not found. Generating with node-forge...'));\n try {\n generateCert(certDirPath);\n console.log(chalk.green('✅ SSL certificates generated successfully'));\n } catch (error) {\n console.log(chalk.red('❌ Failed to generate SSL certificates.'));\n throw error;\n }\n }\n\n const entries = getAppEntryPoints(inputDir);\n const entryNames = Object.keys(entries);\n\n if (entryNames.length === 0) {\n throw new Error(`No entry points found in ${input}`);\n }\n\n console.log(chalk.gray(` Entry points: ${entryNames.join(', ')}`));\n\n const { key, cert } = loadCertificates(certDirPath);\n\n // rsbuild 開発サーバー起動 (ビルド + ファイル監視 + 配信を自動で行う)\n const { port: actualPort } = await startRsbuildDevServer({\n entries,\n outDir: outputDir,\n port,\n https: { key, cert },\n publicDir: outputDir,\n onFirstCompile: () => {\n console.log(chalk.green(`\\n✨ Development server ready!`));\n console.log(chalk.cyan(` Local: https://localhost:${actualPort}`));\n console.log(chalk.gray(` Output: ${outputDir}`));\n console.log(chalk.gray('\\n Watching for changes...\\n'));\n },\n onRecompile: () => {\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[rsbuild] `) +\n `rebuild complete`\n );\n },\n });\n\n // TailwindCSS監視\n if (k2Config) {\n await watchCss({ k2Config, outdir });\n }\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import path from 'path';\nimport chalk from 'chalk';\nimport { watchTailwindCSS } from '../../lib/tailwind.js';\nimport fs from 'fs-extra';\n\nexport const watchCss = async (params: { k2Config: K2.Config; outdir: string }) => {\n const { k2Config, outdir } = params;\n if (!k2Config.tailwind?.css) {\n console.log('🚫 missing tailwind css config. Skip watching css.');\n return;\n }\n\n const input = path.resolve(k2Config.tailwind.css);\n const output = path.join(outdir, 'tailwind.css');\n\n if (!(await fs.pathExists(output))) {\n await fs.outputFile(output, '');\n }\n\n return watchTailwindCSS({\n input,\n output: path.join(outdir, 'tailwind.css'),\n onChanges: ({ output, type }) => {\n const outputFileName = path.basename(output);\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[css] `) +\n outputFileName +\n (type === 'init' ? ' init' : ` rebuilt(${type})`)\n );\n },\n });\n};\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { createCA, createCert } from './cert.js';\nimport { isSupported, pkgDir, rootCAPath, rootCAKeyPath } from './constants.js';\nimport { addToTrustStores, removeFromTrustStores } from './platforms.js';\n\n/** SSL証明書のファイル名 */\nexport const CERT_KEY_FILENAME = 'localhost-key.pem';\nexport const CERT_FILENAME = 'localhost-cert.pem';\n\n/**\n * CA証明書を信頼ストアから削除します\n */\nexport function uninstall(): void {\n removeFromTrustStores(rootCAPath);\n fs.removeSync(pkgDir);\n}\n\n/**\n * ルートCA証明書をインストールし、システムの信頼ストアに追加します\n */\nexport function install(options: { validity?: number } = {}): void {\n const { validity = 7300 } = options;\n\n if (!isSupported) {\n throw new Error(`Platform not supported: \"${process.platform}\"`);\n }\n\n if (!fs.existsSync(rootCAPath) && !fs.existsSync(rootCAKeyPath)) {\n const ca = createCA({ validity });\n fs.outputFileSync(rootCAPath, ca.cert);\n fs.outputFileSync(rootCAKeyPath, ca.key);\n try {\n addToTrustStores(rootCAPath);\n } catch {\n console.warn(\n '⚠ Failed to add CA to system trust store. You may need to trust the certificate manually.'\n );\n }\n }\n}\n\n/**\n * 指定されたドメインのSSL証明書を生成します\n */\nexport function certificateFor(requestedDomains: string | string[] = []): {\n key: string;\n cert: string;\n} {\n const validity = 7300;\n install({ validity });\n\n const requests = Array.isArray(requestedDomains) ? requestedDomains : [requestedDomains];\n const domains = [\n ...new Set(['localhost', 'localhost.localdomain', '127.0.0.1', '0.0.0.0', '::1', ...requests]),\n ];\n\n const ca = {\n cert: fs.readFileSync(rootCAPath),\n key: fs.readFileSync(rootCAKeyPath),\n };\n\n return createCert({ ca, domains, validity });\n}\n\n/**\n * SSL証明書を生成し、指定ディレクトリに保存します\n */\nexport function generateCert(outDir: string): { key: string; cert: string } {\n fs.ensureDirSync(outDir);\n const result = certificateFor();\n fs.outputFileSync(path.join(outDir, CERT_FILENAME), result.cert);\n fs.outputFileSync(path.join(outDir, CERT_KEY_FILENAME), result.key);\n return result;\n}\n\n/**\n * SSL証明書が存在するか確認します\n */\nexport function hasCertificates(certDir: string): boolean {\n return (\n fs.existsSync(path.join(certDir, CERT_KEY_FILENAME)) &&\n fs.existsSync(path.join(certDir, CERT_FILENAME))\n );\n}\n\n/**\n * SSL証明書を読み込みます\n */\nexport function loadCertificates(certDir: string): { key: Buffer; cert: Buffer } {\n return {\n key: fs.readFileSync(path.join(certDir, CERT_KEY_FILENAME)),\n cert: fs.readFileSync(path.join(certDir, CERT_FILENAME)),\n };\n}\n","import forge from 'node-forge';\nimport net from 'node:net';\n\nconst { md, pki } = forge;\n\nfunction createCertificate(\n serial: string,\n publicKey: forge.pki.rsa.PublicKey,\n subject: forge.pki.CertificateField[],\n issuer: forge.pki.CertificateField[],\n extensions: any[],\n validity: number,\n signWith: forge.pki.rsa.PrivateKey\n): forge.pki.Certificate {\n const cert = pki.createCertificate();\n cert.serialNumber = Buffer.from(serial).toString('hex');\n cert.publicKey = publicKey;\n cert.setSubject(subject);\n cert.setIssuer(issuer);\n cert.setExtensions(extensions);\n cert.validity.notBefore = new Date();\n cert.validity.notAfter = new Date();\n cert.validity.notAfter.setDate(cert.validity.notAfter.getDate() + validity);\n cert.sign(signWith, md.sha256.create());\n return cert;\n}\n\nfunction generateCertInternal(params: {\n subject: forge.pki.CertificateField[];\n issuer: forge.pki.CertificateField[];\n extensions: any[];\n validity: number;\n signWith?: string;\n}): { key: string; cert: string } {\n const { subject, issuer, extensions, validity, signWith } = params;\n const serial = Math.floor(Math.random() * 95000 + 50000).toString();\n const keyPair = pki.rsa.generateKeyPair(2048);\n const privateKey = signWith ? pki.privateKeyFromPem(signWith) : keyPair.privateKey;\n\n const cert = createCertificate(\n serial,\n keyPair.publicKey,\n subject,\n issuer,\n extensions,\n validity,\n privateKey\n );\n\n return {\n key: pki.privateKeyToPem(keyPair.privateKey),\n cert: pki.certificateToPem(cert),\n };\n}\n\n/**\n * ルートCA証明書を生成します\n */\nexport function createCA(\n params: {\n organization?: string;\n countryCode?: string;\n state?: string;\n locality?: string;\n validity?: number;\n } = {}\n): { key: string; cert: string } {\n const {\n organization = 'K2 Development CA',\n countryCode = 'JP',\n state = 'Tokyo',\n locality = 'Tokyo',\n validity = 7300,\n } = params;\n\n const attributes: forge.pki.CertificateField[] = [\n { name: 'commonName', value: organization },\n { name: 'countryName', value: countryCode },\n { name: 'stateOrProvinceName', value: state },\n { name: 'localityName', value: locality },\n { name: 'organizationName', value: organization },\n ];\n\n const extensions = [\n { name: 'basicConstraints', cA: true, critical: true },\n { name: 'keyUsage', keyCertSign: true, critical: true },\n ];\n\n return generateCertInternal({\n subject: attributes,\n issuer: attributes,\n extensions,\n validity,\n });\n}\n\n/**\n * CA証明書で署名されたサーバー証明書を生成します\n */\nexport function createCert(params: {\n ca: { cert: string | Buffer; key: string | Buffer };\n domains: string[];\n validity?: number;\n}): { key: string; cert: string } {\n const { ca, domains, validity = 7300 } = params;\n\n const attributes: forge.pki.CertificateField[] = [{ name: 'commonName', value: domains[0] }];\n\n const extensions = [\n { name: 'basicConstraints', cA: false, critical: true },\n {\n name: 'keyUsage',\n digitalSignature: true,\n keyEncipherment: true,\n critical: true,\n },\n { name: 'extKeyUsage', serverAuth: true, clientAuth: true },\n {\n name: 'subjectAltName',\n altNames: domains.map((domain) => {\n const TYPE_DOMAIN = 2;\n const TYPE_IP = 7;\n return net.isIP(domain)\n ? { type: TYPE_IP, ip: domain }\n : { type: TYPE_DOMAIN, value: domain };\n }),\n },\n ];\n\n const caCert = pki.certificateFromPem(ca.cert.toString());\n\n return generateCertInternal({\n subject: attributes,\n issuer: caCert.subject.attributes,\n extensions,\n validity,\n signWith: ca.key.toString(),\n });\n}\n","import path from 'path';\n\nconst PKG_NAME = 'k2';\n\nexport const isSupported =\n process.platform === 'darwin' || process.platform === 'linux' || process.platform === 'win32';\n\nfunction getApplicationConfigPath(name: string): string {\n if (process.platform === 'darwin') {\n return path.join(process.env.HOME!, 'Library', 'Application Support', name);\n }\n if (process.platform === 'win32') {\n return process.env.LOCALAPPDATA\n ? path.join(process.env.LOCALAPPDATA, name)\n : path.join(process.env.USERPROFILE!, 'Local Settings', 'Application Data', name);\n }\n // linux\n return process.env.XDG_CONFIG_HOME\n ? path.join(process.env.XDG_CONFIG_HOME, name)\n : path.join(process.env.HOME!, '.config', name);\n}\n\nexport const pkgDir = getApplicationConfigPath(PKG_NAME);\nexport const rootCAPath = path.resolve(pkgDir, 'rootCA.pem');\nexport const rootCAKeyPath = path.resolve(pkgDir, 'rootCA-key.pem');\nexport { PKG_NAME };\n","import { spawnSync } from 'node:child_process';\nimport { PKG_NAME } from './constants.js';\nimport logger from '../logger.js';\n\n// --- macOS ---\nfunction addToTrustStoresDarwin(certPath: string): void {\n logger.log('Adding certificate to trusted store. Admin rights may be required.');\n spawnSync(\n 'sudo',\n [\n 'security',\n 'add-trusted-cert',\n '-d',\n '-r',\n 'trustRoot',\n '-k',\n '/Library/Keychains/System.keychain',\n '-p',\n 'ssl',\n '-p',\n 'basic',\n certPath,\n ],\n { stdio: 'inherit' }\n );\n}\n\nfunction removeFromTrustStoresDarwin(certPath: string): void {\n logger.log('Removing certificate from trusted store. Admin rights may be required.');\n spawnSync('sudo', ['security', 'remove-trusted-cert', '-d', certPath], {\n stdio: 'ignore',\n });\n}\n\n// --- Linux ---\nconst targetCA = `/usr/local/share/ca-certificates/${PKG_NAME}.crt`;\n\nfunction addToTrustStoresLinux(certPath: string): void {\n logger.log('Adding certificate to trusted store. Admin rights may be required.');\n spawnSync('sudo', ['cp', certPath, targetCA]);\n spawnSync('sudo', ['update-ca-certificates']);\n}\n\nfunction removeFromTrustStoresLinux(): void {\n logger.log('Removing certificate from trusted store. Admin rights may be required.');\n spawnSync('sudo', ['rm', targetCA], { stdio: 'inherit' });\n spawnSync('sudo', ['update-ca-certificates']);\n}\n\n// --- Windows ---\nfunction addToTrustStoresWin32(certPath: string): void {\n spawnSync('certutil', ['-addstore', '-user', 'root', certPath], {\n stdio: 'inherit',\n });\n}\n\nfunction removeFromTrustStoresWin32(): void {\n spawnSync('certutil', ['-delstore', '-user', 'root', PKG_NAME], {\n stdio: 'inherit',\n });\n}\n\n// --- Platform dispatcher ---\nexport function addToTrustStores(certPath: string): void {\n switch (process.platform) {\n case 'darwin':\n return addToTrustStoresDarwin(certPath);\n case 'linux':\n return addToTrustStoresLinux(certPath);\n case 'win32':\n return addToTrustStoresWin32(certPath);\n }\n}\n\nexport function removeFromTrustStores(certPath?: string): void {\n switch (process.platform) {\n case 'darwin':\n if (certPath) removeFromTrustStoresDarwin(certPath);\n return;\n case 'linux':\n return removeFromTrustStoresLinux();\n case 'win32':\n return removeFromTrustStoresWin32();\n }\n}\n","const PKG_NAME = '@konomi-app/k2';\n\nexport function createLogger(prefix = PKG_NAME) {\n return {\n log: (...args: unknown[]) => console.log(`[${prefix}]`, ...args),\n info: (...args: unknown[]) => console.info(`[${prefix}]`, ...args),\n warn: (...args: unknown[]) => console.warn(`[${prefix}]`, ...args),\n error: (...args: unknown[]) => console.error(`[${prefix}]`, ...args),\n };\n}\n\nexport default createLogger();\n","import { program } from 'commander';\nimport { WORKSPACE_DIRECTORY } from '../lib/constants.js';\nimport { generateCert } from '../lib/cert/index.js';\n\nexport default function command() {\n program\n .command('genkey')\n .description('Generate SSL certificate for localhost using node-forge.')\n .option('-o, --output <output>', 'Output directory.', WORKSPACE_DIRECTORY)\n .action(action);\n}\n\nexport async function action(options: { output: string }) {\n const { output } = options;\n\n console.group('🍳 Generate SSL certificate for localhost');\n try {\n generateCert(output);\n console.log(`🔑 Certificate generated. Output to ./${output}`);\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import { program } from 'commander';\nimport { lint } from '../lib/lint.js';\n\nexport default function command() {\n program\n .command('lint')\n .description('Lint source files')\n .option('-c, --config <config>', 'Config file path')\n .action(action);\n}\n\nexport async function action(options: {\n outdir: string;\n certdir: string;\n port: string;\n input: string;\n}) {\n try {\n lint();\n } catch (error) {\n throw error;\n } finally {\n }\n}\n","import { ESLint } from 'eslint';\nimport globals from 'globals';\nimport pluginJs from '@eslint/js';\nimport tseslint from 'typescript-eslint';\nimport pluginReact from 'eslint-plugin-react';\n\nexport async function lint() {\n const eslint = new ESLint({\n baseConfig: [\n { files: ['**/*.{js,mjs,cjs,ts,jsx,tsx}'] },\n { languageOptions: { globals: globals.browser } },\n pluginJs.configs.recommended,\n // ...tseslint.configs.recommended,\n ...(pluginReact.configs.flat?.recommended ? [pluginReact.configs.flat.recommended] : []),\n ],\n });\n\n const results = await eslint.lintFiles(['src/**/*.{ts,tsx?}']);\n\n const formatter = await eslint.loadFormatter('stylish');\n const resultText = formatter.format(results);\n\n console.group('👕 Lint Results');\n console.log(resultText);\n console.groupEnd();\n\n const hasErrors = results.some((result) => result.errorCount > 0);\n if (hasErrors) {\n console.error('🚨 Lint errors found');\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["program","path","path","path","path","path","path","path","fs","fs","path","path","program","path","chalk","path","chalk","fs","path","output","chalk","fs","path","path","PKG_NAME","fs","path","command","program","action","path","chalk","program","command","program","action","program","pluginReact","command","program","action","program","command"]}
package/dist/plugin.js CHANGED
@@ -43,7 +43,7 @@ import { glob } from "glob";
43
43
  import path3 from "path";
44
44
  import postcss from "postcss";
45
45
  import { debounce } from "remeda";
46
- import tailwindcss from "tailwindcss";
46
+ import tailwindcss from "@tailwindcss/postcss";
47
47
  import invariant from "tiny-invariant";
48
48
  var getTailwindInputCss = (config2) => {
49
49
  invariant(config2?.css, "tailwind.css is required");
@@ -57,34 +57,25 @@ var getTailwindInputCss = (config2) => {
57
57
  config: path3.resolve(css.config)
58
58
  };
59
59
  };
60
- var getTailwindConfig = async (config2) => {
61
- invariant(config2?.config, "tailwind.config is required");
62
- const { config: configPath } = config2;
63
- const configPathForDesktop = typeof configPath === "string" ? configPath : configPath.desktop;
64
- const configPathForConfig = typeof configPath === "string" ? configPath : configPath.config;
65
- const desktopConfig = (await esmImport(path3.resolve(configPathForDesktop))).default;
66
- const configConfig = (await esmImport(path3.resolve(configPathForConfig))).default;
67
- return { desktop: desktopConfig, config: configConfig };
68
- };
69
60
  var outputCss = async (params) => {
70
- const { inputPath, outputPath, config: config2, minify = false } = params;
61
+ const { inputPath, outputPath, minify = false } = params;
71
62
  const css = await fs.readFile(inputPath, "utf8");
72
- const result = await postcss([tailwindcss(config2), ...minify ? [cssnanoPlugin()] : []]).process(
73
- css,
74
- {
75
- from: inputPath,
76
- to: outputPath
77
- }
78
- );
63
+ const result = await postcss([
64
+ tailwindcss({ base: path3.dirname(inputPath), optimize: minify }),
65
+ ...minify ? [cssnanoPlugin()] : []
66
+ ]).process(css, {
67
+ from: inputPath,
68
+ to: outputPath
69
+ });
79
70
  await fs.writeFile(outputPath, result.css);
80
71
  if (result.map) {
81
72
  await fs.writeFile(`${outputPath}.map`, result.map.toString());
82
73
  }
83
74
  };
84
75
  var watchTailwindCSS = async (params) => {
85
- const { input, output, config: config2 } = params;
86
- const content = config2.content ?? ["./src/**/*.{ts,tsx}"];
87
- const files = await glob([...content, input], { ignore: ["**/node_modules/**"] });
76
+ const { input, output, contentPatterns } = params;
77
+ const patterns = contentPatterns ?? ["./src/**/*.{ts,tsx}"];
78
+ const files = await glob([...patterns, input], { ignore: ["**/node_modules/**"] });
88
79
  const watcher = chokidar.watch(files, {
89
80
  persistent: true,
90
81
  ignoreInitial: true
@@ -92,7 +83,7 @@ var watchTailwindCSS = async (params) => {
92
83
  let isInitialized = false;
93
84
  const processChanges = async (type) => {
94
85
  try {
95
- await outputCss({ inputPath: input, outputPath: output, config: config2 });
86
+ await outputCss({ inputPath: input, outputPath: output });
96
87
  params.onChanges?.({ input, output, type });
97
88
  } catch (error) {
98
89
  console.error("Error building Tailwind CSS:", error);
@@ -297,20 +288,17 @@ async function action() {
297
288
  if (!fs3.existsSync(PLUGIN_CONTENTS_DIRECTORY)) {
298
289
  await fs3.mkdir(PLUGIN_CONTENTS_DIRECTORY, { recursive: true });
299
290
  }
300
- if (config2.tailwind?.css && config2.tailwind?.config) {
301
- const tailwindConfig = await getTailwindConfig(config2.tailwind);
291
+ if (config2.tailwind?.css) {
302
292
  const inputFile = getTailwindInputCss(config2.tailwind);
303
293
  await outputCss({
304
294
  inputPath: inputFile.config,
305
295
  outputPath: path5.join(PLUGIN_CONTENTS_DIRECTORY, "config.css"),
306
- config: tailwindConfig.config,
307
296
  minify: true
308
297
  });
309
298
  console.log("\u2728 Built config.css");
310
299
  await outputCss({
311
300
  inputPath: inputFile.desktop,
312
301
  outputPath: path5.join(PLUGIN_CONTENTS_DIRECTORY, "desktop.css"),
313
- config: tailwindConfig.desktop,
314
302
  minify: true
315
303
  });
316
304
  console.log("\u2728 Built desktop.css");
@@ -614,16 +602,14 @@ var getManifest = async (params) => {
614
602
 
615
603
  // src/commands/plugin-dev/tailwind.ts
616
604
  import path9 from "path";
617
- import "tailwindcss";
618
605
  import chalk2 from "chalk";
619
606
  async function buildTailwindCSS(params) {
620
- const { inputFile, outputFileName, config: config2 } = params;
607
+ const { inputFile, outputFileName } = params;
621
608
  const inputPath = path9.resolve(inputFile);
622
609
  const outputPath = path9.join(PLUGIN_DEVELOPMENT_DIRECTORY, outputFileName);
623
610
  return watchTailwindCSS({
624
611
  input: inputPath,
625
612
  output: outputPath,
626
- config: config2,
627
613
  onChanges: ({ output, type }) => {
628
614
  const outputFileName2 = path9.basename(output);
629
615
  console.log(
@@ -633,21 +619,18 @@ async function buildTailwindCSS(params) {
633
619
  });
634
620
  }
635
621
  var watchCss = async (pluginConfig) => {
636
- if (!pluginConfig.tailwind?.css || !pluginConfig.tailwind?.config) {
622
+ if (!pluginConfig.tailwind?.css) {
637
623
  return;
638
624
  }
639
- const tailwindConfig = await getTailwindConfig(pluginConfig.tailwind);
640
625
  const inputFile = getTailwindInputCss(pluginConfig.tailwind);
641
626
  return Promise.all([
642
627
  buildTailwindCSS({
643
628
  inputFile: inputFile.desktop,
644
- outputFileName: "desktop.css",
645
- config: tailwindConfig.desktop
629
+ outputFileName: "desktop.css"
646
630
  }),
647
631
  buildTailwindCSS({
648
632
  inputFile: inputFile.config,
649
- outputFileName: "config.css",
650
- config: tailwindConfig.config
633
+ outputFileName: "config.css"
651
634
  })
652
635
  ]);
653
636
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts","../src/commands/plugin-build.ts","../src/lib/constants.ts","../src/lib/import.ts","../src/lib/tailwind.ts","../src/lib/lint.ts","../src/lib/rsbuild.ts","../src/commands/plugin-dev/index.ts","../src/lib/cert/index.ts","../src/lib/cert/cert.ts","../src/lib/cert/constants.ts","../src/lib/cert/platforms.ts","../src/lib/logger.ts","../src/lib/plugin-manifest.ts","../src/commands/plugin-dev/create-manifest.ts","../src/commands/plugin-dev/tailwind.ts","../src/lib/plugin-contents.ts","../src/lib/zip.ts","../src/lib/rsa.ts","../src/lib/kintone-api-client.ts","../src/commands/plugin-dev/upload.ts","../src/commands/plugin-genkey.ts","../src/commands/plugin-init.ts","../src/commands/manifest/index.ts","../src/commands/test/index.ts","../src/commands/plugin-zip.ts","../src/lib/utils.ts","../src/commands/lint.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { program } from 'commander';\nimport build from './commands/plugin-build.js';\nimport dev from './commands/plugin-dev/index.js';\nimport genkey from './commands/plugin-genkey.js';\nimport init from './commands/plugin-init.js';\nimport manifest from './commands/manifest/index.js';\nimport test from './commands/test/index.js';\nimport zip from './commands/plugin-zip.js';\nimport lint from './commands/lint.js';\n\nprogram.name('plugin').version('4.0.0').description('🍳 kintone kitchen 🍳 for kintone plugin');\n\nbuild();\ndev();\ngenkey();\ninit();\nmanifest();\ntest();\nzip();\nlint();\n\nprogram.parse(process.argv);\n","import { program } from 'commander';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { PLUGIN_CONTENTS_DIRECTORY } from '../lib/constants.js';\nimport { importK2PluginConfig } from '../lib/import.js';\nimport { getTailwindConfig, getTailwindInputCss, outputCss } from '../lib/tailwind.js';\nimport { lint } from '../lib/lint.js';\nimport { buildWithRsbuild, getPluginEntryPoints } from '../lib/rsbuild.js';\n\nexport default function command() {\n program\n .command('build')\n .description('Build the plugin for production with rsbuild.')\n .action(action);\n}\n\nexport async function action() {\n console.group('🍳 Build the plugin for production');\n\n try {\n const config = await importK2PluginConfig();\n\n if (config?.lint?.build) {\n await lint();\n console.log('✨ Lint success.');\n }\n\n if (!fs.existsSync(PLUGIN_CONTENTS_DIRECTORY)) {\n await fs.mkdir(PLUGIN_CONTENTS_DIRECTORY, { recursive: true });\n }\n\n // Tailwind CSS ビルド\n if (config.tailwind?.css && config.tailwind?.config) {\n const tailwindConfig = await getTailwindConfig(config.tailwind);\n const inputFile = getTailwindInputCss(config.tailwind);\n\n await outputCss({\n inputPath: inputFile.config,\n outputPath: path.join(PLUGIN_CONTENTS_DIRECTORY, 'config.css'),\n config: tailwindConfig.config,\n minify: true,\n });\n console.log('✨ Built config.css');\n\n await outputCss({\n inputPath: inputFile.desktop,\n outputPath: path.join(PLUGIN_CONTENTS_DIRECTORY, 'desktop.css'),\n config: tailwindConfig.desktop,\n minify: true,\n });\n console.log('✨ Built desktop.css');\n }\n\n // rsbuild でJSビルド\n const entries = getPluginEntryPoints({\n configEntry: path.resolve('src', 'config'),\n desktopEntry: path.resolve('src', 'desktop'),\n });\n\n const entryNames = Object.keys(entries);\n if (entryNames.length === 0) {\n throw new Error('No entry points found for plugin. Check src/config and src/desktop paths.');\n }\n\n console.log(chalk.gray(` Entry points: ${entryNames.join(', ')}`));\n\n await buildWithRsbuild({\n entries,\n outDir: PLUGIN_CONTENTS_DIRECTORY,\n minify: true,\n sourcemap: false,\n injectStyles: true,\n });\n\n console.log('✨ Built desktop.js and config.js');\n console.log('✨ Build success.');\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import path from 'path';\n\nexport const WORKSPACE_DIRECTORY = '.k2';\nexport const DEVELOPMENT_DIRECTORY = path.join(WORKSPACE_DIRECTORY, 'dev');\nexport const PRODUCTION_DIRECTORY = path.join(WORKSPACE_DIRECTORY, 'prod');\n\nexport const CONFIG_FILE_NAME = 'k2.config.mjs';\nexport const PLUGIN_CONFIG_FILE_NAME = 'plugin.config.mjs';\n\n/** kintoneプラグインの一時ファイルを管理するフォルダ */\nexport const PLUGIN_WORKSPACE_DIRECTORY = '.plugin';\n/** kintoneプラグインのcontents.zipに格納するファイルを管理するフォルダ */\nexport const PLUGIN_CONTENTS_DIRECTORY = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'contents');\n/** kintoneプラグインの開発時、ローカルサーバーに反映するファイルを管理するフォルダ */\nexport const PLUGIN_DEVELOPMENT_DIRECTORY = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'dev');\n/** kintoneプラグインの本番ビルド出力ディレクトリ */\nexport const PLUGIN_PRODUCTION_DIRECTORY = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'prod');\n\n/** ローカルサーバーのデフォルトポート番号 */\nexport const DEFAULT_PORT = 32767;\n","import { pathToFileURL } from 'url';\nimport { CONFIG_FILE_NAME, PLUGIN_CONFIG_FILE_NAME } from './constants.js';\nimport path from 'path';\n\nexport const esmImport = (path: string) => {\n if (process.platform === 'win32') {\n return import(pathToFileURL(path).toString());\n } else {\n return import(path);\n }\n};\n\nexport const importK2Config = async (configFileName?: string): Promise<K2.Config> => {\n return (await esmImport(path.resolve(configFileName ?? CONFIG_FILE_NAME))).default;\n};\n\nexport const importK2PluginConfig = async (\n configFileName?: string\n): Promise<Plugin.Meta.Config> => {\n return (await esmImport(path.resolve(configFileName ?? PLUGIN_CONFIG_FILE_NAME))).default;\n};\n","import chokidar from 'chokidar';\nimport cssnanoPlugin from 'cssnano';\nimport fs from 'fs-extra';\nimport { glob } from 'glob';\nimport path from 'path';\nimport postcss from 'postcss';\nimport { debounce } from 'remeda';\nimport tailwindcss, { type Config as TailwindConfig } from 'tailwindcss';\nimport invariant from 'tiny-invariant';\nimport { esmImport } from './import.js';\n\nexport const getTailwindConfigFromK2Config = async (\n k2Config: K2.Config['tailwind']\n): Promise<TailwindConfig> => {\n invariant(k2Config?.config, 'tailwind.config is required');\n const config = (await esmImport(path.resolve(k2Config?.config))).default;\n return config;\n};\n\nexport const getTailwindInputCss = (\n config: Plugin.Meta.Config['tailwind']\n): { desktop: string; config: string } => {\n invariant(config?.css, 'tailwind.css is required');\n const { css } = config;\n if (typeof css === 'string') {\n const resolved = path.resolve(css);\n return { desktop: resolved, config: resolved };\n }\n return {\n desktop: path.resolve(css.desktop),\n config: path.resolve(css.config),\n };\n};\n\nexport const getTailwindConfig = async (\n config: Plugin.Meta.Config['tailwind']\n): Promise<{\n desktop: TailwindConfig;\n config: TailwindConfig;\n}> => {\n invariant(config?.config, 'tailwind.config is required');\n\n const { config: configPath } = config;\n\n const configPathForDesktop = typeof configPath === 'string' ? configPath : configPath.desktop;\n const configPathForConfig = typeof configPath === 'string' ? configPath : configPath.config;\n\n const desktopConfig = (await esmImport(path.resolve(configPathForDesktop))).default;\n const configConfig = (await esmImport(path.resolve(configPathForConfig))).default;\n\n return { desktop: desktopConfig, config: configConfig };\n};\n\nexport const outputCss = async (params: {\n inputPath: string;\n outputPath: string;\n config: TailwindConfig;\n minify?: boolean;\n}) => {\n const { inputPath, outputPath, config, minify = false } = params;\n\n const css = await fs.readFile(inputPath, 'utf8');\n\n const result = await postcss([tailwindcss(config), ...(minify ? [cssnanoPlugin()] : [])]).process(\n css,\n {\n from: inputPath,\n to: outputPath,\n }\n );\n\n await fs.writeFile(outputPath, result.css);\n\n if (result.map) {\n await fs.writeFile(`${outputPath}.map`, result.map.toString());\n }\n};\n\ntype WatchType = 'init' | 'add' | 'change' | 'unlink';\n\nexport const watchTailwindCSS = async (params: {\n /** input path */\n input: string;\n /** output path */\n output: string;\n /** tailwindcss config file */\n config: TailwindConfig;\n /** callback function */\n onChanges?: (params: { input: string; output: string; type: WatchType }) => void;\n}) => {\n const { input, output, config } = params;\n\n const content = (config.content as string[] | undefined) ?? ['./src/**/*.{ts,tsx}'];\n\n const files = await glob([...content, input], { ignore: ['**/node_modules/**'] });\n\n const watcher = chokidar.watch(files, {\n persistent: true,\n ignoreInitial: true,\n });\n\n let isInitialized = false;\n\n const processChanges = async (type: WatchType) => {\n try {\n await outputCss({ inputPath: input, outputPath: output, config });\n params.onChanges?.({ input, output, type });\n } catch (error) {\n console.error('Error building Tailwind CSS:', error);\n }\n };\n\n const debouncedProcessChanges = debounce(processChanges, { waitMs: 1000 });\n\n watcher.on('ready', async () => {\n if (!isInitialized) {\n isInitialized = true;\n await processChanges('init');\n }\n });\n\n watcher.on('error', (error) => {\n console.error('Error watching Tailwind CSS:', error);\n });\n\n watcher.on('add', (path) => {\n debouncedProcessChanges.call('add');\n });\n watcher.on('change', (path) => {\n debouncedProcessChanges.call('change');\n });\n watcher.on('unlink', (path) => {\n debouncedProcessChanges.call('unlink');\n });\n watcher.on('unlinkDir', (path) => {\n debouncedProcessChanges.call('unlink');\n });\n\n return watcher;\n};\n","import { ESLint } from 'eslint';\nimport globals from 'globals';\nimport pluginJs from '@eslint/js';\nimport tseslint from 'typescript-eslint';\nimport pluginReact from 'eslint-plugin-react';\n\nexport async function lint() {\n const eslint = new ESLint({\n baseConfig: [\n { files: ['**/*.{js,mjs,cjs,ts,jsx,tsx}'] },\n { languageOptions: { globals: globals.browser } },\n pluginJs.configs.recommended,\n // ...tseslint.configs.recommended,\n ...(pluginReact.configs.flat?.recommended ? [pluginReact.configs.flat.recommended] : []),\n ],\n });\n\n const results = await eslint.lintFiles(['src/**/*.{ts,tsx?}']);\n\n const formatter = await eslint.loadFormatter('stylish');\n const resultText = formatter.format(results);\n\n console.group('👕 Lint Results');\n console.log(resultText);\n console.groupEnd();\n\n const hasErrors = results.some((result) => result.errorCount > 0);\n if (hasErrors) {\n console.error('🚨 Lint errors found');\n process.exit(1);\n }\n}\n","import { createRsbuild, type RsbuildConfig } from '@rsbuild/core';\nimport { pluginReact } from '@rsbuild/plugin-react';\nimport path from 'path';\nimport fs from 'fs-extra';\n\nfunction getRsbuildPlugins() {\n return [\n pluginReact({\n swcReactOptions: {\n runtime: 'automatic',\n },\n }),\n ];\n}\n\nfunction shouldWriteDevAssetToDisk(file: string): boolean {\n return !file.includes('.hot-update.');\n}\n\nasync function removeHotUpdateFiles(outDir: string): Promise<void> {\n if (!fs.existsSync(outDir)) {\n return;\n }\n\n const fileNames = (await fs.readdir(outDir, { encoding: 'utf8' })).map((fileName) =>\n fileName.toString()\n );\n await Promise.all(\n fileNames\n .filter((fileName) => fileName.includes('.hot-update.'))\n .map((fileName) => fs.remove(path.join(outDir, fileName)))\n );\n}\n\n/**\n * rsbuild で本番ビルドを実行します\n */\nexport async function buildWithRsbuild(params: {\n entries: Record<string, string>;\n outDir: string;\n minify?: boolean;\n sourcemap?: boolean | 'inline';\n injectStyles?: boolean;\n}): Promise<void> {\n const { entries, outDir, minify = true, sourcemap = false, injectStyles = true } = params;\n\n const sourceMapConfig =\n sourcemap === 'inline' ? 'cheap-module-source-map' : sourcemap ? 'source-map' : false;\n\n const rsbuild = await createRsbuild({\n rsbuildConfig: {\n plugins: getRsbuildPlugins(),\n source: { entry: entries },\n output: {\n target: 'web',\n distPath: { root: outDir, js: '' },\n filename: { js: '[name].js' },\n filenameHash: false,\n cleanDistPath: true,\n injectStyles,\n sourceMap: { js: sourceMapConfig as any },\n minify,\n },\n performance: {\n chunkSplit: { strategy: 'all-in-one' },\n },\n tools: {\n htmlPlugin: false,\n },\n },\n });\n\n await rsbuild.build();\n}\n\n/**\n * rsbuild 開発サーバーを起動します\n */\nexport async function startRsbuildDevServer(params: {\n entries: Record<string, string>;\n outDir: string;\n port: number;\n https?: { key: Buffer; cert: Buffer };\n publicDir?: string;\n onFirstCompile?: () => void | Promise<void>;\n onRecompile?: () => void | Promise<void>;\n}): Promise<{ port: number; close: () => Promise<void> }> {\n const { entries, outDir, port, https, publicDir, onFirstCompile, onRecompile } = params;\n\n await removeHotUpdateFiles(outDir);\n\n const rsbuildConfig: RsbuildConfig = {\n plugins: getRsbuildPlugins(),\n source: { entry: entries },\n output: {\n target: 'web',\n distPath: { root: outDir, js: '' },\n filename: { js: '[name].js' },\n filenameHash: false,\n cleanDistPath: false,\n injectStyles: true,\n sourceMap: { js: 'cheap-module-source-map' as any },\n minify: false,\n },\n performance: {\n chunkSplit: { strategy: 'all-in-one' },\n },\n tools: {\n htmlPlugin: false,\n },\n server: {\n port,\n host: '0.0.0.0',\n ...(https ? { https } : {}),\n ...(publicDir && fs.existsSync(publicDir) ? { publicDir: { name: publicDir } } : {}),\n },\n dev: {\n writeToDisk: shouldWriteDevAssetToDisk,\n },\n };\n\n const rsbuild = await createRsbuild({ rsbuildConfig });\n\n if (onFirstCompile || onRecompile) {\n rsbuild.addPlugins([\n {\n name: 'k2-dev-hooks',\n setup(api) {\n api.onAfterDevCompile(async ({ isFirstCompile }) => {\n if (isFirstCompile && onFirstCompile) {\n await onFirstCompile();\n } else if (!isFirstCompile && onRecompile) {\n await onRecompile();\n }\n });\n },\n },\n ]);\n }\n\n const result = await rsbuild.startDevServer();\n\n return {\n port: result.port,\n close: result.server.close,\n };\n}\n\n/**\n * プラグインのエントリーポイントを取得します (config, desktop)\n */\nexport function getPluginEntryPoints(params: {\n configEntry: string;\n desktopEntry: string;\n}): Record<string, string> {\n const { configEntry, desktopEntry } = params;\n const entries: Record<string, string> = {};\n\n for (const ext of ['index.ts', 'index.tsx', 'index.js', 'index.jsx']) {\n const configPath = path.join(configEntry, ext);\n if (fs.existsSync(configPath)) {\n entries.config = configPath;\n break;\n }\n }\n\n for (const ext of ['index.ts', 'index.tsx', 'index.js', 'index.jsx']) {\n const desktopPath = path.join(desktopEntry, ext);\n if (fs.existsSync(desktopPath)) {\n entries.desktop = desktopPath;\n break;\n }\n }\n\n return entries;\n}\n\n/**\n * アプリのエントリーポイントをディレクトリから取得します\n */\nexport function getAppEntryPoints(inputDir: string): Record<string, string> {\n if (!fs.existsSync(inputDir)) {\n return {};\n }\n\n const allProjects = fs.readdirSync(inputDir);\n return allProjects.reduce<Record<string, string>>((acc, dir) => {\n const dirPath = path.join(inputDir, dir);\n if (!fs.statSync(dirPath).isDirectory()) return acc;\n\n for (const filename of ['index.ts', 'index.tsx', 'index.js', 'index.jsx', 'index.mjs']) {\n const filePath = path.join(inputDir, dir, filename);\n if (fs.existsSync(filePath)) {\n return { ...acc, [dir]: filePath };\n }\n }\n return acc;\n }, {});\n}\n","import { program } from 'commander';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\nimport {\n DEFAULT_PORT,\n PLUGIN_DEVELOPMENT_DIRECTORY,\n PLUGIN_WORKSPACE_DIRECTORY,\n} from '../../lib/constants.js';\nimport { importK2PluginConfig } from '../../lib/import.js';\nimport { generateCert, hasCertificates, loadCertificates } from '../../lib/cert/index.js';\nimport { startRsbuildDevServer, getPluginEntryPoints } from '../../lib/rsbuild.js';\nimport { getManifest } from './create-manifest.js';\nimport { watchCss } from './tailwind.js';\nimport { watchContentsAndUploadZip } from './upload.js';\n\nexport default function command() {\n program\n .command('dev')\n .option(\n '-p, --ppk <ppk>',\n '.ppk file path',\n path.join(PLUGIN_WORKSPACE_DIRECTORY, 'private.ppk')\n )\n .option('-c, --cert-dir <certDir>', 'Certificate directory', PLUGIN_WORKSPACE_DIRECTORY)\n .description('Start development server with rsbuild.')\n .action(action);\n}\n\nexport async function action(options: { ppk: string; certDir: string }) {\n console.group('🍳 Start development server');\n try {\n const { ppk: ppkPath, certDir } = options;\n const config = await importK2PluginConfig();\n\n const certDirPath = path.resolve(certDir);\n const outputDir = path.resolve(PLUGIN_DEVELOPMENT_DIRECTORY);\n\n if (!fs.existsSync(PLUGIN_DEVELOPMENT_DIRECTORY)) {\n await fs.mkdir(PLUGIN_DEVELOPMENT_DIRECTORY, { recursive: true });\n }\n\n const port = config.server?.port ?? DEFAULT_PORT;\n\n // SSL証明書の確認・生成 (node-forge使用、mkcert不要)\n if (!hasCertificates(certDirPath)) {\n console.log(chalk.yellow('📜 SSL certificates not found. Generating with node-forge...'));\n try {\n generateCert(certDirPath);\n console.log(chalk.green('✅ SSL certificates generated successfully'));\n } catch (error) {\n console.log(chalk.red('❌ Failed to generate SSL certificates.'));\n throw error;\n }\n }\n\n const manifest = await getManifest({ config, port });\n console.log(`📝 manifest.json generated`);\n\n const entries = getPluginEntryPoints({\n configEntry: path.resolve('src', 'config'),\n desktopEntry: path.resolve('src', 'desktop'),\n });\n\n const entryNames = Object.keys(entries);\n if (entryNames.length === 0) {\n throw new Error('No entry points found for plugin. Check src/config and src/desktop paths.');\n }\n\n console.log(chalk.gray(` Entry points: ${entryNames.join(', ')}`));\n\n const { key, cert } = loadCertificates(certDirPath);\n\n // rsbuild 開発サーバー起動 (ビルド + ファイル監視 + 配信)\n const { port: actualPort } = await startRsbuildDevServer({\n entries,\n outDir: outputDir,\n port,\n https: { key, cert },\n publicDir: outputDir,\n onFirstCompile: () => {\n console.log(chalk.green(`\\n✨ Plugin development server ready!`));\n console.log(chalk.cyan(` Local: https://localhost:${actualPort}`));\n console.log(chalk.gray(` Output: ${outputDir}`));\n console.log(chalk.gray(` Files: config.js, desktop.js`));\n console.log(chalk.gray('\\n Watching for changes...\\n'));\n },\n onRecompile: () => {\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[rsbuild] `) +\n `rebuild complete`\n );\n },\n });\n\n // 並列タスク: コンテンツ監視+アップロード, TailwindCSS監視\n Promise.all([watchContentsAndUploadZip({ manifest, ppkPath }), watchCss(config)]);\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { createCA, createCert } from './cert.js';\nimport { isSupported, pkgDir, rootCAPath, rootCAKeyPath } from './constants.js';\nimport { addToTrustStores, removeFromTrustStores } from './platforms.js';\n\n/** SSL証明書のファイル名 */\nexport const CERT_KEY_FILENAME = 'localhost-key.pem';\nexport const CERT_FILENAME = 'localhost-cert.pem';\n\n/**\n * CA証明書を信頼ストアから削除します\n */\nexport function uninstall(): void {\n removeFromTrustStores(rootCAPath);\n fs.removeSync(pkgDir);\n}\n\n/**\n * ルートCA証明書をインストールし、システムの信頼ストアに追加します\n */\nexport function install(options: { validity?: number } = {}): void {\n const { validity = 7300 } = options;\n\n if (!isSupported) {\n throw new Error(`Platform not supported: \"${process.platform}\"`);\n }\n\n if (!fs.existsSync(rootCAPath) && !fs.existsSync(rootCAKeyPath)) {\n const ca = createCA({ validity });\n fs.outputFileSync(rootCAPath, ca.cert);\n fs.outputFileSync(rootCAKeyPath, ca.key);\n try {\n addToTrustStores(rootCAPath);\n } catch {\n console.warn(\n '⚠ Failed to add CA to system trust store. You may need to trust the certificate manually.'\n );\n }\n }\n}\n\n/**\n * 指定されたドメインのSSL証明書を生成します\n */\nexport function certificateFor(requestedDomains: string | string[] = []): {\n key: string;\n cert: string;\n} {\n const validity = 7300;\n install({ validity });\n\n const requests = Array.isArray(requestedDomains) ? requestedDomains : [requestedDomains];\n const domains = [\n ...new Set(['localhost', 'localhost.localdomain', '127.0.0.1', '0.0.0.0', '::1', ...requests]),\n ];\n\n const ca = {\n cert: fs.readFileSync(rootCAPath),\n key: fs.readFileSync(rootCAKeyPath),\n };\n\n return createCert({ ca, domains, validity });\n}\n\n/**\n * SSL証明書を生成し、指定ディレクトリに保存します\n */\nexport function generateCert(outDir: string): { key: string; cert: string } {\n fs.ensureDirSync(outDir);\n const result = certificateFor();\n fs.outputFileSync(path.join(outDir, CERT_FILENAME), result.cert);\n fs.outputFileSync(path.join(outDir, CERT_KEY_FILENAME), result.key);\n return result;\n}\n\n/**\n * SSL証明書が存在するか確認します\n */\nexport function hasCertificates(certDir: string): boolean {\n return (\n fs.existsSync(path.join(certDir, CERT_KEY_FILENAME)) &&\n fs.existsSync(path.join(certDir, CERT_FILENAME))\n );\n}\n\n/**\n * SSL証明書を読み込みます\n */\nexport function loadCertificates(certDir: string): { key: Buffer; cert: Buffer } {\n return {\n key: fs.readFileSync(path.join(certDir, CERT_KEY_FILENAME)),\n cert: fs.readFileSync(path.join(certDir, CERT_FILENAME)),\n };\n}\n","import forge from 'node-forge';\nimport net from 'node:net';\n\nconst { md, pki } = forge;\n\nfunction createCertificate(\n serial: string,\n publicKey: forge.pki.rsa.PublicKey,\n subject: forge.pki.CertificateField[],\n issuer: forge.pki.CertificateField[],\n extensions: any[],\n validity: number,\n signWith: forge.pki.rsa.PrivateKey\n): forge.pki.Certificate {\n const cert = pki.createCertificate();\n cert.serialNumber = Buffer.from(serial).toString('hex');\n cert.publicKey = publicKey;\n cert.setSubject(subject);\n cert.setIssuer(issuer);\n cert.setExtensions(extensions);\n cert.validity.notBefore = new Date();\n cert.validity.notAfter = new Date();\n cert.validity.notAfter.setDate(cert.validity.notAfter.getDate() + validity);\n cert.sign(signWith, md.sha256.create());\n return cert;\n}\n\nfunction generateCertInternal(params: {\n subject: forge.pki.CertificateField[];\n issuer: forge.pki.CertificateField[];\n extensions: any[];\n validity: number;\n signWith?: string;\n}): { key: string; cert: string } {\n const { subject, issuer, extensions, validity, signWith } = params;\n const serial = Math.floor(Math.random() * 95000 + 50000).toString();\n const keyPair = pki.rsa.generateKeyPair(2048);\n const privateKey = signWith ? pki.privateKeyFromPem(signWith) : keyPair.privateKey;\n\n const cert = createCertificate(\n serial,\n keyPair.publicKey,\n subject,\n issuer,\n extensions,\n validity,\n privateKey\n );\n\n return {\n key: pki.privateKeyToPem(keyPair.privateKey),\n cert: pki.certificateToPem(cert),\n };\n}\n\n/**\n * ルートCA証明書を生成します\n */\nexport function createCA(\n params: {\n organization?: string;\n countryCode?: string;\n state?: string;\n locality?: string;\n validity?: number;\n } = {}\n): { key: string; cert: string } {\n const {\n organization = 'K2 Development CA',\n countryCode = 'JP',\n state = 'Tokyo',\n locality = 'Tokyo',\n validity = 7300,\n } = params;\n\n const attributes: forge.pki.CertificateField[] = [\n { name: 'commonName', value: organization },\n { name: 'countryName', value: countryCode },\n { name: 'stateOrProvinceName', value: state },\n { name: 'localityName', value: locality },\n { name: 'organizationName', value: organization },\n ];\n\n const extensions = [\n { name: 'basicConstraints', cA: true, critical: true },\n { name: 'keyUsage', keyCertSign: true, critical: true },\n ];\n\n return generateCertInternal({\n subject: attributes,\n issuer: attributes,\n extensions,\n validity,\n });\n}\n\n/**\n * CA証明書で署名されたサーバー証明書を生成します\n */\nexport function createCert(params: {\n ca: { cert: string | Buffer; key: string | Buffer };\n domains: string[];\n validity?: number;\n}): { key: string; cert: string } {\n const { ca, domains, validity = 7300 } = params;\n\n const attributes: forge.pki.CertificateField[] = [{ name: 'commonName', value: domains[0] }];\n\n const extensions = [\n { name: 'basicConstraints', cA: false, critical: true },\n {\n name: 'keyUsage',\n digitalSignature: true,\n keyEncipherment: true,\n critical: true,\n },\n { name: 'extKeyUsage', serverAuth: true, clientAuth: true },\n {\n name: 'subjectAltName',\n altNames: domains.map((domain) => {\n const TYPE_DOMAIN = 2;\n const TYPE_IP = 7;\n return net.isIP(domain)\n ? { type: TYPE_IP, ip: domain }\n : { type: TYPE_DOMAIN, value: domain };\n }),\n },\n ];\n\n const caCert = pki.certificateFromPem(ca.cert.toString());\n\n return generateCertInternal({\n subject: attributes,\n issuer: caCert.subject.attributes,\n extensions,\n validity,\n signWith: ca.key.toString(),\n });\n}\n","import path from 'path';\n\nconst PKG_NAME = 'k2';\n\nexport const isSupported =\n process.platform === 'darwin' || process.platform === 'linux' || process.platform === 'win32';\n\nfunction getApplicationConfigPath(name: string): string {\n if (process.platform === 'darwin') {\n return path.join(process.env.HOME!, 'Library', 'Application Support', name);\n }\n if (process.platform === 'win32') {\n return process.env.LOCALAPPDATA\n ? path.join(process.env.LOCALAPPDATA, name)\n : path.join(process.env.USERPROFILE!, 'Local Settings', 'Application Data', name);\n }\n // linux\n return process.env.XDG_CONFIG_HOME\n ? path.join(process.env.XDG_CONFIG_HOME, name)\n : path.join(process.env.HOME!, '.config', name);\n}\n\nexport const pkgDir = getApplicationConfigPath(PKG_NAME);\nexport const rootCAPath = path.resolve(pkgDir, 'rootCA.pem');\nexport const rootCAKeyPath = path.resolve(pkgDir, 'rootCA-key.pem');\nexport { PKG_NAME };\n","import { spawnSync } from 'node:child_process';\nimport { PKG_NAME } from './constants.js';\nimport logger from '../logger.js';\n\n// --- macOS ---\nfunction addToTrustStoresDarwin(certPath: string): void {\n logger.log('Adding certificate to trusted store. Admin rights may be required.');\n spawnSync(\n 'sudo',\n [\n 'security',\n 'add-trusted-cert',\n '-d',\n '-r',\n 'trustRoot',\n '-k',\n '/Library/Keychains/System.keychain',\n '-p',\n 'ssl',\n '-p',\n 'basic',\n certPath,\n ],\n { stdio: 'inherit' }\n );\n}\n\nfunction removeFromTrustStoresDarwin(certPath: string): void {\n logger.log('Removing certificate from trusted store. Admin rights may be required.');\n spawnSync('sudo', ['security', 'remove-trusted-cert', '-d', certPath], {\n stdio: 'ignore',\n });\n}\n\n// --- Linux ---\nconst targetCA = `/usr/local/share/ca-certificates/${PKG_NAME}.crt`;\n\nfunction addToTrustStoresLinux(certPath: string): void {\n logger.log('Adding certificate to trusted store. Admin rights may be required.');\n spawnSync('sudo', ['cp', certPath, targetCA]);\n spawnSync('sudo', ['update-ca-certificates']);\n}\n\nfunction removeFromTrustStoresLinux(): void {\n logger.log('Removing certificate from trusted store. Admin rights may be required.');\n spawnSync('sudo', ['rm', targetCA], { stdio: 'inherit' });\n spawnSync('sudo', ['update-ca-certificates']);\n}\n\n// --- Windows ---\nfunction addToTrustStoresWin32(certPath: string): void {\n spawnSync('certutil', ['-addstore', '-user', 'root', certPath], {\n stdio: 'inherit',\n });\n}\n\nfunction removeFromTrustStoresWin32(): void {\n spawnSync('certutil', ['-delstore', '-user', 'root', PKG_NAME], {\n stdio: 'inherit',\n });\n}\n\n// --- Platform dispatcher ---\nexport function addToTrustStores(certPath: string): void {\n switch (process.platform) {\n case 'darwin':\n return addToTrustStoresDarwin(certPath);\n case 'linux':\n return addToTrustStoresLinux(certPath);\n case 'win32':\n return addToTrustStoresWin32(certPath);\n }\n}\n\nexport function removeFromTrustStores(certPath?: string): void {\n switch (process.platform) {\n case 'darwin':\n if (certPath) removeFromTrustStoresDarwin(certPath);\n return;\n case 'linux':\n return removeFromTrustStoresLinux();\n case 'win32':\n return removeFromTrustStoresWin32();\n }\n}\n","const PKG_NAME = '@konomi-app/k2';\n\nexport function createLogger(prefix = PKG_NAME) {\n return {\n log: (...args: unknown[]) => console.log(`[${prefix}]`, ...args),\n info: (...args: unknown[]) => console.info(`[${prefix}]`, ...args),\n warn: (...args: unknown[]) => console.warn(`[${prefix}]`, ...args),\n error: (...args: unknown[]) => console.error(`[${prefix}]`, ...args),\n };\n}\n\nexport default createLogger();\n","import { PLUGIN_CONTENTS_DIRECTORY } from './constants.js';\nimport { importK2PluginConfig } from './import.js';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport merge from 'deepmerge';\n\nexport const outputManifest = async (\n env: 'dev' | 'prod' | 'standalone',\n options?: { config?: Plugin.Meta.Config }\n): Promise<Plugin.Meta.Manifest> => {\n const config = options?.config || (await importK2PluginConfig());\n\n const merged = merge(config.manifest.base, config.manifest[env] || {}) as Plugin.Meta.Manifest;\n\n await fs.mkdirs(PLUGIN_CONTENTS_DIRECTORY);\n await fs.writeJson(path.join(PLUGIN_CONTENTS_DIRECTORY, 'manifest.json'), merged);\n\n return merged;\n};\n","import { outputManifest } from '../../lib/plugin-manifest.js';\n\nexport const getManifest = async (params: { config: Plugin.Meta.Config; port: number }) => {\n const { config, port } = params;\n return outputManifest('dev', {\n config: {\n ...config,\n manifest: {\n ...config.manifest,\n dev: {\n config: {\n ...config.manifest?.dev?.config,\n js: [`https://localhost:${port}/config.js`],\n css: [`https://localhost:${port}/config.css`],\n },\n desktop: {\n ...config.manifest?.dev?.desktop,\n js: [`https://localhost:${port}/desktop.js`],\n css: [`https://localhost:${port}/desktop.css`],\n },\n mobile: {\n ...config.manifest?.dev?.mobile,\n js: [`https://localhost:${port}/desktop.js`],\n css: [`https://localhost:${port}/desktop.css`],\n },\n },\n },\n },\n });\n};\n","import path from 'path';\nimport { type Config as TailwindConfig } from 'tailwindcss';\nimport { PLUGIN_DEVELOPMENT_DIRECTORY } from '../../lib/constants.js';\nimport chalk from 'chalk';\nimport { getTailwindConfig, getTailwindInputCss, watchTailwindCSS } from '../../lib/tailwind.js';\n\nasync function buildTailwindCSS(params: {\n inputFile: string;\n outputFileName: string;\n config: TailwindConfig;\n}) {\n const { inputFile, outputFileName, config } = params;\n const inputPath = path.resolve(inputFile);\n const outputPath = path.join(PLUGIN_DEVELOPMENT_DIRECTORY, outputFileName);\n\n return watchTailwindCSS({\n input: inputPath,\n output: outputPath,\n config,\n onChanges: ({ output, type }) => {\n const outputFileName = path.basename(output);\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[css] `) +\n outputFileName +\n (type === 'init' ? ' init' : ` rebuilt`)\n );\n },\n });\n}\n\nexport const watchCss = async (pluginConfig: Plugin.Meta.Config) => {\n if (!pluginConfig.tailwind?.css || !pluginConfig.tailwind?.config) {\n return;\n }\n\n const tailwindConfig = await getTailwindConfig(pluginConfig.tailwind);\n\n const inputFile = getTailwindInputCss(pluginConfig.tailwind);\n\n return Promise.all([\n buildTailwindCSS({\n inputFile: inputFile.desktop,\n outputFileName: 'desktop.css',\n config: tailwindConfig.desktop,\n }),\n buildTailwindCSS({\n inputFile: inputFile.config,\n outputFileName: 'config.css',\n config: tailwindConfig.config,\n }),\n ]);\n};\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { PLUGIN_CONTENTS_DIRECTORY } from './constants.js';\nimport htmlMinifier from 'html-minifier';\n\nexport const copyPluginContents = async (\n params: { inputDir?: string; outputDir?: string } = {}\n) => {\n const { inputDir = path.join('src', 'contents'), outputDir = PLUGIN_CONTENTS_DIRECTORY } = params;\n if (!fs.existsSync(inputDir)) {\n await fs.mkdir(inputDir, { recursive: true });\n }\n\n await fs.copy(inputDir, outputDir, { overwrite: true });\n\n const configHtmlPath = path.join(outputDir, 'config.html');\n\n if (!fs.existsSync(configHtmlPath)) {\n throw new Error(`Plugin HTML file not found. Create \"config.html\" in ${inputDir}.`);\n }\n\n const html = await fs.readFile(configHtmlPath, 'utf8');\n\n const minified = htmlMinifier.minify(html, {\n minifyCSS: true,\n collapseWhitespace: true,\n removeComments: true,\n removeOptionalTags: true,\n removeRedundantAttributes: true,\n removeScriptTypeAttributes: true,\n removeTagWhitespace: true,\n useShortDoctype: true,\n });\n\n await fs.writeFile(configHtmlPath, minified);\n};\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { zipSync } from 'fflate';\nimport { PLUGIN_CONTENTS_DIRECTORY } from './constants.js';\nimport { sign, getPublicKeyDer, generatePPK, generatePluginId } from './rsa.js';\n\n/**\n * manifest.json からプラグインに必要なソースファイル一覧を抽出します\n */\nexport function sourceList(manifest: Plugin.Meta.Manifest): string[] {\n const sourceTypes: [string, string][] = [\n ['desktop', 'js'],\n ['desktop', 'css'],\n ['mobile', 'js'],\n ['mobile', 'css'],\n ['config', 'js'],\n ['config', 'css'],\n ];\n\n const list = sourceTypes\n .map(([type, ext]) => (manifest as any)[type]?.[ext])\n .filter(Boolean)\n .reduce<string[]>((a, b) => a.concat(b), [])\n .filter((file: string) => !/^https?:\\/\\//.test(file));\n\n if (manifest.config?.html) list.push(manifest.config.html);\n list.push(manifest.icon);\n return Array.from(new Set(list));\n}\n\n/**\n * ファイルのレコードからZIPバッファを生成します\n */\nexport function zipFiles(files: Record<string, Buffer | string>): Buffer {\n const zipObj: Record<string, Uint8Array> = {};\n\n for (const [fileName, fileContent] of Object.entries(files)) {\n let content: Uint8Array;\n if (Buffer.isBuffer(fileContent)) {\n content = new Uint8Array(fileContent);\n } else if (typeof fileContent === 'string') {\n const fileData = fs.readFileSync(fileContent);\n content = new Uint8Array(fileData);\n } else {\n throw new Error(`Unsupported file content type for file: ${fileName}`);\n }\n zipObj[fileName] = content;\n }\n\n const zipped = zipSync(zipObj);\n return Buffer.from(zipped);\n}\n\n/**\n * コンテンツディレクトリからcontents.zipを生成します\n */\nexport function createContentsZip(\n contentsDir: string,\n manifest: Plugin.Meta.Manifest,\n fileContents: Record<string, Buffer | string> = {}\n): Buffer {\n const files = sourceList(manifest).reduce<Record<string, Buffer | string>>((acc, file) => {\n acc[file] = fileContents[file] || path.join(contentsDir, file);\n return acc;\n }, {});\n\n files['manifest.json'] = Buffer.from(JSON.stringify(manifest, null, 2));\n\n const targetFiles = Object.keys(files);\n console.group('📁 Target files');\n targetFiles.forEach((file, i) => {\n const prefix = i === targetFiles.length - 1 ? '└─' : '├─';\n console.log(`${prefix} 📄 ${file}`);\n });\n console.groupEnd();\n\n return zipFiles(files);\n}\n\n/**\n * コンテンツディレクトリから直接 contents.zip を作成します\n * (ファイルシステムから読み取り)\n */\nexport function createContentsZipFromDir(manifest: Plugin.Meta.Manifest): Buffer {\n return createContentsZip(PLUGIN_CONTENTS_DIRECTORY, manifest);\n}\n\n/**\n * 秘密鍵を使用してプラグインZIPを生成します (contents.zip + PUBKEY + SIGNATURE)\n */\nexport function createPluginZip(params: { ppkPath: string; contentsZip: Buffer }): {\n zip: Buffer;\n id: string;\n privateKey: string;\n} {\n const { ppkPath, contentsZip } = params;\n\n let ppkContent: string;\n if (fs.existsSync(ppkPath)) {\n ppkContent = fs.readFileSync(ppkPath, 'utf-8');\n } else {\n ppkContent = generatePPK(ppkPath);\n }\n\n const signature = sign(contentsZip, ppkContent);\n const publicKeyDer = getPublicKeyDer(ppkContent);\n const pluginId = generatePluginId(publicKeyDer);\n\n const pluginZip = zipFiles({\n 'contents.zip': contentsZip,\n PUBKEY: publicKeyDer,\n SIGNATURE: signature,\n });\n\n return { zip: pluginZip, id: pluginId, privateKey: ppkContent };\n}\n\nexport const getZipFileNameSuffix = (env: string): string => {\n return env === 'prod' ? '' : `-${env}`;\n};\n","import forge from 'node-forge';\nimport fs from 'fs-extra';\n\n/**\n * contents.zip を秘密鍵で署名します\n */\nexport function sign(contents: Buffer, privateKeyPem: string): Buffer {\n const key = forge.pki.privateKeyFromPem(privateKeyPem);\n const md = forge.md.sha1.create();\n md.update(contents.toString('binary'));\n const signature = key.sign(md);\n return Buffer.from(signature, 'binary');\n}\n\n/**\n * 秘密鍵から公開鍵のDER形式を取得します\n */\nexport function getPublicKeyDer(privateKeyPem: string): Buffer {\n const privateKey = forge.pki.privateKeyFromPem(privateKeyPem);\n const publicKey = forge.pki.rsa.setPublicKey(privateKey.n, privateKey.e);\n const publicKeyAsn1 = forge.pki.publicKeyToAsn1(publicKey);\n const publicKeyDerBytes = forge.asn1.toDer(publicKeyAsn1).getBytes();\n return Buffer.from(publicKeyDerBytes, 'binary');\n}\n\n/**\n * RSA秘密鍵 (PPK) を生成し、ファイルに保存します\n */\nexport function generatePPK(ppkPath: string): string {\n const keypair = forge.pki.rsa.generateKeyPair(1024);\n const privateKey = forge.pki.privateKeyToPem(keypair.privateKey);\n fs.outputFileSync(ppkPath, privateKey);\n return privateKey;\n}\n\n/**\n * 公開鍵からプラグインIDを生成します\n */\nexport function generatePluginId(publicKeyDer: Buffer): string {\n const md = forge.md.sha256.create();\n md.update(publicKeyDer.toString('binary'));\n const hash = Buffer.from(md.digest().bytes(), 'binary');\n const hexDigest = hash.subarray(0, 16).toString('hex');\n return hexDigest.replace(/[0-9a-f]/g, (c) => 'abcdefghijklmnop'['0123456789abcdef'.indexOf(c)]);\n}\n","import { config } from 'dotenv';\nimport { KintoneRestAPIClient } from '@kintone/rest-api-client';\n\n/**\n * 環境変数からkintone REST APIクライアントを生成します\n */\nexport function createKintoneClient(): KintoneRestAPIClient {\n config();\n\n const {\n KINTONE_BASE_URL,\n KINTONE_USERNAME,\n KINTONE_PASSWORD,\n KINTONE_BASIC_AUTH_USERNAME,\n KINTONE_BASIC_AUTH_PASSWORD,\n } = process.env;\n\n if (!KINTONE_BASE_URL || !KINTONE_USERNAME || !KINTONE_PASSWORD) {\n throw new Error(`.envの設定が不十分です。以下のパラメータは必須です\nKINTONE_BASE_URL\nKINTONE_USERNAME\nKINTONE_PASSWORD`);\n }\n\n return new KintoneRestAPIClient({\n baseUrl: KINTONE_BASE_URL,\n auth: {\n username: KINTONE_USERNAME,\n password: KINTONE_PASSWORD,\n },\n ...(KINTONE_BASIC_AUTH_USERNAME && KINTONE_BASIC_AUTH_PASSWORD\n ? {\n basicAuth: {\n username: KINTONE_BASIC_AUTH_USERNAME,\n password: KINTONE_BASIC_AUTH_PASSWORD,\n },\n }\n : {}),\n });\n}\n\n/**\n * プラグインZIPをkintoneにアップロードします\n */\nexport async function uploadPlugin(params: {\n pluginId: string;\n file: { name: string; data: Buffer };\n}): Promise<{ method: 'PUT' | 'POST' }> {\n const client = createKintoneClient();\n\n const { fileKey } = await client.file.uploadFile({ file: params.file });\n\n const { plugins } = await client.plugin.getPlugins({ offset: 0, limit: 100 });\n const isUpdate = plugins.some(({ id }) => id === params.pluginId);\n\n if (isUpdate) {\n await client.plugin.updatePlugin({ id: params.pluginId, fileKey });\n return { method: 'PUT' };\n }\n\n await client.plugin.installPlugin({ fileKey });\n return { method: 'POST' };\n}\n","import { copyPluginContents } from '../../lib/plugin-contents.js';\nimport { createContentsZipFromDir, createPluginZip, getZipFileNameSuffix } from '../../lib/zip.js';\nimport { uploadPlugin } from '../../lib/kintone-api-client.js';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { PLUGIN_WORKSPACE_DIRECTORY } from '../../lib/constants.js';\nimport chokidar from 'chokidar';\nimport chalk from 'chalk';\n\nexport const watchContentsAndUploadZip = async (params: {\n manifest: Plugin.Meta.Manifest;\n ppkPath: string;\n}) => {\n const { manifest, ppkPath } = params;\n\n let initialScanComplete = false;\n\n const contentsListener = async () => {\n try {\n if (!initialScanComplete) {\n return;\n }\n await copyPluginContents();\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[contents] `) +\n `updated`\n );\n } catch (error: any) {\n console.error('Error copying plugin contents:', error);\n return;\n }\n\n try {\n const contentsZip = createContentsZipFromDir(manifest);\n const { zip, id: pluginId } = createPluginZip({\n ppkPath: path.resolve(ppkPath),\n contentsZip,\n });\n\n const zipFileName = `plugin${getZipFileNameSuffix('dev')}.zip`;\n await fs.writeFile(path.join(PLUGIN_WORKSPACE_DIRECTORY, zipFileName), zip);\n\n const { method } = await uploadPlugin({\n pluginId,\n file: { name: zipFileName, data: zip },\n });\n\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[upload] `) +\n `uploaded ${method === 'POST' ? '(new)' : '(update)'}`\n );\n } catch (error: any) {\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[upload] `) +\n chalk.red(`failed`) +\n chalk.hex('#e5e7eb')(`: ${error?.message ?? 'Unknown error'}`)\n );\n }\n };\n\n const contentsWatcher = chokidar.watch(['src/contents/**/*'], {\n ignored: /node_modules/,\n persistent: true,\n });\n\n contentsWatcher.on('ready', () => {\n initialScanComplete = true;\n contentsListener();\n });\n\n contentsWatcher.on('change', contentsListener);\n contentsWatcher.on('add', contentsListener);\n contentsWatcher.on('unlink', contentsListener);\n};\n","import { program } from 'commander';\nimport { PLUGIN_WORKSPACE_DIRECTORY } from '../lib/constants.js';\nimport { generateCert } from '../lib/cert/index.js';\n\nexport default function command() {\n program\n .command('genkey')\n .description('Generate SSL certificate for localhost using node-forge.')\n .action(action);\n}\n\nexport async function action() {\n console.group('🍳 Generate SSL certificate for localhost');\n try {\n generateCert(PLUGIN_WORKSPACE_DIRECTORY);\n console.log(`🔑 Certificate generated. Output to ./${PLUGIN_WORKSPACE_DIRECTORY}`);\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import { program } from 'commander';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { outputManifest } from '../lib/plugin-manifest.js';\nimport { PLUGIN_WORKSPACE_DIRECTORY } from '../lib/constants.js';\nimport { createContentsZipFromDir, createPluginZip } from '../lib/zip.js';\nimport { copyPluginContents } from '../lib/plugin-contents.js';\n\nexport default function command() {\n program.command('init').description('generate private.ppk and kitting config').action(action);\n}\n\nexport async function action() {\n console.group('🍳 Executing plugin initialization setup');\n try {\n const manifest = await outputManifest('dev');\n console.log('📝 manifest.json generated');\n\n await copyPluginContents();\n console.log('📁 contents copied');\n\n const ppkPath = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'private.ppk');\n const contentsZip = createContentsZipFromDir(manifest);\n const { zip, privateKey } = createPluginZip({ ppkPath, contentsZip });\n\n if (!fs.existsSync(ppkPath)) {\n console.log('🔑 private.ppk generated');\n } else {\n console.log('🔑 private.ppk already exists. The existing private.ppk will be used.');\n }\n\n await fs.writeFile(path.join(PLUGIN_WORKSPACE_DIRECTORY, 'plugin.zip'), zip);\n console.log('📦 plugin.zip generated');\n console.log('✨ Plugin initialization setup completed! zip file path is ./.plugin/plugin.zip');\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import { program } from 'commander';\nimport { outputManifest } from '../../lib/plugin-manifest.js';\nimport { copyPluginContents } from '../../lib/plugin-contents.js';\n\nexport default function command(): void {\n program\n .command('manifest')\n .option('-e, --env <env>', 'create manifest', 'prod')\n .action(action);\n}\n\nasync function action(options: { env: string }): Promise<void> {\n console.group('🚀 Executing manifest generation');\n try {\n const { env } = options;\n if (env !== 'prod' && env !== 'dev' && env !== 'standalone') {\n throw new Error('Invalid environment');\n }\n\n await copyPluginContents();\n console.log('📁 contents copied');\n\n await outputManifest(env);\n console.log(`📝 manifest.json generated (${env})`);\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import { program } from 'commander';\nimport fs from 'fs-extra';\nimport { esmImport } from '../../lib/import.js';\n\nexport default function command() {\n program.command('test').description('test').action(action);\n}\n\nexport async function action() {\n console.group('package.json');\n const packageJson = fs.readJSONSync('package.json');\n console.log('package.json detected');\n console.groupEnd();\n\n console.group('Config');\n const config = await esmImport('plugin.config.mjs');\n console.log('plugin.config.mjs detected', config);\n console.groupEnd();\n}\n","import { program } from 'commander';\nimport { outputManifest } from '../lib/plugin-manifest.js';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { PLUGIN_WORKSPACE_DIRECTORY } from '../lib/constants.js';\nimport { createContentsZipFromDir, createPluginZip, getZipFileNameSuffix } from '../lib/zip.js';\nimport { copyPluginContents } from '../lib/plugin-contents.js';\nimport { isEnv } from '../lib/utils.js';\n\nexport default function command(): void {\n program\n .command('zip')\n .description('generate plugin zip')\n .option('-e, --env <env>', 'plugin environment (dev, prod, standalone)', 'prod')\n .option(\n '-p, --ppk <ppk>',\n '.ppk file path',\n path.join(PLUGIN_WORKSPACE_DIRECTORY, 'private.ppk')\n )\n .action(action);\n}\n\nasync function action(options: { env: string; ppk: string }): Promise<void> {\n console.group('🍳 Executing plugin zip generation');\n try {\n const { env, ppk: ppkPath } = options;\n if (!isEnv(env)) {\n throw new Error('Invalid environment');\n }\n\n await copyPluginContents();\n console.log('📁 contents copied');\n\n const manifest = await outputManifest(env);\n console.log(`📝 manifest.json generated (${env})`);\n\n const contentsZip = createContentsZipFromDir(manifest);\n console.log('📦 contents.zip generated');\n\n const { zip, id } = createPluginZip({ ppkPath: path.resolve(ppkPath), contentsZip });\n\n const zipFileName = `plugin${getZipFileNameSuffix(env)}.zip`;\n await fs.writeFile(path.join(PLUGIN_WORKSPACE_DIRECTORY, zipFileName), zip);\n console.log('📦 plugin.zip generated');\n\n // version ファイルを出力\n const version = String(manifest.version);\n await fs.writeFile(path.join(PLUGIN_WORKSPACE_DIRECTORY, 'version'), version);\n console.log(`📝 version file generated (${version})`);\n\n console.log(`✨ Plugin zip generation completed! zip file path is ./.plugin/${zipFileName}`);\n console.log(` Plugin ID: ${id}`);\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { PLUGIN_WORKSPACE_DIRECTORY } from './constants.js';\nimport { uploadPlugin } from './kintone-api-client.js';\nimport { createContentsZipFromDir, createPluginZip, getZipFileNameSuffix } from './zip.js';\n\nexport const isEnv = (env: string): env is Plugin.Meta.Env => {\n return ['prod', 'dev', 'standalone'].includes(env);\n};\n\n/**\n * プラグインをビルドしてkintoneにアップロードします\n */\nexport const buildAndUploadPlugin = async (params: {\n env: Plugin.Meta.Env;\n manifest: Plugin.Meta.Manifest;\n ppkPath: string;\n}): Promise<{ method: 'PUT' | 'POST'; pluginId: string }> => {\n const { env, manifest, ppkPath } = params;\n\n const contentsZip = createContentsZipFromDir(manifest);\n const { zip, id: pluginId } = createPluginZip({ ppkPath, contentsZip });\n\n const zipFileName = `plugin${getZipFileNameSuffix(env)}.zip`;\n\n await fs.writeFile(path.join(PLUGIN_WORKSPACE_DIRECTORY, zipFileName), zip);\n\n const { method } = await uploadPlugin({\n pluginId,\n file: { name: zipFileName, data: zip },\n });\n\n return { method, pluginId };\n};\n","import { program } from 'commander';\nimport { lint } from '../lib/lint.js';\n\nexport default function command() {\n program\n .command('lint')\n .description('Lint source files')\n .option('-c, --config <config>', 'Config file path')\n .action(action);\n}\n\nexport async function action(options: {\n outdir: string;\n certdir: string;\n port: string;\n input: string;\n}) {\n try {\n lint();\n } catch (error) {\n throw error;\n } finally {\n }\n}\n"],"mappings":"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","names":["program","fs","path","path","path","path","config","path","pluginReact","path","fs","config","fs","path","program","fs","path","chalk","fs","path","path","PKG_NAME","fs","path","fs","path","config","config","path","chalk","config","path","outputFileName","chalk","fs","path","path","fs","fs","path","forge","fs","md","fs","path","fs","path","chokidar","chalk","path","fs","command","program","path","action","config","fs","chalk","program","command","program","action","program","fs","path","command","program","action","path","fs","program","command","program","action","program","fs","command","program","action","fs","config","program","fs","path","fs","path","command","program","path","action","fs","program","command","program","action","program","command"]}
1
+ {"version":3,"sources":["../src/plugin.ts","../src/commands/plugin-build.ts","../src/lib/constants.ts","../src/lib/import.ts","../src/lib/tailwind.ts","../src/lib/lint.ts","../src/lib/rsbuild.ts","../src/commands/plugin-dev/index.ts","../src/lib/cert/index.ts","../src/lib/cert/cert.ts","../src/lib/cert/constants.ts","../src/lib/cert/platforms.ts","../src/lib/logger.ts","../src/lib/plugin-manifest.ts","../src/commands/plugin-dev/create-manifest.ts","../src/commands/plugin-dev/tailwind.ts","../src/lib/plugin-contents.ts","../src/lib/zip.ts","../src/lib/rsa.ts","../src/lib/kintone-api-client.ts","../src/commands/plugin-dev/upload.ts","../src/commands/plugin-genkey.ts","../src/commands/plugin-init.ts","../src/commands/manifest/index.ts","../src/commands/test/index.ts","../src/commands/plugin-zip.ts","../src/lib/utils.ts","../src/commands/lint.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { program } from 'commander';\nimport build from './commands/plugin-build.js';\nimport dev from './commands/plugin-dev/index.js';\nimport genkey from './commands/plugin-genkey.js';\nimport init from './commands/plugin-init.js';\nimport manifest from './commands/manifest/index.js';\nimport test from './commands/test/index.js';\nimport zip from './commands/plugin-zip.js';\nimport lint from './commands/lint.js';\n\nprogram.name('plugin').version('4.0.0').description('🍳 kintone kitchen 🍳 for kintone plugin');\n\nbuild();\ndev();\ngenkey();\ninit();\nmanifest();\ntest();\nzip();\nlint();\n\nprogram.parse(process.argv);\n","import { program } from 'commander';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { PLUGIN_CONTENTS_DIRECTORY } from '../lib/constants.js';\nimport { importK2PluginConfig } from '../lib/import.js';\nimport { getTailwindInputCss, outputCss } from '../lib/tailwind.js';\nimport { lint } from '../lib/lint.js';\nimport { buildWithRsbuild, getPluginEntryPoints } from '../lib/rsbuild.js';\n\nexport default function command() {\n program\n .command('build')\n .description('Build the plugin for production with rsbuild.')\n .action(action);\n}\n\nexport async function action() {\n console.group('🍳 Build the plugin for production');\n\n try {\n const config = await importK2PluginConfig();\n\n if (config?.lint?.build) {\n await lint();\n console.log('✨ Lint success.');\n }\n\n if (!fs.existsSync(PLUGIN_CONTENTS_DIRECTORY)) {\n await fs.mkdir(PLUGIN_CONTENTS_DIRECTORY, { recursive: true });\n }\n\n // Tailwind CSS ビルド\n if (config.tailwind?.css) {\n const inputFile = getTailwindInputCss(config.tailwind);\n\n await outputCss({\n inputPath: inputFile.config,\n outputPath: path.join(PLUGIN_CONTENTS_DIRECTORY, 'config.css'),\n minify: true,\n });\n console.log('✨ Built config.css');\n\n await outputCss({\n inputPath: inputFile.desktop,\n outputPath: path.join(PLUGIN_CONTENTS_DIRECTORY, 'desktop.css'),\n minify: true,\n });\n console.log('✨ Built desktop.css');\n }\n\n // rsbuild でJSビルド\n const entries = getPluginEntryPoints({\n configEntry: path.resolve('src', 'config'),\n desktopEntry: path.resolve('src', 'desktop'),\n });\n\n const entryNames = Object.keys(entries);\n if (entryNames.length === 0) {\n throw new Error('No entry points found for plugin. Check src/config and src/desktop paths.');\n }\n\n console.log(chalk.gray(` Entry points: ${entryNames.join(', ')}`));\n\n await buildWithRsbuild({\n entries,\n outDir: PLUGIN_CONTENTS_DIRECTORY,\n minify: true,\n sourcemap: false,\n injectStyles: true,\n });\n\n console.log('✨ Built desktop.js and config.js');\n console.log('✨ Build success.');\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import path from 'path';\n\nexport const WORKSPACE_DIRECTORY = '.k2';\nexport const DEVELOPMENT_DIRECTORY = path.join(WORKSPACE_DIRECTORY, 'dev');\nexport const PRODUCTION_DIRECTORY = path.join(WORKSPACE_DIRECTORY, 'prod');\n\nexport const CONFIG_FILE_NAME = 'k2.config.mjs';\nexport const PLUGIN_CONFIG_FILE_NAME = 'plugin.config.mjs';\n\n/** kintoneプラグインの一時ファイルを管理するフォルダ */\nexport const PLUGIN_WORKSPACE_DIRECTORY = '.plugin';\n/** kintoneプラグインのcontents.zipに格納するファイルを管理するフォルダ */\nexport const PLUGIN_CONTENTS_DIRECTORY = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'contents');\n/** kintoneプラグインの開発時、ローカルサーバーに反映するファイルを管理するフォルダ */\nexport const PLUGIN_DEVELOPMENT_DIRECTORY = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'dev');\n/** kintoneプラグインの本番ビルド出力ディレクトリ */\nexport const PLUGIN_PRODUCTION_DIRECTORY = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'prod');\n\n/** ローカルサーバーのデフォルトポート番号 */\nexport const DEFAULT_PORT = 32767;\n","import { pathToFileURL } from 'url';\nimport { CONFIG_FILE_NAME, PLUGIN_CONFIG_FILE_NAME } from './constants.js';\nimport path from 'path';\n\nexport const esmImport = (path: string) => {\n if (process.platform === 'win32') {\n return import(pathToFileURL(path).toString());\n } else {\n return import(path);\n }\n};\n\nexport const importK2Config = async (configFileName?: string): Promise<K2.Config> => {\n return (await esmImport(path.resolve(configFileName ?? CONFIG_FILE_NAME))).default;\n};\n\nexport const importK2PluginConfig = async (\n configFileName?: string\n): Promise<Plugin.Meta.Config> => {\n return (await esmImport(path.resolve(configFileName ?? PLUGIN_CONFIG_FILE_NAME))).default;\n};\n","import chokidar from 'chokidar';\nimport cssnanoPlugin from 'cssnano';\nimport fs from 'fs-extra';\nimport { glob } from 'glob';\nimport path from 'path';\nimport postcss from 'postcss';\nimport { debounce } from 'remeda';\nimport tailwindcss from '@tailwindcss/postcss';\nimport invariant from 'tiny-invariant';\n\nexport const getTailwindInputCss = (\n config: Plugin.Meta.Config['tailwind']\n): { desktop: string; config: string } => {\n invariant(config?.css, 'tailwind.css is required');\n const { css } = config;\n if (typeof css === 'string') {\n const resolved = path.resolve(css);\n return { desktop: resolved, config: resolved };\n }\n return {\n desktop: path.resolve(css.desktop),\n config: path.resolve(css.config),\n };\n};\n\nexport const outputCss = async (params: {\n inputPath: string;\n outputPath: string;\n minify?: boolean;\n}) => {\n const { inputPath, outputPath, minify = false } = params;\n\n const css = await fs.readFile(inputPath, 'utf8');\n\n const result = await postcss([\n tailwindcss({ base: path.dirname(inputPath), optimize: minify }),\n ...(minify ? [cssnanoPlugin()] : []),\n ]).process(css, {\n from: inputPath,\n to: outputPath,\n });\n\n await fs.writeFile(outputPath, result.css);\n\n if (result.map) {\n await fs.writeFile(`${outputPath}.map`, result.map.toString());\n }\n};\n\ntype WatchType = 'init' | 'add' | 'change' | 'unlink';\n\nexport const watchTailwindCSS = async (params: {\n /** input path */\n input: string;\n /** output path */\n output: string;\n /** content glob patterns for file watching */\n contentPatterns?: string[];\n /** callback function */\n onChanges?: (params: { input: string; output: string; type: WatchType }) => void;\n}) => {\n const { input, output, contentPatterns } = params;\n\n const patterns = contentPatterns ?? ['./src/**/*.{ts,tsx}'];\n\n const files = await glob([...patterns, input], { ignore: ['**/node_modules/**'] });\n\n const watcher = chokidar.watch(files, {\n persistent: true,\n ignoreInitial: true,\n });\n\n let isInitialized = false;\n\n const processChanges = async (type: WatchType) => {\n try {\n await outputCss({ inputPath: input, outputPath: output });\n params.onChanges?.({ input, output, type });\n } catch (error) {\n console.error('Error building Tailwind CSS:', error);\n }\n };\n\n const debouncedProcessChanges = debounce(processChanges, { waitMs: 1000 });\n\n watcher.on('ready', async () => {\n if (!isInitialized) {\n isInitialized = true;\n await processChanges('init');\n }\n });\n\n watcher.on('error', (error) => {\n console.error('Error watching Tailwind CSS:', error);\n });\n\n watcher.on('add', (path) => {\n debouncedProcessChanges.call('add');\n });\n watcher.on('change', (path) => {\n debouncedProcessChanges.call('change');\n });\n watcher.on('unlink', (path) => {\n debouncedProcessChanges.call('unlink');\n });\n watcher.on('unlinkDir', (path) => {\n debouncedProcessChanges.call('unlink');\n });\n\n return watcher;\n};\n","import { ESLint } from 'eslint';\nimport globals from 'globals';\nimport pluginJs from '@eslint/js';\nimport tseslint from 'typescript-eslint';\nimport pluginReact from 'eslint-plugin-react';\n\nexport async function lint() {\n const eslint = new ESLint({\n baseConfig: [\n { files: ['**/*.{js,mjs,cjs,ts,jsx,tsx}'] },\n { languageOptions: { globals: globals.browser } },\n pluginJs.configs.recommended,\n // ...tseslint.configs.recommended,\n ...(pluginReact.configs.flat?.recommended ? [pluginReact.configs.flat.recommended] : []),\n ],\n });\n\n const results = await eslint.lintFiles(['src/**/*.{ts,tsx?}']);\n\n const formatter = await eslint.loadFormatter('stylish');\n const resultText = formatter.format(results);\n\n console.group('👕 Lint Results');\n console.log(resultText);\n console.groupEnd();\n\n const hasErrors = results.some((result) => result.errorCount > 0);\n if (hasErrors) {\n console.error('🚨 Lint errors found');\n process.exit(1);\n }\n}\n","import { createRsbuild, type RsbuildConfig } from '@rsbuild/core';\nimport { pluginReact } from '@rsbuild/plugin-react';\nimport path from 'path';\nimport fs from 'fs-extra';\n\nfunction getRsbuildPlugins() {\n return [\n pluginReact({\n swcReactOptions: {\n runtime: 'automatic',\n },\n }),\n ];\n}\n\nfunction shouldWriteDevAssetToDisk(file: string): boolean {\n return !file.includes('.hot-update.');\n}\n\nasync function removeHotUpdateFiles(outDir: string): Promise<void> {\n if (!fs.existsSync(outDir)) {\n return;\n }\n\n const fileNames = (await fs.readdir(outDir, { encoding: 'utf8' })).map((fileName) =>\n fileName.toString()\n );\n await Promise.all(\n fileNames\n .filter((fileName) => fileName.includes('.hot-update.'))\n .map((fileName) => fs.remove(path.join(outDir, fileName)))\n );\n}\n\n/**\n * rsbuild で本番ビルドを実行します\n */\nexport async function buildWithRsbuild(params: {\n entries: Record<string, string>;\n outDir: string;\n minify?: boolean;\n sourcemap?: boolean | 'inline';\n injectStyles?: boolean;\n}): Promise<void> {\n const { entries, outDir, minify = true, sourcemap = false, injectStyles = true } = params;\n\n const sourceMapConfig =\n sourcemap === 'inline' ? 'cheap-module-source-map' : sourcemap ? 'source-map' : false;\n\n const rsbuild = await createRsbuild({\n rsbuildConfig: {\n plugins: getRsbuildPlugins(),\n source: { entry: entries },\n output: {\n target: 'web',\n distPath: { root: outDir, js: '' },\n filename: { js: '[name].js' },\n filenameHash: false,\n cleanDistPath: true,\n injectStyles,\n sourceMap: { js: sourceMapConfig as any },\n minify,\n },\n performance: {\n chunkSplit: { strategy: 'all-in-one' },\n },\n tools: {\n htmlPlugin: false,\n },\n },\n });\n\n await rsbuild.build();\n}\n\n/**\n * rsbuild 開発サーバーを起動します\n */\nexport async function startRsbuildDevServer(params: {\n entries: Record<string, string>;\n outDir: string;\n port: number;\n https?: { key: Buffer; cert: Buffer };\n publicDir?: string;\n onFirstCompile?: () => void | Promise<void>;\n onRecompile?: () => void | Promise<void>;\n}): Promise<{ port: number; close: () => Promise<void> }> {\n const { entries, outDir, port, https, publicDir, onFirstCompile, onRecompile } = params;\n\n await removeHotUpdateFiles(outDir);\n\n const rsbuildConfig: RsbuildConfig = {\n plugins: getRsbuildPlugins(),\n source: { entry: entries },\n output: {\n target: 'web',\n distPath: { root: outDir, js: '' },\n filename: { js: '[name].js' },\n filenameHash: false,\n cleanDistPath: false,\n injectStyles: true,\n sourceMap: { js: 'cheap-module-source-map' as any },\n minify: false,\n },\n performance: {\n chunkSplit: { strategy: 'all-in-one' },\n },\n tools: {\n htmlPlugin: false,\n },\n server: {\n port,\n host: '0.0.0.0',\n ...(https ? { https } : {}),\n ...(publicDir && fs.existsSync(publicDir) ? { publicDir: { name: publicDir } } : {}),\n },\n dev: {\n writeToDisk: shouldWriteDevAssetToDisk,\n },\n };\n\n const rsbuild = await createRsbuild({ rsbuildConfig });\n\n if (onFirstCompile || onRecompile) {\n rsbuild.addPlugins([\n {\n name: 'k2-dev-hooks',\n setup(api) {\n api.onAfterDevCompile(async ({ isFirstCompile }) => {\n if (isFirstCompile && onFirstCompile) {\n await onFirstCompile();\n } else if (!isFirstCompile && onRecompile) {\n await onRecompile();\n }\n });\n },\n },\n ]);\n }\n\n const result = await rsbuild.startDevServer();\n\n return {\n port: result.port,\n close: result.server.close,\n };\n}\n\n/**\n * プラグインのエントリーポイントを取得します (config, desktop)\n */\nexport function getPluginEntryPoints(params: {\n configEntry: string;\n desktopEntry: string;\n}): Record<string, string> {\n const { configEntry, desktopEntry } = params;\n const entries: Record<string, string> = {};\n\n for (const ext of ['index.ts', 'index.tsx', 'index.js', 'index.jsx']) {\n const configPath = path.join(configEntry, ext);\n if (fs.existsSync(configPath)) {\n entries.config = configPath;\n break;\n }\n }\n\n for (const ext of ['index.ts', 'index.tsx', 'index.js', 'index.jsx']) {\n const desktopPath = path.join(desktopEntry, ext);\n if (fs.existsSync(desktopPath)) {\n entries.desktop = desktopPath;\n break;\n }\n }\n\n return entries;\n}\n\n/**\n * アプリのエントリーポイントをディレクトリから取得します\n */\nexport function getAppEntryPoints(inputDir: string): Record<string, string> {\n if (!fs.existsSync(inputDir)) {\n return {};\n }\n\n const allProjects = fs.readdirSync(inputDir);\n return allProjects.reduce<Record<string, string>>((acc, dir) => {\n const dirPath = path.join(inputDir, dir);\n if (!fs.statSync(dirPath).isDirectory()) return acc;\n\n for (const filename of ['index.ts', 'index.tsx', 'index.js', 'index.jsx', 'index.mjs']) {\n const filePath = path.join(inputDir, dir, filename);\n if (fs.existsSync(filePath)) {\n return { ...acc, [dir]: filePath };\n }\n }\n return acc;\n }, {});\n}\n","import { program } from 'commander';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\nimport {\n DEFAULT_PORT,\n PLUGIN_DEVELOPMENT_DIRECTORY,\n PLUGIN_WORKSPACE_DIRECTORY,\n} from '../../lib/constants.js';\nimport { importK2PluginConfig } from '../../lib/import.js';\nimport { generateCert, hasCertificates, loadCertificates } from '../../lib/cert/index.js';\nimport { startRsbuildDevServer, getPluginEntryPoints } from '../../lib/rsbuild.js';\nimport { getManifest } from './create-manifest.js';\nimport { watchCss } from './tailwind.js';\nimport { watchContentsAndUploadZip } from './upload.js';\n\nexport default function command() {\n program\n .command('dev')\n .option(\n '-p, --ppk <ppk>',\n '.ppk file path',\n path.join(PLUGIN_WORKSPACE_DIRECTORY, 'private.ppk')\n )\n .option('-c, --cert-dir <certDir>', 'Certificate directory', PLUGIN_WORKSPACE_DIRECTORY)\n .description('Start development server with rsbuild.')\n .action(action);\n}\n\nexport async function action(options: { ppk: string; certDir: string }) {\n console.group('🍳 Start development server');\n try {\n const { ppk: ppkPath, certDir } = options;\n const config = await importK2PluginConfig();\n\n const certDirPath = path.resolve(certDir);\n const outputDir = path.resolve(PLUGIN_DEVELOPMENT_DIRECTORY);\n\n if (!fs.existsSync(PLUGIN_DEVELOPMENT_DIRECTORY)) {\n await fs.mkdir(PLUGIN_DEVELOPMENT_DIRECTORY, { recursive: true });\n }\n\n const port = config.server?.port ?? DEFAULT_PORT;\n\n // SSL証明書の確認・生成 (node-forge使用、mkcert不要)\n if (!hasCertificates(certDirPath)) {\n console.log(chalk.yellow('📜 SSL certificates not found. Generating with node-forge...'));\n try {\n generateCert(certDirPath);\n console.log(chalk.green('✅ SSL certificates generated successfully'));\n } catch (error) {\n console.log(chalk.red('❌ Failed to generate SSL certificates.'));\n throw error;\n }\n }\n\n const manifest = await getManifest({ config, port });\n console.log(`📝 manifest.json generated`);\n\n const entries = getPluginEntryPoints({\n configEntry: path.resolve('src', 'config'),\n desktopEntry: path.resolve('src', 'desktop'),\n });\n\n const entryNames = Object.keys(entries);\n if (entryNames.length === 0) {\n throw new Error('No entry points found for plugin. Check src/config and src/desktop paths.');\n }\n\n console.log(chalk.gray(` Entry points: ${entryNames.join(', ')}`));\n\n const { key, cert } = loadCertificates(certDirPath);\n\n // rsbuild 開発サーバー起動 (ビルド + ファイル監視 + 配信)\n const { port: actualPort } = await startRsbuildDevServer({\n entries,\n outDir: outputDir,\n port,\n https: { key, cert },\n publicDir: outputDir,\n onFirstCompile: () => {\n console.log(chalk.green(`\\n✨ Plugin development server ready!`));\n console.log(chalk.cyan(` Local: https://localhost:${actualPort}`));\n console.log(chalk.gray(` Output: ${outputDir}`));\n console.log(chalk.gray(` Files: config.js, desktop.js`));\n console.log(chalk.gray('\\n Watching for changes...\\n'));\n },\n onRecompile: () => {\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[rsbuild] `) +\n `rebuild complete`\n );\n },\n });\n\n // 並列タスク: コンテンツ監視+アップロード, TailwindCSS監視\n Promise.all([watchContentsAndUploadZip({ manifest, ppkPath }), watchCss(config)]);\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { createCA, createCert } from './cert.js';\nimport { isSupported, pkgDir, rootCAPath, rootCAKeyPath } from './constants.js';\nimport { addToTrustStores, removeFromTrustStores } from './platforms.js';\n\n/** SSL証明書のファイル名 */\nexport const CERT_KEY_FILENAME = 'localhost-key.pem';\nexport const CERT_FILENAME = 'localhost-cert.pem';\n\n/**\n * CA証明書を信頼ストアから削除します\n */\nexport function uninstall(): void {\n removeFromTrustStores(rootCAPath);\n fs.removeSync(pkgDir);\n}\n\n/**\n * ルートCA証明書をインストールし、システムの信頼ストアに追加します\n */\nexport function install(options: { validity?: number } = {}): void {\n const { validity = 7300 } = options;\n\n if (!isSupported) {\n throw new Error(`Platform not supported: \"${process.platform}\"`);\n }\n\n if (!fs.existsSync(rootCAPath) && !fs.existsSync(rootCAKeyPath)) {\n const ca = createCA({ validity });\n fs.outputFileSync(rootCAPath, ca.cert);\n fs.outputFileSync(rootCAKeyPath, ca.key);\n try {\n addToTrustStores(rootCAPath);\n } catch {\n console.warn(\n '⚠ Failed to add CA to system trust store. You may need to trust the certificate manually.'\n );\n }\n }\n}\n\n/**\n * 指定されたドメインのSSL証明書を生成します\n */\nexport function certificateFor(requestedDomains: string | string[] = []): {\n key: string;\n cert: string;\n} {\n const validity = 7300;\n install({ validity });\n\n const requests = Array.isArray(requestedDomains) ? requestedDomains : [requestedDomains];\n const domains = [\n ...new Set(['localhost', 'localhost.localdomain', '127.0.0.1', '0.0.0.0', '::1', ...requests]),\n ];\n\n const ca = {\n cert: fs.readFileSync(rootCAPath),\n key: fs.readFileSync(rootCAKeyPath),\n };\n\n return createCert({ ca, domains, validity });\n}\n\n/**\n * SSL証明書を生成し、指定ディレクトリに保存します\n */\nexport function generateCert(outDir: string): { key: string; cert: string } {\n fs.ensureDirSync(outDir);\n const result = certificateFor();\n fs.outputFileSync(path.join(outDir, CERT_FILENAME), result.cert);\n fs.outputFileSync(path.join(outDir, CERT_KEY_FILENAME), result.key);\n return result;\n}\n\n/**\n * SSL証明書が存在するか確認します\n */\nexport function hasCertificates(certDir: string): boolean {\n return (\n fs.existsSync(path.join(certDir, CERT_KEY_FILENAME)) &&\n fs.existsSync(path.join(certDir, CERT_FILENAME))\n );\n}\n\n/**\n * SSL証明書を読み込みます\n */\nexport function loadCertificates(certDir: string): { key: Buffer; cert: Buffer } {\n return {\n key: fs.readFileSync(path.join(certDir, CERT_KEY_FILENAME)),\n cert: fs.readFileSync(path.join(certDir, CERT_FILENAME)),\n };\n}\n","import forge from 'node-forge';\nimport net from 'node:net';\n\nconst { md, pki } = forge;\n\nfunction createCertificate(\n serial: string,\n publicKey: forge.pki.rsa.PublicKey,\n subject: forge.pki.CertificateField[],\n issuer: forge.pki.CertificateField[],\n extensions: any[],\n validity: number,\n signWith: forge.pki.rsa.PrivateKey\n): forge.pki.Certificate {\n const cert = pki.createCertificate();\n cert.serialNumber = Buffer.from(serial).toString('hex');\n cert.publicKey = publicKey;\n cert.setSubject(subject);\n cert.setIssuer(issuer);\n cert.setExtensions(extensions);\n cert.validity.notBefore = new Date();\n cert.validity.notAfter = new Date();\n cert.validity.notAfter.setDate(cert.validity.notAfter.getDate() + validity);\n cert.sign(signWith, md.sha256.create());\n return cert;\n}\n\nfunction generateCertInternal(params: {\n subject: forge.pki.CertificateField[];\n issuer: forge.pki.CertificateField[];\n extensions: any[];\n validity: number;\n signWith?: string;\n}): { key: string; cert: string } {\n const { subject, issuer, extensions, validity, signWith } = params;\n const serial = Math.floor(Math.random() * 95000 + 50000).toString();\n const keyPair = pki.rsa.generateKeyPair(2048);\n const privateKey = signWith ? pki.privateKeyFromPem(signWith) : keyPair.privateKey;\n\n const cert = createCertificate(\n serial,\n keyPair.publicKey,\n subject,\n issuer,\n extensions,\n validity,\n privateKey\n );\n\n return {\n key: pki.privateKeyToPem(keyPair.privateKey),\n cert: pki.certificateToPem(cert),\n };\n}\n\n/**\n * ルートCA証明書を生成します\n */\nexport function createCA(\n params: {\n organization?: string;\n countryCode?: string;\n state?: string;\n locality?: string;\n validity?: number;\n } = {}\n): { key: string; cert: string } {\n const {\n organization = 'K2 Development CA',\n countryCode = 'JP',\n state = 'Tokyo',\n locality = 'Tokyo',\n validity = 7300,\n } = params;\n\n const attributes: forge.pki.CertificateField[] = [\n { name: 'commonName', value: organization },\n { name: 'countryName', value: countryCode },\n { name: 'stateOrProvinceName', value: state },\n { name: 'localityName', value: locality },\n { name: 'organizationName', value: organization },\n ];\n\n const extensions = [\n { name: 'basicConstraints', cA: true, critical: true },\n { name: 'keyUsage', keyCertSign: true, critical: true },\n ];\n\n return generateCertInternal({\n subject: attributes,\n issuer: attributes,\n extensions,\n validity,\n });\n}\n\n/**\n * CA証明書で署名されたサーバー証明書を生成します\n */\nexport function createCert(params: {\n ca: { cert: string | Buffer; key: string | Buffer };\n domains: string[];\n validity?: number;\n}): { key: string; cert: string } {\n const { ca, domains, validity = 7300 } = params;\n\n const attributes: forge.pki.CertificateField[] = [{ name: 'commonName', value: domains[0] }];\n\n const extensions = [\n { name: 'basicConstraints', cA: false, critical: true },\n {\n name: 'keyUsage',\n digitalSignature: true,\n keyEncipherment: true,\n critical: true,\n },\n { name: 'extKeyUsage', serverAuth: true, clientAuth: true },\n {\n name: 'subjectAltName',\n altNames: domains.map((domain) => {\n const TYPE_DOMAIN = 2;\n const TYPE_IP = 7;\n return net.isIP(domain)\n ? { type: TYPE_IP, ip: domain }\n : { type: TYPE_DOMAIN, value: domain };\n }),\n },\n ];\n\n const caCert = pki.certificateFromPem(ca.cert.toString());\n\n return generateCertInternal({\n subject: attributes,\n issuer: caCert.subject.attributes,\n extensions,\n validity,\n signWith: ca.key.toString(),\n });\n}\n","import path from 'path';\n\nconst PKG_NAME = 'k2';\n\nexport const isSupported =\n process.platform === 'darwin' || process.platform === 'linux' || process.platform === 'win32';\n\nfunction getApplicationConfigPath(name: string): string {\n if (process.platform === 'darwin') {\n return path.join(process.env.HOME!, 'Library', 'Application Support', name);\n }\n if (process.platform === 'win32') {\n return process.env.LOCALAPPDATA\n ? path.join(process.env.LOCALAPPDATA, name)\n : path.join(process.env.USERPROFILE!, 'Local Settings', 'Application Data', name);\n }\n // linux\n return process.env.XDG_CONFIG_HOME\n ? path.join(process.env.XDG_CONFIG_HOME, name)\n : path.join(process.env.HOME!, '.config', name);\n}\n\nexport const pkgDir = getApplicationConfigPath(PKG_NAME);\nexport const rootCAPath = path.resolve(pkgDir, 'rootCA.pem');\nexport const rootCAKeyPath = path.resolve(pkgDir, 'rootCA-key.pem');\nexport { PKG_NAME };\n","import { spawnSync } from 'node:child_process';\nimport { PKG_NAME } from './constants.js';\nimport logger from '../logger.js';\n\n// --- macOS ---\nfunction addToTrustStoresDarwin(certPath: string): void {\n logger.log('Adding certificate to trusted store. Admin rights may be required.');\n spawnSync(\n 'sudo',\n [\n 'security',\n 'add-trusted-cert',\n '-d',\n '-r',\n 'trustRoot',\n '-k',\n '/Library/Keychains/System.keychain',\n '-p',\n 'ssl',\n '-p',\n 'basic',\n certPath,\n ],\n { stdio: 'inherit' }\n );\n}\n\nfunction removeFromTrustStoresDarwin(certPath: string): void {\n logger.log('Removing certificate from trusted store. Admin rights may be required.');\n spawnSync('sudo', ['security', 'remove-trusted-cert', '-d', certPath], {\n stdio: 'ignore',\n });\n}\n\n// --- Linux ---\nconst targetCA = `/usr/local/share/ca-certificates/${PKG_NAME}.crt`;\n\nfunction addToTrustStoresLinux(certPath: string): void {\n logger.log('Adding certificate to trusted store. Admin rights may be required.');\n spawnSync('sudo', ['cp', certPath, targetCA]);\n spawnSync('sudo', ['update-ca-certificates']);\n}\n\nfunction removeFromTrustStoresLinux(): void {\n logger.log('Removing certificate from trusted store. Admin rights may be required.');\n spawnSync('sudo', ['rm', targetCA], { stdio: 'inherit' });\n spawnSync('sudo', ['update-ca-certificates']);\n}\n\n// --- Windows ---\nfunction addToTrustStoresWin32(certPath: string): void {\n spawnSync('certutil', ['-addstore', '-user', 'root', certPath], {\n stdio: 'inherit',\n });\n}\n\nfunction removeFromTrustStoresWin32(): void {\n spawnSync('certutil', ['-delstore', '-user', 'root', PKG_NAME], {\n stdio: 'inherit',\n });\n}\n\n// --- Platform dispatcher ---\nexport function addToTrustStores(certPath: string): void {\n switch (process.platform) {\n case 'darwin':\n return addToTrustStoresDarwin(certPath);\n case 'linux':\n return addToTrustStoresLinux(certPath);\n case 'win32':\n return addToTrustStoresWin32(certPath);\n }\n}\n\nexport function removeFromTrustStores(certPath?: string): void {\n switch (process.platform) {\n case 'darwin':\n if (certPath) removeFromTrustStoresDarwin(certPath);\n return;\n case 'linux':\n return removeFromTrustStoresLinux();\n case 'win32':\n return removeFromTrustStoresWin32();\n }\n}\n","const PKG_NAME = '@konomi-app/k2';\n\nexport function createLogger(prefix = PKG_NAME) {\n return {\n log: (...args: unknown[]) => console.log(`[${prefix}]`, ...args),\n info: (...args: unknown[]) => console.info(`[${prefix}]`, ...args),\n warn: (...args: unknown[]) => console.warn(`[${prefix}]`, ...args),\n error: (...args: unknown[]) => console.error(`[${prefix}]`, ...args),\n };\n}\n\nexport default createLogger();\n","import { PLUGIN_CONTENTS_DIRECTORY } from './constants.js';\nimport { importK2PluginConfig } from './import.js';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport merge from 'deepmerge';\n\nexport const outputManifest = async (\n env: 'dev' | 'prod' | 'standalone',\n options?: { config?: Plugin.Meta.Config }\n): Promise<Plugin.Meta.Manifest> => {\n const config = options?.config || (await importK2PluginConfig());\n\n const merged = merge(config.manifest.base, config.manifest[env] || {}) as Plugin.Meta.Manifest;\n\n await fs.mkdirs(PLUGIN_CONTENTS_DIRECTORY);\n await fs.writeJson(path.join(PLUGIN_CONTENTS_DIRECTORY, 'manifest.json'), merged);\n\n return merged;\n};\n","import { outputManifest } from '../../lib/plugin-manifest.js';\n\nexport const getManifest = async (params: { config: Plugin.Meta.Config; port: number }) => {\n const { config, port } = params;\n return outputManifest('dev', {\n config: {\n ...config,\n manifest: {\n ...config.manifest,\n dev: {\n config: {\n ...config.manifest?.dev?.config,\n js: [`https://localhost:${port}/config.js`],\n css: [`https://localhost:${port}/config.css`],\n },\n desktop: {\n ...config.manifest?.dev?.desktop,\n js: [`https://localhost:${port}/desktop.js`],\n css: [`https://localhost:${port}/desktop.css`],\n },\n mobile: {\n ...config.manifest?.dev?.mobile,\n js: [`https://localhost:${port}/desktop.js`],\n css: [`https://localhost:${port}/desktop.css`],\n },\n },\n },\n },\n });\n};\n","import path from 'path';\nimport { PLUGIN_DEVELOPMENT_DIRECTORY } from '../../lib/constants.js';\nimport chalk from 'chalk';\nimport { getTailwindInputCss, watchTailwindCSS } from '../../lib/tailwind.js';\n\nasync function buildTailwindCSS(params: { inputFile: string; outputFileName: string }) {\n const { inputFile, outputFileName } = params;\n const inputPath = path.resolve(inputFile);\n const outputPath = path.join(PLUGIN_DEVELOPMENT_DIRECTORY, outputFileName);\n\n return watchTailwindCSS({\n input: inputPath,\n output: outputPath,\n onChanges: ({ output, type }) => {\n const outputFileName = path.basename(output);\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[css] `) +\n outputFileName +\n (type === 'init' ? ' init' : ` rebuilt`)\n );\n },\n });\n}\n\nexport const watchCss = async (pluginConfig: Plugin.Meta.Config) => {\n if (!pluginConfig.tailwind?.css) {\n return;\n }\n\n const inputFile = getTailwindInputCss(pluginConfig.tailwind);\n\n return Promise.all([\n buildTailwindCSS({\n inputFile: inputFile.desktop,\n outputFileName: 'desktop.css',\n }),\n buildTailwindCSS({\n inputFile: inputFile.config,\n outputFileName: 'config.css',\n }),\n ]);\n};\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { PLUGIN_CONTENTS_DIRECTORY } from './constants.js';\nimport htmlMinifier from 'html-minifier';\n\nexport const copyPluginContents = async (\n params: { inputDir?: string; outputDir?: string } = {}\n) => {\n const { inputDir = path.join('src', 'contents'), outputDir = PLUGIN_CONTENTS_DIRECTORY } = params;\n if (!fs.existsSync(inputDir)) {\n await fs.mkdir(inputDir, { recursive: true });\n }\n\n await fs.copy(inputDir, outputDir, { overwrite: true });\n\n const configHtmlPath = path.join(outputDir, 'config.html');\n\n if (!fs.existsSync(configHtmlPath)) {\n throw new Error(`Plugin HTML file not found. Create \"config.html\" in ${inputDir}.`);\n }\n\n const html = await fs.readFile(configHtmlPath, 'utf8');\n\n const minified = htmlMinifier.minify(html, {\n minifyCSS: true,\n collapseWhitespace: true,\n removeComments: true,\n removeOptionalTags: true,\n removeRedundantAttributes: true,\n removeScriptTypeAttributes: true,\n removeTagWhitespace: true,\n useShortDoctype: true,\n });\n\n await fs.writeFile(configHtmlPath, minified);\n};\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { zipSync } from 'fflate';\nimport { PLUGIN_CONTENTS_DIRECTORY } from './constants.js';\nimport { sign, getPublicKeyDer, generatePPK, generatePluginId } from './rsa.js';\n\n/**\n * manifest.json からプラグインに必要なソースファイル一覧を抽出します\n */\nexport function sourceList(manifest: Plugin.Meta.Manifest): string[] {\n const sourceTypes: [string, string][] = [\n ['desktop', 'js'],\n ['desktop', 'css'],\n ['mobile', 'js'],\n ['mobile', 'css'],\n ['config', 'js'],\n ['config', 'css'],\n ];\n\n const list = sourceTypes\n .map(([type, ext]) => (manifest as any)[type]?.[ext])\n .filter(Boolean)\n .reduce<string[]>((a, b) => a.concat(b), [])\n .filter((file: string) => !/^https?:\\/\\//.test(file));\n\n if (manifest.config?.html) list.push(manifest.config.html);\n list.push(manifest.icon);\n return Array.from(new Set(list));\n}\n\n/**\n * ファイルのレコードからZIPバッファを生成します\n */\nexport function zipFiles(files: Record<string, Buffer | string>): Buffer {\n const zipObj: Record<string, Uint8Array> = {};\n\n for (const [fileName, fileContent] of Object.entries(files)) {\n let content: Uint8Array;\n if (Buffer.isBuffer(fileContent)) {\n content = new Uint8Array(fileContent);\n } else if (typeof fileContent === 'string') {\n const fileData = fs.readFileSync(fileContent);\n content = new Uint8Array(fileData);\n } else {\n throw new Error(`Unsupported file content type for file: ${fileName}`);\n }\n zipObj[fileName] = content;\n }\n\n const zipped = zipSync(zipObj);\n return Buffer.from(zipped);\n}\n\n/**\n * コンテンツディレクトリからcontents.zipを生成します\n */\nexport function createContentsZip(\n contentsDir: string,\n manifest: Plugin.Meta.Manifest,\n fileContents: Record<string, Buffer | string> = {}\n): Buffer {\n const files = sourceList(manifest).reduce<Record<string, Buffer | string>>((acc, file) => {\n acc[file] = fileContents[file] || path.join(contentsDir, file);\n return acc;\n }, {});\n\n files['manifest.json'] = Buffer.from(JSON.stringify(manifest, null, 2));\n\n const targetFiles = Object.keys(files);\n console.group('📁 Target files');\n targetFiles.forEach((file, i) => {\n const prefix = i === targetFiles.length - 1 ? '└─' : '├─';\n console.log(`${prefix} 📄 ${file}`);\n });\n console.groupEnd();\n\n return zipFiles(files);\n}\n\n/**\n * コンテンツディレクトリから直接 contents.zip を作成します\n * (ファイルシステムから読み取り)\n */\nexport function createContentsZipFromDir(manifest: Plugin.Meta.Manifest): Buffer {\n return createContentsZip(PLUGIN_CONTENTS_DIRECTORY, manifest);\n}\n\n/**\n * 秘密鍵を使用してプラグインZIPを生成します (contents.zip + PUBKEY + SIGNATURE)\n */\nexport function createPluginZip(params: { ppkPath: string; contentsZip: Buffer }): {\n zip: Buffer;\n id: string;\n privateKey: string;\n} {\n const { ppkPath, contentsZip } = params;\n\n let ppkContent: string;\n if (fs.existsSync(ppkPath)) {\n ppkContent = fs.readFileSync(ppkPath, 'utf-8');\n } else {\n ppkContent = generatePPK(ppkPath);\n }\n\n const signature = sign(contentsZip, ppkContent);\n const publicKeyDer = getPublicKeyDer(ppkContent);\n const pluginId = generatePluginId(publicKeyDer);\n\n const pluginZip = zipFiles({\n 'contents.zip': contentsZip,\n PUBKEY: publicKeyDer,\n SIGNATURE: signature,\n });\n\n return { zip: pluginZip, id: pluginId, privateKey: ppkContent };\n}\n\nexport const getZipFileNameSuffix = (env: string): string => {\n return env === 'prod' ? '' : `-${env}`;\n};\n","import forge from 'node-forge';\nimport fs from 'fs-extra';\n\n/**\n * contents.zip を秘密鍵で署名します\n */\nexport function sign(contents: Buffer, privateKeyPem: string): Buffer {\n const key = forge.pki.privateKeyFromPem(privateKeyPem);\n const md = forge.md.sha1.create();\n md.update(contents.toString('binary'));\n const signature = key.sign(md);\n return Buffer.from(signature, 'binary');\n}\n\n/**\n * 秘密鍵から公開鍵のDER形式を取得します\n */\nexport function getPublicKeyDer(privateKeyPem: string): Buffer {\n const privateKey = forge.pki.privateKeyFromPem(privateKeyPem);\n const publicKey = forge.pki.rsa.setPublicKey(privateKey.n, privateKey.e);\n const publicKeyAsn1 = forge.pki.publicKeyToAsn1(publicKey);\n const publicKeyDerBytes = forge.asn1.toDer(publicKeyAsn1).getBytes();\n return Buffer.from(publicKeyDerBytes, 'binary');\n}\n\n/**\n * RSA秘密鍵 (PPK) を生成し、ファイルに保存します\n */\nexport function generatePPK(ppkPath: string): string {\n const keypair = forge.pki.rsa.generateKeyPair(1024);\n const privateKey = forge.pki.privateKeyToPem(keypair.privateKey);\n fs.outputFileSync(ppkPath, privateKey);\n return privateKey;\n}\n\n/**\n * 公開鍵からプラグインIDを生成します\n */\nexport function generatePluginId(publicKeyDer: Buffer): string {\n const md = forge.md.sha256.create();\n md.update(publicKeyDer.toString('binary'));\n const hash = Buffer.from(md.digest().bytes(), 'binary');\n const hexDigest = hash.subarray(0, 16).toString('hex');\n return hexDigest.replace(/[0-9a-f]/g, (c) => 'abcdefghijklmnop'['0123456789abcdef'.indexOf(c)]);\n}\n","import { config } from 'dotenv';\nimport { KintoneRestAPIClient } from '@kintone/rest-api-client';\n\n/**\n * 環境変数からkintone REST APIクライアントを生成します\n */\nexport function createKintoneClient(): KintoneRestAPIClient {\n config();\n\n const {\n KINTONE_BASE_URL,\n KINTONE_USERNAME,\n KINTONE_PASSWORD,\n KINTONE_BASIC_AUTH_USERNAME,\n KINTONE_BASIC_AUTH_PASSWORD,\n } = process.env;\n\n if (!KINTONE_BASE_URL || !KINTONE_USERNAME || !KINTONE_PASSWORD) {\n throw new Error(`.envの設定が不十分です。以下のパラメータは必須です\nKINTONE_BASE_URL\nKINTONE_USERNAME\nKINTONE_PASSWORD`);\n }\n\n return new KintoneRestAPIClient({\n baseUrl: KINTONE_BASE_URL,\n auth: {\n username: KINTONE_USERNAME,\n password: KINTONE_PASSWORD,\n },\n ...(KINTONE_BASIC_AUTH_USERNAME && KINTONE_BASIC_AUTH_PASSWORD\n ? {\n basicAuth: {\n username: KINTONE_BASIC_AUTH_USERNAME,\n password: KINTONE_BASIC_AUTH_PASSWORD,\n },\n }\n : {}),\n });\n}\n\n/**\n * プラグインZIPをkintoneにアップロードします\n */\nexport async function uploadPlugin(params: {\n pluginId: string;\n file: { name: string; data: Buffer };\n}): Promise<{ method: 'PUT' | 'POST' }> {\n const client = createKintoneClient();\n\n const { fileKey } = await client.file.uploadFile({ file: params.file });\n\n const { plugins } = await client.plugin.getPlugins({ offset: 0, limit: 100 });\n const isUpdate = plugins.some(({ id }) => id === params.pluginId);\n\n if (isUpdate) {\n await client.plugin.updatePlugin({ id: params.pluginId, fileKey });\n return { method: 'PUT' };\n }\n\n await client.plugin.installPlugin({ fileKey });\n return { method: 'POST' };\n}\n","import { copyPluginContents } from '../../lib/plugin-contents.js';\nimport { createContentsZipFromDir, createPluginZip, getZipFileNameSuffix } from '../../lib/zip.js';\nimport { uploadPlugin } from '../../lib/kintone-api-client.js';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { PLUGIN_WORKSPACE_DIRECTORY } from '../../lib/constants.js';\nimport chokidar from 'chokidar';\nimport chalk from 'chalk';\n\nexport const watchContentsAndUploadZip = async (params: {\n manifest: Plugin.Meta.Manifest;\n ppkPath: string;\n}) => {\n const { manifest, ppkPath } = params;\n\n let initialScanComplete = false;\n\n const contentsListener = async () => {\n try {\n if (!initialScanComplete) {\n return;\n }\n await copyPluginContents();\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[contents] `) +\n `updated`\n );\n } catch (error: any) {\n console.error('Error copying plugin contents:', error);\n return;\n }\n\n try {\n const contentsZip = createContentsZipFromDir(manifest);\n const { zip, id: pluginId } = createPluginZip({\n ppkPath: path.resolve(ppkPath),\n contentsZip,\n });\n\n const zipFileName = `plugin${getZipFileNameSuffix('dev')}.zip`;\n await fs.writeFile(path.join(PLUGIN_WORKSPACE_DIRECTORY, zipFileName), zip);\n\n const { method } = await uploadPlugin({\n pluginId,\n file: { name: zipFileName, data: zip },\n });\n\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[upload] `) +\n `uploaded ${method === 'POST' ? '(new)' : '(update)'}`\n );\n } catch (error: any) {\n console.log(\n chalk.hex('#e5e7eb')(`${new Date().toLocaleTimeString()} `) +\n chalk.cyan(`[upload] `) +\n chalk.red(`failed`) +\n chalk.hex('#e5e7eb')(`: ${error?.message ?? 'Unknown error'}`)\n );\n }\n };\n\n const contentsWatcher = chokidar.watch(['src/contents/**/*'], {\n ignored: /node_modules/,\n persistent: true,\n });\n\n contentsWatcher.on('ready', () => {\n initialScanComplete = true;\n contentsListener();\n });\n\n contentsWatcher.on('change', contentsListener);\n contentsWatcher.on('add', contentsListener);\n contentsWatcher.on('unlink', contentsListener);\n};\n","import { program } from 'commander';\nimport { PLUGIN_WORKSPACE_DIRECTORY } from '../lib/constants.js';\nimport { generateCert } from '../lib/cert/index.js';\n\nexport default function command() {\n program\n .command('genkey')\n .description('Generate SSL certificate for localhost using node-forge.')\n .action(action);\n}\n\nexport async function action() {\n console.group('🍳 Generate SSL certificate for localhost');\n try {\n generateCert(PLUGIN_WORKSPACE_DIRECTORY);\n console.log(`🔑 Certificate generated. Output to ./${PLUGIN_WORKSPACE_DIRECTORY}`);\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import { program } from 'commander';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { outputManifest } from '../lib/plugin-manifest.js';\nimport { PLUGIN_WORKSPACE_DIRECTORY } from '../lib/constants.js';\nimport { createContentsZipFromDir, createPluginZip } from '../lib/zip.js';\nimport { copyPluginContents } from '../lib/plugin-contents.js';\n\nexport default function command() {\n program.command('init').description('generate private.ppk and kitting config').action(action);\n}\n\nexport async function action() {\n console.group('🍳 Executing plugin initialization setup');\n try {\n const manifest = await outputManifest('dev');\n console.log('📝 manifest.json generated');\n\n await copyPluginContents();\n console.log('📁 contents copied');\n\n const ppkPath = path.join(PLUGIN_WORKSPACE_DIRECTORY, 'private.ppk');\n const contentsZip = createContentsZipFromDir(manifest);\n const { zip, privateKey } = createPluginZip({ ppkPath, contentsZip });\n\n if (!fs.existsSync(ppkPath)) {\n console.log('🔑 private.ppk generated');\n } else {\n console.log('🔑 private.ppk already exists. The existing private.ppk will be used.');\n }\n\n await fs.writeFile(path.join(PLUGIN_WORKSPACE_DIRECTORY, 'plugin.zip'), zip);\n console.log('📦 plugin.zip generated');\n console.log('✨ Plugin initialization setup completed! zip file path is ./.plugin/plugin.zip');\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import { program } from 'commander';\nimport { outputManifest } from '../../lib/plugin-manifest.js';\nimport { copyPluginContents } from '../../lib/plugin-contents.js';\n\nexport default function command(): void {\n program\n .command('manifest')\n .option('-e, --env <env>', 'create manifest', 'prod')\n .action(action);\n}\n\nasync function action(options: { env: string }): Promise<void> {\n console.group('🚀 Executing manifest generation');\n try {\n const { env } = options;\n if (env !== 'prod' && env !== 'dev' && env !== 'standalone') {\n throw new Error('Invalid environment');\n }\n\n await copyPluginContents();\n console.log('📁 contents copied');\n\n await outputManifest(env);\n console.log(`📝 manifest.json generated (${env})`);\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import { program } from 'commander';\nimport fs from 'fs-extra';\nimport { esmImport } from '../../lib/import.js';\n\nexport default function command() {\n program.command('test').description('test').action(action);\n}\n\nexport async function action() {\n console.group('package.json');\n const packageJson = fs.readJSONSync('package.json');\n console.log('package.json detected');\n console.groupEnd();\n\n console.group('Config');\n const config = await esmImport('plugin.config.mjs');\n console.log('plugin.config.mjs detected', config);\n console.groupEnd();\n}\n","import { program } from 'commander';\nimport { outputManifest } from '../lib/plugin-manifest.js';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { PLUGIN_WORKSPACE_DIRECTORY } from '../lib/constants.js';\nimport { createContentsZipFromDir, createPluginZip, getZipFileNameSuffix } from '../lib/zip.js';\nimport { copyPluginContents } from '../lib/plugin-contents.js';\nimport { isEnv } from '../lib/utils.js';\n\nexport default function command(): void {\n program\n .command('zip')\n .description('generate plugin zip')\n .option('-e, --env <env>', 'plugin environment (dev, prod, standalone)', 'prod')\n .option(\n '-p, --ppk <ppk>',\n '.ppk file path',\n path.join(PLUGIN_WORKSPACE_DIRECTORY, 'private.ppk')\n )\n .action(action);\n}\n\nasync function action(options: { env: string; ppk: string }): Promise<void> {\n console.group('🍳 Executing plugin zip generation');\n try {\n const { env, ppk: ppkPath } = options;\n if (!isEnv(env)) {\n throw new Error('Invalid environment');\n }\n\n await copyPluginContents();\n console.log('📁 contents copied');\n\n const manifest = await outputManifest(env);\n console.log(`📝 manifest.json generated (${env})`);\n\n const contentsZip = createContentsZipFromDir(manifest);\n console.log('📦 contents.zip generated');\n\n const { zip, id } = createPluginZip({ ppkPath: path.resolve(ppkPath), contentsZip });\n\n const zipFileName = `plugin${getZipFileNameSuffix(env)}.zip`;\n await fs.writeFile(path.join(PLUGIN_WORKSPACE_DIRECTORY, zipFileName), zip);\n console.log('📦 plugin.zip generated');\n\n // version ファイルを出力\n const version = String(manifest.version);\n await fs.writeFile(path.join(PLUGIN_WORKSPACE_DIRECTORY, 'version'), version);\n console.log(`📝 version file generated (${version})`);\n\n console.log(`✨ Plugin zip generation completed! zip file path is ./.plugin/${zipFileName}`);\n console.log(` Plugin ID: ${id}`);\n } catch (error) {\n throw error;\n } finally {\n console.groupEnd();\n }\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { PLUGIN_WORKSPACE_DIRECTORY } from './constants.js';\nimport { uploadPlugin } from './kintone-api-client.js';\nimport { createContentsZipFromDir, createPluginZip, getZipFileNameSuffix } from './zip.js';\n\nexport const isEnv = (env: string): env is Plugin.Meta.Env => {\n return ['prod', 'dev', 'standalone'].includes(env);\n};\n\n/**\n * プラグインをビルドしてkintoneにアップロードします\n */\nexport const buildAndUploadPlugin = async (params: {\n env: Plugin.Meta.Env;\n manifest: Plugin.Meta.Manifest;\n ppkPath: string;\n}): Promise<{ method: 'PUT' | 'POST'; pluginId: string }> => {\n const { env, manifest, ppkPath } = params;\n\n const contentsZip = createContentsZipFromDir(manifest);\n const { zip, id: pluginId } = createPluginZip({ ppkPath, contentsZip });\n\n const zipFileName = `plugin${getZipFileNameSuffix(env)}.zip`;\n\n await fs.writeFile(path.join(PLUGIN_WORKSPACE_DIRECTORY, zipFileName), zip);\n\n const { method } = await uploadPlugin({\n pluginId,\n file: { name: zipFileName, data: zip },\n });\n\n return { method, pluginId };\n};\n","import { program } from 'commander';\nimport { lint } from '../lib/lint.js';\n\nexport default function command() {\n program\n .command('lint')\n .description('Lint source files')\n .option('-c, --config <config>', 'Config file path')\n .action(action);\n}\n\nexport async function action(options: {\n outdir: string;\n certdir: string;\n port: string;\n input: string;\n}) {\n try {\n lint();\n } catch (error) {\n throw error;\n } finally {\n }\n}\n"],"mappings":"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","names":["program","fs","path","path","path","path","config","pluginReact","path","fs","config","fs","path","program","fs","path","chalk","fs","path","path","PKG_NAME","fs","path","fs","path","config","config","path","chalk","path","outputFileName","chalk","fs","path","path","fs","fs","path","forge","fs","md","fs","path","fs","path","chokidar","chalk","path","fs","command","program","path","action","config","fs","chalk","program","command","program","action","program","fs","path","command","program","action","path","fs","program","command","program","action","program","fs","command","program","action","fs","config","program","fs","path","fs","path","command","program","path","action","fs","program","command","program","action","program","command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@konomi-app/k2",
3
- "version": "4.1.4",
3
+ "version": "4.2.0",
4
4
  "description": "kintone sdk",
5
5
  "main": "./dist/index.js",
6
6
  "type": "module",
@@ -41,7 +41,8 @@
41
41
  "html-minifier": "^4.0.0",
42
42
  "postcss": "^8.0.0",
43
43
  "remeda": "^1.0.0 || ^2.0.0",
44
- "tailwindcss": "^3",
44
+ "@tailwindcss/postcss": "^4.0.0",
45
+ "tailwindcss": "^4.0.0",
45
46
  "typescript-eslint": "^7.0.0 || ^8.0.0"
46
47
  },
47
48
  "peerDependenciesMeta": {},
@@ -63,7 +64,8 @@
63
64
  "html-minifier": "^4.0.0",
64
65
  "postcss": "^8.5.6",
65
66
  "remeda": "^2.32.0",
66
- "tailwindcss": "^3",
67
+ "@tailwindcss/postcss": "^4.2.2",
68
+ "tailwindcss": "^4.2.2",
67
69
  "tsup": "^8.5.0",
68
70
  "typescript": "^5.9.2",
69
71
  "typescript-eslint": "^8.44.0"
package/types/k2.d.ts CHANGED
@@ -10,12 +10,28 @@ declare namespace K2 {
10
10
  };
11
11
 
12
12
  /**
13
- * tailwindcssを使用している場合、設定ファイルのパスとCSSファイルのパスを指定することで、JavaScriptファイルのビルド時にCSSファイルを生成します
13
+ * tailwindcssを使用している場合、CSSファイルのパスを指定することで、JavaScriptファイルのビルド時にCSSファイルを生成します
14
+ *
15
+ * Tailwind CSS v4では、設定はCSSファイル内で`@config`ディレクティブや`@theme`ブロックを使用して行います
14
16
  *
15
17
  * @see {@link https://tailwindcss.com/docs/installation | Tailwind CSS}
18
+ * @example
19
+ * ```js
20
+ * // k2.config.mjs
21
+ * export default {
22
+ * tailwind: {
23
+ * css: 'src/styles/tailwind.css',
24
+ * }
25
+ * }
26
+ * ```
27
+ *
28
+ * ```css
29
+ * // src/styles/tailwind.css
30
+ * @import "tailwindcss";
31
+ * @config "../../tailwind.config.js"; // オプション: レガシーJS設定ファイルを使用する場合
32
+ * ```
16
33
  */
17
34
  tailwind?: {
18
- config?: string;
19
35
  /** CSSファイルのパス */
20
36
  css?: string;
21
37
  /** 出力するCSSファイル名 */
@@ -35,11 +51,11 @@ declare namespace K2 {
35
51
  /** 簡体字中国語 */
36
52
  zh: string;
37
53
  /** 繁体字中国語 */
38
- "zh-TW": string;
54
+ 'zh-TW': string;
39
55
  /** スペイン語 */
40
56
  es: string;
41
57
  /** ポルトガル語(ブラジル) */
42
- "pt-BR": string;
58
+ 'pt-BR': string;
43
59
  /** タイ語 */
44
60
  th: string;
45
61
  };
package/types/plugin.d.ts CHANGED
@@ -90,31 +90,38 @@ declare namespace Plugin {
90
90
  };
91
91
 
92
92
  /**
93
- * tailwindcssを使用している場合、設定ファイルのパスとCSSファイルのパスを指定することで、JavaScriptファイルのビルド時にCSSファイルを生成します
93
+ * tailwindcssを使用している場合、CSSファイルのパスを指定することで、JavaScriptファイルのビルド時にCSSファイルを生成します
94
+ *
95
+ * Tailwind CSS v4では、設定はCSSファイル内で`@config`ディレクティブや`@theme`ブロックを使用して行います
94
96
  *
95
97
  * @see {@link https://tailwindcss.com/docs/installation | Tailwind CSS}
96
98
  * @example
97
- * ```json
98
- * // 共通の設定ファイルを使用する場合
99
+ * ```js
100
+ * // 共通のCSSファイルを使用する場合
99
101
  * {
100
- * "tailwind": {
101
- * "config": "tailwind.config.js",
102
- * "css": "src/styles/tailwind.css"
102
+ * "tailwind": {
103
+ * "css": "src/styles/tailwind.css"
104
+ * }
103
105
  * }
104
106
  *
105
- * // 設定ファイルをプラグイン設定画面、アプリで分ける場合
107
+ * // プラグイン設定画面とデスクトップでCSSファイルを分ける場合
106
108
  * {
107
- * "tailwind": {
108
- * "config": {
109
- * "config": "tailwind.config.js",
110
- * "desktop": "src/styles/tailwind-desktop.css"
111
- * },
112
- * "css": "src/styles/tailwind-mobile.css"
109
+ * "tailwind": {
110
+ * "css": {
111
+ * "config": "src/styles/tailwind-config.css",
112
+ * "desktop": "src/styles/tailwind-desktop.css"
113
+ * }
114
+ * }
113
115
  * }
114
116
  * ```
117
+ *
118
+ * ```css
119
+ * // src/styles/tailwind.css
120
+ * @import "tailwindcss";
121
+ * @config "../../tailwind.config.js"; // オプション: レガシーJS設定ファイルを使用する場合
122
+ * ```
115
123
  */
116
124
  tailwind?: {
117
- config?: string | { config: string; desktop: string };
118
125
  /** CSSファイルのパス */
119
126
  css?: string | { config: string; desktop: string };
120
127
  };