@nitronjs/framework 0.1.21 → 0.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/create.js +28 -4
- package/cli/njs.js +33 -5
- package/lib/Console/Commands/MigrateCommand.js +27 -70
- package/lib/Console/Commands/MigrateFreshCommand.js +49 -66
- package/lib/Console/Commands/MigrateRollbackCommand.js +52 -0
- package/lib/Console/Commands/MigrateStatusCommand.js +38 -0
- package/lib/Console/Commands/SeedCommand.js +36 -65
- package/lib/Core/Paths.js +8 -0
- package/lib/Database/Migration/Checksum.js +23 -0
- package/lib/Database/Migration/MigrationRepository.js +92 -0
- package/lib/Database/Migration/MigrationRunner.js +327 -0
- package/lib/Database/Migration/migrations/0000_00_00_00_00_create_migrations_table.js +21 -0
- package/lib/Database/Migration/migrations/0000_00_00_00_01_create_seeders_table.js +20 -0
- package/lib/Database/Schema/Blueprint.js +0 -40
- package/lib/Database/Schema/Manager.js +29 -40
- package/lib/Database/Seeder/SeederRepository.js +49 -0
- package/lib/Database/Seeder/SeederRunner.js +183 -0
- package/lib/Faker/Data/Address.js +63 -0
- package/lib/Faker/Data/Color.js +72 -0
- package/lib/Faker/Data/Company.js +59 -0
- package/lib/Faker/Data/Date.js +49 -0
- package/lib/Faker/Data/Finance.js +65 -0
- package/lib/Faker/Data/Internet.js +73 -0
- package/lib/Faker/Data/Lorem.js +45 -0
- package/lib/Faker/Data/Person.js +67 -0
- package/lib/Faker/Data/Phone.js +26 -0
- package/lib/Faker/Faker.d.ts +205 -0
- package/lib/Faker/Faker.js +812 -0
- package/lib/View/Manager.js +26 -5
- package/lib/index.d.ts +407 -0
- package/lib/index.js +12 -0
- package/package.json +6 -2
- package/skeleton/config/app.js +20 -0
- package/skeleton/globals.d.ts +68 -1
- package/skeleton/tsconfig.json +6 -16
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import DB from "../DB.js";
|
|
2
|
+
|
|
3
|
+
class SeederRepository {
|
|
4
|
+
|
|
5
|
+
static table = 'seeders';
|
|
6
|
+
|
|
7
|
+
static async tableExists() {
|
|
8
|
+
try {
|
|
9
|
+
await DB.table(this.table).limit(1).get();
|
|
10
|
+
return true;
|
|
11
|
+
} catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
static async getExecuted() {
|
|
17
|
+
if (!await this.tableExists()) return [];
|
|
18
|
+
return await DB.table(this.table).orderBy("id", "asc").get();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
static async getExecutedNames() {
|
|
22
|
+
const seeders = await this.getExecuted();
|
|
23
|
+
return new Set(seeders.map(s => s.name));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
static async log(name, checksum) {
|
|
27
|
+
await DB.table(this.table).insert({
|
|
28
|
+
name,
|
|
29
|
+
checksum,
|
|
30
|
+
executed_at: new Date()
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
static async find(name) {
|
|
35
|
+
return await DB.table(this.table).where("name", name).first();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static async exists(name) {
|
|
39
|
+
return (await this.find(name)) !== null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
static async getChecksum(name) {
|
|
43
|
+
const seeder = await this.find(name);
|
|
44
|
+
return seeder?.checksum || null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export default SeederRepository;
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { pathToFileURL } from 'url';
|
|
4
|
+
import Checksum from '../Migration/Checksum.js';
|
|
5
|
+
import SeederRepository from './SeederRepository.js';
|
|
6
|
+
import Paths from '../../Core/Paths.js';
|
|
7
|
+
|
|
8
|
+
const COLORS = {
|
|
9
|
+
reset: '\x1b[0m',
|
|
10
|
+
red: '\x1b[31m',
|
|
11
|
+
green: '\x1b[32m',
|
|
12
|
+
yellow: '\x1b[33m',
|
|
13
|
+
cyan: '\x1b[36m',
|
|
14
|
+
dim: '\x1b[2m',
|
|
15
|
+
bold: '\x1b[1m'
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
class SeederRunner {
|
|
19
|
+
|
|
20
|
+
static async run(environment = 'prod') {
|
|
21
|
+
const seedersDir = environment === 'dev' ? Paths.seedersDev : Paths.seedersProd;
|
|
22
|
+
|
|
23
|
+
if (!fs.existsSync(seedersDir)) {
|
|
24
|
+
console.log(`${COLORS.yellow}⚠️ No seeders directory found for ${environment}${COLORS.reset}`);
|
|
25
|
+
return { success: true, ran: [] };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const files = fs.readdirSync(seedersDir)
|
|
29
|
+
.filter(f => f.endsWith('.js'))
|
|
30
|
+
.sort();
|
|
31
|
+
|
|
32
|
+
if (files.length === 0) {
|
|
33
|
+
console.log(`${COLORS.yellow}⚠️ No seeder files found in ${environment}${COLORS.reset}`);
|
|
34
|
+
return { success: true, ran: [] };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const executedNames = await SeederRepository.getExecutedNames();
|
|
38
|
+
|
|
39
|
+
for (const file of files) {
|
|
40
|
+
const fullName = `${environment}/${file}`;
|
|
41
|
+
if (executedNames.has(fullName)) {
|
|
42
|
+
const filePath = path.join(seedersDir, file);
|
|
43
|
+
const currentChecksum = Checksum.fromFile(filePath);
|
|
44
|
+
const storedChecksum = await SeederRepository.getChecksum(fullName);
|
|
45
|
+
|
|
46
|
+
if (currentChecksum !== storedChecksum) {
|
|
47
|
+
console.error(`${COLORS.red}❌ CHECKSUM MISMATCH: ${fullName}${COLORS.reset}`);
|
|
48
|
+
console.error(`${COLORS.dim} Stored: ${storedChecksum}${COLORS.reset}`);
|
|
49
|
+
console.error(`${COLORS.dim} Current: ${currentChecksum}${COLORS.reset}`);
|
|
50
|
+
console.error(`${COLORS.red} Seeder files must NEVER be modified after execution.${COLORS.reset}`);
|
|
51
|
+
console.error(`${COLORS.red} Create a NEW seeder for any data changes.${COLORS.reset}`);
|
|
52
|
+
return {
|
|
53
|
+
success: false,
|
|
54
|
+
ran: [],
|
|
55
|
+
error: new Error(`Checksum mismatch for seeder: ${fullName}`)
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const pending = files.filter(f => !executedNames.has(`${environment}/${f}`));
|
|
62
|
+
|
|
63
|
+
if (pending.length === 0) {
|
|
64
|
+
console.log(`${COLORS.green}✅ Nothing to seed. All ${environment} seeders are up to date.${COLORS.reset}`);
|
|
65
|
+
return { success: true, ran: [] };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
console.log(`${COLORS.cyan}🌱 Running ${environment} seeders${COLORS.reset}\n`);
|
|
69
|
+
|
|
70
|
+
const executed = [];
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
for (const file of pending) {
|
|
74
|
+
const filePath = path.join(seedersDir, file);
|
|
75
|
+
const fileUrl = pathToFileURL(filePath).href;
|
|
76
|
+
const checksum = Checksum.fromFile(filePath);
|
|
77
|
+
const fullName = `${environment}/${file}`;
|
|
78
|
+
|
|
79
|
+
console.log(`${COLORS.dim}Seeding:${COLORS.reset} ${COLORS.cyan}${fullName}${COLORS.reset}`);
|
|
80
|
+
|
|
81
|
+
const { default: seeder } = await import(fileUrl);
|
|
82
|
+
|
|
83
|
+
if (typeof seeder.run !== 'function') {
|
|
84
|
+
throw new Error(`Seeder ${file} does not have a run() method`);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
await seeder.run();
|
|
88
|
+
await SeederRepository.log(fullName, checksum);
|
|
89
|
+
executed.push(fullName);
|
|
90
|
+
|
|
91
|
+
console.log(`${COLORS.green}✅ Seeded:${COLORS.reset} ${COLORS.cyan}${fullName}${COLORS.reset}\n`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
console.log(`${COLORS.green}${COLORS.bold}✅ All ${environment} seeders completed successfully.${COLORS.reset}`);
|
|
95
|
+
return { success: true, ran: executed };
|
|
96
|
+
|
|
97
|
+
} catch (error) {
|
|
98
|
+
console.error(`\n${COLORS.red}❌ Seeding failed: ${error.message}${COLORS.reset}`);
|
|
99
|
+
return { success: false, ran: executed, error };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static async runAll() {
|
|
104
|
+
console.log(`${COLORS.bold}Running prod seeders...${COLORS.reset}\n`);
|
|
105
|
+
const prodResult = await this.run('prod');
|
|
106
|
+
|
|
107
|
+
if (!prodResult.success) {
|
|
108
|
+
return prodResult;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
console.log(`\n${COLORS.bold}Running dev seeders...${COLORS.reset}\n`);
|
|
112
|
+
const devResult = await this.run('dev');
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
success: devResult.success,
|
|
116
|
+
ran: [...prodResult.ran, ...devResult.ran],
|
|
117
|
+
error: devResult.error
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
static async status() {
|
|
122
|
+
const prodDir = Paths.seedersProd;
|
|
123
|
+
const devDir = Paths.seedersDev;
|
|
124
|
+
|
|
125
|
+
const status = [];
|
|
126
|
+
|
|
127
|
+
if (fs.existsSync(prodDir)) {
|
|
128
|
+
const prodFiles = fs.readdirSync(prodDir).filter(f => f.endsWith('.js')).sort();
|
|
129
|
+
for (const file of prodFiles) {
|
|
130
|
+
const fullName = `prod/${file}`;
|
|
131
|
+
const record = await SeederRepository.find(fullName);
|
|
132
|
+
status.push({
|
|
133
|
+
name: fullName,
|
|
134
|
+
status: record ? 'Ran' : 'Pending',
|
|
135
|
+
executedAt: record?.executed_at || null
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (fs.existsSync(devDir)) {
|
|
141
|
+
const devFiles = fs.readdirSync(devDir).filter(f => f.endsWith('.js')).sort();
|
|
142
|
+
for (const file of devFiles) {
|
|
143
|
+
const fullName = `dev/${file}`;
|
|
144
|
+
const record = await SeederRepository.find(fullName);
|
|
145
|
+
status.push({
|
|
146
|
+
name: fullName,
|
|
147
|
+
status: record ? 'Ran' : 'Pending',
|
|
148
|
+
executedAt: record?.executed_at || null
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return status;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
static async printStatus() {
|
|
157
|
+
const status = await this.status();
|
|
158
|
+
|
|
159
|
+
if (status.length === 0) {
|
|
160
|
+
console.log(`${COLORS.yellow}⚠️ No seeders found.${COLORS.reset}`);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
console.log(`\n${COLORS.bold}Seeder Status${COLORS.reset}\n`);
|
|
165
|
+
console.log(`${COLORS.dim}${'─'.repeat(80)}${COLORS.reset}`);
|
|
166
|
+
|
|
167
|
+
for (const seeder of status) {
|
|
168
|
+
const statusColor = seeder.status === 'Ran' ? COLORS.green : COLORS.yellow;
|
|
169
|
+
const statusIcon = seeder.status === 'Ran' ? '✅' : '⏳';
|
|
170
|
+
|
|
171
|
+
console.log(`${statusIcon} ${statusColor}${seeder.status.padEnd(7)}${COLORS.reset} ${seeder.name}`);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
console.log(`${COLORS.dim}${'─'.repeat(80)}${COLORS.reset}\n`);
|
|
175
|
+
|
|
176
|
+
const ran = status.filter(s => s.status === 'Ran').length;
|
|
177
|
+
const pending = status.filter(s => s.status === 'Pending').length;
|
|
178
|
+
console.log(`${COLORS.dim}Total: ${status.length} | Ran: ${ran} | Pending: ${pending}${COLORS.reset}\n`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export default SeederRunner;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export const streetSuffixes = [
|
|
2
|
+
"Street", "Avenue", "Boulevard", "Drive", "Lane", "Road", "Way", "Place", "Court", "Circle",
|
|
3
|
+
"Trail", "Parkway", "Commons", "Square", "Terrace", "Path", "Pike", "Highway", "Crossing", "Point"
|
|
4
|
+
];
|
|
5
|
+
|
|
6
|
+
export const streetNames = [
|
|
7
|
+
"Main", "Oak", "Maple", "Cedar", "Pine", "Elm", "Washington", "Lake", "Hill", "Park",
|
|
8
|
+
"Church", "High", "Union", "Market", "Spring", "Center", "School", "River", "Mill", "Water",
|
|
9
|
+
"Bridge", "Pleasant", "Lincoln", "Franklin", "Jackson", "Madison", "Jefferson", "Adams", "Monroe", "Valley",
|
|
10
|
+
"Forest", "Sunset", "Meadow", "Garden", "Willow", "Cherry", "Walnut", "Chestnut", "Birch", "Spruce"
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
export const cities = [
|
|
14
|
+
"New York", "Los Angeles", "Chicago", "Houston", "Phoenix", "Philadelphia", "San Antonio", "San Diego",
|
|
15
|
+
"Dallas", "San Jose", "Austin", "Jacksonville", "Fort Worth", "Columbus", "Charlotte", "San Francisco",
|
|
16
|
+
"Indianapolis", "Seattle", "Denver", "Washington", "Boston", "El Paso", "Nashville", "Detroit",
|
|
17
|
+
"Portland", "Memphis", "Oklahoma City", "Las Vegas", "Louisville", "Baltimore", "Milwaukee", "Albuquerque",
|
|
18
|
+
"Tucson", "Fresno", "Sacramento", "Kansas City", "Mesa", "Atlanta", "Omaha", "Colorado Springs",
|
|
19
|
+
"Raleigh", "Miami", "Long Beach", "Virginia Beach", "Oakland", "Minneapolis", "Tampa", "Arlington"
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
export const states = [
|
|
23
|
+
{ name: "Alabama", abbr: "AL" }, { name: "Alaska", abbr: "AK" }, { name: "Arizona", abbr: "AZ" },
|
|
24
|
+
{ name: "Arkansas", abbr: "AR" }, { name: "California", abbr: "CA" }, { name: "Colorado", abbr: "CO" },
|
|
25
|
+
{ name: "Connecticut", abbr: "CT" }, { name: "Delaware", abbr: "DE" }, { name: "Florida", abbr: "FL" },
|
|
26
|
+
{ name: "Georgia", abbr: "GA" }, { name: "Hawaii", abbr: "HI" }, { name: "Idaho", abbr: "ID" },
|
|
27
|
+
{ name: "Illinois", abbr: "IL" }, { name: "Indiana", abbr: "IN" }, { name: "Iowa", abbr: "IA" },
|
|
28
|
+
{ name: "Kansas", abbr: "KS" }, { name: "Kentucky", abbr: "KY" }, { name: "Louisiana", abbr: "LA" },
|
|
29
|
+
{ name: "Maine", abbr: "ME" }, { name: "Maryland", abbr: "MD" }, { name: "Massachusetts", abbr: "MA" },
|
|
30
|
+
{ name: "Michigan", abbr: "MI" }, { name: "Minnesota", abbr: "MN" }, { name: "Mississippi", abbr: "MS" },
|
|
31
|
+
{ name: "Missouri", abbr: "MO" }, { name: "Montana", abbr: "MT" }, { name: "Nebraska", abbr: "NE" },
|
|
32
|
+
{ name: "Nevada", abbr: "NV" }, { name: "New Hampshire", abbr: "NH" }, { name: "New Jersey", abbr: "NJ" },
|
|
33
|
+
{ name: "New Mexico", abbr: "NM" }, { name: "New York", abbr: "NY" }, { name: "North Carolina", abbr: "NC" },
|
|
34
|
+
{ name: "North Dakota", abbr: "ND" }, { name: "Ohio", abbr: "OH" }, { name: "Oklahoma", abbr: "OK" },
|
|
35
|
+
{ name: "Oregon", abbr: "OR" }, { name: "Pennsylvania", abbr: "PA" }, { name: "Rhode Island", abbr: "RI" },
|
|
36
|
+
{ name: "South Carolina", abbr: "SC" }, { name: "South Dakota", abbr: "SD" }, { name: "Tennessee", abbr: "TN" },
|
|
37
|
+
{ name: "Texas", abbr: "TX" }, { name: "Utah", abbr: "UT" }, { name: "Vermont", abbr: "VT" },
|
|
38
|
+
{ name: "Virginia", abbr: "VA" }, { name: "Washington", abbr: "WA" }, { name: "West Virginia", abbr: "WV" },
|
|
39
|
+
{ name: "Wisconsin", abbr: "WI" }, { name: "Wyoming", abbr: "WY" }
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
export const countries = [
|
|
43
|
+
{ name: "United States", code: "US" }, { name: "United Kingdom", code: "GB" }, { name: "Canada", code: "CA" },
|
|
44
|
+
{ name: "Australia", code: "AU" }, { name: "Germany", code: "DE" }, { name: "France", code: "FR" },
|
|
45
|
+
{ name: "Italy", code: "IT" }, { name: "Spain", code: "ES" }, { name: "Netherlands", code: "NL" },
|
|
46
|
+
{ name: "Belgium", code: "BE" }, { name: "Sweden", code: "SE" }, { name: "Norway", code: "NO" },
|
|
47
|
+
{ name: "Denmark", code: "DK" }, { name: "Finland", code: "FI" }, { name: "Ireland", code: "IE" },
|
|
48
|
+
{ name: "Switzerland", code: "CH" }, { name: "Austria", code: "AT" }, { name: "Portugal", code: "PT" },
|
|
49
|
+
{ name: "Poland", code: "PL" }, { name: "Czech Republic", code: "CZ" }, { name: "Japan", code: "JP" },
|
|
50
|
+
{ name: "South Korea", code: "KR" }, { name: "China", code: "CN" }, { name: "India", code: "IN" },
|
|
51
|
+
{ name: "Brazil", code: "BR" }, { name: "Mexico", code: "MX" }, { name: "Argentina", code: "AR" },
|
|
52
|
+
{ name: "South Africa", code: "ZA" }, { name: "New Zealand", code: "NZ" }, { name: "Singapore", code: "SG" }
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
export const directions = ["North", "South", "East", "West", "Northeast", "Northwest", "Southeast", "Southwest"];
|
|
56
|
+
|
|
57
|
+
export const secondaryAddresses = ["Apt.", "Suite", "Unit", "Floor", "Building", "Room"];
|
|
58
|
+
|
|
59
|
+
export const timeZones = [
|
|
60
|
+
"America/New_York", "America/Chicago", "America/Denver", "America/Los_Angeles", "America/Phoenix",
|
|
61
|
+
"Europe/London", "Europe/Paris", "Europe/Berlin", "Europe/Moscow", "Asia/Tokyo",
|
|
62
|
+
"Asia/Shanghai", "Asia/Singapore", "Asia/Dubai", "Australia/Sydney", "Pacific/Auckland"
|
|
63
|
+
];
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export const colorNames = [
|
|
2
|
+
"red", "green", "blue", "yellow", "orange", "purple", "pink", "brown", "black", "white",
|
|
3
|
+
"gray", "cyan", "magenta", "lime", "maroon", "navy", "olive", "teal", "aqua", "silver",
|
|
4
|
+
"coral", "crimson", "indigo", "violet", "turquoise", "salmon", "khaki", "gold", "beige", "ivory"
|
|
5
|
+
];
|
|
6
|
+
|
|
7
|
+
export const cssColors = [
|
|
8
|
+
{ name: "aliceblue", hex: "#f0f8ff" },
|
|
9
|
+
{ name: "antiquewhite", hex: "#faebd7" },
|
|
10
|
+
{ name: "aqua", hex: "#00ffff" },
|
|
11
|
+
{ name: "aquamarine", hex: "#7fffd4" },
|
|
12
|
+
{ name: "azure", hex: "#f0ffff" },
|
|
13
|
+
{ name: "beige", hex: "#f5f5dc" },
|
|
14
|
+
{ name: "bisque", hex: "#ffe4c4" },
|
|
15
|
+
{ name: "black", hex: "#000000" },
|
|
16
|
+
{ name: "blanchedalmond", hex: "#ffebcd" },
|
|
17
|
+
{ name: "blue", hex: "#0000ff" },
|
|
18
|
+
{ name: "blueviolet", hex: "#8a2be2" },
|
|
19
|
+
{ name: "brown", hex: "#a52a2a" },
|
|
20
|
+
{ name: "burlywood", hex: "#deb887" },
|
|
21
|
+
{ name: "cadetblue", hex: "#5f9ea0" },
|
|
22
|
+
{ name: "chartreuse", hex: "#7fff00" },
|
|
23
|
+
{ name: "chocolate", hex: "#d2691e" },
|
|
24
|
+
{ name: "coral", hex: "#ff7f50" },
|
|
25
|
+
{ name: "cornflowerblue", hex: "#6495ed" },
|
|
26
|
+
{ name: "cornsilk", hex: "#fff8dc" },
|
|
27
|
+
{ name: "crimson", hex: "#dc143c" },
|
|
28
|
+
{ name: "cyan", hex: "#00ffff" },
|
|
29
|
+
{ name: "darkblue", hex: "#00008b" },
|
|
30
|
+
{ name: "darkcyan", hex: "#008b8b" },
|
|
31
|
+
{ name: "darkgoldenrod", hex: "#b8860b" },
|
|
32
|
+
{ name: "darkgray", hex: "#a9a9a9" },
|
|
33
|
+
{ name: "darkgreen", hex: "#006400" },
|
|
34
|
+
{ name: "darkkhaki", hex: "#bdb76b" },
|
|
35
|
+
{ name: "darkmagenta", hex: "#8b008b" },
|
|
36
|
+
{ name: "darkolivegreen", hex: "#556b2f" },
|
|
37
|
+
{ name: "darkorange", hex: "#ff8c00" },
|
|
38
|
+
{ name: "darkorchid", hex: "#9932cc" },
|
|
39
|
+
{ name: "darkred", hex: "#8b0000" },
|
|
40
|
+
{ name: "darksalmon", hex: "#e9967a" },
|
|
41
|
+
{ name: "darkseagreen", hex: "#8fbc8f" },
|
|
42
|
+
{ name: "darkslateblue", hex: "#483d8b" },
|
|
43
|
+
{ name: "darkslategray", hex: "#2f4f4f" },
|
|
44
|
+
{ name: "darkturquoise", hex: "#00ced1" },
|
|
45
|
+
{ name: "darkviolet", hex: "#9400d3" },
|
|
46
|
+
{ name: "deeppink", hex: "#ff1493" },
|
|
47
|
+
{ name: "deepskyblue", hex: "#00bfff" },
|
|
48
|
+
{ name: "dimgray", hex: "#696969" },
|
|
49
|
+
{ name: "dodgerblue", hex: "#1e90ff" },
|
|
50
|
+
{ name: "firebrick", hex: "#b22222" },
|
|
51
|
+
{ name: "floralwhite", hex: "#fffaf0" },
|
|
52
|
+
{ name: "forestgreen", hex: "#228b22" },
|
|
53
|
+
{ name: "fuchsia", hex: "#ff00ff" },
|
|
54
|
+
{ name: "gainsboro", hex: "#dcdcdc" },
|
|
55
|
+
{ name: "ghostwhite", hex: "#f8f8ff" },
|
|
56
|
+
{ name: "gold", hex: "#ffd700" },
|
|
57
|
+
{ name: "goldenrod", hex: "#daa520" }
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
export const tailwindColors = {
|
|
61
|
+
slate: ["#f8fafc", "#f1f5f9", "#e2e8f0", "#cbd5e1", "#94a3b8", "#64748b", "#475569", "#334155", "#1e293b", "#0f172a"],
|
|
62
|
+
gray: ["#f9fafb", "#f3f4f6", "#e5e7eb", "#d1d5db", "#9ca3af", "#6b7280", "#4b5563", "#374151", "#1f2937", "#111827"],
|
|
63
|
+
zinc: ["#fafafa", "#f4f4f5", "#e4e4e7", "#d4d4d8", "#a1a1aa", "#71717a", "#52525b", "#3f3f46", "#27272a", "#18181b"],
|
|
64
|
+
red: ["#fef2f2", "#fee2e2", "#fecaca", "#fca5a5", "#f87171", "#ef4444", "#dc2626", "#b91c1c", "#991b1b", "#7f1d1d"],
|
|
65
|
+
orange: ["#fff7ed", "#ffedd5", "#fed7aa", "#fdba74", "#fb923c", "#f97316", "#ea580c", "#c2410c", "#9a3412", "#7c2d12"],
|
|
66
|
+
yellow: ["#fefce8", "#fef9c3", "#fef08a", "#fde047", "#facc15", "#eab308", "#ca8a04", "#a16207", "#854d0e", "#713f12"],
|
|
67
|
+
green: ["#f0fdf4", "#dcfce7", "#bbf7d0", "#86efac", "#4ade80", "#22c55e", "#16a34a", "#15803d", "#166534", "#14532d"],
|
|
68
|
+
blue: ["#eff6ff", "#dbeafe", "#bfdbfe", "#93c5fd", "#60a5fa", "#3b82f6", "#2563eb", "#1d4ed8", "#1e40af", "#1e3a8a"],
|
|
69
|
+
indigo: ["#eef2ff", "#e0e7ff", "#c7d2fe", "#a5b4fc", "#818cf8", "#6366f1", "#4f46e5", "#4338ca", "#3730a3", "#312e81"],
|
|
70
|
+
purple: ["#faf5ff", "#f3e8ff", "#e9d5ff", "#d8b4fe", "#c084fc", "#a855f7", "#9333ea", "#7e22ce", "#6b21a8", "#581c87"],
|
|
71
|
+
pink: ["#fdf2f8", "#fce7f3", "#fbcfe8", "#f9a8d4", "#f472b6", "#ec4899", "#db2777", "#be185d", "#9d174d", "#831843"]
|
|
72
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export const companySuffixes = [
|
|
2
|
+
"Inc", "LLC", "Corp", "Ltd", "Co", "Group", "Holdings", "Partners", "Solutions", "Technologies",
|
|
3
|
+
"Industries", "Enterprises", "International", "Global", "Services", "Systems", "Associates", "Consulting"
|
|
4
|
+
];
|
|
5
|
+
|
|
6
|
+
export const companyPrefixes = [
|
|
7
|
+
"Advanced", "Global", "Digital", "Dynamic", "Innovative", "Premier", "Elite", "Prime", "Strategic", "United",
|
|
8
|
+
"Universal", "Apex", "Summit", "Pinnacle", "Core", "Future", "Next", "Smart", "Tech", "Blue"
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
export const industries = [
|
|
12
|
+
"Technology", "Healthcare", "Finance", "Education", "Retail", "Manufacturing", "Real Estate", "Hospitality",
|
|
13
|
+
"Transportation", "Energy", "Telecommunications", "Media", "Entertainment", "Agriculture", "Construction",
|
|
14
|
+
"Automotive", "Aerospace", "Pharmaceuticals", "Insurance", "Consulting", "Legal", "Marketing", "Logistics"
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
export const catchPhraseAdjectives = [
|
|
18
|
+
"Adaptive", "Advanced", "Automated", "Balanced", "Business-focused", "Centralized", "Compatible",
|
|
19
|
+
"Configurable", "Cross-platform", "Customer-focused", "Customizable", "Decentralized", "Digitized",
|
|
20
|
+
"Distributed", "Enhanced", "Enterprise-wide", "Ergonomic", "Exclusive", "Expanded", "Extended",
|
|
21
|
+
"Focused", "Front-line", "Fully-configurable", "Fundamental", "Future-proofed", "Horizontal",
|
|
22
|
+
"Implemented", "Innovative", "Integrated", "Intuitive", "Managed", "Multi-lateral", "Networked",
|
|
23
|
+
"Object-based", "Open-source", "Optimized", "Organized", "Persevering", "Persistent", "Polarized",
|
|
24
|
+
"Pre-emptive", "Proactive", "Profit-focused", "Programmable", "Progressive", "Quality-focused",
|
|
25
|
+
"Reactive", "Realigned", "Re-engineered", "Reduced", "Reverse-engineered", "Robust", "Seamless",
|
|
26
|
+
"Secured", "Self-enabling", "Sharable", "Stand-alone", "Streamlined", "Switchable", "Synchronized"
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
export const catchPhraseDescriptors = [
|
|
30
|
+
"24/7", "24 hour", "3rd generation", "4th generation", "5th generation", "6th generation",
|
|
31
|
+
"actuating", "analyzing", "asymmetric", "asynchronous", "attitude-oriented", "background",
|
|
32
|
+
"bandwidth-monitored", "bi-directional", "bifurcated", "bottom-line", "clear-thinking",
|
|
33
|
+
"client-driven", "client-server", "coherent", "cohesive", "composite", "context-sensitive",
|
|
34
|
+
"contextually-based", "content-based", "dedicated", "demand-driven", "didactic", "directional",
|
|
35
|
+
"discrete", "disintermediate", "dynamic", "eco-centric", "empowering", "encompassing",
|
|
36
|
+
"even-keeled", "executive", "explicit", "exuding", "fault-tolerant", "foreground", "fresh-thinking"
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
export const catchPhraseNouns = [
|
|
40
|
+
"ability", "access", "adapter", "algorithm", "alliance", "analyzer", "application", "approach",
|
|
41
|
+
"architecture", "archive", "array", "attitude", "benchmark", "capability", "capacity",
|
|
42
|
+
"challenge", "circuit", "collaboration", "complexity", "concept", "conglomeration", "contingency",
|
|
43
|
+
"core", "customer loyalty", "data-warehouse", "database", "definition", "emulation", "encoding",
|
|
44
|
+
"encryption", "extranet", "firmware", "flexibility", "focus group", "forecast", "frame",
|
|
45
|
+
"framework", "function", "functionalities", "graphical user interface", "groupware", "hardware",
|
|
46
|
+
"help-desk", "hierarchy", "hub", "implementation", "info-mediaries", "infrastructure", "initiative"
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
export const buzzwords = [
|
|
50
|
+
"synergy", "leverage", "paradigm", "ecosystem", "scalable", "agile", "disruptive", "blockchain",
|
|
51
|
+
"AI-driven", "cloud-native", "data-driven", "customer-centric", "omnichannel", "sustainable",
|
|
52
|
+
"innovative", "next-generation", "cutting-edge", "seamless", "holistic", "end-to-end",
|
|
53
|
+
"mission-critical", "best-in-class", "world-class", "game-changing", "revolutionary", "turnkey"
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
export const departments = [
|
|
57
|
+
"Engineering", "Marketing", "Sales", "Human Resources", "Finance", "Operations", "Legal",
|
|
58
|
+
"Customer Support", "Product", "Design", "Research", "IT", "Quality Assurance", "Business Development"
|
|
59
|
+
];
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export const months = [
|
|
2
|
+
{ name: "January", abbr: "Jan", days: 31 },
|
|
3
|
+
{ name: "February", abbr: "Feb", days: 28 },
|
|
4
|
+
{ name: "March", abbr: "Mar", days: 31 },
|
|
5
|
+
{ name: "April", abbr: "Apr", days: 30 },
|
|
6
|
+
{ name: "May", abbr: "May", days: 31 },
|
|
7
|
+
{ name: "June", abbr: "Jun", days: 30 },
|
|
8
|
+
{ name: "July", abbr: "Jul", days: 31 },
|
|
9
|
+
{ name: "August", abbr: "Aug", days: 31 },
|
|
10
|
+
{ name: "September", abbr: "Sep", days: 30 },
|
|
11
|
+
{ name: "October", abbr: "Oct", days: 31 },
|
|
12
|
+
{ name: "November", abbr: "Nov", days: 30 },
|
|
13
|
+
{ name: "December", abbr: "Dec", days: 31 }
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
export const weekdays = [
|
|
17
|
+
{ name: "Sunday", abbr: "Sun" },
|
|
18
|
+
{ name: "Monday", abbr: "Mon" },
|
|
19
|
+
{ name: "Tuesday", abbr: "Tue" },
|
|
20
|
+
{ name: "Wednesday", abbr: "Wed" },
|
|
21
|
+
{ name: "Thursday", abbr: "Thu" },
|
|
22
|
+
{ name: "Friday", abbr: "Fri" },
|
|
23
|
+
{ name: "Saturday", abbr: "Sat" }
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
export const timezones = [
|
|
27
|
+
{ name: "Pacific/Midway", offset: -11 },
|
|
28
|
+
{ name: "Pacific/Honolulu", offset: -10 },
|
|
29
|
+
{ name: "America/Anchorage", offset: -9 },
|
|
30
|
+
{ name: "America/Los_Angeles", offset: -8 },
|
|
31
|
+
{ name: "America/Denver", offset: -7 },
|
|
32
|
+
{ name: "America/Chicago", offset: -6 },
|
|
33
|
+
{ name: "America/New_York", offset: -5 },
|
|
34
|
+
{ name: "America/Caracas", offset: -4 },
|
|
35
|
+
{ name: "America/Sao_Paulo", offset: -3 },
|
|
36
|
+
{ name: "Atlantic/South_Georgia", offset: -2 },
|
|
37
|
+
{ name: "Atlantic/Azores", offset: -1 },
|
|
38
|
+
{ name: "Europe/London", offset: 0 },
|
|
39
|
+
{ name: "Europe/Paris", offset: 1 },
|
|
40
|
+
{ name: "Europe/Istanbul", offset: 3 },
|
|
41
|
+
{ name: "Asia/Dubai", offset: 4 },
|
|
42
|
+
{ name: "Asia/Karachi", offset: 5 },
|
|
43
|
+
{ name: "Asia/Dhaka", offset: 6 },
|
|
44
|
+
{ name: "Asia/Bangkok", offset: 7 },
|
|
45
|
+
{ name: "Asia/Shanghai", offset: 8 },
|
|
46
|
+
{ name: "Asia/Tokyo", offset: 9 },
|
|
47
|
+
{ name: "Australia/Sydney", offset: 10 },
|
|
48
|
+
{ name: "Pacific/Auckland", offset: 12 }
|
|
49
|
+
];
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export const currencies = [
|
|
2
|
+
{ code: "USD", name: "US Dollar", symbol: "$" },
|
|
3
|
+
{ code: "EUR", name: "Euro", symbol: "€" },
|
|
4
|
+
{ code: "GBP", name: "British Pound", symbol: "£" },
|
|
5
|
+
{ code: "JPY", name: "Japanese Yen", symbol: "¥" },
|
|
6
|
+
{ code: "CHF", name: "Swiss Franc", symbol: "CHF" },
|
|
7
|
+
{ code: "CAD", name: "Canadian Dollar", symbol: "C$" },
|
|
8
|
+
{ code: "AUD", name: "Australian Dollar", symbol: "A$" },
|
|
9
|
+
{ code: "CNY", name: "Chinese Yuan", symbol: "¥" },
|
|
10
|
+
{ code: "INR", name: "Indian Rupee", symbol: "₹" },
|
|
11
|
+
{ code: "BRL", name: "Brazilian Real", symbol: "R$" },
|
|
12
|
+
{ code: "KRW", name: "South Korean Won", symbol: "₩" },
|
|
13
|
+
{ code: "MXN", name: "Mexican Peso", symbol: "$" },
|
|
14
|
+
{ code: "SGD", name: "Singapore Dollar", symbol: "S$" },
|
|
15
|
+
{ code: "HKD", name: "Hong Kong Dollar", symbol: "HK$" },
|
|
16
|
+
{ code: "NOK", name: "Norwegian Krone", symbol: "kr" },
|
|
17
|
+
{ code: "SEK", name: "Swedish Krona", symbol: "kr" },
|
|
18
|
+
{ code: "DKK", name: "Danish Krone", symbol: "kr" },
|
|
19
|
+
{ code: "NZD", name: "New Zealand Dollar", symbol: "NZ$" },
|
|
20
|
+
{ code: "ZAR", name: "South African Rand", symbol: "R" },
|
|
21
|
+
{ code: "TRY", name: "Turkish Lira", symbol: "₺" }
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
export const creditCardTypes = [
|
|
25
|
+
{ name: "Visa", prefix: ["4"], length: 16 },
|
|
26
|
+
{ name: "Mastercard", prefix: ["51", "52", "53", "54", "55"], length: 16 },
|
|
27
|
+
{ name: "American Express", prefix: ["34", "37"], length: 15 },
|
|
28
|
+
{ name: "Discover", prefix: ["6011", "65"], length: 16 },
|
|
29
|
+
{ name: "Diners Club", prefix: ["36", "38"], length: 14 },
|
|
30
|
+
{ name: "JCB", prefix: ["35"], length: 16 }
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
export const transactionTypes = [
|
|
34
|
+
"deposit", "withdrawal", "transfer", "payment", "refund", "fee", "interest", "dividend"
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
export const accountTypes = [
|
|
38
|
+
"Checking", "Savings", "Money Market", "Certificate of Deposit", "Individual Retirement Account",
|
|
39
|
+
"Brokerage", "Credit Card", "Loan", "Mortgage", "Investment"
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
export const bankNames = [
|
|
43
|
+
"First National Bank", "Citizens Bank", "Community Bank", "Pacific Trust", "Atlantic Savings",
|
|
44
|
+
"Mountain View Credit Union", "Coastal Financial", "Heritage Bank", "Unity Bank", "Pioneer Federal"
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
export const ibanCountryCodes = [
|
|
48
|
+
{ country: "DE", length: 22 }, { country: "FR", length: 27 }, { country: "GB", length: 22 },
|
|
49
|
+
{ country: "ES", length: 24 }, { country: "IT", length: 27 }, { country: "NL", length: 18 },
|
|
50
|
+
{ country: "BE", length: 16 }, { country: "AT", length: 20 }, { country: "CH", length: 21 },
|
|
51
|
+
{ country: "PL", length: 28 }
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
export const cryptoCurrencies = [
|
|
55
|
+
{ name: "Bitcoin", symbol: "BTC" },
|
|
56
|
+
{ name: "Ethereum", symbol: "ETH" },
|
|
57
|
+
{ name: "Binance Coin", symbol: "BNB" },
|
|
58
|
+
{ name: "Cardano", symbol: "ADA" },
|
|
59
|
+
{ name: "Solana", symbol: "SOL" },
|
|
60
|
+
{ name: "Ripple", symbol: "XRP" },
|
|
61
|
+
{ name: "Polkadot", symbol: "DOT" },
|
|
62
|
+
{ name: "Dogecoin", symbol: "DOGE" },
|
|
63
|
+
{ name: "Avalanche", symbol: "AVAX" },
|
|
64
|
+
{ name: "Chainlink", symbol: "LINK" }
|
|
65
|
+
];
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export const emailProviders = [
|
|
2
|
+
"gmail.com", "yahoo.com", "hotmail.com", "outlook.com", "icloud.com",
|
|
3
|
+
"protonmail.com", "mail.com", "aol.com", "zoho.com", "yandex.com"
|
|
4
|
+
];
|
|
5
|
+
|
|
6
|
+
export const freeEmailProviders = [
|
|
7
|
+
"gmail.com", "yahoo.com", "hotmail.com", "outlook.com", "icloud.com", "protonmail.com"
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
export const domainSuffixes = [
|
|
11
|
+
".com", ".org", ".net", ".io", ".co", ".app", ".dev", ".tech", ".ai", ".cloud",
|
|
12
|
+
".info", ".biz", ".me", ".tv", ".us", ".uk", ".de", ".fr", ".jp", ".au"
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
export const protocols = ["http", "https"];
|
|
16
|
+
|
|
17
|
+
export const httpMethods = ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"];
|
|
18
|
+
|
|
19
|
+
export const httpStatusCodes = [
|
|
20
|
+
{ code: 200, message: "OK" },
|
|
21
|
+
{ code: 201, message: "Created" },
|
|
22
|
+
{ code: 204, message: "No Content" },
|
|
23
|
+
{ code: 301, message: "Moved Permanently" },
|
|
24
|
+
{ code: 302, message: "Found" },
|
|
25
|
+
{ code: 304, message: "Not Modified" },
|
|
26
|
+
{ code: 400, message: "Bad Request" },
|
|
27
|
+
{ code: 401, message: "Unauthorized" },
|
|
28
|
+
{ code: 403, message: "Forbidden" },
|
|
29
|
+
{ code: 404, message: "Not Found" },
|
|
30
|
+
{ code: 405, message: "Method Not Allowed" },
|
|
31
|
+
{ code: 422, message: "Unprocessable Entity" },
|
|
32
|
+
{ code: 429, message: "Too Many Requests" },
|
|
33
|
+
{ code: 500, message: "Internal Server Error" },
|
|
34
|
+
{ code: 502, message: "Bad Gateway" },
|
|
35
|
+
{ code: 503, message: "Service Unavailable" }
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
export const userAgents = [
|
|
39
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
|
40
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
|
41
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
|
|
42
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15",
|
|
43
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
|
|
44
|
+
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
|
45
|
+
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1",
|
|
46
|
+
"Mozilla/5.0 (iPad; CPU OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1",
|
|
47
|
+
"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
|
|
48
|
+
"Mozilla/5.0 (Linux; Android 14; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36"
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
export const browsers = [
|
|
52
|
+
{ name: "Chrome", versions: ["118.0", "119.0", "120.0", "121.0"] },
|
|
53
|
+
{ name: "Firefox", versions: ["118.0", "119.0", "120.0", "121.0"] },
|
|
54
|
+
{ name: "Safari", versions: ["16.0", "16.5", "17.0", "17.2"] },
|
|
55
|
+
{ name: "Edge", versions: ["118.0", "119.0", "120.0", "121.0"] },
|
|
56
|
+
{ name: "Opera", versions: ["103.0", "104.0", "105.0", "106.0"] }
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
export const mimeTypes = [
|
|
60
|
+
"application/json", "application/xml", "application/pdf", "application/zip",
|
|
61
|
+
"text/html", "text/plain", "text/css", "text/javascript",
|
|
62
|
+
"image/png", "image/jpeg", "image/gif", "image/webp", "image/svg+xml",
|
|
63
|
+
"audio/mpeg", "audio/wav", "video/mp4", "video/webm"
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
export const fileExtensions = {
|
|
67
|
+
image: ["jpg", "jpeg", "png", "gif", "webp", "svg", "bmp", "ico"],
|
|
68
|
+
document: ["pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt", "rtf"],
|
|
69
|
+
video: ["mp4", "avi", "mov", "wmv", "flv", "mkv", "webm"],
|
|
70
|
+
audio: ["mp3", "wav", "flac", "aac", "ogg", "wma"],
|
|
71
|
+
archive: ["zip", "rar", "7z", "tar", "gz"],
|
|
72
|
+
code: ["js", "ts", "py", "java", "cpp", "c", "cs", "php", "rb", "go", "rs"]
|
|
73
|
+
};
|