From 9b441bd2fa1b5b6d81713bbfe833db974f917b49 Mon Sep 17 00:00:00 2001 From: Fumika Koyama Date: Wed, 15 May 2024 15:57:09 +0900 Subject: [PATCH 01/10] =?UTF-8?q?TypeScript=E3=83=BBVite=E3=81=AE=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=81=AB=E9=96=A2=E3=81=99=E3=82=8B=E3=83=9A=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=82=92=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../how-to-develop/vue-js/project-settings.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md diff --git a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md new file mode 100644 index 000000000..858257ebf --- /dev/null +++ b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md @@ -0,0 +1,10 @@ +--- +title: Vue.js 開発手順 +description: Vue.js を用いた クライアントサイドアプリケーションの 開発手順を説明します。 +--- + +# プロジェクトの共通設定 {#top} + +## TypeScript の設定 {#typescript-settings} + +## Vite の設定 {#vite-settings} From d65a010443bb190a42ff4cfa9b159344a4c60c70 Mon Sep 17 00:00:00 2001 From: Fumika Koyama Date: Fri, 24 May 2024 11:24:16 +0900 Subject: [PATCH 02/10] =?UTF-8?q?tsconfig=E3=81=A8vite.config=E3=81=AE?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=81=AB=E9=96=A2=E3=81=99=E3=82=8B=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=82=92=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vue-js/vue-tsconfig-light.drawio | 70 ++++++ .../guidebooks/how-to-develop/vue-js/index.md | 1 + .../how-to-develop/vue-js/project-settings.md | 229 +++++++++++++++++- .../vue-js/vue-tsconfig-light.png | Bin 0 -> 48658 bytes documents/mkdocs.yml | 1 + 5 files changed, 300 insertions(+), 1 deletion(-) create mode 100644 documents/_materials/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-light.drawio create mode 100644 documents/contents/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-light.png diff --git a/documents/_materials/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-light.drawio b/documents/_materials/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-light.drawio new file mode 100644 index 000000000..aeaa73bd3 --- /dev/null +++ b/documents/_materials/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-light.drawio @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/documents/contents/guidebooks/how-to-develop/vue-js/index.md b/documents/contents/guidebooks/how-to-develop/vue-js/index.md index 8a983005a..b6f271173 100644 --- a/documents/contents/guidebooks/how-to-develop/vue-js/index.md +++ b/documents/contents/guidebooks/how-to-develop/vue-js/index.md @@ -10,6 +10,7 @@ Vue.js を用いてフロントエンドアプリケーションを開発する 1. [事前準備](preparation.md) 1. [ブランクプロジェクトの作成](create-vuejs-blank-project.md) 1. [ブランクプロジェクトのフォルダー構造](folder-structure-of-blank-project.md) +1. [プロジェクトの共通設定](project-settings.md) 1. [開発に使用するパッケージ](optional-packages.md) 1. [CSSの設定とCSSフレームワークの適用](css.md) 1. [静的コード分析とフォーマット](static-verification-and-format.md) diff --git a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md index 858257ebf..bac59af12 100644 --- a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md +++ b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md @@ -5,6 +5,233 @@ description: Vue.js を用いた クライアントサイドアプリケーシ # プロジェクトの共通設定 {#top} -## TypeScript の設定 {#typescript-settings} +## TypeScript の設定 {#typescript-settings} + +TypeScript で作成されたファイルは、 `tsconfig.json` の設定値をもとにコンパイルが実行されます。 +`tsconfig.json` の存在するフォルダーとその配下のフォルダーの該当ファイルに設定が適用されます。 + +[ブランクプロジェクトの作成](./create-vuejs-blank-project.md) の手順に沿って `create-vue` でプロジェクトを作成すると、以下の `tsconfig.json` および `tsconfig.*.json` が生成されます。 +各 `tsconfig.*.json` には `include` に指定したファイル群のコンパイルに関する設定値が定義されています。 + +```terminal linenums="0" + +├ cypress +| └ tsconfig.json--------- 単体テストの TypeScript として読み込む対象を定義する設定ファイル(Cypress 用) +├ tsconfig.app.json ------- アプリケーションの TypeScript として読み込む対象を定義する設定ファイル +├ tsconfig.node.json ------ TypeScript の設定ファイルとして読み込む対象を定義する設定ファイル +├ tsconfig.json ----------- TypeScript の設定ファイル +└ tsconfig.vitest.json ---- 単体テストの TypeScript として読み込む対象を定義する設定ファイル(vitest 用) +``` + +自動生成されたルートの `tsconfig.json` では、 Project Reference 機能により `references` に指定された `tsconfig.*.json` を参照します。 +つまり、 TypeScript プロジェクトを `references` で指定したファイルに基づいて論理分割しています。 +論理分割することにより、以下のような利点があります。 + +- アプリケーションコードからテストコードを参照するような歪な依存関係を防ぐ +- ビルド時のパフォーマンスを改善する + +Project Reference 機能については[Project References :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/project-references.html){ target=_blank }を参照してください。 + +なお、 `tsconfig.app.json` `tsconfig.node.json` には npm パッケージで提供されている tsconfig を継承するように設定されているため、継承元の設定値が存在します。 +`extends` に定義されている継承元ファイルを参照して実際の設定値を確認できます。 +また、 `references` で参照されているファイルでは `compilerOptions.composite` を `true` に設定する必要があります。 + +![tsconfigの継承関係](../../../images/guidebooks/how-to-develop/vue-js/vue-tsconfig-light.png#only-light){ loading=lazy } + + +### tsconfig の設定値の解説 {#tsconfig} + +- `compilerOptions.noEmit` + + コンパイルの結果を出力しないよう設定するプロパティです。デフォルト値の `true` を設定します。 + ビルドで利用する package.json に定義されたスクリプトでは Vite でトランスパイルを行い、型チェックには `vue-tsc` が利用されるためです。 + Vite では `esbuild` または `rollup` でトランスパイルを行い、`tsc` を型チェックのみに利用するため、トランスパイルの結果を出力しません。 + +- `compilerOptions.tsBuildInfoFile` + + ビルド結果の差分を示す `.tsbuildinfo` ファイルの出力先を指定するプロパティです。 + `noEmit` を `true` としていても、出力先を明示しない場合は tsconfig.json と同じフォルダーに `.tsbuildinfo` ファイルが出力されます。 + そのため、デフォルト値である node_modules 配下の一時フォルダーを指定し、不要なファイルの出力を防いでいます。 + +- `compilerOptions.module` + + コンパイルしたファイルのモジュールシステムを設定するプロパティです。 + tsconfig.node.json で `ESNext` 、 tsconfig.json で `NodeNext` がデフォルトで設定されます。 + Cypress が内部で利用している `ts-node` の挙動の都合上、 tsconfig.json に `compilerOptions.module` が設定されています。 + +- `compilerOptions.moduleResolution` + + モジュール解決の方針を設定するプロパティです。 + tsconfig.node.json ではデフォルトで Vite での利用が推奨されている `Bundler` に設定されています。`Bundler` についての詳細は[--moduleResolution bundler :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#--moduleresolution-bundler){ target=_blank }を参照してください。 + +??? note "tsconfig.json の設定例" + + ``` json title="tsconfig.json" + { + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.vitest.json" + } + ], + "compilerOptions": { + "module": "NodeNext" + } + } + ``` + +??? note "tsconfig.app.json の設定例" + + - verbatimModuleSyntax + + デフォルトの設定では `true` が設定されており、型のみを import する場合に import type 構文またはインライン type 修飾子が付いていないとエラーになります。 + このオプションは元々`importsNotUsedAsValues` `preserveValueImports` `isolatedModules` の3つのオプションを用いて制御していた挙動を簡略化したものです。 + 詳細は [Verbatim Module Syntax :material-open-in-new:](https://www.typescriptlang.org/tsconfig/#verbatimModuleSyntax){ target=_blank } を参照してください。 + しかし、現在 `openapi-generator-cli` で自動生成されたコードでは `import` と `import type` が区別されないため、暫定的に `false` を設定しています。 + + ``` json title="tsconfig.app.json" hl_lines="13" + { + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "mock/**/*"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + }, + "preserveValueImports": false, + "verbatimModuleSyntax": false + } + } + ``` + +??? note "tsconfig.node.json の設定例" + + AlesInfiny Maris では、フロントエンドアプリを mock モードでビルドする際のソースコードを `mock` 配下に含みます。 + 本来 tsconfig.node.json は設定ファイルとして読み込む対象を定義していますが、vite.config.ts の参照先で mock を参照している都合上、 `"mock/**/*"` を include の対象にしています。 + + ``` json title="tsconfig.node.json" hl_lines="4" + { + "extends": ["@tsconfig/node20/tsconfig.json"], + "include": ["vite.config.*", "vitest.config.*", "cypress.config.*", + "src/generated/api-client/**/*","mock/**/*","vite-plugins/*"], + "compilerOptions": { + "composite": true, + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node"], + } + } + ``` + +??? note "tsconfig.vitest.json の設定例" + + ``` json title="tsconfig.vitest.json" + { + "extends": "./tsconfig.app.json", + "exclude": [], + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.vitest.tsbuildinfo", + "lib": [], + "types": ["node", "jsdom"], + } + } + ``` ## Vite の設定 {#vite-settings} + +[ブランクプロジェクトの作成](./create-vuejs-blank-project.md) の手順に沿って `create-vue` でプロジェクトを作成すると、プロジェクトルートに `vite.config.ts` が生成されます。 +`vite.config.ts` に設定を追加することでビルド時の設定が定義できます。 +`vite` コマンドを実行する際、プロジェクトルートの `vite.config.ts` の設定値が自動的に読み込まれます。 + +### vite.config の設定値の解説 {#vite-config} + +- [条件付き設定 :material-open-in-new:](https://ja.vitejs.dev/config/#%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E8%A8%AD%E5%AE%9A){ target=_blank } + + コマンドやモードに応じて異なる設定を適用する場合、関数を export して設定します。 + + ``` ts + export default defineConfig(({ command, mode, isSsrBuild, isPreview }) => { + if (command === 'serve') { + return { + // 固有の設定 + } + } else { + // ... + } + }) + ``` + + 設定例では mock モードでビルドした際に、デフォルトのプラグインに加えてモック用に定義したプラグインを読み込んでいます。 + + なお、条件付き設定のために関数を export する際は `vitest.config.ts` の実装も変更が必要です。 + `vitest.config.ts` の設定については[Managing Vitest config file :material-open-in-new:](https://vitest.dev/config/file.html){ target=_blank }を参照してください。 + +- `loadEnv()` + + モードに応じた `.env.*` ファイルを読み込み、環境変数を取得します。 + 詳しくは[環境変数を設定に使用する :material-open-in-new:](https://ja.vitejs.dev/config/#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B){ target=_blank }を参照してください。 + +- [resolve.alias :material-open-in-new:](https://ja.vitejs.dev/config/shared-options.html#resolve-alias){ target=_blank } + + パスエイリアスを設定して、 import するパスの指定を簡潔にできます。 + +- [server.proxy :material-open-in-new:](https://ja.vitejs.dev/config/server-options.html#server-proxy){ target=_blank } + + 特定のパスで始まるリクエストの振り分け先を指定できます。 + 設定例では `/api`, `/swagger` で始まるパスのリクエストをバックエンドアプリで処理するよう指定しています。 + +??? note "vite.config.ts の設定例" + + ``` ts title="vite.config.ts" + import { fileURLToPath, URL } from 'url'; + + import { defineConfig, loadEnv } from 'vite'; + import vue from '@vitejs/plugin-vue'; + import vueJsx from '@vitejs/plugin-vue-jsx'; + import { setupMockPlugin } from './vite-plugins/setup-mock'; + + // https://vitejs.dev/config/ + export default defineConfig(({ mode }) => { + const plugins = [vue(), vueJsx()]; + const env = loadEnv(mode, process.cwd()); + + return { + plugins: mode === 'mock' ? [...plugins, setupMockPlugin()] : plugins, + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, + server: { + proxy: { + '/api': { + target: env.VITE_PROXY_ENDPOINT_ORIGIN, + changeOrigin: true, + configure: (proxy, options) => { + options.autoRewrite = true; + options.secure = false; + }, + }, + '/swagger': { + target: env.VITE_PROXY_ENDPOINT_ORIGIN, + changeOrigin: true, + secure: false, + }, + }, + }, + }; + }); + + ``` diff --git a/documents/contents/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-light.png b/documents/contents/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-light.png new file mode 100644 index 0000000000000000000000000000000000000000..aaae67a7f21bbe7c2a890f32a39f25d4f847623e GIT binary patch literal 48658 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 literal 0 HcmV?d00001 diff --git a/documents/mkdocs.yml b/documents/mkdocs.yml index 9eae2b2ff..3499d9cef 100644 --- a/documents/mkdocs.yml +++ b/documents/mkdocs.yml @@ -69,6 +69,7 @@ nav: - 事前準備: guidebooks/how-to-develop/vue-js/preparation.md - ブランクプロジェクトの作成: guidebooks/how-to-develop/vue-js/create-vuejs-blank-project.md - ブランクプロジェクトのフォルダー構造: guidebooks/how-to-develop/vue-js/folder-structure-of-blank-project.md + - プロジェクトの共通設定: guidebooks/how-to-develop/vue-js/project-settings.md - 開発に使用するパッケージ: guidebooks/how-to-develop/vue-js/optional-packages.md - CSS の設定と CSS フレームワークの適用: guidebooks/how-to-develop/vue-js/css.md - 静的コード分析とフォーマット: guidebooks/how-to-develop/vue-js/static-verification-and-format.md From 1a8fe6c9a804675b7da7b1dd4a1ba9cb81f20910 Mon Sep 17 00:00:00 2001 From: Fumika Koyama Date: Fri, 24 May 2024 11:31:09 +0900 Subject: [PATCH 03/10] =?UTF-8?q?lint=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AB?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guidebooks/how-to-develop/vue-js/project-settings.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md index bac59af12..17e40837b 100644 --- a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md +++ b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md @@ -30,7 +30,7 @@ TypeScript で作成されたファイルは、 `tsconfig.json` の設定値を - アプリケーションコードからテストコードを参照するような歪な依存関係を防ぐ - ビルド時のパフォーマンスを改善する -Project Reference 機能については[Project References :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/project-references.html){ target=_blank }を参照してください。 +Project Reference 機能については [Project References :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/project-references.html){ target=_blank } を参照してください。 なお、 `tsconfig.app.json` `tsconfig.node.json` には npm パッケージで提供されている tsconfig を継承するように設定されているため、継承元の設定値が存在します。 `extends` に定義されている継承元ファイルを参照して実際の設定値を確認できます。 @@ -62,7 +62,7 @@ Project Reference 機能については[Project References :material-open-in-new - `compilerOptions.moduleResolution` モジュール解決の方針を設定するプロパティです。 - tsconfig.node.json ではデフォルトで Vite での利用が推奨されている `Bundler` に設定されています。`Bundler` についての詳細は[--moduleResolution bundler :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#--moduleresolution-bundler){ target=_blank }を参照してください。 + tsconfig.node.json ではデフォルトで Vite での利用が推奨されている `Bundler` に設定されています。`Bundler` についての詳細は [--moduleResolution bundler :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#--moduleresolution-bundler){ target=_blank } を参照してください。 ??? note "tsconfig.json の設定例" @@ -176,12 +176,12 @@ Project Reference 機能については[Project References :material-open-in-new 設定例では mock モードでビルドした際に、デフォルトのプラグインに加えてモック用に定義したプラグインを読み込んでいます。 なお、条件付き設定のために関数を export する際は `vitest.config.ts` の実装も変更が必要です。 - `vitest.config.ts` の設定については[Managing Vitest config file :material-open-in-new:](https://vitest.dev/config/file.html){ target=_blank }を参照してください。 + `vitest.config.ts` の設定については [Managing Vitest config file :material-open-in-new:](https://vitest.dev/config/file.html){ target=_blank } を参照してください。 - `loadEnv()` モードに応じた `.env.*` ファイルを読み込み、環境変数を取得します。 - 詳しくは[環境変数を設定に使用する :material-open-in-new:](https://ja.vitejs.dev/config/#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B){ target=_blank }を参照してください。 + 詳しくは [環境変数を設定に使用する :material-open-in-new:](https://ja.vitejs.dev/config/#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B){ target=_blank } を参照してください。 - [resolve.alias :material-open-in-new:](https://ja.vitejs.dev/config/shared-options.html#resolve-alias){ target=_blank } From 4a46293582a309e85ea0bf4e47021bb823d705ba Mon Sep 17 00:00:00 2001 From: Fumika Koyama Date: Mon, 27 May 2024 14:32:24 +0900 Subject: [PATCH 04/10] =?UTF-8?q?=E6=8C=87=E6=91=98=E4=BA=8B=E9=A0=85?= =?UTF-8?q?=E3=81=AB=E5=AF=BE=E5=BF=9C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../how-to-develop/vue-js/project-settings.md | 46 +++++++++++++------ 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md index 17e40837b..93a3c4dfa 100644 --- a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md +++ b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md @@ -16,7 +16,7 @@ TypeScript で作成されたファイルは、 `tsconfig.json` の設定値を ```terminal linenums="0" ├ cypress -| └ tsconfig.json--------- 単体テストの TypeScript として読み込む対象を定義する設定ファイル(Cypress 用) +| └ tsconfig.json--------- E2E テストの TypeScript として読み込む対象を定義する設定ファイル(Cypress 用) ├ tsconfig.app.json ------- アプリケーションの TypeScript として読み込む対象を定義する設定ファイル ├ tsconfig.node.json ------ TypeScript の設定ファイルとして読み込む対象を定義する設定ファイル ├ tsconfig.json ----------- TypeScript の設定ファイル @@ -28,11 +28,17 @@ TypeScript で作成されたファイルは、 `tsconfig.json` の設定値を 論理分割することにより、以下のような利点があります。 - アプリケーションコードからテストコードを参照するような歪な依存関係を防ぐ + + 単一の `tsconfig.json` のみを定義している場合、テストコードも `include` する必要があるので、アプリケーションのコードからテストコードのクラスやメソッドを参照してもエラーにならない事があります。 + Project Reference 機能を利用した場合、テストコードとアプリケーションコードとで `tsconfig.json` を分割し、アプリケーションコードからテストコードを参照できないように設定できます。 + - ビルド時のパフォーマンスを改善する + ビルドの度にコード全体をビルドするのではなく、更新があったプロジェクトのみをビルドします。 + Project Reference 機能については [Project References :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/project-references.html){ target=_blank } を参照してください。 -なお、 `tsconfig.app.json` `tsconfig.node.json` には npm パッケージで提供されている tsconfig を継承するように設定されているため、継承元の設定値が存在します。 +なお、 `tsconfig.app.json` `tsconfig.node.json` には npm パッケージで提供されている `tsconfig` を継承するように設定されているため、継承元の設定値が存在します。 `extends` に定義されている継承元ファイルを参照して実際の設定値を確認できます。 また、 `references` で参照されているファイルでは `compilerOptions.composite` を `true` に設定する必要があります。 @@ -43,26 +49,28 @@ Project Reference 機能については [Project References :material-open-in-ne - `compilerOptions.noEmit` - コンパイルの結果を出力しないよう設定するプロパティです。デフォルト値の `true` を設定します。 - ビルドで利用する package.json に定義されたスクリプトでは Vite でトランスパイルを行い、型チェックには `vue-tsc` が利用されるためです。 - Vite では `esbuild` または `rollup` でトランスパイルを行い、`tsc` を型チェックのみに利用するため、トランスパイルの結果を出力しません。 + コンパイルの結果を出力しないよう設定するプロパティです。 `create-vue` した際のデフォルト値の `true` を設定します。 + これは、 `vue-tsc` で型チェックのみを行い、トランスパイルの結果は出力しないようにするためです。 + ビルドで利用する package.json に定義されたスクリプトでは Vite でトランスパイルを行うため、 `vue-tsc` でのトランスパイルは不要になります。 + (※ `vue-tsc` は Vue の単一ファイルコンポーネントをサポートする `tsc` のラッパーです。) - `compilerOptions.tsBuildInfoFile` ビルド結果の差分を示す `.tsbuildinfo` ファイルの出力先を指定するプロパティです。 - `noEmit` を `true` としていても、出力先を明示しない場合は tsconfig.json と同じフォルダーに `.tsbuildinfo` ファイルが出力されます。 - そのため、デフォルト値である node_modules 配下の一時フォルダーを指定し、不要なファイルの出力を防いでいます。 + Project Reference 機能を利用する際、出力先を明示しない場合はルートの tsconfig.json と同じフォルダーに `.tsbuildinfo` ファイルが出力されます。 + プロジェクトルートに不要なファイルが出力されると管理が煩雑になるため、 `create-vue` した際のデフォルト値である node_modules 配下の一時フォルダーを指定しています。 - `compilerOptions.module` コンパイルしたファイルのモジュールシステムを設定するプロパティです。 - tsconfig.node.json で `ESNext` 、 tsconfig.json で `NodeNext` がデフォルトで設定されます。 - Cypress が内部で利用している `ts-node` の挙動の都合上、 tsconfig.json に `compilerOptions.module` が設定されています。 + tsconfig.node.json で `ESNext` 、 tsconfig.json で `NodeNext` が `create-vue` した際にデフォルトで設定されます。 + Cypress が内部で利用している `ts-node` の挙動の都合上、 tsconfig.json に `compilerOptions.module` を設定する必要があります。 + `compilerOptions.module` の設定値については [The module output format :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/modules/theory.html#the-module-output-format){ target=_blank } を参照してください。 - `compilerOptions.moduleResolution` モジュール解決の方針を設定するプロパティです。 - tsconfig.node.json ではデフォルトで Vite での利用が推奨されている `Bundler` に設定されています。`Bundler` についての詳細は [--moduleResolution bundler :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#--moduleresolution-bundler){ target=_blank } を参照してください。 + tsconfig.node.json では `create-vue` した際のデフォルト値として Vite での利用が推奨されている `Bundler` が設定されています。`Bundler` についての詳細は [--moduleResolution bundler :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#--moduleresolution-bundler){ target=_blank } を参照してください。 ??? note "tsconfig.json の設定例" @@ -90,7 +98,8 @@ Project Reference 機能については [Project References :material-open-in-ne - verbatimModuleSyntax - デフォルトの設定では `true` が設定されており、型のみを import する場合に import type 構文またはインライン type 修飾子が付いていないとエラーになります。 + デフォルトの設定では `true` が設定されており、 import type 文 および インラインの type 修飾子が付いている識別子がトランスパイル時に削除されます。 + また、型のみを import する場合に import type 構文を使用するか、インラインの type 修飾子が付いていないとエラーになります。 このオプションは元々`importsNotUsedAsValues` `preserveValueImports` `isolatedModules` の3つのオプションを用いて制御していた挙動を簡略化したものです。 詳細は [Verbatim Module Syntax :material-open-in-new:](https://www.typescriptlang.org/tsconfig/#verbatimModuleSyntax){ target=_blank } を参照してください。 しかし、現在 `openapi-generator-cli` で自動生成されたコードでは `import` と `import type` が区別されないため、暫定的に `false` を設定しています。 @@ -115,8 +124,8 @@ Project Reference 機能については [Project References :material-open-in-ne ??? note "tsconfig.node.json の設定例" - AlesInfiny Maris では、フロントエンドアプリを mock モードでビルドする際のソースコードを `mock` 配下に含みます。 - 本来 tsconfig.node.json は設定ファイルとして読み込む対象を定義していますが、vite.config.ts の参照先で mock を参照している都合上、 `"mock/**/*"` を include の対象にしています。 + AlesInfiny Maris では、フロントエンドアプリを mock モードでビルドする際のソースコードを `mock` フォルダー配下に含みます。 + 本来 tsconfig.node.json は設定ファイルとして読み込む対象を定義すべきですが、vite.config.ts の参照先で `mock` フォルダー内のファイルを参照している都合上、 `"mock/**/*"` を include の対象にしています。 ``` json title="tsconfig.node.json" hl_lines="4" { @@ -175,6 +184,16 @@ Project Reference 機能については [Project References :material-open-in-ne 設定例では mock モードでビルドした際に、デフォルトのプラグインに加えてモック用に定義したプラグインを読み込んでいます。 + ``` ts + export default defineConfig(({ mode }) => { + const plugins = [vue(), vueJsx()]; + + return { + plugins: mode === 'mock' ? [...plugins, setupMockPlugin()] : plugins, + // ... + } + ``` + なお、条件付き設定のために関数を export する際は `vitest.config.ts` の実装も変更が必要です。 `vitest.config.ts` の設定については [Managing Vitest config file :material-open-in-new:](https://vitest.dev/config/file.html){ target=_blank } を参照してください。 @@ -202,7 +221,6 @@ Project Reference 機能については [Project References :material-open-in-ne import vueJsx from '@vitejs/plugin-vue-jsx'; import { setupMockPlugin } from './vite-plugins/setup-mock'; - // https://vitejs.dev/config/ export default defineConfig(({ mode }) => { const plugins = [vue(), vueJsx()]; const env = loadEnv(mode, process.cwd()); From 873c63c58c82c289fb7cd3c2cd6128a1a718ed1a Mon Sep 17 00:00:00 2001 From: Fumika Koyama Date: Tue, 28 May 2024 16:22:07 +0900 Subject: [PATCH 05/10] =?UTF-8?q?noEmit=E3=81=AE=E8=AA=AC=E6=98=8E?= =?UTF-8?q?=E3=81=AB=E3=82=B9=E3=82=AF=E3=83=AA=E3=83=97=E3=83=88=E4=BE=8B?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E8=A8=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../how-to-develop/vue-js/project-settings.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md index 93a3c4dfa..1f8efd4bb 100644 --- a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md +++ b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md @@ -54,6 +54,18 @@ Project Reference 機能については [Project References :material-open-in-ne ビルドで利用する package.json に定義されたスクリプトでは Vite でトランスパイルを行うため、 `vue-tsc` でのトランスパイルは不要になります。 (※ `vue-tsc` は Vue の単一ファイルコンポーネントをサポートする `tsc` のラッパーです。) + ??? note "create-vue で生成されるビルドに関するスクリプト" + + ```json title="package.json" + { + "scripts": { + "build": "run-p type-check \"build-only {@}\" --", + "build-only": "vite build", + "typecheck": "vue-tsc --build --force" + } + } + ``` + - `compilerOptions.tsBuildInfoFile` ビルド結果の差分を示す `.tsbuildinfo` ファイルの出力先を指定するプロパティです。 From 3a741de82fe94b51fac9d7e6c57e607da2686dc2 Mon Sep 17 00:00:00 2001 From: Fumika Koyama Date: Wed, 29 May 2024 16:58:50 +0900 Subject: [PATCH 06/10] =?UTF-8?q?vite.config=E3=81=AE=E8=A7=A3=E8=AA=AC?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../how-to-develop/publication/index.md | 2 + .../how-to-develop/vue-js/project-settings.md | 214 ++++++++++++------ 2 files changed, 141 insertions(+), 75 deletions(-) diff --git a/documents/contents/guidebooks/how-to-develop/publication/index.md b/documents/contents/guidebooks/how-to-develop/publication/index.md index f59de2802..fdca368e7 100644 --- a/documents/contents/guidebooks/how-to-develop/publication/index.md +++ b/documents/contents/guidebooks/how-to-develop/publication/index.md @@ -47,6 +47,8 @@ const wrappedApi = new apiClient.generatedApi(createConfig(), '', axiosInstance) export default wrappedApi; ``` +※ `vite.config.ts` に `server.proxy` の設定をしている場合は [API エンドポイントを設定する際の注意点](../vue-js/project-settings.md#vite-config) も併せて参照してください。 + ### 本番用 env ファイルの作成 {#create-env-prod} 本番用の環境変数ファイルを作成します。 `.env.production` や `.env.prod` など本番用と判断できる名前で env ファイルを作成します。前の手順で作成した `import.meta.env.API_ENDPOINT` に対応する値を設定します。 diff --git a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md index 1f8efd4bb..4e61c4c0d 100644 --- a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md +++ b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md @@ -47,43 +47,6 @@ Project Reference 機能については [Project References :material-open-in-ne ### tsconfig の設定値の解説 {#tsconfig} -- `compilerOptions.noEmit` - - コンパイルの結果を出力しないよう設定するプロパティです。 `create-vue` した際のデフォルト値の `true` を設定します。 - これは、 `vue-tsc` で型チェックのみを行い、トランスパイルの結果は出力しないようにするためです。 - ビルドで利用する package.json に定義されたスクリプトでは Vite でトランスパイルを行うため、 `vue-tsc` でのトランスパイルは不要になります。 - (※ `vue-tsc` は Vue の単一ファイルコンポーネントをサポートする `tsc` のラッパーです。) - - ??? note "create-vue で生成されるビルドに関するスクリプト" - - ```json title="package.json" - { - "scripts": { - "build": "run-p type-check \"build-only {@}\" --", - "build-only": "vite build", - "typecheck": "vue-tsc --build --force" - } - } - ``` - -- `compilerOptions.tsBuildInfoFile` - - ビルド結果の差分を示す `.tsbuildinfo` ファイルの出力先を指定するプロパティです。 - Project Reference 機能を利用する際、出力先を明示しない場合はルートの tsconfig.json と同じフォルダーに `.tsbuildinfo` ファイルが出力されます。 - プロジェクトルートに不要なファイルが出力されると管理が煩雑になるため、 `create-vue` した際のデフォルト値である node_modules 配下の一時フォルダーを指定しています。 - -- `compilerOptions.module` - - コンパイルしたファイルのモジュールシステムを設定するプロパティです。 - tsconfig.node.json で `ESNext` 、 tsconfig.json で `NodeNext` が `create-vue` した際にデフォルトで設定されます。 - Cypress が内部で利用している `ts-node` の挙動の都合上、 tsconfig.json に `compilerOptions.module` を設定する必要があります。 - `compilerOptions.module` の設定値については [The module output format :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/modules/theory.html#the-module-output-format){ target=_blank } を参照してください。 - -- `compilerOptions.moduleResolution` - - モジュール解決の方針を設定するプロパティです。 - tsconfig.node.json では `create-vue` した際のデフォルト値として Vite での利用が推奨されている `Bundler` が設定されています。`Bundler` についての詳細は [--moduleResolution bundler :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#--moduleresolution-bundler){ target=_blank } を参照してください。 - ??? note "tsconfig.json の設定例" ``` json title="tsconfig.json" @@ -170,6 +133,43 @@ Project Reference 機能については [Project References :material-open-in-ne } ``` +- `compilerOptions.noEmit` + + コンパイルの結果を出力しないよう設定するプロパティです。 `create-vue` した際のデフォルト値の `true` を設定します。 + これは、 `vue-tsc` で型チェックのみを行い、トランスパイルの結果は出力しないようにするためです。 + ビルドで利用する package.json に定義されたスクリプトでは Vite でトランスパイルを行うため、 `vue-tsc` でのトランスパイルは不要になります。 + (※ `vue-tsc` は Vue の単一ファイルコンポーネントをサポートする `tsc` のラッパーです。) + + ??? note "create-vue で生成されるビルドに関するスクリプト" + + ```json title="package.json" + { + "scripts": { + "build": "run-p type-check \"build-only {@}\" --", + "build-only": "vite build", + "typecheck": "vue-tsc --build --force" + } + } + ``` + +- `compilerOptions.tsBuildInfoFile` + + ビルド結果の差分を示す `.tsbuildinfo` ファイルの出力先を指定するプロパティです。 + Project Reference 機能を利用する際、出力先を明示しない場合はルートの tsconfig.json と同じフォルダーに `.tsbuildinfo` ファイルが出力されます。 + プロジェクトルートに不要なファイルが出力されると管理が煩雑になるため、 `create-vue` した際のデフォルト値である node_modules 配下の一時フォルダーを指定しています。 + +- `compilerOptions.module` + + コンパイルしたファイルのモジュールシステムを設定するプロパティです。 + tsconfig.node.json で `ESNext` 、 tsconfig.json で `NodeNext` が `create-vue` した際にデフォルトで設定されます。 + Cypress が内部で利用している `ts-node` の挙動の都合上、 tsconfig.json に `compilerOptions.module` を設定する必要があります。 + `compilerOptions.module` の設定値については [The module output format :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/modules/theory.html#the-module-output-format){ target=_blank } を参照してください。 + +- `compilerOptions.moduleResolution` + + モジュール解決の方針を設定するプロパティです。 + tsconfig.node.json では `create-vue` した際のデフォルト値として Vite での利用が推奨されている `Bundler` が設定されています。`Bundler` についての詳細は [--moduleResolution bundler :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#--moduleresolution-bundler){ target=_blank } を参照してください。 + ## Vite の設定 {#vite-settings} [ブランクプロジェクトの作成](./create-vuejs-blank-project.md) の手順に沿って `create-vue` でプロジェクトを作成すると、プロジェクトルートに `vite.config.ts` が生成されます。 @@ -178,6 +178,47 @@ Project Reference 機能については [Project References :material-open-in-ne ### vite.config の設定値の解説 {#vite-config} +??? note "vite.config.ts の設定例" + + ``` ts title="vite.config.ts" + import { fileURLToPath, URL } from 'url'; + + import { defineConfig, loadEnv } from 'vite'; + import vue from '@vitejs/plugin-vue'; + import vueJsx from '@vitejs/plugin-vue-jsx'; + import { setupMockPlugin } from './vite-plugins/setup-mock'; + + export default defineConfig(({ mode }) => { + const plugins = [vue(), vueJsx()]; + const env = loadEnv(mode, process.cwd()); + + return { + plugins: mode === 'mock' ? [...plugins, setupMockPlugin()] : plugins, + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, + server: { + proxy: { + '/api': { + target: env.VITE_PROXY_ENDPOINT_ORIGIN, + changeOrigin: true, + autoRewrite = true, + secure = false, + }, + '/swagger': { + target: env.VITE_PROXY_ENDPOINT_ORIGIN, + changeOrigin: true, + secure: false, + }, + }, + }, + }; + }); + + ``` + - [条件付き設定 :material-open-in-new:](https://ja.vitejs.dev/config/#%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E8%A8%AD%E5%AE%9A){ target=_blank } コマンドやモードに応じて異なる設定を適用する場合、関数を export して設定します。 @@ -207,61 +248,84 @@ Project Reference 機能については [Project References :material-open-in-ne ``` なお、条件付き設定のために関数を export する際は `vitest.config.ts` の実装も変更が必要です。 + `vitest.config.ts` でも defineConfig を関数に変更しないと型推論が上手くできないためです。 `vitest.config.ts` の設定については [Managing Vitest config file :material-open-in-new:](https://vitest.dev/config/file.html){ target=_blank } を参照してください。 + ??? note "vitest.config.ts の実装例" + + ``` ts title="vitest.config.ts" + import { fileURLToPath } from 'node:url'; + import { mergeConfig, defineConfig, configDefaults } from 'vitest/config'; + import viteConfig from './vite.config'; + + export default defineConfig((configEnv) => + mergeConfig( + viteConfig(configEnv), + defineConfig({ + test: { + environment: 'jsdom', + exclude: [...configDefaults.exclude, 'e2e/*'], + root: fileURLToPath(new URL('./', import.meta.url)), + }, + }), + ), + ); + ``` + - `loadEnv()` モードに応じた `.env.*` ファイルを読み込み、環境変数を取得します。 + `vite` コマンドを実行する際、`--mode` オプションに指定したパラメーターに応じた `.env.*` を読み込みます。 + 例えば、 `vite build --mode dev` を実行すると `.env.dev` が読み込まれます。 + `.env.*` ファイルは環境変数を定義するために作成するもので、 `VITE_` で始まる環境変数の値を設定できます。 + モードに応じて異なる環境変数の値を設定したい場合に利用します。 詳しくは [環境変数を設定に使用する :material-open-in-new:](https://ja.vitejs.dev/config/#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B){ target=_blank } を参照してください。 + また、 `VITE_` で始まる環境変数を TypeScript で型定義するには `env.d.ts` ファイルを作成します。詳しくは [TypeScript 用の自動補完 :material-open-in-new:](https://ja.vitejs.dev/guide/env-and-mode#typescript-%E7%94%A8%E3%81%AE%E8%87%AA%E5%8B%95%E8%A3%9C%E5%AE%8C){ target=_blank } を参照してください。 + - [resolve.alias :material-open-in-new:](https://ja.vitejs.dev/config/shared-options.html#resolve-alias){ target=_blank } パスエイリアスを設定して、 import するパスの指定を簡潔にできます。 - [server.proxy :material-open-in-new:](https://ja.vitejs.dev/config/server-options.html#server-proxy){ target=_blank } - 特定のパスで始まるリクエストの振り分け先を指定できます。 + Vite 開発サーバーの起動時に、特定のパスで始まるリクエストの振り分け先を指定できます。 設定例では `/api`, `/swagger` で始まるパスのリクエストをバックエンドアプリで処理するよう指定しています。 -??? note "vite.config.ts の設定例" + 以下のオプションを設定しています。 - ``` ts title="vite.config.ts" - import { fileURLToPath, URL } from 'url'; + - target - import { defineConfig, loadEnv } from 'vite'; - import vue from '@vitejs/plugin-vue'; - import vueJsx from '@vitejs/plugin-vue-jsx'; - import { setupMockPlugin } from './vite-plugins/setup-mock'; + URL の書換え先を設定しています。 - export default defineConfig(({ mode }) => { - const plugins = [vue(), vueJsx()]; - const env = loadEnv(mode, process.cwd()); + - changeOrigin - return { - plugins: mode === 'mock' ? [...plugins, setupMockPlugin()] : plugins, - resolve: { - alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)), - }, - }, - server: { - proxy: { - '/api': { - target: env.VITE_PROXY_ENDPOINT_ORIGIN, - changeOrigin: true, - configure: (proxy, options) => { - options.autoRewrite = true; - options.secure = false; - }, - }, - '/swagger': { - target: env.VITE_PROXY_ENDPOINT_ORIGIN, - changeOrigin: true, - secure: false, - }, - }, - }, - }; - }); + Origin ヘッダーを `target` に指定した URL へ変更するよう設定しています。 - ``` + - autoRewrite + + Location ヘッダーを書き換えるよう設定しています。 + + - secure + + SSL 証明書を検証しないよう設定しています。 + + ??? info "API エンドポイントを設定する際の注意点" + + AlesInfiny Maris では、 バックエンドアプリとの API 通信のための OpenAPI や axios の共通設定は `src/api-client/index.ts` で実装しています。以下の部分で `basePath` または `baseURL`を設定すると、 `dev` モードでビルドした際に `vite.config.ts` の `server.proxy` で設定した通りにパスの書換えができなくなります。そのため、 `dev` モードでは環境変数に空文字を設定して `basePath` `baseURL` に値を設定しないようにする、といった工夫が必要です。 + + ``` ts title="src/api-client/index.ts" hl_lines="4 11" + // OpenAPI Generator を利用する場合 + function createConfig(): apiClient.Configuration { + const config = new apiClient.Configuration({ + basePath: import.meta.env.VITE_AXIOS_BASE_ENDPOINT_ORIGIN, + }); + return config; + } + + // OpenAPI Generator を利用しない場合 + const axiosInstance = axios.create({ + baseURL: import.meta.env.VITE_AXIOS_BASE_ENDPOINT_ORIGIN, + }); + + ``` From 1e3805f6c16cd508756067873f8dffcf64dc3ca5 Mon Sep 17 00:00:00 2001 From: Fumika Koyama Date: Thu, 30 May 2024 11:46:19 +0900 Subject: [PATCH 07/10] =?UTF-8?q?=E8=AA=A4=E5=AD=97=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guidebooks/how-to-develop/publication/index.md | 2 +- .../guidebooks/how-to-develop/vue-js/project-settings.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/documents/contents/guidebooks/how-to-develop/publication/index.md b/documents/contents/guidebooks/how-to-develop/publication/index.md index fdca368e7..e2e134797 100644 --- a/documents/contents/guidebooks/how-to-develop/publication/index.md +++ b/documents/contents/guidebooks/how-to-develop/publication/index.md @@ -47,7 +47,7 @@ const wrappedApi = new apiClient.generatedApi(createConfig(), '', axiosInstance) export default wrappedApi; ``` -※ `vite.config.ts` に `server.proxy` の設定をしている場合は [API エンドポイントを設定する際の注意点](../vue-js/project-settings.md#vite-config) も併せて参照してください。 +※ `vite.config.ts` に `server.proxy` の設定をしている場合は [vite.config の設定値の解説](../vue-js/project-settings.md#vite-config) の「API エンドポイントを設定する際の注意点」も併せて参照してください。 ### 本番用 env ファイルの作成 {#create-env-prod} diff --git a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md index 4e61c4c0d..5593b7beb 100644 --- a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md +++ b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md @@ -99,7 +99,7 @@ Project Reference 機能については [Project References :material-open-in-ne ??? note "tsconfig.node.json の設定例" - AlesInfiny Maris では、フロントエンドアプリを mock モードでビルドする際のソースコードを `mock` フォルダー配下に含みます。 + AlesInfiny Maris サンプルアプリでは、フロントエンドアプリを mock モードでビルドする際のソースコードを `mock` フォルダー配下に含みます。 本来 tsconfig.node.json は設定ファイルとして読み込む対象を定義すべきですが、vite.config.ts の参照先で `mock` フォルダー内のファイルを参照している都合上、 `"mock/**/*"` を include の対象にしています。 ``` json title="tsconfig.node.json" hl_lines="4" @@ -204,8 +204,8 @@ Project Reference 機能については [Project References :material-open-in-ne '/api': { target: env.VITE_PROXY_ENDPOINT_ORIGIN, changeOrigin: true, - autoRewrite = true, - secure = false, + autoRewrite: true, + secure: false, }, '/swagger': { target: env.VITE_PROXY_ENDPOINT_ORIGIN, @@ -312,7 +312,7 @@ Project Reference 機能については [Project References :material-open-in-ne ??? info "API エンドポイントを設定する際の注意点" - AlesInfiny Maris では、 バックエンドアプリとの API 通信のための OpenAPI や axios の共通設定は `src/api-client/index.ts` で実装しています。以下の部分で `basePath` または `baseURL`を設定すると、 `dev` モードでビルドした際に `vite.config.ts` の `server.proxy` で設定した通りにパスの書換えができなくなります。そのため、 `dev` モードでは環境変数に空文字を設定して `basePath` `baseURL` に値を設定しないようにする、といった工夫が必要です。 + AlesInfiny Maris サンプルアプリでは、 バックエンドアプリとの API 通信のための OpenAPI や axios の共通設定は `src/api-client/index.ts` で実装しています。以下の部分で `basePath` または `baseURL`を設定すると、 `dev` モードでビルドした際に `vite.config.ts` の `server.proxy` で設定した通りにパスの書換えができなくなります。そのため、 `dev` モードでは環境変数に空文字を設定して `basePath` `baseURL` に値を設定しないようにする、といった工夫が必要です。 ``` ts title="src/api-client/index.ts" hl_lines="4 11" // OpenAPI Generator を利用する場合 From 30f86d45d13412b9ec60c0954e97e13d69777955 Mon Sep 17 00:00:00 2001 From: Fumika Koyama Date: Thu, 30 May 2024 11:56:23 +0900 Subject: [PATCH 08/10] =?UTF-8?q?server.proxy=E3=81=AE=E3=82=AA=E3=83=97?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=92configure=E3=82=92=E4=BD=BF?= =?UTF-8?q?=E3=82=8F=E3=81=AA=E3=81=84=E5=BD=A2=E5=BC=8F=E3=81=A7=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- samples/AzureADB2CAuth/auth-frontend/vite.config.ts | 6 ++---- samples/Dressca/dressca-frontend/vite.config.ts | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/samples/AzureADB2CAuth/auth-frontend/vite.config.ts b/samples/AzureADB2CAuth/auth-frontend/vite.config.ts index e934142b9..85486c4c6 100644 --- a/samples/AzureADB2CAuth/auth-frontend/vite.config.ts +++ b/samples/AzureADB2CAuth/auth-frontend/vite.config.ts @@ -21,10 +21,8 @@ export default defineConfig(({ mode }) => { '/api': { target: env.VITE_PROXY_ENDPOINT_ORIGIN, changeOrigin: true, - configure: (proxy, options) => { - options.autoRewrite = true; - options.secure = false; - }, + autoRewrite: true, + secure: false, }, '/swagger': { target: env.VITE_PROXY_ENDPOINT_ORIGIN, diff --git a/samples/Dressca/dressca-frontend/vite.config.ts b/samples/Dressca/dressca-frontend/vite.config.ts index 3c591c80b..aad4d634c 100644 --- a/samples/Dressca/dressca-frontend/vite.config.ts +++ b/samples/Dressca/dressca-frontend/vite.config.ts @@ -22,10 +22,8 @@ export default defineConfig(({ mode }) => { '/api': { target: env.VITE_PROXY_ENDPOINT_ORIGIN, changeOrigin: true, - configure: (proxy, options) => { - options.autoRewrite = true; - options.secure = false; - }, + autoRewrite: true, + secure: false, }, '/swagger': { target: env.VITE_PROXY_ENDPOINT_ORIGIN, From 85033c9010fa37272b6821aef3b8996abb262b68 Mon Sep 17 00:00:00 2001 From: Fumika Koyama Date: Tue, 4 Jun 2024 09:23:20 +0900 Subject: [PATCH 09/10] =?UTF-8?q?=E7=94=A8=E8=AA=9E=E3=81=AE=E5=AE=9A?= =?UTF-8?q?=E7=BE=A9=E3=82=92=E8=84=9A=E6=B3=A8=E3=81=AB=E8=A8=98=E8=BC=89?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../how-to-develop/vue-js/project-settings.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md index 5593b7beb..fe712b974 100644 --- a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md +++ b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md @@ -7,11 +7,11 @@ description: Vue.js を用いた クライアントサイドアプリケーシ ## TypeScript の設定 {#typescript-settings} -TypeScript で作成されたファイルは、 `tsconfig.json` の設定値をもとにコンパイルが実行されます。 +TypeScript で作成されたファイルは、 `tsconfig.json` の設定値をもとにトランスパイル[^1]されます。 `tsconfig.json` の存在するフォルダーとその配下のフォルダーの該当ファイルに設定が適用されます。 [ブランクプロジェクトの作成](./create-vuejs-blank-project.md) の手順に沿って `create-vue` でプロジェクトを作成すると、以下の `tsconfig.json` および `tsconfig.*.json` が生成されます。 -各 `tsconfig.*.json` には `include` に指定したファイル群のコンパイルに関する設定値が定義されています。 +各 `tsconfig.*.json` には `include` に指定したファイル群のトランスパイルに関する設定値が定義されています。 ```terminal linenums="0" @@ -32,7 +32,7 @@ TypeScript で作成されたファイルは、 `tsconfig.json` の設定値を 単一の `tsconfig.json` のみを定義している場合、テストコードも `include` する必要があるので、アプリケーションのコードからテストコードのクラスやメソッドを参照してもエラーにならない事があります。 Project Reference 機能を利用した場合、テストコードとアプリケーションコードとで `tsconfig.json` を分割し、アプリケーションコードからテストコードを参照できないように設定できます。 -- ビルド時のパフォーマンスを改善する +- ビルド[^2]時のパフォーマンスを改善する ビルドの度にコード全体をビルドするのではなく、更新があったプロジェクトのみをビルドします。 @@ -135,9 +135,9 @@ Project Reference 機能については [Project References :material-open-in-ne - `compilerOptions.noEmit` - コンパイルの結果を出力しないよう設定するプロパティです。 `create-vue` した際のデフォルト値の `true` を設定します。 + `tsc` によるトランスパイルの結果を出力しないよう設定するプロパティです。 `create-vue` した際のデフォルト値の `true` を設定します。 これは、 `vue-tsc` で型チェックのみを行い、トランスパイルの結果は出力しないようにするためです。 - ビルドで利用する package.json に定義されたスクリプトでは Vite でトランスパイルを行うため、 `vue-tsc` でのトランスパイルは不要になります。 + ビルドで利用する package.json に定義されたスクリプトでは Vite でトランスパイルを行うため、 `vue-tsc` でのトランスパイルは不要です。 (※ `vue-tsc` は Vue の単一ファイルコンポーネントをサポートする `tsc` のラッパーです。) ??? note "create-vue で生成されるビルドに関するスクリプト" @@ -160,7 +160,7 @@ Project Reference 機能については [Project References :material-open-in-ne - `compilerOptions.module` - コンパイルしたファイルのモジュールシステムを設定するプロパティです。 + トランスパイルしたファイルのモジュールシステムを設定するプロパティです。 tsconfig.node.json で `ESNext` 、 tsconfig.json で `NodeNext` が `create-vue` した際にデフォルトで設定されます。 Cypress が内部で利用している `ts-node` の挙動の都合上、 tsconfig.json に `compilerOptions.module` を設定する必要があります。 `compilerOptions.module` の設定値については [The module output format :material-open-in-new:](https://www.typescriptlang.org/docs/handbook/modules/theory.html#the-module-output-format){ target=_blank } を参照してください。 @@ -329,3 +329,6 @@ Project Reference 機能については [Project References :material-open-in-ne }); ``` + +[^1]: 本ページでは、 TypeScript から JavaScript への変換を指します。 +[^2]: 本ページでは、`vite build` コマンドによりバンドル(トランスパイル後の JavaScript をブラウザーで扱いやすいよう単一のファイルにまとめる)まで行うことを指します。 From e523bd702b1da77c33b1a28f12dfe1a1137e9d06 Mon Sep 17 00:00:00 2001 From: Fumika Koyama Date: Tue, 4 Jun 2024 09:28:01 +0900 Subject: [PATCH 10/10] =?UTF-8?q?dark=E3=83=A2=E3=83=BC=E3=83=89=E7=94=A8?= =?UTF-8?q?=E3=81=AE=E5=9B=B3=E3=82=92=E8=BF=BD=E5=8A=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vue-js/vue-tsconfig-dark.drawio | 70 ++++++++++++++++++ .../how-to-develop/vue-js/project-settings.md | 2 +- .../vue-js/vue-tsconfig-dark.png | Bin 0 -> 47700 bytes 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 documents/_materials/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-dark.drawio create mode 100644 documents/contents/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-dark.png diff --git a/documents/_materials/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-dark.drawio b/documents/_materials/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-dark.drawio new file mode 100644 index 000000000..5dcd32ef3 --- /dev/null +++ b/documents/_materials/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-dark.drawio @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md index fe712b974..7ff600633 100644 --- a/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md +++ b/documents/contents/guidebooks/how-to-develop/vue-js/project-settings.md @@ -43,7 +43,7 @@ Project Reference 機能については [Project References :material-open-in-ne また、 `references` で参照されているファイルでは `compilerOptions.composite` を `true` に設定する必要があります。 ![tsconfigの継承関係](../../../images/guidebooks/how-to-develop/vue-js/vue-tsconfig-light.png#only-light){ loading=lazy } - +![tsconfigの継承関係](../../../images/guidebooks/how-to-develop/vue-js/vue-tsconfig-dark.png#only-dark){ loading=lazy } ### tsconfig の設定値の解説 {#tsconfig} diff --git a/documents/contents/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-dark.png b/documents/contents/images/guidebooks/how-to-develop/vue-js/vue-tsconfig-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..fb8c1de77011800eb70b77583b95571d766435aa GIT binary patch literal 47700 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

WXYFxPb1ps>0qlv z7G9aJiuLeKK2nEz`c64f2-3zV_=xce@yj#)&%{F1y=V-6%rR1PFws;N-hVdcn-%5Z zF8r=|@%bSJbV~=RJCw*~jEd!FE`X5$dG(7%^1$mvY6n{u=RaC@okU2ZGTD`I(ueBgi6pgxw{dzZTHQ=*$etj7(`7{w{M<~~MSDSKSud&#q-jj;-e?B+?8GsdL^ z&qftK7u*bxz(n68=iw~A;_Cv5YZ>Hb0?%Z51(Rt7yMClbF1gpOy79a)D{)%0{j{aX z3Xym0#KCF=yR@1&=lv=qY2QqDWpQtaHr>&8Q0tG9b(4n0ZS_QwTd{|ng2Z6I_%4Ur z*iI$qPoMTKKwBFv7{?m01bwUj79Kk$%x$re5*AZ%LGYWOn0vST3fn_rB@etSNBUJ6jYgQ(-(SkBsR?Ze@yv+CjPZ=%I}OUF7;($J?<5o& zM%jjWaD>xnM*b^WmlNn((8Ug%_7)ZKq5l zCQ2LcKJS;h-^gwC!Mdp{W2^>>-mJMV{-`0;JoQ$XB61GgTC0222(z@UbvJWeHIuZr zw=`4Sy)c#~({lOh!(DvBib%ngQIuEel@BFKn%ydls*q8FO~&f_vOfFbaV9&|d?9VJ zbj2WHu+!SV4`w2HWI;;uhRptD&<`VSe$RWW%=}Fm<-o~fi zw|-S32`62D#XAxfx?^>eO=V>w2>3Od_HY0}7%GogN+zp$&YXcSadgJ+;u14sp%({_ zL%P`Bn=D()XmGe+*+^Fn3jPwVcl+oCs;D0TaQ^}T_j0P&>iOSg0C-X4bssgGZY?C^ zRs7)#FoSUSTGu6qM#4pZ$=Utp?1>O<2)L(r>k|V+uSM|m9$3Ocbd?d{3i!$3ya+N6 z4RBGvKHjRY17aBju1%z?>tt_JCl0RxNK|v@syaNwod}RE8O{sA>C-aiJ*;oIuJ$<6 zOKuMjxOMl5N+iH#fG0ftf@keZnan1Ro!Bm5sqs|arMZ20qL3j^0ouy63s1DkYmVd{T4n1Uo{-Aeye`PC-7MmA8#P~)f=v+MO z)8(ne1JKNoa}x{DRtExN^vYnRLh>%gEpnZ)EU-g@0OZ+5$(3Xdwelo?YCkvR{a#Yg07Gy#^)pd$Ge zF?;K{4k_ps^5=8|xb>@b<*U9C6K#oZKF8uv%xO(JmIR6?hyg?w`26N~LSV6#{-FBJ z)Xc711Uf)e>Q&Iu-hk}fO8Anknt0`HTN=h+x`nwfy*ZM13jo-1HUKn~R4gKmBH+#$ zi0j9g43HS&CI5g8>=fkT(SY#sKTBk?`1Xv~rvf!K5K`Oxx28S*A z%^x5Gs9CLQo`nsGkc@uDET3`kY3{Kc$sv7|0I&kOFIWJ|fEc=Syf;9-UIAWfEnED28~)~dEWJU@I7&!7ExsolR2zO>{x zkbDBnRZo|vN=5!{4fWl#1hZ);{VXewgUFv#>luB1+IhYuQ=Y8wi-7eWAg)Q;w z(Am%c0TljX@1&m5{!~8t@7zTG+#mqu{mt(>*z#+E@<8>dl4K>lx~*f@p-Zx&e&f-~ zW)R|GOR|n7hNQrTg$t-EQ;-9}&q0Km$c+eP>rwHXd9Vjimjyb1)_jOcd$r!-13ASQ zayByb4gJOAvv>Ah+u+ox9snHz6yGTt!pr|zO8*d_c_d1R?F-vtKt-_w4 zZqMW@PNuRy%YiSEMdxt|6HcGN{pjODN^z~Hq>c;u?X}6C>%=={z!id>vXeYDK^uRD z3!T>^p_##YTG1Pq_Ka>(l`GNmJ=Me;aUFF91~au3KGq@AioXQ>*5e|qTv z9X_bLg9ka9P}t@(bX6O+S+saiXg4<3kH6aYU~qgBI(&$Lr%LwWkR9U{B8FwV9ut>; z?8jaZf?ZNB_gEkSjF?O8VQQK-oDIq*huW5WIGYvRg=Mxz#E5CAd9%?#hm#OqFVXmg z*eguRb!JIDK!oXMgSc+rK^5<+E>VORkN0?u%4!r!KbfA*V7y|pL#3MDr0NqPsI`@k*~@+~$v4=bM%>`5&gcqT9wNxXA;bzZY*PgG?)*ld zO2i~DT!D~AN`@b&{E$x%nR_O}{gA&nxnlFvRrsRUXin2K5{EZ&ptrkmayKp#PLD}w z;yrbpwlvS}X+Bw=Z^4W(0 zKKd$aDZ!$GB90nT2T6Z`WIs%MIu@GLG^pN>uk?DBb7d2r5w+0fxyhM@DXk4n=YvR_ zkK|7>Ku{>|afkVq#GZ@vMjI!*xjS`gn8@HH0+`U_0qqI`C5b`hm|#Ka+yH4e-g!Bz{6MDBdT%7mBoW673%4LsMD^cU6N2PgNCHcc4ESp-}OTK(T0IPr(_GS{pwkU}l4O zz7ezZgO&x~M9+=iV%;AB~ zCa+>zBY|!57yp{*+T)2^FWY>**<&|SQY4+F5pyx^Q4R-Vl-2_f{SAKNqX==+@aWjwc6}kuR@(OH&fMx%}hoysQ<1rAS0O zT@*&r;r-YLZY3?F#6h$&gYYt;oKYefzDFEnW{U6Y%iC5!9a;@kZe*L!6QPG7~t5F}bNZU{; zHp4^2jO#I)A`p(w zL0ByF)GYU?aCdTrg+s5R7&f7;39-WJEz6GXV3Selwdj+tnh6AayVo8FeGWXZ37(9} z2N!9dn#RTRPG9O^gH>MJTJ6F}4qN7%!M6;LJSmt}k()V_6%IIgta5cMLgP)Si-MI* z_MM2kWNs+-OLNn+mASQw7qJWEbwkP|X+7g;`dpd?jd*A0l@TQ4_se{|rVcM_zg|@C zU+}IId&|g&2g%$i3UGD>mWf#(-Pb2Hr*3_g416y!QvcHB?zzKN&X><-iQiB)nVX!A zX%d`sLaYiG+h8OuJVyEY=CdSL#H6dobv*0(B%>O5Lj{t_ziR|KnDSwxYp?ora&nlX7kv-%qTLbOJ+H-Gxmk|!>Q5fvhE$yuFySMT zB;-*XOmj|^0@hpc!$BU?hsb54cG^29j}Dcu4NAGQq)h}$u^_*d=*w}a5w*b!W@Gaj2=LORI)>J|YG)1swc8GUsYfQMKeUxX5#a~CFtb*r{} zu%tywNdr3zQfR@a;G1v?y4)UCHfMUHIVxOZYduWpD ztxvpzD5TAfPedxzam%9KhW*K$x|qg~Yn)l>muxRVEUR>|EV`?KcV+;QGQFN(U>twY z;LuiLA_`w1hu%*x?9P<<3Tkqdh>1fXn$!H@Wa8Lxe$GC!@D;Ic@5k0=q{c^k49+0A z=f)31PqSe|6f6?OpEtfymhle$;c7OC-EiNT)0x3InCvLY``zI$6s17s4d(13aYZh}{%RZY%9xq20tebFRPG)v{Vz{Cw zq;%^v*Fu@q+8L^1SC?hONuE@uwLYD4C)TWpsxeH=^(zZ(}i)2OrEYU71*T|IxpIrtMSV<1BP^T|fTup+Vvv@gEgE=FP)N5)V?a z(7MNiSs!T>N+CaL%`jpa7sV*>@l(#tLoMn~FMciyu$-%4oCONJR}Df2FJ}l{Td+rp z4{vCT=^{L5t-^53WP4SrAC(AQ?lBRx5u)d5aJ<12(ZlQ3E-&??$U1H6T7RKC&%m5v z?`t*swfSdL7Lk$z)YN6_+xF98IjPg^-FKSWbir2#F*Y_w-s+DIsftLx3Qy^L#E@cr zE)F&8)+x5;=$o}^8TFw9Ac$^U`nQw-nou$S>M`kk9Z%V0!z-!+;i~LjoAqa(Iu!0C zF)tf#yrwgb!9G7IcpbZ)TM={XzRi3{939g5oxGC5xiv`d&8Jl+Y!-bqZ2<-(3wO1Q zw*n<#;r(`DD6adrD%jK7U;(y=G-qpKi4!@zg_A24U!5v^0TvIa;q=GS`XF@14sB^i&I1ySs3fsn&Ky!cc~Uh zMW>;k%`l0AMaSHavz!{z;<$O=XZD)Zw$B3O)DQL=E=6vc@3Tl_TeGGcMGVYqM$R0R zkA^<^oBN{PTZlDicb%}NZ5G&h<$L^!+nE&hqW8sW7~AnHlHWWZ)v?#CUP>-Ck1_c) z?G`Y7ZPjV+A!^`3%4{DRc(Ki7x&-`%nH>1Uf%u7yLnQnJSAWgjG9K9r2&eOXAQFFsURiME+xFAUHZQ6G@q&AhUrx?;!xl=A@D zLtcQ!O(fRRDJe8GF0X-1L;`NftVPOXq|2GrfY2^cA*lzMOHlLv6S`AL9D6B9|JV8- zh~u9?40&H!M|`-LewmflmRD=>Dz9aX2*_1%ThjuCa-9{ZB_IAL-!CN#Im=PI!zIf{T|o=hMwySTzaYjcUKH z)RrdYmr12|zy32KWKf{P`8EH)qC07yX+RX1giD7eS_~(9A%Y-eve|6O=YD zhU*PEy^;EHf~*_{FtP0)nIuF$dr50`7ep2UZ~w3}07Pc9%+DprN-HaXtO=h;{=y`# zHzwrYg9!VU$OYd1VP`-xv6Z8+?rt(M2S_IVqa?L*l<$2-#Y)r;-dg@HzHy!0Pz|AC zisYWFIQ*iJdk@Dc$VtKCWRP*zkDrbk)+*jhs_rCoQ`f3+oCDjudN&}6>dwDA(^y#j zntjP`zOtM;$l>2mFay%I+9AmPOdp=&h*ABfa25JAgzy6ubGcp=nz1heG}!kXP_yi`QbAfPrHx zV`LNRd44!UzeK}y0@7=uzMG&94l=$QoGBy_T90M~4w!^7Ybursw%yZN%)7 zSxd;k{UWeIz$}3@$OYb==Smr#^~5fbs6LG#Y!53@GIi_53vwQlJ`pfmDS7^uBFX1u zxhIr@USDK=GduM6*mf7NO_Ax*e!?+%2Pbr1EWRLnJN5gljT%|Vp1vX6`3hJFY2O9l z#^Zb_|A;gINMkdJkxNQVYNit-Hzw!yCWR5`f@~-Ny7(R>UYGt2hvc>m7B(boeksUs zwls39D7r|{e4llI5dfLw*y&V+m$>)%<=Y#33`Nzx04J0&O7-M)$PE?GFP>B_ZR`Y+ zGai!kn>2^=@MJGrUUsQa2RJ1i2?Ba8s_~3tt}@^-$lhKYyj^>O_hb!jZIbY1zz|Jh zQ*aVVxPx4WF=#GIl(bWa6eX%K0uOm$zjEw-O9*AaO~10ctU-iNP{4BDfp7byjr(%P zK=~MTELs1tthJeXO>b~C!1oRCB^RfhBv2LtS0xuw)NmPtERF}@p~hfc?@ChbK_Y+a zfrAmXIM&EP=Pi#i;1sw3v7+ko%6mXHb{JKryS();s(nZW}N5l{sE3ui5LDX zRVCSk^2tC4K1NHw$F&Sr!4n8!yb0;$7*sh(IUd9YJ)!xWE?nG#?is-z)ee0cbQ1%U zcfxaBph@cAZnbl_r9toH*GwYN!~H_f*WAko3Gj>n(sqgv(WfL zbkzqO`Rhdd=gkc#gx3HsX6*vSL43ZCbU%JICjV-C@Sq-Ch2-trw@asXc!qdqx49v% zmtpU2Espw>IZ$bs`d=Ci#7n|3>ZL>Eh?N54xmmJW;u@4#9VgUO+sT;M1|drSv9SE> z=Cs>8YKUwo%Gphk9^$huD{=o=J#U~d3)JP|#xj0DWc_h=h^W^y(w&r>>z*IJK|2CA zC=e@G*T=pO%m#U-`;2x6IFFw3OUBTCuTPOJUp_w-Z5gHYh5#`y4*IRaa@I0SE}8G84%4&O2r2q(_UJCR1_ zz|}lZStv&7!a@g*HIg8ygLl@95YhTvxziQT z9y+~a=&58nbKzukOq>{@F$ z$P+KJ7tl;;VHfONzeUe*n?G9v97ChFYI^}6pU$}~dJ1(Zq42pvkXfEbdGMv`{JFGf zB@+?TjXvFhsiNlKyuOb+sW>CA7xpjL-+$Xs@E(^T;dWxxxxKP2Rn(U!5@6^i>3=b? zPE(HpQZ!jz^L4d155H<6l@VK{pF4N_9M$~EM-R!UAS;1RueBQ;=8%ZNdWZ?_c7^dqeD$^CDj^f@f$VR>4e#!0#rtkt8K!uNpWB47b~L%Yc13MTj*`? zj2fP$#}#H~TC2s5FoiHtrsc$p7TE!uue$zfU--+$6ZjLnF{b5X+oQ1(c zY=J9e(9A~CRIf9)X$SX!%(1vR@EnFG2=d0Dfw)QRdcdrQF88f3f%kX(rz9TPz3(0`IE8#e>HCK8CkG6y)LslQmIS@f zD}dFnR0X+ihx%RJ@oTn%y)(X~%D97<7|XI??zY2!mXc=o?U#zqj`Kv7-1bCGnWb+` z?C?m?vs<*kMvEtk)^#%-Tl#2kQsI94^FWnEdswHu`w&T0n}EZ5-omSHO)|D`{Vlnk zzK|CWczbl_goMMr*s>teWO5{5ruhy0>=uNI#YTkTIxas}w;>@9AqQ8!ougc8`TTV7 zo~tXFkp!iytMNOMr9i7E*98mS!cp1pVC&s}G`z!hFiO%&_w_hxV{pEK*+AMh{>YTaeSdz-4s6oRN_xf6ah%0lNkG>8+`hV=bbx<5l z`!<>Y2@rxTB)Be?pn=6*mf)5I3&AY}5AL?W;x3B@LLdQx26u8?-KgGFgl^ts;p-(=#4m5X=E81AX$RUL#Q#87QACUra8rX;OsviPWVGj!C= z;R}f}5ctU&Rjs z&ECVy>H3ekH7VVMV-Fe~0TXpU;+1+YV06>;G5*c5sBvWqkG5gxeN&>t9rtJJ2eojq zlFfXq3*Qw2GtJD=Q_A8+j}G265TCcwha-C85j&*SYRK`UOGmkw(6GalbW-{RUq@G8 zoi2OFXUA#fBG8j_YZ$R8KB)Cf(usZn^vyTjIVa136f658q_EuMNxHap&;z4!59#0@ z3nXZI5TgBVUL_48Mlmcs{f%PB(6JMvXLZ%G^0WcIoM$jp^ zl?BnF;qTf+(O$l5UXX7L-6~#Fg7R2#;1!~W^rmSy^Qe~as*a=Bqo^@Byki72D~T_W z<89m3X#@T1xO{M!PWcJ#uVDg#NqfIfi7E5LVzQat&sVR`-B_d`!^{oN<{4*+MZy*i z_7b)^idgY)758`q^LI6%`PB)*+*|{A!!jM$ADMCFpy*P8LB~oRn_(&3OFAGjGv;s1 zqC$gD!}T6h*Qu_84Ln&18k-k)v2ZtAqINMvV4c}4LcPaUs_uCwt*D>55&nXt+TDVq z?ljsB#mi5rbCOi}3i}G|qn?7v4}#^M%Wz=6*sCXb3#^QYlL=eD0(K^MLoj-m>rpszU} z^65_@_EqPsod}d5u{9IlP^ns9CNdo0aNS(lKgZ#8Tsq7m7Y)uS`Qv@Q;w_9@5?=HE zTJf?S-wmqvJ;ur8w4thO4Wku4N#O!G%r?5#kR7Pfa^sii1h&bcGOWR+M~>ODSo`ED z4*c}LVahUl<$7`+Njt;4? zGza<(B#*3Q?FkW!Wy%1H_WqdPxqp9$KmQ|T6%WOWw{NI@i638A(GJDI&7+L{i}_=* z1o&#K-%p;EFL1BUt?XLQZAH#)E6LeX;v;F?m1n!*B}}X%m8hbhW#GDfmx|{c;}6SU z(>^nJLyZ@WwW>)etjdCawVLi^c+IjJ@VQIdVrv}axSAcIL>5qny7=PmaV(;D)G5Q> zE?{(Rl$o{h*$H}BWe<#d{BY|SQr&g@bT0uyo$(>?mGCvi9uHaVszqZGvMhw}%Qw{_ zwH0#yabukuraD-q343EjCr|ZZl6UxfKYG}Hl31;_lEdQdt1#_Xu zAZnC?(lGAhb-uCKH6*4IiAT8r)|1U0ovla6q|V9KkSa)98dd~;ETJF0`{Cnq4{Z`Gf+3~=|Z=$vt7Yg{ghVkXl zs$(bV*UJwZpYLHXvEm_h&sl^7x>J@$pXc zeIHT{JnVaGByZE$k>?L%hwzBsrL!X0tyfdykE0-1M!iLMS~UmXqpWfuh?zWr2q^W6Aatl*Fwev@0fBZ zbnb=;F;wF6{gSQhrqYgYZR9nhGhQ76fC4BvjWg1Hw%Q`ZYbhyo zP0dt2WzXSaDrvNkVmBD4&y|BbRAW*+#Ee@mRl)2SfTaxL*9b3?Ri4^Ts!+!UoJp-O zS{lmose1oVC}qRiNep+Rdy<(_GMw!4>1hcEA82^HNq`a_vuw|3Q#=|4LUS-gkNGwT zSI_wli7JFmJSwaINc#kbeDS%P8^K_RzAyD_4z7ldt|W00`3{@1MMO~9ljCB8Mf-m1 z_QVxVGwma6C}dJ}vkB@e&|&ubPx|f6`r~lAC+K#NaC)iclPa3$hfzZBbQ(fiJzpqN zjsI29flVPlRuh*bxih*NqACQw741WppTbx(@$?yqR$)8lApz0kxCV}>v5175;V@B`JH6KYvkY-{7vK|yj$v^W9L7I^e+@1dsvo692FG!Pl*AtozbnA%7!MJRy4;KhS9UW*15?gqZS>yF?Hh z6y3FJw@Ni*k2VK|5|PL%u`dzXb+K*J3X_+-$Me!=5G8FG`SW!7YMEhc7a6rtbj%cd zwkFJwuPnop6RY(pT>K#(o25zP{x6y*MqJ>TT;xwFEP}u&w?lL?xkL8*Wx*)Qgu)t1 zUct3_Z6sDTtqa9T2Mp9DVSUH}t`j4bKT~ateK*CNJZX!r>U3>HGbQ<0H2bOBq`P;d zR#XH(tFP>l)lZpEqa^O%RVE&|H`sY2p^-I45XdD~G_cM!>Q=o{Nt=UU75vnf7XCWy z=4=LBoGBJW67II{5g!>JY!5#dNePH@XBmUKxvPT-Pg3ZP%4(bxQ(m=ii^Jl5NB*;NXzd`b zVlv&mbNuNr&Nw@TNk)+YMcDewG0y(c!nFcua$e!dJkA_)ngZKTFQae8 ziNtg}>C+=MqJwbhUR_?@)7IDG9CH&1#cr#RTfavgYQ_17A#+yu57R0E_4u!n1MKV; zbVZ$GqvU_yS4QR#jNYK$g5uz9i{E30a3heFbHUOO+1&iOQ4JdnC{zv{G@KY-dJk`a ziXbi=&=+HIEu-hedN1W+PDYdTPBv9Qn0i+yfn6b zxy&d07FwC>kUVPKn+g|@ZkW7R5adITOS8p zw@Y)>OYy`JZ%uDsXf)rxsZ=vYGO(0!48#}SK{JTYLb4{)V<<63s*gUn_8Z)>+2S6v zL^Mw6QZi5e8-?^2YkKVM(b8;u@UDYvYrM|HdT(ny7+e>7tcW_gJuXrzeUX(PzOT}x zA71fI<+N_waB;*Z&BWw;tveAYV@oVbbpQ(~w$}*maMtmatynlSoz0!2#1qp@{sS2s z5mr`Byd)lW!{|Bf-QCdd9RE5oOH}7q?f1j>T|2Bdx104^=VsOTpjez&;U#)Qe>!w! z%MmWxCg~O#yp}|ii{*H@aY#;<-R}RiTy1EhM@#wT0}Q@+*2PD;j`XT@!R>y(uuV`K zman4wr60dNfB+T*3BB4#4ydbLz0m@~j;-O*HTWVFwg)R*=^B=W`WJC3-=UdALKCpLl(nB$|G zo7gD3q`2?!AO;SSX%zh%zpGv|Dy@&tiMd~a+EPxy9y$$z0x-2T<$K^vB^pXfaLGyk zAx`{^v;g|X*8bU{$-<~h2iG?k*7E@T`1>J`-TT8c;J8`71UX+))-U`R?Cz1`94AYB zV;1bPpc5D58XfOFR`5Bv&^Yq%H|k1i3#09`WF|1Jefn9dY^sXK&=pQF z>EMxITlCz!JXIvGKQ7l6CRyOVJwyd@>4x4zsTRI2q!d=ZzMQT__kc9bW2|&uzefzk z93Em_VbeFpIVSW|*fzqs+{dgjnTqtCOKIs}li73^8mC(|I@}uHA`pT*ua5|Fj!y~_ zU+#1{qJqJxKFBoc0dS1T^@DJ5-N*+T`3#Nb$yN5}TjI;9{rkXDU8v$wyLz1|Avm@3 zi5+Fm``zzTPB()xR1Q+_vBW#j+VIrh_!b%SJsee(d?uGMhuhj!C?)k!uD&xmG`xA9 z(UItoAA`Ki39jG+w`r4D4QP@9^;Rj%0{c?P5F=jvc&D>9@vZ)vt+`ae=-{yU zy4_K<5bu;feh;*R9^%tc}h>H3l*p_&y$KmG@2}#Ex zkSKB!PlM)ZZ_2sAgHW<5_^+qX~) zW9%`n5$PPqO=qWKyRd`uuQZw)agj#@d8nR(t<%lW0ZISi1G(mJ$nbj0z%Z?c9gmae zcpJK49t4Hw*&11X{SUIDL-#%V$~l?y^6~IH>G1dSj`dD2mR?u83GJosd<_!WDIm%l zKj>9D`GYH#U~4mL!J(f_^FZQV@gFTX6X{1aTWUOes6~6AG*;(;2;>T#`U+1(xScF& zJY@tV@@g2sOKNy+Bt=_#|>%U4fIKX+RNr4;i&ayt=-=#;hG zJTqm|5))~k4is|Q_-f4#`>ZynKtX&pwn?&8Rrq~tiooCIcV+ZSRcpzaA%PC(s^Ho5 zhg)@2Z@C5Wc*Ou^3O%=eqC@2&Wska}G}mo0r0ZofunInZcAtfb^f+_EWdF}r12)cuK5tC?d-U1HMtWw=d~P>Yw&4;G`OSXm$*LH z3!}r-GYOXJ*;Jv3diord#rTKq}w9^@a{zVAxrAnp8J*C!RbX|xLcWEsZih6Oy-vh^^d@k4b69}W@4K| z#b|cS2m)mKm#_0b4-}H4oem^9#=<7ECyIT^grsW7Xo3(qL~>i>sTuau?jHS1o(?+K zyz3%X(4Hrjv=#=WRDC57kRF=S5ZeXi#d@dd#20^*6%=Me5FMUkZsOn4ir#M|tCHh* zZ?6S=f@5nY*@9D;Y$myGr;xf6aUU^`82k7(pu@p2q*gOz76pQbvsSd3owlTRn>atHIi~mgfDK8;fEkc5TsA6C> z+?uIjk&f8IGIKrsmpn+$dJ57~9nu0FZ=8RQfLyZ2^Fr5Av_l%6$5_7-eC;>ru8rY zIinXl?szBUx{3d9NwjEzU_f8&6Owo8rvfy3?8k?ce@lu0q`;2^c7%Rt%0uz{jSEWt zJq`$iw+S-M-S-&r0z?f-rGEcYJn*X>4cuYNVMJpGfCk zCXWHQjyYJ3_rI1f20*+TshRbD-}Nz<^8%-TpA&(9FwhSE$8S1qWPrZHYF#J)ukAn$ zX#iLV6o}s;M1RkU4?>bd*WooWh}jvW*z&H$-e+5nt{->LVEX1m5ZzA(3K+ z=0M~g(!b3HsdxSIMU}T=l-2+G)8=0Fi;ByXNg3q!2oTcO=T}IixWoCYH(x-p|APfc zQIGt$`ThrlaCm(Gw$Ef+bjqY||MsT23lOPpMRFi~0lo5h-v)+XKx7$saPhovNdDU% z0D(er4MdYWKyG5T=E<=nZ>ioJ0NvtL=I!7eSMG0`NRxV_kN_iU|7F%+I1KGnjsjj5V7vP^ zUy1+i(Jc&Ex%{b0RHoZseGjEn+b*uHa-mMQ);Z+=+La$x5iJ48ExmV4{Z_^K6oR1y z@ZW$pFyC=3^53=qlr0Q0q5YQzzmR}FU~2CF3KIKkw)#Mp+E1$7kWQ(+#0F~3|J{K6 z;R3D5IZN|oN7p9PuUS~z89+tnVz>P7Z0`jgn)(+7Qdz}ckM8a{0Vwbvts?)GRrEv9 z<;?1B!99RJ(((rjx!T-Y`4;z%)C>&IFklFxC)I!hr|tnpfIsxUp#07Vj)H&_cjQUn z|8^QsTvO=QKe$6MVDooEpUNc#=rzYX>OPe*Kdb7xM!4?h4fmVY2Gb@$;c zQoxWJ1H3;>OFoUaceZ%}yoov*7d3X^|A{K_$ZnCx(7TdIae-ooQ(oZ$uXzHH-aHC! zaRN{-N5Swj6-a#pqOpH= z{sv zXs6TWNmtRMhM;p*iGTaAAq7zOwA%D_CS0J9@RhiodA0p%@{az}jbcw^OT}x6TR>mF z9wEvWv}A_dzQ21DqxXRrByMA_%3qIR<{#sKDj}$@vK&Zk$^^8@Rx`>Y}?m5YK3Y z-h;8A_3PB1OwsnIo;$C;cy-OPPG|1!Mu);_xGOLhl3^iwo< z1#8-*Xa9C5pacf}S$GJD^gU&bUY|!yQq5i`infXtzJ$ITL{eLs4?3I*uQoU45Z)v! zM*ng5F4!xmgF@NSvUYa)3riHUFL{+=2DxVp+bb8=9FJmes9l>k2?U;=TrVoTn4g@@ zdRGd5v+`NlCLO%=%Dl@_-@rYGlk`zm@#b^T>{EA9tvic-DPi~?T!%$>7JTG1=Zhc% zquJ5ukKpIu+fv@Pgc2M|c(I|~p1w9+L^S=8kU4@(VNt>1eSqxs(B8*W0~S8oX#NU* zd^KoAS$$x=xCzGV?q{ih89ss(+-+3?9>Vpf1IA|B%%k(fwR24F?fYDnhsl{E^96Vx zMT5tu&0qF(kmSW6y6N(@J%JH4mv9z_Wv?A|slT>6&e9OfFHr+%ita|yrUC$#(;+WC zUvSMHm;d}a&zQ0DGdQ~%mv^DLe${_WMVlk0+w~+ebM^Lg&31Q@b?dW-@$Y%SV$=2s_gH#&{%k(c{<0w*JJIK;21ObY^072?qp0j`hqzxJdZs}c{%{-8H!0sNJR2}tdRrf(+L@&%w ziWIJV^_<=I@R5)0c+pO$`?sIC`g( z6??_T4)X?;Ye^dQ7IX~1gBRq@U0y>jO~)`>qurRD9@4q0y82po+22MWykA#>&eXb& zGgZ?+J}pMWoO^<7EOw6}bda6EO+&Eet}|1oD7Q|N;L~ZIeBKdBmUdlRft=rBz1ohb zS;4%$g~^XyI@Ho#JcZCR-2_k2PNJ$6EhzaZGD-&PM8;-S!{GT(j{{an-k@dSVo?<3 z|E4|#7r~TANi;B_;xX2tlfk`K6`a4hW`3M5S!&@Kf|WoW;n$%)u=Uj`i#*)PnxSTF z#U+WQ*P2vPN|(b~r1aH4mD`29zwWkA96HyM1@cnVVb%&$2wq^?seOf{k@7+Iiruci zBd*`r3Js8r+*bpf6*iN9JbNc;LqjmR)6r~?BRw>Iac^I zZAADBN-sFDlK5+dmkOFr%AG&_$SH=`5aI0cWG<+#8i_+$FiAu8m^$C;4LGu>hYxvK z?mXatk}j>ER5FW#4Phi?bb{f&9GQ2~Wp!viKk*>1{?_^ZI=I9Tc!K8P=|_w|s|%a} z%o3-nKxT%5m`?!idvl`ZDqcIWkgnGKP!_{s%^v#VRrHi5BopMXx6gO0dt7xtdUM-G z20Fy=w&kyFZep)Om$TuBH8!<%8J0>}S*e`0T|(i-?o_`+CL|75ACw4{tyLt1gBiDV)VU&eu)qM_2=u*uZ1$W0jq0=$0C^D;bn|J z44GELYIGY~_$6Sr&vHOtVRAF!+n^u`Mk)$00$m@)hP{E?9q-l8Eo=X15Ll(V5AB#< zE4)pA)1=9n+1`cbaPrKxd73a*&GBU2&SS-t>OumCa4`7^>|+emZgF_#RL-rM2pXdOE2dAadX0~VhtZ4M zr<1(Y$=USIX*K4tTimKwb>O2ZhpUMP@`pgrG)Snu}HsqS_(bIiG#=6&?%} z_hQz`+uqNEL|=euXcRr-VAogQ9D18{{W3;@T13RAn?rw+WlHhWT(auT+5N2HX zEntM%FygBmjCJ+VXMIUO2s1L}-K&^H>M`dwK?44UCguc;J(FvCjDQ5^4voQbxhK>* zu;ZeE?$BJg8&3}Bvg-jK>Vr>aot@5lhg5AP^GE7{S0WW+HL{Pn^w%ud!%CN?fK5LJ z>578+A67fMO1)l?)ZK?Ie-|&k-!q}V?UeRvpPDWQ+tqNijp8BSV_5l>iZ|RY@l4k+ zXozv_+|RGSj&M+UV#wV(?2)R|D7fzAQFG6%5jwM!UuInPb4)&i@XNVLz)!|2bW+K?+#fU@8QO}EYLIb zi3|t%F)}49V;ED~@p665RcMd*>Dj9Fhj-Br(n%}@SRC}(z}KyXF=?>L4C(z`Gf0h= z>O)(vS329@BV^M`o(ybjmTHp^s9$9ekl#q3TbtfYAbld$(mKzU8PSfOf%+dtdi}15 z)CdRo_V+^QCf$BH?8654PXciNWLM+jcxg7uPZZ#~E&bUyG0#qGibQ5{nssdCcUusiAo+Q_O1 zh8uQYF5D^gnKwPzri7&jMY6%OObo^?hzUftVecDYKkT0K3DUatc&6G2J}Fnn8W8#w zC~aJs-*jLfRfOr#G!bC&dy+=KIfaU$9fta4Wh;~mJ#gYpV;husGqu)$l-_w^J z_FW8#n3`nIT1!p#5ZrnNw+Wu`aBXqj`8Bj?*UT?yL6Mjd?H;OK6j}{SOr!VFLY%Cy zFnr(`uR;$lt_}8~9Hu>A@qa9Cv`hE4*15aMfR-egVCRy>V8?a?l1ag5;o8>R%t(A< zj<-!cPoz8=q-n6_qq(UUb+l!|p}|kk#I- zLgK$7zU>NLSp9AE+S+N4B@lxWfFG@L_3g$Drp>0!`7FisM!cdfHCYZ+#`64D5&wfR z$6dFzRj$d}Eqxpz7G0ewa9hWY$tPJ``>qPR=~h$HJK?`4wT|8r59c08KS|EwWxnishe6CH*X{a@s8i~Lpf&-u)EK@<_l)#c zEFIZ(PPZm`NmqPVUt`;-GgARR7?~Z%SE6sHJ;iNlp+dhYzTGoYnY4a|Rr0K&>BsY& zgY@`E1Zk!6e`Fi3b;FQk)@bIIYll0?_T))UexI!)Iw`qLF(n!!6G>9SN!y+tZsGUO zRgZYau`B;hC837c{=jGDUCY74k3E}WyHTzVTLwP+e`HxXd1<;*z93m~!m-49{M96( z2lQ)@#rqv^IL#5Xb5H!0@(5rb*gXVhTt0Sj#FL~1h8J>6FMybAQ`%jx_5+AM1e_Hw zdv1N~HBfr&m=PASMxW!>w07;bWDtXSj%8z1A*sZf1GnnARixzCAsHy1p38wV`A`jq zgm@jCmYl2Omy7>eN)YM8#4{jvhQcepNj^p`4}mEHFWPB%(O03a0pica1Srp9A7>%46@=6G%p}>Xmhk&lhKZ|)Aod63LhaDkL1o6f|!?4Oy z2km@(_7kH9)IPm+!78)r5n=m!)<4rtCON>fsk3A?6yzxryK%G$RkHfA* ztzG!mw}Ba}l%+`f;K9S;WDV#36brG4HcT;v68bsYP09N6IHQf;43gwYagJntH|VqH z*LYW8G<-p+YiVb(O}>dlGvcfdYgyP@UmvjDW|choSQ_u5Ck8$fHoiULHd}~uS+LCe zZcV&eB@a^3eryL$;+FILMTzI$hT7wGJftgO%eQm^wZ06CBu|50Jhsz0J7}d6S-Enh z$`a|L(w{njD-Y#)uiv}dgeUnhA>%V=lA7pU!vIEaFhkDk8QL1T%V2`#ry`l$uPPQ> z>8H_Yh!$~z6dP0YQoe?{uG-TWQ4i{fl#a=GpIjq5r9a`I)r-xXal(2MXu5SObtYV| zPtO}7A}xrV*8>^dUpU{We=<83+BIAho92dD0Be`63I(74E`}tu3_+b9SuXLa_V2@m zMEu1M>e4v#KtiqEvgRdo^*1sYg2C>%KHUn>ZhXd%Cr?rI0i^bLJaMsqx;jZP%IK@W z#8+fwgDPG}^*tixdmbl??jT7vzAQ#&WN>sp(g$G~ypLNRK4X2rE=B!r1+w1ZPBaEV zX`W^)dlv`(ufBphloQ;qb(XbRxW>KZ8tN=1Au&La61__3wJvMo7$&-xVB+%A-+r`i)j*_ep)0r#)7OURk;heAC>?Pmkj3 z-he$`t!kS5rGM(6nGg*36RKOmKHP|ET$1$*Z3$U<51}xhAWh?_rzITgC zQ(v93{}}_pcZz%1fFtmK+ok27=z$YDfd;Sy-*RiWC-UhFYa!&ymZFPryRkdz{Wc@W zvuHR*TYCGY%$uT#QbYUzzfbV@Pzg|(Usw*P^OGU*hd0(=*@hXyQcdYTY}>4fEQ^h! z2E`pMR&N~lkhQ1RW5(AWdkDuSRJ!Bo>A;Q42IKwkb$u~D)hP_67L24oKbfPCBAA11 z7)plA*xFD#5l4gJyEA;aKt5&EGjDn(Lo^6sDLfODg3o`S=*4}aGxYo6@0)Rfe&~_wx83h+_h$A22}nXg6@Q@l_%8OLI-cQgs#W!S(LKo`nfA5VDSWOTjl zmX6gQH7y2mnD{_~L@FxOh2*9YQZrlTzx>o3v?Y{avMIZQ&P#u#T>wak<> zUi}mt7ZqQ0jE|wydLf)?hz^{kL_rR)0G_0X3Us-$^%CjO9P^`|VZawhUMu;CBn~eW zi^n#? zGQXB;tsFfW@h6lvm2>`2gqPGvtTJhjBSVJfck4fTe5*+Tm}*AeJzU zILI<%g1KyyfG!i@=CSS?*mhF9Uw`@=b}5b?JGqv$YHnU`haw)-NAm(71QLIwNN#W6 zS%^Yr7sd6US-o5?)74UeNwJJsq$Hl)=_%q|Mn0KU-8(dU@Q{oWr#b0pFHyEFiaKDr z9b*g%n33|tRkj&@3<5v?2oR@REbq5TJvUwT>DOF|XY?jib+FNRg+RCCnT~-k1%j7? z+Sha$(*u#N#@U=B9T-a)8&Tnkbz!;a1WTjH;clSMu`&BMO*TKOtkKX|JuAq)wPrCl z+#4vl#hPsyQ{Rm*eY`E)9pfkW01VsTkp3+=C4%4Z+s;a4N-GA2E0PZt%F2E_jJ`?P z{Z@i=?Q$kxM+bVkVd-9Mg8d8JRz;nO+hNYx;new%nr$OnWBi;h(Ny~IvCgJx3Ca_8 zl%*&XR?}o_jC=z2D9sT3Q|A6HH(x_gH2nRo4MHLs`>6lMjOi)gged)=fH=piz5&u( zka^YX#EQ>RNA-*coMu9|4+f9FcC;XKp>vr}O(JD4Mx?>1%wBr(gK9GcqzibtLsy z22!@|`JC1vy(zh@V;git^zv69vpa$A&*op#G`#z2L`yHJu7ztAx`i4dbhi_Thjq98 z?N+Dzk+M9>^6#}rqP{#GjeL>!5)yoqzhWjLsbbl)X^5d@9l6NzloGX-!7F z)KWEfxIO+uI%+4UFH=JYvuY8@+&Aktu=dL1&%(b2s~o_lOuVS)`Q1@-1!jj=9}z7K zXvD+uSm&pWbTJ6G=L5yNKC|xC#uqK{vtjNTHM6|eAEP>wAVT_NLbkCED(=D!EC$I( zn{a^~7LOOV8LU-%Jz*JQKW@ZlA5St-0e5SlnxhgC`23J7Ko*L@m?v`Q6e)dDJt^5H z!b9Jld@3wR;iUd0eU^920Lq6Q5@^o4lF_9uB@-Q@>J7xQnWHD+XH*$<@6vk8@A8AqIt5FdeJuzz4$Mf!y)j9t>R65EgX@cGRhbk|8~|DU&abH<@1j&vaL(S-l;v ziRPWnK9a9r%6zFf59FWfOA27p*)ZII#)7GGtFGli2Upos!|>IN>D)GCuBgD5{r9*k z$B~O4v)cE10UPSAWQhfJKcaJ{W-4Vu6Tawf$P2%a7FPL03{pt>KJF$DEt-}}L~v$r z{qj)uX>-SRo?ry`oal$C8?b0!O+@9gjvM~sV?;~Mm5MVvAwOQpBPL7z3OLQ@OvL$i zvK@M?c^4fYO8WSiA~gx7-Mn4wglRY)V5zoYnij16| zL80*yav_o!Jk;x#G8n?)6OtH*Ekv_lG7+klO$nt*3(7uElwHyiZ13H}SCxlKzR?t_ zs<5fzW?}v_muS-FOfWL7A-cIUdfdUE0QAP-rOf$G1t&WA6xW`G`{qNpoN<#Ir+buZ zp-kwMoE_odrAw42IZF6-kUMRjj#3SY6#p~F(+fCluX(+CK!8f{UNjc>oQ_jdTk}rN z>&bmK${#r51yj4__G(OF6IS>{>$v`z?l~4KVfnRIgCV!KAJ(>luKScWC0{S$d3M@P zpH4lJVobr7xs1kMc%Kw-N)GBTo?Vni^DKgMP}GJn+)PhL!E_ANX`1!h`b?D#jWAfG zuPNw_b1anthJDPci`Uzjgq#+U47EWvN`zMXc&}Hn?S?I%R*3KwF+p^rAK~nTG3OD3 z-+GBNfK>`z7Ts>53zDjBC>ND83@g~|0@jSsteA&PF1tx?c!2<*ghWXMa^_1M$a18O z1hl>J+~rBpb>ktk7V`_cy)W)*Ep1qDdIhE$s+N=8o)uKg+gHQ}^*f%m@!F9;Aiz0` zh0{JUDNuLLnVI5Jih-Q^^X~nzPJ^^&yCQoS8|9WeZ2#F77V_@Qj$BMa;WiTsVg58ZFz_&OPI~iYJ6HVIr zmAqW`Qb!YL*!%s!8S`V(A^=fJFp(fdW_m^H=+Pj!oUur5Avb9{B*d#ZduY7i;ez%=KoCwmpYcD;bkRl3%D_3XbQaiSP zOD1@he=oy2+WM#Q?(cX@Rnh*upV$V6S<;a=Rp))V_|tjH;2*WVcA&=Etdc$3M`+5r z+a?s8TuUd|Aj#9B+6d%T5yK{=nFoB5(I@Ze6Nj{}hi8z1PIu0C+%A|(zhLqBHfO#6 zuxIdXxC-PLj?t89m{j6hWXLM6<1**Dzd z<_JK8=^O1tcpRX{idMPTvT`D+f#bi zpby#CehN(Pi41KZ4!Vu%I5Ex*0Fv>+oY2HujviUU7TR2vrG>L=0qt-=oRi9v&Wgu6 zNy@KjZSCY&yQU(T73##YY5OfgMH}3ghi{S?2Kt*zzCOTJsN|$SLjbO;3}zxb{Og-+*PaIGR_t)HTW`x?vu0`zULa?ayyalX&v>7 z4SOJ7aXuSPztj%cWwdRBiiI+TYmJYc-=H<%%H#SYuS`*$rz~zj4hWU5bMNnMb@N>& zOL6&THeq4=XTOp+EHtcanl2T0tttcmlLZ zdb(FZV9JD+u=7SN9By_W{5d@+gcE&lV+K8ou`Jf4`Ps%8uQ+jN;(nq+RBIn>LA((( zDW2q1|MJafL$H+|(VzpQyH8%|i_RypaZ1-}p?Pcu(=p?Aw9p0dTF?mGsb(9zQ3`kS zu~-bE^0FI!w7-#+8V#(ZOvnLdGy9398y~!sByH?O?%9#-*};Qb=3;ZGW>3&iUzV@6 z9PZ)0(e=%bT{!>1<+h-Mw;nc;u3@8!tz(U%XT1Kp&5=XH{J>?GAHD?_D2kGK<~UHO zaPiTk`aH+?b63@T?)J)aDo~`r{O46?H$i@Tb1&@SIS1N_Jexm?wG89saQ!&UMN4ZD zf9^lbMx_*-JP(~-2%$YG!3ij{dN#dn17qst{fo<8Y(WPkmT zr;N7ERE9En?M7Cw?A=;@wzMAKP2=fPWkXH0$cpSr3WLpE>VCuMQiqABP}X|;s~wa0 zxoJ%(OPYP!qJ5O5HU3GNalz!u%N<2Vfd1P;^1oVlFKmK?qhYnV#?s zRQ}C}HhI5{Wo?%+V7_ZdT@{((9Jp*fYVKX@;nN`FG)VI)zu5(iDqCK8$iJ16a2Q5U zP+;%1=4zThpQG^Od&dLK5nTN!RT+#qt%$u+c$YxM^=aqJhNTQWGKBnB^kDL3Uu&{m z;Y3W=FVt2Vgzko+$BCr7Na(^Vvp-kx8u_)knl3)BNnTEor9h0#N0vsh?y}GY_9=5y zCjB&eMap^1*!jhShXV$4&LV?s30SA--~dia`Vg6;sd-)B5e&Xm33IV`BU@*ewoPxu zt5B!W{fPI`KdA{>UY=nHJ9ntyPEa0|z+KAf=epzAjV+4T z6I~TIHv`w!T1&;omDsb(HKN_epi<@O_3Dp;#TKAO%E8tO?R);u0W9tPu(iaXdv>b8n%SnOPO0leX?IgAVK><8Hq# zo($8M{H`^x_qz#T!jVQbxpm5eQ%}DM$ch}y;AB5@n=s&R*#8yaSa_n?jz-#e(o@a2EPZA;J2TlSa7Y2``AyXJh zpv?6#33`q}iUS=&!-u@DgmqIsLwTq_KzVS6_XU{2yW*XqPNKu3Vei{SvFORDn~Q@A zDKe$v$*TM~4UALw6I(UkTeKdHts(8ciyNX*sD7e1@AV~xL7i@*n5RAq5${3jHMZO6 zUVh8E{h95E>zSk5Dm;9GTnNpShq|r~sDSHj`JZ7vk{^eSPv+TNvDWfv{ebJI$}Wal z^Z19IU-MwQn;7RHM(m$q;J$g0<20jNi5$fODYMaLCJ*9=I6j`gWC5otP?%=Yl)rVa zA(P=*gYJ(6Jyspy`&^4Zl@zZg9kv^r*tb#R!j`ej{ujne z_upmU|GZ9yE;%rM)a*%vn z!_KxMq%fhYT(L`kmO`j|EvM55?r5T6>(DC3lV>`v_P^nIahTNEfrZ4!Y~WPKS6^T@ znsE=GUqcbk>O#sEM7}A^sHa9x>{Y9~R>B0j)n-krk$>josN3rCNy`5iJi{Iw{Fb48 zz&DyTM52Ilzgr*?^jEK!Wu(q8lZB6Y$_c?Y#WZ5!ho64U(+E7_M!}~la}Ghm+E-Cf zGwbDos(kCMH{iM`(HI4&S;)6%F!oN4VVCssJeqcW4P*M=QCPg;XbR*cq9Hn~O4u@E zld;ND@rHWP(}Q>z#k7e!4wEo{Wgcqta%p;s+ur2Cdon{pYpAcAi>nDJT`V`Q!@M9%oE_q^Er%mvKikDyuPP^bY z)_%jqPfEW=58N!6maN#@=!OGg7MjN7AAY&oR74xN->|CZsjSj>!w%Su zZCX|54O5L?_&WR9kawRit=e<~yamP7`5fP|urqMiI|9-jq#3cCfp9CaJd#337ion= z7BnMIn9JM~Hgq?@e50X4n5vGdj6>f}!~DeDYjl1NH4ISMy6cxkJE_imKb|UaZn{Ya zY`2SGJt56R%ks_t6~6#L|0ztqMDLJ2D$$C^nofh;*|bTvXI2s&dq<-x8c+S5GZQ88lH_!1F(VOR4`cBqJAT#kuutkTrl)9%L>qMYhqQjf*Qeq=LOuz(sLLf5< zKfAHN0RQ2E*{1d6X6a|ivIX=c7d5+$){V#C&{ zhY6TKPY7ft9_ZIp`|g!ecRiW@x=hnHZC$YT=A{1*tv)LT$!Sk600000NkvXXu0mjf DtS_bG literal 0 HcmV?d00001