@5ive-tech/cli 1.0.4

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 (139) hide show
  1. package/README.md +226 -0
  2. package/dist/assets/vm/five_vm_wasm.d.ts +762 -0
  3. package/dist/assets/vm/five_vm_wasm.js +3754 -0
  4. package/dist/assets/vm/five_vm_wasm_bg.wasm +0 -0
  5. package/dist/assets/vm/five_vm_wasm_bg.wasm.d.ts +247 -0
  6. package/dist/assets/vm/package.json +11 -0
  7. package/dist/cli.d.ts +47 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +343 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/analyze.d.ts +3 -0
  12. package/dist/commands/analyze.d.ts.map +1 -0
  13. package/dist/commands/analyze.js +435 -0
  14. package/dist/commands/analyze.js.map +1 -0
  15. package/dist/commands/build.d.ts +3 -0
  16. package/dist/commands/build.d.ts.map +1 -0
  17. package/dist/commands/build.js +66 -0
  18. package/dist/commands/build.js.map +1 -0
  19. package/dist/commands/compile.d.ts +3 -0
  20. package/dist/commands/compile.d.ts.map +1 -0
  21. package/dist/commands/compile.js +872 -0
  22. package/dist/commands/compile.js.map +1 -0
  23. package/dist/commands/config.d.ts +3 -0
  24. package/dist/commands/config.d.ts.map +1 -0
  25. package/dist/commands/config.js +431 -0
  26. package/dist/commands/config.js.map +1 -0
  27. package/dist/commands/deploy-and-execute.d.ts +3 -0
  28. package/dist/commands/deploy-and-execute.d.ts.map +1 -0
  29. package/dist/commands/deploy-and-execute.js +317 -0
  30. package/dist/commands/deploy-and-execute.js.map +1 -0
  31. package/dist/commands/deploy.d.ts +21 -0
  32. package/dist/commands/deploy.d.ts.map +1 -0
  33. package/dist/commands/deploy.js +806 -0
  34. package/dist/commands/deploy.js.map +1 -0
  35. package/dist/commands/donate.d.ts +4 -0
  36. package/dist/commands/donate.d.ts.map +1 -0
  37. package/dist/commands/donate.js +104 -0
  38. package/dist/commands/donate.js.map +1 -0
  39. package/dist/commands/execute.d.ts +6 -0
  40. package/dist/commands/execute.d.ts.map +1 -0
  41. package/dist/commands/execute.js +749 -0
  42. package/dist/commands/execute.js.map +1 -0
  43. package/dist/commands/fmt.d.ts +3 -0
  44. package/dist/commands/fmt.d.ts.map +1 -0
  45. package/dist/commands/fmt.js +327 -0
  46. package/dist/commands/fmt.js.map +1 -0
  47. package/dist/commands/help.d.ts +6 -0
  48. package/dist/commands/help.d.ts.map +1 -0
  49. package/dist/commands/help.js +224 -0
  50. package/dist/commands/help.js.map +1 -0
  51. package/dist/commands/index.d.ts +45 -0
  52. package/dist/commands/index.d.ts.map +1 -0
  53. package/dist/commands/index.js +119 -0
  54. package/dist/commands/index.js.map +1 -0
  55. package/dist/commands/init.d.ts +3 -0
  56. package/dist/commands/init.d.ts.map +1 -0
  57. package/dist/commands/init.js +887 -0
  58. package/dist/commands/init.js.map +1 -0
  59. package/dist/commands/local.d.ts +3 -0
  60. package/dist/commands/local.d.ts.map +1 -0
  61. package/dist/commands/local.js +703 -0
  62. package/dist/commands/local.js.map +1 -0
  63. package/dist/commands/namespace.d.ts +3 -0
  64. package/dist/commands/namespace.d.ts.map +1 -0
  65. package/dist/commands/namespace.js +328 -0
  66. package/dist/commands/namespace.js.map +1 -0
  67. package/dist/commands/template.d.ts +4 -0
  68. package/dist/commands/template.d.ts.map +1 -0
  69. package/dist/commands/template.js +486 -0
  70. package/dist/commands/template.js.map +1 -0
  71. package/dist/commands/test.d.ts +6 -0
  72. package/dist/commands/test.d.ts.map +1 -0
  73. package/dist/commands/test.js +890 -0
  74. package/dist/commands/test.js.map +1 -0
  75. package/dist/commands/version.d.ts +6 -0
  76. package/dist/commands/version.d.ts.map +1 -0
  77. package/dist/commands/version.js +339 -0
  78. package/dist/commands/version.js.map +1 -0
  79. package/dist/config/ConfigManager.d.ts +69 -0
  80. package/dist/config/ConfigManager.d.ts.map +1 -0
  81. package/dist/config/ConfigManager.js +261 -0
  82. package/dist/config/ConfigManager.js.map +1 -0
  83. package/dist/config/index.d.ts +10 -0
  84. package/dist/config/index.d.ts.map +1 -0
  85. package/dist/config/index.js +21 -0
  86. package/dist/config/index.js.map +1 -0
  87. package/dist/config/types.d.ts +35 -0
  88. package/dist/config/types.d.ts.map +1 -0
  89. package/dist/config/types.js +105 -0
  90. package/dist/config/types.js.map +1 -0
  91. package/dist/index.d.ts +3 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +29 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/project/ProjectLoader.d.ts +12 -0
  96. package/dist/project/ProjectLoader.d.ts.map +1 -0
  97. package/dist/project/ProjectLoader.js +115 -0
  98. package/dist/project/ProjectLoader.js.map +1 -0
  99. package/dist/types.d.ts +334 -0
  100. package/dist/types.d.ts.map +1 -0
  101. package/dist/types.js +2 -0
  102. package/dist/types.js.map +1 -0
  103. package/dist/utils/AccountFixtureGenerator.d.ts +48 -0
  104. package/dist/utils/AccountFixtureGenerator.d.ts.map +1 -0
  105. package/dist/utils/AccountFixtureGenerator.js +265 -0
  106. package/dist/utils/AccountFixtureGenerator.js.map +1 -0
  107. package/dist/utils/FiveFileManager.d.ts +96 -0
  108. package/dist/utils/FiveFileManager.d.ts.map +1 -0
  109. package/dist/utils/FiveFileManager.js +329 -0
  110. package/dist/utils/FiveFileManager.js.map +1 -0
  111. package/dist/utils/ascii-art.d.ts +72 -0
  112. package/dist/utils/ascii-art.d.ts.map +1 -0
  113. package/dist/utils/ascii-art.js +314 -0
  114. package/dist/utils/ascii-art.js.map +1 -0
  115. package/dist/utils/cli-ui.d.ts +39 -0
  116. package/dist/utils/cli-ui.d.ts.map +1 -0
  117. package/dist/utils/cli-ui.js +75 -0
  118. package/dist/utils/cli-ui.js.map +1 -0
  119. package/dist/utils/fileUtils.d.ts +25 -0
  120. package/dist/utils/fileUtils.d.ts.map +1 -0
  121. package/dist/utils/fileUtils.js +50 -0
  122. package/dist/utils/fileUtils.js.map +1 -0
  123. package/dist/utils/logger.d.ts +53 -0
  124. package/dist/utils/logger.d.ts.map +1 -0
  125. package/dist/utils/logger.js +287 -0
  126. package/dist/utils/logger.js.map +1 -0
  127. package/dist/wasm/compiler.d.ts +101 -0
  128. package/dist/wasm/compiler.d.ts.map +1 -0
  129. package/dist/wasm/compiler.js +906 -0
  130. package/dist/wasm/compiler.js.map +1 -0
  131. package/dist/wasm/loader.d.ts +2 -0
  132. package/dist/wasm/loader.d.ts.map +1 -0
  133. package/dist/wasm/loader.js +90 -0
  134. package/dist/wasm/loader.js.map +1 -0
  135. package/dist/wasm/vm.d.ts +32 -0
  136. package/dist/wasm/vm.d.ts.map +1 -0
  137. package/dist/wasm/vm.js +440 -0
  138. package/dist/wasm/vm.js.map +1 -0
  139. package/package.json +100 -0
@@ -0,0 +1,261 @@
1
+ // Five CLI configuration manager.
2
+ import { promises as fs } from 'fs';
3
+ import { join } from 'path';
4
+ import { homedir } from 'os';
5
+ import { DEFAULT_CONFIG, CONFIG_VALIDATORS } from './types.js';
6
+ export class ConfigError extends Error {
7
+ cause;
8
+ constructor(message, cause) {
9
+ super(message);
10
+ this.cause = cause;
11
+ this.name = 'ConfigError';
12
+ }
13
+ }
14
+ export class ConfigManager {
15
+ static instance;
16
+ config;
17
+ configPath;
18
+ initialized = false;
19
+ constructor() {
20
+ this.config = { ...DEFAULT_CONFIG };
21
+ this.configPath = this.getConfigPath();
22
+ }
23
+ static getInstance() {
24
+ if (!ConfigManager.instance) {
25
+ ConfigManager.instance = new ConfigManager();
26
+ }
27
+ return ConfigManager.instance;
28
+ }
29
+ getConfigPath() {
30
+ const xdgConfigHome = process.env.XDG_CONFIG_HOME;
31
+ const configDir = xdgConfigHome
32
+ ? join(xdgConfigHome, 'five')
33
+ : join(homedir(), '.config', 'five');
34
+ return join(configDir, 'config.json');
35
+ }
36
+ async init() {
37
+ try {
38
+ const configDir = this.configPath.replace('/config.json', '');
39
+ await fs.mkdir(configDir, { recursive: true });
40
+ try {
41
+ await this.load();
42
+ }
43
+ catch (error) {
44
+ if (error instanceof ConfigError && error.message.includes('not found')) {
45
+ await this.save();
46
+ }
47
+ else {
48
+ throw error;
49
+ }
50
+ }
51
+ this.initialized = true;
52
+ }
53
+ catch (error) {
54
+ throw new ConfigError(`Failed to initialize configuration: ${error instanceof Error ? error.message : 'Unknown error'}`, error instanceof Error ? error : undefined);
55
+ }
56
+ }
57
+ async load() {
58
+ try {
59
+ const configData = await fs.readFile(this.configPath, 'utf8');
60
+ let parsedConfig;
61
+ try {
62
+ parsedConfig = JSON.parse(configData);
63
+ }
64
+ catch (parseError) {
65
+ throw new ConfigError(`Invalid JSON in config file: ${this.configPath}`, parseError instanceof Error ? parseError : undefined);
66
+ }
67
+ if (!CONFIG_VALIDATORS.isValidConfig(parsedConfig)) {
68
+ throw new ConfigError(`Invalid configuration structure in: ${this.configPath}`);
69
+ }
70
+ this.config = {
71
+ ...DEFAULT_CONFIG,
72
+ ...parsedConfig,
73
+ networks: {
74
+ ...DEFAULT_CONFIG.networks,
75
+ ...parsedConfig.networks,
76
+ },
77
+ };
78
+ return this.config;
79
+ }
80
+ catch (error) {
81
+ if (error instanceof ConfigError) {
82
+ throw error;
83
+ }
84
+ if (error?.code === 'ENOENT') {
85
+ throw new ConfigError(`Config file not found: ${this.configPath}`);
86
+ }
87
+ throw new ConfigError(`Failed to load configuration: ${error instanceof Error ? error.message : 'Unknown error'}`, error instanceof Error ? error : undefined);
88
+ }
89
+ }
90
+ async save() {
91
+ try {
92
+ if (!CONFIG_VALIDATORS.isValidConfig(this.config)) {
93
+ throw new ConfigError('Cannot save invalid configuration');
94
+ }
95
+ const configDir = this.configPath.replace('/config.json', '');
96
+ await fs.mkdir(configDir, { recursive: true });
97
+ const configData = JSON.stringify(this.config, null, 2);
98
+ await fs.writeFile(this.configPath, configData, 'utf8');
99
+ }
100
+ catch (error) {
101
+ throw new ConfigError(`Failed to save configuration: ${error instanceof Error ? error.message : 'Unknown error'}`, error instanceof Error ? error : undefined);
102
+ }
103
+ }
104
+ async get() {
105
+ if (!this.initialized) {
106
+ await this.init();
107
+ }
108
+ return { ...this.config };
109
+ }
110
+ async set(updates) {
111
+ if (!this.initialized) {
112
+ await this.init();
113
+ }
114
+ const updatedConfig = {
115
+ ...this.config,
116
+ ...updates,
117
+ };
118
+ // If networks are being updated, merge with existing networks
119
+ if (updates.networks) {
120
+ updatedConfig.networks = {
121
+ ...this.config.networks,
122
+ ...updates.networks,
123
+ };
124
+ }
125
+ // Validate the updated configuration
126
+ if (!CONFIG_VALIDATORS.isValidConfig(updatedConfig)) {
127
+ throw new ConfigError('Invalid configuration update');
128
+ }
129
+ this.config = updatedConfig;
130
+ await this.save();
131
+ }
132
+ /**
133
+ * Set the target network
134
+ * @param target The target network to set
135
+ */
136
+ async setTarget(target) {
137
+ if (!CONFIG_VALIDATORS.isValidTarget(target)) {
138
+ throw new ConfigError(`Invalid target: ${target}`);
139
+ }
140
+ await this.set({ target });
141
+ }
142
+ /**
143
+ * Set the keypair file path
144
+ * @param keypairPath Path to the keypair file
145
+ */
146
+ async setKeypair(keypairPath) {
147
+ await this.set({ keypair: keypairPath });
148
+ }
149
+ /**
150
+ * Toggle config display in command output
151
+ * @param show Whether to show config details
152
+ */
153
+ async setShowConfig(show) {
154
+ await this.set({ showConfig: show });
155
+ }
156
+ /**
157
+ * Get the current target network
158
+ */
159
+ async getTarget() {
160
+ const config = await this.get();
161
+ return config.target;
162
+ }
163
+ async getCurrentNetworkEndpoint() {
164
+ const config = await this.get();
165
+ return config.networks[config.target];
166
+ }
167
+ async reset() {
168
+ this.config = { ...DEFAULT_CONFIG };
169
+ await this.save();
170
+ }
171
+ isInitialized() {
172
+ return this.initialized;
173
+ }
174
+ async applyOverrides(overrides) {
175
+ const baseConfig = await this.get();
176
+ const mergedConfig = {
177
+ ...baseConfig,
178
+ target: overrides.target || baseConfig.target,
179
+ keypairPath: overrides.keypair || baseConfig.keypair || this.getDefaultKeypairPath()
180
+ };
181
+ if (overrides.network) {
182
+ mergedConfig.networks = {
183
+ ...baseConfig.networks,
184
+ [mergedConfig.target]: {
185
+ ...baseConfig.networks[mergedConfig.target],
186
+ rpcUrl: overrides.network
187
+ }
188
+ };
189
+ }
190
+ return mergedConfig;
191
+ }
192
+ static getTargetPrefix(target) {
193
+ const colors = {
194
+ wasm: '\x1b[36m', // cyan
195
+ local: '\x1b[90m', // gray
196
+ devnet: '\x1b[33m', // yellow
197
+ testnet: '\x1b[35m', // magenta
198
+ mainnet: '\x1b[31m' // red
199
+ };
200
+ const reset = '\x1b[0m';
201
+ const color = colors[target] || colors.devnet;
202
+ return `${color}[${target}]${reset}`;
203
+ }
204
+ /**
205
+ * Set program ID for a target
206
+ * @param programId The Five VM program ID
207
+ * @param target The target to set it for (uses current target if not specified)
208
+ */
209
+ async setProgramId(programId, target) {
210
+ const config = await this.get();
211
+ const t = target || config.target;
212
+ if (!CONFIG_VALIDATORS.isValidTarget(t)) {
213
+ throw new ConfigError(`Invalid target: ${t}`);
214
+ }
215
+ const programIds = {
216
+ ...(config.programIds || {}),
217
+ [t]: programId
218
+ };
219
+ await this.set({ programIds });
220
+ }
221
+ /**
222
+ * Get program ID for a target
223
+ * @param target The target to get it for (uses current target if not specified)
224
+ */
225
+ async getProgramId(target) {
226
+ const config = await this.get();
227
+ const t = target || config.target;
228
+ if (!CONFIG_VALIDATORS.isValidTarget(t)) {
229
+ throw new ConfigError(`Invalid target: ${t}`);
230
+ }
231
+ return config.programIds?.[t];
232
+ }
233
+ /**
234
+ * Clear program ID for a target
235
+ * @param target The target to clear it for (uses current target if not specified)
236
+ */
237
+ async clearProgramId(target) {
238
+ const config = await this.get();
239
+ const t = target || config.target;
240
+ if (!CONFIG_VALIDATORS.isValidTarget(t)) {
241
+ throw new ConfigError(`Invalid target: ${t}`);
242
+ }
243
+ if (config.programIds?.[t]) {
244
+ const programIds = { ...config.programIds };
245
+ delete programIds[t];
246
+ await this.set({ programIds: Object.keys(programIds).length > 0 ? programIds : undefined });
247
+ }
248
+ }
249
+ /**
250
+ * Get all program IDs
251
+ */
252
+ async getAllProgramIds() {
253
+ const config = await this.get();
254
+ return config.programIds || {};
255
+ }
256
+ getDefaultKeypairPath() {
257
+ return join(homedir(), '.config', 'solana', 'id.json');
258
+ }
259
+ }
260
+ export const configManager = ConfigManager.getInstance();
261
+ //# sourceMappingURL=ConfigManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type { FiveConfig, ConfigTarget, NetworkEndpoint, } from './types.js';
2
+ export { DEFAULT_NETWORKS, DEFAULT_CONFIG, CONFIG_VALIDATORS, } from './types.js';
3
+ export { ConfigManager, ConfigError, configManager, } from './ConfigManager.js';
4
+ import type { FiveConfig } from './types.js';
5
+ import { ConfigManager } from './ConfigManager.js';
6
+ export declare function getConfigManager(): ConfigManager;
7
+ export declare function initConfig(): Promise<void>;
8
+ export declare function getConfig(): Promise<FiveConfig>;
9
+ export declare function setConfig(updates: Partial<FiveConfig>): Promise<void>;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,UAAU,EACV,YAAY,EACZ,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,GACd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAGhD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAGrD;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E"}
@@ -0,0 +1,21 @@
1
+ // Configuration constants and defaults
2
+ export { DEFAULT_NETWORKS, DEFAULT_CONFIG, CONFIG_VALIDATORS, } from './types.js';
3
+ // Configuration manager class and instance
4
+ export { ConfigManager, ConfigError, configManager, } from './ConfigManager.js';
5
+ import { ConfigManager } from './ConfigManager.js';
6
+ export function getConfigManager() {
7
+ return ConfigManager.getInstance();
8
+ }
9
+ export async function initConfig() {
10
+ const manager = ConfigManager.getInstance();
11
+ await manager.init();
12
+ }
13
+ export async function getConfig() {
14
+ const manager = ConfigManager.getInstance();
15
+ return await manager.get();
16
+ }
17
+ export async function setConfig(updates) {
18
+ const manager = ConfigManager.getInstance();
19
+ await manager.set(updates);
20
+ }
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAOA,uCAAuC;AACvC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,2CAA2C;AAC3C,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,GACd,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAA4B;IAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,35 @@
1
+ export type ConfigTarget = 'wasm' | 'local' | 'devnet' | 'testnet' | 'mainnet';
2
+ export interface NetworkEndpoint {
3
+ rpcUrl: string;
4
+ wsUrl?: string;
5
+ }
6
+ export interface FiveConfig {
7
+ target: ConfigTarget;
8
+ networks: Record<ConfigTarget, NetworkEndpoint>;
9
+ keypair?: string;
10
+ showConfig: boolean;
11
+ programIds?: Partial<Record<ConfigTarget, string>>;
12
+ wasm?: {
13
+ loader?: 'auto' | 'node' | 'bundler';
14
+ modulePaths?: string[];
15
+ };
16
+ logging?: {
17
+ auditLogDir?: string;
18
+ };
19
+ }
20
+ export declare const DEFAULT_NETWORKS: Record<ConfigTarget, NetworkEndpoint>;
21
+ export declare const DEFAULT_CONFIG: FiveConfig;
22
+ export interface ConfigOverrides {
23
+ target?: ConfigTarget;
24
+ network?: string;
25
+ keypair?: string;
26
+ }
27
+ export declare const CONFIG_VALIDATORS: {
28
+ isValidTarget(target: string): target is ConfigTarget;
29
+ isValidNetworkEndpoint(endpoint: any): endpoint is NetworkEndpoint;
30
+ /**
31
+ * Validates if a complete config object is valid
32
+ */
33
+ isValidConfig(config: any): config is FiveConfig;
34
+ };
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAEnD,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QACrC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;IAEF,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,YAAY,EAAE,eAAe,CAqBlE,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,UAS5B,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,iBAAiB;0BACN,MAAM,GAAG,MAAM,IAAI,YAAY;qCAIpB,GAAG,GAAG,QAAQ,IAAI,eAAe;IAUlE;;OAEG;0BACmB,GAAG,GAAG,MAAM,IAAI,UAAU;CAyDjD,CAAC"}
@@ -0,0 +1,105 @@
1
+ export const DEFAULT_NETWORKS = {
2
+ wasm: {
3
+ rpcUrl: 'wasm://local-execution',
4
+ wsUrl: undefined,
5
+ },
6
+ local: {
7
+ rpcUrl: 'http://127.0.0.1:8899',
8
+ wsUrl: 'ws://127.0.0.1:8900',
9
+ },
10
+ devnet: {
11
+ rpcUrl: 'https://api.devnet.solana.com',
12
+ wsUrl: 'wss://api.devnet.solana.com',
13
+ },
14
+ testnet: {
15
+ rpcUrl: 'https://api.testnet.solana.com',
16
+ wsUrl: 'wss://api.testnet.solana.com',
17
+ },
18
+ mainnet: {
19
+ rpcUrl: 'https://api.mainnet-beta.solana.com',
20
+ wsUrl: 'wss://api.mainnet-beta.solana.com',
21
+ },
22
+ };
23
+ export const DEFAULT_CONFIG = {
24
+ target: 'devnet',
25
+ networks: DEFAULT_NETWORKS,
26
+ showConfig: false,
27
+ wasm: {
28
+ loader: 'auto',
29
+ modulePaths: [],
30
+ },
31
+ logging: {}
32
+ };
33
+ export const CONFIG_VALIDATORS = {
34
+ isValidTarget(target) {
35
+ return ['wasm', 'local', 'devnet', 'testnet', 'mainnet'].includes(target);
36
+ },
37
+ isValidNetworkEndpoint(endpoint) {
38
+ return (typeof endpoint === 'object' &&
39
+ endpoint !== null &&
40
+ typeof endpoint.rpcUrl === 'string' &&
41
+ endpoint.rpcUrl.length > 0 &&
42
+ (endpoint.wsUrl === undefined || typeof endpoint.wsUrl === 'string'));
43
+ },
44
+ /**
45
+ * Validates if a complete config object is valid
46
+ */
47
+ isValidConfig(config) {
48
+ if (typeof config !== 'object' || config === null) {
49
+ return false;
50
+ }
51
+ // Validate target
52
+ if (!this.isValidTarget(config.target)) {
53
+ return false;
54
+ }
55
+ // Validate networks
56
+ if (typeof config.networks !== 'object' || config.networks === null) {
57
+ return false;
58
+ }
59
+ for (const [target, endpoint] of Object.entries(config.networks)) {
60
+ if (!this.isValidTarget(target) || !this.isValidNetworkEndpoint(endpoint)) {
61
+ return false;
62
+ }
63
+ }
64
+ // Validate optional fields
65
+ if (config.keypair !== undefined && typeof config.keypair !== 'string') {
66
+ return false;
67
+ }
68
+ // Validate program IDs
69
+ if (config.programIds !== undefined) {
70
+ if (typeof config.programIds !== 'object' || config.programIds === null)
71
+ return false;
72
+ for (const [target, programId] of Object.entries(config.programIds)) {
73
+ if (!this.isValidTarget(target))
74
+ return false;
75
+ if (typeof programId !== 'string' || programId.length === 0)
76
+ return false;
77
+ }
78
+ }
79
+ // Optional wasm config
80
+ if (config.wasm !== undefined) {
81
+ if (typeof config.wasm !== 'object' || config.wasm === null)
82
+ return false;
83
+ if (config.wasm.loader !== undefined && !['auto', 'node', 'bundler'].includes(config.wasm.loader))
84
+ return false;
85
+ if (config.wasm.modulePaths !== undefined) {
86
+ if (!Array.isArray(config.wasm.modulePaths))
87
+ return false;
88
+ if (!config.wasm.modulePaths.every((p) => typeof p === 'string'))
89
+ return false;
90
+ }
91
+ }
92
+ // Optional logging
93
+ if (config.logging !== undefined) {
94
+ if (typeof config.logging !== 'object' || config.logging === null)
95
+ return false;
96
+ if (config.logging.auditLogDir !== undefined && typeof config.logging.auditLogDir !== 'string')
97
+ return false;
98
+ }
99
+ if (typeof config.showConfig !== 'boolean') {
100
+ return false;
101
+ }
102
+ return true;
103
+ },
104
+ };
105
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function main(): Promise<void>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAMA,wBAAsB,IAAI,kBAYzB"}
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ // Five CLI entrypoint.
3
+ import chalk from 'chalk';
4
+ import { createCLI } from './cli.js';
5
+ export async function main() {
6
+ try {
7
+ const cli = createCLI({
8
+ verbose: process.argv.includes('--verbose') || process.argv.includes('-v'),
9
+ debug: process.argv.includes('--debug')
10
+ });
11
+ await cli.run(process.argv);
12
+ }
13
+ catch (error) {
14
+ console.error(chalk.red('Fatal error:'), error);
15
+ process.exit(1);
16
+ }
17
+ }
18
+ // Execute main when run directly (npx/global installs included).
19
+ const isMainModule = (import.meta.url === `file://${process.argv[1]}` ||
20
+ process.argv[1].endsWith('dist/index.js') ||
21
+ process.argv[1].endsWith('/five') ||
22
+ process.argv[1].includes('five-cli'));
23
+ if (isMainModule) {
24
+ main().catch(error => {
25
+ console.error('Fatal CLI error:', error);
26
+ process.exit(1);
27
+ });
28
+ }
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,uBAAuB;AAEvB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC;YACpB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC1E,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;SACxC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,YAAY,GAAG,CACnB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CACrC,CAAC;AAEF,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { BuildManifest, ProjectConfig } from '../types.js';
2
+ export interface LoadedProjectConfig {
3
+ config: ProjectConfig;
4
+ configPath: string;
5
+ rootDir: string;
6
+ }
7
+ export declare function loadProjectConfig(projectPath?: string, cwd?: string): Promise<LoadedProjectConfig | null>;
8
+ export declare function findConfigPath(projectPath?: string, cwd?: string): Promise<string | null>;
9
+ export declare function loadBuildManifest(rootDir: string): Promise<BuildManifest | null>;
10
+ export declare function writeBuildManifest(rootDir: string, manifest: BuildManifest): Promise<string>;
11
+ export declare function computeHash(data: Buffer | Uint8Array): string;
12
+ //# sourceMappingURL=ProjectLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectLoader.d.ts","sourceRoot":"","sources":["../../src/project/ProjectLoader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAqB,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,iBAAiB,CACrC,WAAW,CAAC,EAAE,MAAM,EACpB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAmDrC;AAED,wBAAsB,cAAc,CAClC,WAAW,CAAC,EAAE,MAAM,EACpB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBxB;AAsBD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAQtF;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlG;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAI7D"}
@@ -0,0 +1,115 @@
1
+ import { readFile, access, mkdir, writeFile } from 'fs/promises';
2
+ import { dirname, isAbsolute, join, resolve } from 'path';
3
+ import { createHash } from 'crypto';
4
+ import { parse as parseToml } from '@iarna/toml';
5
+ export async function loadProjectConfig(projectPath, cwd = process.cwd()) {
6
+ const configPath = await findConfigPath(projectPath, cwd);
7
+ if (!configPath) {
8
+ return null;
9
+ }
10
+ const fileContent = await readFile(configPath, 'utf8');
11
+ let parsed;
12
+ try {
13
+ parsed = parseToml(fileContent);
14
+ }
15
+ catch (e) {
16
+ throw new Error(`Failed to parse five.toml at ${configPath}: ${e}`);
17
+ }
18
+ const rootDir = dirname(configPath);
19
+ const project = parsed.project ?? {};
20
+ const build = parsed.build ?? {};
21
+ const optimizations = parsed.optimizations ?? {};
22
+ const deploy = parsed.deploy ?? {};
23
+ const modules = parsed.modules ?? {};
24
+ const name = project.name ?? 'five-project';
25
+ const target = (project.target ?? 'vm');
26
+ const config = {
27
+ name,
28
+ version: project.version ?? '0.1.0',
29
+ description: project.description,
30
+ sourceDir: project.source_dir ?? 'src',
31
+ buildDir: project.build_dir ?? 'build',
32
+ target,
33
+ entryPoint: project.entry_point ?? build.entry_point,
34
+ outputArtifactName: build.output_artifact_name ?? name,
35
+ cluster: deploy.cluster ?? deploy.network,
36
+ commitment: deploy.commitment,
37
+ rpcUrl: deploy.rpc_url,
38
+ programId: deploy.program_id,
39
+ namespaceManager: deploy.namespace_manager ?? deploy.namespace_manager_script,
40
+ keypairPath: deploy.keypair_path,
41
+ multiFileMode: build.multi_file_mode ?? false,
42
+ optimizations: {
43
+ enableCompression: optimizations.enable_compression ?? true,
44
+ enableConstraintOptimization: optimizations.enable_constraint_optimization ?? true,
45
+ optimizationLevel: 'production'
46
+ },
47
+ dependencies: [],
48
+ modules: modules
49
+ };
50
+ return { config, configPath, rootDir };
51
+ }
52
+ export async function findConfigPath(projectPath, cwd = process.cwd()) {
53
+ if (projectPath) {
54
+ const candidate = isAbsolute(projectPath) ? projectPath : resolve(cwd, projectPath);
55
+ // If a directory is provided, look for five.toml inside
56
+ try {
57
+ await access(candidate);
58
+ const asToml = candidate.endsWith('.toml') ? candidate : join(candidate, 'five.toml');
59
+ try {
60
+ await access(asToml);
61
+ return asToml;
62
+ }
63
+ catch {
64
+ // fallthrough to upward search from candidate dir
65
+ return await searchUpwards(candidate);
66
+ }
67
+ }
68
+ catch {
69
+ return null;
70
+ }
71
+ }
72
+ return await searchUpwards(cwd);
73
+ }
74
+ async function searchUpwards(startDir) {
75
+ let current = resolve(startDir);
76
+ while (true) {
77
+ const candidate = join(current, 'five.toml');
78
+ try {
79
+ await access(candidate);
80
+ return candidate;
81
+ }
82
+ catch {
83
+ // continue
84
+ }
85
+ const parent = dirname(current);
86
+ if (parent === current) {
87
+ break;
88
+ }
89
+ current = parent;
90
+ }
91
+ return null;
92
+ }
93
+ export async function loadBuildManifest(rootDir) {
94
+ const manifestPath = join(rootDir, '.five', 'build.json');
95
+ try {
96
+ const content = await readFile(manifestPath, 'utf8');
97
+ return JSON.parse(content);
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ }
103
+ export async function writeBuildManifest(rootDir, manifest) {
104
+ const manifestDir = join(rootDir, '.five');
105
+ await mkdir(manifestDir, { recursive: true });
106
+ const manifestPath = join(manifestDir, 'build.json');
107
+ await writeFile(manifestPath, JSON.stringify(manifest, null, 2));
108
+ return manifestPath;
109
+ }
110
+ export function computeHash(data) {
111
+ const hash = createHash('sha256');
112
+ hash.update(data);
113
+ return hash.digest('hex');
114
+ }
115
+ //# sourceMappingURL=ProjectLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectLoader.js","sourceRoot":"","sources":["../../src/project/ProjectLoader.ts"],"names":[],"mappings":"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"}