storebound/examples/demo-app/storebound.config.ts

74 lines
3.7 KiB
TypeScript

// storebound config of the demo app "Tidy Lists" (fictional, made for this repo) to show the app profile and the app
// screenshot style. Placeholder ids and URLs only: nothing here points at a real store record. See README.md.
import type { ShipConfig } from '../../cli/lib/config';
const config: ShipConfig = {
app: {
name: 'Tidy Lists',
profile: 'app',
copyright: '2026 Example Studio',
privacyPolicyUrl: 'https://example.com/privacy',
termsUrl: 'https://example.com/terms',
supportUrl: 'https://example.com/support',
website: 'https://example.com',
contactEmail: 'support@example.com',
},
accounts: { enabled: true, deletionUrl: 'https://example.com/delete-account', inApp: 'Settings > Account > Delete account' },
reviewAccess: { signInRequired: true, instructions: 'Sign in with the demo account; the Groceries list is shared with a second demo user.' },
languages: [
{ id: 'en', play: 'en-US', apple: 'en-US' },
{ id: 'tr', play: 'tr-TR', apple: 'tr' },
],
play: { packageName: 'com.example.tidylists' },
apple: { bundleId: 'com.example.tidylists' },
// Play Data safety answers (`storebound play data-safety --dry` prints the CSV Play imports). Lists sync to the account.
dataSafety: {
collectsData: true,
encryptedInTransit: true,
accountCreation: ['PSL_ACM_USER_ID_PASSWORD'],
partialDeletion: false, // a page that deletes data without deleting the account? (true needs partialDeletionUrl)
data: {
PSL_EMAIL: { shared: false, collect: ['functionality', 'account'] },
PSL_USER_ACCOUNT: { shared: false, collect: ['functionality', 'account'] },
PSL_USER_GENERATED_CONTENT: { shared: false, collect: ['functionality'] },
PSL_CRASH_LOGS: { shared: false, collect: ['analytics'] },
},
},
// `storebound scan` findings that are true for this fictional demo and accepted on purpose (README.md)
scan: {
ignore: [
{ rule: 'template-answers', reason: 'fictional demo app: its Example Studio copyright is the placeholder of a project that is never uploaded' },
{ rule: 'demo-account', reason: 'fictional demo app without a store record: there is no backend to sign in to, so no App Review demo account' },
{ rule: 'play-app-access', reason: 'fictional demo app without a store record: no Play App access credentials' },
{ rule: 'play-package-name', reason: 'fictional demo app: com.example.* is the repo placeholder and is never uploaded' },
{ rule: 'play-testing-requirement', reason: 'fictional demo app without a Play developer account, so there is no account type to set' },
],
},
renders: 'store/renders',
shots: {
style: 'app',
copy: 'store/shots/copy.json',
frames: 'store/shots/frames',
out: 'store/renders',
scenes: [
{ id: 'lists', palette: 'mist', frames: [{ src: 'lists.png' }] },
{ id: 'check', palette: 'mint', frames: [{ src: 'list.png' }] },
{ id: 'share', palette: 'sky', frames: [{ src: 'share.png' }] },
{ id: 'account', palette: 'slate', frames: [{ src: 'account.png' }] },
],
feature: { frame: 'lists.png', palette: 'mist' },
capture: {
source: 'web',
baseUrl: 'http://127.0.0.1:8741',
query: 'lang={lang}',
shots: {
lists: { path: '/?screen=lists', waitFor: 'window.app && app.ready', delayMs: 100, device: 'both' },
list: { path: '/?screen=list', waitFor: 'window.app && app.ready', delayMs: 100, device: 'both' },
share: { path: '/?screen=share', waitFor: 'window.app && app.ready', delayMs: 100, device: 'both' },
account: { path: '/?screen=account', waitFor: 'window.app && app.ready', delayMs: 100, device: 'both' },
},
},
},
};
export default config;