create-nexo 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/dist/api/index.d.ts +196 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +390 -0
- package/dist/api/index.js.map +1 -0
- package/dist/bin/nexo.d.ts +3 -0
- package/dist/bin/nexo.d.ts.map +1 -0
- package/dist/bin/nexo.js +427 -0
- package/dist/bin/nexo.js.map +1 -0
- package/dist/configurators/core/framework.d.ts +3 -0
- package/dist/configurators/core/framework.d.ts.map +1 -0
- package/dist/configurators/core/framework.js +56 -0
- package/dist/configurators/core/framework.js.map +1 -0
- package/dist/configurators/core/index.d.ts +4 -0
- package/dist/configurators/core/index.d.ts.map +1 -0
- package/dist/configurators/core/index.js +4 -0
- package/dist/configurators/core/index.js.map +1 -0
- package/dist/configurators/core/language.d.ts +3 -0
- package/dist/configurators/core/language.d.ts.map +1 -0
- package/dist/configurators/core/language.js +59 -0
- package/dist/configurators/core/language.js.map +1 -0
- package/dist/configurators/core/variant.d.ts +3 -0
- package/dist/configurators/core/variant.d.ts.map +1 -0
- package/dist/configurators/core/variant.js +22 -0
- package/dist/configurators/core/variant.js.map +1 -0
- package/dist/configurators/index.d.ts +5 -0
- package/dist/configurators/index.d.ts.map +1 -0
- package/dist/configurators/index.js +6 -0
- package/dist/configurators/index.js.map +1 -0
- package/dist/configurators/project/auth.d.ts +3 -0
- package/dist/configurators/project/auth.d.ts.map +1 -0
- package/dist/configurators/project/auth.js +82 -0
- package/dist/configurators/project/auth.js.map +1 -0
- package/dist/configurators/project/cicd.d.ts +30 -0
- package/dist/configurators/project/cicd.d.ts.map +1 -0
- package/dist/configurators/project/cicd.js +289 -0
- package/dist/configurators/project/cicd.js.map +1 -0
- package/dist/configurators/project/i18n.d.ts +3 -0
- package/dist/configurators/project/i18n.d.ts.map +1 -0
- package/dist/configurators/project/i18n.js +67 -0
- package/dist/configurators/project/i18n.js.map +1 -0
- package/dist/configurators/project/index.d.ts +6 -0
- package/dist/configurators/project/index.d.ts.map +1 -0
- package/dist/configurators/project/index.js +6 -0
- package/dist/configurators/project/index.js.map +1 -0
- package/dist/configurators/project/mandatory.d.ts +3 -0
- package/dist/configurators/project/mandatory.d.ts.map +1 -0
- package/dist/configurators/project/mandatory.js +167 -0
- package/dist/configurators/project/mandatory.js.map +1 -0
- package/dist/configurators/project/structure.d.ts +3 -0
- package/dist/configurators/project/structure.d.ts.map +1 -0
- package/dist/configurators/project/structure.js +34 -0
- package/dist/configurators/project/structure.js.map +1 -0
- package/dist/configurators/state/dataFetching.d.ts +3 -0
- package/dist/configurators/state/dataFetching.d.ts.map +1 -0
- package/dist/configurators/state/dataFetching.js +23 -0
- package/dist/configurators/state/dataFetching.js.map +1 -0
- package/dist/configurators/state/forms.d.ts +3 -0
- package/dist/configurators/state/forms.d.ts.map +1 -0
- package/dist/configurators/state/forms.js +35 -0
- package/dist/configurators/state/forms.js.map +1 -0
- package/dist/configurators/state/index.d.ts +5 -0
- package/dist/configurators/state/index.d.ts.map +1 -0
- package/dist/configurators/state/index.js +5 -0
- package/dist/configurators/state/index.js.map +1 -0
- package/dist/configurators/state/routing.d.ts +3 -0
- package/dist/configurators/state/routing.d.ts.map +1 -0
- package/dist/configurators/state/routing.js +23 -0
- package/dist/configurators/state/routing.js.map +1 -0
- package/dist/configurators/state/state.d.ts +3 -0
- package/dist/configurators/state/state.d.ts.map +1 -0
- package/dist/configurators/state/state.js +91 -0
- package/dist/configurators/state/state.js.map +1 -0
- package/dist/configurators/styling/icons.d.ts +3 -0
- package/dist/configurators/styling/icons.d.ts.map +1 -0
- package/dist/configurators/styling/icons.js +27 -0
- package/dist/configurators/styling/icons.js.map +1 -0
- package/dist/configurators/styling/index.d.ts +4 -0
- package/dist/configurators/styling/index.d.ts.map +1 -0
- package/dist/configurators/styling/index.js +4 -0
- package/dist/configurators/styling/index.js.map +1 -0
- package/dist/configurators/styling/styling.d.ts +3 -0
- package/dist/configurators/styling/styling.d.ts.map +1 -0
- package/dist/configurators/styling/styling.js +62 -0
- package/dist/configurators/styling/styling.js.map +1 -0
- package/dist/configurators/styling/ui.d.ts +3 -0
- package/dist/configurators/styling/ui.d.ts.map +1 -0
- package/dist/configurators/styling/ui.js +188 -0
- package/dist/configurators/styling/ui.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lazy-loader.d.ts +57 -0
- package/dist/core/lazy-loader.d.ts.map +1 -0
- package/dist/core/lazy-loader.js +231 -0
- package/dist/core/lazy-loader.js.map +1 -0
- package/dist/core/parallel.d.ts +29 -0
- package/dist/core/parallel.d.ts.map +1 -0
- package/dist/core/parallel.js +127 -0
- package/dist/core/parallel.js.map +1 -0
- package/dist/core/presets.d.ts +10 -0
- package/dist/core/presets.d.ts.map +1 -0
- package/dist/core/presets.js +73 -0
- package/dist/core/presets.js.map +1 -0
- package/dist/core/prompts/core.d.ts +18 -0
- package/dist/core/prompts/core.d.ts.map +1 -0
- package/dist/core/prompts/core.js +420 -0
- package/dist/core/prompts/core.js.map +1 -0
- package/dist/core/prompts/filter.d.ts +34 -0
- package/dist/core/prompts/filter.d.ts.map +1 -0
- package/dist/core/prompts/filter.js +48 -0
- package/dist/core/prompts/filter.js.map +1 -0
- package/dist/core/prompts/index.d.ts +10 -0
- package/dist/core/prompts/index.d.ts.map +1 -0
- package/dist/core/prompts/index.js +16 -0
- package/dist/core/prompts/index.js.map +1 -0
- package/dist/core/prompts/optional.d.ts +15 -0
- package/dist/core/prompts/optional.d.ts.map +1 -0
- package/dist/core/prompts/optional.js +228 -0
- package/dist/core/prompts/optional.js.map +1 -0
- package/dist/core/prompts/utils.d.ts +37 -0
- package/dist/core/prompts/utils.d.ts.map +1 -0
- package/dist/core/prompts/utils.js +72 -0
- package/dist/core/prompts/utils.js.map +1 -0
- package/dist/core/prompts.d.ts +6 -0
- package/dist/core/prompts.d.ts.map +1 -0
- package/dist/core/prompts.js +6 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/setup.d.ts +28 -0
- package/dist/core/setup.d.ts.map +1 -0
- package/dist/core/setup.js +96 -0
- package/dist/core/setup.js.map +1 -0
- package/dist/core/wizard.d.ts +39 -0
- package/dist/core/wizard.d.ts.map +1 -0
- package/dist/core/wizard.js +259 -0
- package/dist/core/wizard.js.map +1 -0
- package/dist/errors/index.d.ts +67 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +253 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/messages.d.ts +56 -0
- package/dist/errors/messages.d.ts.map +1 -0
- package/dist/errors/messages.js +234 -0
- package/dist/errors/messages.js.map +1 -0
- package/dist/generators/index.d.ts +86 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +441 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/index.d.ts +48 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +49 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +38 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +229 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/manager.d.ts +32 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +220 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/types.d.ts +186 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +5 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/security/index.d.ts +59 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +230 -0
- package/dist/security/index.js.map +1 -0
- package/dist/templates/entry.d.ts +9 -0
- package/dist/templates/entry.d.ts.map +1 -0
- package/dist/templates/entry.js +24 -0
- package/dist/templates/entry.js.map +1 -0
- package/dist/templates/index.d.ts +7 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +10 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/main.d.ts +6 -0
- package/dist/templates/main.d.ts.map +1 -0
- package/dist/templates/main.js +72 -0
- package/dist/templates/main.js.map +1 -0
- package/dist/templates/readme.d.ts +3 -0
- package/dist/templates/readme.d.ts.map +1 -0
- package/dist/templates/readme.js +127 -0
- package/dist/templates/readme.js.map +1 -0
- package/dist/templates/styles.d.ts +6 -0
- package/dist/templates/styles.d.ts.map +1 -0
- package/dist/templates/styles.js +212 -0
- package/dist/templates/styles.js.map +1 -0
- package/dist/templates/welcome.d.ts +10 -0
- package/dist/templates/welcome.d.ts.map +1 -0
- package/dist/templates/welcome.js +322 -0
- package/dist/templates/welcome.js.map +1 -0
- package/dist/types/index.d.ts +46 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/batch-writer.d.ts +101 -0
- package/dist/utils/batch-writer.d.ts.map +1 -0
- package/dist/utils/batch-writer.js +232 -0
- package/dist/utils/batch-writer.js.map +1 -0
- package/dist/utils/cache.d.ts +60 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +119 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/fileTree.d.ts +3 -0
- package/dist/utils/fileTree.d.ts.map +1 -0
- package/dist/utils/fileTree.js +71 -0
- package/dist/utils/fileTree.js.map +1 -0
- package/dist/utils/fs.d.ts +22 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +75 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/helpers.d.ts +91 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +192 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/progress.d.ts +85 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +142 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/spinner.d.ts +9 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +56 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/validation/index.d.ts +63 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +262 -0
- package/dist/validation/index.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXO Plugin System - Type Definitions
|
|
3
|
+
*/
|
|
4
|
+
import type { ConfiguratorContext, PromptConfig, PromptOption, UserSelections } from '../types/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Hook called before project setup begins
|
|
7
|
+
*/
|
|
8
|
+
export type BeforeSetupHook = (ctx: ConfiguratorContext) => Promise<void> | void;
|
|
9
|
+
/**
|
|
10
|
+
* Hook called after project setup completes
|
|
11
|
+
*/
|
|
12
|
+
export type AfterSetupHook = (ctx: ConfiguratorContext) => Promise<void> | void;
|
|
13
|
+
/**
|
|
14
|
+
* Hook called before each configurator runs
|
|
15
|
+
*/
|
|
16
|
+
export type BeforeConfiguratorHook = (ctx: ConfiguratorContext, configuratorName: string) => Promise<void> | void;
|
|
17
|
+
/**
|
|
18
|
+
* Hook called after each configurator completes
|
|
19
|
+
*/
|
|
20
|
+
export type AfterConfiguratorHook = (ctx: ConfiguratorContext, configuratorName: string) => Promise<void> | void;
|
|
21
|
+
/**
|
|
22
|
+
* Hook to modify selections before they are used
|
|
23
|
+
*/
|
|
24
|
+
export type ModifySelectionsHook = (selections: UserSelections) => UserSelections | Promise<UserSelections>;
|
|
25
|
+
/**
|
|
26
|
+
* Custom configurator function
|
|
27
|
+
*/
|
|
28
|
+
export type PluginConfigurator = (ctx: ConfiguratorContext) => Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Plugin prompt configuration
|
|
31
|
+
*/
|
|
32
|
+
export interface PluginPrompt {
|
|
33
|
+
/** Prompt configuration */
|
|
34
|
+
config: PromptConfig;
|
|
35
|
+
/** When to show this prompt (after which prompt) */
|
|
36
|
+
after?: string;
|
|
37
|
+
/** Condition to show the prompt */
|
|
38
|
+
condition?: (selections: Partial<UserSelections>) => boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Plugin option extension
|
|
42
|
+
*/
|
|
43
|
+
export interface PluginOptionExtension {
|
|
44
|
+
/** Prompt name to extend */
|
|
45
|
+
promptName: string;
|
|
46
|
+
/** Options to add */
|
|
47
|
+
options: PromptOption[];
|
|
48
|
+
/** Whether to replace existing options */
|
|
49
|
+
replace?: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* NEXO Plugin interface
|
|
53
|
+
*/
|
|
54
|
+
export interface NexoPlugin {
|
|
55
|
+
/** Plugin name (should be unique) */
|
|
56
|
+
name: string;
|
|
57
|
+
/** Plugin version (semver) */
|
|
58
|
+
version: string;
|
|
59
|
+
/** Plugin description */
|
|
60
|
+
description?: string;
|
|
61
|
+
/** Plugin author */
|
|
62
|
+
author?: string;
|
|
63
|
+
/** Plugin homepage/repository */
|
|
64
|
+
homepage?: string;
|
|
65
|
+
/**
|
|
66
|
+
* Called before project setup begins
|
|
67
|
+
*/
|
|
68
|
+
beforeSetup?: BeforeSetupHook;
|
|
69
|
+
/**
|
|
70
|
+
* Called after project setup completes
|
|
71
|
+
*/
|
|
72
|
+
afterSetup?: AfterSetupHook;
|
|
73
|
+
/**
|
|
74
|
+
* Called before each configurator runs
|
|
75
|
+
*/
|
|
76
|
+
beforeConfigurator?: BeforeConfiguratorHook;
|
|
77
|
+
/**
|
|
78
|
+
* Called after each configurator completes
|
|
79
|
+
*/
|
|
80
|
+
afterConfigurator?: AfterConfiguratorHook;
|
|
81
|
+
/**
|
|
82
|
+
* Modify selections before they are used
|
|
83
|
+
*/
|
|
84
|
+
modifySelections?: ModifySelectionsHook;
|
|
85
|
+
/**
|
|
86
|
+
* Custom prompts to add
|
|
87
|
+
*/
|
|
88
|
+
prompts?: PluginPrompt[];
|
|
89
|
+
/**
|
|
90
|
+
* Custom configurators to run
|
|
91
|
+
*/
|
|
92
|
+
configurators?: Record<string, PluginConfigurator>;
|
|
93
|
+
/**
|
|
94
|
+
* Extend existing prompt options
|
|
95
|
+
*/
|
|
96
|
+
extendOptions?: PluginOptionExtension[];
|
|
97
|
+
/**
|
|
98
|
+
* Dependencies required by this plugin
|
|
99
|
+
*/
|
|
100
|
+
dependencies?: Record<string, string>;
|
|
101
|
+
/**
|
|
102
|
+
* Dev dependencies required by this plugin
|
|
103
|
+
*/
|
|
104
|
+
devDependencies?: Record<string, string>;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Plugin load result
|
|
108
|
+
*/
|
|
109
|
+
export interface PluginLoadResult {
|
|
110
|
+
success: boolean;
|
|
111
|
+
plugin?: NexoPlugin;
|
|
112
|
+
error?: string;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Plugin registry
|
|
116
|
+
*/
|
|
117
|
+
export interface PluginRegistry {
|
|
118
|
+
plugins: Map<string, NexoPlugin>;
|
|
119
|
+
hooks: {
|
|
120
|
+
beforeSetup: BeforeSetupHook[];
|
|
121
|
+
afterSetup: AfterSetupHook[];
|
|
122
|
+
beforeConfigurator: BeforeConfiguratorHook[];
|
|
123
|
+
afterConfigurator: AfterConfiguratorHook[];
|
|
124
|
+
modifySelections: ModifySelectionsHook[];
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Plugin configuration file (.nexorc.json)
|
|
129
|
+
*/
|
|
130
|
+
export interface NexoConfig {
|
|
131
|
+
/** Plugins to load */
|
|
132
|
+
plugins?: string[];
|
|
133
|
+
/** Default selections */
|
|
134
|
+
defaults?: Partial<UserSelections>;
|
|
135
|
+
/** Custom configurator paths */
|
|
136
|
+
customConfigurators?: Array<{
|
|
137
|
+
name: string;
|
|
138
|
+
path: string;
|
|
139
|
+
after?: string;
|
|
140
|
+
}>;
|
|
141
|
+
/** Extends another config */
|
|
142
|
+
extends?: string;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Extended context available to plugins
|
|
146
|
+
*/
|
|
147
|
+
export interface PluginContext extends ConfiguratorContext {
|
|
148
|
+
/** Plugin manager instance */
|
|
149
|
+
pluginManager: PluginManager;
|
|
150
|
+
/** Add a dependency */
|
|
151
|
+
addDependency: (name: string, version: string) => void;
|
|
152
|
+
/** Add a dev dependency */
|
|
153
|
+
addDevDependency: (name: string, version: string) => void;
|
|
154
|
+
/** Register a file to be created */
|
|
155
|
+
addFile: (path: string, content: string) => void;
|
|
156
|
+
/** Log a message */
|
|
157
|
+
log: (message: string) => void;
|
|
158
|
+
/** Log a warning */
|
|
159
|
+
warn: (message: string) => void;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Plugin manager interface
|
|
163
|
+
*/
|
|
164
|
+
export interface PluginManager {
|
|
165
|
+
/** Load a plugin */
|
|
166
|
+
load: (source: string) => Promise<PluginLoadResult>;
|
|
167
|
+
/** Register a plugin */
|
|
168
|
+
register: (plugin: NexoPlugin) => void;
|
|
169
|
+
/** Unregister a plugin */
|
|
170
|
+
unregister: (name: string) => void;
|
|
171
|
+
/** Get all registered plugins */
|
|
172
|
+
getPlugins: () => NexoPlugin[];
|
|
173
|
+
/** Get a plugin by name */
|
|
174
|
+
getPlugin: (name: string) => NexoPlugin | undefined;
|
|
175
|
+
/** Execute beforeSetup hooks */
|
|
176
|
+
executeBeforeSetup: (ctx: ConfiguratorContext) => Promise<void>;
|
|
177
|
+
/** Execute afterSetup hooks */
|
|
178
|
+
executeAfterSetup: (ctx: ConfiguratorContext) => Promise<void>;
|
|
179
|
+
/** Execute beforeConfigurator hooks */
|
|
180
|
+
executeBeforeConfigurator: (ctx: ConfiguratorContext, name: string) => Promise<void>;
|
|
181
|
+
/** Execute afterConfigurator hooks */
|
|
182
|
+
executeAfterConfigurator: (ctx: ConfiguratorContext, name: string) => Promise<void>;
|
|
183
|
+
/** Apply selection modifiers */
|
|
184
|
+
applyModifySelections: (selections: UserSelections) => Promise<UserSelections>;
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export { SecurityError } from '../errors/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Sanitize file path to prevent directory traversal
|
|
4
|
+
*/
|
|
5
|
+
export declare const sanitizePath: (inputPath: string) => string;
|
|
6
|
+
/**
|
|
7
|
+
* Sanitize string for use in generated code
|
|
8
|
+
*/
|
|
9
|
+
export declare const sanitizeForCode: (input: string) => string;
|
|
10
|
+
/**
|
|
11
|
+
* Validate that a path is safe to write to
|
|
12
|
+
*/
|
|
13
|
+
export declare const validateTargetPath: (targetPath: string, basePath?: string) => void;
|
|
14
|
+
/**
|
|
15
|
+
* Check if path is within allowed boundaries
|
|
16
|
+
*/
|
|
17
|
+
export declare const isPathSafe: (targetPath: string, basePath?: string) => boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Validate package name for npm
|
|
20
|
+
*/
|
|
21
|
+
export declare const validatePackageName: (name: string) => boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Validate dependency entry
|
|
24
|
+
*/
|
|
25
|
+
export declare const validateDependency: (name: string, version: string) => void;
|
|
26
|
+
/**
|
|
27
|
+
* Scan content for potentially dangerous patterns
|
|
28
|
+
*/
|
|
29
|
+
export declare const scanContent: (content: string) => {
|
|
30
|
+
safe: boolean;
|
|
31
|
+
warnings: string[];
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Validate file content before writing
|
|
35
|
+
*/
|
|
36
|
+
export declare const validateFileContent: (content: string, options?: {
|
|
37
|
+
strict?: boolean;
|
|
38
|
+
}) => void;
|
|
39
|
+
/**
|
|
40
|
+
* Check if running in a safe environment
|
|
41
|
+
*/
|
|
42
|
+
export declare const validateEnvironment: () => {
|
|
43
|
+
safe: boolean;
|
|
44
|
+
warnings: string[];
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Safely join paths, preventing directory traversal
|
|
48
|
+
*/
|
|
49
|
+
export declare const safeJoin: (basePath: string, ...segments: string[]) => string;
|
|
50
|
+
/**
|
|
51
|
+
* Create a safe context for file operations
|
|
52
|
+
*/
|
|
53
|
+
export declare const createSafeContext: (basePath: string) => {
|
|
54
|
+
basePath: string;
|
|
55
|
+
join: (...segments: string[]) => string;
|
|
56
|
+
validate: (targetPath: string) => void;
|
|
57
|
+
isWithinBase: (targetPath: string) => boolean;
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQnD;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,WAAW,MAAM,KAAG,MAMhD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,KAAG,MAK/C,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,YAAY,MAAM,EAAE,WAAW,MAAM,KAAG,IAoD1E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,YAAY,MAAM,EAAE,WAAW,MAAM,KAAG,OAOlE,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,OAoBlD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,IAiBlE,CAAC;AAsBF;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,KAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAahF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,SAAS,MAAM,EACf,UAAS;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,KACjC,IAeF,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAO;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAoBzE,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,UAAU,MAAM,EAAE,GAAG,UAAU,MAAM,EAAE,KAAG,MAgBlE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM;;wBAM1B,MAAM,EAAE;2BAEL,MAAM;+BAIF,MAAM;CAKpC,CAAC"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import pc from 'picocolors';
|
|
3
|
+
import { SecurityError } from '../errors/index.js';
|
|
4
|
+
// Re-export SecurityError for convenience
|
|
5
|
+
export { SecurityError } from '../errors/index.js';
|
|
6
|
+
// ============================================
|
|
7
|
+
// Input Sanitization
|
|
8
|
+
// ============================================
|
|
9
|
+
// Note: sanitizeProjectName is in validation/index.ts
|
|
10
|
+
/**
|
|
11
|
+
* Sanitize file path to prevent directory traversal
|
|
12
|
+
*/
|
|
13
|
+
export const sanitizePath = (inputPath) => {
|
|
14
|
+
return inputPath
|
|
15
|
+
.replace(/\.\./g, '')
|
|
16
|
+
.replace(/\/+/g, '/')
|
|
17
|
+
.replace(/\\+/g, '/')
|
|
18
|
+
.replace(/^\//, '');
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Sanitize string for use in generated code
|
|
22
|
+
*/
|
|
23
|
+
export const sanitizeForCode = (input) => {
|
|
24
|
+
return input
|
|
25
|
+
.replace(/[<>]/g, '')
|
|
26
|
+
.replace(/[`${}]/g, '')
|
|
27
|
+
.replace(/['"\\/]/g, (char) => `\\${char}`);
|
|
28
|
+
};
|
|
29
|
+
// ============================================
|
|
30
|
+
// Path Validation
|
|
31
|
+
// ============================================
|
|
32
|
+
/**
|
|
33
|
+
* Validate that a path is safe to write to
|
|
34
|
+
*/
|
|
35
|
+
export const validateTargetPath = (targetPath, basePath) => {
|
|
36
|
+
const resolved = path.resolve(targetPath);
|
|
37
|
+
const base = basePath ? path.resolve(basePath) : process.cwd();
|
|
38
|
+
// Check for directory traversal
|
|
39
|
+
if (!resolved.startsWith(base)) {
|
|
40
|
+
throw new SecurityError('Cannot write outside the base directory', { targetPath, basePath: base, resolvedPath: resolved });
|
|
41
|
+
}
|
|
42
|
+
// Check for system directories (cross-platform)
|
|
43
|
+
const forbiddenPaths = [
|
|
44
|
+
// Unix
|
|
45
|
+
'/etc',
|
|
46
|
+
'/usr',
|
|
47
|
+
'/bin',
|
|
48
|
+
'/sbin',
|
|
49
|
+
'/var',
|
|
50
|
+
'/root',
|
|
51
|
+
'/home',
|
|
52
|
+
// Windows
|
|
53
|
+
'C:\\Windows',
|
|
54
|
+
'C:\\Program Files',
|
|
55
|
+
'C:\\Program Files (x86)',
|
|
56
|
+
'C:\\ProgramData',
|
|
57
|
+
'C:\\Users\\Default',
|
|
58
|
+
];
|
|
59
|
+
const normalizedResolved = resolved.replace(/\\/g, '/').toLowerCase();
|
|
60
|
+
for (const forbidden of forbiddenPaths) {
|
|
61
|
+
const normalizedForbidden = forbidden.replace(/\\/g, '/').toLowerCase();
|
|
62
|
+
if (normalizedResolved.startsWith(normalizedForbidden)) {
|
|
63
|
+
throw new SecurityError('Cannot write to system directories', { targetPath: resolved, forbiddenPath: forbidden });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Check for hidden directories (starting with .)
|
|
67
|
+
const pathParts = resolved.split(path.sep);
|
|
68
|
+
const hasHiddenParent = pathParts.some((part, index) => index > 0 && part.startsWith('.') && part !== '.' && part !== '..');
|
|
69
|
+
if (hasHiddenParent) {
|
|
70
|
+
// Just warn, don't block
|
|
71
|
+
console.warn(pc.yellow('Warning: Writing to a hidden directory'));
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Check if path is within allowed boundaries
|
|
76
|
+
*/
|
|
77
|
+
export const isPathSafe = (targetPath, basePath) => {
|
|
78
|
+
try {
|
|
79
|
+
validateTargetPath(targetPath, basePath);
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
// ============================================
|
|
87
|
+
// Dependency Validation
|
|
88
|
+
// ============================================
|
|
89
|
+
/**
|
|
90
|
+
* Validate package name for npm
|
|
91
|
+
*/
|
|
92
|
+
export const validatePackageName = (name) => {
|
|
93
|
+
// npm package naming rules
|
|
94
|
+
const validNameRegex = /^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/;
|
|
95
|
+
if (!validNameRegex.test(name)) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
// Check for suspicious patterns
|
|
99
|
+
const suspicious = [
|
|
100
|
+
'eval',
|
|
101
|
+
'exec',
|
|
102
|
+
'spawn',
|
|
103
|
+
'child_process',
|
|
104
|
+
'require(',
|
|
105
|
+
'import(',
|
|
106
|
+
];
|
|
107
|
+
const lowerName = name.toLowerCase();
|
|
108
|
+
return !suspicious.some((s) => lowerName.includes(s));
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Validate dependency entry
|
|
112
|
+
*/
|
|
113
|
+
export const validateDependency = (name, version) => {
|
|
114
|
+
if (!validatePackageName(name)) {
|
|
115
|
+
throw new SecurityError(`Invalid or suspicious package name: ${name}`, { packageName: name });
|
|
116
|
+
}
|
|
117
|
+
// Validate version format (semver-like)
|
|
118
|
+
const validVersionRegex = /^[\^~]?\d+(\.\d+)*(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$|^latest$|^next$|^\*$/;
|
|
119
|
+
if (!validVersionRegex.test(version)) {
|
|
120
|
+
throw new SecurityError(`Invalid version format: ${version}`, { packageName: name, version });
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
// ============================================
|
|
124
|
+
// Content Validation
|
|
125
|
+
// ============================================
|
|
126
|
+
/**
|
|
127
|
+
* Patterns that might indicate dangerous code
|
|
128
|
+
*/
|
|
129
|
+
const DANGEROUS_PATTERNS = [
|
|
130
|
+
{ pattern: /eval\s*\(/g, name: 'eval()' },
|
|
131
|
+
{ pattern: /new\s+Function\s*\(/g, name: 'new Function()' },
|
|
132
|
+
{ pattern: /child_process/g, name: 'child_process' },
|
|
133
|
+
{ pattern: /\.exec\s*\(/g, name: '.exec()' },
|
|
134
|
+
{ pattern: /\.spawn\s*\(/g, name: '.spawn()' },
|
|
135
|
+
{ pattern: /fs\.(rm|rmdir|unlink)\s*\(/g, name: 'fs.rm/rmdir/unlink' },
|
|
136
|
+
{ pattern: /process\.exit\s*\(/g, name: 'process.exit()' },
|
|
137
|
+
{ pattern: /require\s*\(\s*['"`]child_process/g, name: 'require child_process' },
|
|
138
|
+
{ pattern: /__proto__/g, name: '__proto__' },
|
|
139
|
+
{ pattern: /constructor\s*\[\s*['"`]prototype/g, name: 'prototype pollution' },
|
|
140
|
+
];
|
|
141
|
+
/**
|
|
142
|
+
* Scan content for potentially dangerous patterns
|
|
143
|
+
*/
|
|
144
|
+
export const scanContent = (content) => {
|
|
145
|
+
const warnings = [];
|
|
146
|
+
for (const { pattern, name } of DANGEROUS_PATTERNS) {
|
|
147
|
+
if (pattern.test(content)) {
|
|
148
|
+
warnings.push(`Potentially dangerous pattern detected: ${name}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
safe: warnings.length === 0,
|
|
153
|
+
warnings,
|
|
154
|
+
};
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* Validate file content before writing
|
|
158
|
+
*/
|
|
159
|
+
export const validateFileContent = (content, options = {}) => {
|
|
160
|
+
const { safe, warnings } = scanContent(content);
|
|
161
|
+
if (!safe) {
|
|
162
|
+
if (options.strict) {
|
|
163
|
+
throw new SecurityError('Dangerous code patterns detected in file content', { warnings });
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
warnings.forEach((w) => {
|
|
167
|
+
console.warn(pc.yellow(`⚠ ${w}`));
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
// ============================================
|
|
173
|
+
// Environment Validation
|
|
174
|
+
// ============================================
|
|
175
|
+
/**
|
|
176
|
+
* Check if running in a safe environment
|
|
177
|
+
*/
|
|
178
|
+
export const validateEnvironment = () => {
|
|
179
|
+
const warnings = [];
|
|
180
|
+
// Check for root/admin (Unix)
|
|
181
|
+
if (process.getuid && process.getuid() === 0) {
|
|
182
|
+
warnings.push('Running as root is not recommended');
|
|
183
|
+
}
|
|
184
|
+
// Check for suspicious environment variables
|
|
185
|
+
const suspiciousEnvVars = ['LD_PRELOAD', 'LD_LIBRARY_PATH', 'NODE_OPTIONS'];
|
|
186
|
+
for (const envVar of suspiciousEnvVars) {
|
|
187
|
+
if (process.env[envVar]) {
|
|
188
|
+
warnings.push(`Suspicious environment variable set: ${envVar}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
safe: warnings.length === 0,
|
|
193
|
+
warnings,
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
// ============================================
|
|
197
|
+
// Safe Wrappers
|
|
198
|
+
// ============================================
|
|
199
|
+
/**
|
|
200
|
+
* Safely join paths, preventing directory traversal
|
|
201
|
+
*/
|
|
202
|
+
export const safeJoin = (basePath, ...segments) => {
|
|
203
|
+
const sanitizedSegments = segments.map(sanitizePath);
|
|
204
|
+
const result = path.join(basePath, ...sanitizedSegments);
|
|
205
|
+
// Ensure result is within base path
|
|
206
|
+
const resolvedBase = path.resolve(basePath);
|
|
207
|
+
const resolvedResult = path.resolve(result);
|
|
208
|
+
if (!resolvedResult.startsWith(resolvedBase)) {
|
|
209
|
+
throw new SecurityError('Path traversal detected', { basePath, segments, result });
|
|
210
|
+
}
|
|
211
|
+
return result;
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* Create a safe context for file operations
|
|
215
|
+
*/
|
|
216
|
+
export const createSafeContext = (basePath) => {
|
|
217
|
+
const resolvedBase = path.resolve(basePath);
|
|
218
|
+
return {
|
|
219
|
+
basePath: resolvedBase,
|
|
220
|
+
join: (...segments) => safeJoin(resolvedBase, ...segments),
|
|
221
|
+
validate: (targetPath) => {
|
|
222
|
+
validateTargetPath(targetPath, resolvedBase);
|
|
223
|
+
},
|
|
224
|
+
isWithinBase: (targetPath) => {
|
|
225
|
+
const resolved = path.resolve(targetPath);
|
|
226
|
+
return resolved.startsWith(resolvedBase);
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
};
|
|
230
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ConfiguratorContext } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create all entry files (main.tsx, App.tsx, vite-env.d.ts)
|
|
4
|
+
*/
|
|
5
|
+
export declare const createEntryFiles: (ctx: ConfiguratorContext) => Promise<void>;
|
|
6
|
+
export { createMainFile } from './main.js';
|
|
7
|
+
export { createAppCss } from './styles.js';
|
|
8
|
+
export { createAppFile, createWelcomePage } from './welcome.js';
|
|
9
|
+
//# sourceMappingURL=entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/templates/entry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAK7D;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAU,KAAK,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAS7E,CAAC;AAGF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entry files generator - Coordinates main.tsx and App.tsx creation
|
|
3
|
+
*/
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { ensureDir } from '../utils/index.js';
|
|
6
|
+
import { createMainFile } from './main.js';
|
|
7
|
+
import { createAppFile } from './welcome.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create all entry files (main.tsx, App.tsx, vite-env.d.ts)
|
|
10
|
+
*/
|
|
11
|
+
export const createEntryFiles = async (ctx) => {
|
|
12
|
+
const { variant } = ctx.selections;
|
|
13
|
+
const isTypeScript = variant.startsWith('ts');
|
|
14
|
+
const ext = isTypeScript ? 'tsx' : 'jsx';
|
|
15
|
+
const srcDir = path.join(ctx.projectPath, 'src');
|
|
16
|
+
await ensureDir(srcDir);
|
|
17
|
+
await createMainFile(ctx, ext);
|
|
18
|
+
await createAppFile(ctx, ext);
|
|
19
|
+
};
|
|
20
|
+
// Re-export for backward compatibility
|
|
21
|
+
export { createMainFile } from './main.js';
|
|
22
|
+
export { createAppCss } from './styles.js';
|
|
23
|
+
export { createAppFile, createWelcomePage } from './welcome.js';
|
|
24
|
+
//# sourceMappingURL=entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/templates/entry.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,GAAwB,EAAiB,EAAE;IAChF,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;IACnC,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEjD,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/B,MAAM,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF,uCAAuC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Templates module - File generators
|
|
3
|
+
*/
|
|
4
|
+
export { createAppCss, createEntryFiles, createMainFile, createWelcomePage } from './entry.js';
|
|
5
|
+
export { createAppCss as createStyles } from './styles.js';
|
|
6
|
+
export { createReadme } from './readme.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/F,OAAO,EAAE,YAAY,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Templates module - File generators
|
|
3
|
+
*/
|
|
4
|
+
// Entry files
|
|
5
|
+
export { createAppCss, createEntryFiles, createMainFile, createWelcomePage } from './entry.js';
|
|
6
|
+
// Styles (alias for backward compatibility)
|
|
7
|
+
export { createAppCss as createStyles } from './styles.js';
|
|
8
|
+
// README
|
|
9
|
+
export { createReadme } from './readme.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc;AACd,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/F,4CAA4C;AAC5C,OAAO,EAAE,YAAY,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3D,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/templates/main.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAQ7D;;GAEG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,mBAAmB,EACxB,KAAK,MAAM,KACV,OAAO,CAAC,IAAI,CA4Ed,CAAC"}
|