{"id":19761322,"url":"https://github.com/cap-go/angular-data-storage-sqlite-app-starter","last_synced_at":"2025-04-30T13:33:13.201Z","repository":{"id":40933840,"uuid":"241585809","full_name":"Cap-go/angular-data-storage-sqlite-app-starter","owner":"Cap-go","description":"Ionic/Angular Data Storage SQLite App Starter","archived":false,"fork":false,"pushed_at":"2024-08-15T15:39:22.000Z","size":18327,"stargazers_count":6,"open_issues_count":14,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-23T05:39:40.722Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Cap-go.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"Cap-go","patreon":null,"open_collective":"capgo","ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2020-02-19T09:49:24.000Z","updated_at":"2024-08-15T15:38:28.000Z","dependencies_parsed_at":"2024-11-12T03:40:37.977Z","dependency_job_id":null,"html_url":"https://github.com/Cap-go/angular-data-storage-sqlite-app-starter","commit_stats":null,"previous_names":["cap-go/angular-data-storage-sqlite-app-starter"],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cap-go%2Fangular-data-storage-sqlite-app-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cap-go%2Fangular-data-storage-sqlite-app-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cap-go%2Fangular-data-storage-sqlite-app-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cap-go%2Fangular-data-storage-sqlite-app-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Cap-go","download_url":"https://codeload.github.com/Cap-go/angular-data-storage-sqlite-app-starter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251713020,"owners_count":21631473,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-12T03:40:30.693Z","updated_at":"2025-04-30T13:33:13.194Z","avatar_url":"https://github.com/Cap-go.png","language":"TypeScript","funding_links":["https://github.com/sponsors/Cap-go","https://opencollective.com/capgo"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\u003cbr\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/16580653?v=4\" width=\"128\" height=\"128\" /\u003e\u003c/p\u003e\n\n\u003ch3 align=\"center\"\u003eIonic/Angular Data Storage SQLite App Starter\u003c/h3\u003e\n\u003cp align=\"center\"\u003e\u003cstrong\u003e\u003ccode\u003e-angular-data-storage-sqlite-app-starter\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cbr\u003e\n\u003cp align=\"center\" style=\"font-size:50px;color:red\"\u003e\u003cstrong\u003eCAPACITOR 4\u003c/strong\u003e\u003c/p\u003e\u003cbr\u003e\n\u003cp align=\"center\"\u003eIonic/Angular application demonstrating the use of the\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cstrong\u003e\u003ccode\u003ecapacitor-data-storage-sqlite\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cbr\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/maintenance/yes/2022?style=flat-square\" /\u003e\n  \u003ca href=\"https://github.com/jepiqueau/angular-data-storage-sqlite-app-starter\"\u003e\u003cimg src=\"https://img.shields.io/github/license/jepiqueau/angular-data-storage-sqlite-app-starter?style=flat-square\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/jepiqueau/angular-data-storage-sqlite-app-starter\"\u003e\u003cimg src=\"https://img.shields.io/github/package-json/v/jepiqueau/angular-data-storage-sqlite-app-starter?style=flat-square\" /\u003e\u003c/a\u003e\n\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n\u003ca href=\"#contributors-\"\u003e\u003cimg src=\"https://img.shields.io/badge/all%20contributors-1-orange?style=flat-square\" /\u003e\u003c/a\u003e\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n\u003c/p\u003e\n\n## Maintainers\n\n| Maintainer        | GitHub                                    | Social |\n| ----------------- | ----------------------------------------- | ------ |\n| Quéau Jean Pierre | [jepiqueau](https://github.com/jepiqueau) |        |\n\n\n## Installation\n\nTo start building your App using this Starter App, clone this repo to a new directory:\n\n```bash\ngit clone https://github.com/jepiqueau/angular-data-storage-sqlite-app-starter.git \ncd angular-data-storage-sqlite-app-starter\ngit remote rm origin\n```\n\n - then install it\n\n```bash\nnpm install --save capacitor-data-storage-sqlite\nnpm install --save localforage\n```\n\n - then go to the building process\n\n```bash\nnpm run build\nnpx cap update\nnpx cap update @capacitor-community/electron\nnpm run build\nnpx cap copy\nnpx cap copy web\nnpx cap copy @capacitor-community/electron\n```\n\nthe capacitor config parameters are:\n\n```\n\"appId\": \"com.example.app.capacitor.datastoragesqlite\"\n\"appName\": \"angular-data-storage-sqlite-app-starter\"\n```\n\n### Building Web Code\n\n```bash\nnpx cap serve\n```\n\n\n### Building Native Project\n\n#### IOS\n\n```bash\nnpx cap open ios\n```\nOnce Xcode launches, you can build your finally app binary through the standard Xcode workflow.\n\n#### Android\n\n```bash\nnpx cap open android\n```\nOnce Android Studio launches, you can build your app through the standard Android Studio workflow.\n\n#### Electron\n\n```bash\nnpx cap open @capacitor-community/electron\n```\n\n#### Resulting Output\n\n```\nThe DataStore test was successful\n```\n\nAt the end of the test, one un-encrypted store should have been created\n\n```\nstorageSQLite.db\n```\n\n### Changing the 'secret' and 'new secret'\n\n#### IOS\n\nIn Xcode, before building your app, \n - Go to the ```Pods/Development Pods/CapacitorDataStorageSqlite``` folder, \n - Modify the ```secret``` and ```newsecret```strings in the Global.swift file.\n\n#### Android\n\nIn Android Studio, before building your app,\n - Go to the ```capacitor-data-storage-sqlite/java/com.jeep.plugin.capacitor/cdssUtils```folder,\n - Modify the ```secret``` and ```newsecret```strings in the Global.java file.\n\n### Angular Service\n\nA Angular Service has been defined as a wrapper to the ```capacitor-data-storage-sqlite``` plugin.\n\n```ts\nimport { Injectable } from '@angular/core';\n\nimport { Capacitor } from '@capacitor/core';\nimport { CapacitorDataStorageSqlite,} from 'capacitor-data-storage-sqlite';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class StoreService {\n  store: any;\n  isService: boolean = false;\n  platform: string;\n  constructor() {\n  }\n  /**\n   * Plugin Initialization\n   */\n  async init(): Promise\u003cvoid\u003e {\n    this.platform = Capacitor.getPlatform();\n    this.store = CapacitorDataStorageSqlite;\n    this.isService = true;\n    console.log('in init ',this.platform,this.isService)\n  }\n  /**\n   * Echo a value\n   * @param value \n   */\n  async echo(value: string): Promise\u003cany\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n        try {\n            return await this.store.echo(value);\n        } catch (err) {\n            console.log(`Error ${err}`)\n            return Promise.reject(new Error(err));\n        }\n    } else {\n        return Promise.reject(new Error(\"openStore: Store not opened\"));\n    }\n  }\n\n  /**\n   * Open a Store\n   * @param _dbName string optional\n   * @param _table string optional\n   * @param _encrypted boolean optional \n   * @param _mode string optional\n   */  \n  async openStore(_dbName?:string,_table?:string,_encrypted?:boolean,_mode?:string): Promise\u003cvoid\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      const database: string = _dbName ? _dbName : \"storage\";\n      const table: string = _table ? _table : \"storage_table\";\n      const encrypted:boolean = _encrypted ? _encrypted : false;\n      const mode: string = _mode ? _mode : \"no-encryption\";\n      try {\n        console.log(\"in openStore Service \")\n        console.log(`database ${database}`)\n        console.log(`table ${table}`)\n        await this.store.openStore({database,table,encrypted,mode});\n        return Promise.resolve();\n      } catch (err) {\n        return Promise.reject(err);\n      }      \n    } else {\n      return Promise.reject(new Error(\"openStore: Store not opened\"));\n    }\n  }\n  /**\n   * Close a store\n   * @param dbName \n   * @returns \n   */\n  async closeStore(dbName: String): Promise\u003cvoid\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      try {\n        await this.store.closeStore({database:dbName});\n        return Promise.resolve();\n      } catch (err) {\n        return Promise.reject(err);\n      }      \n    } else {\n      return Promise.reject(new Error(\"close: Store not opened\"));\n    }\n  }\n  /**\n   * Check if a store is opened\n   * @param dbName \n   * @returns \n   */\n  async isStoreOpen(dbName: String): Promise\u003cvoid\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      try {\n        const ret = await this.store.isStoreOpen({database:dbName});\n        return Promise.resolve(ret);\n      } catch (err) {\n        return Promise.reject(err);\n      }      \n    } else {\n      return Promise.reject(new Error(\"isStoreOpen: Store not opened\"));\n    }\n  }\n  /**\n   * Check if a store already exists\n   * @param dbName\n   * @returns \n   */\n  async isStoreExists(dbName: String): Promise\u003cvoid\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      try {\n        const ret = await this.store.isStoreExists({database:dbName});\n        return Promise.resolve(ret);\n      } catch (err) {\n        return Promise.reject(err);\n      }      \n    } else {\n      return Promise.reject(new Error(\"isStoreExists: Store not opened\"));\n    }\n  }\n  /**\n   * Create/Set a Table\n   * @param table string\n   */  \n  async setTable(table:string): Promise\u003cvoid\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      try {\n        await this.store.setTable({table});\n        return Promise.resolve();\n      } catch (err) {\n        return Promise.reject(err);\n      }      \n    } else {\n      return Promise.reject(new Error(\"setTable: Store not opened\"));\n    }\n  }\n  /**\n   * Set of Key\n   * @param key string \n   * @param value string\n   */\n  async setItem(key:string,value:string): Promise\u003cvoid\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      if(key.length \u003e 0) {\n        try {\n          await this.store.set({ key, value });\n          return Promise.resolve();\n        } catch (err) {\n          return Promise.reject(err);\n        }      \n      } else {\n        return Promise.reject(new Error(\"setItem: Must give a key\"));\n      }\n    } else {\n      return Promise.reject(new Error(\"setItem: Store not opened\"));\n    }\n  }\n  /**\n   * Get the Value for a given Key\n   * @param key string \n   */\n  async getItem(key:string): Promise\u003cstring\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      if(key.length \u003e 0) {\n        try {\n          const {value} = await this.store.get({ key });\n          console.log(\"in getItem value \",value)\n          return Promise.resolve(value);\n        } catch (err) {\n          console.log(`$$$$$ in getItem key: ${key} err: ${JSON.stringify(err)}`)\n          return Promise.reject(err);\n        }      \n      } else {\n        return Promise.reject(new Error(\"getItem: Must give a key\"));\n      }\n    } else {\n      return Promise.reject(new Error(\"getItem: Store not opened\"));\n    }\n\n  }\n  async isKey(key:string): Promise\u003cboolean\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      if(key.length \u003e 0) {\n        try {\n          const {result} = await this.store.iskey({ key });\n          return Promise.resolve(result);\n        } catch (err) {\n          return Promise.reject(err);\n        }\n      } else {\n        return Promise.reject(new Error(\"isKey: Must give a key\"));\n      }\n    } else {\n      return Promise.reject(new Error(\"isKey: Store not opened\"));\n    }\n\n  }\n\n  async getAllKeys(): Promise\u003cArray\u003cstring\u003e\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      try {\n        const {keys} = await this.store.keys();\n        return Promise.resolve(keys); \n      } catch (err) {\n        return Promise.reject(err);\n      }\n    } else {\n      return Promise.reject(new Error(\"getAllKeys: Store not opened\"));\n    }\n  }\n  async getAllValues(): Promise\u003cArray\u003cstring\u003e\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      try {\n        const {values} = await this.store.values();\n        return Promise.resolve(values);\n      } catch (err) {\n        return Promise.reject(err);\n      }\n    } else {\n      return Promise.reject(new Error(\"getAllValues: Store not opened\"));\n    }\n  }\n  async getFilterValues(filter:string): Promise\u003cArray\u003cstring\u003e\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      try {\n        const {values} = await this.store.filtervalues({ filter });\n        return Promise.resolve(values);\n      } catch (err) {\n        return Promise.reject(err);\n      }\n    } else {\n      return Promise.reject(new Error(\"getFilterValues: Store not opened\"));\n    }\n  }\n  async getAllKeysValues(): Promise\u003cArray\u003cany\u003e\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      try {\n        const {keysvalues} = await this.store.keysvalues();\n        return Promise.resolve(keysvalues);\n      } catch (err) {\n        return Promise.reject(err);\n      }\n    } else {\n      return Promise.reject(new Error(\"getAllKeysValues: Store not opened\"));\n    }\n  }\n\n  async removeItem(key:string): Promise\u003cvoid\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      if(key.length \u003e 0) {\n        try {\n          await this.store.remove({ key });\n          return Promise.resolve();\n        } catch (err) {\n          return Promise.reject(err);\n        }\n      } else {\n        return Promise.reject(new Error(\"removeItem: Must give a key\"));\n      }\n    } else {\n      return Promise.reject(new Error(\"removeItem: Store not opened\"));\n    }\n  }\n\n  async clear(): Promise\u003cvoid\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      try {\n        await this.store.clear();\n        return Promise.resolve();\n      } catch (err) {\n          return Promise.reject(err.message);\n        } \n    } else {\n      return Promise.reject(new Error(\"clear: Store not opened\"));\n    }\n  }\n\n  async deleteStore(_dbName?:string): Promise\u003cvoid\u003e {\n    const database: string = _dbName ? _dbName : \"storage\";\n    await this.init();\n    if(this.isService \u0026\u0026 this.store != null) {\n      try {\n        await this.store.deleteStore({database});\n        return Promise.resolve();\n      } catch (err) {\n          return Promise.reject(err.message);\n      } \n    } else {\n      return Promise.reject(new Error(\"deleteStore: Store not opened\"));\n    }\n  }\n  async isTable(table:string): Promise\u003cboolean\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      if(table.length \u003e 0) {\n        try {\n          const {result} = await this.store.isTable({ table });\n          return Promise.resolve(result);\n        } catch (err) {\n          return Promise.reject(err);\n        }\n      } else {\n        return Promise.reject(new Error(\"isTable: Must give a table\"));\n      }\n    } else {\n      return Promise.reject(new Error(\"isTable: Store not opened\"));\n    }\n  }\n  async getAllTables(): Promise\u003cArray\u003cstring\u003e\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      try {\n        const {tables} = await this.store.tables();\n        return Promise.resolve(tables); \n      } catch (err) {\n        return Promise.reject(err);\n      }\n    } else {\n      return Promise.reject(new Error(\"getAllTables: Store not opened\"));\n    }\n  }\n  async deleteTable(table?:string): Promise\u003cvoid\u003e {\n    if(this.isService \u0026\u0026 this.store != null) {\n      if(table.length \u003e 0) {\n        try {\n          await this.store.deleteTable({table});\n          return Promise.resolve();\n        } catch (err) {\n            return Promise.reject(err);\n        } \n      } else {\n        return Promise.reject(new Error(\"deleteTable: Must give a table\"));\n      }\n    } else {\n      return Promise.reject(new Error(\"deleteTable: Store not opened\"));\n    }\n  }\n}\n\n````\n\n## Starting an App from Scratch\n\nThe process described below follows the instructions provided in the [Capacitor Documentation](https://capacitor.ionicframework.com/docs/getting-started/with-ionic/)\n\n### New Ionic/Angular Project\n\n```bash\nionic start myStorageApp tabs --type=angular --capacitor\ncd ./myStorageApp\n``` \n\n### Initialize Capacitor\n\n```bash\nnpx cap init myStorageApp com.example.app\n```\n\nYour App information [appName] [appId] can be whathever you would like. \nHere we choose for the example [myStorageApp] [com.example.app]\n\n### Install capacitor-data-storage-sqlite plugin\n\n```bash\nnpm install --save capacitor-data-storage-sqlite\nnpm install --save @capacitor-community/electron@next\n```\n\n### Add an Angular Service\n\n```bash\nng g service sqlite\n```\n\nIn your favorite editor open the ```store.services.ts``` file under the ```src/app/services```folder and input the code as described above\n\n### Access the Angular Service in your App Angular Components\n\n#### Import in your Angular Component\n\n```ts\nimport { StoreService } from '../services/store.service';\n```\n\n#### Inject the StoreService in your Angular Component Constructor\n\n```ts\n  constructor(private _StoreService: StoreService) {\n  }\n```\n\n#### Initialize CapacitorDataStorageSqlite plugin\n\n```ts\n  async ngAfterViewInit() {\n        // Initialize the CapacitorDataStorageSQLite plugin\n        await this._StoreService.init();\n\n    ...\n  }\n```\n\n#### Usage of the CapacitorDataStorageSqlite plugin in Angular Component Methods\n\n```ts\nasync fooMethod(): Promise\u003cvoid\u003e {\n    ...\n    if(this._StoreService.isService) {\n      // open the data storage\n      let result:any = await this._StoreService.openStore();\n      console.log('storage retCreate result',result)\n      if (result) {\n        await this._StoreService.clear();\n        // store data in the first store\n        await this._StoreService.setItem(\"session\",\"Session Opened\");\n        result = await this._StoreService.getItem(\"session\");\n        console.log('result ',result)\n        ...\n      }\n\n    } else {\n      console.log(\"CapacitorDataStorageSqlite Service is not initialized\");\n    }\n    ...\n}\n```\n\nWhen the database is open, use the other methods provided by the Angular Service to setItem, getItem, removeItem, clear, ...\n\n### Build your App\n\n```bash\nnpm run build\n```\n\n### Add Platforms\n\n```bash\nnpx cap add ios\nnpx cap add android\nnpx cap add @capacitor-community/electron\n```\n\n### Building and Syncing your App with Capacitor\n\n```bash\nnpm run build\nnpx cap copy\nnpx cap copy @capacitor-community/electron\n```\n\n### Open IDE to Build, Run and Deploy\n\n#### IOS\n\n```bash\nnpx cap open ios\n```\nOnce Xcode launches, you can build your finally app binary through the standard Xcode workflow.\n\n#### Android\n\n```bash\nnpx cap open android\n```\n\nOnce Android launches,\n\n - Edit the MainActivity.java and add the following import:\n\n```java\nimport com.jeep.plugin.capacitor.CapacitorDataStorageSqlite;\n```\n\n - Add the CapacitorDataStorageSQLite declaration in the this.init method\n\n```java\nadd(CapacitorDataStorageSqlite.class);\n```\n\n - you can then build your app through the standard Android Studio workflow.\n\n#### Electron\n\nIn the Electron folder of your application\n\n```bash\nnpm install --save sqlite3\nnpm install --save-dev @types/sqlite3\nnpm install --save-dev electron-rebuild\n```\n\nModify the Electron package.json file by adding a script `\"rebuild-deps\"` if it is not existing\n\n```json\n  \"scripts\": {\n    \"rebuild-deps\": \"electron-rebuild\"\n  },\n```\n\nExecute the postinstall script\n\n```bash\nnpm run rebuild-deps\n```\nGo back in the main folder of your application\nand then build the application\n\n```bash\n npx cap update\n npx cap update @capacitor-community/electron\n npm run build\n npx cap copy\n npx cap open @capacitor-community/electron\n```\n\nThe datastores created are under **YourApplication/Electron/DataStorage**\n\n\n### When capacitor-data-storage-sqlite plugin is updated\n\nFollow this process:\n\n```bash\nnpm install --save capacitor-data-storage-sqlite@latest\nnpx cap update\nnpx cap update @capacitor-community/electron\nnpm run build\nnpx cap copy\nnpx cap copy @capacitor-community/electron\nnpx cap open ios\nnpx cap open android\nnpx cap open @capacitor-community/electron\nionic serve\n```\n\n### Test Capacitor-Data-Storage-SQLite access\n\nThe ```capacitor-data-storage-sqlite``` test is accessible in the Tab2 of the Application by clicking on the Store test button.\n\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/jepiqueau\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/16580653?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJean Pierre Quéau\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/jepiqueau/angular-data-storage-sqlite-app-starter/commits?author=jepiqueau\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-enable --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcap-go%2Fangular-data-storage-sqlite-app-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcap-go%2Fangular-data-storage-sqlite-app-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcap-go%2Fangular-data-storage-sqlite-app-starter/lists"}