marhup 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +481 -4
  2. package/dist/cli.js +659 -78
  3. package/dist/cli.js.map +1 -1
  4. package/dist/errors.d.ts +29 -0
  5. package/dist/errors.d.ts.map +1 -0
  6. package/dist/errors.js +62 -0
  7. package/dist/errors.js.map +1 -0
  8. package/dist/generator/code.d.ts +4 -3
  9. package/dist/generator/code.d.ts.map +1 -1
  10. package/dist/generator/code.js +7 -7
  11. package/dist/generator/code.js.map +1 -1
  12. package/dist/generator/gen-animations.d.ts +13 -0
  13. package/dist/generator/gen-animations.d.ts.map +1 -0
  14. package/dist/generator/gen-animations.js +77 -0
  15. package/dist/generator/gen-animations.js.map +1 -0
  16. package/dist/generator/image.d.ts +4 -3
  17. package/dist/generator/image.d.ts.map +1 -1
  18. package/dist/generator/image.js +67 -80
  19. package/dist/generator/image.js.map +1 -1
  20. package/dist/generator/index.d.ts +2 -0
  21. package/dist/generator/index.d.ts.map +1 -1
  22. package/dist/generator/index.js +9 -18
  23. package/dist/generator/index.js.map +1 -1
  24. package/dist/generator/list.d.ts +4 -3
  25. package/dist/generator/list.d.ts.map +1 -1
  26. package/dist/generator/list.js +15 -17
  27. package/dist/generator/list.js.map +1 -1
  28. package/dist/generator/mermaid.d.ts +9 -4
  29. package/dist/generator/mermaid.d.ts.map +1 -1
  30. package/dist/generator/mermaid.js +120 -85
  31. package/dist/generator/mermaid.js.map +1 -1
  32. package/dist/generator/pptx.d.ts +1 -1
  33. package/dist/generator/pptx.d.ts.map +1 -1
  34. package/dist/generator/pptx.js +232 -60
  35. package/dist/generator/pptx.js.map +1 -1
  36. package/dist/generator/presentation.d.ts +149 -0
  37. package/dist/generator/presentation.d.ts.map +1 -0
  38. package/dist/generator/presentation.js +163 -0
  39. package/dist/generator/presentation.js.map +1 -0
  40. package/dist/generator/table.d.ts +4 -3
  41. package/dist/generator/table.d.ts.map +1 -1
  42. package/dist/generator/table.js +12 -33
  43. package/dist/generator/table.js.map +1 -1
  44. package/dist/generator/text.d.ts +5 -4
  45. package/dist/generator/text.d.ts.map +1 -1
  46. package/dist/generator/text.js +34 -20
  47. package/dist/generator/text.js.map +1 -1
  48. package/dist/generator/video.d.ts +18 -0
  49. package/dist/generator/video.d.ts.map +1 -0
  50. package/dist/generator/video.js +83 -0
  51. package/dist/generator/video.js.map +1 -0
  52. package/dist/index.d.ts +8 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +144 -55
  55. package/dist/index.js.map +1 -1
  56. package/dist/layout/auto.d.ts +14 -2
  57. package/dist/layout/auto.d.ts.map +1 -1
  58. package/dist/layout/auto.js +129 -37
  59. package/dist/layout/auto.js.map +1 -1
  60. package/dist/layout/engine.d.ts +1 -1
  61. package/dist/layout/engine.d.ts.map +1 -1
  62. package/dist/layout/engine.js +10 -12
  63. package/dist/layout/engine.js.map +1 -1
  64. package/dist/layout/index.d.ts +1 -1
  65. package/dist/layout/index.d.ts.map +1 -1
  66. package/dist/layout/index.js +2 -10
  67. package/dist/layout/index.js.map +1 -1
  68. package/dist/layout/types.d.ts +1 -0
  69. package/dist/layout/types.d.ts.map +1 -1
  70. package/dist/layout/types.js +1 -2
  71. package/dist/layout/types.js.map +1 -1
  72. package/dist/mcp-handlers.d.ts.map +1 -1
  73. package/dist/mcp-handlers.js +45 -54
  74. package/dist/mcp-handlers.js.map +1 -1
  75. package/dist/mcp.js +10 -12
  76. package/dist/mcp.js.map +1 -1
  77. package/dist/parser/frontmatter.d.ts.map +1 -1
  78. package/dist/parser/frontmatter.js +95 -16
  79. package/dist/parser/frontmatter.js.map +1 -1
  80. package/dist/parser/grid.d.ts +5 -7
  81. package/dist/parser/grid.d.ts.map +1 -1
  82. package/dist/parser/grid.js +217 -30
  83. package/dist/parser/grid.js.map +1 -1
  84. package/dist/parser/index.js +3 -13
  85. package/dist/parser/index.js.map +1 -1
  86. package/dist/parser/markdown.d.ts +1 -1
  87. package/dist/parser/markdown.d.ts.map +1 -1
  88. package/dist/parser/markdown.js +249 -137
  89. package/dist/parser/markdown.js.map +1 -1
  90. package/dist/theme/default.d.ts +1 -1
  91. package/dist/theme/default.d.ts.map +1 -1
  92. package/dist/theme/default.js +16 -8
  93. package/dist/theme/default.js.map +1 -1
  94. package/dist/theme/index.d.ts +11 -0
  95. package/dist/theme/index.d.ts.map +1 -1
  96. package/dist/theme/index.js +70 -7
  97. package/dist/theme/index.js.map +1 -1
  98. package/dist/types/index.d.ts +56 -2
  99. package/dist/types/index.d.ts.map +1 -1
  100. package/dist/types/index.js +4 -6
  101. package/dist/types/index.js.map +1 -1
  102. package/dist/types/plugin.d.ts +50 -0
  103. package/dist/types/plugin.d.ts.map +1 -0
  104. package/dist/types/plugin.js +5 -0
  105. package/dist/types/plugin.js.map +1 -0
  106. package/dist/utils/file-lock.d.ts +27 -0
  107. package/dist/utils/file-lock.d.ts.map +1 -0
  108. package/dist/utils/file-lock.js +118 -0
  109. package/dist/utils/file-lock.js.map +1 -0
  110. package/dist/utils/i18n.d.ts +5 -0
  111. package/dist/utils/i18n.d.ts.map +1 -0
  112. package/dist/utils/i18n.js +41 -0
  113. package/dist/utils/i18n.js.map +1 -0
  114. package/dist/utils/logger.d.ts +7 -0
  115. package/dist/utils/logger.d.ts.map +1 -0
  116. package/dist/utils/logger.js +43 -0
  117. package/dist/utils/logger.js.map +1 -0
  118. package/dist/utils/path-validation.d.ts +20 -0
  119. package/dist/utils/path-validation.d.ts.map +1 -0
  120. package/dist/utils/path-validation.js +39 -0
  121. package/dist/utils/path-validation.js.map +1 -0
  122. package/dist/utils/plugin-manager.d.ts +18 -0
  123. package/dist/utils/plugin-manager.d.ts.map +1 -0
  124. package/dist/utils/plugin-manager.js +108 -0
  125. package/dist/utils/plugin-manager.js.map +1 -0
  126. package/dist/utils/sanitizer.d.ts +14 -0
  127. package/dist/utils/sanitizer.d.ts.map +1 -0
  128. package/dist/utils/sanitizer.js +73 -0
  129. package/dist/utils/sanitizer.js.map +1 -0
  130. package/package.json +23 -8
@@ -1,11 +1,74 @@
1
- "use strict";
2
1
  /**
3
2
  * テーマモジュール
4
3
  */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.resolveStyleClasses = exports.styleClasses = exports.defaultTheme = void 0;
7
- var default_js_1 = require("./default.js");
8
- Object.defineProperty(exports, "defaultTheme", { enumerable: true, get: function () { return default_js_1.defaultTheme; } });
9
- Object.defineProperty(exports, "styleClasses", { enumerable: true, get: function () { return default_js_1.styleClasses; } });
10
- Object.defineProperty(exports, "resolveStyleClasses", { enumerable: true, get: function () { return default_js_1.resolveStyleClasses; } });
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ import * as YAML from 'yaml';
7
+ import { defaultTheme } from './default.js';
8
+ import { validateAndResolvePath } from '../utils/path-validation.js';
9
+ export { defaultTheme, styleClasses, resolveStyleClasses } from './default.js';
10
+ export { loadTheme };
11
+ export { resolveTheme };
12
+ /**
13
+ * YAMLファイルからテーマをロード
14
+ */
15
+ function loadTheme(filePath, basePath) {
16
+ try {
17
+ const resolvedPath = basePath ? validateAndResolvePath(filePath, basePath) : path.resolve(filePath);
18
+ const content = fs.readFileSync(resolvedPath, 'utf-8');
19
+ const parsed = YAML.parse(content);
20
+ if (typeof parsed !== 'object' || parsed === null) {
21
+ throw new Error('Theme file must contain an object');
22
+ }
23
+ return parsed;
24
+ }
25
+ catch (error) {
26
+ throw new Error(`Failed to load theme from ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
27
+ }
28
+ }
29
+ /**
30
+ * ディープマージ関数
31
+ */
32
+ function deepMerge(target, source) {
33
+ const result = { ...target };
34
+ for (const key in source) {
35
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
36
+ const sourceValue = source[key];
37
+ if (sourceValue !== undefined) {
38
+ if (typeof sourceValue === 'object' && sourceValue !== null && !Array.isArray(sourceValue) && typeof result[key] === 'object' && result[key] !== null) {
39
+ result[key] = deepMerge(result[key], sourceValue);
40
+ }
41
+ else {
42
+ result[key] = sourceValue;
43
+ }
44
+ }
45
+ }
46
+ }
47
+ return result;
48
+ }
49
+ /**
50
+ * Front Matterからテーマを解決
51
+ */
52
+ function resolveTheme(themeValue, basePath) {
53
+ if (!themeValue) {
54
+ return defaultTheme;
55
+ }
56
+ if (typeof themeValue === 'string') {
57
+ if (themeValue === 'default') {
58
+ return defaultTheme;
59
+ }
60
+ // Try to load as YAML file
61
+ try {
62
+ const customTheme = loadTheme(themeValue, basePath);
63
+ return deepMerge(defaultTheme, customTheme);
64
+ }
65
+ catch (error) {
66
+ console.warn(`Failed to load theme from ${themeValue}: ${error instanceof Error ? error.message : String(error)}`);
67
+ console.warn('Using default theme');
68
+ return defaultTheme;
69
+ }
70
+ }
71
+ // Merge partial theme with default
72
+ return deepMerge(defaultTheme, themeValue);
73
+ }
11
74
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,2CAA+E;AAAtE,0GAAA,YAAY,OAAA;AAAE,0GAAA,YAAY,OAAA;AAAE,iHAAA,mBAAmB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ export interface GridPosition {
10
10
  export interface StyleOptions {
11
11
  classes: string[];
12
12
  properties: Record<string, string>;
13
+ animation?: AnimationConfig;
13
14
  }
14
15
  export interface ListItem {
15
16
  content: string;
@@ -21,23 +22,52 @@ export interface TableData {
21
22
  headers: string[];
22
23
  rows: string[][];
23
24
  }
24
- export type ElementType = 'heading' | 'paragraph' | 'list' | 'image' | 'table' | 'code' | 'blockquote' | 'mermaid';
25
+ export type ElementType = 'heading' | 'paragraph' | 'list' | 'image' | 'video' | 'table' | 'code' | 'blockquote' | 'mermaid';
26
+ export type AnimationType = 'appear' | 'fadein' | 'flyin' | 'zoom' | 'wipe' | 'split' | 'wheel' | 'randombars' | 'growshrink' | 'spin' | 'floatin' | 'shape' | 'bounce' | 'pulse' | 'teeter' | 'blink' | 'flicker' | 'swivel' | 'spring' | 'fadeout' | 'flyout' | 'floatout' | 'splitexit' | 'wipeexit' | 'shapeexit' | 'wheelexit' | 'randombarsexit' | 'shrinkandturn' | 'zoomexit' | 'swivelexit' | 'bounceexit' | 'disappear' | 'growandturn' | 'colorpulse' | 'desaturate' | 'darken' | 'lighten' | 'transparency' | 'objectcolor' | 'complementarycolor' | 'linecolor' | 'fillcolor' | 'pathdown' | 'patharcdown' | 'pathturnright' | 'pathcircle' | 'pathzigzag';
27
+ export type AnimationDirection = 'left' | 'right' | 'top' | 'bottom' | 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight' | 'horizontal' | 'vertical' | 'clockwise' | 'counterclockwise' | 'horizontalIn' | 'horizontalOut' | 'verticalIn' | 'verticalOut' | 'fromBottom' | 'fromTop' | 'fromLeft' | 'fromRight' | 'slideCenter' | 'objectCenter' | 'quarterSpin' | 'halfSpin' | 'fullSpin' | 'twoSpins' | 'tiny' | 'smaller' | 'larger' | 'huge' | '25%' | '50%' | '75%' | '100%' | 'floatUp' | 'floatDown' | 'circle' | 'box' | 'diamond' | 'plus' | 'in' | 'out';
28
+ export interface AnimationConfig {
29
+ type: AnimationType;
30
+ duration?: number;
31
+ delay?: number;
32
+ direction?: AnimationDirection;
33
+ trigger?: 'onClick' | 'afterPrevious' | 'withPrevious';
34
+ repeat?: number;
35
+ speed?: 'slow' | 'medium' | 'fast';
36
+ class?: 'entr' | 'emph' | 'exit' | 'path';
37
+ presetID?: number;
38
+ presetSubtype?: number;
39
+ }
40
+ export type SlideTransitionType = 'none' | 'fade' | 'push' | 'wipe' | 'split' | 'reveal' | 'randomBars' | 'shape' | 'uncover' | 'cover' | 'flash' | 'checker' | 'blinds' | 'clock' | 'ripple' | 'honeycomb' | 'glitter' | 'sphere' | 'newsflash' | 'plus' | 'diamond' | 'wedge' | 'wheel' | 'circle' | 'box' | 'zoom' | 'dissolve';
41
+ export type TransitionDirection = 'left' | 'right' | 'top' | 'bottom' | 'horizontal' | 'vertical' | 'clockwise' | 'counterclockwise';
42
+ export interface SlideTransitionConfig {
43
+ type: SlideTransitionType;
44
+ duration?: number;
45
+ direction?: TransitionDirection;
46
+ speed?: 'slow' | 'medium' | 'fast';
47
+ }
25
48
  export interface SlideElement {
26
49
  type: ElementType;
27
50
  content: string | ListItem[] | TableData;
28
51
  level?: number;
29
52
  position?: GridPosition;
30
53
  style?: StyleOptions;
54
+ animation?: AnimationConfig;
55
+ altText?: string;
31
56
  raw?: string;
32
57
  }
33
58
  export interface PlacedElement extends SlideElement {
34
59
  position: GridPosition;
60
+ animation?: AnimationConfig;
35
61
  }
36
62
  export interface SlideFrontmatter {
37
63
  title?: string;
38
64
  grid?: string;
39
65
  layout?: string;
40
- theme?: string;
66
+ theme?: string | Partial<ThemeConfig>;
67
+ classes?: Record<string, Record<string, unknown>>;
68
+ aliases?: Record<string, string>;
69
+ animations?: AnimationConfig[];
70
+ transition?: SlideTransitionConfig;
41
71
  [key: string]: unknown;
42
72
  }
43
73
  export interface Slide {
@@ -60,11 +90,13 @@ export interface ThemeConfig {
60
90
  accent: string;
61
91
  background: string;
62
92
  text: string;
93
+ [key: string]: string;
63
94
  };
64
95
  fonts: {
65
96
  title: string;
66
97
  body: string;
67
98
  code: string;
99
+ [key: string]: string;
68
100
  };
69
101
  fontSize: {
70
102
  h1: number;
@@ -72,6 +104,17 @@ export interface ThemeConfig {
72
104
  h3: number;
73
105
  body: number;
74
106
  small: number;
107
+ [key: string]: number;
108
+ };
109
+ slideMaster?: {
110
+ backgroundColor?: string;
111
+ backgroundImage?: string;
112
+ margin?: {
113
+ top: number;
114
+ bottom: number;
115
+ left: number;
116
+ right: number;
117
+ };
75
118
  };
76
119
  }
77
120
  export interface ConvertOptions {
@@ -80,6 +123,17 @@ export interface ConvertOptions {
80
123
  grid?: string;
81
124
  watch?: boolean;
82
125
  basePath?: string;
126
+ pluginDir?: string;
127
+ }
128
+ export interface ConfigOptions {
129
+ output?: string;
130
+ outputDir?: string;
131
+ theme?: string;
132
+ grid?: string;
133
+ watch?: boolean;
134
+ basePath?: string;
135
+ lang?: string;
136
+ pluginDir?: string;
83
137
  }
84
138
  export declare const DEFAULT_GRID: GridConfig;
85
139
  export declare const DEFAULT_ELEMENT_HEIGHT: Record<ElementType, number>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,18 @@
1
- "use strict";
2
1
  /**
3
2
  * marhup 型定義
4
3
  */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.DEFAULT_ELEMENT_HEIGHT = exports.DEFAULT_GRID = void 0;
7
- // デフォルトグリッド
8
- exports.DEFAULT_GRID = {
4
+ // デフォルトグリッド(後方互換性のため)
5
+ export const DEFAULT_GRID = {
9
6
  cols: 12,
10
7
  rows: 9,
11
8
  };
12
9
  // デフォルト要素高さ(行数)
13
- exports.DEFAULT_ELEMENT_HEIGHT = {
10
+ export const DEFAULT_ELEMENT_HEIGHT = {
14
11
  heading: 1,
15
12
  paragraph: 2,
16
13
  list: 3,
17
14
  image: 4,
15
+ video: 4,
18
16
  table: 3,
19
17
  code: 3,
20
18
  blockquote: 2,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAoHH,YAAY;AACC,QAAA,YAAY,GAAe;IACtC,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,gBAAgB;AACH,QAAA,sBAAsB,GAAgC;IACjE,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,UAAU,EAAE,CAAC;IACb,OAAO,EAAE,CAAC;CACX,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsTH,sBAAsB;AACtB,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,gBAAgB;AAChB,MAAM,CAAC,MAAM,sBAAsB,GAAgC;IACjE,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,UAAU,EAAE,CAAC;IACb,OAAO,EAAE,CAAC;CACX,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Plugin type definitions
3
+ */
4
+ import type { SlideElement, ParsedDocument, ConvertOptions, PlacedElement, GridConfig, Slide, ThemeConfig } from './index.js';
5
+ import type { ISlide, IPresentation } from '../generator/presentation.js';
6
+ import type { Logger } from 'winston';
7
+ import type { Token } from 'marked';
8
+ export interface PluginContext {
9
+ logger: Logger;
10
+ options: ConvertOptions;
11
+ }
12
+ export interface ElementParser {
13
+ (token: Token, aliases?: Record<string, string>, gridConfig?: GridConfig): SlideElement | null;
14
+ }
15
+ export interface ElementGeneratorContext {
16
+ grid: GridConfig;
17
+ slideData: Slide;
18
+ theme: ThemeConfig;
19
+ basePath?: string;
20
+ coords: {
21
+ x: number;
22
+ y: number;
23
+ w: number;
24
+ h: number;
25
+ };
26
+ styleProps: Record<string, unknown>;
27
+ }
28
+ export interface ElementGenerator {
29
+ (element: PlacedElement, slide: ISlide, context: ElementGeneratorContext): Promise<string[]>;
30
+ }
31
+ export interface PluginHooks {
32
+ onInit?: (context: PluginContext) => void;
33
+ onParse?: (document: ParsedDocument) => ParsedDocument;
34
+ onGenerate?: (presentation: IPresentation) => void;
35
+ }
36
+ export interface Plugin {
37
+ name: string;
38
+ version?: string;
39
+ description?: string;
40
+ elementParsers?: Record<string, ElementParser>;
41
+ elementGenerators?: Record<string, ElementGenerator>;
42
+ hooks?: PluginHooks;
43
+ }
44
+ export interface PluginManager {
45
+ loadPlugins(pluginDir: string): Promise<void>;
46
+ getElementParser(type: string): ElementParser | undefined;
47
+ getElementGenerator(type: string): ElementGenerator | undefined;
48
+ executeHook<K extends keyof PluginHooks>(hook: K, ...args: Parameters<NonNullable<PluginHooks[K]>>): Promise<void>;
49
+ }
50
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9H,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEpC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC;CAChG;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9F;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,cAAc,CAAC;IACvD,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,aAAa,KAAK,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACrD,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IAC1D,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;IAChE,WAAW,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpH"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Plugin type definitions
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * ファイルロックユーティリティ
3
+ * 同時実行時のファイル競合を防ぐ
4
+ */
5
+ export declare class FileLock {
6
+ private lockFilePath;
7
+ private acquired;
8
+ private timeoutMs;
9
+ constructor(filePath: string, timeoutMs?: number);
10
+ /**
11
+ * ロックを取得(ブロッキング)
12
+ */
13
+ acquire(): Promise<boolean>;
14
+ /**
15
+ * ロックを解放
16
+ */
17
+ release(): void;
18
+ /**
19
+ * ロックが取得されているか
20
+ */
21
+ isAcquired(): boolean;
22
+ }
23
+ /**
24
+ * ファイル操作をアトミックに行うためのロック付き実行
25
+ */
26
+ export declare function withFileLock<T>(filePath: string, operation: () => Promise<T>): Promise<T>;
27
+ //# sourceMappingURL=file-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-lock.d.ts","sourceRoot":"","sources":["../../src/utils/file-lock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,qBAAa,QAAQ;IACnB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;gBAEd,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAOhD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IA2DjC;;OAEG;IACH,OAAO,IAAI,IAAI;IAgBf;;OAEG;IACH,UAAU,IAAI,OAAO;CAGtB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CAiBZ"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * ファイルロックユーティリティ
3
+ * 同時実行時のファイル競合を防ぐ
4
+ */
5
+ import * as fs from 'fs';
6
+ import { setTimeout } from 'timers/promises';
7
+ import { MarhupError } from '../errors.js';
8
+ import { t } from './i18n.js';
9
+ export class FileLock {
10
+ lockFilePath;
11
+ acquired = false;
12
+ timeoutMs = 30000; // 30秒タイムアウト
13
+ constructor(filePath, timeoutMs) {
14
+ this.lockFilePath = `${filePath}.lock`;
15
+ if (timeoutMs !== undefined) {
16
+ this.timeoutMs = timeoutMs;
17
+ }
18
+ }
19
+ /**
20
+ * ロックを取得(ブロッキング)
21
+ */
22
+ async acquire() {
23
+ if (this.acquired) {
24
+ return true;
25
+ }
26
+ const startTime = Date.now();
27
+ while (Date.now() - startTime < this.timeoutMs) {
28
+ try {
29
+ // ロックファイルが存在するかチェック
30
+ if (fs.existsSync(this.lockFilePath)) {
31
+ // ロックファイルの内容を読み取る
32
+ const content = fs.readFileSync(this.lockFilePath, 'utf-8').trim();
33
+ const lines = content.split('\n');
34
+ if (lines.length >= 2) {
35
+ const pid = parseInt(lines[0], 10);
36
+ const timestamp = parseInt(lines[1], 10);
37
+ // 同じプロセスからのロックかチェック
38
+ if (pid === process.pid) {
39
+ this.acquired = true;
40
+ return true;
41
+ }
42
+ // 古いロックかチェック(5分以上経過)
43
+ const age = Date.now() - timestamp;
44
+ if (age > 5 * 60 * 1000) {
45
+ // 古いロックファイルを削除
46
+ fs.unlinkSync(this.lockFilePath);
47
+ }
48
+ else {
49
+ // ロック中、待機
50
+ await setTimeout(100); // 100ms待機
51
+ continue;
52
+ }
53
+ }
54
+ else {
55
+ // 不正なロックファイル、削除
56
+ fs.unlinkSync(this.lockFilePath);
57
+ }
58
+ }
59
+ // ロックファイルを作成('wx'フラグで存在する場合失敗)
60
+ fs.writeFileSync(this.lockFilePath, `${process.pid}\n${Date.now()}`, { flag: 'wx', encoding: 'utf-8' });
61
+ this.acquired = true;
62
+ return true;
63
+ }
64
+ catch (error) {
65
+ if (error.code === 'EEXIST') {
66
+ // ファイルが存在する、待機して再試行
67
+ await setTimeout(100);
68
+ continue;
69
+ }
70
+ // その他のエラー
71
+ return false;
72
+ }
73
+ }
74
+ // タイムアウト
75
+ return false;
76
+ }
77
+ /**
78
+ * ロックを解放
79
+ */
80
+ release() {
81
+ if (this.acquired && fs.existsSync(this.lockFilePath)) {
82
+ try {
83
+ // ロックファイルの内容を確認(同じプロセスか)
84
+ const content = fs.readFileSync(this.lockFilePath, 'utf-8').trim();
85
+ const lines = content.split('\n');
86
+ if (lines.length >= 1 && parseInt(lines[0], 10) === process.pid) {
87
+ fs.unlinkSync(this.lockFilePath);
88
+ }
89
+ }
90
+ catch (error) {
91
+ console.warn(t('errors.lockFileDeletionFailed', { error }));
92
+ }
93
+ }
94
+ this.acquired = false;
95
+ }
96
+ /**
97
+ * ロックが取得されているか
98
+ */
99
+ isAcquired() {
100
+ return this.acquired;
101
+ }
102
+ }
103
+ /**
104
+ * ファイル操作をアトミックに行うためのロック付き実行
105
+ */
106
+ export async function withFileLock(filePath, operation) {
107
+ const lock = new FileLock(filePath);
108
+ if (!(await lock.acquire())) {
109
+ throw new MarhupError(t('errors.fileInUse', { path: filePath }), 'FILE_LOCKED', t('errors.suggestionWaitOrChangeOutput'), filePath);
110
+ }
111
+ try {
112
+ return await operation();
113
+ }
114
+ finally {
115
+ lock.release();
116
+ }
117
+ }
118
+ //# sourceMappingURL=file-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-lock.js","sourceRoot":"","sources":["../../src/utils/file-lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const initI18n: (language?: string) => Promise<void>;
2
+ export declare const t: (key: string, options?: any) => string;
3
+ export declare const changeLanguage: (language: string) => Promise<void>;
4
+ export declare const getCurrentLanguage: () => string;
5
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/utils/i18n.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,QAAQ,GAAU,WAAW,MAAM,kBAgB/C,CAAC;AAGF,eAAO,MAAM,CAAC,GAAI,KAAK,MAAM,EAAE,UAAU,GAAG,KAAG,MAA2C,CAAC;AAG3F,eAAO,MAAM,cAAc,GAAU,UAAU,MAAM,kBAEpD,CAAC;AAGF,eAAO,MAAM,kBAAkB,cAAyB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import i18next from 'i18next';
2
+ import Backend from 'i18next-fs-backend';
3
+ import * as path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ // Detect system language
8
+ const detectLanguage = () => {
9
+ const lang = process.env.LANG || process.env.LANGUAGE || 'en';
10
+ // Extract language code (e.g., 'en_US.UTF-8' -> 'en')
11
+ const languageCode = lang.split('_')[0].split('-')[0];
12
+ // Support only 'en' and 'ja', fallback to 'en'
13
+ return ['en', 'ja'].includes(languageCode) ? languageCode : 'en';
14
+ };
15
+ // Initialize i18next
16
+ export const initI18n = async (language) => {
17
+ const detectedLang = language || detectLanguage();
18
+ await i18next
19
+ .use(Backend)
20
+ .init({
21
+ lng: detectedLang,
22
+ fallbackLng: 'en',
23
+ ns: ['translation'],
24
+ defaultNS: 'translation',
25
+ backend: {
26
+ loadPath: path.join(__dirname, '../../locales/{{lng}}.json'),
27
+ },
28
+ interpolation: {
29
+ escapeValue: false, // Not needed for console output
30
+ },
31
+ });
32
+ };
33
+ // Get translation function
34
+ export const t = (key, options) => i18next.t(key, options);
35
+ // Change language
36
+ export const changeLanguage = async (language) => {
37
+ await i18next.changeLanguage(language);
38
+ };
39
+ // Get current language
40
+ export const getCurrentLanguage = () => i18next.language;
41
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/utils/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,yBAAyB;AACzB,MAAM,cAAc,GAAG,GAAW,EAAE;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC;IAC9D,sDAAsD;IACtD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,+CAA+C;IAC/C,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC,CAAC;AAEF,qBAAqB;AACrB,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAiB,EAAE,EAAE;IAClD,MAAM,YAAY,GAAG,QAAQ,IAAI,cAAc,EAAE,CAAC;IAClD,MAAM,OAAO;SACV,GAAG,CAAC,OAAO,CAAC;SACZ,IAAI,CAAC;QACJ,GAAG,EAAE,YAAY;QACjB,WAAW,EAAE,IAAI;QACjB,EAAE,EAAE,CAAC,aAAa,CAAC;QACnB,SAAS,EAAE,aAAa;QACxB,OAAO,EAAE;YACP,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,4BAA4B,CAAC;SAC7D;QACD,aAAa,EAAE;YACb,WAAW,EAAE,KAAK,EAAE,gCAAgC;SACrD;KACF,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,2BAA2B;AAC3B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAW,EAAE,OAAa,EAAU,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAW,CAAC;AAE3F,kBAAkB;AAClB,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;IACvD,MAAM,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,uBAAuB;AACvB,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Logger utility for marhup
3
+ */
4
+ import winston from 'winston';
5
+ declare const logger: winston.Logger;
6
+ export default logger;
7
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAwB9B,QAAA,MAAM,MAAM,gBAyBV,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Logger utility for marhup
3
+ */
4
+ import winston from 'winston';
5
+ // Define log levels
6
+ const levels = {
7
+ error: 0,
8
+ warn: 1,
9
+ info: 2,
10
+ debug: 3,
11
+ trace: 4,
12
+ };
13
+ // Define colors for each level
14
+ const colors = {
15
+ error: 'red',
16
+ warn: 'yellow',
17
+ info: 'green',
18
+ debug: 'blue',
19
+ trace: 'gray',
20
+ };
21
+ // Add colors to winston
22
+ winston.addColors(colors);
23
+ // Create the logger
24
+ const logger = winston.createLogger({
25
+ level: process.env.LOG_LEVEL || 'info',
26
+ levels,
27
+ format: winston.format.combine(winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.errors({ stack: true }), winston.format.colorize({ all: true }), winston.format.printf(({ timestamp, level, message, ...meta }) => {
28
+ let metaStr = '';
29
+ if (Object.keys(meta).length > 0) {
30
+ metaStr = ` ${JSON.stringify(meta)}`;
31
+ }
32
+ return `${timestamp} [${level}]: ${message}${metaStr}`;
33
+ })),
34
+ transports: [
35
+ new winston.transports.Console({
36
+ format: winston.format.combine(winston.format.colorize(), winston.format.simple())
37
+ }),
38
+ // Optionally add file transport for production
39
+ ...(process.env.LOG_FILE ? [new winston.transports.File({ filename: process.env.LOG_FILE })] : [])
40
+ ],
41
+ });
42
+ export default logger;
43
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,oBAAoB;AACpB,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,+BAA+B;AAC/B,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;CACd,CAAC;AAEF,wBAAwB;AACxB,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAE1B,oBAAoB;AACpB,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;IACtC,MAAM;IACN,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAC5B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAC3D,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACtC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EACtC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;QAC/D,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,CAAC;QACD,OAAO,GAAG,SAAS,KAAK,KAAK,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;IACzD,CAAC,CAAC,CACH;IACD,UAAU,EAAE;QACV,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CACxB;SACF,CAAC;QACF,+CAA+C;QAC/C,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACnG;CACF,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Path validation utilities to prevent directory traversal attacks
3
+ */
4
+ /**
5
+ * Check if a resolved path is within the allowed directory
6
+ * @param resolvedPath - The absolute path to check
7
+ * @param allowedDir - The absolute path of the allowed directory
8
+ * @returns true if the path is safe (within allowedDir or subdirectories)
9
+ */
10
+ export declare function isPathWithinDirectory(resolvedPath: string, allowedDir: string): boolean;
11
+ /**
12
+ * Validate and resolve a file path, ensuring it's within the allowed directory
13
+ * @param inputPath - The input path (can be relative or absolute)
14
+ * @param allowedDir - The absolute path of the allowed directory
15
+ * @param basePath - Optional base path for relative resolution
16
+ * @returns The resolved absolute path if valid
17
+ * @throws Error if the path is outside the allowed directory
18
+ */
19
+ export declare function validateAndResolvePath(inputPath: string, allowedDir: string, basePath?: string): string;
20
+ //# sourceMappingURL=path-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-validation.d.ts","sourceRoot":"","sources":["../../src/utils/path-validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAQvF;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAcvG"}