@creact-labs/creact 0.1.8 → 0.2.1

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 (146) hide show
  1. package/README.md +85 -22
  2. package/dist/cli.d.ts +11 -0
  3. package/dist/cli.js +88 -0
  4. package/dist/index.d.ts +19 -44
  5. package/dist/index.js +20 -68
  6. package/dist/jsx/index.d.ts +2 -0
  7. package/dist/jsx/index.js +1 -0
  8. package/dist/jsx/jsx-dev-runtime.d.ts +4 -0
  9. package/dist/jsx/jsx-dev-runtime.js +4 -0
  10. package/dist/jsx/jsx-runtime.d.ts +38 -0
  11. package/dist/jsx/jsx-runtime.js +38 -0
  12. package/dist/jsx/types.d.ts +12 -0
  13. package/dist/jsx/types.js +4 -0
  14. package/dist/primitives/context.d.ts +34 -0
  15. package/dist/primitives/context.js +63 -0
  16. package/dist/primitives/index.d.ts +3 -0
  17. package/dist/primitives/index.js +3 -0
  18. package/dist/primitives/instance.d.ts +72 -0
  19. package/dist/primitives/instance.js +235 -0
  20. package/dist/primitives/store.d.ts +22 -0
  21. package/dist/primitives/store.js +97 -0
  22. package/dist/provider/backend.d.ts +110 -0
  23. package/dist/provider/backend.js +37 -0
  24. package/dist/provider/interface.d.ts +48 -0
  25. package/dist/provider/interface.js +39 -0
  26. package/dist/reactive/effect.d.ts +11 -0
  27. package/dist/reactive/effect.js +42 -0
  28. package/dist/reactive/index.d.ts +3 -0
  29. package/dist/reactive/index.js +3 -0
  30. package/dist/reactive/signal.d.ts +32 -0
  31. package/dist/reactive/signal.js +60 -0
  32. package/dist/reactive/tracking.d.ts +41 -0
  33. package/dist/reactive/tracking.js +161 -0
  34. package/dist/runtime/fiber.d.ts +21 -0
  35. package/dist/runtime/fiber.js +16 -0
  36. package/dist/runtime/index.d.ts +4 -0
  37. package/dist/runtime/index.js +4 -0
  38. package/dist/runtime/reconcile.d.ts +66 -0
  39. package/dist/runtime/reconcile.js +210 -0
  40. package/dist/runtime/render.d.ts +42 -0
  41. package/dist/runtime/render.js +231 -0
  42. package/dist/runtime/run.d.ts +119 -0
  43. package/dist/runtime/run.js +334 -0
  44. package/dist/runtime/state-machine.d.ts +95 -0
  45. package/dist/runtime/state-machine.js +209 -0
  46. package/dist/types.d.ts +13 -0
  47. package/dist/types.js +4 -0
  48. package/package.json +29 -24
  49. package/dist/cli/commands/BuildCommand.d.ts +0 -40
  50. package/dist/cli/commands/BuildCommand.js +0 -151
  51. package/dist/cli/commands/DeployCommand.d.ts +0 -38
  52. package/dist/cli/commands/DeployCommand.js +0 -194
  53. package/dist/cli/commands/DevCommand.d.ts +0 -52
  54. package/dist/cli/commands/DevCommand.js +0 -394
  55. package/dist/cli/commands/PlanCommand.d.ts +0 -39
  56. package/dist/cli/commands/PlanCommand.js +0 -164
  57. package/dist/cli/commands/index.d.ts +0 -36
  58. package/dist/cli/commands/index.js +0 -43
  59. package/dist/cli/core/ArgumentParser.d.ts +0 -46
  60. package/dist/cli/core/ArgumentParser.js +0 -127
  61. package/dist/cli/core/BaseCommand.d.ts +0 -75
  62. package/dist/cli/core/BaseCommand.js +0 -95
  63. package/dist/cli/core/CLIContext.d.ts +0 -68
  64. package/dist/cli/core/CLIContext.js +0 -183
  65. package/dist/cli/core/CommandRegistry.d.ts +0 -64
  66. package/dist/cli/core/CommandRegistry.js +0 -89
  67. package/dist/cli/core/index.d.ts +0 -36
  68. package/dist/cli/core/index.js +0 -43
  69. package/dist/cli/index.d.ts +0 -35
  70. package/dist/cli/index.js +0 -100
  71. package/dist/cli/output.d.ts +0 -204
  72. package/dist/cli/output.js +0 -437
  73. package/dist/cli/utils.d.ts +0 -59
  74. package/dist/cli/utils.js +0 -76
  75. package/dist/context/createContext.d.ts +0 -90
  76. package/dist/context/createContext.js +0 -113
  77. package/dist/context/index.d.ts +0 -30
  78. package/dist/context/index.js +0 -35
  79. package/dist/core/CReact.d.ts +0 -409
  80. package/dist/core/CReact.js +0 -1151
  81. package/dist/core/CloudDOMBuilder.d.ts +0 -447
  82. package/dist/core/CloudDOMBuilder.js +0 -1234
  83. package/dist/core/ContextDependencyTracker.d.ts +0 -165
  84. package/dist/core/ContextDependencyTracker.js +0 -448
  85. package/dist/core/ErrorRecoveryManager.d.ts +0 -145
  86. package/dist/core/ErrorRecoveryManager.js +0 -443
  87. package/dist/core/EventBus.d.ts +0 -91
  88. package/dist/core/EventBus.js +0 -185
  89. package/dist/core/ProviderOutputTracker.d.ts +0 -211
  90. package/dist/core/ProviderOutputTracker.js +0 -476
  91. package/dist/core/ReactiveUpdateQueue.d.ts +0 -76
  92. package/dist/core/ReactiveUpdateQueue.js +0 -121
  93. package/dist/core/Reconciler.d.ts +0 -415
  94. package/dist/core/Reconciler.js +0 -1044
  95. package/dist/core/RenderScheduler.d.ts +0 -153
  96. package/dist/core/RenderScheduler.js +0 -519
  97. package/dist/core/Renderer.d.ts +0 -336
  98. package/dist/core/Renderer.js +0 -944
  99. package/dist/core/Runtime.d.ts +0 -246
  100. package/dist/core/Runtime.js +0 -640
  101. package/dist/core/StateBindingManager.d.ts +0 -121
  102. package/dist/core/StateBindingManager.js +0 -309
  103. package/dist/core/StateMachine.d.ts +0 -441
  104. package/dist/core/StateMachine.js +0 -883
  105. package/dist/core/StructuralChangeDetector.d.ts +0 -140
  106. package/dist/core/StructuralChangeDetector.js +0 -363
  107. package/dist/core/Validator.d.ts +0 -127
  108. package/dist/core/Validator.js +0 -279
  109. package/dist/core/errors.d.ts +0 -153
  110. package/dist/core/errors.js +0 -202
  111. package/dist/core/index.d.ts +0 -38
  112. package/dist/core/index.js +0 -64
  113. package/dist/core/types.d.ts +0 -265
  114. package/dist/core/types.js +0 -48
  115. package/dist/hooks/context.d.ts +0 -147
  116. package/dist/hooks/context.js +0 -334
  117. package/dist/hooks/useContext.d.ts +0 -113
  118. package/dist/hooks/useContext.js +0 -169
  119. package/dist/hooks/useEffect.d.ts +0 -105
  120. package/dist/hooks/useEffect.js +0 -540
  121. package/dist/hooks/useInstance.d.ts +0 -139
  122. package/dist/hooks/useInstance.js +0 -455
  123. package/dist/hooks/useState.d.ts +0 -120
  124. package/dist/hooks/useState.js +0 -298
  125. package/dist/jsx.d.ts +0 -143
  126. package/dist/jsx.js +0 -76
  127. package/dist/providers/DummyBackendProvider.d.ts +0 -193
  128. package/dist/providers/DummyBackendProvider.js +0 -189
  129. package/dist/providers/DummyCloudProvider.d.ts +0 -128
  130. package/dist/providers/DummyCloudProvider.js +0 -157
  131. package/dist/providers/IBackendProvider.d.ts +0 -177
  132. package/dist/providers/IBackendProvider.js +0 -31
  133. package/dist/providers/ICloudProvider.d.ts +0 -230
  134. package/dist/providers/ICloudProvider.js +0 -31
  135. package/dist/providers/index.d.ts +0 -31
  136. package/dist/providers/index.js +0 -31
  137. package/dist/test-event-callbacks.d.ts +0 -0
  138. package/dist/test-event-callbacks.js +0 -1
  139. package/dist/utils/Logger.d.ts +0 -144
  140. package/dist/utils/Logger.js +0 -220
  141. package/dist/utils/Output.d.ts +0 -161
  142. package/dist/utils/Output.js +0 -401
  143. package/dist/utils/deepEqual.d.ts +0 -71
  144. package/dist/utils/deepEqual.js +0 -276
  145. package/dist/utils/naming.d.ts +0 -241
  146. package/dist/utils/naming.js +0 -376
@@ -1,46 +0,0 @@
1
- /**
2
-
3
- * Licensed under the Apache License, Version 2.0 (the "License");
4
-
5
- * you may not use this file except in compliance with the License.
6
-
7
- * You may obtain a copy of the License at
8
-
9
- *
10
-
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
-
13
- *
14
-
15
- * Unless required by applicable law or agreed to in writing, software
16
-
17
- * distributed under the License is distributed on an "AS IS" BASIS,
18
-
19
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
-
21
- * See the License for the specific language governing permissions and
22
-
23
- * limitations under the License.
24
-
25
- *
26
-
27
- * Copyright 2025 Daniel Coutinho Ribeiro
28
-
29
- */
30
- /**
31
- * Argument Parser - parses CLI arguments and flags
32
- */
33
- import { CLIContext } from './CLIContext';
34
- /**
35
- * Simple argument parser for CLI commands
36
- */
37
- export declare class ArgumentParser {
38
- /**
39
- * Parse command line arguments into context
40
- */
41
- static parse(argv: string[]): CLIContext;
42
- /**
43
- * Show help message
44
- */
45
- static showHelp(): void;
46
- }
@@ -1,127 +0,0 @@
1
- "use strict";
2
- /**
3
-
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
-
6
- * you may not use this file except in compliance with the License.
7
-
8
- * You may obtain a copy of the License at
9
-
10
- *
11
-
12
- * http://www.apache.org/licenses/LICENSE-2.0
13
-
14
- *
15
-
16
- * Unless required by applicable law or agreed to in writing, software
17
-
18
- * distributed under the License is distributed on an "AS IS" BASIS,
19
-
20
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
-
22
- * See the License for the specific language governing permissions and
23
-
24
- * limitations under the License.
25
-
26
- *
27
-
28
- * Copyright 2025 Daniel Coutinho Ribeiro
29
-
30
- */
31
- Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.ArgumentParser = void 0;
33
- const Logger_1 = require("../../utils/Logger");
34
- const logger = Logger_1.LoggerFactory.getLogger('cli');
35
- /**
36
- * Simple argument parser for CLI commands
37
- */
38
- class ArgumentParser {
39
- /**
40
- * Parse command line arguments into context
41
- */
42
- static parse(argv) {
43
- // Remove node and script path
44
- const args = argv.slice(2);
45
- if (args.length === 0) {
46
- throw new Error('No command specified');
47
- }
48
- const command = args[0];
49
- const remainingArgs = args.slice(1);
50
- const flags = {};
51
- const positionalArgs = [];
52
- for (let i = 0; i < remainingArgs.length; i++) {
53
- const arg = remainingArgs[i];
54
- if (arg.startsWith('--')) {
55
- // Long flag
56
- const flagName = arg.slice(2);
57
- if (flagName.includes('=')) {
58
- // --flag=value
59
- const [name, value] = flagName.split('=', 2);
60
- flags[name] = value;
61
- }
62
- else {
63
- // --flag or --flag value
64
- const nextArg = remainingArgs[i + 1];
65
- if (nextArg && !nextArg.startsWith('-')) {
66
- // --flag value
67
- flags[flagName] = nextArg;
68
- i++; // Skip next arg
69
- }
70
- else {
71
- // --flag (boolean)
72
- flags[flagName] = true;
73
- }
74
- }
75
- }
76
- else if (arg.startsWith('-') && arg.length > 1) {
77
- // Short flag(s)
78
- const shortFlags = arg.slice(1);
79
- for (const flag of shortFlags) {
80
- flags[flag] = true;
81
- }
82
- }
83
- else {
84
- // Positional argument
85
- positionalArgs.push(arg);
86
- }
87
- }
88
- return {
89
- args: [command, ...positionalArgs],
90
- flags,
91
- };
92
- }
93
- /**
94
- * Show help message
95
- */
96
- static showHelp() {
97
- logger.info(`
98
- CReact CLI - Infrastructure as Code with JSX
99
-
100
- Usage:
101
- creact <command> [options]
102
-
103
- Commands:
104
- build Build CloudDOM from entry file
105
- plan Show diff between current and previous CloudDOM
106
- deploy Deploy CloudDOM to cloud provider
107
- dev Hot reload development mode
108
-
109
- Options:
110
- --entry <file> Entry file path (default: index.ts)
111
- --verbose, -v Verbose output
112
- --json JSON output format
113
- --dry-run Simulate deployment without applying changes
114
- --auto-approve Auto-approve changes in dev mode (alias: --auto)
115
- --help, -h Show help
116
-
117
- Examples:
118
- creact build
119
- creact build --entry app.ts --verbose
120
- creact plan --json
121
- creact deploy --dry-run
122
- creact dev
123
- creact dev --auto-approve
124
- `);
125
- }
126
- }
127
- exports.ArgumentParser = ArgumentParser;
@@ -1,75 +0,0 @@
1
- /**
2
-
3
- * Licensed under the Apache License, Version 2.0 (the "License");
4
-
5
- * you may not use this file except in compliance with the License.
6
-
7
- * You may obtain a copy of the License at
8
-
9
- *
10
-
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
-
13
- *
14
-
15
- * Unless required by applicable law or agreed to in writing, software
16
-
17
- * distributed under the License is distributed on an "AS IS" BASIS,
18
-
19
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
-
21
- * See the License for the specific language governing permissions and
22
-
23
- * limitations under the License.
24
-
25
- *
26
-
27
- * Copyright 2025 Daniel Coutinho Ribeiro
28
-
29
- */
30
- /**
31
- * Base Command - abstract base class for all CLI commands
32
- */
33
- import { CLIContext } from './CLIContext';
34
- export interface CommandResult {
35
- exitCode: number;
36
- message?: string;
37
- data?: any;
38
- }
39
- /**
40
- * Abstract base class for CLI commands
41
- */
42
- export declare abstract class BaseCommand {
43
- protected context: CLIContext;
44
- protected verbose: boolean;
45
- protected json: boolean;
46
- constructor(context: CLIContext);
47
- /**
48
- * Execute the command
49
- */
50
- abstract execute(): Promise<CommandResult>;
51
- /**
52
- * Get command name for help/error messages
53
- */
54
- abstract getName(): string;
55
- /**
56
- * Get command description for help
57
- */
58
- abstract getDescription(): string;
59
- /**
60
- * Log verbose message
61
- */
62
- protected logVerbose(message: string): void;
63
- /**
64
- * Output JSON if json flag is set, otherwise return false
65
- */
66
- protected outputJson(data: any): boolean;
67
- /**
68
- * Handle errors consistently
69
- */
70
- protected handleError(error: Error, context?: string): CommandResult;
71
- /**
72
- * Handle success consistently
73
- */
74
- protected handleSuccess(message: string, data?: any): CommandResult;
75
- }
@@ -1,95 +0,0 @@
1
- "use strict";
2
- /**
3
-
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
-
6
- * you may not use this file except in compliance with the License.
7
-
8
- * You may obtain a copy of the License at
9
-
10
- *
11
-
12
- * http://www.apache.org/licenses/LICENSE-2.0
13
-
14
- *
15
-
16
- * Unless required by applicable law or agreed to in writing, software
17
-
18
- * distributed under the License is distributed on an "AS IS" BASIS,
19
-
20
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
-
22
- * See the License for the specific language governing permissions and
23
-
24
- * limitations under the License.
25
-
26
- *
27
-
28
- * Copyright 2025 Daniel Coutinho Ribeiro
29
-
30
- */
31
- Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.BaseCommand = void 0;
33
- const Logger_1 = require("../../utils/Logger");
34
- const logger = Logger_1.LoggerFactory.getLogger('cli');
35
- /**
36
- * Abstract base class for CLI commands
37
- */
38
- class BaseCommand {
39
- constructor(context) {
40
- this.context = context;
41
- this.verbose = !!context.flags.verbose;
42
- this.json = !!context.flags.json;
43
- }
44
- /**
45
- * Log verbose message
46
- */
47
- logVerbose(message) {
48
- if (this.verbose) {
49
- logger.debug(`[${this.getName()}] ${message}`);
50
- }
51
- }
52
- /**
53
- * Output JSON if json flag is set, otherwise return false
54
- */
55
- outputJson(data) {
56
- if (this.json) {
57
- logger.info(JSON.stringify(data, null, 2));
58
- return true;
59
- }
60
- return false;
61
- }
62
- /**
63
- * Handle errors consistently
64
- */
65
- handleError(error, context) {
66
- const message = context ? `${context}: ${error.message}` : error.message;
67
- if (this.outputJson({
68
- status: 'error',
69
- error: error.message,
70
- stack: this.verbose ? error.stack : undefined,
71
- })) {
72
- return { exitCode: 1 };
73
- }
74
- logger.error(`Error: ${message}`);
75
- if (this.verbose && error.stack) {
76
- logger.error(error.stack);
77
- }
78
- return { exitCode: 1, message };
79
- }
80
- /**
81
- * Handle success consistently
82
- */
83
- handleSuccess(message, data) {
84
- if (this.outputJson({
85
- status: 'success',
86
- message,
87
- ...data,
88
- })) {
89
- return { exitCode: 0 };
90
- }
91
- logger.info(message);
92
- return { exitCode: 0, message, data };
93
- }
94
- }
95
- exports.BaseCommand = BaseCommand;
@@ -1,68 +0,0 @@
1
- /**
2
-
3
- * Licensed under the Apache License, Version 2.0 (the "License");
4
-
5
- * you may not use this file except in compliance with the License.
6
-
7
- * You may obtain a copy of the License at
8
-
9
- *
10
-
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
-
13
- *
14
-
15
- * Unless required by applicable law or agreed to in writing, software
16
-
17
- * distributed under the License is distributed on an "AS IS" BASIS,
18
-
19
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
-
21
- * See the License for the specific language governing permissions and
22
-
23
- * limitations under the License.
24
-
25
- *
26
-
27
- * Copyright 2025 Daniel Coutinho Ribeiro
28
-
29
- */
30
- import { CReact } from '../../core/CReact';
31
- import { CloudDOMNode } from '../../core/types';
32
- export interface CLIFlags {
33
- entry?: string;
34
- verbose?: boolean;
35
- json?: boolean;
36
- 'dry-run'?: boolean;
37
- 'auto-approve'?: boolean;
38
- auto?: boolean;
39
- help?: boolean;
40
- h?: boolean;
41
- version?: boolean;
42
- V?: boolean;
43
- [key: string]: string | boolean | undefined;
44
- }
45
- export interface CLIContext {
46
- args: string[];
47
- flags: CLIFlags;
48
- }
49
- export interface CLIResult {
50
- instance: CReact;
51
- stackName: string;
52
- cloudDOM: CloudDOMNode[];
53
- entryPath: string;
54
- }
55
- /**
56
- * CLI Context Manager - handles entry file loading and instance creation
57
- */
58
- export declare class CLIContextManager {
59
- /**
60
- * Find entry file with fallback logic
61
- */
62
- static findEntryFile(specifiedPath?: string): string;
63
- /**
64
- * Load entry file and create CReact instance using configured providers
65
- * This is the React way - load configuration, then create instances as needed
66
- */
67
- static createCLIInstance(entryPath: string, verbose?: boolean): Promise<CLIResult>;
68
- }
@@ -1,183 +0,0 @@
1
- "use strict";
2
- /**
3
-
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
-
6
- * you may not use this file except in compliance with the License.
7
-
8
- * You may obtain a copy of the License at
9
-
10
- *
11
-
12
- * http://www.apache.org/licenses/LICENSE-2.0
13
-
14
- *
15
-
16
- * Unless required by applicable law or agreed to in writing, software
17
-
18
- * distributed under the License is distributed on an "AS IS" BASIS,
19
-
20
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
-
22
- * See the License for the specific language governing permissions and
23
-
24
- * limitations under the License.
25
-
26
- *
27
-
28
- * Copyright 2025 Daniel Coutinho Ribeiro
29
-
30
- */
31
- Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.CLIContextManager = void 0;
33
- /**
34
- * CLI Context - shared context for all CLI commands
35
- * Handles entry file loading and CReact instance creation
36
- */
37
- const path_1 = require("path");
38
- const fs_1 = require("fs");
39
- const Logger_1 = require("../../utils/Logger");
40
- const logger = Logger_1.LoggerFactory.getLogger('cli');
41
- /**
42
- * CLI Context Manager - handles entry file loading and instance creation
43
- */
44
- class CLIContextManager {
45
- /**
46
- * Find entry file with fallback logic
47
- */
48
- static findEntryFile(specifiedPath) {
49
- let entryPath = specifiedPath || 'index.ts';
50
- // If default index.ts doesn't exist, try other common entry files
51
- if (entryPath === 'index.ts' && !(0, fs_1.existsSync)((0, path_1.resolve)(process.cwd(), entryPath))) {
52
- const alternatives = ['index.tsx', 'index.js', 'index.jsx', 'app.ts', 'app.tsx'];
53
- for (const alt of alternatives) {
54
- if ((0, fs_1.existsSync)((0, path_1.resolve)(process.cwd(), alt))) {
55
- return alt;
56
- }
57
- }
58
- throw new Error(`Entry file not found: ${entryPath}. Tried: ${alternatives.join(', ')}`);
59
- }
60
- // Final check if entry file exists
61
- if (!(0, fs_1.existsSync)((0, path_1.resolve)(process.cwd(), entryPath))) {
62
- throw new Error(`Entry file not found: ${entryPath}`);
63
- }
64
- return entryPath;
65
- }
66
- /**
67
- * Load entry file and create CReact instance using configured providers
68
- * This is the React way - load configuration, then create instances as needed
69
- */
70
- static async createCLIInstance(entryPath, verbose = false) {
71
- const absoluteEntryPath = (0, path_1.resolve)(process.cwd(), entryPath);
72
- // Handle TypeScript files
73
- const fileExtension = (0, path_1.extname)(entryPath);
74
- const isTypeScript = ['.ts', '.tsx'].includes(fileExtension);
75
- if (isTypeScript) {
76
- try {
77
- const { dirname } = require('path');
78
- const entryDir = dirname(absoluteEntryPath);
79
- const localTsConfig = (0, path_1.resolve)(entryDir, 'tsconfig.json');
80
- // Use ts-node with explicit JSX configuration for CReact
81
- require('ts-node').register({
82
- project: (0, fs_1.existsSync)(localTsConfig) ? localTsConfig : undefined,
83
- transpileOnly: true, // Faster compilation, skip type checking (IDE handles that)
84
- compilerOptions: {
85
- module: 'commonjs',
86
- target: 'es2020',
87
- jsx: 'react',
88
- jsxFactory: 'CReact.createElement',
89
- jsxFragmentFactory: 'CReact.Fragment',
90
- },
91
- });
92
- if (verbose) {
93
- logger.debug(`TypeScript loader registered (ts-node)`);
94
- if ((0, fs_1.existsSync)(localTsConfig)) {
95
- logger.debug(`Using tsconfig: ${localTsConfig}`);
96
- }
97
- }
98
- }
99
- catch (tsNodeError) {
100
- throw new Error('TypeScript entry files require ts-node. Install with: npm install --save-dev ts-node');
101
- }
102
- }
103
- // Clear require cache to allow reloading
104
- delete require.cache[absoluteEntryPath];
105
- if (verbose)
106
- logger.debug('Cleared module cache');
107
- // Load the entry module - this configures the providers
108
- let entryModule;
109
- try {
110
- entryModule = require(absoluteEntryPath);
111
- if (verbose)
112
- logger.debug('Entry module loaded successfully');
113
- }
114
- catch (loadError) {
115
- throw new Error(`Could not load entry file: ${entryPath}\nError: ${loadError.message}`);
116
- }
117
- // IMPORTANT: Get the CReact class from the entry module's require cache
118
- // This ensures we use the same instance that the entry file configured
119
- // The entry file imports CReact, which gets cached in require.cache
120
- // We need to find that cached module and use its CReact instance
121
- let CReactClass = null;
122
- // Look through require.cache to find the CReact module that was loaded
123
- for (const [modulePath, cachedModule] of Object.entries(require.cache)) {
124
- if (modulePath.includes('CReact') && cachedModule?.exports?.CReact) {
125
- CReactClass = cachedModule.exports.CReact;
126
- if (verbose)
127
- logger.debug('Found CReact in require cache:', modulePath);
128
- break;
129
- }
130
- }
131
- if (!CReactClass) {
132
- throw new Error('Could not find CReact class in require cache. Entry file must import CReact.');
133
- }
134
- // Debug: Check provider status
135
- if (verbose) {
136
- logger.debug('Checking providers after module load:');
137
- logger.debug(' cloudProvider:', !!CReactClass.cloudProvider);
138
- logger.debug(' backendProvider:', !!CReactClass.backendProvider);
139
- }
140
- // Validate that providers are configured (they should be after loading entry file)
141
- if (!CReactClass.cloudProvider || !CReactClass.backendProvider) {
142
- throw new Error('CReact providers must be configured in entry file before calling renderCloudDOM');
143
- }
144
- // Create a CLI instance using the same providers (React way)
145
- const instance = new CReactClass({
146
- cloudProvider: CReactClass.cloudProvider,
147
- backendProvider: CReactClass.backendProvider,
148
- migrationMap: CReactClass.migrationMap,
149
- asyncTimeout: CReactClass.asyncTimeout,
150
- });
151
- // Get the JSX element from the entry module
152
- // We need to extract the JSX element that was passed to renderCloudDOM
153
- // For now, we'll get it from the default export promise, but we need the JSX
154
- let cloudDOMPromise = entryModule.default;
155
- // If default export is a function, call it to get the promise
156
- if (typeof cloudDOMPromise === 'function') {
157
- cloudDOMPromise = cloudDOMPromise();
158
- }
159
- if (!cloudDOMPromise || typeof cloudDOMPromise.then !== 'function') {
160
- throw new Error('Entry file must export a default Promise from CReact.renderCloudDOM() or a function that returns one');
161
- }
162
- // Await the CloudDOM promise to ensure providers are configured
163
- const cloudDOM = await cloudDOMPromise;
164
- if (!Array.isArray(cloudDOM)) {
165
- throw new Error('CloudDOM must be an array of nodes');
166
- }
167
- // Get the instance that was used to build the CloudDOM (has the Fiber tree)
168
- const lastInstanceData = CReactClass.getLastInstance();
169
- if (lastInstanceData) {
170
- // Use the same instance that built the CloudDOM
171
- return {
172
- instance: lastInstanceData.instance,
173
- stackName: lastInstanceData.stackName,
174
- cloudDOM,
175
- entryPath,
176
- };
177
- }
178
- // Fallback: Extract stack name from environment or use default
179
- const stackName = process.env.STACK_NAME || 'default';
180
- return { instance, stackName, cloudDOM, entryPath };
181
- }
182
- }
183
- exports.CLIContextManager = CLIContextManager;
@@ -1,64 +0,0 @@
1
- /**
2
-
3
- * Licensed under the Apache License, Version 2.0 (the "License");
4
-
5
- * you may not use this file except in compliance with the License.
6
-
7
- * You may obtain a copy of the License at
8
-
9
- *
10
-
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
-
13
- *
14
-
15
- * Unless required by applicable law or agreed to in writing, software
16
-
17
- * distributed under the License is distributed on an "AS IS" BASIS,
18
-
19
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
-
21
- * See the License for the specific language governing permissions and
22
-
23
- * limitations under the License.
24
-
25
- *
26
-
27
- * Copyright 2025 Daniel Coutinho Ribeiro
28
-
29
- */
30
- /**
31
- * Command Registry - manages available CLI commands
32
- */
33
- import { BaseCommand } from './BaseCommand';
34
- import { CLIContext } from './CLIContext';
35
- export type CommandConstructor = new (context: CLIContext) => BaseCommand;
36
- /**
37
- * Registry of available CLI commands
38
- */
39
- export declare class CommandRegistry {
40
- private static commands;
41
- /**
42
- * Get all available command names
43
- */
44
- static getCommandNames(): string[];
45
- /**
46
- * Check if command exists
47
- */
48
- static hasCommand(name: string): boolean;
49
- /**
50
- * Create command instance
51
- */
52
- static createCommand(name: string, context: CLIContext): BaseCommand;
53
- /**
54
- * Register a new command
55
- */
56
- static registerCommand(name: string, commandClass: CommandConstructor): void;
57
- /**
58
- * Get command help information
59
- */
60
- static getCommandHelp(): Array<{
61
- name: string;
62
- description: string;
63
- }>;
64
- }