@wrrdev/fenix-ui 1.1.7 → 1.1.9
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/README.md +18 -3
- package/dist/assets/{base-css-Be_r8aTo.js → font-CF0TXsAP.js} +39 -3
- package/dist/assets/font-CF0TXsAP.js.map +1 -0
- package/dist/components/drawer/drawer.d.ts.map +1 -1
- package/dist/components/drawer/drawer.js +4 -0
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/icon/icon.js +79 -0
- package/dist/components/icon/icon.js.map +1 -0
- package/dist/components/icon/index.js +7 -0
- package/dist/components/icon/index.js.map +1 -0
- package/dist/components/pagination/pagination.d.ts +1 -0
- package/dist/components/pagination/pagination.d.ts.map +1 -1
- package/dist/components/pagination/pagination.js +18 -2
- package/dist/components/pagination/pagination.js.map +1 -1
- package/dist/components/table/table.d.ts +38 -4
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/table/table.js +90 -18
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/toast/toast.d.ts +46 -1
- package/dist/components/toast/toast.d.ts.map +1 -1
- package/dist/components/toast/toast.js +128 -5
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/core/jsx.d.ts +63 -1
- package/dist/core/jsx.d.ts.map +1 -1
- package/dist/core/jsx.js.map +1 -1
- package/dist/core/vue.d.ts +7 -1
- package/dist/core/vue.d.ts.map +1 -1
- package/dist/core/vue.js.map +1 -1
- package/dist/docs/app.d.ts +2 -6
- package/dist/docs/app.d.ts.map +1 -1
- package/dist/docs/componentes/table.doc.d.ts.map +1 -1
- package/dist/docs/componentes/toast.doc.d.ts.map +1 -1
- package/dist/docs/router.d.ts +17 -0
- package/dist/docs/router.d.ts.map +1 -0
- package/dist/docs/shell.d.ts +43 -0
- package/dist/docs/shell.d.ts.map +1 -0
- package/dist/docs/ui/code.d.ts +12 -0
- package/dist/docs/ui/code.d.ts.map +1 -0
- package/dist/docs/ui/kit.d.ts +18 -0
- package/dist/docs/ui/kit.d.ts.map +1 -0
- package/dist/docs/ui/tabs.d.ts +23 -0
- package/dist/docs/ui/tabs.d.ts.map +1 -0
- package/dist/fenix-ui.umd.min.js +199 -116
- package/dist/fenix-ui2.esm.js.map +1 -1
- package/dist/fenix-ui3.esm.js +5 -36
- package/dist/fenix-ui3.esm.js.map +1 -1
- package/dist/fenix-ui4.esm.js +326 -45
- package/dist/fenix-ui4.esm.js.map +1 -1
- package/dist/fenix-ui5.esm.js +44 -16
- package/dist/fenix-ui5.esm.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/plugins/auto-import.d.ts +19 -2
- package/dist/plugins/auto-import.d.ts.map +1 -1
- package/dist/plugins/auto-import.js +43 -15
- package/dist/plugins/auto-import.js.map +1 -1
- package/dist/plugins/index.d.ts +5 -0
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +1 -1
- package/dist/plugins/index.js.map +1 -1
- package/package.json +3 -2
- package/dist/assets/base-css-Be_r8aTo.js.map +0 -1
package/dist/fenix-ui5.esm.js
CHANGED
|
@@ -49,34 +49,62 @@ const fenixComponentMap = {
|
|
|
49
49
|
"fx-accordion-panel": "@wrrdev/fenix-ui/accordion",
|
|
50
50
|
"fx-orderlist": "@wrrdev/fenix-ui/orderlist",
|
|
51
51
|
"fx-picklist": "@wrrdev/fenix-ui/picklist",
|
|
52
|
-
"fx-column": "@wrrdev/fenix-ui/table"
|
|
52
|
+
"fx-column": "@wrrdev/fenix-ui/table",
|
|
53
|
+
// Subtags do <fx-table>: usar uma delas isolada já exige o módulo da tabela.
|
|
54
|
+
"fx-cell": "@wrrdev/fenix-ui/table",
|
|
55
|
+
"fx-toolbar": "@wrrdev/fenix-ui/table"
|
|
53
56
|
};
|
|
54
57
|
const TAG_RE = /<(fx-[a-z][a-z-]*)(?=[\s/>])/g;
|
|
55
|
-
const FENIX_ICON_CLASS_RE =
|
|
56
|
-
|
|
58
|
+
const FENIX_ICON_CLASS_RE = /(?:^|[^</\w-])fx-icon(?:-[a-z0-9_]+)*\b/;
|
|
59
|
+
const INLINE_SCRIPT_RE = /<script\b(?![^>]*\bsrc=)[^>]*>/i;
|
|
60
|
+
function isMarkup(id, code) {
|
|
61
|
+
return /\.(vue|svelte|html?)$/i.test(id) || /^\s*<(?:template|script|style|!doctype|html)\b/i.test(code);
|
|
62
|
+
}
|
|
63
|
+
function eolOf(code) {
|
|
64
|
+
return code.includes("\r\n") ? "\r\n" : "\n";
|
|
65
|
+
}
|
|
66
|
+
function injectIntoScriptBlock(code, lines) {
|
|
67
|
+
const open = INLINE_SCRIPT_RE.exec(code);
|
|
68
|
+
if (!open) return null;
|
|
69
|
+
const at = open.index + open[0].length;
|
|
70
|
+
const br = eolOf(code);
|
|
71
|
+
return `${code.slice(0, at)}${br}${lines.join(br)}${code.slice(at)}`;
|
|
72
|
+
}
|
|
73
|
+
function createScriptBlock(code, lines, html) {
|
|
74
|
+
const br = eolOf(code);
|
|
75
|
+
const body = `${br}${lines.join(br)}${br}`;
|
|
76
|
+
if (!html) return `<script>${body}<\/script>${br}${code}`;
|
|
77
|
+
const block = `<script type="module">${body}<\/script>${br}`;
|
|
78
|
+
const bodyAt = code.search(/<\/body\s*>/i);
|
|
79
|
+
if (bodyAt >= 0) return `${code.slice(0, bodyAt)}${block}${code.slice(bodyAt)}`;
|
|
80
|
+
return `${block}${code}`;
|
|
81
|
+
}
|
|
82
|
+
function transformSource(code, options = {}, id = "") {
|
|
57
83
|
const pkg = options.packageName ?? "@wrrdev/fenix-ui";
|
|
58
84
|
const resolve = (sub) => pkg === "@wrrdev/fenix-ui" ? sub : sub.replace("@wrrdev/fenix-ui", pkg);
|
|
85
|
+
const hasImport = (target) => code.includes(`'${target}'`) || code.includes(`"${target}"`);
|
|
59
86
|
const needed = /* @__PURE__ */ new Set();
|
|
60
87
|
for (const m of code.matchAll(TAG_RE)) {
|
|
61
88
|
const sub = fenixComponentMap[m[1]];
|
|
62
|
-
if (sub)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
needed.add(target);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
89
|
+
if (!sub) continue;
|
|
90
|
+
const target = resolve(sub);
|
|
91
|
+
if (!hasImport(target)) needed.add(target);
|
|
68
92
|
}
|
|
69
93
|
const iconsSub = resolve("@wrrdev/fenix-ui/icons");
|
|
70
|
-
if (FENIX_ICON_CLASS_RE.test(code) && !
|
|
94
|
+
if (FENIX_ICON_CLASS_RE.test(code) && !hasImport(iconsSub)) {
|
|
71
95
|
needed.add(iconsSub);
|
|
72
96
|
}
|
|
97
|
+
const markup = isMarkup(id, code);
|
|
98
|
+
const vueSub = resolve("@wrrdev/fenix-ui/vue");
|
|
99
|
+
if (options.vueTypes !== false && /\.vue$/i.test(id) && needed.size > 0 && !hasImport(vueSub)) {
|
|
100
|
+
needed.add(vueSub);
|
|
101
|
+
}
|
|
73
102
|
if (!needed.size) return code;
|
|
74
103
|
const lines = [...needed].map((s) => `import '${s}';`);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
`);
|
|
104
|
+
if (markup) {
|
|
105
|
+
const injected = injectIntoScriptBlock(code, lines);
|
|
106
|
+
if (injected) return injected;
|
|
107
|
+
return createScriptBlock(code, lines, /\.html?$/i.test(id));
|
|
80
108
|
}
|
|
81
109
|
let lastEnd = -1;
|
|
82
110
|
for (const m of code.matchAll(/^[ \t]*import\b[^;]*?['"][^'"]+['"];?[^\S\n]*$/gm)) {
|
|
@@ -96,7 +124,7 @@ function FenixAutoImport(options = {}) {
|
|
|
96
124
|
enforce: "pre",
|
|
97
125
|
transform(code, id) {
|
|
98
126
|
if (!shouldTransform(id)) return void 0;
|
|
99
|
-
const result = transformSource(code, options);
|
|
127
|
+
const result = transformSource(code, options, id);
|
|
100
128
|
if (result === code) return void 0;
|
|
101
129
|
return { code: result, map: null };
|
|
102
130
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fenix-ui5.esm.js","sources":["../src/plugins/auto-import.ts","../src/plugins/index.ts"],"sourcesContent":["/**\n * Registro de tags → subpaths para o auto-import.\n * Mantido em um módulo próprio (sem depender de DOM) para ser usado\n * também no build do cliente via plugin.\n */\nexport const fenixComponentMap: Record<string, string> = {\n 'fx-button': '@wrrdev/fenix-ui/button',\n 'fx-badge': '@wrrdev/fenix-ui/badge',\n 'fx-spinner': '@wrrdev/fenix-ui/spinner',\n 'fx-select': '@wrrdev/fenix-ui/select',\n 'fx-multiselect': '@wrrdev/fenix-ui/multiselect',\n 'fx-input': '@wrrdev/fenix-ui/input',\n 'fx-switch': '@wrrdev/fenix-ui/switch',\n 'fx-calendar': '@wrrdev/fenix-ui/calendar',\n 'fx-datepicker': '@wrrdev/fenix-ui/datepicker',\n 'fx-checkbox': '@wrrdev/fenix-ui/checkbox',\n 'fx-radio': '@wrrdev/fenix-ui/radio',\n 'fx-table': '@wrrdev/fenix-ui/table',\n 'fx-floatlabel': '@wrrdev/fenix-ui/floatlabel',\n 'fx-textarea': '@wrrdev/fenix-ui/textarea',\n 'fx-dialog': '@wrrdev/fenix-ui/dialog',\n 'fx-confirmpopup': '@wrrdev/fenix-ui/confirmpopup',\n 'fx-fileupload': '@wrrdev/fenix-ui/fileupload',\n 'fx-slider': '@wrrdev/fenix-ui/slider',\n 'fx-chip': '@wrrdev/fenix-ui/chip',\n 'fx-avatar': '@wrrdev/fenix-ui/avatar',\n 'fx-icon': '@wrrdev/fenix-ui/icon',\n 'fx-card': '@wrrdev/fenix-ui/card',\n 'fx-breadcrumb': '@wrrdev/fenix-ui/breadcrumb',\n 'fx-popover': '@wrrdev/fenix-ui/popover',\n 'fx-stepper': '@wrrdev/fenix-ui/stepper',\n 'fx-rating': '@wrrdev/fenix-ui/rating',\n 'fx-menu': '@wrrdev/fenix-ui/menu',\n 'fx-toggle-button-group': '@wrrdev/fenix-ui/toggle-button-group',\n 'fx-empty-state': '@wrrdev/fenix-ui/empty-state',\n 'fx-password-strength': '@wrrdev/fenix-ui/password-strength',\n 'fx-timeline': '@wrrdev/fenix-ui/timeline',\n 'fx-carousel': '@wrrdev/fenix-ui/carousel',\n 'fx-tree': '@wrrdev/fenix-ui/tree',\n 'fx-drawer': '@wrrdev/fenix-ui/drawer',\n 'fx-toast': '@wrrdev/fenix-ui/toast',\n 'fx-tooltip': '@wrrdev/fenix-ui/tooltip',\n 'fx-tabs': '@wrrdev/fenix-ui/tabs',\n 'fx-tab-panel': '@wrrdev/fenix-ui/tabs',\n 'fx-progress': '@wrrdev/fenix-ui/progress',\n 'fx-skeleton': '@wrrdev/fenix-ui/skeleton',\n 'fx-alert': '@wrrdev/fenix-ui/alert',\n 'fx-dropdown': '@wrrdev/fenix-ui/dropdown',\n 'fx-dropdown-item': '@wrrdev/fenix-ui/dropdown',\n 'fx-pagination': '@wrrdev/fenix-ui/pagination',\n 'fx-autocomplete': '@wrrdev/fenix-ui/autocomplete',\n 'fx-knob': '@wrrdev/fenix-ui/knob',\n 'fx-accordion': '@wrrdev/fenix-ui/accordion',\n 'fx-accordion-panel': '@wrrdev/fenix-ui/accordion',\n 'fx-orderlist': '@wrrdev/fenix-ui/orderlist',\n 'fx-picklist': '@wrrdev/fenix-ui/picklist',\n 'fx-column': '@wrrdev/fenix-ui/table',\n};\n\nconst TAG_RE = /<(fx-[a-z][a-z-]*)(?=[\\s/>])/g;\n\n/** Detecta uso da biblioteca de ícones por classe (fx-icon / fx-icon-home etc.). */\nexport const FENIX_ICON_CLASS_RE = /\\bfx-icon(?:-[a-z0-9_]+)*\\b/;\n\nexport interface AutoImportOptions {\n /** Prefixo do pacote (padrão '@wrrdev/fenix-ui'). */\n packageName?: string;\n}\n\n/**\n * Injeta `import '<subpath>'` para cada componente fx-* usado no código\n * que ainda não foi importado. Retorna o código transformado ou o original.\n */\nexport function transformSource(code: string, options: AutoImportOptions = {}): string {\n const pkg = options.packageName ?? '@wrrdev/fenix-ui';\n // Subpaths do mapa são reescritos quando um pacote custom é informado.\n const resolve = (sub: string): string =>\n pkg === '@wrrdev/fenix-ui' ? sub : sub.replace('@wrrdev/fenix-ui', pkg);\n\n // Componentes usados e ainda não importados explicitamente.\n const needed = new Set<string>();\n for (const m of code.matchAll(TAG_RE)) {\n const sub = fenixComponentMap[m[1]];\n if (sub) {\n const target = resolve(sub);\n if (!code.includes(`'${target}'`) && !code.includes(`\"${target}\"`)) {\n needed.add(target);\n }\n }\n }\n // Biblioteca de ícones: classes fx-icon / fx-icon-<nome> injetam o subpath /icons.\n const iconsSub = resolve('@wrrdev/fenix-ui/icons');\n if (FENIX_ICON_CLASS_RE.test(code) && !code.includes(`'${iconsSub}'`) && !code.includes(`\"${iconsSub}\"`)) {\n needed.add(iconsSub);\n }\n if (!needed.size) return code;\n\n const lines = [...needed].map((s) => `import '${s}';`);\n\n // Arquivo único (.vue): injeta logo após a abertura do <script>.\n const vueScript = /(<script[^>]*>)\\n/.exec(code);\n if (vueScript) {\n return code.replace(vueScript[0], `${vueScript[1]}\\n${lines.join('\\n')}\\n`);\n }\n\n // TS/JS: injeta após o último import existente (ou no topo).\n let lastEnd = -1;\n for (const m of code.matchAll(/^[ \\t]*import\\b[^;]*?['\"][^'\"]+['\"];?[^\\S\\n]*$/gm)) {\n lastEnd = Math.max(lastEnd, m.index + m[0].length);\n }\n if (lastEnd === -1) return `${lines.join('\\n')}\\n${code}`;\n return `${code.slice(0, lastEnd)}\\n${lines.join('\\n')}${code.slice(lastEnd)}`;\n}\n\n/** Verifica se o arquivo deve ser transformado. */\nexport function shouldTransform(id: string): boolean {\n return (\n !id.includes('node_modules') &&\n !id.endsWith('.d.ts') &&\n !id.endsWith('.css') &&\n /\\.(ts|js|tsx|jsx|vue|html|svelte)$/.test(id)\n );\n}\n\n","/**\n * Plugin de AUTO-IMPORT para Vite/Rollup.\n *\n * O usuário escreve apenas `<fx-button>`, `<fx-select>` etc. no template/código;\n * este plugin detecta as tags em tempo de build e injeta os imports dos\n * subpaths correspondentes — mantendo o tree-shaking (só entra no bundle\n * o que é usado).\n *\n * Uso no projeto do cliente (vite.config.ts):\n * import { FenixAutoImport } from '@wrrdev/fenix-ui/auto-import';\n * export default { plugins: [FenixAutoImport()] };\n */\nimport {\n transformSource,\n shouldTransform,\n type AutoImportOptions,\n} from './auto-import';\n\nexport interface FenixPlugin {\n name: string;\n enforce: 'pre';\n transform: (\n code: string,\n id: string,\n ) => { code: string; map: null } | undefined;\n}\n\nexport function FenixAutoImport(options: AutoImportOptions = {}): FenixPlugin {\n return {\n name: 'fenix-ui-auto-import',\n enforce: 'pre',\n transform(code, id) {\n if (!shouldTransform(id)) return undefined;\n const result = transformSource(code, options);\n if (result === code) return undefined;\n return { code: result, map: null };\n },\n };\n}\n\nexport { transformSource, shouldTransform, fenixComponentMap } from './auto-import';\nexport type { AutoImportOptions } from './auto-import';\n"],"names":[],"mappings":"AAKO,MAAM,oBAA4C;AAAA,EACvD,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AAAA,EACb,WAAW;AAAA,EACX,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,WAAW;AAAA,EACX,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,aAAa;AACf;AAEA,MAAM,SAAS;AAGR,MAAM,sBAAsB;AAW5B,SAAS,gBAAgB,MAAc,UAA6B,IAAY;AACrF,QAAM,MAAM,QAAQ,eAAe;AAEnC,QAAM,UAAU,CAAC,QACf,QAAQ,qBAAqB,MAAM,IAAI,QAAQ,oBAAoB,GAAG;AAGxE,QAAM,6BAAa,IAAA;AACnB,aAAW,KAAK,KAAK,SAAS,MAAM,GAAG;AACrC,UAAM,MAAM,kBAAkB,EAAE,CAAC,CAAC;AAClC,QAAI,KAAK;AACP,YAAM,SAAS,QAAQ,GAAG;AAC1B,UAAI,CAAC,KAAK,SAAS,IAAI,MAAM,GAAG,KAAK,CAAC,KAAK,SAAS,IAAI,MAAM,GAAG,GAAG;AAClE,eAAO,IAAI,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,QAAQ,wBAAwB;AACjD,MAAI,oBAAoB,KAAK,IAAI,KAAK,CAAC,KAAK,SAAS,IAAI,QAAQ,GAAG,KAAK,CAAC,KAAK,SAAS,IAAI,QAAQ,GAAG,GAAG;AACxG,WAAO,IAAI,QAAQ;AAAA,EACrB;AACA,MAAI,CAAC,OAAO,KAAM,QAAO;AAEzB,QAAM,QAAQ,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,WAAW,CAAC,IAAI;AAGrD,QAAM,YAAY,oBAAoB,KAAK,IAAI;AAC/C,MAAI,WAAW;AACb,WAAO,KAAK,QAAQ,UAAU,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC;AAAA,EAAK,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EAC5E;AAGA,MAAI,UAAU;AACd,aAAW,KAAK,KAAK,SAAS,kDAAkD,GAAG;AACjF,cAAU,KAAK,IAAI,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM;AAAA,EACnD;AACA,MAAI,YAAY,GAAI,QAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,EAAK,IAAI;AACvD,SAAO,GAAG,KAAK,MAAM,GAAG,OAAO,CAAC;AAAA,EAAK,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;AAC7E;AAGO,SAAS,gBAAgB,IAAqB;AACnD,SACE,CAAC,GAAG,SAAS,cAAc,KAC3B,CAAC,GAAG,SAAS,OAAO,KACpB,CAAC,GAAG,SAAS,MAAM,KACnB,qCAAqC,KAAK,EAAE;AAEhD;AC/FO,SAAS,gBAAgB,UAA6B,IAAiB;AAC5E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU,MAAM,IAAI;AAClB,UAAI,CAAC,gBAAgB,EAAE,EAAG,QAAO;AACjC,YAAM,SAAS,gBAAgB,MAAM,OAAO;AAC5C,UAAI,WAAW,KAAM,QAAO;AAC5B,aAAO,EAAE,MAAM,QAAQ,KAAK,KAAA;AAAA,IAC9B;AAAA,EAAA;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"fenix-ui5.esm.js","sources":["../src/plugins/auto-import.ts","../src/plugins/index.ts"],"sourcesContent":["/**\n * Registro de tags → subpaths para o auto-import.\n * Mantido em um módulo próprio (sem depender de DOM) para ser usado\n * também no build do cliente via plugin.\n */\nexport const fenixComponentMap: Record<string, string> = {\n 'fx-button': '@wrrdev/fenix-ui/button',\n 'fx-badge': '@wrrdev/fenix-ui/badge',\n 'fx-spinner': '@wrrdev/fenix-ui/spinner',\n 'fx-select': '@wrrdev/fenix-ui/select',\n 'fx-multiselect': '@wrrdev/fenix-ui/multiselect',\n 'fx-input': '@wrrdev/fenix-ui/input',\n 'fx-switch': '@wrrdev/fenix-ui/switch',\n 'fx-calendar': '@wrrdev/fenix-ui/calendar',\n 'fx-datepicker': '@wrrdev/fenix-ui/datepicker',\n 'fx-checkbox': '@wrrdev/fenix-ui/checkbox',\n 'fx-radio': '@wrrdev/fenix-ui/radio',\n 'fx-table': '@wrrdev/fenix-ui/table',\n 'fx-floatlabel': '@wrrdev/fenix-ui/floatlabel',\n 'fx-textarea': '@wrrdev/fenix-ui/textarea',\n 'fx-dialog': '@wrrdev/fenix-ui/dialog',\n 'fx-confirmpopup': '@wrrdev/fenix-ui/confirmpopup',\n 'fx-fileupload': '@wrrdev/fenix-ui/fileupload',\n 'fx-slider': '@wrrdev/fenix-ui/slider',\n 'fx-chip': '@wrrdev/fenix-ui/chip',\n 'fx-avatar': '@wrrdev/fenix-ui/avatar',\n 'fx-icon': '@wrrdev/fenix-ui/icon',\n 'fx-card': '@wrrdev/fenix-ui/card',\n 'fx-breadcrumb': '@wrrdev/fenix-ui/breadcrumb',\n 'fx-popover': '@wrrdev/fenix-ui/popover',\n 'fx-stepper': '@wrrdev/fenix-ui/stepper',\n 'fx-rating': '@wrrdev/fenix-ui/rating',\n 'fx-menu': '@wrrdev/fenix-ui/menu',\n 'fx-toggle-button-group': '@wrrdev/fenix-ui/toggle-button-group',\n 'fx-empty-state': '@wrrdev/fenix-ui/empty-state',\n 'fx-password-strength': '@wrrdev/fenix-ui/password-strength',\n 'fx-timeline': '@wrrdev/fenix-ui/timeline',\n 'fx-carousel': '@wrrdev/fenix-ui/carousel',\n 'fx-tree': '@wrrdev/fenix-ui/tree',\n 'fx-drawer': '@wrrdev/fenix-ui/drawer',\n 'fx-toast': '@wrrdev/fenix-ui/toast',\n 'fx-tooltip': '@wrrdev/fenix-ui/tooltip',\n 'fx-tabs': '@wrrdev/fenix-ui/tabs',\n 'fx-tab-panel': '@wrrdev/fenix-ui/tabs',\n 'fx-progress': '@wrrdev/fenix-ui/progress',\n 'fx-skeleton': '@wrrdev/fenix-ui/skeleton',\n 'fx-alert': '@wrrdev/fenix-ui/alert',\n 'fx-dropdown': '@wrrdev/fenix-ui/dropdown',\n 'fx-dropdown-item': '@wrrdev/fenix-ui/dropdown',\n 'fx-pagination': '@wrrdev/fenix-ui/pagination',\n 'fx-autocomplete': '@wrrdev/fenix-ui/autocomplete',\n 'fx-knob': '@wrrdev/fenix-ui/knob',\n 'fx-accordion': '@wrrdev/fenix-ui/accordion',\n 'fx-accordion-panel': '@wrrdev/fenix-ui/accordion',\n 'fx-orderlist': '@wrrdev/fenix-ui/orderlist',\n 'fx-picklist': '@wrrdev/fenix-ui/picklist',\n 'fx-column': '@wrrdev/fenix-ui/table',\n // Subtags do <fx-table>: usar uma delas isolada já exige o módulo da tabela.\n 'fx-cell': '@wrrdev/fenix-ui/table',\n 'fx-toolbar': '@wrrdev/fenix-ui/table',\n};\n\nconst TAG_RE = /<(fx-[a-z][a-z-]*)(?=[\\s/>])/g;\n\n/**\n * Detecta o uso da biblioteca de ícones por CLASSE (`class=\"fx-icon fx-icon-home\"`).\n *\n * O prefixo `(?:^|[^</\\w-])` ignora a TAG `<fx-icon…>` / `</fx-icon>`: o\n * componente carrega o @font-face leve por conta própria e não precisa das\n * ~4.300 regras `.fx-icon-<nome>` que o subpath `/icons` injeta. Também ignora\n * nomes compostos (`meu-fx-icon`), `fx-icons`, `fx-iconHome` etc.\n */\nexport const FENIX_ICON_CLASS_RE = /(?:^|[^</\\w-])fx-icon(?:-[a-z0-9_]+)*\\b/;\n\nexport interface AutoImportOptions {\n /** Prefixo do pacote (padrão '@wrrdev/fenix-ui'). */\n packageName?: string;\n /**\n * Em arquivos `.vue`, injeta também `import '@wrrdev/fenix-ui/vue'` junto com\n * o primeiro componente detectado. É a augmentação que habilita o\n * autocomplete/validação dos atributos `fx-*` no Volar/vue-tsc — sem passo\n * manual no `main.ts`. Padrão: `true`.\n */\n vueTypes?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Injeção em arquivos com markup (SFC Vue/Svelte e HTML) */\n/* ------------------------------------------------------------------ */\n\n/** Bloco `<script>` INLINE (sem `src=`) — é dentro dele que o import entra. */\nconst INLINE_SCRIPT_RE = /<script\\b(?![^>]*\\bsrc=)[^>]*>/i;\n\n/** Arquivo com markup (SFC Vue/Svelte ou HTML) — detectado pelo id ou conteúdo. */\nfunction isMarkup(id: string, code: string): boolean {\n return (\n /\\.(vue|svelte|html?)$/i.test(id) ||\n /^\\s*<(?:template|script|style|!doctype|html)\\b/i.test(code)\n );\n}\n\n/** Quebra de linha do arquivo — preserva o CRLF de projetos Windows. */\nfunction eolOf(code: string): string {\n return code.includes('\\r\\n') ? '\\r\\n' : '\\n';\n}\n\n/**\n * Injeta os imports como primeira linha do bloco `<script>`.\n *\n * Tolerante a CRLF e a conteúdo na mesma linha da tag (`<script setup>const a=1`)\n * — a versão antiga exigia `>\\n` e, no Windows, colava os imports FORA do\n * `<script>`, onde o compilador de SFC os descarta (componente nunca registrado).\n */\nfunction injectIntoScriptBlock(code: string, lines: string[]): string | null {\n const open = INLINE_SCRIPT_RE.exec(code);\n if (!open) return null;\n const at = open.index + open[0].length;\n const br = eolOf(code);\n return `${code.slice(0, at)}${br}${lines.join(br)}${code.slice(at)}`;\n}\n\n/**\n * Cria o bloco `<script>` quando o arquivo não tem nenhum.\n *\n * Um `import` fora de `<script>` é descartado pelo compilador de SFC — este é o\n * único fallback válido para um `.vue`/`.svelte` que só tem `<template>`.\n */\nfunction createScriptBlock(code: string, lines: string[], html: boolean): string {\n const br = eolOf(code);\n const body = `${br}${lines.join(br)}${br}`;\n if (!html) return `<script>${body}</script>${br}${code}`;\n // HTML: `<script type=\"module\">` inline (o Vite transforma) antes do </body>.\n const block = `<script type=\"module\">${body}</script>${br}`;\n const bodyAt = code.search(/<\\/body\\s*>/i);\n if (bodyAt >= 0) return `${code.slice(0, bodyAt)}${block}${code.slice(bodyAt)}`;\n return `${block}${code}`;\n}\n\n/**\n * Injeta `import '<subpath>'` para cada componente fx-* usado no código\n * que ainda não foi importado. Retorna o código transformado ou o original.\n *\n * `id` (caminho do módulo, opcional) habilita os tratamentos de arquivo com\n * markup: injeção dentro do `<script>` e augmentação de tipos do Vue (SFC).\n */\nexport function transformSource(\n code: string,\n options: AutoImportOptions = {},\n id = '',\n): string {\n const pkg = options.packageName ?? '@wrrdev/fenix-ui';\n // Subpaths do mapa são reescritos quando um pacote custom é informado.\n const resolve = (sub: string): string =>\n pkg === '@wrrdev/fenix-ui' ? sub : sub.replace('@wrrdev/fenix-ui', pkg);\n const hasImport = (target: string): boolean =>\n code.includes(`'${target}'`) || code.includes(`\"${target}\"`);\n\n // Componentes usados e ainda não importados explicitamente.\n const needed = new Set<string>();\n for (const m of code.matchAll(TAG_RE)) {\n const sub = fenixComponentMap[m[1]];\n if (!sub) continue;\n const target = resolve(sub);\n if (!hasImport(target)) needed.add(target);\n }\n // Biblioteca de ícones: classes fx-icon / fx-icon-<nome> injetam o subpath /icons.\n const iconsSub = resolve('@wrrdev/fenix-ui/icons');\n if (FENIX_ICON_CLASS_RE.test(code) && !hasImport(iconsSub)) {\n needed.add(iconsSub);\n }\n\n const markup = isMarkup(id, code);\n // Vue (SFC): a augmentação de tipos entra junto do primeiro import injetado.\n const vueSub = resolve('@wrrdev/fenix-ui/vue');\n if (options.vueTypes !== false && /\\.vue$/i.test(id) && needed.size > 0 && !hasImport(vueSub)) {\n needed.add(vueSub);\n }\n if (!needed.size) return code;\n\n const lines = [...needed].map((s) => `import '${s}';`);\n\n // SFC (Vue/Svelte) e HTML: o import precisa ficar DENTRO de um <script>.\n if (markup) {\n const injected = injectIntoScriptBlock(code, lines);\n if (injected) return injected;\n return createScriptBlock(code, lines, /\\.html?$/i.test(id));\n }\n\n // TS/JS: injeta após o último import existente (ou no topo).\n let lastEnd = -1;\n for (const m of code.matchAll(/^[ \\t]*import\\b[^;]*?['\"][^'\"]+['\"];?[^\\S\\n]*$/gm)) {\n lastEnd = Math.max(lastEnd, m.index + m[0].length);\n }\n if (lastEnd === -1) return `${lines.join('\\n')}\\n${code}`;\n return `${code.slice(0, lastEnd)}\\n${lines.join('\\n')}${code.slice(lastEnd)}`;\n}\n\n/** Verifica se o arquivo deve ser transformado. */\nexport function shouldTransform(id: string): boolean {\n return (\n !id.includes('node_modules') &&\n !id.endsWith('.d.ts') &&\n !id.endsWith('.css') &&\n /\\.(ts|js|tsx|jsx|vue|html|svelte)$/.test(id)\n );\n}\n\n","/**\n * Plugin de AUTO-IMPORT para Vite/Rollup.\n *\n * O usuário escreve apenas `<fx-button>`, `<fx-select>` etc. no template/código;\n * este plugin detecta as tags em tempo de build e injeta os imports dos\n * subpaths correspondentes — mantendo o tree-shaking (só entra no bundle\n * o que é usado).\n *\n * Também cuida dos arquivos com markup: em SFC (`.vue`/`.svelte`) e HTML o import é inserido\n * DENTRO do bloco `<script>` (criado quando o SFC só tem `<template>`), e nos arquivos `.vue`\n * injeta junto `import '@wrrdev/fenix-ui/vue'` (augmentação de tipos do Volar/vue-tsc).\n * Desligue os tipos do Vue com `FenixAutoImport({ vueTypes: false })`.\n *\n * Uso no projeto do cliente (vite.config.ts):\n * import { FenixAutoImport } from '@wrrdev/fenix-ui/auto-import';\n * export default { plugins: [FenixAutoImport()] };\n */\nimport {\n transformSource,\n shouldTransform,\n type AutoImportOptions,\n} from './auto-import';\n\nexport interface FenixPlugin {\n name: string;\n enforce: 'pre';\n transform: (\n code: string,\n id: string,\n ) => { code: string; map: null } | undefined;\n}\n\nexport function FenixAutoImport(options: AutoImportOptions = {}): FenixPlugin {\n return {\n name: 'fenix-ui-auto-import',\n enforce: 'pre',\n transform(code, id) {\n if (!shouldTransform(id)) return undefined;\n // `id` permite os tratamentos de arquivo com markup (SFC Vue/Svelte/HTML).\n const result = transformSource(code, options, id);\n if (result === code) return undefined;\n return { code: result, map: null };\n },\n };\n}\n\nexport { transformSource, shouldTransform, fenixComponentMap } from './auto-import';\nexport type { AutoImportOptions } from './auto-import';\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export * from './core/define';
|
|
|
14
14
|
export * from './core/sanitize';
|
|
15
15
|
export * from './core/types';
|
|
16
16
|
export * from './core/jsx';
|
|
17
|
+
export type * from './icons/types';
|
|
17
18
|
export * from './components/button';
|
|
18
19
|
export * from './components/badge';
|
|
19
20
|
export * from './components/spinner';
|
|
@@ -34,6 +35,7 @@ export * from './components/fileupload';
|
|
|
34
35
|
export * from './components/slider';
|
|
35
36
|
export * from './components/chip';
|
|
36
37
|
export * from './components/avatar';
|
|
38
|
+
export * from './components/icon';
|
|
37
39
|
export * from './components/card';
|
|
38
40
|
export * from './components/breadcrumb';
|
|
39
41
|
export * from './components/popover';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAG3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAG3B,mBAAmB,eAAe,CAAC;AAGnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -26,6 +26,7 @@ import "./components/fileupload/index.js";
|
|
|
26
26
|
import "./components/slider/index.js";
|
|
27
27
|
import "./components/chip/index.js";
|
|
28
28
|
import "./components/avatar/index.js";
|
|
29
|
+
import "./components/icon/index.js";
|
|
29
30
|
import "./components/card/index.js";
|
|
30
31
|
import "./components/breadcrumb/index.js";
|
|
31
32
|
import "./components/popover/index.js";
|
|
@@ -73,6 +74,7 @@ import { FxDropdown, FxDropdownItem } from "./components/dropdown/dropdown.js";
|
|
|
73
74
|
import { FxEmptyState } from "./components/empty-state/empty-state.js";
|
|
74
75
|
import { FxFileUpload } from "./components/fileupload/fileupload.js";
|
|
75
76
|
import { FxFloatlabel } from "./components/floatlabel/floatlabel.js";
|
|
77
|
+
import { FxIcon } from "./components/icon/icon.js";
|
|
76
78
|
import { FxInput } from "./components/input/input.js";
|
|
77
79
|
import { FxKnob } from "./components/knob/knob.js";
|
|
78
80
|
import { FxMenu } from "./components/menu/menu.js";
|
|
@@ -126,6 +128,7 @@ export {
|
|
|
126
128
|
FxEmptyState,
|
|
127
129
|
FxFileUpload,
|
|
128
130
|
FxFloatlabel,
|
|
131
|
+
FxIcon,
|
|
129
132
|
FxInput,
|
|
130
133
|
FxKnob,
|
|
131
134
|
FxMenu,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -4,17 +4,34 @@
|
|
|
4
4
|
* também no build do cliente via plugin.
|
|
5
5
|
*/
|
|
6
6
|
export declare const fenixComponentMap: Record<string, string>;
|
|
7
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* Detecta o uso da biblioteca de ícones por CLASSE (`class="fx-icon fx-icon-home"`).
|
|
9
|
+
*
|
|
10
|
+
* O prefixo `(?:^|[^</\w-])` ignora a TAG `<fx-icon…>` / `</fx-icon>`: o
|
|
11
|
+
* componente carrega o @font-face leve por conta própria e não precisa das
|
|
12
|
+
* ~4.300 regras `.fx-icon-<nome>` que o subpath `/icons` injeta. Também ignora
|
|
13
|
+
* nomes compostos (`meu-fx-icon`), `fx-icons`, `fx-iconHome` etc.
|
|
14
|
+
*/
|
|
8
15
|
export declare const FENIX_ICON_CLASS_RE: RegExp;
|
|
9
16
|
export interface AutoImportOptions {
|
|
10
17
|
/** Prefixo do pacote (padrão '@wrrdev/fenix-ui'). */
|
|
11
18
|
packageName?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Em arquivos `.vue`, injeta também `import '@wrrdev/fenix-ui/vue'` junto com
|
|
21
|
+
* o primeiro componente detectado. É a augmentação que habilita o
|
|
22
|
+
* autocomplete/validação dos atributos `fx-*` no Volar/vue-tsc — sem passo
|
|
23
|
+
* manual no `main.ts`. Padrão: `true`.
|
|
24
|
+
*/
|
|
25
|
+
vueTypes?: boolean;
|
|
12
26
|
}
|
|
13
27
|
/**
|
|
14
28
|
* Injeta `import '<subpath>'` para cada componente fx-* usado no código
|
|
15
29
|
* que ainda não foi importado. Retorna o código transformado ou o original.
|
|
30
|
+
*
|
|
31
|
+
* `id` (caminho do módulo, opcional) habilita os tratamentos de arquivo com
|
|
32
|
+
* markup: injeção dentro do `<script>` e augmentação de tipos do Vue (SFC).
|
|
16
33
|
*/
|
|
17
|
-
export declare function transformSource(code: string, options?: AutoImportOptions): string;
|
|
34
|
+
export declare function transformSource(code: string, options?: AutoImportOptions, id?: string): string;
|
|
18
35
|
/** Verifica se o arquivo deve ser transformado. */
|
|
19
36
|
export declare function shouldTransform(id: string): boolean;
|
|
20
37
|
//# sourceMappingURL=auto-import.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-import.d.ts","sourceRoot":"","sources":["../../src/plugins/auto-import.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"auto-import.d.ts","sourceRoot":"","sources":["../../src/plugins/auto-import.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAuDpD,CAAC;AAIF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,QAA4C,CAAC;AAE7E,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAsDD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,EAC/B,EAAE,SAAK,GACN,MAAM,CA8CR;AAED,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAOnD"}
|
|
@@ -49,34 +49,62 @@ const fenixComponentMap = {
|
|
|
49
49
|
"fx-accordion-panel": "@wrrdev/fenix-ui/accordion",
|
|
50
50
|
"fx-orderlist": "@wrrdev/fenix-ui/orderlist",
|
|
51
51
|
"fx-picklist": "@wrrdev/fenix-ui/picklist",
|
|
52
|
-
"fx-column": "@wrrdev/fenix-ui/table"
|
|
52
|
+
"fx-column": "@wrrdev/fenix-ui/table",
|
|
53
|
+
// Subtags do <fx-table>: usar uma delas isolada já exige o módulo da tabela.
|
|
54
|
+
"fx-cell": "@wrrdev/fenix-ui/table",
|
|
55
|
+
"fx-toolbar": "@wrrdev/fenix-ui/table"
|
|
53
56
|
};
|
|
54
57
|
const TAG_RE = /<(fx-[a-z][a-z-]*)(?=[\s/>])/g;
|
|
55
|
-
const FENIX_ICON_CLASS_RE =
|
|
56
|
-
|
|
58
|
+
const FENIX_ICON_CLASS_RE = /(?:^|[^</\w-])fx-icon(?:-[a-z0-9_]+)*\b/;
|
|
59
|
+
const INLINE_SCRIPT_RE = /<script\b(?![^>]*\bsrc=)[^>]*>/i;
|
|
60
|
+
function isMarkup(id, code) {
|
|
61
|
+
return /\.(vue|svelte|html?)$/i.test(id) || /^\s*<(?:template|script|style|!doctype|html)\b/i.test(code);
|
|
62
|
+
}
|
|
63
|
+
function eolOf(code) {
|
|
64
|
+
return code.includes("\r\n") ? "\r\n" : "\n";
|
|
65
|
+
}
|
|
66
|
+
function injectIntoScriptBlock(code, lines) {
|
|
67
|
+
const open = INLINE_SCRIPT_RE.exec(code);
|
|
68
|
+
if (!open) return null;
|
|
69
|
+
const at = open.index + open[0].length;
|
|
70
|
+
const br = eolOf(code);
|
|
71
|
+
return `${code.slice(0, at)}${br}${lines.join(br)}${code.slice(at)}`;
|
|
72
|
+
}
|
|
73
|
+
function createScriptBlock(code, lines, html) {
|
|
74
|
+
const br = eolOf(code);
|
|
75
|
+
const body = `${br}${lines.join(br)}${br}`;
|
|
76
|
+
if (!html) return `<script>${body}<\/script>${br}${code}`;
|
|
77
|
+
const block = `<script type="module">${body}<\/script>${br}`;
|
|
78
|
+
const bodyAt = code.search(/<\/body\s*>/i);
|
|
79
|
+
if (bodyAt >= 0) return `${code.slice(0, bodyAt)}${block}${code.slice(bodyAt)}`;
|
|
80
|
+
return `${block}${code}`;
|
|
81
|
+
}
|
|
82
|
+
function transformSource(code, options = {}, id = "") {
|
|
57
83
|
const pkg = options.packageName ?? "@wrrdev/fenix-ui";
|
|
58
84
|
const resolve = (sub) => pkg === "@wrrdev/fenix-ui" ? sub : sub.replace("@wrrdev/fenix-ui", pkg);
|
|
85
|
+
const hasImport = (target) => code.includes(`'${target}'`) || code.includes(`"${target}"`);
|
|
59
86
|
const needed = /* @__PURE__ */ new Set();
|
|
60
87
|
for (const m of code.matchAll(TAG_RE)) {
|
|
61
88
|
const sub = fenixComponentMap[m[1]];
|
|
62
|
-
if (sub)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
needed.add(target);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
89
|
+
if (!sub) continue;
|
|
90
|
+
const target = resolve(sub);
|
|
91
|
+
if (!hasImport(target)) needed.add(target);
|
|
68
92
|
}
|
|
69
93
|
const iconsSub = resolve("@wrrdev/fenix-ui/icons");
|
|
70
|
-
if (FENIX_ICON_CLASS_RE.test(code) && !
|
|
94
|
+
if (FENIX_ICON_CLASS_RE.test(code) && !hasImport(iconsSub)) {
|
|
71
95
|
needed.add(iconsSub);
|
|
72
96
|
}
|
|
97
|
+
const markup = isMarkup(id, code);
|
|
98
|
+
const vueSub = resolve("@wrrdev/fenix-ui/vue");
|
|
99
|
+
if (options.vueTypes !== false && /\.vue$/i.test(id) && needed.size > 0 && !hasImport(vueSub)) {
|
|
100
|
+
needed.add(vueSub);
|
|
101
|
+
}
|
|
73
102
|
if (!needed.size) return code;
|
|
74
103
|
const lines = [...needed].map((s) => `import '${s}';`);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
`);
|
|
104
|
+
if (markup) {
|
|
105
|
+
const injected = injectIntoScriptBlock(code, lines);
|
|
106
|
+
if (injected) return injected;
|
|
107
|
+
return createScriptBlock(code, lines, /\.html?$/i.test(id));
|
|
80
108
|
}
|
|
81
109
|
let lastEnd = -1;
|
|
82
110
|
for (const m of code.matchAll(/^[ \t]*import\b[^;]*?['"][^'"]+['"];?[^\S\n]*$/gm)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-import.js","sources":["../../src/plugins/auto-import.ts"],"sourcesContent":["/**\n * Registro de tags → subpaths para o auto-import.\n * Mantido em um módulo próprio (sem depender de DOM) para ser usado\n * também no build do cliente via plugin.\n */\nexport const fenixComponentMap: Record<string, string> = {\n 'fx-button': '@wrrdev/fenix-ui/button',\n 'fx-badge': '@wrrdev/fenix-ui/badge',\n 'fx-spinner': '@wrrdev/fenix-ui/spinner',\n 'fx-select': '@wrrdev/fenix-ui/select',\n 'fx-multiselect': '@wrrdev/fenix-ui/multiselect',\n 'fx-input': '@wrrdev/fenix-ui/input',\n 'fx-switch': '@wrrdev/fenix-ui/switch',\n 'fx-calendar': '@wrrdev/fenix-ui/calendar',\n 'fx-datepicker': '@wrrdev/fenix-ui/datepicker',\n 'fx-checkbox': '@wrrdev/fenix-ui/checkbox',\n 'fx-radio': '@wrrdev/fenix-ui/radio',\n 'fx-table': '@wrrdev/fenix-ui/table',\n 'fx-floatlabel': '@wrrdev/fenix-ui/floatlabel',\n 'fx-textarea': '@wrrdev/fenix-ui/textarea',\n 'fx-dialog': '@wrrdev/fenix-ui/dialog',\n 'fx-confirmpopup': '@wrrdev/fenix-ui/confirmpopup',\n 'fx-fileupload': '@wrrdev/fenix-ui/fileupload',\n 'fx-slider': '@wrrdev/fenix-ui/slider',\n 'fx-chip': '@wrrdev/fenix-ui/chip',\n 'fx-avatar': '@wrrdev/fenix-ui/avatar',\n 'fx-icon': '@wrrdev/fenix-ui/icon',\n 'fx-card': '@wrrdev/fenix-ui/card',\n 'fx-breadcrumb': '@wrrdev/fenix-ui/breadcrumb',\n 'fx-popover': '@wrrdev/fenix-ui/popover',\n 'fx-stepper': '@wrrdev/fenix-ui/stepper',\n 'fx-rating': '@wrrdev/fenix-ui/rating',\n 'fx-menu': '@wrrdev/fenix-ui/menu',\n 'fx-toggle-button-group': '@wrrdev/fenix-ui/toggle-button-group',\n 'fx-empty-state': '@wrrdev/fenix-ui/empty-state',\n 'fx-password-strength': '@wrrdev/fenix-ui/password-strength',\n 'fx-timeline': '@wrrdev/fenix-ui/timeline',\n 'fx-carousel': '@wrrdev/fenix-ui/carousel',\n 'fx-tree': '@wrrdev/fenix-ui/tree',\n 'fx-drawer': '@wrrdev/fenix-ui/drawer',\n 'fx-toast': '@wrrdev/fenix-ui/toast',\n 'fx-tooltip': '@wrrdev/fenix-ui/tooltip',\n 'fx-tabs': '@wrrdev/fenix-ui/tabs',\n 'fx-tab-panel': '@wrrdev/fenix-ui/tabs',\n 'fx-progress': '@wrrdev/fenix-ui/progress',\n 'fx-skeleton': '@wrrdev/fenix-ui/skeleton',\n 'fx-alert': '@wrrdev/fenix-ui/alert',\n 'fx-dropdown': '@wrrdev/fenix-ui/dropdown',\n 'fx-dropdown-item': '@wrrdev/fenix-ui/dropdown',\n 'fx-pagination': '@wrrdev/fenix-ui/pagination',\n 'fx-autocomplete': '@wrrdev/fenix-ui/autocomplete',\n 'fx-knob': '@wrrdev/fenix-ui/knob',\n 'fx-accordion': '@wrrdev/fenix-ui/accordion',\n 'fx-accordion-panel': '@wrrdev/fenix-ui/accordion',\n 'fx-orderlist': '@wrrdev/fenix-ui/orderlist',\n 'fx-picklist': '@wrrdev/fenix-ui/picklist',\n 'fx-column': '@wrrdev/fenix-ui/table',\n};\n\nconst TAG_RE = /<(fx-[a-z][a-z-]*)(?=[\\s/>])/g;\n\n/** Detecta uso da biblioteca de ícones por classe (fx-icon / fx-icon-home etc.). */\nexport const FENIX_ICON_CLASS_RE = /\\bfx-icon(?:-[a-z0-9_]+)*\\b/;\n\nexport interface AutoImportOptions {\n /** Prefixo do pacote (padrão '@wrrdev/fenix-ui'). */\n packageName?: string;\n}\n\n/**\n * Injeta `import '<subpath>'` para cada componente fx-* usado no código\n * que ainda não foi importado. Retorna o código transformado ou o original.\n */\nexport function transformSource(code: string, options: AutoImportOptions = {}): string {\n const pkg = options.packageName ?? '@wrrdev/fenix-ui';\n // Subpaths do mapa são reescritos quando um pacote custom é informado.\n const resolve = (sub: string): string =>\n pkg === '@wrrdev/fenix-ui' ? sub : sub.replace('@wrrdev/fenix-ui', pkg);\n\n // Componentes usados e ainda não importados explicitamente.\n const needed = new Set<string>();\n for (const m of code.matchAll(TAG_RE)) {\n const sub = fenixComponentMap[m[1]];\n if (sub) {\n const target = resolve(sub);\n if (!code.includes(`'${target}'`) && !code.includes(`\"${target}\"`)) {\n needed.add(target);\n }\n }\n }\n // Biblioteca de ícones: classes fx-icon / fx-icon-<nome> injetam o subpath /icons.\n const iconsSub = resolve('@wrrdev/fenix-ui/icons');\n if (FENIX_ICON_CLASS_RE.test(code) && !code.includes(`'${iconsSub}'`) && !code.includes(`\"${iconsSub}\"`)) {\n needed.add(iconsSub);\n }\n if (!needed.size) return code;\n\n const lines = [...needed].map((s) => `import '${s}';`);\n\n // Arquivo único (.vue): injeta logo após a abertura do <script>.\n const vueScript = /(<script[^>]*>)\\n/.exec(code);\n if (vueScript) {\n return code.replace(vueScript[0], `${vueScript[1]}\\n${lines.join('\\n')}\\n`);\n }\n\n // TS/JS: injeta após o último import existente (ou no topo).\n let lastEnd = -1;\n for (const m of code.matchAll(/^[ \\t]*import\\b[^;]*?['\"][^'\"]+['\"];?[^\\S\\n]*$/gm)) {\n lastEnd = Math.max(lastEnd, m.index + m[0].length);\n }\n if (lastEnd === -1) return `${lines.join('\\n')}\\n${code}`;\n return `${code.slice(0, lastEnd)}\\n${lines.join('\\n')}${code.slice(lastEnd)}`;\n}\n\n/** Verifica se o arquivo deve ser transformado. */\nexport function shouldTransform(id: string): boolean {\n return (\n !id.includes('node_modules') &&\n !id.endsWith('.d.ts') &&\n !id.endsWith('.css') &&\n /\\.(ts|js|tsx|jsx|vue|html|svelte)$/.test(id)\n );\n}\n\n"],"names":[],"mappings":"AAKO,MAAM,oBAA4C;AAAA,EACvD,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AAAA,EACb,WAAW;AAAA,EACX,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,WAAW;AAAA,EACX,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,aAAa;AACf;AAEA,MAAM,SAAS;AAGR,MAAM,sBAAsB;AAW5B,SAAS,gBAAgB,MAAc,UAA6B,IAAY;AACrF,QAAM,MAAM,QAAQ,eAAe;AAEnC,QAAM,UAAU,CAAC,QACf,QAAQ,qBAAqB,MAAM,IAAI,QAAQ,oBAAoB,GAAG;AAGxE,QAAM,6BAAa,IAAA;AACnB,aAAW,KAAK,KAAK,SAAS,MAAM,GAAG;AACrC,UAAM,MAAM,kBAAkB,EAAE,CAAC,CAAC;AAClC,QAAI,KAAK;AACP,YAAM,SAAS,QAAQ,GAAG;AAC1B,UAAI,CAAC,KAAK,SAAS,IAAI,MAAM,GAAG,KAAK,CAAC,KAAK,SAAS,IAAI,MAAM,GAAG,GAAG;AAClE,eAAO,IAAI,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,QAAQ,wBAAwB;AACjD,MAAI,oBAAoB,KAAK,IAAI,KAAK,CAAC,KAAK,SAAS,IAAI,QAAQ,GAAG,KAAK,CAAC,KAAK,SAAS,IAAI,QAAQ,GAAG,GAAG;AACxG,WAAO,IAAI,QAAQ;AAAA,EACrB;AACA,MAAI,CAAC,OAAO,KAAM,QAAO;AAEzB,QAAM,QAAQ,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,WAAW,CAAC,IAAI;AAGrD,QAAM,YAAY,oBAAoB,KAAK,IAAI;AAC/C,MAAI,WAAW;AACb,WAAO,KAAK,QAAQ,UAAU,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC;AAAA,EAAK,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EAC5E;AAGA,MAAI,UAAU;AACd,aAAW,KAAK,KAAK,SAAS,kDAAkD,GAAG;AACjF,cAAU,KAAK,IAAI,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM;AAAA,EACnD;AACA,MAAI,YAAY,GAAI,QAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,EAAK,IAAI;AACvD,SAAO,GAAG,KAAK,MAAM,GAAG,OAAO,CAAC;AAAA,EAAK,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;AAC7E;AAGO,SAAS,gBAAgB,IAAqB;AACnD,SACE,CAAC,GAAG,SAAS,cAAc,KAC3B,CAAC,GAAG,SAAS,OAAO,KACpB,CAAC,GAAG,SAAS,MAAM,KACnB,qCAAqC,KAAK,EAAE;AAEhD;"}
|
|
1
|
+
{"version":3,"file":"auto-import.js","sources":["../../src/plugins/auto-import.ts"],"sourcesContent":["/**\n * Registro de tags → subpaths para o auto-import.\n * Mantido em um módulo próprio (sem depender de DOM) para ser usado\n * também no build do cliente via plugin.\n */\nexport const fenixComponentMap: Record<string, string> = {\n 'fx-button': '@wrrdev/fenix-ui/button',\n 'fx-badge': '@wrrdev/fenix-ui/badge',\n 'fx-spinner': '@wrrdev/fenix-ui/spinner',\n 'fx-select': '@wrrdev/fenix-ui/select',\n 'fx-multiselect': '@wrrdev/fenix-ui/multiselect',\n 'fx-input': '@wrrdev/fenix-ui/input',\n 'fx-switch': '@wrrdev/fenix-ui/switch',\n 'fx-calendar': '@wrrdev/fenix-ui/calendar',\n 'fx-datepicker': '@wrrdev/fenix-ui/datepicker',\n 'fx-checkbox': '@wrrdev/fenix-ui/checkbox',\n 'fx-radio': '@wrrdev/fenix-ui/radio',\n 'fx-table': '@wrrdev/fenix-ui/table',\n 'fx-floatlabel': '@wrrdev/fenix-ui/floatlabel',\n 'fx-textarea': '@wrrdev/fenix-ui/textarea',\n 'fx-dialog': '@wrrdev/fenix-ui/dialog',\n 'fx-confirmpopup': '@wrrdev/fenix-ui/confirmpopup',\n 'fx-fileupload': '@wrrdev/fenix-ui/fileupload',\n 'fx-slider': '@wrrdev/fenix-ui/slider',\n 'fx-chip': '@wrrdev/fenix-ui/chip',\n 'fx-avatar': '@wrrdev/fenix-ui/avatar',\n 'fx-icon': '@wrrdev/fenix-ui/icon',\n 'fx-card': '@wrrdev/fenix-ui/card',\n 'fx-breadcrumb': '@wrrdev/fenix-ui/breadcrumb',\n 'fx-popover': '@wrrdev/fenix-ui/popover',\n 'fx-stepper': '@wrrdev/fenix-ui/stepper',\n 'fx-rating': '@wrrdev/fenix-ui/rating',\n 'fx-menu': '@wrrdev/fenix-ui/menu',\n 'fx-toggle-button-group': '@wrrdev/fenix-ui/toggle-button-group',\n 'fx-empty-state': '@wrrdev/fenix-ui/empty-state',\n 'fx-password-strength': '@wrrdev/fenix-ui/password-strength',\n 'fx-timeline': '@wrrdev/fenix-ui/timeline',\n 'fx-carousel': '@wrrdev/fenix-ui/carousel',\n 'fx-tree': '@wrrdev/fenix-ui/tree',\n 'fx-drawer': '@wrrdev/fenix-ui/drawer',\n 'fx-toast': '@wrrdev/fenix-ui/toast',\n 'fx-tooltip': '@wrrdev/fenix-ui/tooltip',\n 'fx-tabs': '@wrrdev/fenix-ui/tabs',\n 'fx-tab-panel': '@wrrdev/fenix-ui/tabs',\n 'fx-progress': '@wrrdev/fenix-ui/progress',\n 'fx-skeleton': '@wrrdev/fenix-ui/skeleton',\n 'fx-alert': '@wrrdev/fenix-ui/alert',\n 'fx-dropdown': '@wrrdev/fenix-ui/dropdown',\n 'fx-dropdown-item': '@wrrdev/fenix-ui/dropdown',\n 'fx-pagination': '@wrrdev/fenix-ui/pagination',\n 'fx-autocomplete': '@wrrdev/fenix-ui/autocomplete',\n 'fx-knob': '@wrrdev/fenix-ui/knob',\n 'fx-accordion': '@wrrdev/fenix-ui/accordion',\n 'fx-accordion-panel': '@wrrdev/fenix-ui/accordion',\n 'fx-orderlist': '@wrrdev/fenix-ui/orderlist',\n 'fx-picklist': '@wrrdev/fenix-ui/picklist',\n 'fx-column': '@wrrdev/fenix-ui/table',\n // Subtags do <fx-table>: usar uma delas isolada já exige o módulo da tabela.\n 'fx-cell': '@wrrdev/fenix-ui/table',\n 'fx-toolbar': '@wrrdev/fenix-ui/table',\n};\n\nconst TAG_RE = /<(fx-[a-z][a-z-]*)(?=[\\s/>])/g;\n\n/**\n * Detecta o uso da biblioteca de ícones por CLASSE (`class=\"fx-icon fx-icon-home\"`).\n *\n * O prefixo `(?:^|[^</\\w-])` ignora a TAG `<fx-icon…>` / `</fx-icon>`: o\n * componente carrega o @font-face leve por conta própria e não precisa das\n * ~4.300 regras `.fx-icon-<nome>` que o subpath `/icons` injeta. Também ignora\n * nomes compostos (`meu-fx-icon`), `fx-icons`, `fx-iconHome` etc.\n */\nexport const FENIX_ICON_CLASS_RE = /(?:^|[^</\\w-])fx-icon(?:-[a-z0-9_]+)*\\b/;\n\nexport interface AutoImportOptions {\n /** Prefixo do pacote (padrão '@wrrdev/fenix-ui'). */\n packageName?: string;\n /**\n * Em arquivos `.vue`, injeta também `import '@wrrdev/fenix-ui/vue'` junto com\n * o primeiro componente detectado. É a augmentação que habilita o\n * autocomplete/validação dos atributos `fx-*` no Volar/vue-tsc — sem passo\n * manual no `main.ts`. Padrão: `true`.\n */\n vueTypes?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Injeção em arquivos com markup (SFC Vue/Svelte e HTML) */\n/* ------------------------------------------------------------------ */\n\n/** Bloco `<script>` INLINE (sem `src=`) — é dentro dele que o import entra. */\nconst INLINE_SCRIPT_RE = /<script\\b(?![^>]*\\bsrc=)[^>]*>/i;\n\n/** Arquivo com markup (SFC Vue/Svelte ou HTML) — detectado pelo id ou conteúdo. */\nfunction isMarkup(id: string, code: string): boolean {\n return (\n /\\.(vue|svelte|html?)$/i.test(id) ||\n /^\\s*<(?:template|script|style|!doctype|html)\\b/i.test(code)\n );\n}\n\n/** Quebra de linha do arquivo — preserva o CRLF de projetos Windows. */\nfunction eolOf(code: string): string {\n return code.includes('\\r\\n') ? '\\r\\n' : '\\n';\n}\n\n/**\n * Injeta os imports como primeira linha do bloco `<script>`.\n *\n * Tolerante a CRLF e a conteúdo na mesma linha da tag (`<script setup>const a=1`)\n * — a versão antiga exigia `>\\n` e, no Windows, colava os imports FORA do\n * `<script>`, onde o compilador de SFC os descarta (componente nunca registrado).\n */\nfunction injectIntoScriptBlock(code: string, lines: string[]): string | null {\n const open = INLINE_SCRIPT_RE.exec(code);\n if (!open) return null;\n const at = open.index + open[0].length;\n const br = eolOf(code);\n return `${code.slice(0, at)}${br}${lines.join(br)}${code.slice(at)}`;\n}\n\n/**\n * Cria o bloco `<script>` quando o arquivo não tem nenhum.\n *\n * Um `import` fora de `<script>` é descartado pelo compilador de SFC — este é o\n * único fallback válido para um `.vue`/`.svelte` que só tem `<template>`.\n */\nfunction createScriptBlock(code: string, lines: string[], html: boolean): string {\n const br = eolOf(code);\n const body = `${br}${lines.join(br)}${br}`;\n if (!html) return `<script>${body}</script>${br}${code}`;\n // HTML: `<script type=\"module\">` inline (o Vite transforma) antes do </body>.\n const block = `<script type=\"module\">${body}</script>${br}`;\n const bodyAt = code.search(/<\\/body\\s*>/i);\n if (bodyAt >= 0) return `${code.slice(0, bodyAt)}${block}${code.slice(bodyAt)}`;\n return `${block}${code}`;\n}\n\n/**\n * Injeta `import '<subpath>'` para cada componente fx-* usado no código\n * que ainda não foi importado. Retorna o código transformado ou o original.\n *\n * `id` (caminho do módulo, opcional) habilita os tratamentos de arquivo com\n * markup: injeção dentro do `<script>` e augmentação de tipos do Vue (SFC).\n */\nexport function transformSource(\n code: string,\n options: AutoImportOptions = {},\n id = '',\n): string {\n const pkg = options.packageName ?? '@wrrdev/fenix-ui';\n // Subpaths do mapa são reescritos quando um pacote custom é informado.\n const resolve = (sub: string): string =>\n pkg === '@wrrdev/fenix-ui' ? sub : sub.replace('@wrrdev/fenix-ui', pkg);\n const hasImport = (target: string): boolean =>\n code.includes(`'${target}'`) || code.includes(`\"${target}\"`);\n\n // Componentes usados e ainda não importados explicitamente.\n const needed = new Set<string>();\n for (const m of code.matchAll(TAG_RE)) {\n const sub = fenixComponentMap[m[1]];\n if (!sub) continue;\n const target = resolve(sub);\n if (!hasImport(target)) needed.add(target);\n }\n // Biblioteca de ícones: classes fx-icon / fx-icon-<nome> injetam o subpath /icons.\n const iconsSub = resolve('@wrrdev/fenix-ui/icons');\n if (FENIX_ICON_CLASS_RE.test(code) && !hasImport(iconsSub)) {\n needed.add(iconsSub);\n }\n\n const markup = isMarkup(id, code);\n // Vue (SFC): a augmentação de tipos entra junto do primeiro import injetado.\n const vueSub = resolve('@wrrdev/fenix-ui/vue');\n if (options.vueTypes !== false && /\\.vue$/i.test(id) && needed.size > 0 && !hasImport(vueSub)) {\n needed.add(vueSub);\n }\n if (!needed.size) return code;\n\n const lines = [...needed].map((s) => `import '${s}';`);\n\n // SFC (Vue/Svelte) e HTML: o import precisa ficar DENTRO de um <script>.\n if (markup) {\n const injected = injectIntoScriptBlock(code, lines);\n if (injected) return injected;\n return createScriptBlock(code, lines, /\\.html?$/i.test(id));\n }\n\n // TS/JS: injeta após o último import existente (ou no topo).\n let lastEnd = -1;\n for (const m of code.matchAll(/^[ \\t]*import\\b[^;]*?['\"][^'\"]+['\"];?[^\\S\\n]*$/gm)) {\n lastEnd = Math.max(lastEnd, m.index + m[0].length);\n }\n if (lastEnd === -1) return `${lines.join('\\n')}\\n${code}`;\n return `${code.slice(0, lastEnd)}\\n${lines.join('\\n')}${code.slice(lastEnd)}`;\n}\n\n/** Verifica se o arquivo deve ser transformado. */\nexport function shouldTransform(id: string): boolean {\n return (\n !id.includes('node_modules') &&\n !id.endsWith('.d.ts') &&\n !id.endsWith('.css') &&\n /\\.(ts|js|tsx|jsx|vue|html|svelte)$/.test(id)\n );\n}\n\n"],"names":[],"mappings":"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"}
|
package/dist/plugins/index.d.ts
CHANGED
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
* subpaths correspondentes — mantendo o tree-shaking (só entra no bundle
|
|
7
7
|
* o que é usado).
|
|
8
8
|
*
|
|
9
|
+
* Também cuida dos arquivos com markup: em SFC (`.vue`/`.svelte`) e HTML o import é inserido
|
|
10
|
+
* DENTRO do bloco `<script>` (criado quando o SFC só tem `<template>`), e nos arquivos `.vue`
|
|
11
|
+
* injeta junto `import '@wrrdev/fenix-ui/vue'` (augmentação de tipos do Volar/vue-tsc).
|
|
12
|
+
* Desligue os tipos do Vue com `FenixAutoImport({ vueTypes: false })`.
|
|
13
|
+
*
|
|
9
14
|
* Uso no projeto do cliente (vite.config.ts):
|
|
10
15
|
* import { FenixAutoImport } from '@wrrdev/fenix-ui/auto-import';
|
|
11
16
|
* export default { plugins: [FenixAutoImport()] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,KAAK,CAAC;IACf,SAAS,EAAE,CACT,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,KACP;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,IAAI,CAAA;KAAE,GAAG,SAAS,CAAC;CAC9C;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,iBAAsB,GAAG,WAAW,CAY5E;AAED,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpF,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/plugins/index.js
CHANGED
|
@@ -6,7 +6,7 @@ function FenixAutoImport(options = {}) {
|
|
|
6
6
|
enforce: "pre",
|
|
7
7
|
transform(code, id) {
|
|
8
8
|
if (!shouldTransform(id)) return void 0;
|
|
9
|
-
const result = transformSource(code, options);
|
|
9
|
+
const result = transformSource(code, options, id);
|
|
10
10
|
if (result === code) return void 0;
|
|
11
11
|
return { code: result, map: null };
|
|
12
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/plugins/index.ts"],"sourcesContent":["/**\n * Plugin de AUTO-IMPORT para Vite/Rollup.\n *\n * O usuário escreve apenas `<fx-button>`, `<fx-select>` etc. no template/código;\n * este plugin detecta as tags em tempo de build e injeta os imports dos\n * subpaths correspondentes — mantendo o tree-shaking (só entra no bundle\n * o que é usado).\n *\n * Uso no projeto do cliente (vite.config.ts):\n * import { FenixAutoImport } from '@wrrdev/fenix-ui/auto-import';\n * export default { plugins: [FenixAutoImport()] };\n */\nimport {\n transformSource,\n shouldTransform,\n type AutoImportOptions,\n} from './auto-import';\n\nexport interface FenixPlugin {\n name: string;\n enforce: 'pre';\n transform: (\n code: string,\n id: string,\n ) => { code: string; map: null } | undefined;\n}\n\nexport function FenixAutoImport(options: AutoImportOptions = {}): FenixPlugin {\n return {\n name: 'fenix-ui-auto-import',\n enforce: 'pre',\n transform(code, id) {\n if (!shouldTransform(id)) return undefined;\n const result = transformSource(code, options);\n if (result === code) return undefined;\n return { code: result, map: null };\n },\n };\n}\n\nexport { transformSource, shouldTransform, fenixComponentMap } from './auto-import';\nexport type { AutoImportOptions } from './auto-import';\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/plugins/index.ts"],"sourcesContent":["/**\n * Plugin de AUTO-IMPORT para Vite/Rollup.\n *\n * O usuário escreve apenas `<fx-button>`, `<fx-select>` etc. no template/código;\n * este plugin detecta as tags em tempo de build e injeta os imports dos\n * subpaths correspondentes — mantendo o tree-shaking (só entra no bundle\n * o que é usado).\n *\n * Também cuida dos arquivos com markup: em SFC (`.vue`/`.svelte`) e HTML o import é inserido\n * DENTRO do bloco `<script>` (criado quando o SFC só tem `<template>`), e nos arquivos `.vue`\n * injeta junto `import '@wrrdev/fenix-ui/vue'` (augmentação de tipos do Volar/vue-tsc).\n * Desligue os tipos do Vue com `FenixAutoImport({ vueTypes: false })`.\n *\n * Uso no projeto do cliente (vite.config.ts):\n * import { FenixAutoImport } from '@wrrdev/fenix-ui/auto-import';\n * export default { plugins: [FenixAutoImport()] };\n */\nimport {\n transformSource,\n shouldTransform,\n type AutoImportOptions,\n} from './auto-import';\n\nexport interface FenixPlugin {\n name: string;\n enforce: 'pre';\n transform: (\n code: string,\n id: string,\n ) => { code: string; map: null } | undefined;\n}\n\nexport function FenixAutoImport(options: AutoImportOptions = {}): FenixPlugin {\n return {\n name: 'fenix-ui-auto-import',\n enforce: 'pre',\n transform(code, id) {\n if (!shouldTransform(id)) return undefined;\n // `id` permite os tratamentos de arquivo com markup (SFC Vue/Svelte/HTML).\n const result = transformSource(code, options, id);\n if (result === code) return undefined;\n return { code: result, map: null };\n },\n };\n}\n\nexport { transformSource, shouldTransform, fenixComponentMap } from './auto-import';\nexport type { AutoImportOptions } from './auto-import';\n"],"names":[],"mappings":";;AAgCO,SAAS,gBAAgB,UAA6B,IAAiB;AAC5E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU,MAAM,IAAI;AAClB,UAAI,CAAC,gBAAgB,EAAE,EAAG,QAAO;AAEjC,YAAM,SAAS,gBAAgB,MAAM,SAAS,EAAE;AAChD,UAAI,WAAW,KAAM,QAAO;AAC5B,aAAO,EAAE,MAAM,QAAQ,KAAK,KAAA;AAAA,IAC9B;AAAA,EAAA;AAEJ;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wrrdev/fenix-ui",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.9",
|
|
4
4
|
"description": "FenixUI Design System Web nativo (Web Components + Shadow DOM + Design Tokens) com tree-shaking por componente.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "ISC",
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
"UX",
|
|
18
18
|
"Componentes",
|
|
19
19
|
"Fenix",
|
|
20
|
-
"FenixUI"
|
|
20
|
+
"FenixUI",
|
|
21
|
+
"Web Componentes"
|
|
21
22
|
],
|
|
22
23
|
"files": [
|
|
23
24
|
"dist",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base-css-Be_r8aTo.js","sources":["../../src/core/sanitize.ts","../../src/icons/base-css.ts"],"sourcesContent":["/**\n * Sanitização de strings para injeção segura em HTML.\n *\n * Previne XSS ao escapar caracteres especiais antes de usar innerHTML.\n * Use SEMPRE que dados externos (API, usuário) forem injetados no DOM.\n */\n\n/** Caracteres que devem ser escapados para prevenir XSS. */\nconst HTML_ENTITIES: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/',\n '`': '`',\n '=': '=',\n};\n\n/** Regex que captura todos os caracteres perigosos. */\nconst SANITIZE_REGEX = /[&<>\"'`=/]/g;\n\n/**\n * Escapa caracteres especiais de HTML para prevenir XSS.\n *\n * @param value - Valor a ser escapado (convertido para string)\n * @returns String segura para innerHTML\n *\n * @example\n * // Seguro contra XSS\n * const userInput = '<img src=x onerror=alert(1)>';\n * element.innerHTML = `<div>${esc(userInput)}</div>`;\n * // Resultado: <img src=x onerror=alert(1)>\n */\nexport function esc(value: unknown): string {\n if (value == null) return '';\n return String(value).replace(SANITIZE_REGEX, (char) => HTML_ENTITIES[char] || char);\n}\n\n/**\n * Remove todas as tags HTML da string (strip tags).\n * Use quando quiser apenas texto puro, sem nenhuma marcação.\n *\n * @param html - String potencialmente contendo HTML\n * @returns String sem tags HTML\n */\nexport function stripTags(html: string): string {\n return html.replace(/<[^>]*>/g, '');\n}\n\n/**\n * Sanitiza um objeto de dados recursivamente.\n * Útil para sanitizar arrays de registros antes de renderizar.\n *\n * @param data - Objeto ou array a ser sanitizado\n * @returns Cópia sanitizada do objeto\n */\nexport function sanitizeData<T>(data: T): T {\n if (data == null) return data;\n if (typeof data === 'string') return esc(data) as unknown as T;\n if (Array.isArray(data)) return data.map(sanitizeData) as unknown as T;\n if (typeof data === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n result[key] = sanitizeData(value);\n }\n return result as T;\n }\n return data;\n}\n","/**\n * CSS base da biblioteca de ícones — módulo LEVE (não importa a lista de nomes\n * nem dispara o carregamento da fonte). Usado dentro dos Shadow DOMs dos\n * componentes que suportam o atributo `icon`.\n *\n * O @font-face em si é injetado no <head> por `@wrrdev/fenix-ui/icons`\n * (ver ./index.ts) — @font-face registrado no documento também se aplica\n * dentro dos Shadow DOMs.\n */\n\nimport { esc } from '../core/sanitize';\n\n/** Nome da família de fontes dos ícones (self-hosted, sem dependência externa). */\nexport const FENIX_ICON_FONT_FAMILY = 'Fenix Icons';\n\n/** Família configurável via CSS custom property (fallback para o nome padrão). */\nexport const FENIX_ICON_FONT_VAR = `var(--fx-icon-font, ${FENIX_ICON_FONT_FAMILY})`;\n\n/**\n * Regras da classe `.fx-icon` para uso DENTRO de Shadow DOM\n * (concatene às `static styles` do componente).\n */\nexport const FENIX_ICON_BASE_CSS = `\n.fx-icon {\n font-family: ${FENIX_ICON_FONT_VAR};\n font-weight: normal;\n font-style: normal;\n line-height: 1;\n letter-spacing: normal;\n text-transform: none;\n display: inline-block;\n white-space: nowrap;\n word-wrap: normal;\n direction: ltr;\n font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n user-select: none;\n}\n.fx-icon.fx-icon-fill { font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24; }\n.fx-icon.fx-icon-bold { font-variation-settings: 'FILL' 0, 'wght' 600, 'GRAD' 0, 'opsz' 24; }\n`;\n\n/** Verifica se o valor parece um nome de ícone da Fenix Icons (e não emoji/texto livre). */\nexport function isFenixIconName(value: string): boolean {\n return /^[a-z][a-z0-9_]*$/.test(value.trim());\n}\n\n/**\n * HTML do ícone para uso DENTRO de Shadow DOM (concatenar ao template).\n *\n * - Nome válido da Fenix Icons (ex.: `home`) → glifo via LIGADURA: o nome\n * vira o conteúdo de texto do elemento com a font-family de ícones.\n * Isso é obrigatório dentro de Shadow DOM: as regras\n * `.fx-icon-<nome>::before` são injetadas no <head> do documento e NÃO\n * atravessam a fronteira do shadow root (apenas o @font-face vale\n * dentro dele) — a classe vazia renderizaria um elemento sem glifo.\n * - Qualquer outro valor (emoji, texto) → texto puro escapado.\n *\n * A classe base `.fx-icon` é fornecida por `FENIX_ICON_BASE_CSS`\n * (concatenada às `static styles` do componente); o @font-face vem do\n * `@wrrdev/fenix-ui/icons` (injetado no <head>).\n */\nexport function fenixIconHtml(icon: string): string {\n const value = (icon ?? '').trim();\n if (!value) return '';\n if (isFenixIconName(value)) {\n return `<i class=\"fx-icon\" aria-hidden=\"true\">${value}</i>`;\n }\n return `<span aria-hidden=\"true\">${esc(value)}</span>`;\n}\n"],"names":[],"mappings":"AAQA,MAAM,gBAAwC;AAAA,EAC5C,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAGA,MAAM,iBAAiB;AAchB,SAAS,IAAI,OAAwB;AAC1C,MAAI,SAAS,KAAM,QAAO;AAC1B,SAAO,OAAO,KAAK,EAAE,QAAQ,gBAAgB,CAAC,SAAS,cAAc,IAAI,KAAK,IAAI;AACpF;AASO,SAAS,UAAU,MAAsB;AAC9C,SAAO,KAAK,QAAQ,YAAY,EAAE;AACpC;AASO,SAAS,aAAgB,MAAY;AAC1C,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI,OAAO,SAAS,SAAU,QAAO,IAAI,IAAI;AAC7C,MAAI,MAAM,QAAQ,IAAI,EAAG,QAAO,KAAK,IAAI,YAAY;AACrD,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,SAAkC,CAAA;AACxC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAA+B,GAAG;AAC1E,aAAO,GAAG,IAAI,aAAa,KAAK;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;ACxDO,MAAM,yBAAyB;AAG/B,MAAM,sBAAsB,uBAAuB,sBAAsB;AAMzE,MAAM,sBAAsB;AAAA;AAAA,iBAElB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoB7B,SAAS,gBAAgB,OAAwB;AACtD,SAAO,oBAAoB,KAAK,MAAM,KAAA,CAAM;AAC9C;AAiBO,SAAS,cAAc,MAAsB;AAClD,QAAM,SAAS,QAAQ,IAAI,KAAA;AAC3B,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,gBAAgB,KAAK,GAAG;AAC1B,WAAO,yCAAyC,KAAK;AAAA,EACvD;AACA,SAAO,4BAA4B,IAAI,KAAK,CAAC;AAC/C;"}
|