@konomi-app/k2 4.1.1 → 4.1.2
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 +17 -2
- package/dist/index.js.map +1 -1
- package/dist/plugin.js +17 -2
- package/dist/plugin.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -150,6 +150,20 @@ function getRsbuildPlugins() {
|
|
|
150
150
|
})
|
|
151
151
|
];
|
|
152
152
|
}
|
|
153
|
+
function shouldWriteDevAssetToDisk(file) {
|
|
154
|
+
return !file.includes(".hot-update.");
|
|
155
|
+
}
|
|
156
|
+
async function removeHotUpdateFiles(outDir) {
|
|
157
|
+
if (!fs2.existsSync(outDir)) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const fileNames = (await fs2.readdir(outDir, { encoding: "utf8" })).map(
|
|
161
|
+
(fileName) => fileName.toString()
|
|
162
|
+
);
|
|
163
|
+
await Promise.all(
|
|
164
|
+
fileNames.filter((fileName) => fileName.includes(".hot-update.")).map((fileName) => fs2.remove(path5.join(outDir, fileName)))
|
|
165
|
+
);
|
|
166
|
+
}
|
|
153
167
|
async function buildWithRsbuild(params) {
|
|
154
168
|
const { entries, outDir, minify = true, sourcemap = false, injectStyles = true } = params;
|
|
155
169
|
const sourceMapConfig = sourcemap === "inline" ? "cheap-module-source-map" : sourcemap ? "source-map" : false;
|
|
@@ -179,6 +193,7 @@ async function buildWithRsbuild(params) {
|
|
|
179
193
|
}
|
|
180
194
|
async function startRsbuildDevServer(params) {
|
|
181
195
|
const { entries, outDir, port, https, publicDir, onFirstCompile, onRecompile } = params;
|
|
196
|
+
await removeHotUpdateFiles(outDir);
|
|
182
197
|
const rsbuildConfig = {
|
|
183
198
|
plugins: getRsbuildPlugins(),
|
|
184
199
|
source: { entry: entries },
|
|
@@ -205,7 +220,7 @@ async function startRsbuildDevServer(params) {
|
|
|
205
220
|
...publicDir && fs2.existsSync(publicDir) ? { publicDir: { name: publicDir } } : {}
|
|
206
221
|
},
|
|
207
222
|
dev: {
|
|
208
|
-
writeToDisk:
|
|
223
|
+
writeToDisk: shouldWriteDevAssetToDisk
|
|
209
224
|
}
|
|
210
225
|
};
|
|
211
226
|
const rsbuild = await createRsbuild({ rsbuildConfig });
|
|
@@ -214,7 +229,7 @@ async function startRsbuildDevServer(params) {
|
|
|
214
229
|
{
|
|
215
230
|
name: "k2-dev-hooks",
|
|
216
231
|
setup(api) {
|
|
217
|
-
api.
|
|
232
|
+
api.onAfterDevCompile(async ({ isFirstCompile }) => {
|
|
218
233
|
if (isFirstCompile && onFirstCompile) {
|
|
219
234
|
await onFirstCompile();
|
|
220
235
|
} else if (!isFirstCompile && onRecompile) {
|
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\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 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: true,\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.onDevCompileDone(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/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"]}
|
package/dist/plugin.js
CHANGED
|
@@ -166,6 +166,20 @@ function getRsbuildPlugins() {
|
|
|
166
166
|
})
|
|
167
167
|
];
|
|
168
168
|
}
|
|
169
|
+
function shouldWriteDevAssetToDisk(file) {
|
|
170
|
+
return !file.includes(".hot-update.");
|
|
171
|
+
}
|
|
172
|
+
async function removeHotUpdateFiles(outDir) {
|
|
173
|
+
if (!fs2.existsSync(outDir)) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const fileNames = (await fs2.readdir(outDir, { encoding: "utf8" })).map(
|
|
177
|
+
(fileName) => fileName.toString()
|
|
178
|
+
);
|
|
179
|
+
await Promise.all(
|
|
180
|
+
fileNames.filter((fileName) => fileName.includes(".hot-update.")).map((fileName) => fs2.remove(path4.join(outDir, fileName)))
|
|
181
|
+
);
|
|
182
|
+
}
|
|
169
183
|
async function buildWithRsbuild(params) {
|
|
170
184
|
const { entries, outDir, minify = true, sourcemap = false, injectStyles = true } = params;
|
|
171
185
|
const sourceMapConfig = sourcemap === "inline" ? "cheap-module-source-map" : sourcemap ? "source-map" : false;
|
|
@@ -195,6 +209,7 @@ async function buildWithRsbuild(params) {
|
|
|
195
209
|
}
|
|
196
210
|
async function startRsbuildDevServer(params) {
|
|
197
211
|
const { entries, outDir, port, https, publicDir, onFirstCompile, onRecompile } = params;
|
|
212
|
+
await removeHotUpdateFiles(outDir);
|
|
198
213
|
const rsbuildConfig = {
|
|
199
214
|
plugins: getRsbuildPlugins(),
|
|
200
215
|
source: { entry: entries },
|
|
@@ -221,7 +236,7 @@ async function startRsbuildDevServer(params) {
|
|
|
221
236
|
...publicDir && fs2.existsSync(publicDir) ? { publicDir: { name: publicDir } } : {}
|
|
222
237
|
},
|
|
223
238
|
dev: {
|
|
224
|
-
writeToDisk:
|
|
239
|
+
writeToDisk: shouldWriteDevAssetToDisk
|
|
225
240
|
}
|
|
226
241
|
};
|
|
227
242
|
const rsbuild = await createRsbuild({ rsbuildConfig });
|
|
@@ -230,7 +245,7 @@ async function startRsbuildDevServer(params) {
|
|
|
230
245
|
{
|
|
231
246
|
name: "k2-dev-hooks",
|
|
232
247
|
setup(api) {
|
|
233
|
-
api.
|
|
248
|
+
api.onAfterDevCompile(async ({ isFirstCompile }) => {
|
|
234
249
|
if (isFirstCompile && onFirstCompile) {
|
|
235
250
|
await onFirstCompile();
|
|
236
251
|
} else if (!isFirstCompile && onRecompile) {
|
package/dist/plugin.js.map
CHANGED
|
@@ -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\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 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: true,\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.onDevCompileDone(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 { 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"]}
|