Translation matrix should be keyed as such:
en | file location | text/key | translation |
---|---|---|---|
zh | screens/ScreenName | Hello | 你好 |
zh | screens/ScreenName | Bye | 再见 |
de | screens/ScreenName | Bye | Tschüss |
In this matrix, the key will always be the english representation of the text. Hence, the 'key' must be verbose.
The benefits of this design allows:
-
Improved developer experience: The components/screens will always have up to date english presentation of what you see on the app. This allows developers with all levels of experience, to CMD/CTRL + SHIFT + F and find responsible code easily.
-
Improved translation experience: Translator will be translating from the english text instead of 'keys' which is suboptimal. When the english text change context or meaning, it will always require all translations to be updated.
Type | Location |
---|---|
ui | app/screens/**.test.ts |
api | app/hooks/**.test.ts |
e2e | cypress/e2e/functional |
Elements should have testID
attribute to be used as unique selector. This attribute is decoupled to any styling or
behavior changes.
By not using __tests__
directory, this keep the imports (../button
) clean and makes the file structure flat. Making
it easier for discovery of test and keep the related concerns together.
app/
├─ components/
│ ├─ button.tsx
│ └─ button.test.tsx
Each package or functionality must be accompanied by full coverage testing.
Due to Javascript type coercion, all test assertions must use strict equality checking.
- expect(1).toBe('1')
- expect(1).toEqual('1')
+ expect(1).toStrictEqual(1)
Tailwind should be used to write all styles, and styles file should be avoided. If the component gets too complex, you should separate it into its own component.
<View style={tailwind("flex-1 items-center justify-center")}>
<Button title="Click" onPress={() => setCount(count + 2)} />
<Text testID="count">Count: {count}</Text>
</View>
TODO comments should usually include the author's github username in parentheses. Example:
// TODO(fuxingloh): Add tests.
Please follow the guidelines outlined at https://github.com/DeFiCh/.github/blob/main/CODE_OF_CONDUCT.md
Each package, feature, code and decision should be explicit and well documented over implicitly guessing.
TypeScript must be used for all code written in this project.
It's an anti-pattern for scaling code, it gives a false impression of separation of concern. All it does is create a mass of code concentration within project that were better separated.
An analogy for this problem is file organization in projects. Many of us have come to agree that organizing files by file type (e.g. splitting everything into html, js and css folders) don't really scale. The code related to a feature will be forced to be split between three folders, just for a false impression of "separation of concerns". The key here is that "concerns" is not defined by file type. Instead, most of us opt to organize files by feature or responsibility. vuejs/rfcs#55 (comment)
Example: Use foo.bar.ts
instead of foo-bar.ts
.