<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: yosan</title>
    <description>The latest articles on DEV Community by yosan (@yosan).</description>
    <link>https://dev.to/yosan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F427358%2F13a7744f-8bad-4df1-b988-149ee15bf7cb.jpeg</url>
      <title>DEV Community: yosan</title>
      <link>https://dev.to/yosan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yosan"/>
    <language>en</language>
    <item>
      <title>Test with Firestore Emulator on GitHub Actions</title>
      <dc:creator>yosan</dc:creator>
      <pubDate>Wed, 14 Jul 2021 21:17:22 +0000</pubDate>
      <link>https://dev.to/yosan/test-with-firestore-emulator-on-github-actions-ngm</link>
      <guid>https://dev.to/yosan/test-with-firestore-emulator-on-github-actions-ngm</guid>
      <description>&lt;p&gt;I'm developing a web site using Next.js hosted by Cloud Functions. It uses Firestore as main database. And some Firestore-Trigger functions exist.&lt;/p&gt;

&lt;p&gt;Now, I wanted to test my functions and firestore.rules with Firestore Emulator. Due to  manage its codes in GitHub, I wanted to use GitHub Actions for test.&lt;/p&gt;

&lt;p&gt;I tried some ways to find more simple way to achive it. As a result of various investigations, I think preparing all-in-one GitHub Actions instance and using &lt;code&gt;firebase emulators:exec&lt;/code&gt; command is most simple way.&lt;/p&gt;

&lt;p&gt;Here is how I setup auto testing system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup local test
&lt;/h2&gt;

&lt;p&gt;First of all, write tests and setup configurations to be able to run test in my local machine. &lt;/p&gt;

&lt;p&gt;Here is what I committed.&lt;br&gt;
&lt;a href="https://github.com/yosan/tennico/pull/13/files"&gt;https://github.com/yosan/tennico/pull/13/files&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'll explain some points in it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Use firebase emulators:exec
&lt;/h3&gt;

&lt;p&gt;Add this setting to package.json.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"firebase emulators:exec —only firestore 'jest --silent'"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;firebase emulators:exec&lt;/code&gt; is useful command. It downloads, launch, and stop Firebase Emulator automatically.&lt;/p&gt;

&lt;p&gt;While executing tests, many Cloud Functions logs are shown on our console so that it's hard to read test results. So I use &lt;code&gt;jest --silent&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Devide Cloud Functions' index.ts
&lt;/h3&gt;

&lt;p&gt;Usually we import an index.ts which exports all of Cloud Function's implementations to wrap &lt;code&gt;firebase-functions-test&lt;/code&gt;. But if a function which serves Next.js is contained in it, it becomes difficult to import index.ts because Next.js needs many settings to do so. Therefore, I separated Next.js function and other functions. Only import functions except Next.js one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/functions
├── index.ts
├── tsconfig.json
├── __tests__
├── firestore &amp;lt;- Not Next.js functions
└── web &amp;lt;- Next.js function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mock algolia
&lt;/h3&gt;

&lt;p&gt;My functions use algolia to register my Firestore document to index. Mocking alogolia client is little hard for me. This is how I mocked it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;mockSaveObject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ReturnType&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;jest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nx"&gt;jest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;algoliasearch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;mockSaveObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;mockReturnValue&lt;/span&gt;&lt;span class="p"&gt;({})&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;initIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;saveObject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;mockSaveObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Setup GitHub Actions
&lt;/h2&gt;

&lt;p&gt;This is the diff of setup.&lt;br&gt;
&lt;a href="https://github.com/yosan/tennico/pull/14"&gt;https://github.com/yosan/tennico/pull/14&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Workflow Settings
&lt;/h3&gt;

&lt;p&gt;I made settings referring to Cloud Functions runtime environment. &lt;/p&gt;

&lt;p&gt;This was my first time to use GitHub Actions. I felt good because workflow settings was simple and I didn't have to write Dockerfile.&lt;/p&gt;

&lt;p&gt;Firebase Emulator needs to project ID selection to launch and some credential is needed for it. I specified it from "GitHub &amp;gt; Settings &amp;gt; Secrets".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CI&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-18.04&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;FIREBASE_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.FIREBASE_TOKEN }}&lt;/span&gt;
      &lt;span class="na"&gt;GCLOUD_PROJECT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GCLOUD_PROJECT }}&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;10.18.1'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-java@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;java-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;15.0.2'&lt;/span&gt;
          &lt;span class="na"&gt;java-package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jdk&lt;/span&gt;
          &lt;span class="na"&gt;architecture&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;x64&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Test&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn test --project ${GCLOUD_PROJECT}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before I wrote this settings, I found many articles which said using Docker Compose is needed to use Firebase Emulator on GitHub Actions.&lt;/p&gt;

&lt;p&gt;Maybe there are some difference we can do between them. But I wanted to do was only to test Cloud Functions and firestore.rules and it seemed that it would become more complex by Docker Compose. So, I did't use it.&lt;/p&gt;

&lt;h3&gt;
  
  
  functions.config()
&lt;/h3&gt;

&lt;p&gt;If &lt;code&gt;.runtimeconfig&lt;/code&gt; is pushed, &lt;code&gt;functions.config()&lt;/code&gt; can return value. But we shouldn't do that if we published our code on public repository in GitHub.&lt;/p&gt;

&lt;p&gt;I set default value to resolve runtime error. For example, when I want to refer algolia API key in Cloud Functions environment variables, I write code like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;algoliasearch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;functions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;algolia&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;app_id&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;functions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;algolia&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;admin_key&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ofcource, the client will return error when it calls Algolia API. But we can avoid it by mocking client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally
&lt;/h2&gt;

&lt;p&gt;It works!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cu2cEFgE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2lj4fbc4xo2w9xi32cp6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cu2cEFgE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2lj4fbc4xo2w9xi32cp6.png" alt="20210305060628"&gt;&lt;/a&gt; &lt;/p&gt;

</description>
      <category>firebase</category>
      <category>github</category>
      <category>testing</category>
    </item>
    <item>
      <title>Export Firebase Firestore data to BigQuery</title>
      <dc:creator>yosan</dc:creator>
      <pubDate>Tue, 21 Jul 2020 12:30:09 +0000</pubDate>
      <link>https://dev.to/yosan/export-firebase-firestore-data-to-bigquery-2fjl</link>
      <guid>https://dev.to/yosan/export-firebase-firestore-data-to-bigquery-2fjl</guid>
      <description>&lt;p&gt;This article is about "how to export Firestore data to BigQuery".&lt;/p&gt;

&lt;h1&gt;
  
  
  Use Firebase Extension if your service is before published
&lt;/h1&gt;

&lt;p&gt;I haven't used yet but I think you can use this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://firebase.google.com/products/extensions/firestore-bigquery-export"&gt;Firebase Extensions | Export Collections to BigQuery&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This extension can sync Firestore data with BigQuery in realtime.&lt;/p&gt;

&lt;p&gt;But if your service is already published, you have to move existing Firestore data to BigQuery by other method.&lt;/p&gt;

&lt;h1&gt;
  
  
  Use gcloud if your service is already published
&lt;/h1&gt;

&lt;p&gt;You can use "gcloud" command (and "bq" command installed at the same time) to export it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create service account
&lt;/h3&gt;

&lt;p&gt;Set roles refering these documents.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/docs/firestore/manage-data/export-import#before_you_begin"&gt;Export and import data  |  Firebase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/bigquery/docs/loading-data-cloud-firestore#permissions"&gt;Loading data from Firestore exports  |  BigQuery  |  Google Cloud&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Command Example
&lt;/h3&gt;

&lt;p&gt;When this commands are executed, BigQuery table is replaced with latest firestore data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set service account key file&lt;/span&gt;
gcloud auth activate-service-account &lt;span class="nt"&gt;--key-file&lt;/span&gt; key.json

&lt;span class="c"&gt;# Set project&lt;/span&gt;
gcloud config &lt;span class="nb"&gt;set &lt;/span&gt;project my-firebase-project

&lt;span class="c"&gt;# Export Firestore data to Storage by collection group&lt;/span&gt;
gcloud firestore &lt;span class="nb"&gt;export &lt;/span&gt;gs://firestore-export-for-bq/2020-06-29T10:17:23.011+09:00 &lt;span class="nt"&gt;--collection-ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;user,shop,product

&lt;span class="c"&gt;# Import data to BigQuery by collection group&lt;/span&gt;
bq load &lt;span class="nt"&gt;--source_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DATASTORE_BACKUP &lt;span class="nt"&gt;--replace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;--projection_fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;name firestore.user gs://firestore-export-for-bq/2020-06-29T10:17:23.011+09:00/all_namespaces/kind_user/all_namespaces_kind_user.export_metadata
bq load &lt;span class="nt"&gt;--source_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DATASTORE_BACKUP &lt;span class="nt"&gt;--replace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;--projection_fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;name,owners firestore.shop gs://firestore-export-for-bq/2020-06-29T10:17:23.011+09:00/all_namespaces/kind_shop/all_namespaces_kind_shop.export_metadata
bq load &lt;span class="nt"&gt;--source_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DATASTORE_BACKUP &lt;span class="nt"&gt;--replace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;--projection_fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;name,price firestore.product gs://firestore-export-for-bq/2020-06-29T10:17:23.011+09:00/all_namespaces/kind_product/all_namespaces_kind_product.export_metadata
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can filter like privacy data by using &lt;code&gt;projection_fields&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Schedule commands using Google official image in Docker Hub
&lt;/h1&gt;

&lt;p&gt;Google publishes official Docker image to use gcloud commands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hub.docker.com/r/google/cloud-sdk/"&gt;google/cloud-sdk - Docker Hub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think we can create scheduled BigQuery exporting easily by using this image with Cloud Run.&lt;/p&gt;

</description>
      <category>firebase</category>
      <category>gcp</category>
      <category>bigquery</category>
      <category>firestore</category>
    </item>
    <item>
      <title>Export user records in Firebase Auth to Google Spreadsheet</title>
      <dc:creator>yosan</dc:creator>
      <pubDate>Thu, 09 Jul 2020 00:09:26 +0000</pubDate>
      <link>https://dev.to/yosan/export-user-records-in-firebase-auth-to-google-spreadsheet-3fjd</link>
      <guid>https://dev.to/yosan/export-user-records-in-firebase-auth-to-google-spreadsheet-3fjd</guid>
      <description>&lt;p&gt;I published node project to export user records in Firebase Auth to Google Spreadsheet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/yosan/FirebaseAuth2Sheet"&gt;https://github.com/yosan/FirebaseAuth2Sheet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can get user email's without downloading them to local. It is good for privacy when this code is executed in some server.&lt;/p&gt;

</description>
      <category>firebase</category>
      <category>googlecloud</category>
      <category>typescript</category>
      <category>node</category>
    </item>
  </channel>
</rss>
