@jjlmoya/utils-developer 1.2.0
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/package.json +64 -0
- package/src/category/i18n/en.ts +34 -0
- package/src/category/i18n/es.ts +34 -0
- package/src/category/i18n/fr.ts +34 -0
- package/src/category/index.ts +31 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +11 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +78 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/css_specificity_logic.test.ts +39 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/seo_length.test.ts +22 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/aspectRatio/bibliography.astro +14 -0
- package/src/tool/aspectRatio/component.astro +468 -0
- package/src/tool/aspectRatio/i18n/en.ts +177 -0
- package/src/tool/aspectRatio/i18n/es.ts +177 -0
- package/src/tool/aspectRatio/i18n/fr.ts +177 -0
- package/src/tool/aspectRatio/index.ts +34 -0
- package/src/tool/aspectRatio/seo.astro +14 -0
- package/src/tool/aspectRatio/ui.ts +12 -0
- package/src/tool/calculadoraTiempoDatos/bibliography.astro +14 -0
- package/src/tool/calculadoraTiempoDatos/component.astro +829 -0
- package/src/tool/calculadoraTiempoDatos/i18n/en.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/es.ts +163 -0
- package/src/tool/calculadoraTiempoDatos/i18n/fr.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/index.ts +33 -0
- package/src/tool/calculadoraTiempoDatos/seo.astro +14 -0
- package/src/tool/calculadoraTiempoDatos/ui.ts +24 -0
- package/src/tool/colorConverter/bibliography.astro +14 -0
- package/src/tool/colorConverter/component.astro +504 -0
- package/src/tool/colorConverter/i18n/en.ts +126 -0
- package/src/tool/colorConverter/i18n/es.ts +126 -0
- package/src/tool/colorConverter/i18n/fr.ts +126 -0
- package/src/tool/colorConverter/index.ts +33 -0
- package/src/tool/colorConverter/seo.astro +14 -0
- package/src/tool/colorConverter/ui.ts +16 -0
- package/src/tool/conversorExcelCsvHtml/bibliography.astro +14 -0
- package/src/tool/conversorExcelCsvHtml/component.astro +595 -0
- package/src/tool/conversorExcelCsvHtml/i18n/en.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/es.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/fr.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/index.ts +33 -0
- package/src/tool/conversorExcelCsvHtml/seo.astro +14 -0
- package/src/tool/conversorExcelCsvHtml/ui.ts +14 -0
- package/src/tool/cronGenerator/bibliography.astro +14 -0
- package/src/tool/cronGenerator/component.astro +667 -0
- package/src/tool/cronGenerator/i18n/en.ts +191 -0
- package/src/tool/cronGenerator/i18n/es.ts +191 -0
- package/src/tool/cronGenerator/i18n/fr.ts +191 -0
- package/src/tool/cronGenerator/index.ts +34 -0
- package/src/tool/cronGenerator/seo.astro +14 -0
- package/src/tool/cronGenerator/ui.ts +45 -0
- package/src/tool/cssSpecificityCalculator/bibliography.astro +14 -0
- package/src/tool/cssSpecificityCalculator/component.astro +292 -0
- package/src/tool/cssSpecificityCalculator/i18n/en.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/es.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/fr.ts +168 -0
- package/src/tool/cssSpecificityCalculator/index.ts +34 -0
- package/src/tool/cssSpecificityCalculator/logic.ts +100 -0
- package/src/tool/cssSpecificityCalculator/seo.astro +14 -0
- package/src/tool/cssSpecificityCalculator/ui-controller.ts +57 -0
- package/src/tool/cssSpecificityCalculator/ui.ts +11 -0
- package/src/tool/cssToInlineConverter/bibliography.astro +14 -0
- package/src/tool/cssToInlineConverter/component.astro +308 -0
- package/src/tool/cssToInlineConverter/i18n/en.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/es.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/fr.ts +160 -0
- package/src/tool/cssToInlineConverter/index.ts +34 -0
- package/src/tool/cssToInlineConverter/seo.astro +14 -0
- package/src/tool/cssToInlineConverter/ui.ts +12 -0
- package/src/tool/duplicateCssRemover/bibliography.astro +14 -0
- package/src/tool/duplicateCssRemover/component.astro +353 -0
- package/src/tool/duplicateCssRemover/i18n/en.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/es.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/fr.ts +167 -0
- package/src/tool/duplicateCssRemover/index.ts +34 -0
- package/src/tool/duplicateCssRemover/seo.astro +14 -0
- package/src/tool/duplicateCssRemover/ui.ts +12 -0
- package/src/tool/generadorSecurityTxt/bibliography.astro +14 -0
- package/src/tool/generadorSecurityTxt/component.astro +473 -0
- package/src/tool/generadorSecurityTxt/i18n/en.ts +173 -0
- package/src/tool/generadorSecurityTxt/i18n/es.ts +173 -0
- package/src/tool/generadorSecurityTxt/i18n/fr.ts +173 -0
- package/src/tool/generadorSecurityTxt/index.ts +33 -0
- package/src/tool/generadorSecurityTxt/seo.astro +14 -0
- package/src/tool/generadorSecurityTxt/ui.ts +27 -0
- package/src/tool/hashGenerator/bibliography.astro +14 -0
- package/src/tool/hashGenerator/component.astro +367 -0
- package/src/tool/hashGenerator/i18n/en.ts +118 -0
- package/src/tool/hashGenerator/i18n/es.ts +118 -0
- package/src/tool/hashGenerator/i18n/fr.ts +118 -0
- package/src/tool/hashGenerator/index.ts +33 -0
- package/src/tool/hashGenerator/md5.ts +138 -0
- package/src/tool/hashGenerator/seo.astro +14 -0
- package/src/tool/hashGenerator/ui.ts +11 -0
- package/src/tool/inspectorCertificadosSsl/bibliography.astro +14 -0
- package/src/tool/inspectorCertificadosSsl/component.astro +580 -0
- package/src/tool/inspectorCertificadosSsl/i18n/en.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/i18n/es.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/i18n/fr.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/index.ts +33 -0
- package/src/tool/inspectorCertificadosSsl/seo.astro +14 -0
- package/src/tool/inspectorCertificadosSsl/ui.ts +29 -0
- package/src/tool/jsonFormatter/bibliography.astro +14 -0
- package/src/tool/jsonFormatter/component.astro +590 -0
- package/src/tool/jsonFormatter/i18n/en.ts +156 -0
- package/src/tool/jsonFormatter/i18n/es.ts +156 -0
- package/src/tool/jsonFormatter/i18n/fr.ts +156 -0
- package/src/tool/jsonFormatter/index.ts +34 -0
- package/src/tool/jsonFormatter/seo.astro +14 -0
- package/src/tool/jsonFormatter/ui.ts +15 -0
- package/src/tool/keycode/bibliography.astro +14 -0
- package/src/tool/keycode/component.astro +540 -0
- package/src/tool/keycode/i18n/en.ts +160 -0
- package/src/tool/keycode/i18n/es.ts +160 -0
- package/src/tool/keycode/i18n/fr.ts +160 -0
- package/src/tool/keycode/index.ts +34 -0
- package/src/tool/keycode/seo.astro +14 -0
- package/src/tool/keycode/ui.ts +10 -0
- package/src/tool/llmCostCalculator/bibliography.astro +14 -0
- package/src/tool/llmCostCalculator/component.astro +488 -0
- package/src/tool/llmCostCalculator/data.ts +99 -0
- package/src/tool/llmCostCalculator/i18n/en.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/es.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/fr.ts +165 -0
- package/src/tool/llmCostCalculator/index.ts +34 -0
- package/src/tool/llmCostCalculator/seo.astro +14 -0
- package/src/tool/llmCostCalculator/ui.ts +11 -0
- package/src/tool/mobileMockupGenerator/app.ts +614 -0
- package/src/tool/mobileMockupGenerator/bibliography.astro +14 -0
- package/src/tool/mobileMockupGenerator/component.astro +1044 -0
- package/src/tool/mobileMockupGenerator/constants.ts +48 -0
- package/src/tool/mobileMockupGenerator/i18n/en.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/es.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/fr.ts +121 -0
- package/src/tool/mobileMockupGenerator/index.ts +33 -0
- package/src/tool/mobileMockupGenerator/rendering.ts +189 -0
- package/src/tool/mobileMockupGenerator/seo.astro +14 -0
- package/src/tool/mobileMockupGenerator/store.ts +145 -0
- package/src/tool/mobileMockupGenerator/types.ts +41 -0
- package/src/tool/mobileMockupGenerator/ui.ts +48 -0
- package/src/tool/musicalTypography/bibliography.astro +14 -0
- package/src/tool/musicalTypography/component.astro +480 -0
- package/src/tool/musicalTypography/i18n/en.ts +179 -0
- package/src/tool/musicalTypography/i18n/es.ts +179 -0
- package/src/tool/musicalTypography/i18n/fr.ts +179 -0
- package/src/tool/musicalTypography/index.ts +33 -0
- package/src/tool/musicalTypography/seo.astro +14 -0
- package/src/tool/musicalTypography/ui.ts +25 -0
- package/src/tool/placeholderGenerator/bibliography.astro +14 -0
- package/src/tool/placeholderGenerator/component.astro +499 -0
- package/src/tool/placeholderGenerator/i18n/en.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/es.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/fr.ts +176 -0
- package/src/tool/placeholderGenerator/index.ts +34 -0
- package/src/tool/placeholderGenerator/seo.astro +14 -0
- package/src/tool/placeholderGenerator/ui.ts +14 -0
- package/src/tool/promptLibrary/bibliography.astro +14 -0
- package/src/tool/promptLibrary/component.astro +1131 -0
- package/src/tool/promptLibrary/controller.ts +49 -0
- package/src/tool/promptLibrary/i18n/en.ts +131 -0
- package/src/tool/promptLibrary/i18n/es.ts +131 -0
- package/src/tool/promptLibrary/i18n/fr.ts +126 -0
- package/src/tool/promptLibrary/index.ts +33 -0
- package/src/tool/promptLibrary/seo.astro +14 -0
- package/src/tool/promptLibrary/ui.ts +29 -0
- package/src/tool/readabilityCalculator/bibliography.astro +14 -0
- package/src/tool/readabilityCalculator/component.astro +534 -0
- package/src/tool/readabilityCalculator/i18n/en.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/es.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/fr.ts +133 -0
- package/src/tool/readabilityCalculator/index.ts +33 -0
- package/src/tool/readabilityCalculator/seo.astro +14 -0
- package/src/tool/readabilityCalculator/ui.ts +27 -0
- package/src/tool/svgSanitizer/bibliography.astro +14 -0
- package/src/tool/svgSanitizer/component.astro +554 -0
- package/src/tool/svgSanitizer/i18n/en.ts +125 -0
- package/src/tool/svgSanitizer/i18n/es.ts +125 -0
- package/src/tool/svgSanitizer/i18n/fr.ts +125 -0
- package/src/tool/svgSanitizer/index.ts +33 -0
- package/src/tool/svgSanitizer/seo.astro +14 -0
- package/src/tool/svgSanitizer/ui.ts +18 -0
- package/src/tool/svgToCss/bibliography.astro +14 -0
- package/src/tool/svgToCss/component.astro +381 -0
- package/src/tool/svgToCss/i18n/en.ts +174 -0
- package/src/tool/svgToCss/i18n/es.ts +174 -0
- package/src/tool/svgToCss/i18n/fr.ts +174 -0
- package/src/tool/svgToCss/index.ts +34 -0
- package/src/tool/svgToCss/seo.astro +14 -0
- package/src/tool/svgToCss/ui.ts +13 -0
- package/src/tool/urlCleaner/bibliography.astro +14 -0
- package/src/tool/urlCleaner/component.astro +458 -0
- package/src/tool/urlCleaner/i18n/en.ts +116 -0
- package/src/tool/urlCleaner/i18n/es.ts +116 -0
- package/src/tool/urlCleaner/i18n/fr.ts +116 -0
- package/src/tool/urlCleaner/index.ts +33 -0
- package/src/tool/urlCleaner/seo.astro +14 -0
- package/src/tool/urlCleaner/ui.ts +12 -0
- package/src/tool/urlEncoderDecoder/bibliography.astro +14 -0
- package/src/tool/urlEncoderDecoder/component.astro +291 -0
- package/src/tool/urlEncoderDecoder/i18n/en.ts +162 -0
- package/src/tool/urlEncoderDecoder/i18n/es.ts +162 -0
- package/src/tool/urlEncoderDecoder/i18n/fr.ts +162 -0
- package/src/tool/urlEncoderDecoder/index.ts +34 -0
- package/src/tool/urlEncoderDecoder/seo.astro +14 -0
- package/src/tool/urlEncoderDecoder/ui.ts +11 -0
- package/src/tool/utmGenerator/bibliography.astro +14 -0
- package/src/tool/utmGenerator/component.astro +270 -0
- package/src/tool/utmGenerator/i18n/en.ts +117 -0
- package/src/tool/utmGenerator/i18n/es.ts +117 -0
- package/src/tool/utmGenerator/i18n/fr.ts +117 -0
- package/src/tool/utmGenerator/index.ts +33 -0
- package/src/tool/utmGenerator/seo.astro +14 -0
- package/src/tool/utmGenerator/ui.ts +13 -0
- package/src/tools.ts +27 -0
- package/src/types.ts +72 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { CronGeneratorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'cron';
|
|
6
|
+
const title = 'Online Cron Expression Generator. Translator and Visualizer';
|
|
7
|
+
const description =
|
|
8
|
+
'Free visual tool to generate Linux Cron expressions. Translates * * * * * into human language and shows the next 5 executions in real time.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'What is a Cron expression?',
|
|
13
|
+
answer:
|
|
14
|
+
'It is a text string that represents an execution schedule for automatic tasks on Unix-like systems (Linux, macOS). It consists of 5 fields that define minutes, hours, day of month, month, and day of week.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Is it compatible with all systems?',
|
|
18
|
+
answer:
|
|
19
|
+
'Yes, the generated expressions follow the POSIX standard, compatible with Linux Crontab, macOS crons, and cloud services like AWS CloudWatch or GitHub Actions.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'What does the asterisk (*) mean in Cron?',
|
|
23
|
+
answer:
|
|
24
|
+
'The asterisk is a wildcard meaning "all". For example, a * in the minutes field means the task will run every minute of the defined range.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'How can I check the upcoming executions?',
|
|
28
|
+
answer:
|
|
29
|
+
'The tool includes a real-time viewer showing exactly the next 5 dates and times when your task will run according to the current expression.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Select the interval',
|
|
36
|
+
text: 'Choose how often you want the task to run using the quick presets (every minute, every hour, daily, etc.).',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Configure advanced details',
|
|
40
|
+
text: 'Switch to the "Advanced" tab to manually define the exact minutes, hours, or specific days of the week.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Verify the translation and dates',
|
|
44
|
+
text: 'Read the human-language description and check the next 5 executions to confirm the schedule is correct.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Copy the expression',
|
|
48
|
+
text: 'Copy the resulting string and paste it directly into your crontab file or server configuration.',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step, i) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
position: i + 1,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'SoftwareApplication',
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'UtilityApplication',
|
|
81
|
+
operatingSystem: 'All',
|
|
82
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
83
|
+
inLanguage: 'en',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const ui: CronGeneratorUI = {
|
|
87
|
+
labelMinute: 'Minute',
|
|
88
|
+
labelHour: 'Hour',
|
|
89
|
+
labelDom: 'Day (Month)',
|
|
90
|
+
labelMonth: 'Month',
|
|
91
|
+
labelDow: 'Day (Week)',
|
|
92
|
+
tabQuick: 'Quick',
|
|
93
|
+
tabAdvanced: 'Advanced',
|
|
94
|
+
fieldMinute: 'Minute (0-59)',
|
|
95
|
+
fieldHour: 'Hour (0-23)',
|
|
96
|
+
fieldDom: 'Day of Month (1-31)',
|
|
97
|
+
fieldMonth: 'Month (1-12)',
|
|
98
|
+
fieldDow: 'Day of Week (0-6)',
|
|
99
|
+
hintMinute: 'E.g.: *, */5, 0,30',
|
|
100
|
+
hintDow: '0 = Sunday, 6 = Saturday',
|
|
101
|
+
labelNextRuns: 'Next Executions',
|
|
102
|
+
btnCopy: 'Copy Expression',
|
|
103
|
+
btnCopied: 'Copied!',
|
|
104
|
+
msgNoRuns: 'No upcoming executions found within a reasonable range.',
|
|
105
|
+
msgError: 'Error calculating dates.',
|
|
106
|
+
presetEveryMinute: 'Every minute',
|
|
107
|
+
presetEveryHour: 'Every hour',
|
|
108
|
+
presetDaily: 'Daily',
|
|
109
|
+
presetWeekly: 'Weekly',
|
|
110
|
+
presetMonthly: 'Monthly',
|
|
111
|
+
presetYearly: 'Yearly',
|
|
112
|
+
descEveryMinute: 'Runs every minute',
|
|
113
|
+
descEveryHour: 'Runs at the start of every hour',
|
|
114
|
+
descEveryDay: 'Runs every day at midnight',
|
|
115
|
+
descPrefix: 'Runs',
|
|
116
|
+
descEveryMin: 'every minute',
|
|
117
|
+
descEveryHourOnDot: 'every hour on the dot',
|
|
118
|
+
descAtMinute: 'at minute {m} of every hour',
|
|
119
|
+
descAtTime: 'at {h}:{m}',
|
|
120
|
+
descOnDay: ' on day {d} of the month',
|
|
121
|
+
descInMonth: ' in month {mon}',
|
|
122
|
+
descIfDow: ' if it is day {d} (0=Sun, 6=Sat)',
|
|
123
|
+
descDays: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',
|
|
124
|
+
descInvalid: 'Invalid expression',
|
|
125
|
+
timeNow: 'now',
|
|
126
|
+
timeMin: 'min',
|
|
127
|
+
timeHour: 'h',
|
|
128
|
+
timeDays: 'days',
|
|
129
|
+
locale: 'en-US',
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export const content: ToolLocaleContent<CronGeneratorUI> = {
|
|
133
|
+
slug,
|
|
134
|
+
title,
|
|
135
|
+
description,
|
|
136
|
+
ui,
|
|
137
|
+
faqTitle: 'Frequently Asked Questions',
|
|
138
|
+
faq: faqData,
|
|
139
|
+
bibliographyTitle: 'References and Documentation',
|
|
140
|
+
bibliography: [
|
|
141
|
+
{
|
|
142
|
+
name: 'GNU Crontab Manual: Cron Expressions on Linux',
|
|
143
|
+
url: 'https://www.gnu.org/software/mcron/manual/html_node/Crontab-file.html',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: 'Cron on Wikipedia: History and Syntax',
|
|
147
|
+
url: 'https://en.wikipedia.org/wiki/Cron',
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
howTo: howToData,
|
|
151
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
152
|
+
seo: [
|
|
153
|
+
{
|
|
154
|
+
type: 'title',
|
|
155
|
+
text: 'The Importance of Cron in Modern Automation',
|
|
156
|
+
level: 2,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
type: 'paragraph',
|
|
160
|
+
html: 'Despite living in the age of <em>serverless</em> servers and cloud workflows, the <strong>Crontab</strong> system remains the backbone of global technology infrastructure. From small blogs to massive banking infrastructures, task scheduling is what keeps the digital world running.',
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
type: 'title',
|
|
164
|
+
text: 'Anatomy of a Cron Expression',
|
|
165
|
+
level: 3,
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
type: 'list',
|
|
169
|
+
items: [
|
|
170
|
+
'<strong>Field 1 - Minute (0-59):</strong> When the task starts within the hour.',
|
|
171
|
+
'<strong>Field 2 - Hour (0-23):</strong> 24-hour format required.',
|
|
172
|
+
'<strong>Field 3 - Day of Month (1-31):</strong> Specific calendar day.',
|
|
173
|
+
'<strong>Field 4 - Month (1-12):</strong> From January to December.',
|
|
174
|
+
'<strong>Field 5 - Day of Week (0-6):</strong> 0 is typically Sunday.',
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
type: 'title',
|
|
179
|
+
text: 'Special operators and common mistakes',
|
|
180
|
+
level: 3,
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
type: 'tip',
|
|
184
|
+
html: 'Use the slash <code>/</code> to define steps: <code>*/5</code> in minutes runs every 5 minutes. The comma <code>,</code> creates lists (<code>1,3,5</code>) and the hyphen <code>-</code> defines ranges (<code>1-5</code>).',
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
type: 'paragraph',
|
|
188
|
+
html: '90% of servers run on <strong>UTC</strong>. If you schedule a task at 02:00 AM thinking in your local timezone, it may run at an unexpected time. Also, Cron does not have access to your usual <code>$PATH</code> — always use absolute paths like <code>/usr/local/bin/node</code>.',
|
|
189
|
+
},
|
|
190
|
+
],
|
|
191
|
+
};
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { CronGeneratorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'cron';
|
|
6
|
+
const title = 'Generador de Expresiones Cron Online. Traductor y Visualizador';
|
|
7
|
+
const description =
|
|
8
|
+
'Herramienta visual gratuita para generar expresiones Cron de Linux. Traduce * * * * * a lenguaje humano y visualiza las próximas 5 ejecuciones en tiempo real.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: '¿Qué es una expresión Cron?',
|
|
13
|
+
answer:
|
|
14
|
+
'Es una cadena de texto que representa un horario de ejecución para tareas automáticas en sistemas tipo Unix (Linux, macOS). Se compone de 5 campos que definen minutos, horas, días del mes, meses y días de la semana.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: '¿Es compatible con todos los sistemas?',
|
|
18
|
+
answer:
|
|
19
|
+
'Sí, las expresiones generadas siguen el estándar POSIX, compatible con Crontab de Linux, crons de macOS, y servicios cloud como AWS CloudWatch o GitHub Actions.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: '¿Qué significa el asterisco (*) en Cron?',
|
|
23
|
+
answer:
|
|
24
|
+
'El asterisco es un comodín que significa "todos". Por ejemplo, un * en el campo de los minutos indica que la tarea se ejecutará cada minuto del rango definido.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: '¿Cómo puedo verificar las próximas ejecuciones?',
|
|
28
|
+
answer:
|
|
29
|
+
'La herramienta incluye un visor en tiempo real que muestra exactamente las próximas 5 fechas y horas en las que se activará tu tarea según la expresión actual.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Seleccionar el intervalo',
|
|
36
|
+
text: 'Elige con qué frecuencia quieres que se ejecute la tarea usando los presets rápidos (cada minuto, cada hora, diariamente, etc.).',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Configurar detalles avanzados',
|
|
40
|
+
text: 'Cambia a la pestaña "Avanzado" para definir manualmente los minutos, horas o días de la semana específicos.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Verificar la traducción y las fechas',
|
|
44
|
+
text: 'Lee la descripción en lenguaje humano y revisa las próximas 5 ejecuciones para confirmar que el horario es correcto.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Copiar expresión',
|
|
48
|
+
text: 'Copia la cadena resultante y pégala directamente en tu archivo crontab o configuración de servidor.',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step, i) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
position: i + 1,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'SoftwareApplication',
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'UtilityApplication',
|
|
81
|
+
operatingSystem: 'All',
|
|
82
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
83
|
+
inLanguage: 'es',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const ui: CronGeneratorUI = {
|
|
87
|
+
labelMinute: 'Minuto',
|
|
88
|
+
labelHour: 'Hora',
|
|
89
|
+
labelDom: 'Día (Mes)',
|
|
90
|
+
labelMonth: 'Mes',
|
|
91
|
+
labelDow: 'Día (Semana)',
|
|
92
|
+
tabQuick: 'Rápido',
|
|
93
|
+
tabAdvanced: 'Avanzado',
|
|
94
|
+
fieldMinute: 'Minuto (0-59)',
|
|
95
|
+
fieldHour: 'Hora (0-23)',
|
|
96
|
+
fieldDom: 'Día del Mes (1-31)',
|
|
97
|
+
fieldMonth: 'Mes (1-12)',
|
|
98
|
+
fieldDow: 'Día de la Semana (0-6)',
|
|
99
|
+
hintMinute: 'Ej: *, */5, 0,30',
|
|
100
|
+
hintDow: '0 = Domingo, 6 = Sábado',
|
|
101
|
+
labelNextRuns: 'Próximas Ejecuciones',
|
|
102
|
+
btnCopy: 'Copiar Expresión',
|
|
103
|
+
btnCopied: 'Copiado!',
|
|
104
|
+
msgNoRuns: 'No se encontraron ejecuciones próximas razonables.',
|
|
105
|
+
msgError: 'Error al calcular fechas.',
|
|
106
|
+
presetEveryMinute: 'Cada minuto',
|
|
107
|
+
presetEveryHour: 'Cada hora',
|
|
108
|
+
presetDaily: 'Diario',
|
|
109
|
+
presetWeekly: 'Semanal',
|
|
110
|
+
presetMonthly: 'Mensual',
|
|
111
|
+
presetYearly: 'Anual',
|
|
112
|
+
descEveryMinute: 'Se ejecuta cada minuto',
|
|
113
|
+
descEveryHour: 'Se ejecuta al inicio de cada hora',
|
|
114
|
+
descEveryDay: 'Se ejecuta cada día a medianoche',
|
|
115
|
+
descPrefix: 'Se ejecuta',
|
|
116
|
+
descEveryMin: 'cada minuto',
|
|
117
|
+
descEveryHourOnDot: 'cada hora en punto',
|
|
118
|
+
descAtMinute: 'en el minuto {m} de cada hora',
|
|
119
|
+
descAtTime: 'a las {h}:{m}',
|
|
120
|
+
descOnDay: ' el día {d} del mes',
|
|
121
|
+
descInMonth: ' en el mes {mon}',
|
|
122
|
+
descIfDow: ' si es {d} (0=Dom, 6=Sab)',
|
|
123
|
+
descDays: 'Domingo,Lunes,Martes,Miércoles,Jueves,Viernes,Sábado',
|
|
124
|
+
descInvalid: 'Expresión inválida',
|
|
125
|
+
timeNow: 'ahora',
|
|
126
|
+
timeMin: 'min',
|
|
127
|
+
timeHour: 'h',
|
|
128
|
+
timeDays: 'días',
|
|
129
|
+
locale: 'es-ES',
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export const content: ToolLocaleContent<CronGeneratorUI> = {
|
|
133
|
+
slug,
|
|
134
|
+
title,
|
|
135
|
+
description,
|
|
136
|
+
ui,
|
|
137
|
+
faqTitle: 'Preguntas Frecuentes',
|
|
138
|
+
faq: faqData,
|
|
139
|
+
bibliographyTitle: 'Referencias y Documentación',
|
|
140
|
+
bibliography: [
|
|
141
|
+
{
|
|
142
|
+
name: 'GNU Crontab Manual: Expresiones Cron en Linux',
|
|
143
|
+
url: 'https://www.gnu.org/software/mcron/manual/html_node/Crontab-file.html',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: 'Cron en Wikipedia: Historia y Sintaxis',
|
|
147
|
+
url: 'https://en.wikipedia.org/wiki/Cron',
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
howTo: howToData,
|
|
151
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
152
|
+
seo: [
|
|
153
|
+
{
|
|
154
|
+
type: 'title',
|
|
155
|
+
text: 'La importancia de Cron en la automatización moderna',
|
|
156
|
+
level: 2,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
type: 'paragraph',
|
|
160
|
+
html: 'A pesar de vivir en la era de los servidores <em>serverless</em> y los flujos de trabajo en la nube, el sistema <strong>Crontab</strong> sigue siendo la columna vertebral de la infraestructura tecnológica mundial. Desde pequeños blogs hasta gigantescas infraestructuras bancarias, la programación de tareas es lo que permite que el mundo digital no se detenga.',
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
type: 'title',
|
|
164
|
+
text: 'Anatomía de una Expresión Cron',
|
|
165
|
+
level: 3,
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
type: 'list',
|
|
169
|
+
items: [
|
|
170
|
+
'<strong>Campo 1 - Minuto (0-59):</strong> Cuándo empieza la tarea dentro de la hora.',
|
|
171
|
+
'<strong>Campo 2 - Hora (0-23):</strong> Formato de 24 horas obligatorio.',
|
|
172
|
+
'<strong>Campo 3 - Día del Mes (1-31):</strong> Día calendario específico.',
|
|
173
|
+
'<strong>Campo 4 - Mes (1-12):</strong> De enero a diciembre.',
|
|
174
|
+
'<strong>Campo 5 - Día de la Semana (0-6):</strong> El 0 suele ser Domingo.',
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
type: 'title',
|
|
179
|
+
text: 'Operadores especiales y errores comunes',
|
|
180
|
+
level: 3,
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
type: 'tip',
|
|
184
|
+
html: 'Usa la barra <code>/</code> para definir pasos: <code>*/5</code> en minutos ejecuta cada 5 minutos. La coma <code>,</code> crea listas (<code>1,3,5</code>) y el guion <code>-</code> define rangos (<code>1-5</code>).',
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
type: 'paragraph',
|
|
188
|
+
html: 'El 90% de los servidores funcionan en <strong>UTC</strong>. Si programas una tarea a las 02:00 AM pensando en tu horario local, podrías ejecutarla en un momento inesperado. Además, Cron no tiene acceso a tu <code>$PATH</code> habitual — usa siempre rutas absolutas como <code>/usr/local/bin/node</code>.',
|
|
189
|
+
},
|
|
190
|
+
],
|
|
191
|
+
};
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { CronGeneratorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'cron';
|
|
6
|
+
const title = 'Générateur d\'expressions Cron en ligne. Traducteur et visualiseur';
|
|
7
|
+
const description =
|
|
8
|
+
'Outil visuel gratuit pour générer des expressions Cron Linux. Traduit * * * * * en langage humain et affiche les 5 prochaines exécutions en temps réel.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Qu\'est-ce qu\'une expression Cron ?',
|
|
13
|
+
answer:
|
|
14
|
+
'C\'est une chaîne de texte qui représente un calendrier d\'exécution pour des tâches automatiques sur les systèmes de type Unix (Linux, macOS). Elle se compose de 5 champs définissant les minutes, heures, jour du mois, mois et jour de la semaine.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Est-elle compatible avec tous les systèmes ?',
|
|
18
|
+
answer:
|
|
19
|
+
'Oui, les expressions générées suivent la norme POSIX, compatible avec Linux Crontab, les crons macOS et les services cloud comme AWS CloudWatch ou GitHub Actions.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Que signifie l\'astérisque (*) dans Cron ?',
|
|
23
|
+
answer:
|
|
24
|
+
'L\'astérisque est un caractère générique signifiant "tous". Par exemple, un * dans le champ des minutes indique que la tâche s\'exécutera chaque minute de la plage définie.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Comment vérifier les prochaines exécutions ?',
|
|
28
|
+
answer:
|
|
29
|
+
'L\'outil inclut un visualiseur en temps réel affichant exactement les 5 prochaines dates et heures auxquelles votre tâche s\'exécutera selon l\'expression actuelle.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Sélectionner l\'intervalle',
|
|
36
|
+
text: 'Choisissez la fréquence d\'exécution de la tâche à l\'aide des préréglages rapides (chaque minute, chaque heure, quotidien, etc.).',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Configurer les détails avancés',
|
|
40
|
+
text: 'Passez à l\'onglet "Avancé" pour définir manuellement les minutes, heures ou jours de la semaine spécifiques.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Vérifier la traduction et les dates',
|
|
44
|
+
text: 'Lisez la description en langage naturel et vérifiez les 5 prochaines exécutions pour confirmer que le calendrier est correct.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Copier l\'expression',
|
|
48
|
+
text: 'Copiez la chaîne résultante et collez-la directement dans votre fichier crontab ou votre configuration serveur.',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step, i) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
position: i + 1,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'SoftwareApplication',
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'UtilityApplication',
|
|
81
|
+
operatingSystem: 'All',
|
|
82
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
83
|
+
inLanguage: 'fr',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const ui: CronGeneratorUI = {
|
|
87
|
+
labelMinute: 'Minute',
|
|
88
|
+
labelHour: 'Heure',
|
|
89
|
+
labelDom: 'Jour (Mois)',
|
|
90
|
+
labelMonth: 'Mois',
|
|
91
|
+
labelDow: 'Jour (Semaine)',
|
|
92
|
+
tabQuick: 'Rapide',
|
|
93
|
+
tabAdvanced: 'Avancé',
|
|
94
|
+
fieldMinute: 'Minute (0-59)',
|
|
95
|
+
fieldHour: 'Heure (0-23)',
|
|
96
|
+
fieldDom: 'Jour du Mois (1-31)',
|
|
97
|
+
fieldMonth: 'Mois (1-12)',
|
|
98
|
+
fieldDow: 'Jour de la Semaine (0-6)',
|
|
99
|
+
hintMinute: 'Ex : *, */5, 0,30',
|
|
100
|
+
hintDow: '0 = Dimanche, 6 = Samedi',
|
|
101
|
+
labelNextRuns: 'Prochaines exécutions',
|
|
102
|
+
btnCopy: 'Copier l\'expression',
|
|
103
|
+
btnCopied: 'Copié !',
|
|
104
|
+
msgNoRuns: 'Aucune exécution prochaine trouvée dans un délai raisonnable.',
|
|
105
|
+
msgError: 'Erreur lors du calcul des dates.',
|
|
106
|
+
presetEveryMinute: 'Chaque minute',
|
|
107
|
+
presetEveryHour: 'Chaque heure',
|
|
108
|
+
presetDaily: 'Quotidien',
|
|
109
|
+
presetWeekly: 'Hebdomadaire',
|
|
110
|
+
presetMonthly: 'Mensuel',
|
|
111
|
+
presetYearly: 'Annuel',
|
|
112
|
+
descEveryMinute: 'S\'exécute chaque minute',
|
|
113
|
+
descEveryHour: 'S\'exécute au début de chaque heure',
|
|
114
|
+
descEveryDay: 'S\'exécute chaque jour à minuit',
|
|
115
|
+
descPrefix: 'S\'exécute',
|
|
116
|
+
descEveryMin: 'chaque minute',
|
|
117
|
+
descEveryHourOnDot: 'chaque heure pile',
|
|
118
|
+
descAtMinute: 'à la minute {m} de chaque heure',
|
|
119
|
+
descAtTime: 'à {h}:{m}',
|
|
120
|
+
descOnDay: ' le jour {d} du mois',
|
|
121
|
+
descInMonth: ' au mois {mon}',
|
|
122
|
+
descIfDow: ' si c\'est le jour {d} (0=Dim, 6=Sam)',
|
|
123
|
+
descDays: 'Dimanche,Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi',
|
|
124
|
+
descInvalid: 'Expression invalide',
|
|
125
|
+
timeNow: 'maintenant',
|
|
126
|
+
timeMin: 'min',
|
|
127
|
+
timeHour: 'h',
|
|
128
|
+
timeDays: 'jours',
|
|
129
|
+
locale: 'fr-FR',
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export const content: ToolLocaleContent<CronGeneratorUI> = {
|
|
133
|
+
slug,
|
|
134
|
+
title,
|
|
135
|
+
description,
|
|
136
|
+
ui,
|
|
137
|
+
faqTitle: 'Questions fréquentes',
|
|
138
|
+
faq: faqData,
|
|
139
|
+
bibliographyTitle: 'Références et documentation',
|
|
140
|
+
bibliography: [
|
|
141
|
+
{
|
|
142
|
+
name: 'Manuel GNU Crontab : Expressions Cron sous Linux',
|
|
143
|
+
url: 'https://www.gnu.org/software/mcron/manual/html_node/Crontab-file.html',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: 'Cron sur Wikipedia : Histoire et syntaxe',
|
|
147
|
+
url: 'https://en.wikipedia.org/wiki/Cron',
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
howTo: howToData,
|
|
151
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
152
|
+
seo: [
|
|
153
|
+
{
|
|
154
|
+
type: 'title',
|
|
155
|
+
text: 'L\'importance de Cron dans l\'automatisation moderne',
|
|
156
|
+
level: 2,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
type: 'paragraph',
|
|
160
|
+
html: 'Malgré l\'ère des serveurs <em>serverless</em> et des flux de travail cloud, le système <strong>Crontab</strong> reste l\'épine dorsale de l\'infrastructure technologique mondiale. Des petits blogs aux grandes infrastructures bancaires, la planification des tâches maintient le monde numérique en marche.',
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
type: 'title',
|
|
164
|
+
text: 'Anatomie d\'une expression Cron',
|
|
165
|
+
level: 3,
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
type: 'list',
|
|
169
|
+
items: [
|
|
170
|
+
'<strong>Champ 1 - Minute (0-59) :</strong> Quand la tâche démarre dans l\'heure.',
|
|
171
|
+
'<strong>Champ 2 - Heure (0-23) :</strong> Format 24 heures obligatoire.',
|
|
172
|
+
'<strong>Champ 3 - Jour du Mois (1-31) :</strong> Jour calendaire spécifique.',
|
|
173
|
+
'<strong>Champ 4 - Mois (1-12) :</strong> De janvier à décembre.',
|
|
174
|
+
'<strong>Champ 5 - Jour de la Semaine (0-6) :</strong> 0 correspond généralement au Dimanche.',
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
type: 'title',
|
|
179
|
+
text: 'Opérateurs spéciaux et erreurs courantes',
|
|
180
|
+
level: 3,
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
type: 'tip',
|
|
184
|
+
html: 'Utilisez le slash <code>/</code> pour définir des pas : <code>*/5</code> en minutes s\'exécute toutes les 5 minutes. La virgule <code>,</code> crée des listes (<code>1,3,5</code>) et le tiret <code>-</code> définit des plages (<code>1-5</code>).',
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
type: 'paragraph',
|
|
188
|
+
html: '90% des serveurs fonctionnent en <strong>UTC</strong>. Si vous planifiez une tâche à 02h00 en pensant à votre fuseau local, elle peut s\'exécuter à un moment inattendu. De plus, Cron n\'a pas accès à votre <code>$PATH</code> habituel — utilisez toujours des chemins absolus comme <code>/usr/local/bin/node</code>.',
|
|
189
|
+
},
|
|
190
|
+
],
|
|
191
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { DeveloperToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
|
|
2
|
+
import CronGeneratorComponent from './component.astro';
|
|
3
|
+
import CronGeneratorSEO from './seo.astro';
|
|
4
|
+
import CronGeneratorBibliography from './bibliography.astro';
|
|
5
|
+
|
|
6
|
+
import type { CronGeneratorUI } from './ui';
|
|
7
|
+
|
|
8
|
+
export type CronGeneratorLocaleContent = ToolLocaleContent<CronGeneratorUI>;
|
|
9
|
+
|
|
10
|
+
import { content as es } from './i18n/es';
|
|
11
|
+
import { content as en } from './i18n/en';
|
|
12
|
+
import { content as fr } from './i18n/fr';
|
|
13
|
+
|
|
14
|
+
export const cronGenerator: DeveloperToolEntry<CronGeneratorUI> = {
|
|
15
|
+
id: 'cron-generator',
|
|
16
|
+
icons: {
|
|
17
|
+
bg: 'mdi:clock-outline',
|
|
18
|
+
fg: 'mdi:code-braces',
|
|
19
|
+
},
|
|
20
|
+
i18n: {
|
|
21
|
+
es: async () => es,
|
|
22
|
+
en: async () => en,
|
|
23
|
+
fr: async () => fr,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { CronGeneratorComponent, CronGeneratorSEO, CronGeneratorBibliography };
|
|
28
|
+
|
|
29
|
+
export const CRON_GENERATOR_TOOL: ToolDefinition = {
|
|
30
|
+
entry: cronGenerator,
|
|
31
|
+
Component: CronGeneratorComponent,
|
|
32
|
+
SEOComponent: CronGeneratorSEO,
|
|
33
|
+
BibliographyComponent: CronGeneratorBibliography,
|
|
34
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { cronGenerator } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await cronGenerator.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface CronGeneratorUI extends Record<string, string> {
|
|
2
|
+
labelMinute: string;
|
|
3
|
+
labelHour: string;
|
|
4
|
+
labelDom: string;
|
|
5
|
+
labelMonth: string;
|
|
6
|
+
labelDow: string;
|
|
7
|
+
tabQuick: string;
|
|
8
|
+
tabAdvanced: string;
|
|
9
|
+
fieldMinute: string;
|
|
10
|
+
fieldHour: string;
|
|
11
|
+
fieldDom: string;
|
|
12
|
+
fieldMonth: string;
|
|
13
|
+
fieldDow: string;
|
|
14
|
+
hintMinute: string;
|
|
15
|
+
hintDow: string;
|
|
16
|
+
labelNextRuns: string;
|
|
17
|
+
btnCopy: string;
|
|
18
|
+
btnCopied: string;
|
|
19
|
+
msgNoRuns: string;
|
|
20
|
+
msgError: string;
|
|
21
|
+
presetEveryMinute: string;
|
|
22
|
+
presetEveryHour: string;
|
|
23
|
+
presetDaily: string;
|
|
24
|
+
presetWeekly: string;
|
|
25
|
+
presetMonthly: string;
|
|
26
|
+
presetYearly: string;
|
|
27
|
+
descEveryMinute: string;
|
|
28
|
+
descEveryHour: string;
|
|
29
|
+
descEveryDay: string;
|
|
30
|
+
descPrefix: string;
|
|
31
|
+
descEveryMin: string;
|
|
32
|
+
descEveryHourOnDot: string;
|
|
33
|
+
descAtMinute: string;
|
|
34
|
+
descAtTime: string;
|
|
35
|
+
descOnDay: string;
|
|
36
|
+
descInMonth: string;
|
|
37
|
+
descIfDow: string;
|
|
38
|
+
descDays: string;
|
|
39
|
+
descInvalid: string;
|
|
40
|
+
timeNow: string;
|
|
41
|
+
timeMin: string;
|
|
42
|
+
timeHour: string;
|
|
43
|
+
timeDays: string;
|
|
44
|
+
locale: string;
|
|
45
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { cssSpecificityCalculator } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await cssSpecificityCalculator.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SharedBibliography links={content.bibliography} />}
|