marhup 0.1.8 → 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.
- package/README.md +419 -2
- package/dist/cli.js +659 -78
- package/dist/cli.js.map +1 -1
- package/dist/errors.d.ts +29 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +62 -0
- package/dist/errors.js.map +1 -0
- package/dist/generator/code.d.ts +4 -3
- package/dist/generator/code.d.ts.map +1 -1
- package/dist/generator/code.js +7 -7
- package/dist/generator/code.js.map +1 -1
- package/dist/generator/gen-animations.d.ts +13 -0
- package/dist/generator/gen-animations.d.ts.map +1 -0
- package/dist/generator/gen-animations.js +77 -0
- package/dist/generator/gen-animations.js.map +1 -0
- package/dist/generator/image.d.ts +4 -3
- package/dist/generator/image.d.ts.map +1 -1
- package/dist/generator/image.js +67 -80
- package/dist/generator/image.js.map +1 -1
- package/dist/generator/index.d.ts +2 -0
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +9 -18
- package/dist/generator/index.js.map +1 -1
- package/dist/generator/list.d.ts +4 -3
- package/dist/generator/list.d.ts.map +1 -1
- package/dist/generator/list.js +15 -17
- package/dist/generator/list.js.map +1 -1
- package/dist/generator/mermaid.d.ts +9 -4
- package/dist/generator/mermaid.d.ts.map +1 -1
- package/dist/generator/mermaid.js +120 -85
- package/dist/generator/mermaid.js.map +1 -1
- package/dist/generator/pptx.d.ts +1 -1
- package/dist/generator/pptx.d.ts.map +1 -1
- package/dist/generator/pptx.js +232 -60
- package/dist/generator/pptx.js.map +1 -1
- package/dist/generator/presentation.d.ts +149 -0
- package/dist/generator/presentation.d.ts.map +1 -0
- package/dist/generator/presentation.js +163 -0
- package/dist/generator/presentation.js.map +1 -0
- package/dist/generator/table.d.ts +4 -3
- package/dist/generator/table.d.ts.map +1 -1
- package/dist/generator/table.js +12 -33
- package/dist/generator/table.js.map +1 -1
- package/dist/generator/text.d.ts +5 -4
- package/dist/generator/text.d.ts.map +1 -1
- package/dist/generator/text.js +34 -20
- package/dist/generator/text.js.map +1 -1
- package/dist/generator/video.d.ts +18 -0
- package/dist/generator/video.d.ts.map +1 -0
- package/dist/generator/video.js +83 -0
- package/dist/generator/video.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +144 -55
- package/dist/index.js.map +1 -1
- package/dist/layout/auto.d.ts +14 -2
- package/dist/layout/auto.d.ts.map +1 -1
- package/dist/layout/auto.js +129 -37
- package/dist/layout/auto.js.map +1 -1
- package/dist/layout/engine.d.ts +1 -1
- package/dist/layout/engine.d.ts.map +1 -1
- package/dist/layout/engine.js +10 -12
- package/dist/layout/engine.js.map +1 -1
- package/dist/layout/index.d.ts +1 -1
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +2 -10
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/types.d.ts +1 -0
- package/dist/layout/types.d.ts.map +1 -1
- package/dist/layout/types.js +1 -2
- package/dist/layout/types.js.map +1 -1
- package/dist/mcp-handlers.d.ts.map +1 -1
- package/dist/mcp-handlers.js +15 -51
- package/dist/mcp-handlers.js.map +1 -1
- package/dist/mcp.js +10 -12
- package/dist/mcp.js.map +1 -1
- package/dist/parser/frontmatter.d.ts.map +1 -1
- package/dist/parser/frontmatter.js +95 -16
- package/dist/parser/frontmatter.js.map +1 -1
- package/dist/parser/grid.d.ts +5 -7
- package/dist/parser/grid.d.ts.map +1 -1
- package/dist/parser/grid.js +190 -19
- package/dist/parser/grid.js.map +1 -1
- package/dist/parser/index.js +3 -13
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/markdown.d.ts +1 -1
- package/dist/parser/markdown.d.ts.map +1 -1
- package/dist/parser/markdown.js +247 -137
- package/dist/parser/markdown.js.map +1 -1
- package/dist/theme/default.d.ts.map +1 -1
- package/dist/theme/default.js +13 -8
- package/dist/theme/default.js.map +1 -1
- package/dist/theme/index.d.ts +11 -0
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +70 -7
- package/dist/theme/index.js.map +1 -1
- package/dist/types/index.d.ts +54 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -6
- package/dist/types/index.js.map +1 -1
- package/dist/types/plugin.d.ts +50 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +5 -0
- package/dist/types/plugin.js.map +1 -0
- package/dist/utils/file-lock.d.ts +27 -0
- package/dist/utils/file-lock.d.ts.map +1 -0
- package/dist/utils/file-lock.js +118 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/i18n.d.ts +5 -0
- package/dist/utils/i18n.d.ts.map +1 -0
- package/dist/utils/i18n.js +41 -0
- package/dist/utils/i18n.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path-validation.d.ts +20 -0
- package/dist/utils/path-validation.d.ts.map +1 -0
- package/dist/utils/path-validation.js +39 -0
- package/dist/utils/path-validation.js.map +1 -0
- package/dist/utils/plugin-manager.d.ts +18 -0
- package/dist/utils/plugin-manager.d.ts.map +1 -0
- package/dist/utils/plugin-manager.js +108 -0
- package/dist/utils/plugin-manager.js.map +1 -0
- package/dist/utils/sanitizer.d.ts +14 -0
- package/dist/utils/sanitizer.d.ts.map +1 -0
- package/dist/utils/sanitizer.js +73 -0
- package/dist/utils/sanitizer.js.map +1 -0
- package/package.json +23 -8
package/dist/theme/index.js
CHANGED
|
@@ -1,11 +1,74 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* テーマモジュール
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
package/dist/theme/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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,25 +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>;
|
|
41
67
|
classes?: Record<string, Record<string, unknown>>;
|
|
42
68
|
aliases?: Record<string, string>;
|
|
69
|
+
animations?: AnimationConfig[];
|
|
70
|
+
transition?: SlideTransitionConfig;
|
|
43
71
|
[key: string]: unknown;
|
|
44
72
|
}
|
|
45
73
|
export interface Slide {
|
|
@@ -62,11 +90,13 @@ export interface ThemeConfig {
|
|
|
62
90
|
accent: string;
|
|
63
91
|
background: string;
|
|
64
92
|
text: string;
|
|
93
|
+
[key: string]: string;
|
|
65
94
|
};
|
|
66
95
|
fonts: {
|
|
67
96
|
title: string;
|
|
68
97
|
body: string;
|
|
69
98
|
code: string;
|
|
99
|
+
[key: string]: string;
|
|
70
100
|
};
|
|
71
101
|
fontSize: {
|
|
72
102
|
h1: number;
|
|
@@ -74,6 +104,17 @@ export interface ThemeConfig {
|
|
|
74
104
|
h3: number;
|
|
75
105
|
body: number;
|
|
76
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
|
+
};
|
|
77
118
|
};
|
|
78
119
|
}
|
|
79
120
|
export interface ConvertOptions {
|
|
@@ -82,6 +123,17 @@ export interface ConvertOptions {
|
|
|
82
123
|
grid?: string;
|
|
83
124
|
watch?: boolean;
|
|
84
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;
|
|
85
137
|
}
|
|
86
138
|
export declare const DEFAULT_GRID: GridConfig;
|
|
87
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":"AAAA;;GAEG;AAGH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.js
CHANGED
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* marhup 型定義
|
|
4
3
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
// デフォルトグリッド
|
|
8
|
-
exports.DEFAULT_GRID = {
|
|
4
|
+
// デフォルトグリッド(後方互換性のため)
|
|
5
|
+
export const DEFAULT_GRID = {
|
|
9
6
|
cols: 12,
|
|
10
7
|
rows: 9,
|
|
11
8
|
};
|
|
12
9
|
// デフォルト要素高さ(行数)
|
|
13
|
-
|
|
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,
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"
|
|
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 @@
|
|
|
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":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,WAAW,CAAC;AAE9B,MAAM,OAAO,QAAQ;IACX,YAAY,CAAS;IACrB,QAAQ,GAAG,KAAK,CAAC;IACjB,SAAS,GAAG,KAAK,CAAC,CAAC,YAAY;IAEvC,YAAY,QAAgB,EAAE,SAAkB;QAC9C,IAAI,CAAC,YAAY,GAAG,GAAG,QAAQ,OAAO,CAAC;QACvC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/C,IAAI,CAAC;gBACH,oBAAoB;gBACpB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;oBACrC,kBAAkB;oBAClB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;oBACnE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAClC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;wBACtB,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAEzC,oBAAoB;wBACpB,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;4BACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;4BACrB,OAAO,IAAI,CAAC;wBACd,CAAC;wBAED,qBAAqB;wBACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;wBACnC,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;4BACxB,eAAe;4BACf,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;wBACnC,CAAC;6BAAM,CAAC;4BACN,UAAU;4BACV,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU;4BACjC,SAAS;wBACX,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,gBAAgB;wBAChB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC;gBAED,+BAA+B;gBAC/B,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;gBACxG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAK,KAAa,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACrC,oBAAoB;oBACpB,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;oBACtB,SAAS;gBACX,CAAC;gBACD,UAAU;gBACV,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,SAAS;QACT,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC;gBACH,yBAAyB;gBACzB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBACnE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;oBAChE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,SAA2B;IAE3B,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,WAAW,CACnB,CAAC,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EACzC,aAAa,EACb,CAAC,CAAC,qCAAqC,CAAC,EACxC,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -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 @@
|
|
|
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"}
|