Tuner
Tuner - ΠΌΠΎΠ΄ΡΠ»Ρ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΌΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠ°Π½Π½ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ .ts ΡΠ°ΠΉΠ»Π°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΠΏΠΎΠ»ΡΠΌΠΈ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ. Π€Π°ΠΉΠ»Ρ ΠΌΠΎΠ³ΡΡ Ρ ΡΠ°Π½ΠΈΡΡΡΡ ΠΊΠ°ΠΊ Π² ΡΠ°ΠΌΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅(local ΡΠ°ΠΉΠ»Ρ), ΡΠ°ΠΊ ΠΈ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎ (remote). ΠΡΠΈΡΠΎΠΌ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΌ ΡΠ°ΠΉΠ»Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ ΠΏΡΡΡ, Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠ»Π±ΡΠΊ-ΡΡΠΊΠ½ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ Π½ΡΠΆΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅.
Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠ»Π°ΡΡ Π΄Π»Ρ ΠΌΠ΅Π½Π΅Π΄ΠΆΠΌΠ΅Π½ΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½ΡΠΈΠ³Π° ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΊΠ½ΡΠΈΠΉ, ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡΠΈΠ΅ ΡΡ Π΅ΠΌΡ ΠΊΠΎΠ½ΡΠΈΠ³Π° Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π΄Π»Ρ ΡΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
ΠΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡ Π΅ΠΌΡ
ΠΠ»Ρ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΡΠΎΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΊΠΎΠ½ΡΠΈΠ³Π° Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³Π° ΡΡ Π΅ΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π½Π°.
ΠΡΡΡΡ Π² ΠΏΠ°ΠΏΠΊΠ΅ config ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΠ°ΠΉΠ» localConfig.ts
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½ΡΠΈΠ³Π° Π½Π΅Ρ.
Π‘Π°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΠ±ΡΠ·Π°Π½ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΏΠΎΠ»Π΅ secrets Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠΉ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ .
secrets : {name: string}[]
// config/localConfig.ts
const localSupabase = {
name: 'local',
secrets: [
{
name: 'API_KEY',
},
{
name: 'URL',
},
],
timeoutToUpdate: 200,
mainTable: 'Wallets',
isSubscribtionOn: true,
};
export default localSupabase;
ΠΠ»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΡ Π΅ΠΌΡ ΠΈ ΡΠΈΠΏΠ° ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ watchConfigFiles:
// config/watcher.ts
import { watchConfigFiles } from 'https://deno.land/x/tuner/mod.ts';
const configFilePaths: ConfigFilePaths = {
filePaths: [
'config/localConfig.ts',
'config/prodConfig.ts',
],
configType: 'supabaseConfig',
};
await watchConfigFiles(configFilePaths);
ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ deno run βallow-all config/watcher.ts ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ΅ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΡ Π΅ΠΌΡ ΠΊΠΎΠ½ΡΠΈΠ³Π°(ΠΈΠ»ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Π΅Π΅ ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅/ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ ΡΠ°ΠΉΠ»Π° ΡΡ Π΅ΠΌΡ)
Π€Π°ΠΉΠ» ΡΡ Π΅ΠΌΡ ΠΊΠΎΠ½ΡΠΈΠ³Π° ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π² ΡΠΎΠΉ ΠΆΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ${configType}Schema.ts
ΠΡΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ ΡΠΈΠΏ ΠΈ Π΅Π³ΠΎ ΠΈΠΌΠΏΠΎΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΠΏΠΈΡΠ΅ΡΡΡ Π² config/localConfig.ts, β¦
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ²
// config/manager.ts
import {
SupabaseConfig,
SupabaseConfigSchema,
} from '../config/supabaseConfigSchema.ts';
import {
ConfigManager,
getNotionConfig,
} 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([
'http://example.com/supabaseConfigRu.ts',
'http://example.com/supabaseConfigEn.ts',
]);
// ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³Π°
manager.addLocalConfigUrl('config/localConfig.ts');
// ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΎΠΊΠ»ΡΠΊΠΈΡ
Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ
ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ²
manager.addLocalConfigUrls([
'config/localConfig.ts',
'config/prodConfig.ts',
]);
// ΠΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ callback, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Ρ ΡΡΡΠΎΠΊΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ
// Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ getNotionConfig(key: string, blockId: string): Promise<string>
manager.addRemoteProSource(async () => {
return await getNotionConfig(
getSecret('NOTION_KEY'),
'blockID',
);
});
// ΠΡΠ»ΠΈ ΠΏΡΠΎΠΈΠΉΠ·ΠΎΠ΄Π΅Ρ ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ΄Π³ΡΡΠ·ΠΊΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ², ΡΠΎ Π΄Π°Π½Π½ΡΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ Π·Π°Π³ΡΡΠ·ΠΈΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
// ΠΡΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΠΈ Ρ Π½ΠΈΠΌ(ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³Π° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π΅Ρ, Π° ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½) ΡΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.
await manager.setMainConfig('config/localConfig.ts', 'local');
export default manager;
ΠΠΎΠ½ΡΠΈΠ³ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ .addRemoteConfigUrl ΠΈ .addRemoteConfigUrls ΠΏΡΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΠΈ
ΠΠΎΠ½ΡΠΈΠ³ΠΈ, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΠ΅ ΡΠ΅ΡΠ΅Π· .addRemoteProSource ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π±Π΅Π· const β¦, ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠΎΠ½ΡΠΈΠ³Π°.
// ΠΠΎΠ½ΡΠΈΠ³ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ ΡΠ΅ΡΠ΅Π· addRemoteConfigUrl
const prodSupabase = {
name: 'gitRaw',
secrets: [
{
name: 'API_KEY',
},
{
name: 'URL',
},
],
timeoutToUpdate: 100,
mainTable: 'Invoices',
isSubscribtionOn: false,
};
export default prodSupabase;
// ΠΠΎΠ½ΡΠΈΠ³ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ ΡΠ΅ΡΠ΅Π· .addRemoteProSource
{
name: 'notion',
secrets: [
{
name: 'API_KEY',
},
{
name: 'URL',
},
],
timeoutToUpdate: 3000,
mainTable: 'Notion',
isSubscribtionOn: true,
};
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ²
// src/index.ts
import { SupabaseConfig } from '../config/supabaseConfigSchema.ts';
import manager from '../config/manager.ts';
import { getSecret } from 'https://deno.land/x/tuner/mod.ts';
try {
// ΠΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ².
// Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΡΠ°Π²Π½ΠΎ Π»ΠΈ ΠΏΠΎΠ»Π΅ 'name' Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΌΡ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ 'name'.
const config = await manager.loadConfig(
(config: SupabaseConfig) => config.name === Deno.env.get('name'),
);
console.log(config);
// ΠΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΊΡΠ΅ΡΠΎΠ²
const dbApiKey = getSecret('API_KEY');
const dbUrl = 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
ΠΡΠ»ΠΈ ΡΠΈΠΊΡΠ΅Ρ Π½Π΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ, Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π±ΡΠΊΠ° Π΄Π»Ρ ΠΏΠΎΠ΄Π³ΡΡΠ·ΠΊΠΈ ΠΊΠΎΠ½ΡΠΈΠ³Π° ΡΠΈΡΡΠ°ΡΠΈΠ²Π½ΠΎ, Π½ΠΎ Π±ΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ»ΡΡΠ°ΡΡ .
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ:
- Notion(Π±Π»ΠΎΠΊ /code)
- GitHub(ΡΠ°ΠΉΠ» Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ)
// Notion
// blockId ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ ΠΏΠΎΡΠ»Π΅ # Π² ΡΡΡΠ»ΠΊΠ΅ Π½Π° Π±Π»ΠΎΠΊ
getNotionConfig(key: string, blockId: string)
// GihHub
getGitHubConfig(
apiKey: string,
owner: string,
repo: string,
filePath: string,
)