- ✅ Ticket 1.1: Estructura Clean Architecture en backend - ✅ Ticket 1.2: Schemas Zod compartidos - ✅ Ticket 1.3: Refactorización drugs.ts (1362 → 8 archivos modulares) - ✅ Ticket 1.4: Refactorización procedures.ts (3583 → 6 archivos modulares) - ✅ Ticket 1.5: Eliminación de duplicidades (~50 líneas) Cambios principales: - Creada estructura Clean Architecture en backend/src/ - Schemas Zod compartidos en backend/src/shared/schemas/ - Refactorización modular de drugs y procedures - Utilidades genéricas en src/utils/ (filter, validation) - Eliminados scripts obsoletos y documentación antigua - Corregidos errores: QueryClient, import test-error-handling - Build verificado y funcionando correctamente
210 lines
4.6 KiB
JavaScript
210 lines
4.6 KiB
JavaScript
/**
|
||
* @import {Schema} from 'hast-util-sanitize'
|
||
*/
|
||
|
||
// Couple of ARIA attributes allowed in several, but not all, places.
|
||
const aria = ['ariaDescribedBy', 'ariaLabel', 'ariaLabelledBy']
|
||
|
||
/**
|
||
* Default schema.
|
||
*
|
||
* Follows GitHub style sanitation.
|
||
*
|
||
* @type {Schema}
|
||
*/
|
||
export const defaultSchema = {
|
||
ancestors: {
|
||
tbody: ['table'],
|
||
td: ['table'],
|
||
th: ['table'],
|
||
thead: ['table'],
|
||
tfoot: ['table'],
|
||
tr: ['table']
|
||
},
|
||
attributes: {
|
||
a: [
|
||
...aria,
|
||
// Note: these 3 are used by GFM footnotes, they do work on all links.
|
||
'dataFootnoteBackref',
|
||
'dataFootnoteRef',
|
||
['className', 'data-footnote-backref'],
|
||
'href'
|
||
],
|
||
blockquote: ['cite'],
|
||
// Note: this class is not normally allowed by GH, when manually writing
|
||
// `code` as HTML in markdown, they adds it some other way.
|
||
// We can’t do that, so we have to allow it.
|
||
code: [['className', /^language-./]],
|
||
del: ['cite'],
|
||
div: ['itemScope', 'itemType'],
|
||
dl: [...aria],
|
||
// Note: this is used by GFM footnotes.
|
||
h2: [['className', 'sr-only']],
|
||
img: [...aria, 'longDesc', 'src'],
|
||
// Note: `input` is not normally allowed by GH, when manually writing
|
||
// it in markdown, they add it from tasklists some other way.
|
||
// We can’t do that, so we have to allow it.
|
||
input: [
|
||
['disabled', true],
|
||
['type', 'checkbox']
|
||
],
|
||
ins: ['cite'],
|
||
// Note: this class is not normally allowed by GH, when manually writing
|
||
// `li` as HTML in markdown, they adds it some other way.
|
||
// We can’t do that, so we have to allow it.
|
||
li: [['className', 'task-list-item']],
|
||
// Note: this class is not normally allowed by GH, when manually writing
|
||
// `ol` as HTML in markdown, they adds it some other way.
|
||
// We can’t do that, so we have to allow it.
|
||
ol: [...aria, ['className', 'contains-task-list']],
|
||
q: ['cite'],
|
||
section: ['dataFootnotes', ['className', 'footnotes']],
|
||
source: ['srcSet'],
|
||
summary: [...aria],
|
||
table: [...aria],
|
||
// Note: this class is not normally allowed by GH, when manually writing
|
||
// `ol` as HTML in markdown, they adds it some other way.
|
||
// We can’t do that, so we have to allow it.
|
||
ul: [...aria, ['className', 'contains-task-list']],
|
||
'*': [
|
||
'abbr',
|
||
'accept',
|
||
'acceptCharset',
|
||
'accessKey',
|
||
'action',
|
||
'align',
|
||
'alt',
|
||
'axis',
|
||
'border',
|
||
'cellPadding',
|
||
'cellSpacing',
|
||
'char',
|
||
'charOff',
|
||
'charSet',
|
||
'checked',
|
||
'clear',
|
||
'colSpan',
|
||
'color',
|
||
'cols',
|
||
'compact',
|
||
'coords',
|
||
'dateTime',
|
||
'dir',
|
||
// Note: `disabled` is technically allowed on all elements by GH.
|
||
// But it is useless on everything except `input`.
|
||
// Because `input`s are normally not allowed, but we allow them for
|
||
// checkboxes due to tasklists, we allow `disabled` only there.
|
||
'encType',
|
||
'frame',
|
||
'hSpace',
|
||
'headers',
|
||
'height',
|
||
'hrefLang',
|
||
'htmlFor',
|
||
'id',
|
||
'isMap',
|
||
'itemProp',
|
||
'label',
|
||
'lang',
|
||
'maxLength',
|
||
'media',
|
||
'method',
|
||
'multiple',
|
||
'name',
|
||
'noHref',
|
||
'noShade',
|
||
'noWrap',
|
||
'open',
|
||
'prompt',
|
||
'readOnly',
|
||
'rev',
|
||
'rowSpan',
|
||
'rows',
|
||
'rules',
|
||
'scope',
|
||
'selected',
|
||
'shape',
|
||
'size',
|
||
'span',
|
||
'start',
|
||
'summary',
|
||
'tabIndex',
|
||
'title',
|
||
'useMap',
|
||
'vAlign',
|
||
'value',
|
||
'width'
|
||
]
|
||
},
|
||
clobber: ['ariaDescribedBy', 'ariaLabelledBy', 'id', 'name'],
|
||
clobberPrefix: 'user-content-',
|
||
protocols: {
|
||
cite: ['http', 'https'],
|
||
href: ['http', 'https', 'irc', 'ircs', 'mailto', 'xmpp'],
|
||
longDesc: ['http', 'https'],
|
||
src: ['http', 'https']
|
||
},
|
||
required: {
|
||
input: {disabled: true, type: 'checkbox'}
|
||
},
|
||
strip: ['script'],
|
||
tagNames: [
|
||
'a',
|
||
'b',
|
||
'blockquote',
|
||
'br',
|
||
'code',
|
||
'dd',
|
||
'del',
|
||
'details',
|
||
'div',
|
||
'dl',
|
||
'dt',
|
||
'em',
|
||
'h1',
|
||
'h2',
|
||
'h3',
|
||
'h4',
|
||
'h5',
|
||
'h6',
|
||
'hr',
|
||
'i',
|
||
'img',
|
||
// Note: `input` is not normally allowed by GH, when manually writing
|
||
// it in markdown, they add it from tasklists some other way.
|
||
// We can’t do that, so we have to allow it.
|
||
'input',
|
||
'ins',
|
||
'kbd',
|
||
'li',
|
||
'ol',
|
||
'p',
|
||
'picture',
|
||
'pre',
|
||
'q',
|
||
'rp',
|
||
'rt',
|
||
'ruby',
|
||
's',
|
||
'samp',
|
||
'section',
|
||
'source',
|
||
'span',
|
||
'strike',
|
||
'strong',
|
||
'sub',
|
||
'summary',
|
||
'sup',
|
||
'table',
|
||
'tbody',
|
||
'td',
|
||
'tfoot',
|
||
'th',
|
||
'thead',
|
||
'tr',
|
||
'tt',
|
||
'ul',
|
||
'var'
|
||
]
|
||
}
|