@ronas-it/nx-generators 0.22.0-alpha.1 → 0.22.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +1 -1
- package/src/generators/expo-app/app-files/README.md.template +13 -0
- package/src/generators/expo-app/app-files/app/_layout.tsx.template +23 -6
- package/src/generators/expo-app/easignore.d.ts +2 -0
- package/src/generators/expo-app/easignore.js +67 -0
- package/src/generators/expo-app/easignore.js.map +1 -0
- package/src/generators/expo-app/generator.js +3 -0
- package/src/generators/expo-app/generator.js.map +1 -1
- package/src/shared/dependencies.d.ts +4 -0
- package/src/shared/dependencies.js +4 -0
- package/src/shared/dependencies.js.map +1 -1
- package/src/shared/generators/index.d.ts +1 -0
- package/src/shared/generators/index.js +1 -0
- package/src/shared/generators/index.js.map +1 -1
- package/src/shared/generators/rn-styles/lib-files/shared/ui/styles/src/lib/fonts/Gilroy-Bold.ttf +0 -0
- package/src/shared/generators/rn-styles/lib-files/shared/ui/styles/src/lib/fonts/Gilroy-Regular.ttf +0 -0
- package/src/shared/generators/rn-styles/lib-files/shared/ui/styles/src/lib/fonts/Gilroy-Semibold.ttf +0 -0
- package/src/shared/generators/rn-styles/lib-files/shared/ui/styles/src/lib/fonts/fonts.ts.template +7 -0
- package/src/shared/generators/rn-styles/lib-files/shared/ui/styles/src/lib/fonts/index.ts.template +1 -0
- package/src/shared/generators/rn-styles/lib-files/shared/ui/styles/src/lib/index.ts.template +1 -0
- package/src/shared/generators/rn-styles/lib-files/shared/ui/styles/src/lib/variables.ts.template +3 -3
- package/src/shared/generators/ui-kit/app-files/.babelrc.js.template +16 -0
- package/src/shared/generators/ui-kit/generator.d.ts +6 -0
- package/src/shared/generators/ui-kit/generator.js +40 -0
- package/src/shared/generators/ui-kit/generator.js.map +1 -0
- package/src/shared/generators/ui-kit/index.d.ts +1 -0
- package/src/shared/generators/ui-kit/index.js +5 -0
- package/src/shared/generators/ui-kit/index.js.map +1 -0
- package/src/shared/generators/ui-kit/layout-files/index.tsx.template +51 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/assets/icons/eye-off.svg.template +23 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/assets/icons/eye.svg.template +13 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/assets/icons/index.ts.template +7 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/assets/index.ts.template +1 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/button/component.tsx.template +122 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/button/index.ts.template +1 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/icon/component.tsx.template +21 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/icon/index.ts.template +1 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/icon/types/icon-name.ts.template +3 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/icon/types/index.ts.template +1 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/index.ts.template +9 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/pressable/component.tsx.template +26 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/pressable/index.ts.template +1 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/pressable-icon/component.tsx.template +17 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/pressable-icon/index.ts.template +1 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/screen/component.tsx.template +61 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/screen/index.ts.template +1 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/spinner/component.tsx.template +29 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/spinner/index.ts.template +1 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/text/component.tsx.template +107 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/text/index.ts.template +1 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/text-input/component.tsx.template +156 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/text-input/hooks/index.ts.template +1 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/text-input/hooks/use-animated-label.ts.template +32 -0
- package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/text-input/index.ts.template +1 -0
- package/src/shared/tests-utils/utils.js +5 -0
- package/src/shared/tests-utils/utils.js.map +1 -1
package/README.md
CHANGED
|
@@ -102,7 +102,7 @@ Configures code checks and formatting with pre-commit hook.
|
|
|
102
102
|
### 3. `expo-app`
|
|
103
103
|
|
|
104
104
|
Generates and configures an Expo React Native app.
|
|
105
|
-
Also generates [navigation utilities](#navigation-utilities).
|
|
105
|
+
Also generates [navigation utilities](#navigation-utilities) and `.easignore` file for optimized [EAS Build](https://docs.expo.dev/build-reference/easignore/) uploads.
|
|
106
106
|
|
|
107
107
|
#### Options
|
|
108
108
|
|
package/package.json
CHANGED
|
@@ -55,6 +55,19 @@ Create builds using [EAS Build](https://docs.expo.dev/build/introduction/):
|
|
|
55
55
|
|
|
56
56
|
**Tip**: you can [create builds locally](https://docs.expo.dev/build-reference/local-builds/) by passing `--local` flag when starting build command.
|
|
57
57
|
|
|
58
|
+
#### EAS Ignore
|
|
59
|
+
|
|
60
|
+
The `.easignore` file in the repository root controls which files are uploaded to [EAS Build](https://docs.expo.dev/build-reference/easignore/) servers.
|
|
61
|
+
It uses a whitelist approach — everything is ignored by default, and only files required for the mobile build are included:
|
|
62
|
+
|
|
63
|
+
- App directory (`apps/{app-name}`)
|
|
64
|
+
- App-specific and shared libraries (`libs/{app-name}`, `libs/shared`)
|
|
65
|
+
- Translations (`i18n/{app-name}`, `i18n/shared`)
|
|
66
|
+
- Dependency patches and root config files
|
|
67
|
+
|
|
68
|
+
The file is generated automatically by the `expo-app` generator and supports multiple apps in a monorepo.
|
|
69
|
+
When a new app is added, only its app-specific entries are appended — common entries are not duplicated.
|
|
70
|
+
|
|
58
71
|
### 3. Distribute
|
|
59
72
|
|
|
60
73
|
#### Internal
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
<% if(isStoreEnabled) { %> import { store } from '<%= libPath %>/shared/data-access/store';<% } %>
|
|
2
|
-
import '<%= libPath %>/shared/ui/styles';
|
|
2
|
+
import { fonts } from '<%= libPath %>/shared/ui/styles';
|
|
3
3
|
import { setLanguage } from '@ronas-it/react-native-common-modules/i18n';
|
|
4
|
+
import { useFonts } from 'expo-font';
|
|
4
5
|
import { Stack } from 'expo-router';
|
|
6
|
+
import * as SplashScreen from 'expo-splash-screen';
|
|
5
7
|
import { StatusBar } from 'expo-status-bar';
|
|
6
|
-
import { ReactElement } from 'react';
|
|
8
|
+
import { ReactElement, useEffect } from 'react';
|
|
7
9
|
<% if(isStoreEnabled) { %>import { Provider } from 'react-redux';<% } %>
|
|
8
10
|
|
|
9
11
|
export { ErrorBoundary } from 'expo-router';
|
|
@@ -17,10 +19,8 @@ const translations = {
|
|
|
17
19
|
|
|
18
20
|
const useLanguage = setLanguage(translations, 'en');
|
|
19
21
|
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
initialRouteName: 'index',
|
|
23
|
-
};
|
|
22
|
+
// Prevent the splash screen from auto-hiding before asset loading is complete.
|
|
23
|
+
SplashScreen.preventAutoHideAsync();
|
|
24
24
|
|
|
25
25
|
function App(): ReactElement {
|
|
26
26
|
useLanguage('en');
|
|
@@ -33,6 +33,23 @@ function App(): ReactElement {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
export default function RootLayout(): ReactElement | null {
|
|
36
|
+
const [loaded, error] = useFonts(fonts);
|
|
37
|
+
|
|
38
|
+
// Expo Router uses Error Boundaries to catch errors in the navigation tree.
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (error) throw error;
|
|
41
|
+
}, [error]);
|
|
42
|
+
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if (loaded) {
|
|
45
|
+
SplashScreen.hideAsync();
|
|
46
|
+
}
|
|
47
|
+
}, [loaded]);
|
|
48
|
+
|
|
49
|
+
if (!loaded) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
|
|
36
53
|
return (
|
|
37
54
|
<% if(isStoreEnabled) { %><Provider store={store}><% } %>
|
|
38
55
|
<StatusBar style='light' />
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateEasignore = generateEasignore;
|
|
4
|
+
const EASIGNORE_PATH = '.easignore';
|
|
5
|
+
const COMMON_LINES = `# Whitelist — ignore everything except what's needed for the mobile EAS build
|
|
6
|
+
|
|
7
|
+
# Ignore everything
|
|
8
|
+
*
|
|
9
|
+
.*
|
|
10
|
+
|
|
11
|
+
# Mobile apps
|
|
12
|
+
!apps
|
|
13
|
+
apps/*
|
|
14
|
+
|
|
15
|
+
# Shared libraries
|
|
16
|
+
!libs
|
|
17
|
+
libs/*
|
|
18
|
+
!libs/shared
|
|
19
|
+
!libs/shared/**
|
|
20
|
+
|
|
21
|
+
# i18n translations
|
|
22
|
+
!i18n
|
|
23
|
+
i18n/*
|
|
24
|
+
!i18n/shared
|
|
25
|
+
!i18n/shared/**
|
|
26
|
+
|
|
27
|
+
# Dependency patches for React Native packages
|
|
28
|
+
!patches
|
|
29
|
+
!patches/**
|
|
30
|
+
|
|
31
|
+
# Root config files required for the build
|
|
32
|
+
!package.json
|
|
33
|
+
!package-lock.json
|
|
34
|
+
!tsconfig.json
|
|
35
|
+
!tsconfig.base.json
|
|
36
|
+
!babel.config.json
|
|
37
|
+
!jest.config.ts
|
|
38
|
+
!jest.preset.js
|
|
39
|
+
!types.d.ts`;
|
|
40
|
+
function getAppSpecificLines(directory) {
|
|
41
|
+
return `
|
|
42
|
+
# Mobile app: ${directory}
|
|
43
|
+
!apps/${directory}
|
|
44
|
+
!apps/${directory}/**
|
|
45
|
+
apps/${directory}/.expo
|
|
46
|
+
|
|
47
|
+
# Libraries: ${directory}
|
|
48
|
+
!libs/${directory}
|
|
49
|
+
!libs/${directory}/**
|
|
50
|
+
|
|
51
|
+
# i18n: ${directory}
|
|
52
|
+
!i18n/${directory}
|
|
53
|
+
!i18n/${directory}/**`;
|
|
54
|
+
}
|
|
55
|
+
function generateEasignore(tree, directory) {
|
|
56
|
+
const appSpecificLines = getAppSpecificLines(directory);
|
|
57
|
+
if (!tree.exists(EASIGNORE_PATH)) {
|
|
58
|
+
tree.write(EASIGNORE_PATH, COMMON_LINES + '\n' + appSpecificLines + '\n');
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const existingContent = tree.read(EASIGNORE_PATH, 'utf-8');
|
|
62
|
+
if (existingContent.includes(`!apps/${directory}\n`)) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
tree.write(EASIGNORE_PATH, existingContent.trimEnd() + '\n' + appSpecificLines + '\n');
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=easignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easignore.js","sourceRoot":"","sources":["../../../../../plugin/src/generators/expo-app/easignore.ts"],"names":[],"mappings":";;AAwDA,8CAgBC;AAtED,MAAM,cAAc,GAAG,YAAY,CAAC;AAEpC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAkCT,CAAC;AAEb,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,OAAO;gBACO,SAAS;QACjB,SAAS;QACT,SAAS;OACV,SAAS;;eAED,SAAS;QAChB,SAAS;QACT,SAAS;;UAEP,SAAS;QACX,SAAS;QACT,SAAS,KAAK,CAAC;AACvB,CAAC;AAED,SAAgB,iBAAiB,CAAC,IAAU,EAAE,SAAiB;IAC7D,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAExD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,YAAY,GAAG,IAAI,GAAG,gBAAgB,GAAG,IAAI,CAAC,CAAC;QAE1E,OAAO;IACT,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAE,CAAC;IAE5D,IAAI,eAAe,CAAC,QAAQ,CAAC,SAAS,SAAS,IAAI,CAAC,EAAE,CAAC;QACrD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,eAAe,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,gBAAgB,GAAG,IAAI,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -10,6 +10,7 @@ const dependencies_1 = require("../../shared/dependencies");
|
|
|
10
10
|
const enums_1 = require("../../shared/enums");
|
|
11
11
|
const generators_1 = require("../../shared/generators");
|
|
12
12
|
const utils_1 = require("../../shared/utils");
|
|
13
|
+
const easignore_1 = require("./easignore");
|
|
13
14
|
const scripts_1 = require("./scripts");
|
|
14
15
|
function expoAppGenerator(tree, options) {
|
|
15
16
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
@@ -29,6 +30,7 @@ function expoAppGenerator(tree, options) {
|
|
|
29
30
|
yield (0, generators_1.runAppEnvGenerator)(tree, options);
|
|
30
31
|
yield (0, generators_1.runStorageGenerator)(tree, options);
|
|
31
32
|
yield (0, generators_1.runRNStylesGenerator)(tree, options);
|
|
33
|
+
yield (0, generators_1.runUiKitGenerator)(tree, options);
|
|
32
34
|
yield (0, generators_1.runNavigationUtilsGenerator)(tree, {
|
|
33
35
|
appDirectory: options.directory,
|
|
34
36
|
baseGeneratorType: enums_1.BaseGeneratorType.EXPO_APP,
|
|
@@ -70,6 +72,7 @@ function expoAppGenerator(tree, options) {
|
|
|
70
72
|
(0, devkit_1.generateFiles)(tree, path.join(__dirname, 'app-files'), appRoot, Object.assign(Object.assign({}, options), { formatName: utils_1.formatName,
|
|
71
73
|
formatAppIdentifier: utils_1.formatAppIdentifier,
|
|
72
74
|
libPath, isStoreEnabled: options.withStore, appDirectory: options.directory }));
|
|
75
|
+
(0, easignore_1.generateEasignore)(tree, options.directory);
|
|
73
76
|
tree.delete(`${appRoot}/tsconfig.app.json`);
|
|
74
77
|
(0, utils_1.addNxAppTag)(tree, options.directory);
|
|
75
78
|
(0, devkit_1.generateFiles)(tree, path.join(__dirname, 'i18n'), i18nRoot, {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../plugin/src/generators/expo-app/generator.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../plugin/src/generators/expo-app/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,6 +43,10 @@ export declare const dependencies: {
|
|
|
43
43
|
'react-native-edge-to-edge': string;
|
|
44
44
|
'react-native-nitro-modules': string;
|
|
45
45
|
};
|
|
46
|
+
'ui-kit': {
|
|
47
|
+
'react-native-reanimated': string;
|
|
48
|
+
'react-native-worklets': string;
|
|
49
|
+
};
|
|
46
50
|
store: {
|
|
47
51
|
'@ronas-it/rtkq-entity-api': string;
|
|
48
52
|
'react-redux': string;
|
|
@@ -46,6 +46,10 @@ exports.dependencies = {
|
|
|
46
46
|
'react-native-edge-to-edge': '^1.7.0',
|
|
47
47
|
'react-native-nitro-modules': '0.33.2',
|
|
48
48
|
},
|
|
49
|
+
'ui-kit': {
|
|
50
|
+
'react-native-reanimated': '^4.1.5',
|
|
51
|
+
'react-native-worklets': '0.7.1',
|
|
52
|
+
},
|
|
49
53
|
store: {
|
|
50
54
|
'@ronas-it/rtkq-entity-api': '^0.5.0',
|
|
51
55
|
'react-redux': '^9.2.0',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../../../plugin/src/shared/dependencies.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../../../plugin/src/shared/dependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,4 +10,5 @@ tslib_1.__exportStar(require("./rn-styles"), exports);
|
|
|
10
10
|
tslib_1.__exportStar(require("./form-utils"), exports);
|
|
11
11
|
tslib_1.__exportStar(require("./i18n-next"), exports);
|
|
12
12
|
tslib_1.__exportStar(require("./navigation-utils"), exports);
|
|
13
|
+
tslib_1.__exportStar(require("./ui-kit"), exports);
|
|
13
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../plugin/src/shared/generators/index.ts"],"names":[],"mappings":";;;AAAA,kDAAwB;AACxB,oDAA0B;AAC1B,uDAA6B;AAC7B,iDAAuB;AACvB,oDAA0B;AAC1B,sDAA4B;AAC5B,uDAA6B;AAC7B,sDAA4B;AAC5B,6DAAmC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../plugin/src/shared/generators/index.ts"],"names":[],"mappings":";;;AAAA,kDAAwB;AACxB,oDAA0B;AAC1B,uDAA6B;AAC7B,iDAAuB;AACvB,oDAA0B;AAC1B,sDAA4B;AAC5B,uDAA6B;AAC7B,sDAA4B;AAC5B,6DAAmC;AACnC,mDAAyB"}
|
package/src/shared/generators/rn-styles/lib-files/shared/ui/styles/src/lib/fonts/Gilroy-Bold.ttf
ADDED
|
Binary file
|
package/src/shared/generators/rn-styles/lib-files/shared/ui/styles/src/lib/fonts/Gilroy-Regular.ttf
ADDED
|
Binary file
|
package/src/shared/generators/rn-styles/lib-files/shared/ui/styles/src/lib/fonts/Gilroy-Semibold.ttf
ADDED
|
Binary file
|
package/src/shared/generators/rn-styles/lib-files/shared/ui/styles/src/lib/fonts/index.ts.template
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './fonts';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module.exports = function (api) {
|
|
2
|
+
api.cache(true);
|
|
3
|
+
return {
|
|
4
|
+
presets: ['babel-preset-expo'],
|
|
5
|
+
plugins: [
|
|
6
|
+
[
|
|
7
|
+
'react-native-unistyles/plugin',
|
|
8
|
+
{
|
|
9
|
+
root: 'app',
|
|
10
|
+
autoProcessImports: '<%= libPath %>',
|
|
11
|
+
},
|
|
12
|
+
],
|
|
13
|
+
['react-native-worklets/plugin'],
|
|
14
|
+
],
|
|
15
|
+
};
|
|
16
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runUiKitGenerator = runUiKitGenerator;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const child_process_1 = require("child_process");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const devkit_1 = require("@nx/devkit");
|
|
9
|
+
const dependencies_1 = require("../../dependencies");
|
|
10
|
+
const utils_1 = require("../../utils");
|
|
11
|
+
function runUiKitGenerator(tree, options) {
|
|
12
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
13
|
+
const appRoot = `apps/${options.directory}`;
|
|
14
|
+
const libRoot = `libs/${options.directory}`;
|
|
15
|
+
const libPath = `${(0, utils_1.getImportPathPrefix)(tree)}/${options.directory}`;
|
|
16
|
+
const appPackagePath = `${appRoot}/package.json`;
|
|
17
|
+
const appLayoutPath = `${appRoot}/app`;
|
|
18
|
+
// Generate ui-kit lib
|
|
19
|
+
(0, child_process_1.execSync)(`npx nx g react-lib --app=${options.directory} --scope=shared --type=ui --name=ui-kit --withComponent=false`, {
|
|
20
|
+
stdio: 'inherit',
|
|
21
|
+
});
|
|
22
|
+
// Remove unnecessary files
|
|
23
|
+
tree.delete(`${libRoot}/shared/ui/ui-kit/src/index.ts`);
|
|
24
|
+
tree.delete(`${appLayoutPath}/index.tsx`);
|
|
25
|
+
// Add lib files
|
|
26
|
+
(0, devkit_1.generateFiles)(tree, path.join(__dirname, 'lib-files'), libRoot, Object.assign(Object.assign({}, options), { libPath }));
|
|
27
|
+
// Add app files
|
|
28
|
+
(0, devkit_1.generateFiles)(tree, path.join(__dirname, 'app-files'), appRoot, Object.assign(Object.assign({}, options), { libPath }));
|
|
29
|
+
// Add layout files
|
|
30
|
+
(0, devkit_1.generateFiles)(tree, path.join(__dirname, 'layout-files'), appLayoutPath, Object.assign(Object.assign({}, options), { libPath }));
|
|
31
|
+
// Add dependencies
|
|
32
|
+
(0, devkit_1.addDependenciesToPackageJson)(tree, dependencies_1.dependencies['ui-kit'], {});
|
|
33
|
+
if ((0, fs_1.existsSync)(appPackagePath)) {
|
|
34
|
+
(0, devkit_1.addDependenciesToPackageJson)(tree, dependencies_1.dependencies['ui-kit'], {}, appPackagePath);
|
|
35
|
+
}
|
|
36
|
+
yield (0, devkit_1.formatFiles)(tree);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
exports.default = runUiKitGenerator;
|
|
40
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../plugin/src/shared/generators/ui-kit/generator.ts"],"names":[],"mappings":";;AAOA,8CA8CC;;AArDD,iDAAyC;AACzC,2BAAgC;AAChC,6BAA6B;AAC7B,uCAA4F;AAC5F,qDAAkD;AAClD,uCAAkD;AAElD,SAAsB,iBAAiB,CAAC,IAAU,EAAE,OAA4C;;QAC9F,MAAM,OAAO,GAAG,QAAQ,OAAO,CAAC,SAAS,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,OAAO,CAAC,SAAS,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,IAAA,2BAAmB,EAAC,IAAI,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QAEpE,MAAM,cAAc,GAAG,GAAG,OAAO,eAAe,CAAC;QACjD,MAAM,aAAa,GAAG,GAAG,OAAO,MAAM,CAAC;QAEvC,sBAAsB;QACtB,IAAA,wBAAQ,EACN,4BAA4B,OAAO,CAAC,SAAS,+DAA+D,EAC5G;YACE,KAAK,EAAE,SAAS;SACjB,CACF,CAAC;QAEF,2BAA2B;QAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO,gCAAgC,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,GAAG,aAAa,YAAY,CAAC,CAAC;QAE1C,gBAAgB;QAChB,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,OAAO,kCACzD,OAAO,KACV,OAAO,IACP,CAAC;QAEH,gBAAgB;QAChB,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,OAAO,kCACzD,OAAO,KACV,OAAO,IACP,CAAC;QAEH,mBAAmB;QACnB,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,aAAa,kCAClE,OAAO,KACV,OAAO,IACP,CAAC;QAEH,mBAAmB;QACnB,IAAA,qCAA4B,EAAC,IAAI,EAAE,2BAAY,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/D,IAAI,IAAA,eAAU,EAAC,cAAc,CAAC,EAAE,CAAC;YAC/B,IAAA,qCAA4B,EAAC,IAAI,EAAE,2BAAY,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CAAA;AAED,kBAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './generator';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../plugin/src/shared/generators/ui-kit/index.ts"],"names":[],"mappings":";;;AAAA,sDAA4B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { AppButton, AppScreen, AppSpinner, AppText, AppTextInput } from '<%= libPath %>/shared/ui/ui-kit';
|
|
2
|
+
import { ReactElement, useState } from 'react';
|
|
3
|
+
import { StyleSheet } from 'react-native-unistyles';
|
|
4
|
+
|
|
5
|
+
export default function RootScreen(): ReactElement {
|
|
6
|
+
const [username, setUsername] = useState<string>('');
|
|
7
|
+
const [password, setPassword] = useState<string>('');
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<AppScreen style={styles.container}>
|
|
11
|
+
<AppText>Title H1</AppText>
|
|
12
|
+
<AppText>Title H2</AppText>
|
|
13
|
+
<AppText>Title H3</AppText>
|
|
14
|
+
<AppText>Title H4</AppText>
|
|
15
|
+
<AppText>Title H5</AppText>
|
|
16
|
+
<AppText>Title H6</AppText>
|
|
17
|
+
<AppText>Body Large</AppText>
|
|
18
|
+
<AppText>Body Large Bold</AppText>
|
|
19
|
+
<AppText>Body Default</AppText>
|
|
20
|
+
<AppText>Body Default Bold</AppText>
|
|
21
|
+
<AppText>Body Small</AppText>
|
|
22
|
+
<AppText>Body Small Bold</AppText>
|
|
23
|
+
<AppText>Body Extra Small</AppText>
|
|
24
|
+
<AppText>Body Extra Small Bold</AppText>
|
|
25
|
+
<AppTextInput
|
|
26
|
+
label='Username'
|
|
27
|
+
autoCapitalize='none'
|
|
28
|
+
autoCorrect={false}
|
|
29
|
+
value={username}
|
|
30
|
+
onChangeText={setUsername}
|
|
31
|
+
/>
|
|
32
|
+
<AppTextInput isPassword={true} label='Password' value={password} onChangeText={setPassword} />
|
|
33
|
+
<AppButton text='Button Primary Regular' />
|
|
34
|
+
<AppButton text='Button Primary Small' size='small' />
|
|
35
|
+
<AppButton text='Button Secondary Regular' variant='secondary' />
|
|
36
|
+
<AppButton text='Button Secondary Small' variant='secondary' size='small' />
|
|
37
|
+
<AppButton text='Button Tertiary Regular' variant='tertiary' />
|
|
38
|
+
<AppButton text='Button Tertiary Small' variant='tertiary' size='small' />
|
|
39
|
+
<AppButton text='Button Danger Regular' variant='danger' />
|
|
40
|
+
<AppButton text='Button Danger Small' variant='danger' size='small' />
|
|
41
|
+
<AppSpinner />
|
|
42
|
+
</AppScreen>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const styles = StyleSheet.create(({ spacings }) => ({
|
|
47
|
+
container: {
|
|
48
|
+
gap: spacings.xs,
|
|
49
|
+
paddingVertical: spacings.md,
|
|
50
|
+
},
|
|
51
|
+
}));
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<g clip-path="url(#clip0_944_8975)">
|
|
3
|
+
<mask id="mask0_944_8975" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0"
|
|
4
|
+
width="26" height="24">
|
|
5
|
+
<path d="M26 24H0V0H26V24ZM4 19.8496L6.7002 22.5498L21.5498 7.7002L18.8496 5L4 19.8496Z"
|
|
6
|
+
fill="white" />
|
|
7
|
+
</mask>
|
|
8
|
+
<g mask="url(#mask0_944_8975)">
|
|
9
|
+
<mask id="path-2-inside-1_944_8975" fill="white">
|
|
10
|
+
<path
|
|
11
|
+
d="M12 6C16.6993 6 20.799 8.55443 22.9951 12.3486C20.7992 16.1435 16.6998 18.6992 12 18.6992C7.30007 18.6992 3.19976 16.1437 1.00391 12.3486C3.19993 8.5542 7.30057 6 12 6Z" />
|
|
12
|
+
</mask>
|
|
13
|
+
<path
|
|
14
|
+
d="M12 6L12 4.4H12V6ZM22.9951 12.3486L24.38 13.15L24.8437 12.3485L24.3799 11.5471L22.9951 12.3486ZM12 18.6992V20.2992H12L12 18.6992ZM1.00391 12.3486L-0.380895 11.5472L-0.844675 12.3485L-0.380983 13.1499L1.00391 12.3486ZM12 6L12 7.6C16.1042 7.6 19.6881 9.82899 21.6103 13.1501L22.9951 12.3486L24.3799 11.5471C21.91 7.27987 17.2943 4.4 12 4.4L12 6ZM22.9951 12.3486L21.6103 11.5473C19.688 14.8693 16.1044 17.0992 12 17.0992L12 18.6992L12 20.2992C17.2951 20.2992 21.9104 17.4177 24.38 13.15L22.9951 12.3486ZM12 18.6992V17.0992C7.89525 17.0992 4.31091 14.8693 2.3888 11.5473L1.00391 12.3486L-0.380983 13.1499C2.08861 17.4181 6.7049 20.2992 12 20.2992V18.6992ZM1.00391 12.3486L2.38871 13.1501C4.31083 9.82891 7.89541 7.6 12 7.6V6V4.4C6.70574 4.4 2.08903 7.27948 -0.380895 11.5472L1.00391 12.3486Z"
|
|
15
|
+
fill="currentColor" mask="url(#path-2-inside-1_944_8975)" />
|
|
16
|
+
<path
|
|
17
|
+
d="M12.1289 9.00293C12.0465 9.23685 12 9.48789 12 9.75C12 10.9926 13.0074 12 14.25 12C14.5119 12 14.7623 11.9524 14.9961 11.8701C14.9979 11.9132 15 11.9565 15 12C15 13.6569 13.6569 15 12 15C10.3431 15 9 13.6569 9 12C9 10.3431 10.3431 9 12 9C12.0432 9 12.0862 9.00112 12.1289 9.00293Z"
|
|
18
|
+
fill="currentColor" />
|
|
19
|
+
</g>
|
|
20
|
+
<path d="M20.5 3L3 20.5" stroke="currentColor" stroke-width="1.6" />
|
|
21
|
+
</g>
|
|
22
|
+
</svg>
|
|
23
|
+
|
package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/assets/icons/eye.svg.template
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<mask id="path-1-inside-1_28393_1814" fill="white">
|
|
3
|
+
<path
|
|
4
|
+
d="M12 6C16.6993 6 20.799 8.55443 22.9951 12.3486C20.7992 16.1435 16.6998 18.6992 12 18.6992C7.30007 18.6992 3.19976 16.1437 1.00391 12.3486C3.19993 8.5542 7.30057 6 12 6Z" />
|
|
5
|
+
</mask>
|
|
6
|
+
<path
|
|
7
|
+
d="M12 6L12 4.4H12V6ZM22.9951 12.3486L24.38 13.15L24.8437 12.3485L24.3799 11.5471L22.9951 12.3486ZM12 18.6992V20.2992H12L12 18.6992ZM1.00391 12.3486L-0.380895 11.5472L-0.844675 12.3485L-0.380983 13.1499L1.00391 12.3486ZM12 6L12 7.6C16.1042 7.6 19.6881 9.82899 21.6103 13.1501L22.9951 12.3486L24.3799 11.5471C21.91 7.27987 17.2943 4.4 12 4.4L12 6ZM22.9951 12.3486L21.6103 11.5473C19.688 14.8693 16.1044 17.0992 12 17.0992L12 18.6992L12 20.2992C17.2951 20.2992 21.9104 17.4177 24.38 13.15L22.9951 12.3486ZM12 18.6992V17.0992C7.89525 17.0992 4.31091 14.8693 2.3888 11.5473L1.00391 12.3486L-0.380983 13.1499C2.08861 17.4181 6.7049 20.2992 12 20.2992V18.6992ZM1.00391 12.3486L2.38871 13.1501C4.31083 9.82891 7.89541 7.6 12 7.6V6V4.4C6.70574 4.4 2.08903 7.27948 -0.380895 11.5472L1.00391 12.3486Z"
|
|
8
|
+
fill="currentColor" mask="url(#path-1-inside-1_28393_1814)" />
|
|
9
|
+
<path
|
|
10
|
+
d="M12.1289 9.00293C12.0465 9.23685 12 9.48789 12 9.75C12 10.9926 13.0074 12 14.25 12C14.5119 12 14.7623 11.9524 14.9961 11.8701C14.9979 11.9132 15 11.9565 15 12C15 13.6569 13.6569 15 12 15C10.3431 15 9 13.6569 9 12C9 10.3431 10.3431 9 12 9C12.0432 9 12.0862 9.00112 12.1289 9.00293Z"
|
|
11
|
+
fill="currentColor" />
|
|
12
|
+
</svg>
|
|
13
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './icons';
|
package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/button/component.tsx.template
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { Fragment, ReactElement } from 'react';
|
|
2
|
+
import { Pressable, PressableProps, StyleProp, ViewStyle } from 'react-native';
|
|
3
|
+
import { UnistylesVariants, StyleSheet } from 'react-native-unistyles';
|
|
4
|
+
import { colors, rem, spacings } from '<%= libPath %>/shared/ui/styles';
|
|
5
|
+
import { AppSpinner } from '../spinner';
|
|
6
|
+
import { AppText } from '../text';
|
|
7
|
+
|
|
8
|
+
type AppButtonProps = UnistylesVariants<typeof buttonStyles> &
|
|
9
|
+
Omit<PressableProps, 'style'> & {
|
|
10
|
+
accessoryLeft?: ReactElement;
|
|
11
|
+
accessoryRight?: ReactElement;
|
|
12
|
+
text?: string;
|
|
13
|
+
isLoading?: boolean;
|
|
14
|
+
isFilled?: boolean;
|
|
15
|
+
style?: StyleProp<ViewStyle>;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const AppButton = ({
|
|
19
|
+
variant = 'primary',
|
|
20
|
+
size = 'regular',
|
|
21
|
+
disabled,
|
|
22
|
+
text,
|
|
23
|
+
isLoading,
|
|
24
|
+
isFilled,
|
|
25
|
+
style,
|
|
26
|
+
accessoryLeft,
|
|
27
|
+
accessoryRight,
|
|
28
|
+
...props
|
|
29
|
+
}: AppButtonProps): ReactElement => {
|
|
30
|
+
buttonStyles.useVariants({ variant, size });
|
|
31
|
+
textStyles.useVariants({ variant });
|
|
32
|
+
|
|
33
|
+
const buttonDisabled = disabled || isLoading;
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<Pressable
|
|
37
|
+
style={({ pressed }) => [buttonStyles.button(pressed, !!isFilled), style]}
|
|
38
|
+
disabled={buttonDisabled}
|
|
39
|
+
{...props}>
|
|
40
|
+
{({ pressed }): ReactElement =>
|
|
41
|
+
isLoading ? (
|
|
42
|
+
<AppSpinner size='small' color={variant === 'primary' ? colors.backgroundPrimary : colors.textPrimary} />
|
|
43
|
+
) : (
|
|
44
|
+
<Fragment>
|
|
45
|
+
{accessoryLeft}
|
|
46
|
+
<AppText
|
|
47
|
+
variant={size === 'regular' ? 'bodyDefaultBold' : 'bodySmallBold'}
|
|
48
|
+
style={textStyles.text(!!buttonDisabled, pressed)}>
|
|
49
|
+
{text}
|
|
50
|
+
</AppText>
|
|
51
|
+
{accessoryRight}
|
|
52
|
+
</Fragment>
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
</Pressable>
|
|
56
|
+
);
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const buttonStyles = StyleSheet.create(({ colors }) => ({
|
|
60
|
+
button: (pressed: boolean, filled: boolean) => ({
|
|
61
|
+
flex: filled ? 1 : 0,
|
|
62
|
+
flexDirection: 'row',
|
|
63
|
+
gap: spacings.xs,
|
|
64
|
+
alignItems: 'center',
|
|
65
|
+
justifyContent: 'center',
|
|
66
|
+
borderWidth: 1,
|
|
67
|
+
borderColor: 'transparent',
|
|
68
|
+
variants: {
|
|
69
|
+
variant: {
|
|
70
|
+
primary: {
|
|
71
|
+
backgroundColor: colors.primary,
|
|
72
|
+
},
|
|
73
|
+
secondary: {
|
|
74
|
+
backgroundColor: colors.backgroundSecondary,
|
|
75
|
+
},
|
|
76
|
+
tertiary: {
|
|
77
|
+
backgroundColor: 'transparent',
|
|
78
|
+
borderColor: pressed ? colors.textTertiary : 'transparent',
|
|
79
|
+
},
|
|
80
|
+
danger: {
|
|
81
|
+
backgroundColor: 'transparent',
|
|
82
|
+
borderColor: pressed ? colors.textTertiary : 'transparent',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
size: {
|
|
86
|
+
regular: {
|
|
87
|
+
borderRadius: 1 * rem,
|
|
88
|
+
minHeight: 3.5 * rem,
|
|
89
|
+
paddingHorizontal: 2.625 * rem,
|
|
90
|
+
},
|
|
91
|
+
small: {
|
|
92
|
+
borderRadius: 1 * rem,
|
|
93
|
+
minHeight: 2 * rem,
|
|
94
|
+
paddingHorizontal: 1 * rem,
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
}),
|
|
99
|
+
}));
|
|
100
|
+
|
|
101
|
+
const textStyles = StyleSheet.create(({ colors }) => ({
|
|
102
|
+
text: (disabled: boolean, pressed: boolean) => ({
|
|
103
|
+
variants: {
|
|
104
|
+
variant: {
|
|
105
|
+
primary: {
|
|
106
|
+
color: colors.textPrimary,
|
|
107
|
+
opacity: disabled ? 0.4 : pressed ? 0.8 : 1,
|
|
108
|
+
},
|
|
109
|
+
secondary: {
|
|
110
|
+
color: disabled ? colors.textSecondary : pressed ? colors.primary : colors.textPrimary,
|
|
111
|
+
},
|
|
112
|
+
tertiary: {
|
|
113
|
+
color: disabled ? colors.textSecondary : colors.textPrimary,
|
|
114
|
+
},
|
|
115
|
+
danger: {
|
|
116
|
+
color: colors.error,
|
|
117
|
+
opacity: disabled ? 0.4 : pressed ? 0.8 : 1,
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
}),
|
|
122
|
+
}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './component';
|
package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/icon/component.tsx.template
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { SvgProps } from 'react-native-svg';
|
|
3
|
+
import { colors } from '<%= libPath %>/shared/ui/styles';
|
|
4
|
+
import { Icons } from '../assets';
|
|
5
|
+
import { IconName } from './types';
|
|
6
|
+
|
|
7
|
+
export interface IconProps extends SvgProps {
|
|
8
|
+
name: IconName;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const defaultColor = colors.textPrimary;
|
|
12
|
+
|
|
13
|
+
export function Icon({ name, ...restProps }: IconProps): ReactNode {
|
|
14
|
+
const props: SvgProps = {
|
|
15
|
+
color: defaultColor,
|
|
16
|
+
...restProps,
|
|
17
|
+
};
|
|
18
|
+
const Component = name in Icons && Icons[name];
|
|
19
|
+
|
|
20
|
+
return Component ? <Component {...props} /> : null;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './component';
|
package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/icon/types/index.ts.template
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './icon-name';
|
package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/pressable/component.tsx.template
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ForwardedRef, ReactElement } from 'react';
|
|
2
|
+
import { Pressable, PressableProps, StyleProp, StyleSheet, View, ViewStyle } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface AppPressableProps extends PressableProps {
|
|
5
|
+
pressedOpacity?: number;
|
|
6
|
+
ref?: ForwardedRef<View>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function AppPressable({
|
|
10
|
+
children,
|
|
11
|
+
style,
|
|
12
|
+
pressedOpacity = 0.4,
|
|
13
|
+
ref,
|
|
14
|
+
...props
|
|
15
|
+
}: AppPressableProps): ReactElement {
|
|
16
|
+
return (
|
|
17
|
+
<Pressable
|
|
18
|
+
ref={ref}
|
|
19
|
+
style={({ pressed }) =>
|
|
20
|
+
StyleSheet.flatten([{ opacity: pressed ? pressedOpacity : 1 }, style as StyleProp<ViewStyle>])
|
|
21
|
+
}
|
|
22
|
+
{...props}>
|
|
23
|
+
{children}
|
|
24
|
+
</Pressable>
|
|
25
|
+
);
|
|
26
|
+
}
|
package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/pressable/index.ts.template
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './component';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
import { StyleProp, ViewStyle } from 'react-native';
|
|
3
|
+
import { Icon, IconProps } from '../icon';
|
|
4
|
+
import { AppPressable } from '../pressable';
|
|
5
|
+
|
|
6
|
+
export interface AppPressableIconProps extends IconProps {
|
|
7
|
+
onPress: () => void;
|
|
8
|
+
layoutStyle?: StyleProp<ViewStyle>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function AppPressableIcon({ onPress, layoutStyle, disabled, ...props }: AppPressableIconProps): ReactElement {
|
|
12
|
+
return (
|
|
13
|
+
<AppPressable onPress={onPress} style={layoutStyle} hitSlop={10} disabled={disabled}>
|
|
14
|
+
<Icon {...props} />
|
|
15
|
+
</AppPressable>
|
|
16
|
+
);
|
|
17
|
+
}
|
package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/pressable-icon/index.ts.template
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './component';
|
package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/screen/component.tsx.template
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ReactElement, useMemo } from 'react';
|
|
2
|
+
import { ScrollView, ScrollViewProps, View, ViewProps } from 'react-native';
|
|
3
|
+
import { StyleSheet } from 'react-native-unistyles';
|
|
4
|
+
import { commonStyle, spacings } from '<%= libPath %>/shared/ui/styles';
|
|
5
|
+
|
|
6
|
+
export interface AppScreenProps {
|
|
7
|
+
scrollDisabled?: boolean;
|
|
8
|
+
noOutsideSpacing?: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface NonScrollableScreenProps extends ViewProps {
|
|
12
|
+
scrollDisabled: true;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface ScrollableScreenProps extends ScrollViewProps {
|
|
16
|
+
scrollDisabled?: false;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function AppScreen(props: AppScreenProps & (ScrollableScreenProps | NonScrollableScreenProps)): ReactElement {
|
|
20
|
+
const { children, style: elementStyle = {}, testID, scrollDisabled, noOutsideSpacing, ...restProps } = props;
|
|
21
|
+
|
|
22
|
+
const [ViewComponent, viewComponentProps] = useMemo(
|
|
23
|
+
(): [typeof View, ViewProps] | [typeof ScrollView, ScrollViewProps] =>
|
|
24
|
+
scrollDisabled
|
|
25
|
+
? [
|
|
26
|
+
View,
|
|
27
|
+
{
|
|
28
|
+
style: [commonStyle.fullFlex, !noOutsideSpacing && styles.spacingsContainer, elementStyle],
|
|
29
|
+
...restProps,
|
|
30
|
+
},
|
|
31
|
+
]
|
|
32
|
+
: [
|
|
33
|
+
ScrollView,
|
|
34
|
+
{
|
|
35
|
+
contentContainerStyle: [styles.scroll, !noOutsideSpacing && styles.spacingsContainer, elementStyle],
|
|
36
|
+
showsVerticalScrollIndicator: false,
|
|
37
|
+
keyboardShouldPersistTaps: 'handled',
|
|
38
|
+
...restProps,
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
[scrollDisabled, restProps, noOutsideSpacing],
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<View style={[styles.container, commonStyle.fullFlex]}>
|
|
46
|
+
<ViewComponent {...viewComponentProps}>{children}</ViewComponent>
|
|
47
|
+
</View>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const styles = StyleSheet.create(({ colors }) => ({
|
|
52
|
+
container: {
|
|
53
|
+
backgroundColor: colors.backgroundPrimary,
|
|
54
|
+
},
|
|
55
|
+
spacingsContainer: {
|
|
56
|
+
paddingHorizontal: spacings.md,
|
|
57
|
+
},
|
|
58
|
+
scroll: {
|
|
59
|
+
minHeight: '100%',
|
|
60
|
+
},
|
|
61
|
+
}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './component';
|
package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/spinner/component.tsx.template
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
import { StyleProp, View, ViewStyle, ActivityIndicator, ActivityIndicatorProps } from 'react-native';
|
|
3
|
+
import { StyleSheet } from 'react-native-unistyles';
|
|
4
|
+
import { commonStyle, colors } from '<%= libPath %>/shared/ui/styles';
|
|
5
|
+
|
|
6
|
+
export interface AppSpinnerProps extends ActivityIndicatorProps {
|
|
7
|
+
isFullScreen?: boolean;
|
|
8
|
+
containerStyle?: StyleProp<ViewStyle>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function AppSpinner({
|
|
12
|
+
isFullScreen,
|
|
13
|
+
size = 'large',
|
|
14
|
+
containerStyle,
|
|
15
|
+
...restProps
|
|
16
|
+
}: AppSpinnerProps): ReactElement {
|
|
17
|
+
return (
|
|
18
|
+
<View style={[styles.container, isFullScreen && commonStyle.fullFlex, containerStyle]}>
|
|
19
|
+
<ActivityIndicator color={colors.primary} size={size} {...restProps} />
|
|
20
|
+
</View>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const styles = StyleSheet.create({
|
|
25
|
+
container: {
|
|
26
|
+
alignItems: 'center',
|
|
27
|
+
justifyContent: 'center',
|
|
28
|
+
},
|
|
29
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './component';
|
package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/text/component.tsx.template
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
import { Text, type TextProps } from 'react-native';
|
|
3
|
+
import { UnistylesVariants, StyleSheet } from 'react-native-unistyles';
|
|
4
|
+
import { fontFamily, rem } from '<%= libPath %>/shared/ui/styles';
|
|
5
|
+
|
|
6
|
+
export type AppTextProps = UnistylesVariants<typeof textStyles> & TextProps;
|
|
7
|
+
|
|
8
|
+
export const AppText = ({ variant = 'bodyDefault', children, style, ...props }: AppTextProps): ReactElement => {
|
|
9
|
+
textStyles.useVariants({ variant });
|
|
10
|
+
|
|
11
|
+
return (
|
|
12
|
+
<Text style={[textStyles.text, style]} {...props}>
|
|
13
|
+
{children}
|
|
14
|
+
</Text>
|
|
15
|
+
);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const textStyles = StyleSheet.create(({ colors }) => ({
|
|
19
|
+
text: {
|
|
20
|
+
color: colors.textPrimary,
|
|
21
|
+
variants: {
|
|
22
|
+
variant: {
|
|
23
|
+
// Titles
|
|
24
|
+
h1: {
|
|
25
|
+
fontFamily: fontFamily.regular,
|
|
26
|
+
fontSize: 1.5 * rem, // 24px
|
|
27
|
+
lineHeight: 1.875 * rem, // 30px
|
|
28
|
+
fontWeight: 500,
|
|
29
|
+
},
|
|
30
|
+
h2: {
|
|
31
|
+
fontFamily: fontFamily.regular,
|
|
32
|
+
fontSize: 1.375 * rem, // 22px
|
|
33
|
+
lineHeight: 1.75 * rem, // 28px
|
|
34
|
+
},
|
|
35
|
+
h3: {
|
|
36
|
+
fontFamily: fontFamily.regular,
|
|
37
|
+
fontSize: 1.1875 * rem, // 19px
|
|
38
|
+
lineHeight: 1.5 * rem, // 24px
|
|
39
|
+
},
|
|
40
|
+
h4: {
|
|
41
|
+
fontFamily: fontFamily.regular,
|
|
42
|
+
fontSize: 1.1875 * rem, // 19px
|
|
43
|
+
lineHeight: 1.5 * rem, // 24px
|
|
44
|
+
fontWeight: 500,
|
|
45
|
+
},
|
|
46
|
+
h5: {
|
|
47
|
+
fontFamily: fontFamily.regular,
|
|
48
|
+
fontSize: 1 * rem, // 16px
|
|
49
|
+
lineHeight: 1.25 * rem, // 20px
|
|
50
|
+
fontWeight: 500,
|
|
51
|
+
},
|
|
52
|
+
h6: {
|
|
53
|
+
fontFamily: fontFamily.regular,
|
|
54
|
+
fontSize: 1 * rem, // 16px
|
|
55
|
+
lineHeight: 1.25 * rem, // 20px
|
|
56
|
+
fontWeight: 500,
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
// Body
|
|
60
|
+
bodyLarge: {
|
|
61
|
+
fontFamily: fontFamily.regular,
|
|
62
|
+
fontSize: 1.0625 * rem, // 17px
|
|
63
|
+
lineHeight: 1.5 * rem, // 24px
|
|
64
|
+
},
|
|
65
|
+
bodyLargeBold: {
|
|
66
|
+
fontFamily: fontFamily.bold,
|
|
67
|
+
fontSize: 1.0625 * rem, // 17px
|
|
68
|
+
lineHeight: 1.5 * rem, // 24px
|
|
69
|
+
fontWeight: 500,
|
|
70
|
+
},
|
|
71
|
+
bodyDefault: {
|
|
72
|
+
fontFamily: fontFamily.regular,
|
|
73
|
+
fontSize: 1 * rem, // 16px
|
|
74
|
+
lineHeight: 1.4375 * rem, // 23px
|
|
75
|
+
},
|
|
76
|
+
bodyDefaultBold: {
|
|
77
|
+
fontFamily: fontFamily.bold,
|
|
78
|
+
fontSize: 1 * rem, // 16px
|
|
79
|
+
lineHeight: 1.4375 * rem, // 23px
|
|
80
|
+
fontWeight: 500,
|
|
81
|
+
},
|
|
82
|
+
bodySmall: {
|
|
83
|
+
fontFamily: fontFamily.regular,
|
|
84
|
+
fontSize: 0.8125 * rem, // 13px
|
|
85
|
+
lineHeight: 1.1875 * rem, // 19px
|
|
86
|
+
},
|
|
87
|
+
bodySmallBold: {
|
|
88
|
+
fontFamily: fontFamily.semiBold,
|
|
89
|
+
fontSize: 0.8125 * rem, // 13px
|
|
90
|
+
lineHeight: 1.1875 * rem, // 19px
|
|
91
|
+
fontWeight: 500,
|
|
92
|
+
},
|
|
93
|
+
bodyExtraSmall: {
|
|
94
|
+
fontFamily: fontFamily.regular,
|
|
95
|
+
fontSize: 0.6875 * rem, // 11px
|
|
96
|
+
lineHeight: 0.875 * rem, // 14px
|
|
97
|
+
},
|
|
98
|
+
bodyExtraSmallBold: {
|
|
99
|
+
fontFamily: fontFamily.semiBold,
|
|
100
|
+
fontSize: 0.6875 * rem, // 11px
|
|
101
|
+
lineHeight: 0.875 * rem, // 14px
|
|
102
|
+
fontWeight: 500,
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './component';
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { ReactElement, RefObject, useRef, useState } from 'react';
|
|
2
|
+
import { TextInput, FocusEvent, TextInputProps, View, Platform, TouchableWithoutFeedback } from 'react-native';
|
|
3
|
+
import Animated, { useSharedValue } from 'react-native-reanimated';
|
|
4
|
+
import { StyleSheet } from 'react-native-unistyles';
|
|
5
|
+
import { colors, commonStyle, rem, spacings } from '<%= libPath %>/shared/ui/styles';
|
|
6
|
+
import { AppPressableIcon } from '../pressable-icon';
|
|
7
|
+
import { AppText, textStyles as appTextStyles } from '../text';
|
|
8
|
+
import { useAnimatedLabel } from './hooks';
|
|
9
|
+
|
|
10
|
+
export interface AppTextInputProps extends TextInputProps {
|
|
11
|
+
accessoryRight?: ReactElement;
|
|
12
|
+
label?: string;
|
|
13
|
+
error?: string;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
isPassword?: boolean;
|
|
16
|
+
ref?: RefObject<TextInput | null>;
|
|
17
|
+
nextInputRef?: RefObject<TextInput | null>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const AppTextInput = ({
|
|
21
|
+
disabled,
|
|
22
|
+
label,
|
|
23
|
+
error,
|
|
24
|
+
style,
|
|
25
|
+
accessoryRight,
|
|
26
|
+
value,
|
|
27
|
+
isPassword,
|
|
28
|
+
onFocus,
|
|
29
|
+
onBlur,
|
|
30
|
+
ref,
|
|
31
|
+
nextInputRef,
|
|
32
|
+
onSubmitEditing,
|
|
33
|
+
returnKeyType,
|
|
34
|
+
placeholder,
|
|
35
|
+
...props
|
|
36
|
+
}: AppTextInputProps): ReactElement => {
|
|
37
|
+
appTextStyles.useVariants({ variant: 'bodyDefault' });
|
|
38
|
+
const isIos = Platform.OS === 'ios';
|
|
39
|
+
const inputRef = ref || useRef<TextInput>(null);
|
|
40
|
+
const labelWidth = useSharedValue(0);
|
|
41
|
+
|
|
42
|
+
const [isFocused, setIsFocused] = useState(false);
|
|
43
|
+
const [isSecured, setIsSecured] = useState(true);
|
|
44
|
+
|
|
45
|
+
const isLabelFloated = (isFocused || !!value) && !!label;
|
|
46
|
+
|
|
47
|
+
const { labelAnimatedStyle } = useAnimatedLabel(isLabelFloated, labelWidth);
|
|
48
|
+
|
|
49
|
+
const handleOnFocus = (e: FocusEvent) => {
|
|
50
|
+
setIsFocused(true);
|
|
51
|
+
onFocus?.(e);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const handleBlur = (e: FocusEvent): void => {
|
|
55
|
+
setIsFocused(false);
|
|
56
|
+
onBlur?.(e);
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const goToNextRef = (): void => nextInputRef?.current?.focus();
|
|
60
|
+
|
|
61
|
+
const handleInputPress = (): void => inputRef.current?.focus();
|
|
62
|
+
|
|
63
|
+
const accessoryRightComponent = isPassword ? (
|
|
64
|
+
<AppPressableIcon name={isSecured ? 'eye' : 'eyeOff'} onPress={() => setIsSecured(!isSecured)} />
|
|
65
|
+
) : (
|
|
66
|
+
accessoryRight
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<View style={styles.wrapper}>
|
|
71
|
+
<View style={inputStyles.container(isFocused, !!disabled, !!error)}>
|
|
72
|
+
<TouchableWithoutFeedback onPress={handleInputPress}>
|
|
73
|
+
<View style={commonStyle.fullFlex}>
|
|
74
|
+
{label && (
|
|
75
|
+
<Animated.View style={labelAnimatedStyle} pointerEvents='none'>
|
|
76
|
+
<AppText
|
|
77
|
+
variant='bodyDefault'
|
|
78
|
+
style={textStyles.label}
|
|
79
|
+
onLayout={(e) => {
|
|
80
|
+
labelWidth.value = e.nativeEvent.layout.width;
|
|
81
|
+
}}>
|
|
82
|
+
{label}
|
|
83
|
+
</AppText>
|
|
84
|
+
</Animated.View>
|
|
85
|
+
)}
|
|
86
|
+
<TextInput
|
|
87
|
+
ref={inputRef}
|
|
88
|
+
editable={!disabled}
|
|
89
|
+
value={value}
|
|
90
|
+
onFocus={handleOnFocus}
|
|
91
|
+
onBlur={handleBlur}
|
|
92
|
+
style={[appTextStyles.text, textStyles.input(!!disabled, isIos), inputStyles.input]}
|
|
93
|
+
cursorColor={colors.textPrimary}
|
|
94
|
+
selectionColor={colors.textPrimary}
|
|
95
|
+
hitSlop={{ top: 40 }}
|
|
96
|
+
secureTextEntry={isSecured && isPassword}
|
|
97
|
+
onSubmitEditing={nextInputRef ? goToNextRef : onSubmitEditing}
|
|
98
|
+
returnKeyType={nextInputRef ? 'next' : returnKeyType}
|
|
99
|
+
placeholder={label ? undefined : placeholder}
|
|
100
|
+
{...props}
|
|
101
|
+
/>
|
|
102
|
+
</View>
|
|
103
|
+
</TouchableWithoutFeedback>
|
|
104
|
+
{accessoryRightComponent}
|
|
105
|
+
</View>
|
|
106
|
+
{error && (
|
|
107
|
+
<AppText variant='bodySmall' style={textStyles.error}>
|
|
108
|
+
{error}
|
|
109
|
+
</AppText>
|
|
110
|
+
)}
|
|
111
|
+
</View>
|
|
112
|
+
);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const styles = StyleSheet.create({
|
|
116
|
+
wrapper: {
|
|
117
|
+
gap: spacings.xs,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const inputStyles = StyleSheet.create(({ colors }) => ({
|
|
122
|
+
container: (focused: boolean, disabled: boolean, errored: boolean) => ({
|
|
123
|
+
flexDirection: 'row',
|
|
124
|
+
alignItems: 'center',
|
|
125
|
+
gap: spacings.xs,
|
|
126
|
+
borderWidth: 1,
|
|
127
|
+
backgroundColor: disabled ? colors.backgroundPrimary : colors.backgroundSecondary,
|
|
128
|
+
borderColor: focused || disabled ? colors.textTertiary : errored ? colors.error : 'transparent',
|
|
129
|
+
borderRadius: spacings.md,
|
|
130
|
+
minHeight: 3.5 * rem,
|
|
131
|
+
paddingHorizontal: spacings.md,
|
|
132
|
+
paddingVertical: 0.375 * rem,
|
|
133
|
+
}),
|
|
134
|
+
input: {
|
|
135
|
+
padding: 0,
|
|
136
|
+
marginTop: 1.4375 * rem * 0.8,
|
|
137
|
+
flex: 1,
|
|
138
|
+
},
|
|
139
|
+
}));
|
|
140
|
+
|
|
141
|
+
const textStyles = StyleSheet.create(({ colors }) => ({
|
|
142
|
+
label: {
|
|
143
|
+
color: colors.textSecondary,
|
|
144
|
+
},
|
|
145
|
+
input: (disabled: boolean, isIos: boolean) => ({
|
|
146
|
+
color: disabled ? colors.textSecondary : colors.textPrimary,
|
|
147
|
+
lineHeight: isIos ? 0 : 1.4375 * rem,
|
|
148
|
+
// NOTE: Needs to fix Android spacings
|
|
149
|
+
// https://reactnative.dev/docs/text-style-props#includefontpadding-android
|
|
150
|
+
includeFontPadding: false,
|
|
151
|
+
textAlignVertical: 'center',
|
|
152
|
+
}),
|
|
153
|
+
error: {
|
|
154
|
+
color: colors.error,
|
|
155
|
+
},
|
|
156
|
+
}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './use-animated-label';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { AnimatedStyle, SharedValue, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';
|
|
3
|
+
|
|
4
|
+
interface UseAnimatedLabelResult {
|
|
5
|
+
labelAnimatedStyle: AnimatedStyle;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function useAnimatedLabel(isLabelFloated: boolean, labelWidth: SharedValue<number>): UseAnimatedLabelResult {
|
|
9
|
+
const labelTop = useSharedValue(8);
|
|
10
|
+
const labelScale = useSharedValue(1);
|
|
11
|
+
|
|
12
|
+
const labelAnimatedStyle = useAnimatedStyle(() => {
|
|
13
|
+
const scale = labelScale.value;
|
|
14
|
+
const width = labelWidth.value;
|
|
15
|
+
|
|
16
|
+
return {
|
|
17
|
+
position: 'absolute',
|
|
18
|
+
zIndex: 999,
|
|
19
|
+
top: labelTop.value,
|
|
20
|
+
transform: [{ translateX: -width / 2 }, { scale }, { translateX: width / 2 }],
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
labelTop.value = withTiming(isLabelFloated ? -2 : 8, { duration: 180 });
|
|
26
|
+
labelScale.value = withTiming(isLabelFloated ? 0.8 : 1, { duration: 180 });
|
|
27
|
+
}, [isLabelFloated]);
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
labelAnimatedStyle,
|
|
31
|
+
};
|
|
32
|
+
}
|
package/src/shared/generators/ui-kit/lib-files/shared/ui/ui-kit/src/text-input/index.ts.template
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './component';
|
|
@@ -4,6 +4,7 @@ exports.assertFirstLine = assertFirstLine;
|
|
|
4
4
|
exports.mockGenerateFiles = mockGenerateFiles;
|
|
5
5
|
const fs = require("fs");
|
|
6
6
|
const path = require("path");
|
|
7
|
+
const BINARY_FILE_PATTERN = /\.(ttf|otf|eot|woff2?|png|jpe?g|gif|ico|webp|pdf)$/i;
|
|
7
8
|
function assertFirstLine(sourceDir, targetDir, tree, options = {}) {
|
|
8
9
|
var _a;
|
|
9
10
|
const { placeholders = {}, ignoreFiles = [] } = options;
|
|
@@ -59,6 +60,10 @@ function mockGenerateFiles(tree, srcDir, destDir, templateVars) {
|
|
|
59
60
|
});
|
|
60
61
|
}
|
|
61
62
|
const destPath = path.join(dest, fileName).split(path.sep).join('/');
|
|
63
|
+
if (BINARY_FILE_PATTERN.test(fileName)) {
|
|
64
|
+
tree.write(destPath, fs.readFileSync(srcPath));
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
62
67
|
let content = fs.readFileSync(srcPath, 'utf8');
|
|
63
68
|
if (templateVars) {
|
|
64
69
|
Object.entries(templateVars).forEach(([key, value]) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../plugin/src/shared/tests-utils/utils.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../plugin/src/shared/tests-utils/utils.ts"],"names":[],"mappings":"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"}
|