Tuner
Tuner - ΠΌΠΎΠ΄ΡΠ»Ρ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΌΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠ°Π½Π½ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ .ts ΡΠ°ΠΉΠ»Π°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΠΏΠΎΠ»ΡΠΌΠΈ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ. Π€Π°ΠΉΠ»Ρ ΠΌΠΎΠ³ΡΡ Ρ ΡΠ°Π½ΠΈΡΡΡΡ ΠΊΠ°ΠΊ Π² ΡΠ°ΠΌΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅(local ΡΠ°ΠΉΠ»Ρ), ΡΠ°ΠΊ ΠΈ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎ (remote).
Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠ»Π°ΡΡ Π΄Π»Ρ ΠΌΠ΅Π½Π΅Π΄ΠΆΠΌΠ΅Π½ΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½ΡΠΈΠ³Π° ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΊΠ½ΡΠΈΠΉ, ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡΠΈΠ΅ ΡΡ Π΅ΠΌΡ ΠΊΠΎΠ½ΡΠΈΠ³Π° Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π΄Π»Ρ ΡΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
ΠΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡ Π΅ΠΌΡ
ΠΠ»Ρ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΡΠΎΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΊΠΎΠ½ΡΠΈΠ³Π° Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³Π° ΡΡ Π΅ΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π½Π°.
ΠΡΡΡΡ Π² ΠΏΠ°ΠΏΠΊΠ΅ config ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΠ°ΠΉΠ» localSupabaseConfig.ts
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½ΡΠΈΠ³Π° Π½Π΅Ρ.
Π‘Π°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΠ±ΡΠ·Π°Π½ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΏΠΎΠ»Π΅ secrets Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠΉ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ .
secrets : {name: string}[]
// config/localSupabaseConfig.ts
const localSupabase = {
name: 'local',
secrets: [
{
name: 'API_KEY',
},
{
name: 'URL',
},
],
timeout: 200,
mainTable: 'customer',
otherKey: 'otherValue',
};
export default localSupabase;
ΠΠ»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΡ Π΅ΠΌΡ ΠΈ ΡΠΈΠΏΠ° ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ watchConfigFiles:
// config/watcher.ts
import { watchConfigFiles } from 'https://deno.land/x/tuner/mod.ts';
const configFilePaths: ConfigFilePaths = {
// ΠΡΡΠΈ Π΄ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½ΡΠΈΠ³Π° ΡΠΈΠΏΠ° supabaseConfig
filePaths: [
'config/localSupabaseConfig.ts',
'config/stageSupabaseConfig.ts',
'config/prodSupabaseConfig.ts',
],
configType: 'supabaseConfig',
};
await watchConfigFiles(configFilePaths);
ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ deno run βallow-all config/watcher.ts ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ΅ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΡ Π΅ΠΌΡ ΠΊΠΎΠ½ΡΠΈΠ³Π°(ΠΈΠ»ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Π΅Π΅ ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅/ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ ΡΠ°ΠΉΠ»Π° ΡΡ Π΅ΠΌΡ)
Π€Π°ΠΉΠ» ΡΡ Π΅ΠΌΡ ΠΊΠΎΠ½ΡΠΈΠ³Π° ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π² ΡΠΎΠΉ ΠΆΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ${configType}Schema.ts
ΠΡΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ ΡΠΈΠΏ ΠΈ Π΅Π³ΠΎ ΠΈΠΌΠΏΠΎΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΠΏΠΈΡΠ΅ΡΡΡ Π² config/localSupabaseConfig.ts, β¦
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ²
// config/manager.ts
import {
SupabaseConfig,
SupabaseConfigSchema,
} from '../config/supabaseConfigSchema.ts';
import { ConfigManager } from 'https://deno.land/x/tuner/mod.ts';
const manager = new ConfigManager<
SupabaseConfig,
typeof SupabaseConfigSchema
>(
SupabaseConfigSchema,
);
// ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³Π°
manager.addRemoteConfigUrl(
'https://raw.githubusercontent.com/artpani4/configTest/main/configTest.ts',
);
// ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ
ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ²
manager.addRemoteConfigUrls(
'https://raw.githubusercontent.com/artpani4/configTest/main/configTest.ts',
'http://example.com/supabaseConfigRu.ts',
'http://example.com/supabaseConfigEn.ts',
);
// ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³Π°
manager.addLocalConfigUrl('config/localSupabaseConfig.ts.ts');
// ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΎΠΊΠ»ΡΠΊΠΈΡ
Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ
ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ²
manager.addLocalConfigUrls([
'config/localSupabaseConfig.ts',
'config/stageSupabaseConfig.ts',
'config/prodSupabaseConfig.ts',
]);
// ΠΡΠ»ΠΈ ΠΏΡΠΎΠΈΠΉΠ·ΠΎΠ΄Π΅Ρ ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ΄Π³ΡΡΠ·ΠΊΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ², ΡΠΎ Π΄Π°Π½Π½ΡΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ Π·Π°Π³ΡΡΠ·ΠΈΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
// ΠΡΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΠΈ Ρ Π½ΠΈΠΌ(ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³Π° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π΅Ρ, Π° ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½) ΡΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.
await manager.setMainConfig('config/localBotConfig.ts', 'local');
export default manager;
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ²
// src/index.ts
import { SupabaseConfig } from '../config/supabaseConfigSchema.ts';
import manager from '../config/manager.ts';
try {
// ΠΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ².
// Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΡΠ°Π²Π½ΠΎ Π»ΠΈ ΠΏΠΎΠ»Π΅ 'name' Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΌΡ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ 'name'.
const config = await manager.loadConfig(
(config: SupabaseConfig) => config.name === Deno.env.get('name'),
);
console.log(config);
// ΠΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΊΡΠ΅ΡΠΎΠ²
const dbApiKey = manager.getSecret('API_KEY');
const dbUrl = manager.getSecret('URL');
} catch (e) {
console.log(e);
}
ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠΈΠΊΡΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ
API_KEY=your_key URL=https://your_db_url.supabase.co deno run --allow-all index.ts
ΠΠΈΠ±ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ» .env
API_KEY=your_key
URL=https://your_db_url.supabase.co
ΠΡΠ»ΠΈ ΡΠΈΠΊΡΠ΅Ρ Π½Π΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ, Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.