{"_id":"@alphatechma/atch-template-expo","_rev":"2-ca23f75e5dabac1fe4966640cd8e9089","name":"@alphatechma/atch-template-expo","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@alphatechma/atch-template-expo","version":"1.0.0","keywords":["expo","react-native","template","starter","typescript","mobile","alphatech"],"license":"MIT","_id":"@alphatechma/atch-template-expo@1.0.0","maintainers":[{"name":"mesquitadev","email":"mesquitadev@gmail.com"}],"homepage":"https://github.com/alphatechma/atch-template-expo#readme","bugs":{"url":"https://github.com/alphatechma/atch-template-expo/issues"},"dist":{"shasum":"7cfeab830e43f6082cbb2a153e08d856282c89a7","tarball":"https://registry.npmjs.org/@alphatechma/atch-template-expo/-/atch-template-expo-1.0.0.tgz","fileCount":64,"integrity":"sha512-7aWUqPGBYg86DLNlLb7rn06mAHZcFgd0/KV9XrirLO3dJ3BARmSUYKqk3ZeXbxM9KHPvCKqaRhzW0qdgzSOb8Q==","signatures":[{"sig":"MEYCIQDutQZBq2ZpwukQZRCQCTWm2zJJ9Sk0iTVryfKg+29kEgIhAIA+WpmVBOBFOd/mp1WpxADvdiZO0l/77HQFeJZPzwHd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":132072},"main":"index.ts","engines":{"node":">=22.13.0"},"gitHead":"1e3657b42846cd372b7e149259412c523373228f","scripts":{"ios":"expo run:ios","web":"expo start --web","lint":"eslint .","test":"jest","start":"expo start","doctor":"npx expo-doctor","format":"prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"","verify":"yarn typecheck && yarn lint && yarn test --passWithNoTests","android":"expo run:android","prepare":"husky","release":"semantic-release","test:ci":"jest --ci --coverage","lint:fix":"eslint . --fix","prebuild":"expo prebuild --clean","typecheck":"tsc --noEmit","format:check":"prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\""},"_npmUser":{"name":"mesquitadev","email":"mesquitadev@gmail.com"},"repository":{"url":"git+https://github.com/alphatechma/atch-template-expo.git","type":"git"},"_npmVersion":"11.19.1","description":"Template oficial Alphatech para apps React Native com Expo (TypeScript, Redux Toolkit, React Navigation, styled-components).","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx}":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]},"resolutions":{"conventional-changelog-conventionalcommits":"9.3.1"},"_nodeVersion":"22.23.2","dependencies":{"yup":"^1.7.1","expo":"~57.0.21","react":"19.2.3","date-fns":"^4.4.0","expo-font":"~57.0.3","react-dom":"19.2.3","react-redux":"^9.3.0","expo-linking":"~57.0.9","expo-updates":"~57.0.21","react-native":"0.86.3","@expo/log-box":"~57.0.4","expo-constants":"~57.0.17","expo-system-ui":"~57.0.3","expo-status-bar":"~57.0.1","react-hook-form":"^7.87.0","@reduxjs/toolkit":"^2.12.0","react-native-svg":"15.15.4","react-native-web":"~0.21.0","@expo/dom-webview":"~57.0.1","expo-secure-store":"~57.0.3","styled-components":"^6.5.3","@expo/vector-icons":"^15.0.2","expo-splash-screen":"~57.0.8","@expo/metro-runtime":"~57.0.15","@hookform/resolvers":"^5.9.1","@gorhom/bottom-sheet":"^5.2.14","react-native-screens":"~4.26.0","react-native-worklets":"0.10.1","react-native-reanimated":"4.5.1","@react-navigation/native":"^7.3.18","@expo-google-fonts/roboto":"^0.4.3","react-native-gesture-handler":"~2.32.0","@react-navigation/bottom-tabs":"^7.18.18","@react-navigation/native-stack":"^7.18.10","react-native-safe-area-context":"~5.7.0","@react-native-masked-view/masked-view":"0.3.2","@react-native-async-storage/async-storage":"2.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22","devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","eslint":"^9.39.0","prettier":"^3.9.6","jest-expo":"~57.0.5","typescript":"~6.0.3","@babel/core":"^7.29.7","@types/jest":"^29.5.14","@types/node":"^22.14.0","lint-staged":"^17.5.1","@types/react":"~19.2.2","test-renderer":"^1.2.0","@commitlint/cli":"^21.2.2","semantic-release":"^25.0.9","eslint-config-expo":"~57.0.2","@semantic-release/git":"^10.0.1","eslint-config-prettier":"^10.1.8","@react-native/jest-preset":"0.86.3","@react-native/metro-config":"0.86.3","@semantic-release/changelog":"^6.0.3","@testing-library/react-native":"^14.0.1","@commitlint/config-conventional":"^21.2.2"},"_npmOperationalInternal":{"tmp":"tmp/atch-template-expo_1.0.0_1789052202296_0.7583512547222215","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@alphatechma/atch-template-expo","version":"1.1.0","main":"index.ts","description":"Template oficial Alphatech para apps React Native com Expo (TypeScript, Redux Toolkit, React Navigation, styled-components).","keywords":["expo","react-native","template","starter","typescript","mobile","alphatech"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/alphatechma/atch-template-expo.git"},"bugs":{"url":"https://github.com/alphatechma/atch-template-expo/issues"},"homepage":"https://github.com/alphatechma/atch-template-expo#readme","engines":{"node":">=22.13.0"},"packageManager":"yarn@1.22.22","scripts":{"start":"expo start","android":"expo run:android","ios":"expo run:ios","web":"expo start --web","prebuild":"expo prebuild --clean","doctor":"npx expo-doctor","lint":"eslint .","lint:fix":"eslint . --fix","format":"prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"","format:check":"prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\"","typecheck":"tsc --noEmit","test":"jest","test:ci":"jest --ci --coverage","verify":"yarn typecheck && yarn lint && yarn test --passWithNoTests","prepare":"husky","release":"semantic-release"},"dependencies":{"@expo-google-fonts/roboto":"^0.4.3","@expo/dom-webview":"~57.0.1","@expo/log-box":"~57.0.4","@expo/metro-runtime":"~57.0.15","@expo/vector-icons":"^15.0.2","@gorhom/bottom-sheet":"^5.2.14","@hookform/resolvers":"^5.9.1","@react-native-async-storage/async-storage":"2.2.0","@react-native-masked-view/masked-view":"0.3.2","@react-navigation/bottom-tabs":"^7.18.18","@react-navigation/native":"^7.3.18","@react-navigation/native-stack":"^7.18.10","@reduxjs/toolkit":"^2.12.0","date-fns":"^4.4.0","expo":"~57.0.21","expo-constants":"~57.0.17","expo-font":"~57.0.3","expo-linking":"~57.0.9","expo-secure-store":"~57.0.3","expo-splash-screen":"~57.0.8","expo-status-bar":"~57.0.1","expo-system-ui":"~57.0.3","expo-updates":"~57.0.21","react":"19.2.3","react-dom":"19.2.3","react-hook-form":"^7.87.0","react-native":"0.86.3","react-native-gesture-handler":"~2.32.0","react-native-reanimated":"4.5.1","react-native-safe-area-context":"~5.7.0","react-native-screens":"~4.26.0","react-native-svg":"15.15.4","react-native-web":"~0.21.0","react-native-worklets":"0.10.1","react-redux":"^9.3.0","styled-components":"^6.5.3","zod":"^4.6.1"},"devDependencies":{"@babel/core":"^7.29.7","@commitlint/cli":"^21.2.2","@commitlint/config-conventional":"^21.2.2","@react-native/jest-preset":"0.86.3","@react-native/metro-config":"0.86.3","@semantic-release/changelog":"^6.0.3","@semantic-release/git":"^10.0.1","@testing-library/react-native":"^14.0.1","@types/jest":"^29.5.14","@types/node":"^22.14.0","@types/react":"~19.2.2","eslint":"^9.39.0","eslint-config-expo":"~57.0.2","eslint-config-prettier":"^10.1.8","husky":"^9.1.7","jest":"^29.7.0","jest-expo":"~57.0.5","lint-staged":"^17.5.1","prettier":"^3.9.6","semantic-release":"^25.0.9","test-renderer":"^1.2.0","typescript":"~6.0.3"},"lint-staged":{"*.{js,jsx,ts,tsx}":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]},"publishConfig":{"access":"public"},"resolutions":{"conventional-changelog-conventionalcommits":"9.3.1"},"gitHead":"8588427c3e91645ec1fddba0b39c60e43715f273","_id":"@alphatechma/atch-template-expo@1.1.0","_nodeVersion":"22.23.2","_npmVersion":"11.19.1","dist":{"integrity":"sha512-Uzgj3bFY7VBf0p8NYqtboqoW4creH7Nmkch1oV/fq7wB3Q3AxafNNUP8WS4WVmSsJEMaW0FT0/OUo5ePP2LzpA==","shasum":"3f8d0020133f2746e8f8703ae6280e160ad68b61","tarball":"https://registry.npmjs.org/@alphatechma/atch-template-expo/-/atch-template-expo-1.1.0.tgz","fileCount":94,"unpackedSize":182400,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCTHcWLmUsdRnGqhhB4WQavH07smdR9/MFhsvw5MfKvlgIhAN3MAFBS7Nv8+9/WY4vG7vKY8vIkKlwrP2srdHNP98x4"}]},"_npmUser":{"name":"mesquitadev","email":"mesquitadev@gmail.com"},"directories":{},"maintainers":[{"name":"mesquitadev","email":"mesquitadev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/atch-template-expo_1.1.0_1789053097027_0.15018452924465264"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-10T14:56:42.012Z","modified":"2026-09-10T15:11:37.356Z","1.0.0":"2026-09-10T14:56:42.448Z","1.1.0":"2026-09-10T15:11:37.168Z"},"bugs":{"url":"https://github.com/alphatechma/atch-template-expo/issues"},"license":"MIT","homepage":"https://github.com/alphatechma/atch-template-expo#readme","keywords":["expo","react-native","template","starter","typescript","mobile","alphatech"],"repository":{"type":"git","url":"git+https://github.com/alphatechma/atch-template-expo.git"},"description":"Template oficial Alphatech para apps React Native com Expo (TypeScript, Redux Toolkit, React Navigation, styled-components).","maintainers":[{"name":"mesquitadev","email":"mesquitadev@gmail.com"}],"readme":"# atch-template-expo\n\nTemplate oficial da Alphatech para apps **React Native + Expo**.\n\nPara projetos que autenticam via **Keycloak**, use o\n[`atch-template-keycloak-rn`](https://github.com/alphatechma/atch-template-keycloak-rn),\nque é este mesmo template com a camada de autenticação por cima.\n\n```bash\nnpx create-expo-app meu-app --template @alphatechma/atch-template-expo\ncd meu-app\ncp .env.example .env      # preencha EXPO_PUBLIC_API_URL\nyarn start\n```\n\n## Stack\n\n| Camada         | Escolha                                                              |\n| -------------- | -------------------------------------------------------------------- |\n| Runtime        | Expo SDK 57 · React Native 0.86 · React 19.2                         |\n| Linguagem      | TypeScript 6 (`strict`, `noUncheckedIndexedAccess`)                  |\n| Navegação      | React Navigation 7 (native-stack + bottom-tabs)                      |\n| Estado / dados | Redux Toolkit + RTK Query                                            |\n| Estilo         | styled-components/native com tokens em `src/styles/theme.ts`         |\n| Formulários    | react-hook-form + zod                                                |\n| Testes         | Jest (`jest-expo`) + React Native Testing Library 14                 |\n| Qualidade      | ESLint 9 flat (`eslint-config-expo`) + Prettier + husky + commitlint |\n| Release        | semantic-release (conventional commits)                              |\n\n## Estrutura\n\n```\nsrc/\n  @types/      declarações globais (assets, navegação)\n  components/  componentes reutilizáveis\n  config/      leitura de variáveis de ambiente\n  contexts/    contexts React\n  features/    cliente HTTP e slices de domínio (RTK Query)\n  hooks/       providers globais e hooks tipados\n  lib/errors/  classificação de erros da API\n  routes/      árvore de navegação\n  screens/     telas\n  services/    integrações locais (ex.: token no SecureStore)\n  store/       configuração da store\n  styles/      tokens e helpers de layout\n  types/       tipos compartilhados (Page<T>)\n  utils/       funções puras (documentos, formatadores)\n```\n\n### Imports\n\nExiste **um** alias, `@/`, apontando para `src/`:\n\n```ts\nimport { Home } from '@/screens';\n```\n\nEle é declarado só no `tsconfig.json`. O `babel-preset-expo` lê os `paths` do\ntsconfig desde o SDK 49, então não há `module-resolver` no `babel.config.js` —\nmanter duas listas de alias garante que uma hora elas divergem (foi o que\naconteceu na versão anterior deste template, e imports por `@features/*`\npassavam no type check e quebravam em runtime).\n\n## Componentes\n\nTodos usam os tokens de `src/styles/theme.ts`, respeitam a altura mínima de\ntoque de 48dp e declaram papel e estado de acessibilidade.\n\n### Primitivos\n\n| Componente   | Para quê                                                                                                        |\n| ------------ | --------------------------------------------------------------------------------------------------------------- |\n| `Button`     | 5 variantes (`primary`, `secondary`, `outline`, `ghost`, `danger`), 3 tamanhos, `loading`, `icone`, `fullWidth` |\n| `Text`       | Texto tipado pelos tokens: `variant` (title…caption) e `tom` (default, muted, primary, error, success)          |\n| `Card`       | Bloco com título e subtítulo; vira botão quando recebe `onPress`                                                |\n| `Loading`    | Indicador em modo `tela` ou `inline`                                                                            |\n| `EmptyState` | Lista vazia com ícone, explicação e ação opcional                                                               |\n\n### Campos\n\nControlados e ignorantes de formulário — recebem `value`/`onChange` e nada mais,\nentão servem também fora de um form.\n\n| Componente | Para quê                                                                                         |\n| ---------- | ------------------------------------------------------------------------------------------------ |\n| `Campo`    | Moldura comum: label, marca de obrigatório, erro e ajuda                                         |\n| `Input`    | Texto, com `mascara` (cpf, cnpj, cep, telefone), `senha` com olho, ícone à esquerda, `multiline` |\n| `Select`   | Opção única em modal — mesma aparência nos dois sistemas                                         |\n| `Checkbox` | Área de toque na linha inteira, não só no quadrado                                               |\n| `Switch`   | Com label e descrição                                                                            |\n\n### Ligados ao react-hook-form\n\n`FormInput`, `FormSelect`, `FormCheckbox`, `FormSwitch` e o `FormField` genérico.\nDispensam escrever `Controller` e `errors.campo?.message` em cada tela:\n\n```tsx\nconst { control, handleSubmit } = useForm<Entrada, unknown, Saida>({\n  resolver: zodResolver(schema),\n  defaultValues: { nome: '', setor: '', aceite: false },\n});\n\n<FormInput control={control} name=\"nome\" label=\"Nome\" obrigatorio />\n<FormInput control={control} name=\"cpf\" label=\"CPF\" mascara=\"cpf\" keyboardType=\"numeric\" />\n<FormSelect control={control} name=\"setor\" label=\"Setor\" options={SETORES} />\n<FormCheckbox control={control} name=\"aceite\" label=\"Aceito os termos\" />\n<Button title=\"Enviar\" onPress={handleSubmit(enviar)} />\n```\n\nA separação entre camadas é intencional: os componentes de UI não importam o\nreact-hook-form, e por isso continuam utilizáveis fora de um formulário. Quem\nfaz a ponte é o `FormField`.\n\n### Validação com zod\n\nO schema é a fonte única — o tipo do formulário sai dele por inferência, em vez\nde ser reescrito à mão:\n\n```ts\nexport const schema = z.object({\n  nome: z.string().trim().min(3, 'Informe ao menos 3 caracteres.'),\n  quantidade: z.coerce.number('Informe um numero.').int().positive(),\n});\n\nexport type Entrada = z.input<typeof schema>; // o que os campos entregam\nexport type Saida = z.output<typeof schema>; // o que chega no submit\n```\n\n`z.coerce` importa: o `TextInput` sempre entrega **string**. Sem ele, todo campo\nnumérico reprova um valor que o usuário digitou certo — e é por isso que\nentrada e saída são tipos diferentes.\n\nA tela `src/screens/Home` é um formulário completo montado com essas peças e\nserve de referência; substitua-a pela primeira tela real do projeto.\n\n## Variáveis de ambiente\n\nSó variáveis com prefixo `EXPO_PUBLIC_` chegam ao bundle, e **elas são legíveis\npor quem tiver o app** — nunca coloque segredo ali.\n\nA leitura é centralizada em `src/config/env.ts`, e falha alto quando uma\nvariável obrigatória não existe, em vez de mandar requisição para\n`undefined/...`. Mas a leitura acontece **dentro da requisição**, não no import:\num projeto recém-criado sem `.env` abre normalmente e mostra o erro na tela que\nfez a chamada, em vez de tela branca.\n\n> O `babel-preset-expo` substitui `process.env.EXPO_PUBLIC_*` por literal em\n> tempo de transform. Por isso cada variável aparece escrita por extenso em\n> `env.ts`: `process.env[nome]` com nome dinâmico volta `undefined` no bundle.\n\n`APP_ENV` (`development` | `staging` | `production`) é lida pelo `app.config.ts`\ne muda nome, bundle id e canal de update. Os três perfis correspondentes estão\nno `eas.json`.\n\n## Camada de API\n\n`src/features/api/baseQuery.ts` é o ponto de entrada HTTP:\n\n- injeta `Authorization: Bearer <token>` lendo o **SecureStore**;\n- resolve a `baseUrl` por requisição (ver acima);\n- devolve `CUSTOM_ERROR` legível quando falta configuração.\n\nOs endpoints entram por `injectEndpoints` em arquivos de feature — veja\n`src/features/example/exampleSlice.ts`, que serve de molde e deve ser apagado.\n\n### Erros\n\n`src/lib/errors/resolveApiError.ts` traduz qualquer erro do RTK Query em\n`{ kind, message, status, errorId, variant }`. A regra que ele garante:\n\n- **4xx** usa a mensagem do backend, que diz o que corrigir;\n- **5xx** usa **sempre** a mensagem genérica, mesmo que o backend mande detalhe\n  técnico — para não vazar SQL/stacktrace na tela e não culpar o usuário por\n  uma falha que não é dele.\n\n```ts\nconst { message, variant } = resolveApiError(error);\n```\n\n## Tokens de autenticação\n\nFicam no **SecureStore** (keychain/keystore), não no AsyncStorage — veja\n`src/services/tokenStorage.ts`. AsyncStorage é texto puro no sandbox do app.\n\nPara estado não sensível que precisa sobreviver ao fechamento do app, use\n`useArmazenamento` (`src/hooks/useArmazenamento.ts`), que é AsyncStorage com a\nergonomia do `useState` — e devolve `carregado`, porque a leitura é assíncrona e\nsem esse sinal a tela pisca o valor padrão antes do que estava salvo.\n\n## Utilitários incluídos\n\n| Módulo                  | O que traz                                                                                  |\n| ----------------------- | ------------------------------------------------------------------------------------------- |\n| `utils/documentos.ts`   | `validaCPF`, `validaCNPJ`, máscaras progressivas de CPF/CNPJ/CEP/telefone                   |\n| `utils/formatadores.ts` | `formatarData`, `formatarDataHora`, `formatarMoeda`, `formatarNumero`, `juntar`, `saudacao` |\n| `types/index.ts`        | `Page<T>` do Spring Data, `PageParams`, `paginaVazia`                                       |\n\n## Convenções de commit\n\nConventional commits, validados pelo commitlint no hook `commit-msg`. O\nsemantic-release deriva a versão e o CHANGELOG dessas mensagens:\n\n- `fix:` → patch\n- `feat:` → minor\n- `feat!:` ou `BREAKING CHANGE:` → major\n\n## Testes\n\nJest com o preset `jest-expo` e React Native Testing Library 14 (onde `render` é\n**assíncrono** e as queries saem do `screen`).\n\nA convenção herdada do SIGMA: **lógica pura em módulo próprio, testada sem\nmontar componente nem hook**, com `describe`/`it` em português descrevendo o\ncomportamento de negócio, e um comentário citando o bug real que originou o\nteste quando for o caso. `src/__tests__/baseQuery.test.ts` é o exemplo.\n\nO `transformIgnorePatterns` do `jest.config.js` inclui o Redux Toolkit e libs\ndele — sem isso qualquer teste que importe a store morre com\n`Unexpected token 'export'`.\n\n## Scripts\n\n| Script                      | O que faz                                              |\n| --------------------------- | ------------------------------------------------------ |\n| `yarn start`                | Servidor de desenvolvimento                            |\n| `yarn android` / `yarn ios` | Build nativo local (dev client)                        |\n| `yarn prebuild`             | Regenera `android/` e `ios/` do zero                   |\n| `yarn verify`               | typecheck + lint + testes (é o que o CI roda)          |\n| `yarn doctor`               | `expo-doctor` — alinhamento das dependências com a SDK |\n| `yarn release`              | semantic-release (só no CI)                            |\n\n## CI/CD\n\nQuatro workflows em `.github/workflows/`:\n\n| Workflow                | Quando roda              | O que faz                                                |\n| ----------------------- | ------------------------ | -------------------------------------------------------- |\n| `ci.yml` · **verify**   | PR e push em `main`      | typecheck, lint, format, testes, `expo-doctor`           |\n| `ci.yml` · **template** | PR e push em `main`      | cria um projeto de verdade a partir do template e valida |\n| `eas-build.yml`         | manual                   | build nativo por perfil, com submit opcional             |\n| `eas-update.yml`        | push em `main`/`develop` | atualização OTA no canal correspondente                  |\n| `release.yml`           | push em `main`           | semantic-release: versão, CHANGELOG, tag, publish no npm |\n\n### Por que existe o job `template`\n\nRodar a suíte **dentro** do template não prova que ele funciona **como**\ntemplate. Três bugs reais passaram pelo `verify` e só apareceram quando um\nprojeto foi criado de fato: o projeto nascia com o nome do template, o app abria\nem tela branca sem `.env`, e o `npm install` quebrava por conflito de peer deps.\nO job faz o ciclo completo — `npm pack`, `create-expo-app`, `npm install`,\ntypecheck, lint, testes, `expo-doctor` e `expo export` sem `.env`.\n\n### Secrets e variáveis\n\n| Nome             | Tipo     | Para quê                                                                     |\n| ---------------- | -------- | ---------------------------------------------------------------------------- |\n| `EXPO_TOKEN`     | secret   | EAS Build e EAS Update ([expo.dev](https://expo.dev/settings/access-tokens)) |\n| `NPM_TOKEN`      | secret   | publicar no npm (só no repositório do template)                              |\n| `EAS_HABILITADO` | variable | `true` liga o EAS Update automático                                          |\n\n```bash\ngh secret set EXPO_TOKEN\ngh variable set EAS_HABILITADO --body true\n```\n\nO `eas-update.yml` fica inerte enquanto `EAS_HABILITADO` não for `true` — assim\no workflow viaja no template sem tentar publicar nada.\n\n### Build vs update\n\n`runtimeVersion` usa a policy `appVersion`: uma atualização OTA só alcança\nbuilds da **mesma versão** do app. Mudança que exija código nativo novo — uma\ndependência com módulo nativo, uma permissão a mais — precisa de build, não de\nupdate. Por isso o build é manual e separado: ele custa minuto de EAS e tem que\nser uma decisão, não um efeito colateral de push.\n\n## Ao iniciar um projeto\n\n1. Ajuste `NOME_BASE`, `BUNDLE_BASE` e `scheme` no `app.config.ts`.\n   O **nome** do app vem do `app.json` que o `create-expo-app` escreve, então\n   ele já nasce com o nome que você deu ao projeto.\n2. Troque os assets em `assets/`.\n3. Apague `src/features/example/` e o teste `Button.test.tsx` se não usar o\n   componente.\n4. Preencha o `.env`.\n5. `eas init` e `eas update:configure` para preencher `EAS_PROJECT_ID` e\n   `EAS_UPDATE_URL`.\n","readmeFilename":"README.md"}