@corva/create-app 0.0.0-2576df8

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 (204) hide show
  1. package/README.md +218 -0
  2. package/bin/cca.js +5 -0
  3. package/bin/create-corva-app.cjs +25 -0
  4. package/common/node/.env +15 -0
  5. package/common/node/.env.sample +26 -0
  6. package/common/node/gitignore +130 -0
  7. package/common/package.json +3 -0
  8. package/common/python/.env +5 -0
  9. package/common/python/.env.sample +7 -0
  10. package/common/python/Makefile +15 -0
  11. package/common/python/gitignore +161 -0
  12. package/common/python/requirements.txt +2 -0
  13. package/lib/commands/attach.js +28 -0
  14. package/lib/commands/create.js +463 -0
  15. package/lib/commands/release.js +58 -0
  16. package/lib/commands/rerun.js +34 -0
  17. package/lib/commands/zip.js +39 -0
  18. package/lib/constants/cache.js +5 -0
  19. package/lib/constants/cli.js +35 -0
  20. package/lib/constants/manifest.js +263 -0
  21. package/lib/constants/messages.js +15 -0
  22. package/lib/constants/package.js +288 -0
  23. package/lib/flow.js +53 -0
  24. package/lib/flows/attach.js +8 -0
  25. package/lib/flows/lib/api.js +385 -0
  26. package/lib/flows/lib/create-zip-archive.js +83 -0
  27. package/lib/flows/lib/json.js +30 -0
  28. package/lib/flows/lib/manifest.js +81 -0
  29. package/lib/flows/lib/notification.js +142 -0
  30. package/lib/flows/lib/step-error.js +10 -0
  31. package/lib/flows/lib/waitForMs.js +3 -0
  32. package/lib/flows/prepare.js +6 -0
  33. package/lib/flows/release.js +26 -0
  34. package/lib/flows/rerun.js +8 -0
  35. package/lib/flows/steps/attach/add-app-to-stream.js +23 -0
  36. package/lib/flows/steps/attach/get-all-live-assets.js +135 -0
  37. package/lib/flows/steps/attach/index.js +5 -0
  38. package/lib/flows/steps/attach/prepare-data.js +19 -0
  39. package/lib/flows/steps/prepare-load-app-files.js +12 -0
  40. package/lib/flows/steps/release/add-label.js +10 -0
  41. package/lib/flows/steps/release/add-notes.js +10 -0
  42. package/lib/flows/steps/release/get-config.js +41 -0
  43. package/lib/flows/steps/release/prepare-data.js +12 -0
  44. package/lib/flows/steps/release/publish.js +11 -0
  45. package/lib/flows/steps/release/remove-failed-upload.js +21 -0
  46. package/lib/flows/steps/release/upload-zip-to-corva.js +136 -0
  47. package/lib/flows/steps/release/wait-for-build.js +36 -0
  48. package/lib/flows/steps/rerun/create-task.js +77 -0
  49. package/lib/flows/steps/rerun/ensure-that-app-in-stream.js +68 -0
  50. package/lib/flows/steps/rerun/get-app-version.js +111 -0
  51. package/lib/flows/steps/rerun/prepare-data.js +162 -0
  52. package/lib/flows/steps/rerun/prepare-well-and-stream-data.js +188 -0
  53. package/lib/flows/steps/rerun/rerun.js +13 -0
  54. package/lib/flows/steps/zip-cleanup.js +17 -0
  55. package/lib/flows/steps/zip-create-archive.js +15 -0
  56. package/lib/flows/steps/zip-file-list-resolve.js +266 -0
  57. package/lib/flows/steps/zip-prepare.js +20 -0
  58. package/lib/flows/steps/zip.js +6 -0
  59. package/lib/flows/zip-simple.js +6 -0
  60. package/lib/flows/zip.js +7 -0
  61. package/lib/helpers/cli-version.js +150 -0
  62. package/lib/helpers/commands.js +13 -0
  63. package/lib/helpers/logger.js +35 -0
  64. package/lib/helpers/manifest.js +82 -0
  65. package/lib/helpers/resolve-app-runtime.js +132 -0
  66. package/lib/helpers/utils.js +97 -0
  67. package/lib/helpers/versioning.js +94 -0
  68. package/lib/main.js +64 -0
  69. package/lib/options/api-key.js +6 -0
  70. package/lib/options/app-key.js +6 -0
  71. package/lib/options/app-version.js +3 -0
  72. package/lib/options/bump-version.js +19 -0
  73. package/lib/options/cache.js +11 -0
  74. package/lib/options/env.js +3 -0
  75. package/lib/options/original-cwd.js +3 -0
  76. package/lib/options/silent.js +3 -0
  77. package/package.json +1 -0
  78. package/template_extensions/corva/.commitlintrc.json +6 -0
  79. package/template_extensions/corva/.eslintrc +32 -0
  80. package/template_extensions/corva/.github/pull_request_template.md +14 -0
  81. package/template_extensions/corva/.github/workflows/code-checks.yml +15 -0
  82. package/template_extensions/corva/.github/workflows/develop.yml +19 -0
  83. package/template_extensions/corva/.github/workflows/feat-fix-delete.yml +14 -0
  84. package/template_extensions/corva/.github/workflows/feat-fix.yml +23 -0
  85. package/template_extensions/corva/.github/workflows/release-fix-X.X.X.yml +16 -0
  86. package/template_extensions/corva/.github/workflows/validate-pr-title.yml +19 -0
  87. package/template_extensions/corva/.husky/commit-msg +5 -0
  88. package/template_extensions/corva/.husky/pre-commit +4 -0
  89. package/template_extensions/corva/.release-please-manifest.json +3 -0
  90. package/template_extensions/corva/release-please-config.json +10 -0
  91. package/templates/scheduler_data-time/javascript/README.md +19 -0
  92. package/templates/scheduler_data-time/javascript/__tests__/processor.spec.js +15 -0
  93. package/templates/scheduler_data-time/javascript/index.js +15 -0
  94. package/templates/scheduler_data-time/python/README.md +31 -0
  95. package/templates/scheduler_data-time/python/lambda_function.py +7 -0
  96. package/templates/scheduler_data-time/python/test/__init__.py +0 -0
  97. package/templates/scheduler_data-time/python/test/app_test.py +10 -0
  98. package/templates/scheduler_data-time/typescript/README.md +25 -0
  99. package/templates/scheduler_data-time/typescript/__tests__/processor.spec.ts +15 -0
  100. package/templates/scheduler_data-time/typescript/index.ts +8 -0
  101. package/templates/scheduler_depth/javascript/README.md +19 -0
  102. package/templates/scheduler_depth/javascript/__tests__/processor.spec.js +17 -0
  103. package/templates/scheduler_depth/javascript/index.js +15 -0
  104. package/templates/scheduler_depth/python/README.md +31 -0
  105. package/templates/scheduler_depth/python/lambda_function.py +7 -0
  106. package/templates/scheduler_depth/python/test/__init__.py +0 -0
  107. package/templates/scheduler_depth/python/test/app_test.py +10 -0
  108. package/templates/scheduler_depth/typescript/README.md +25 -0
  109. package/templates/scheduler_depth/typescript/__tests__/processor.spec.ts +17 -0
  110. package/templates/scheduler_depth/typescript/index.ts +8 -0
  111. package/templates/scheduler_natural-time/javascript/README.md +19 -0
  112. package/templates/scheduler_natural-time/javascript/__tests__/processor.spec.js +15 -0
  113. package/templates/scheduler_natural-time/javascript/index.js +15 -0
  114. package/templates/scheduler_natural-time/python/README.md +31 -0
  115. package/templates/scheduler_natural-time/python/lambda_function.py +7 -0
  116. package/templates/scheduler_natural-time/python/test/__init__.py +0 -0
  117. package/templates/scheduler_natural-time/python/test/app_test.py +10 -0
  118. package/templates/scheduler_natural-time/typescript/README.md +25 -0
  119. package/templates/scheduler_natural-time/typescript/__tests__/processor.spec.ts +15 -0
  120. package/templates/scheduler_natural-time/typescript/index.ts +8 -0
  121. package/templates/stream_depth/javascript/README.md +19 -0
  122. package/templates/stream_depth/javascript/__tests__/processor.spec.js +20 -0
  123. package/templates/stream_depth/javascript/index.js +14 -0
  124. package/templates/stream_depth/python/README.md +31 -0
  125. package/templates/stream_depth/python/lambda_function.py +7 -0
  126. package/templates/stream_depth/python/test/__init__.py +0 -0
  127. package/templates/stream_depth/python/test/app_test.py +16 -0
  128. package/templates/stream_depth/typescript/README.md +25 -0
  129. package/templates/stream_depth/typescript/__tests__/processor.spec.ts +20 -0
  130. package/templates/stream_depth/typescript/index.ts +8 -0
  131. package/templates/stream_time/javascript/README.md +19 -0
  132. package/templates/stream_time/javascript/__tests__/processor.spec.js +14 -0
  133. package/templates/stream_time/javascript/index.js +14 -0
  134. package/templates/stream_time/python/README.md +31 -0
  135. package/templates/stream_time/python/lambda_function.py +7 -0
  136. package/templates/stream_time/python/test/__init__.py +0 -0
  137. package/templates/stream_time/python/test/app_test.py +16 -0
  138. package/templates/stream_time/typescript/README.md +25 -0
  139. package/templates/stream_time/typescript/__tests__/processor.spec.ts +14 -0
  140. package/templates/stream_time/typescript/index.ts +8 -0
  141. package/templates/task/javascript/README.md +19 -0
  142. package/templates/task/javascript/__tests__/processor.spec.js +16 -0
  143. package/templates/task/javascript/index.js +15 -0
  144. package/templates/task/python/README.md +31 -0
  145. package/templates/task/python/lambda_function.py +7 -0
  146. package/templates/task/python/test/__init__.py +0 -0
  147. package/templates/task/python/test/app_test.py +8 -0
  148. package/templates/task/typescript/README.md +25 -0
  149. package/templates/task/typescript/__tests__/processor.spec.ts +16 -0
  150. package/templates/task/typescript/index.ts +8 -0
  151. package/templates/ui/javascript/.codex/config.toml +3 -0
  152. package/templates/ui/javascript/.cursor/mcp.json +8 -0
  153. package/templates/ui/javascript/.eslintrc +11 -0
  154. package/templates/ui/javascript/.mcp.json +8 -0
  155. package/templates/ui/javascript/.prettierrc +1 -0
  156. package/templates/ui/javascript/AGENTS.md +304 -0
  157. package/templates/ui/javascript/CLAUDE.md +1 -0
  158. package/templates/ui/javascript/README.md +31 -0
  159. package/templates/ui/javascript/config/jest/babelTransform.js +16 -0
  160. package/templates/ui/javascript/config/jest/cssTransform.js +16 -0
  161. package/templates/ui/javascript/config/jest/fileTransform.js +48 -0
  162. package/templates/ui/javascript/config/jest/globalSetup.js +5 -0
  163. package/templates/ui/javascript/config/jest/setupTests.js +30 -0
  164. package/templates/ui/javascript/config-overrides.js +10 -0
  165. package/templates/ui/javascript/gitignore +27 -0
  166. package/templates/ui/javascript/src/App.completion.js +52 -0
  167. package/templates/ui/javascript/src/App.drilling.js +49 -0
  168. package/templates/ui/javascript/src/App.scss +17 -0
  169. package/templates/ui/javascript/src/AppSettings.js +28 -0
  170. package/templates/ui/javascript/src/__tests__/App.test.js +26 -0
  171. package/templates/ui/javascript/src/__tests__/AppSettings.test.js +28 -0
  172. package/templates/ui/javascript/src/__tests__/TestsExample.test.js +37 -0
  173. package/templates/ui/javascript/src/assets/logo.svg +7 -0
  174. package/templates/ui/javascript/src/constants.js +3 -0
  175. package/templates/ui/javascript/src/index.js +8 -0
  176. package/templates/ui/typescript/.codex/config.toml +3 -0
  177. package/templates/ui/typescript/.cursor/mcp.json +8 -0
  178. package/templates/ui/typescript/.eslintrc +28 -0
  179. package/templates/ui/typescript/.mcp.json +8 -0
  180. package/templates/ui/typescript/.prettierrc +1 -0
  181. package/templates/ui/typescript/AGENTS.md +344 -0
  182. package/templates/ui/typescript/CLAUDE.md +1 -0
  183. package/templates/ui/typescript/README.md +31 -0
  184. package/templates/ui/typescript/config/jest/babelTransform.js +16 -0
  185. package/templates/ui/typescript/config/jest/cssTransform.js +16 -0
  186. package/templates/ui/typescript/config/jest/fileTransform.js +48 -0
  187. package/templates/ui/typescript/config/jest/globalSetup.js +5 -0
  188. package/templates/ui/typescript/config/jest/setupTests.js +30 -0
  189. package/templates/ui/typescript/config-overrides.js +10 -0
  190. package/templates/ui/typescript/gitignore +27 -0
  191. package/templates/ui/typescript/src/App.completion.tsx +52 -0
  192. package/templates/ui/typescript/src/App.drilling.tsx +49 -0
  193. package/templates/ui/typescript/src/App.scss +17 -0
  194. package/templates/ui/typescript/src/AppSettings.tsx +28 -0
  195. package/templates/ui/typescript/src/__mocks__/mockData.ts +22 -0
  196. package/templates/ui/typescript/src/__tests__/App.test.tsx +27 -0
  197. package/templates/ui/typescript/src/__tests__/AppSettings.test.tsx +28 -0
  198. package/templates/ui/typescript/src/__tests__/TestsExample.test.tsx +37 -0
  199. package/templates/ui/typescript/src/assets/logo.svg +7 -0
  200. package/templates/ui/typescript/src/constants.ts +3 -0
  201. package/templates/ui/typescript/src/custom.d.ts +19 -0
  202. package/templates/ui/typescript/src/index.js +8 -0
  203. package/templates/ui/typescript/src/types.ts +3 -0
  204. package/templates/ui/typescript/tsconfig.json +7 -0
@@ -0,0 +1,31 @@
1
+ # Getting Started with Create Corva App
2
+
3
+ ## Available Scripts
4
+
5
+ In the project directory, you can run:
6
+
7
+ ### `yarn start`
8
+
9
+ Runs the app in the development mode.\
10
+ Open [http://app.local.corva.ai:8080](http://app.local.corva.ai:8080/) to view it in the browser.
11
+
12
+ The page will reload if you make edits.\
13
+ You will also see any lint errors in the console.
14
+
15
+ ### `yarn build`
16
+
17
+ Bundles the app into static files for production.
18
+
19
+ ### `yarn zip`
20
+
21
+ Bundles the app into ZIP file in app root directory
22
+
23
+ ### `yarn release`
24
+
25
+ Releases the app into Corva
26
+
27
+ ## Documentation
28
+
29
+ - [Dev Center documentation](https://dc-docs.corva.ai/) – information about development process
30
+ - [Component Library](https://dc-docs.corva.ai/docs/Frontend/Data%20visualization/Components%20library)
31
+ - [Datasets documentation](https://dc-docs.corva.ai/docs/Datasets/Link%20App%20to%20Dataset)
@@ -0,0 +1,16 @@
1
+ /* eslint-disable */
2
+
3
+ const babelJest = require('babel-jest').default;
4
+
5
+ module.exports = babelJest.createTransformer({
6
+ presets: [
7
+ [
8
+ require.resolve('babel-preset-react-app'),
9
+ {
10
+ runtime: 'automatic',
11
+ },
12
+ ],
13
+ ],
14
+ babelrc: false,
15
+ configFile: false,
16
+ });
@@ -0,0 +1,16 @@
1
+ /* eslint-disable */
2
+
3
+ // This is a custom Jest transformer turning style imports into empty objects.
4
+ // http://facebook.github.io/jest/docs/en/webpack.html
5
+
6
+ module.exports = {
7
+ process() {
8
+ return {
9
+ code: 'module.exports = {};',
10
+ };
11
+ },
12
+ getCacheKey() {
13
+ // The output is always the same.
14
+ return 'cssTransform';
15
+ },
16
+ };
@@ -0,0 +1,48 @@
1
+ /* eslint-disable */
2
+
3
+ const path = require('path');
4
+
5
+ // This is a custom Jest transformer turning file imports into filenames.
6
+ // http://facebook.github.io/jest/docs/en/webpack.html
7
+
8
+ const toPascalCase = str => {
9
+ const allWordsIterator = str.matchAll(/\w+/g);
10
+
11
+ return Array.from(allWordsIterator).reduce((acc, matchResult) => {
12
+ const word = matchResult[0];
13
+ return acc + word[0].toUpperCase() + word.slice(1).toLowerCase();
14
+ }, '');
15
+ };
16
+
17
+ module.exports = {
18
+ process(src, filename) {
19
+ const assetFilename = JSON.stringify(path.basename(filename));
20
+
21
+ if (filename.match(/\.svg$/)) {
22
+ // Based on how SVGR generates a component name:
23
+ // https://github.com/smooth-code/svgr/blob/01b194cf967347d43d4cbe6b434404731b87cf27/packages/core/src/state.js#L6
24
+ const pascalCaseFilename = toPascalCase(path.parse(filename).name);
25
+ const componentName = `Svg${pascalCaseFilename}`;
26
+ return {
27
+ code: `const React = require('react');
28
+ module.exports = {
29
+ __esModule: true,
30
+ default: ${assetFilename},
31
+ ReactComponent: React.forwardRef(function ${componentName}(props, ref) {
32
+ return {
33
+ $$typeof: Symbol.for('react.element'),
34
+ type: 'svg',
35
+ ref: ref,
36
+ key: null,
37
+ props: Object.assign({}, props, {
38
+ children: ${assetFilename}
39
+ })
40
+ };
41
+ }),
42
+ };`,
43
+ };
44
+ }
45
+
46
+ return { code: `module.exports = ${assetFilename};` };
47
+ },
48
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = async () => {
2
+ // use UTC timezone to not break tests when you run them on
3
+ // an environemnt with a different timezone
4
+ process.env.TZ = 'UTC';
5
+ };
@@ -0,0 +1,30 @@
1
+ /* eslint-disable */
2
+
3
+ // jest-dom adds custom jest matchers for asserting on DOM nodes.
4
+ // allows you to do things like:
5
+ // expect(element).toHaveTextContent(/react/i)
6
+ // learn more: https://github.com/testing-library/jest-dom
7
+ // eslint-disable-next-line
8
+ import '@testing-library/jest-dom/extend-expect';
9
+
10
+ // Set UTC timezone for tests to not use the environment timezone
11
+ process.env.TZ = 'UTC';
12
+
13
+ // Mock ResizeObserver & MutationObserver
14
+ class FakeObserver {
15
+ observe() {}
16
+ unobserve() {}
17
+ disconnect() {}
18
+ }
19
+
20
+ global.ResizeObserver = FakeObserver;
21
+ global.MutationObserver = FakeObserver;
22
+
23
+ // Suppressing "Could not parse CSS stylesheet" from JSDOM
24
+ const originalConsoleError = global.console.error;
25
+ global.console.error = (message, ...optionalParams) => {
26
+ if (message.includes('Could not parse CSS stylesheet')) {
27
+ return;
28
+ }
29
+ originalConsoleError(message, ...optionalParams);
30
+ };
@@ -0,0 +1,10 @@
1
+ const { getWebpackConfig } = require('@corva/dc-platform-shared/cjs');
2
+ const { merge } = require('webpack-merge');
3
+
4
+ module.exports = (env, argv) => {
5
+ return merge(
6
+ getWebpackConfig(env, argv),
7
+ // NOTE: Custom webpack 5 plugins and module rules can be provided here
8
+ {}
9
+ );
10
+ };
@@ -0,0 +1,27 @@
1
+ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2
+
3
+ # dependencies
4
+ /node_modules
5
+ /.pnp
6
+ .pnp.js
7
+
8
+ # testing
9
+ /coverage
10
+
11
+ # production
12
+ /build
13
+ /dist
14
+
15
+ # misc
16
+ .env
17
+ .DS_Store
18
+ .env.local
19
+ .env.development.local
20
+ .env.test.local
21
+ .env.production.local
22
+ .idea
23
+
24
+ npm-debug.log*
25
+ yarn-debug.log*
26
+ yarn-error.log*
27
+ .eslintcache
@@ -0,0 +1,52 @@
1
+ import { AppContainer, AppHeader } from '@corva/ui/componentsV2';
2
+ import { useAppCommons } from '@corva/ui/effects';
3
+
4
+ import { DEFAULT_SETTINGS } from './constants';
5
+ import logo from './assets/logo.svg';
6
+
7
+ import styles from './App.scss';
8
+
9
+ const App = () => {
10
+ const { appKey, fracFleet, well, wells, appSettings } = useAppCommons();
11
+ const { isExampleCheckboxChecked = DEFAULT_SETTINGS.isExampleCheckboxChecked } =
12
+ appSettings || {};
13
+ // NOTE: On general type dashboard app receives wells array
14
+ // on asset type dashboard app receives well object
15
+ const wellsList = wells || [well];
16
+
17
+ return (
18
+ <AppContainer header={<AppHeader />} testId={appKey}>
19
+ <div className={styles.container}>
20
+ <img src={logo} alt="logo" className={styles.logo} />
21
+ <p>
22
+ Edit <code>src/App.js</code> and save to reload.
23
+ <br />
24
+ <br />
25
+ </p>
26
+ <p>
27
+ Frac Fleet: <span data-testid="fracFleet">{fracFleet?.name || 'No Frac Fleet'}</span>
28
+ <br />
29
+ Wells: <span data-testid="wellsList">{wellsList.map(well => well?.name).join(', ')}</span>
30
+ </p>
31
+ <a
32
+ className="App-link"
33
+ href="https://reactjs.org"
34
+ target="_blank"
35
+ rel="noopener noreferrer"
36
+ >
37
+ Learn React
38
+ </a>
39
+ </div>
40
+ <div>
41
+ Settings &quot;Example&quot; checkbox is{' '}
42
+ <span data-testid="exampleCheckboxChecked">
43
+ {isExampleCheckboxChecked ? 'checked' : 'unchecked'}
44
+ </span>
45
+ </div>
46
+ </AppContainer>
47
+ );
48
+ };
49
+
50
+ // Important: Do not change root component default export (App.js). Use it as container
51
+ // for your App. It's required to make build and zip scripts work as expected;
52
+ export default App;
@@ -0,0 +1,49 @@
1
+ import { AppContainer, AppHeader } from '@corva/ui/componentsV2';
2
+ import { useAppCommons } from '@corva/ui/effects';
3
+
4
+ import { DEFAULT_SETTINGS } from './constants';
5
+ import logo from './assets/logo.svg';
6
+
7
+ import styles from './App.scss';
8
+
9
+ const App = () => {
10
+ const { appKey, rig, well, appSettings } = useAppCommons();
11
+ const { isExampleCheckboxChecked = DEFAULT_SETTINGS.isExampleCheckboxChecked } =
12
+ appSettings || {};
13
+
14
+ return (
15
+ <AppContainer header={<AppHeader />} testId={appKey}>
16
+ <div className={styles.container}>
17
+ <img src={logo} alt="logo" className={styles.logo} />
18
+ <p>
19
+ Edit <code>src/App.js</code> and save to reload.
20
+ <br />
21
+ <br />
22
+ </p>
23
+ <p>
24
+ Rig: <span data-testid="rig">{rig?.name}</span>
25
+ <br />
26
+ Well: <span data-testid="well">{well?.name}</span>
27
+ </p>
28
+ <a
29
+ className="App-link"
30
+ href="https://reactjs.org"
31
+ target="_blank"
32
+ rel="noopener noreferrer"
33
+ >
34
+ Learn React
35
+ </a>
36
+ </div>
37
+ <div>
38
+ Settings &quot;Example&quot; checkbox is{' '}
39
+ <span data-testid="exampleCheckboxState">
40
+ {isExampleCheckboxChecked ? 'checked' : 'unchecked'}
41
+ </span>
42
+ </div>
43
+ </AppContainer>
44
+ );
45
+ };
46
+
47
+ // Important: Do not change root component default export (App.js). Use it as container
48
+ // for your App. It's required to make build and zip scripts work as expected;
49
+ export default App;
@@ -0,0 +1,17 @@
1
+ .container {
2
+ text-align: center;
3
+ }
4
+
5
+ @keyframes App-logo-spin {
6
+ from {
7
+ transform: rotate(0deg);
8
+ }
9
+ to {
10
+ transform: rotate(-360deg);
11
+ }
12
+ }
13
+
14
+ .logo {
15
+ animation: App-logo-spin infinite 20s linear;
16
+ height: 50px;
17
+ }
@@ -0,0 +1,28 @@
1
+ import { Checkbox, FormControlLabel } from '@material-ui/core';
2
+ import { useAppCommons } from '@corva/ui/effects';
3
+
4
+ import { DEFAULT_SETTINGS } from './constants';
5
+
6
+ const AppSettings = () => {
7
+ const { appSettings, onSettingChange } = useAppCommons();
8
+ const settings = { ...DEFAULT_SETTINGS, ...appSettings };
9
+
10
+ return (
11
+ <div>
12
+ <FormControlLabel
13
+ label="Example checkbox"
14
+ control={
15
+ <Checkbox
16
+ data-testid="exampleCheckbox"
17
+ checked={settings.isExampleCheckboxChecked}
18
+ onChange={e => onSettingChange('isExampleCheckboxChecked', e.target.checked)}
19
+ />
20
+ }
21
+ />
22
+ </div>
23
+ );
24
+ };
25
+
26
+ // Important: Do not change root component default export (AppSettings.js). Use it as container
27
+ // for your App Settings. It's required to make build and zip scripts work as expected;
28
+ export default AppSettings;
@@ -0,0 +1,26 @@
1
+ import { render, screen } from '@testing-library/react';
2
+ import { AppTestWrapper } from '@corva/ui/testing';
3
+
4
+ import App from '../App';
5
+
6
+ describe('<App />', () => {
7
+ it('should show correct layout', () => {
8
+ render(
9
+ <AppTestWrapper appSettings={{ isExampleCheckboxChecked: true }}>
10
+ <App />
11
+ </AppTestWrapper>
12
+ );
13
+
14
+ screen.getByText(/checked/i);
15
+ });
16
+
17
+ it('should show correct layout when settings are not provided', () => {
18
+ render(
19
+ <AppTestWrapper appSettings={{}}>
20
+ <App />
21
+ </AppTestWrapper>
22
+ );
23
+
24
+ screen.getByText(/unchecked/i);
25
+ });
26
+ });
@@ -0,0 +1,28 @@
1
+ import { render, screen, act } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
3
+ import { AppTestWrapper } from '@corva/ui/testing';
4
+
5
+ import AppSettings from '../AppSettings';
6
+
7
+ describe('<AppSettings />', () => {
8
+ it('should call onChange with a changed setting on settings change', async () => {
9
+ const handleSettingChange = jest.fn();
10
+
11
+ render(
12
+ <AppTestWrapper
13
+ appSettings={{ isExampleCheckboxChecked: true }}
14
+ onSettingChange={handleSettingChange}
15
+ >
16
+ <AppSettings />
17
+ </AppTestWrapper>
18
+ );
19
+
20
+ const exampleCheckbox = screen.getByRole('checkbox', { name: /example/i });
21
+
22
+ await act(async () => {
23
+ await userEvent.click(exampleCheckbox);
24
+ });
25
+
26
+ expect(handleSettingChange).toBeCalledWith('isExampleCheckboxChecked', false);
27
+ });
28
+ });
@@ -0,0 +1,37 @@
1
+ import { useState } from 'react';
2
+ import { render, screen, waitFor } from '@testing-library/react';
3
+ import { Button } from '@corva/ui/componentsV2';
4
+ import userEvent from '@testing-library/user-event';
5
+
6
+ const Toggle = () => {
7
+ const [isOn, setIsOn] = useState(false);
8
+
9
+ return (
10
+ <>
11
+ {isOn ? 'ON' : 'OFF'}
12
+ <Button onClick={() => setIsOn(value => !value)}>toggle</Button>
13
+ </>
14
+ );
15
+ };
16
+
17
+ describe('Tests examples', () => {
18
+ it('should use UTC timezone by default to not depend on the environment timezone', () => {
19
+ expect(Intl.DateTimeFormat().resolvedOptions().timeZone).toBe('UTC');
20
+ });
21
+
22
+ describe('<Toggle />', () => {
23
+ it('should be OFF by default', () => {
24
+ render(<Toggle />);
25
+
26
+ expect(screen.getByText('OFF')).toBeInTheDocument();
27
+ });
28
+
29
+ it('should switch to ON after a single press', async () => {
30
+ render(<Toggle />);
31
+
32
+ userEvent.click(screen.getByText('toggle'));
33
+
34
+ await waitFor(() => screen.getByText('ON'));
35
+ });
36
+ });
37
+ });
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3">
2
+ <g fill="#61DAFB">
3
+ <path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/>
4
+ <circle cx="420.9" cy="296.5" r="45.7"/>
5
+ <path d="M520.5 78.1z"/>
6
+ </g>
7
+ </svg>
@@ -0,0 +1,3 @@
1
+ export const DEFAULT_SETTINGS = {
2
+ isExampleCheckboxChecked: false,
3
+ };
@@ -0,0 +1,8 @@
1
+ // DO NOT modify this structure
2
+ import App from './App';
3
+ import AppSettings from './AppSettings';
4
+
5
+ export default {
6
+ component: App,
7
+ settings: AppSettings,
8
+ };
@@ -0,0 +1,3 @@
1
+ [mcp_servers.corva-ui]
2
+ command = "npx"
3
+ args = ["-p", "@corva/ui", "corva-ui-mcp"]
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "corva-ui": {
4
+ "command": "npx",
5
+ "args": ["-p", "@corva/ui", "corva-ui-mcp"]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "root": true,
3
+ "parser": "@typescript-eslint/parser",
4
+ "parserOptions": {
5
+ "ecmaVersion": 2020,
6
+ "sourceType": "module",
7
+ "ecmaFeature": {
8
+ "jsx": true
9
+ }
10
+ },
11
+ "extends": ["@corva/eslint-config-browser"],
12
+ "overrides": [
13
+ {
14
+ "files": ["*.ts", "*.tsx"],
15
+ "extends": ["@corva/eslint-config-browser", "plugin:@typescript-eslint/recommended"],
16
+ "rules": {
17
+ "@typescript-eslint/no-explicit-any": "off",
18
+ "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx", ".ts", ".tsx"] }],
19
+ /* Turned off until adopted by @corva/eslint-config-browser */
20
+ "react/prop-types": 0,
21
+ "react/default-props-match-prop-types": 0,
22
+ "react/no-unused-prop-types": 0,
23
+ "react/require-default-props": 0
24
+ /* Turned off until adopted by @corva/eslint-config-browser */
25
+ }
26
+ }
27
+ ]
28
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "corva-ui": {
4
+ "command": "npx",
5
+ "args": ["-p", "@corva/ui", "corva-ui-mcp"]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1 @@
1
+ "@corva/eslint-config-browser/prettier"