@solar-icons/codemod 2.1.0 → 2.2.1

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.
Files changed (39) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +1 -0
  2. package/dist/cli.d.mts +2 -3
  3. package/dist/cli.mjs +1 -1
  4. package/dist/detect.d.mts +2 -3
  5. package/dist/icon-renames.d.mts +3 -4
  6. package/dist/import-bindings.mjs +1 -1
  7. package/dist/node_modules/.pnpm/buffer-from@1.1.2/node_modules/buffer-from/index.mjs +1 -0
  8. package/dist/node_modules/.pnpm/source-map-support@0.5.21/node_modules/source-map-support/source-map-support.mjs +4 -0
  9. package/dist/node_modules/.pnpm/source-map@0.6.1/node_modules/source-map/lib/array-set.mjs +1 -0
  10. package/dist/node_modules/.pnpm/source-map@0.6.1/node_modules/source-map/lib/base64-vlq.mjs +1 -0
  11. package/dist/node_modules/.pnpm/source-map@0.6.1/node_modules/source-map/lib/base64.mjs +1 -0
  12. package/dist/node_modules/.pnpm/source-map@0.6.1/node_modules/source-map/lib/binary-search.mjs +1 -0
  13. package/dist/node_modules/.pnpm/source-map@0.6.1/node_modules/source-map/lib/mapping-list.mjs +1 -0
  14. package/dist/node_modules/.pnpm/source-map@0.6.1/node_modules/source-map/lib/quick-sort.mjs +1 -0
  15. package/dist/node_modules/.pnpm/source-map@0.6.1/node_modules/source-map/lib/source-map-consumer.mjs +1 -0
  16. package/dist/node_modules/.pnpm/source-map@0.6.1/node_modules/source-map/lib/source-map-generator.mjs +1 -0
  17. package/dist/node_modules/.pnpm/source-map@0.6.1/node_modules/source-map/lib/source-node.mjs +1 -0
  18. package/dist/node_modules/.pnpm/source-map@0.6.1/node_modules/source-map/lib/util.mjs +1 -0
  19. package/dist/node_modules/.pnpm/source-map@0.6.1/node_modules/source-map/source-map.mjs +1 -0
  20. package/dist/node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/typescript.mjs +448 -0
  21. package/dist/package-json.d.mts +2 -3
  22. package/dist/transforms/angular.d.mts +2 -3
  23. package/dist/transforms/angular.mjs +1 -1
  24. package/dist/transforms/nuxt.d.mts +2 -3
  25. package/dist/transforms/nuxt.mjs +1 -1
  26. package/dist/transforms/react-native.d.mts +2 -3
  27. package/dist/transforms/react-native.mjs +2 -2
  28. package/dist/transforms/react-perf.d.mts +2 -3
  29. package/dist/transforms/react-perf.mjs +1 -1
  30. package/dist/transforms/react.d.mts +2 -3
  31. package/dist/transforms/react.mjs +2 -2
  32. package/dist/transforms/solid.d.mts +2 -3
  33. package/dist/transforms/solid.mjs +4 -4
  34. package/dist/transforms/svelte.d.mts +2 -3
  35. package/dist/transforms/svelte.mjs +3 -3
  36. package/dist/transforms/vue.d.mts +2 -3
  37. package/dist/transforms/vue.mjs +3 -3
  38. package/dist/types.d.mts +7 -8
  39. package/package.json +9 -9
@@ -1,6 +1,5 @@
1
1
  import { TransformResult } from "./types.mjs";
2
2
  //#region src/package-json.d.ts
3
3
  /** Updates supported Solar Icons v1 dependencies to the requested v2 version. */
4
- declare function transformPackageJson(source: string, targetVersion?: string): TransformResult;
5
- //#endregion
6
- export { transformPackageJson };
4
+ export declare function transformPackageJson(source: string, targetVersion?: string): TransformResult;
5
+ //#endregion
@@ -1,6 +1,5 @@
1
1
  import { TransformResult } from "../types.mjs";
2
2
  //#region src/transforms/angular.d.ts
3
3
  /** Migrates Angular v1 icon imports and deterministic inline-template selectors. */
4
- declare function transformAngular(source: string, fileName?: string, existingFiles?: Set<string>): TransformResult;
5
- //#endregion
6
- export { transformAngular };
4
+ export declare function transformAngular(source: string, fileName?: string, existingFiles?: Set<string>): TransformResult;
5
+ //#endregion
@@ -1 +1 @@
1
- import{renameIcon as e}from"../icon-renames.mjs";import{resolve as t}from"node:path";import n from"typescript";const r=[`BoldDuotone`,`LineDuotone`,`Outline`,`Broken`,`Linear`,`Bold`];function i(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function a(e,t){let n=e.getLineAndCharacterOfPosition(t.getStart(e));return{column:n.character+1,line:n.line+1}}function o(t){if(t===`SolarDynamicIcon`)return`SolarIcon`;let n=r.find(e=>t.endsWith(e));if(n&&!t.startsWith(`Solar`))return`Solar${e(t.slice(0,-n.length))}${n}`}function s(e){return`solar${e.slice(5)}`}function c(e,t=`source.ts`){let r=n.createSourceFile(t,e,n.ScriptTarget.Latest,!0),i=new Map;for(let e of r.statements){if(!n.isImportDeclaration(e)||!n.isStringLiteral(e.moduleSpecifier)||e.moduleSpecifier.text!==`@solar-icons/angular`)continue;let t=e.importClause?.namedBindings;if(t&&n.isNamedImports(t))for(let e of t.elements){let t=(e.propertyName??e.name).text,n=o(t);n&&i.set(s(`Solar${t}`),s(n))}}return i}function l(e,t){let n=[];for(let[r,i]of t){let t=RegExp(`\\b${r}\\b`,`g`);for(let a of e.matchAll(t))n.push({start:a.index,end:a.index+r.length,text:i})}let r=i(e,n);return{code:r,changed:r!==e,diagnostics:[]}}function u(e,r=`source.ts`,c=new Set){if(!r.endsWith(`.ts`))return{changed:!1,code:e,diagnostics:[]};let l=n.createSourceFile(r,e,n.ScriptTarget.Latest,!0),u=[],f=[];for(let t of l.statements){if(!n.isImportDeclaration(t)||!n.isStringLiteral(t.moduleSpecifier)||t.moduleSpecifier.text!==`@solar-icons/angular`)continue;let r=t.importClause?.namedBindings;if(r&&n.isNamedImports(r))for(let t of r.elements){let r=(t.propertyName??t.name).text,i=o(r);if(!i)continue;let a=t.name.text,c=t.propertyName?a:i;if(u.push({start:t.getStart(l),end:t.getEnd(),text:c===i?i:`${i} as ${c}`}),!t.propertyName&&a!==i){let e=r=>{n.isIdentifier(r)&&r.text===a&&r.getStart(l)!==t.name.getStart(l)&&u.push({start:r.getStart(l),end:r.getEnd(),text:i}),n.forEachChild(r,e)};n.forEachChild(l,e)}u.push(...d(e,s(`Solar${r}`),s(i)))}}let p=e=>{if(n.isPropertyAssignment(e)&&n.isIdentifier(e.name)){if(e.name.text===`templateUrl`){let i=n.isStringLiteral(e.initializer)?t(r,`..`,e.initializer.text):void 0;(!i||!c.has(i))&&f.push({code:`ANGULAR_EXTERNAL_TEMPLATE_REQUIRES_MANUAL_MIGRATION`,file:r,...a(l,e.name),message:`Skipped an external Angular template that could not be found. Review its icon selector renames manually.`})}e.name.text===`template`&&(n.isNoSubstitutionTemplateLiteral(e.initializer)||n.isStringLiteral(e.initializer))&&/\bmirrored\b/.test(e.initializer.text)&&f.push({code:`ANGULAR_MIRRORED_REQUIRES_MANUAL_MIGRATION`,file:r,...a(l,e.initializer),message:`An inline Angular template uses the removed mirrored input. Replace it with CSS transform: scaleX(-1).`,severity:`warning`})}n.forEachChild(e,p)};n.forEachChild(l,p);let m=i(e,u);return{code:m,changed:m!==e,diagnostics:f}}function d(e,t,n){let r=RegExp(`\\b${t}\\b`,`g`);return[...e.matchAll(r)].map(e=>({start:e.index,end:e.index+t.length,text:n}))}export{c as collectAngularSelectorRenames,u as transformAngular,l as transformAngularTemplate};
1
+ import{__toESM as e}from"../_virtual/_rolldown/runtime.mjs";import{renameIcon as t}from"../icon-renames.mjs";import{require_typescript as n}from"../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/typescript.mjs";import{resolve as r}from"node:path";var i=/* @__PURE__ */ e(n(),1);const a=[`BoldDuotone`,`LineDuotone`,`Outline`,`Broken`,`Linear`,`Bold`];function o(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function s(e,t){let n=e.getLineAndCharacterOfPosition(t.getStart(e));return{column:n.character+1,line:n.line+1}}function c(e){if(e===`SolarDynamicIcon`)return`SolarIcon`;let n=a.find(t=>e.endsWith(t));if(n&&!e.startsWith(`Solar`))return`Solar${t(e.slice(0,-n.length))}${n}`}function l(e){return`solar${e.slice(5)}`}function u(e,t=`source.ts`){let n=i.default.createSourceFile(t,e,i.default.ScriptTarget.Latest,!0),r=/* @__PURE__ */ new Map;for(let e of n.statements){if(!i.default.isImportDeclaration(e)||!i.default.isStringLiteral(e.moduleSpecifier)||e.moduleSpecifier.text!==`@solar-icons/angular`)continue;let t=e.importClause?.namedBindings;if(t&&i.default.isNamedImports(t))for(let e of t.elements){let t=(e.propertyName??e.name).text,n=c(t);n&&r.set(l(`Solar${t}`),l(n))}}return r}function d(e,t){let n=[];for(let[r,i]of t){let t=RegExp(`\\b${r}\\b`,`g`);for(let a of e.matchAll(t))n.push({start:a.index,end:a.index+r.length,text:i})}let r=o(e,n);return{code:r,changed:r!==e,diagnostics:[]}}function f(e,t=`source.ts`,n=/* @__PURE__ */ new Set){if(!t.endsWith(`.ts`))return{changed:!1,code:e,diagnostics:[]};let a=i.default.createSourceFile(t,e,i.default.ScriptTarget.Latest,!0),u=[],d=[];for(let t of a.statements){if(!i.default.isImportDeclaration(t)||!i.default.isStringLiteral(t.moduleSpecifier)||t.moduleSpecifier.text!==`@solar-icons/angular`)continue;let n=t.importClause?.namedBindings;if(n&&i.default.isNamedImports(n))for(let t of n.elements){let n=(t.propertyName??t.name).text,r=c(n);if(!r)continue;let o=t.name.text,s=t.propertyName?o:r;if(u.push({start:t.getStart(a),end:t.getEnd(),text:s===r?r:`${r} as ${s}`}),!t.propertyName&&o!==r){let e=n=>{i.default.isIdentifier(n)&&n.text===o&&n.getStart(a)!==t.name.getStart(a)&&u.push({start:n.getStart(a),end:n.getEnd(),text:r}),i.default.forEachChild(n,e)};i.default.forEachChild(a,e)}u.push(...p(e,l(`Solar${n}`),l(r)))}}let f=e=>{if(i.default.isPropertyAssignment(e)&&i.default.isIdentifier(e.name)){if(e.name.text===`templateUrl`){let o=i.default.isStringLiteral(e.initializer)?r(t,`..`,e.initializer.text):void 0;(!o||!n.has(o))&&d.push({code:`ANGULAR_EXTERNAL_TEMPLATE_REQUIRES_MANUAL_MIGRATION`,file:t,...s(a,e.name),message:`Skipped an external Angular template that could not be found. Review its icon selector renames manually.`})}e.name.text===`template`&&(i.default.isNoSubstitutionTemplateLiteral(e.initializer)||i.default.isStringLiteral(e.initializer))&&/\bmirrored\b/.test(e.initializer.text)&&d.push({code:`ANGULAR_MIRRORED_REQUIRES_MANUAL_MIGRATION`,file:t,...s(a,e.initializer),message:`An inline Angular template uses the removed mirrored input. Replace it with CSS transform: scaleX(-1).`,severity:`warning`})}i.default.forEachChild(e,f)};i.default.forEachChild(a,f);let m=o(e,u);return{code:m,changed:m!==e,diagnostics:d}}function p(e,t,n){let r=RegExp(`\\b${t}\\b`,`g`);return[...e.matchAll(r)].map(e=>({start:e.index,end:e.index+t.length,text:n}))}export{u as collectAngularSelectorRenames,f as transformAngular,d as transformAngularTemplate};
@@ -1,6 +1,5 @@
1
1
  import { TransformResult } from "../types.mjs";
2
2
  //#region src/transforms/nuxt.d.ts
3
3
  /** Migrates deterministic Nuxt module configuration and reports removed category aliases. */
4
- declare function transformNuxt(source: string, fileName?: string): TransformResult;
5
- //#endregion
6
- export { transformNuxt };
4
+ export declare function transformNuxt(source: string, fileName?: string): TransformResult;
5
+ //#endregion
@@ -1 +1 @@
1
- import e from"typescript";function t(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function n(e,t){let n=e.getLineAndCharacterOfPosition(t.getStart(e));return{column:n.character+1,line:n.line+1}}function r(t){if(e.isPropertyAssignment(t))return e.isIdentifier(t.name)||e.isStringLiteral(t.name)?t.name.text:void 0}function i(i,a=`nuxt.config.ts`){let o=e.createSourceFile(a,i,e.ScriptTarget.Latest,!0),s=[],c=[],l=t=>{if(e.isImportDeclaration(t)&&e.isStringLiteral(t.moduleSpecifier)&&t.moduleSpecifier.text===`#solar-icons/category`&&c.push({code:`NUXT_CATEGORY_IMPORT_REQUIRES_MANUAL_MIGRATION`,file:a,...n(o,t.moduleSpecifier),message:`Skipped the removed #solar-icons/category alias. Import each required v2 icon individually.`}),e.isCallExpression(t)&&e.isIdentifier(t.expression)&&t.expression.text===`defineNuxtConfig`){let n=t.arguments.find(e.isObjectLiteralExpression)?.properties.find(e=>r(e)===`solarIcons`);if(n&&e.isPropertyAssignment(n)&&e.isObjectLiteralExpression(n.initializer))for(let t of n.initializer.properties)r(t)===`prefix`&&e.isPropertyAssignment(t)&&s.push({start:t.name.getStart(o),end:t.name.getEnd(),text:`namePrefix`})}e.forEachChild(t,l)};e.forEachChild(o,l);let u=t(i,s);return{code:u,changed:u!==i,diagnostics:c}}export{i as transformNuxt};
1
+ import{__toESM as e}from"../_virtual/_rolldown/runtime.mjs";import{require_typescript as t}from"../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/typescript.mjs";var n=/* @__PURE__ */ e(t(),1);function r(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function i(e,t){let n=e.getLineAndCharacterOfPosition(t.getStart(e));return{column:n.character+1,line:n.line+1}}function a(e){if(n.default.isPropertyAssignment(e))return n.default.isIdentifier(e.name)||n.default.isStringLiteral(e.name)?e.name.text:void 0}function o(e,t=`nuxt.config.ts`){let o=n.default.createSourceFile(t,e,n.default.ScriptTarget.Latest,!0),s=[],c=[],l=e=>{if(n.default.isImportDeclaration(e)&&n.default.isStringLiteral(e.moduleSpecifier)&&e.moduleSpecifier.text===`#solar-icons/category`&&c.push({code:`NUXT_CATEGORY_IMPORT_REQUIRES_MANUAL_MIGRATION`,file:t,...i(o,e.moduleSpecifier),message:`Skipped the removed #solar-icons/category alias. Import each required v2 icon individually.`}),n.default.isCallExpression(e)&&n.default.isIdentifier(e.expression)&&e.expression.text===`defineNuxtConfig`){let t=e.arguments.find(n.default.isObjectLiteralExpression)?.properties.find(e=>a(e)===`solarIcons`);if(t&&n.default.isPropertyAssignment(t)&&n.default.isObjectLiteralExpression(t.initializer))for(let e of t.initializer.properties)a(e)===`prefix`&&n.default.isPropertyAssignment(e)&&s.push({start:e.name.getStart(o),end:e.name.getEnd(),text:`namePrefix`})}n.default.forEachChild(e,l)};n.default.forEachChild(o,l);let u=r(e,s);return{code:u,changed:u!==e,diagnostics:c}}export{o as transformNuxt};
@@ -1,6 +1,5 @@
1
1
  import { TransformResult } from "../types.mjs";
2
2
  //#region src/transforms/react-native.d.ts
3
3
  /** Migrates the v1 React Native root, style, and category imports. */
4
- declare function transformReactNative(source: string, fileName?: string): TransformResult;
5
- //#endregion
6
- export { transformReactNative };
4
+ export declare function transformReactNative(source: string, fileName?: string): TransformResult;
5
+ //#endregion
@@ -1,2 +1,2 @@
1
- import{renameIcon as e}from"../icon-renames.mjs";import{renameImportedBindingReferences as t}from"../import-bindings.mjs";import n from"typescript";const r={bold:`bold`,boldduotone:`bold-duotone`,broken:`broken`,linear:`linear`,lineduotone:`line-duotone`,outline:`outline`},i=[`BoldDuotone`,`LineDuotone`,`Outline`,`Broken`,`Linear`,`Bold`];function a(e){return e.endsWith(`Icon`)?e:`${e}Icon`}function o(e){let t=e.split(`/`).at(-1)?.replace(/[-_]/g,``).toLowerCase();return t?r[t]:void 0}function s(e){return e.replace(/([a-z\d])([A-Z])/g,`$1-$2`).replace(/([A-Z])([A-Z][a-z])/g,`$1-$2`).replace(/(\D)(\d+)/g,`$1-$2`).toLowerCase()}function c(t){let n=i.find(e=>t.endsWith(e));return a(n?`${e(t.slice(0,-n.length))}${n}`:e(t))}function l(e,t){return e.propertyName&&e.name.text!==t?`${t} as ${e.name.text}`:t}function u(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function d(e,t){let n=e.getLineAndCharacterOfPosition(t.getStart(e));return{column:n.character+1,line:n.line+1}}function f(r,i=`source.tsx`){let f=n.createSourceFile(i,r,n.ScriptTarget.Latest,!0),p=[],m=[],h=new Map;for(let t of f.statements){if(!n.isImportDeclaration(t)||!n.isStringLiteral(t.moduleSpecifier))continue;let r=t.moduleSpecifier.text;if(!r.startsWith(`@solar-icons/react-native`))continue;let u=t.importClause?.namedBindings;if(!u||!n.isNamedImports(u)){m.push({code:`UNSUPPORTED_REACT_NATIVE_IMPORT`,file:i,...d(f,t.moduleSpecifier),message:`Skipped non-named import from ${r}. Convert it to individual icon imports manually.`});continue}let g=r.slice(25);if(!g){for(let e of u.elements){let t=(e.propertyName??e.name).text,n=c(t);!e.propertyName&&e.name.text!==n&&h.set(e.name.text,n),p.push({start:e.getStart(f),end:e.getEnd(),text:l(e,n)})}continue}let _=g.match(/^\/category\/[^/]+\/([^/]+)$/),v=_?.[1]?o(_[1]):o(r);if(!v){m.push({code:`UNSUPPORTED_REACT_NATIVE_SUBPATH`,file:i,...d(f,t.moduleSpecifier),message:`Skipped unsupported React Native subpath: ${r}.`});continue}if(_){let n=u.elements.map(t=>{let n=e((t.propertyName??t.name).text),r=a(n);return!t.propertyName&&t.name.text!==r&&h.set(t.name.text,r),`import { ${l(t,r)} } from '@solar-icons/react-native/${v}/${s(n)}'`});p.push({start:t.getStart(f),end:t.getEnd(),text:n.join(`
2
- `)});continue}p.push({start:t.moduleSpecifier.getStart(f)+1,end:t.moduleSpecifier.getEnd()-1,text:`@solar-icons/react-native/${v}`});for(let t of u.elements){let n=(t.propertyName??t.name).text,r=a(e(n));!t.propertyName&&t.name.text!==r&&h.set(t.name.text,r),p.push({start:t.getStart(f),end:t.getEnd(),text:l(t,r)})}let y=new Set(u.elements.map(e=>e.name.text)),b=e=>{if(n.isJsxOpeningLikeElement(e)&&n.isIdentifier(e.tagName)&&y.has(e.tagName.text))for(let t of e.attributes.properties){if(!n.isJsxAttribute(t))continue;t.name.getText()===`mirrored`&&m.push({code:`REACT_NATIVE_MIRRORED_REQUIRES_MANUAL_MIGRATION`,file:i,...d(f,t),message:`${e.tagName.text} uses the removed mirrored prop. Replace it with style={{ transform: [{ scaleX: -1 }] }}.`,severity:`warning`});let r=t.initializer;if(t.name.getText()===`size`&&r&&n.isStringLiteral(r)){let n=Number(r.text);Number.isFinite(n)?p.push({start:r.getStart(f),end:r.getEnd(),text:`{${n}}`}):m.push({code:`REACT_NATIVE_SIZE_REQUIRES_NUMBER`,file:i,...d(f,t),message:`${e.tagName.text} has a string size. React Native v2 requires a number.`,severity:`warning`})}}n.forEachChild(e,b)};n.forEachChild(f,b)}p.push(...t(r,i,h));let g=u(r,p);return{code:g,changed:g!==r,diagnostics:m}}export{f as transformReactNative};
1
+ import{__toESM as e}from"../_virtual/_rolldown/runtime.mjs";import{renameIcon as t}from"../icon-renames.mjs";import{require_typescript as n}from"../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/typescript.mjs";import{renameImportedBindingReferences as r}from"../import-bindings.mjs";var i=/* @__PURE__ */ e(n(),1);const a={bold:`bold`,boldduotone:`bold-duotone`,broken:`broken`,linear:`linear`,lineduotone:`line-duotone`,outline:`outline`},o=[`BoldDuotone`,`LineDuotone`,`Outline`,`Broken`,`Linear`,`Bold`];function s(e){return e.endsWith(`Icon`)?e:`${e}Icon`}function c(e){let t=e.split(`/`).at(-1)?.replace(/[-_]/g,``).toLowerCase();return t?a[t]:void 0}function l(e){return e.replace(/([a-z\d])([A-Z])/g,`$1-$2`).replace(/([A-Z])([A-Z][a-z])/g,`$1-$2`).replace(/(\D)(\d+)/g,`$1-$2`).toLowerCase()}function u(e){let n=o.find(t=>e.endsWith(t));return s(n?`${t(e.slice(0,-n.length))}${n}`:t(e))}function d(e,t){return e.propertyName&&e.name.text!==t?`${t} as ${e.name.text}`:t}function f(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function p(e,t){let n=e.getLineAndCharacterOfPosition(t.getStart(e));return{column:n.character+1,line:n.line+1}}function m(e,n=`source.tsx`){let a=i.default.createSourceFile(n,e,i.default.ScriptTarget.Latest,!0),o=[],m=[],h=/* @__PURE__ */ new Map;for(let e of a.statements){if(!i.default.isImportDeclaration(e)||!i.default.isStringLiteral(e.moduleSpecifier))continue;let r=e.moduleSpecifier.text;if(!r.startsWith(`@solar-icons/react-native`))continue;let f=e.importClause?.namedBindings;if(!f||!i.default.isNamedImports(f)){m.push({code:`UNSUPPORTED_REACT_NATIVE_IMPORT`,file:n,...p(a,e.moduleSpecifier),message:`Skipped non-named import from ${r}. Convert it to individual icon imports manually.`});continue}let g=r.slice(25);if(!g){for(let e of f.elements){let t=(e.propertyName??e.name).text,n=u(t);!e.propertyName&&e.name.text!==n&&h.set(e.name.text,n),o.push({start:e.getStart(a),end:e.getEnd(),text:d(e,n)})}continue}let _=g.match(/^\/category\/[^/]+\/([^/]+)$/),v=_?.[1]?c(_[1]):c(r);if(!v){m.push({code:`UNSUPPORTED_REACT_NATIVE_SUBPATH`,file:n,...p(a,e.moduleSpecifier),message:`Skipped unsupported React Native subpath: ${r}.`});continue}if(_){let n=f.elements.map(e=>{let n=t((e.propertyName??e.name).text),r=s(n);return!e.propertyName&&e.name.text!==r&&h.set(e.name.text,r),`import { ${d(e,r)} } from '@solar-icons/react-native/${v}/${l(n)}'`});o.push({start:e.getStart(a),end:e.getEnd(),text:n.join(`
2
+ `)});continue}o.push({start:e.moduleSpecifier.getStart(a)+1,end:e.moduleSpecifier.getEnd()-1,text:`@solar-icons/react-native/${v}`});for(let e of f.elements){let n=(e.propertyName??e.name).text,r=s(t(n));!e.propertyName&&e.name.text!==r&&h.set(e.name.text,r),o.push({start:e.getStart(a),end:e.getEnd(),text:d(e,r)})}let y=new Set(f.elements.map(e=>e.name.text)),b=e=>{if(i.default.isJsxOpeningLikeElement(e)&&i.default.isIdentifier(e.tagName)&&y.has(e.tagName.text))for(let t of e.attributes.properties){if(!i.default.isJsxAttribute(t))continue;t.name.getText()===`mirrored`&&m.push({code:`REACT_NATIVE_MIRRORED_REQUIRES_MANUAL_MIGRATION`,file:n,...p(a,t),message:`${e.tagName.text} uses the removed mirrored prop. Replace it with style={{ transform: [{ scaleX: -1 }] }}.`,severity:`warning`});let r=t.initializer;if(t.name.getText()===`size`&&r&&i.default.isStringLiteral(r)){let i=Number(r.text);Number.isFinite(i)?o.push({start:r.getStart(a),end:r.getEnd(),text:`{${i}}`}):m.push({code:`REACT_NATIVE_SIZE_REQUIRES_NUMBER`,file:n,...p(a,t),message:`${e.tagName.text} has a string size. React Native v2 requires a number.`,severity:`warning`})}}i.default.forEachChild(e,b)};i.default.forEachChild(a,b)}o.push(...r(e,n,h));let g=f(e,o);return{code:g,changed:g!==e,diagnostics:m}}export{m as transformReactNative};
@@ -1,6 +1,5 @@
1
1
  import { TransformResult } from "../types.mjs";
2
2
  //#region src/transforms/react-perf.d.ts
3
3
  /** Migrates deterministic `@solar-icons/react-perf` imports and modernizes default local names. */
4
- declare function transformReactPerf(source: string, fileName?: string): TransformResult;
5
- //#endregion
6
- export { transformReactPerf };
4
+ export declare function transformReactPerf(source: string, fileName?: string): TransformResult;
5
+ //#endregion
@@ -1 +1 @@
1
- import{renameIcon as e}from"../icon-renames.mjs";import{renameImportedBindingReferences as t}from"../import-bindings.mjs";import n from"typescript";const r={bold:`bold`,boldduotone:`bold-duotone`,broken:`broken`,linear:`linear`,lineduotone:`line-duotone`,outline:`outline`},i=new Set([`Icon`,`IconProps`]);function a(e){return e.endsWith(`Icon`)?e:`${e}Icon`}function o(e){let t=e.split(`/`).at(-1)?.replace(/[-_]/g,``).toLowerCase();return t?r[t]:void 0}function s(t,n){let i=Object.entries(r).find(([,e])=>e===n)?.[0],o=i&&t.toLowerCase().endsWith(i)?t.slice(0,-i.length):t;return a(e(o))}function c(t){let n=[`BoldDuotone`,`LineDuotone`,`Outline`,`Broken`,`Linear`,`Bold`].find(e=>t.endsWith(e));return a(n?`${e(t.slice(0,-n.length))}${n}`:e(t))}function l(e){return(e.propertyName??e.name).text}function u(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function d(e,t){let n=e.getLineAndCharacterOfPosition(t.getStart(e));return{column:n.character+1,line:n.line+1}}function f(e,r=`source.tsx`){let a=n.createSourceFile(r,e,n.ScriptTarget.Latest,!0),f=[],p=[],m=new Map;for(let e of a.statements){if(!n.isImportDeclaration(e)||!n.isStringLiteral(e.moduleSpecifier))continue;let t=e.moduleSpecifier.text;if(!t.startsWith(`@solar-icons/react-perf`))continue;let u=t.slice(23),h=u?o(t):void 0;if(u===`/lib/types`){let o=e.importClause?.namedBindings;if(!o||!n.isNamedImports(o)){p.push({code:`UNSUPPORTED_REACT_PERF_IMPORT`,...d(a,e.moduleSpecifier),message:`Skipped non-named import from ${t}.`,file:r});continue}let s=o.elements.find(e=>!i.has(l(e)));if(s){p.push({code:`UNSUPPORTED_REACT_PERF_TYPE_EXPORT`,...d(a,s),message:`Skipped unsupported react-perf type export: ${l(s)}.`,file:r});continue}f.push({start:e.moduleSpecifier.getStart(a)+1,end:e.moduleSpecifier.getEnd()-1,text:`@solar-icons/react/lib/index`});continue}if(u&&!h){p.push({code:`UNSUPPORTED_REACT_PERF_SUBPATH`,...d(a,e.moduleSpecifier),message:`Skipped unsupported react-perf subpath: ${t}.`,file:r});continue}let g=e.importClause?.namedBindings;if(!g||!n.isNamedImports(g)){p.push({code:`UNSUPPORTED_REACT_PERF_IMPORT`,...d(a,e.moduleSpecifier),message:`Skipped non-named import from ${t}.`,file:r});continue}f.push({start:e.moduleSpecifier.getStart(a)+1,end:e.moduleSpecifier.getEnd()-1,text:h?`@solar-icons/react/${h}`:`@solar-icons/react`});for(let e of g.elements){let t=l(e),n=h?s(t,h):c(t),r=e.name.text,i=!!e.propertyName,o=i?r:n;!i&&r!==n&&m.set(r,n),f.push({start:e.getStart(a),end:e.getEnd(),text:o===n?n:`${n} as ${o}`})}let _=new Set(g.elements.map(e=>e.name.text)),v=e=>{if(n.isJsxOpeningLikeElement(e)&&n.isIdentifier(e.tagName)&&_.has(e.tagName.text))for(let t of e.attributes.properties)n.isJsxAttribute(t)&&t.name.getText()===`mirrored`&&p.push({code:`REACT_MIRRORED_REQUIRES_MANUAL_MIGRATION`,file:r,...d(a,t),message:`${e.tagName.text} uses the removed mirrored prop. Replace it with style={{ transform: 'scaleX(-1)' }}.`,severity:`warning`});n.forEachChild(e,v)};n.forEachChild(a,v)}let h=e=>{n.isStringLiteral(e)&&e.text===`@solar-icons/react-perf`&&!n.isImportDeclaration(e.parent)&&f.push({start:e.getStart(a)+1,end:e.getEnd()-1,text:`@solar-icons/react`}),n.forEachChild(e,h)};n.forEachChild(a,h),f.push(...t(e,r,m));let g=u(e,f);return{code:g,changed:g!==e,diagnostics:p}}export{f as transformReactPerf};
1
+ import{__toESM as e}from"../_virtual/_rolldown/runtime.mjs";import{renameIcon as t}from"../icon-renames.mjs";import{require_typescript as n}from"../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/typescript.mjs";import{renameImportedBindingReferences as r}from"../import-bindings.mjs";var i=/* @__PURE__ */ e(n(),1);const a={bold:`bold`,boldduotone:`bold-duotone`,broken:`broken`,linear:`linear`,lineduotone:`line-duotone`,outline:`outline`},o=/* @__PURE__ */ new Set([`Icon`,`IconProps`]);function s(e){return e.endsWith(`Icon`)?e:`${e}Icon`}function c(e){let t=e.split(`/`).at(-1)?.replace(/[-_]/g,``).toLowerCase();return t?a[t]:void 0}function l(e,n){let r=Object.entries(a).find(([,e])=>e===n)?.[0],i=r&&e.toLowerCase().endsWith(r)?e.slice(0,-r.length):e;return s(t(i))}function u(e){let n=[`BoldDuotone`,`LineDuotone`,`Outline`,`Broken`,`Linear`,`Bold`].find(t=>e.endsWith(t));return s(n?`${t(e.slice(0,-n.length))}${n}`:t(e))}function d(e){return(e.propertyName??e.name).text}function f(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function p(e,t){let n=e.getLineAndCharacterOfPosition(t.getStart(e));return{column:n.character+1,line:n.line+1}}function m(e,t=`source.tsx`){let n=i.default.createSourceFile(t,e,i.default.ScriptTarget.Latest,!0),a=[],s=[],m=/* @__PURE__ */ new Map;for(let e of n.statements){if(!i.default.isImportDeclaration(e)||!i.default.isStringLiteral(e.moduleSpecifier))continue;let r=e.moduleSpecifier.text;if(!r.startsWith(`@solar-icons/react-perf`))continue;let f=r.slice(23),h=f?c(r):void 0;if(f===`/lib/types`){let c=e.importClause?.namedBindings;if(!c||!i.default.isNamedImports(c)){s.push({code:`UNSUPPORTED_REACT_PERF_IMPORT`,...p(n,e.moduleSpecifier),message:`Skipped non-named import from ${r}.`,file:t});continue}let l=c.elements.find(e=>!o.has(d(e)));if(l){s.push({code:`UNSUPPORTED_REACT_PERF_TYPE_EXPORT`,...p(n,l),message:`Skipped unsupported react-perf type export: ${d(l)}.`,file:t});continue}a.push({start:e.moduleSpecifier.getStart(n)+1,end:e.moduleSpecifier.getEnd()-1,text:`@solar-icons/react/lib/index`});continue}if(f&&!h){s.push({code:`UNSUPPORTED_REACT_PERF_SUBPATH`,...p(n,e.moduleSpecifier),message:`Skipped unsupported react-perf subpath: ${r}.`,file:t});continue}let g=e.importClause?.namedBindings;if(!g||!i.default.isNamedImports(g)){s.push({code:`UNSUPPORTED_REACT_PERF_IMPORT`,...p(n,e.moduleSpecifier),message:`Skipped non-named import from ${r}.`,file:t});continue}a.push({start:e.moduleSpecifier.getStart(n)+1,end:e.moduleSpecifier.getEnd()-1,text:h?`@solar-icons/react/${h}`:`@solar-icons/react`});for(let e of g.elements){let t=d(e),r=h?l(t,h):u(t),i=e.name.text,o=!!e.propertyName,s=o?i:r;!o&&i!==r&&m.set(i,r),a.push({start:e.getStart(n),end:e.getEnd(),text:s===r?r:`${r} as ${s}`})}let _=new Set(g.elements.map(e=>e.name.text)),v=e=>{if(i.default.isJsxOpeningLikeElement(e)&&i.default.isIdentifier(e.tagName)&&_.has(e.tagName.text))for(let r of e.attributes.properties)i.default.isJsxAttribute(r)&&r.name.getText()===`mirrored`&&s.push({code:`REACT_MIRRORED_REQUIRES_MANUAL_MIGRATION`,file:t,...p(n,r),message:`${e.tagName.text} uses the removed mirrored prop. Replace it with style={{ transform: 'scaleX(-1)' }}.`,severity:`warning`});i.default.forEachChild(e,v)};i.default.forEachChild(n,v)}let h=e=>{i.default.isStringLiteral(e)&&e.text===`@solar-icons/react-perf`&&!i.default.isImportDeclaration(e.parent)&&a.push({start:e.getStart(n)+1,end:e.getEnd()-1,text:`@solar-icons/react`}),i.default.forEachChild(e,h)};i.default.forEachChild(n,h),a.push(...r(e,t,m));let g=f(e,a);return{code:g,changed:g!==e,diagnostics:s}}export{m as transformReactPerf};
@@ -4,6 +4,5 @@ import { ReactV1Mode, TransformResult } from "../types.mjs";
4
4
  * Migrates React v1 imports when every imported icon has a determinable style.
5
5
  * Dynamic or mixed weight usage moves to the v2 dynamic entry point.
6
6
  */
7
- declare function transformReact(source: string, fileName?: string, mode?: ReactV1Mode): TransformResult;
8
- //#endregion
9
- export { transformReact };
7
+ export declare function transformReact(source: string, fileName?: string, mode?: ReactV1Mode): TransformResult;
8
+ //#endregion
@@ -1,2 +1,2 @@
1
- import{renameIcon as e}from"../icon-renames.mjs";import{renameImportedBindingReferences as t}from"../import-bindings.mjs";import n from"typescript";const r={Bold:`bold`,BoldDuotone:`bold-duotone`,Broken:`broken`,Linear:`linear`,LineDuotone:`line-duotone`,Outline:`outline`};function i(e){return e.endsWith(`Icon`)?e:`${e}Icon`}function a(e){return e.attributes.properties.find(e=>n.isJsxAttribute(e)&&e.name.getText()===`weight`)}function o(e){if(!e)return`Linear`;let t=e.initializer;if(t&&n.isStringLiteral(t))return t.text;if(t&&n.isJsxExpression(t)){let e=t.expression;if(e&&n.isStringLiteral(e))return e.text}}function s(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function c(e,t){let n=e.getLineAndCharacterOfPosition(t.getStart(e));return{column:n.character+1,line:n.line+1}}function l(r,i){let a=[],o=new Map;for(let t of i.statements){if(!n.isImportDeclaration(t)||!n.isStringLiteral(t.moduleSpecifier)||!t.moduleSpecifier.text.startsWith(`@solar-icons/react`))continue;let r=t.importClause?.namedBindings;if(r&&n.isNamedImports(r))for(let t of r.elements){if(!t.propertyName)continue;let n=t.propertyName.text,r=t.name.text,s=n.slice(0,-4);!n.endsWith(`Icon`)||r!==s&&e(r)!==s||(a.push({end:t.getEnd(),start:t.getStart(i),text:n}),o.set(r,n))}}return[...a,...t(r,i.fileName,o)]}function u(u,d=`source.tsx`,f=`static`){let p=n.createSourceFile(d,u,n.ScriptTarget.Latest,!0),m=[],h=[],g=new Map;for(let t of p.statements){if(!n.isImportDeclaration(t)||!n.isStringLiteral(t.moduleSpecifier))continue;let s=t.moduleSpecifier.text;if(s===`@solar-icons/react/category`){m.push({code:`REACT_CATEGORY_IMPORT_REQUIRES_MANUAL_MIGRATION`,...c(p,t.moduleSpecifier),message:`Skipped a React category import. Replace each category member with an individual v2 icon import.`,file:d});continue}if(s!==`@solar-icons/react`&&s!==`@solar-icons/react/ssr`)continue;let l=t.importClause?.namedBindings,_=!!t.importClause?.name;if(_&&m.push({code:`UNSUPPORTED_REACT_IMPORT`,...c(p,t.moduleSpecifier),message:`Skipped a default React namespace import. Convert it to individual icon imports manually.`,file:d}),!l||!n.isNamedImports(l)){_||m.push({code:`UNSUPPORTED_REACT_IMPORT`,...c(p,t.moduleSpecifier),message:`Skipped a default or namespace React import. Convert it to individual icon imports manually.`,file:d});continue}if(l.elements.filter(e=>{let t=(e.propertyName??e.name).text;return t===`SolarProvider`||t===`useSolar`}).length>0){m.push({code:`REACT_PROVIDER_REQUIRES_MANUAL_MIGRATION`,...c(p,t.moduleSpecifier),message:`Skipped a legacy SolarProvider or useSolar import. Its v1 context API and weight inheritance require manual migration.`,file:d});continue}if(l.elements.every(e=>(e.propertyName??e.name).text.endsWith(`Icon`)))continue;let v=new Map;for(let e of l.elements)v.set(e.name.text,{dynamic:!1,dynamicWeightAttributes:[],mirroredAttributes:[],styles:new Set,tagNames:[],weightAttributes:[]});let y=e=>{if(n.isJsxOpeningLikeElement(e)&&n.isIdentifier(e.tagName)){let t=v.get(e.tagName.text);if(t){t.tagNames.push(e.tagName);let i=a(e),s=e.attributes.properties.find(e=>n.isJsxAttribute(e)&&e.name.getText()===`mirrored`);s&&t.mirroredAttributes.push(s);let c=o(i),l=c&&r[c];l?(t.styles.add(l),i&&t.weightAttributes.push(i)):(t.dynamic=!0,i&&t.dynamicWeightAttributes.push(i))}}n.isJsxClosingElement(e)&&n.isIdentifier(e.tagName)&&v.get(e.tagName.text)?.tagNames.push(e.tagName),n.forEachChild(e,y)};n.forEachChild(p,y);let b=[...v.entries()].filter(([,e])=>e.styles.size===0&&!e.dynamic);if(b.length>0){m.push({code:`REACT_IMPORT_REQUIRES_REVIEW`,...c(p,t.moduleSpecifier),message:`Skipped React import because ${b.map(([e])=>e).join(`, `)} is not used as JSX in this file.`,file:d});continue}let x=[];for(let t of l.elements){let n=t.name.text,r=(t.propertyName??t.name).text,a=v.get(n),o=f===`dynamic`||a.dynamic||a.styles.size!==1?`dynamic`:[...a.styles][0],s=i(e(r)),l=!!t.propertyName,_=l?n:s,y=_===s?s:`${s} as ${_}`;if(x.push(`import { ${y} } from '@solar-icons/react/${o}'`),!l&&n!==s&&g.set(n,s),f===`static`&&a.dynamicWeightAttributes.length>0){let e=a.dynamicWeightAttributes[0];if(!e)continue;m.push({code:`REACT_DYNAMIC_WEIGHT_FALLBACK`,file:d,...c(p,e),message:`${n} has a dynamic weight, so it was migrated to @solar-icons/react/dynamic instead of a static style path.`,severity:`warning`})}for(let e of a.mirroredAttributes)m.push({code:`REACT_MIRRORED_REQUIRES_MANUAL_MIGRATION`,file:d,...c(p,e),message:`${n} uses the removed mirrored prop. Replace it with style={{ transform: 'scaleX(-1)' }}.`,severity:`warning`});if(o!==`dynamic`)for(let e of a.weightAttributes){let t=e.getStart(p);h.push({start:/\s/.test(u[t-1]??``)?t-1:t,end:e.getEnd(),text:``})}}h.push({start:t.getStart(p),end:t.getEnd(),text:x.join(`
2
- `)})}h.push(...t(u,d,g)),h.push(...l(u,p));let _=s(u,h);return{code:_,changed:_!==u,diagnostics:m}}export{u as transformReact};
1
+ import{__toESM as e}from"../_virtual/_rolldown/runtime.mjs";import{renameIcon as t}from"../icon-renames.mjs";import{require_typescript as n}from"../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/typescript.mjs";import{renameImportedBindingReferences as r}from"../import-bindings.mjs";var i=/* @__PURE__ */ e(n(),1);const a={Bold:`bold`,BoldDuotone:`bold-duotone`,Broken:`broken`,Linear:`linear`,LineDuotone:`line-duotone`,Outline:`outline`};function o(e){return e.endsWith(`Icon`)?e:`${e}Icon`}function s(e){return e.attributes.properties.find(e=>i.default.isJsxAttribute(e)&&e.name.getText()===`weight`)}function c(e){if(!e)return`Linear`;let t=e.initializer;if(t&&i.default.isStringLiteral(t))return t.text;if(t&&i.default.isJsxExpression(t)){let e=t.expression;if(e&&i.default.isStringLiteral(e))return e.text}}function l(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function u(e,t){let n=e.getLineAndCharacterOfPosition(t.getStart(e));return{column:n.character+1,line:n.line+1}}function d(e,n){let a=[],o=/* @__PURE__ */ new Map;for(let e of n.statements){if(!i.default.isImportDeclaration(e)||!i.default.isStringLiteral(e.moduleSpecifier)||!e.moduleSpecifier.text.startsWith(`@solar-icons/react`))continue;let r=e.importClause?.namedBindings;if(r&&i.default.isNamedImports(r))for(let e of r.elements){if(!e.propertyName)continue;let r=e.propertyName.text,i=e.name.text,s=r.slice(0,-4);!r.endsWith(`Icon`)||i!==s&&t(i)!==s||(a.push({end:e.getEnd(),start:e.getStart(n),text:r}),o.set(i,r))}}return[...a,...r(e,n.fileName,o)]}function f(e,n=`source.tsx`,f=`static`){let p=i.default.createSourceFile(n,e,i.default.ScriptTarget.Latest,!0),m=[],h=[],g=/* @__PURE__ */ new Map;for(let r of p.statements){if(!i.default.isImportDeclaration(r)||!i.default.isStringLiteral(r.moduleSpecifier))continue;let l=r.moduleSpecifier.text;if(l===`@solar-icons/react/category`){m.push({code:`REACT_CATEGORY_IMPORT_REQUIRES_MANUAL_MIGRATION`,...u(p,r.moduleSpecifier),message:`Skipped a React category import. Replace each category member with an individual v2 icon import.`,file:n});continue}if(l!==`@solar-icons/react`&&l!==`@solar-icons/react/ssr`)continue;let d=r.importClause?.namedBindings,_=!!r.importClause?.name;if(_&&m.push({code:`UNSUPPORTED_REACT_IMPORT`,...u(p,r.moduleSpecifier),message:`Skipped a default React namespace import. Convert it to individual icon imports manually.`,file:n}),!d||!i.default.isNamedImports(d)){_||m.push({code:`UNSUPPORTED_REACT_IMPORT`,...u(p,r.moduleSpecifier),message:`Skipped a default or namespace React import. Convert it to individual icon imports manually.`,file:n});continue}if(d.elements.filter(e=>{let t=(e.propertyName??e.name).text;return t===`SolarProvider`||t===`useSolar`}).length>0){m.push({code:`REACT_PROVIDER_REQUIRES_MANUAL_MIGRATION`,...u(p,r.moduleSpecifier),message:`Skipped a legacy SolarProvider or useSolar import. Its v1 context API and weight inheritance require manual migration.`,file:n});continue}if(d.elements.every(e=>(e.propertyName??e.name).text.endsWith(`Icon`)))continue;let v=/* @__PURE__ */ new Map;for(let e of d.elements)v.set(e.name.text,{dynamic:!1,dynamicWeightAttributes:[],mirroredAttributes:[],styles:/* @__PURE__ */ new Set,tagNames:[],weightAttributes:[]});let y=e=>{if(i.default.isJsxOpeningLikeElement(e)&&i.default.isIdentifier(e.tagName)){let t=v.get(e.tagName.text);if(t){t.tagNames.push(e.tagName);let n=s(e),r=e.attributes.properties.find(e=>i.default.isJsxAttribute(e)&&e.name.getText()===`mirrored`);r&&t.mirroredAttributes.push(r);let o=c(n),l=o&&a[o];l?(t.styles.add(l),n&&t.weightAttributes.push(n)):(t.dynamic=!0,n&&t.dynamicWeightAttributes.push(n))}}i.default.isJsxClosingElement(e)&&i.default.isIdentifier(e.tagName)&&v.get(e.tagName.text)?.tagNames.push(e.tagName),i.default.forEachChild(e,y)};i.default.forEachChild(p,y);let b=[...v.entries()].filter(([,e])=>e.styles.size===0&&!e.dynamic);if(b.length>0){m.push({code:`REACT_IMPORT_REQUIRES_REVIEW`,...u(p,r.moduleSpecifier),message:`Skipped React import because ${b.map(([e])=>e).join(`, `)} is not used as JSX in this file.`,file:n});continue}let x=[];for(let r of d.elements){let i=r.name.text,a=(r.propertyName??r.name).text,s=v.get(i),c=f===`dynamic`||s.dynamic||s.styles.size!==1?`dynamic`:[...s.styles][0],l=o(t(a)),d=!!r.propertyName,_=d?i:l,y=_===l?l:`${l} as ${_}`;if(x.push(`import { ${y} } from '@solar-icons/react/${c}'`),!d&&i!==l&&g.set(i,l),f===`static`&&s.dynamicWeightAttributes.length>0){let e=s.dynamicWeightAttributes[0];if(!e)continue;m.push({code:`REACT_DYNAMIC_WEIGHT_FALLBACK`,file:n,...u(p,e),message:`${i} has a dynamic weight, so it was migrated to @solar-icons/react/dynamic instead of a static style path.`,severity:`warning`})}for(let e of s.mirroredAttributes)m.push({code:`REACT_MIRRORED_REQUIRES_MANUAL_MIGRATION`,file:n,...u(p,e),message:`${i} uses the removed mirrored prop. Replace it with style={{ transform: 'scaleX(-1)' }}.`,severity:`warning`});if(c!==`dynamic`)for(let t of s.weightAttributes){let n=t.getStart(p);h.push({start:/\s/.test(e[n-1]??``)?n-1:n,end:t.getEnd(),text:``})}}h.push({start:r.getStart(p),end:r.getEnd(),text:x.join(`
2
+ `)})}h.push(...r(e,n,g)),h.push(...d(e,p));let _=l(e,h);return{code:_,changed:_!==e,diagnostics:m}}export{f as transformReact};
@@ -1,6 +1,5 @@
1
1
  import { TransformResult } from "../types.mjs";
2
2
  //#region src/transforms/solid.d.ts
3
3
  /** Migrates Solid v1 style and category imports. */
4
- declare function transformSolid(source: string, fileName?: string): TransformResult;
5
- //#endregion
6
- export { transformSolid };
4
+ export declare function transformSolid(source: string, fileName?: string): TransformResult;
5
+ //#endregion
@@ -1,4 +1,4 @@
1
- import{renameIcon as e}from"../icon-renames.mjs";import t from"typescript";const n={bold:`bold`,boldduotone:`bold-duotone`,broken:`broken`,linear:`linear`,lineduotone:`line-duotone`,outline:`outline`};function r(e){return e.endsWith(`Icon`)?e:`${e}Icon`}function i(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function a(e,t){let n=e.getLineAndCharacterOfPosition(t.getStart(e));return{column:n.character+1,line:n.line+1}}function o(e){let t=e.split(`/`).at(-1)?.replace(/[-_]/g,``).toLowerCase();return t?n[t]:void 0}function s(e){return e.replace(/([a-z\d])([A-Z])/g,`$1-$2`).replace(/([A-Z])([A-Z][a-z])/g,`$1-$2`).replace(/(\D)(\d+)/g,`$1-$2`).toLowerCase()}function c(e,n,r){if(n===r)return[];let i=[],a=o=>{(t.isJsxOpeningLikeElement(o)||t.isJsxClosingElement(o))&&t.isIdentifier(o.tagName)&&o.tagName.text===n&&i.push({start:o.tagName.getStart(e),end:o.tagName.getEnd(),text:r}),t.forEachChild(o,a)};return t.forEachChild(e,a),i}function l(n,l=`source.tsx`){let u=t.createSourceFile(l,n,t.ScriptTarget.Latest,!0),d=[],f=[];for(let n of u.statements){if(!t.isImportDeclaration(n)||!t.isStringLiteral(n.moduleSpecifier))continue;let i=n.moduleSpecifier.text;if(!i.startsWith(`@solar-icons/solid`))continue;let p=n.importClause?.namedBindings;if(!p||!t.isNamedImports(p))continue;let m=i.match(/^@solar-icons\/solid\/category\/[^/]+\/([^/]+)$/),h=m?.[1]?o(m[1]):o(i);if(m&&h){let t=p.elements.map(t=>{let n=e((t.propertyName??t.name).text),i=r(n),a=t.name.text;return`import { ${a===i?i:`${i} as ${a}`} } from '@solar-icons/solid/${h}/${s(n)}'`});d.push({start:n.getStart(u),end:n.getEnd(),text:t.join(`
2
- `)});continue}if(i.startsWith(`@solar-icons/solid/category/`)){let i=new Map;for(let e of p.elements){let t=(e.propertyName??e.name).text,n=o(t);n&&i.set(e.name.text,n)}let c=[],m=n=>{if((t.isJsxOpeningLikeElement(n)||t.isJsxClosingElement(n))&&t.isPropertyAccessExpression(n.tagName)){let r=n.tagName,a=r.expression;if(t.isIdentifier(a)){let t=i.get(a.text);t&&c.push({iconName:e(r.name.text),node:r,style:t})}}t.forEachChild(n,m)};if(t.forEachChild(u,m),c.length===0){f.push({code:`SOLID_CATEGORY_IMPORT_REQUIRES_MANUAL_MIGRATION`,file:l,...a(u,n.moduleSpecifier),message:`Skipped a Solid category import because no deterministic JSX members were found.`});continue}let h=new Set,g=[];for(let e of c){let t=r(e.iconName),n=`${e.style}:${e.iconName}`;h.has(n)||(h.add(n),g.push(`import { ${t} } from '@solar-icons/solid/${e.style}/${s(e.iconName)}'`)),d.push({start:e.node.getStart(u),end:e.node.getEnd(),text:t})}d.push({start:n.getStart(u),end:n.getEnd(),text:g.join(`
3
- `)});continue}if(!h)continue;let g=[];for(let t of p.elements){let n=r(e((t.propertyName??t.name).text)),i=t.name.text,a=t.propertyName?i:n;g.push(`import { ${a===n?n:`${n} as ${a}`} } from '@solar-icons/solid/${h}'`),t.propertyName||d.push(...c(u,i,n))}d.push({start:n.getStart(u),end:n.getEnd(),text:g.join(`
4
- `)})}let p=i(n,d);return{code:p,changed:p!==n,diagnostics:f}}export{l as transformSolid};
1
+ import{__toESM as e}from"../_virtual/_rolldown/runtime.mjs";import{renameIcon as t}from"../icon-renames.mjs";import{require_typescript as n}from"../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/typescript.mjs";var r=/* @__PURE__ */ e(n(),1);const i={bold:`bold`,boldduotone:`bold-duotone`,broken:`broken`,linear:`linear`,lineduotone:`line-duotone`,outline:`outline`};function a(e){return e.endsWith(`Icon`)?e:`${e}Icon`}function o(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function s(e,t){let n=e.getLineAndCharacterOfPosition(t.getStart(e));return{column:n.character+1,line:n.line+1}}function c(e){let t=e.split(`/`).at(-1)?.replace(/[-_]/g,``).toLowerCase();return t?i[t]:void 0}function l(e){return e.replace(/([a-z\d])([A-Z])/g,`$1-$2`).replace(/([A-Z])([A-Z][a-z])/g,`$1-$2`).replace(/(\D)(\d+)/g,`$1-$2`).toLowerCase()}function u(e,t,n){if(t===n)return[];let i=[],a=o=>{(r.default.isJsxOpeningLikeElement(o)||r.default.isJsxClosingElement(o))&&r.default.isIdentifier(o.tagName)&&o.tagName.text===t&&i.push({start:o.tagName.getStart(e),end:o.tagName.getEnd(),text:n}),r.default.forEachChild(o,a)};return r.default.forEachChild(e,a),i}function d(e,n=`source.tsx`){let i=r.default.createSourceFile(n,e,r.default.ScriptTarget.Latest,!0),d=[],f=[];for(let e of i.statements){if(!r.default.isImportDeclaration(e)||!r.default.isStringLiteral(e.moduleSpecifier))continue;let o=e.moduleSpecifier.text;if(!o.startsWith(`@solar-icons/solid`))continue;let p=e.importClause?.namedBindings;if(!p||!r.default.isNamedImports(p))continue;let m=o.match(/^@solar-icons\/solid\/category\/[^/]+\/([^/]+)$/),h=m?.[1]?c(m[1]):c(o);if(m&&h){let n=p.elements.map(e=>{let n=t((e.propertyName??e.name).text),r=a(n),i=e.name.text;return`import { ${i===r?r:`${r} as ${i}`} } from '@solar-icons/solid/${h}/${l(n)}'`});d.push({start:e.getStart(i),end:e.getEnd(),text:n.join(`
2
+ `)});continue}if(o.startsWith(`@solar-icons/solid/category/`)){let o=/* @__PURE__ */ new Map;for(let e of p.elements){let t=(e.propertyName??e.name).text,n=c(t);n&&o.set(e.name.text,n)}let u=[],m=e=>{if((r.default.isJsxOpeningLikeElement(e)||r.default.isJsxClosingElement(e))&&r.default.isPropertyAccessExpression(e.tagName)){let n=e.tagName,i=n.expression;if(r.default.isIdentifier(i)){let e=o.get(i.text);e&&u.push({iconName:t(n.name.text),node:n,style:e})}}r.default.forEachChild(e,m)};if(r.default.forEachChild(i,m),u.length===0){f.push({code:`SOLID_CATEGORY_IMPORT_REQUIRES_MANUAL_MIGRATION`,file:n,...s(i,e.moduleSpecifier),message:`Skipped a Solid category import because no deterministic JSX members were found.`});continue}let h=/* @__PURE__ */ new Set,g=[];for(let e of u){let t=a(e.iconName),n=`${e.style}:${e.iconName}`;h.has(n)||(h.add(n),g.push(`import { ${t} } from '@solar-icons/solid/${e.style}/${l(e.iconName)}'`)),d.push({start:e.node.getStart(i),end:e.node.getEnd(),text:t})}d.push({start:e.getStart(i),end:e.getEnd(),text:g.join(`
3
+ `)});continue}if(!h)continue;let g=[];for(let e of p.elements){let n=a(t((e.propertyName??e.name).text)),r=e.name.text,o=e.propertyName?r:n;g.push(`import { ${o===n?n:`${n} as ${o}`} } from '@solar-icons/solid/${h}'`),e.propertyName||d.push(...u(i,r,n))}d.push({start:e.getStart(i),end:e.getEnd(),text:g.join(`
4
+ `)})}let p=o(e,d);return{code:p,changed:p!==e,diagnostics:f}}export{d as transformSolid};
@@ -1,6 +1,5 @@
1
1
  import { TransformResult } from "../types.mjs";
2
2
  //#region src/transforms/svelte.d.ts
3
3
  /** Migrates Svelte v1 style and direct icon imports. */
4
- declare function transformSvelte(source: string, fileName?: string): TransformResult;
5
- //#endregion
6
- export { transformSvelte };
4
+ export declare function transformSvelte(source: string, fileName?: string): TransformResult;
5
+ //#endregion
@@ -1,4 +1,4 @@
1
- import{renameIcon as e}from"../icon-renames.mjs";import t from"typescript";import{parse as n}from"svelte/compiler";const r={bold:`bold`,boldduotone:`bold-duotone`,broken:`broken`,linear:`linear`,lineduotone:`line-duotone`,outline:`outline`};function i(e){return e.endsWith(`Icon`)?e:`${e}Icon`}function a(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function o(e,t){let n=e.slice(0,t);return{column:n.length-n.lastIndexOf(`
1
+ import{__toESM as e}from"../_virtual/_rolldown/runtime.mjs";import{renameIcon as t}from"../icon-renames.mjs";import{require_typescript as n}from"../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/typescript.mjs";import{parse as r}from"svelte/compiler";var i=/* @__PURE__ */ e(n(),1);const a={bold:`bold`,boldduotone:`bold-duotone`,broken:`broken`,linear:`linear`,lineduotone:`line-duotone`,outline:`outline`};function o(e){return e.endsWith(`Icon`)?e:`${e}Icon`}function s(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function c(e,t){let n=e.slice(0,t);return{column:n.length-n.lastIndexOf(`
2
2
  `),line:n.split(`
3
- `).length}}function s(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function c(e){return r[e.replace(/[-_]/g,``).toLowerCase()]}function l(e,t,n){if(t===n)return[];let r=RegExp(`<(/?)${s(t)}(?=[\\s/>])`,`g`);return[...e.matchAll(r)].map(e=>{let r=e.index+1+e[1].length;return{start:r,end:r+t.length,text:n}})}function u(e,t,n){let r=RegExp(`<${s(t)}(?=[\\s/>])[^>]*\\smirrored(?:\\s|=|/|>)`,`g`);return[...e.matchAll(r)].map(r=>({code:`SVELTE_MIRRORED_REQUIRES_MANUAL_MIGRATION`,file:n,...o(e,r.index+r[0].indexOf(`mirrored`)),message:`${t} uses the removed mirrored prop. Replace it with CSS transform: scaleX(-1).`,severity:`warning`}))}function d(e,t){return[...e.matchAll(/from\s+['"](@solar-icons\/svelte\/category\/[^'"]+)['"]/g)].map(n=>{let r=n[1];return{code:`SVELTE_CATEGORY_IMPORT_REQUIRES_MANUAL_MIGRATION`,file:t,...o(e,n.index+n[0].indexOf(r)),message:`Skipped a Svelte category import. Replace each required icon with a v2 single-icon import.`}})}function f(r,s=`source.svelte`){if(!s.endsWith(`.svelte`))return{changed:!1,code:r,diagnostics:[]};try{n(r)}catch{let e=d(r,s);return{changed:!1,code:r,diagnostics:e.length>0?e:[{code:`SVELTE_PARSE_ERROR`,file:s,message:`Skipped this Svelte component because it could not be parsed.`}]}}let f=[],m=[];for(let n of r.matchAll(/<script(?:\s[^>]*)?>([\s\S]*?)<\/script>/g)){let a=n[1],d=n.index+n[0].indexOf(a),h=t.createSourceFile(s,a,t.ScriptTarget.Latest,!0);for(let n of h.statements){if(!t.isImportDeclaration(n)||!t.isStringLiteral(n.moduleSpecifier))continue;let a=n.moduleSpecifier.text;if(!a.startsWith(`@solar-icons/svelte`))continue;if(a.startsWith(`@solar-icons/svelte/category/`)){let t=a.match(/^@solar-icons\/svelte\/category\/[^/]+\/([^/]+)\/([^/]+)\.svelte$/),g=n.importClause?.name,_=t?.[1]?c(t[1]):void 0,v=t?.[2]?e(t[2]):void 0;if(t&&g&&_&&v){let e=i(v);f.push({start:d+n.getStart(h),end:d+n.getEnd(),text:`import ${e} from '@solar-icons/svelte/${_}/${p(v)}'`}),f.push(...l(r,g.text,e)),m.push(...u(r,g.text,s))}else m.push({code:`SVELTE_CATEGORY_IMPORT_REQUIRES_MANUAL_MIGRATION`,file:s,...o(r,d+n.moduleSpecifier.getStart(h)),message:`Skipped a Svelte category import. Replace each required icon with a v2 single-icon import.`});continue}let g=a.match(/^@solar-icons\/svelte\/(Bold|BoldDuotone|Broken|Linear|LineDuotone|Outline)$/),_=n.importClause?.namedBindings;if(!g||!_||!t.isNamedImports(_))continue;let v=c(g[1]);if(!v)continue;let y=[];for(let t of _.elements){let n=i(e((t.propertyName??t.name).text)),a=t.name.text,o=t.propertyName?a:n;y.push(`import { ${o===n?n:`${n} as ${o}`} } from '@solar-icons/svelte/${v}'`),t.propertyName||f.push(...l(r,a,n)),m.push(...u(r,a,s))}f.push({start:d+n.getStart(h),end:d+n.getEnd(),text:y.join(`
4
- `)})}}let h=a(r,f);return{code:h,changed:h!==r,diagnostics:m}}function p(e){return e.replace(/([a-z\d])([A-Z])/g,`$1-$2`).replace(/([A-Z])([A-Z][a-z])/g,`$1-$2`).replace(/(\D)(\d+)/g,`$1-$2`).toLowerCase()}export{f as transformSvelte};
3
+ `).length}}function l(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function u(e){return a[e.replace(/[-_]/g,``).toLowerCase()]}function d(e,t,n){if(t===n)return[];let r=RegExp(`<(/?)${l(t)}(?=[\\s/>])`,`g`);return[...e.matchAll(r)].map(e=>{let r=e.index+1+e[1].length;return{start:r,end:r+t.length,text:n}})}function f(e,t,n){let r=RegExp(`<${l(t)}(?=[\\s/>])[^>]*\\smirrored(?:\\s|=|/|>)`,`g`);return[...e.matchAll(r)].map(r=>({code:`SVELTE_MIRRORED_REQUIRES_MANUAL_MIGRATION`,file:n,...c(e,r.index+r[0].indexOf(`mirrored`)),message:`${t} uses the removed mirrored prop. Replace it with CSS transform: scaleX(-1).`,severity:`warning`}))}function p(e,t){return[...e.matchAll(/from\s+['"](@solar-icons\/svelte\/category\/[^'"]+)['"]/g)].map(n=>{let r=n[1];return{code:`SVELTE_CATEGORY_IMPORT_REQUIRES_MANUAL_MIGRATION`,file:t,...c(e,n.index+n[0].indexOf(r)),message:`Skipped a Svelte category import. Replace each required icon with a v2 single-icon import.`}})}function m(e,n=`source.svelte`){if(!n.endsWith(`.svelte`))return{changed:!1,code:e,diagnostics:[]};try{r(e)}catch{let t=p(e,n);return{changed:!1,code:e,diagnostics:t.length>0?t:[{code:`SVELTE_PARSE_ERROR`,file:n,message:`Skipped this Svelte component because it could not be parsed.`}]}}let a=[],l=[];for(let r of e.matchAll(/<script(?:\s[^>]*)?>([\s\S]*?)<\/script>/g)){let s=r[1],p=r.index+r[0].indexOf(s),m=i.default.createSourceFile(n,s,i.default.ScriptTarget.Latest,!0);for(let r of m.statements){if(!i.default.isImportDeclaration(r)||!i.default.isStringLiteral(r.moduleSpecifier))continue;let s=r.moduleSpecifier.text;if(!s.startsWith(`@solar-icons/svelte`))continue;if(s.startsWith(`@solar-icons/svelte/category/`)){let i=s.match(/^@solar-icons\/svelte\/category\/[^/]+\/([^/]+)\/([^/]+)\.svelte$/),g=r.importClause?.name,_=i?.[1]?u(i[1]):void 0,v=i?.[2]?t(i[2]):void 0;if(i&&g&&_&&v){let t=o(v);a.push({start:p+r.getStart(m),end:p+r.getEnd(),text:`import ${t} from '@solar-icons/svelte/${_}/${h(v)}'`}),a.push(...d(e,g.text,t)),l.push(...f(e,g.text,n))}else l.push({code:`SVELTE_CATEGORY_IMPORT_REQUIRES_MANUAL_MIGRATION`,file:n,...c(e,p+r.moduleSpecifier.getStart(m)),message:`Skipped a Svelte category import. Replace each required icon with a v2 single-icon import.`});continue}let g=s.match(/^@solar-icons\/svelte\/(Bold|BoldDuotone|Broken|Linear|LineDuotone|Outline)$/),_=r.importClause?.namedBindings;if(!g||!_||!i.default.isNamedImports(_))continue;let v=u(g[1]);if(!v)continue;let y=[];for(let r of _.elements){let i=o(t((r.propertyName??r.name).text)),s=r.name.text,c=r.propertyName?s:i;y.push(`import { ${c===i?i:`${i} as ${c}`} } from '@solar-icons/svelte/${v}'`),r.propertyName||a.push(...d(e,s,i)),l.push(...f(e,s,n))}a.push({start:p+r.getStart(m),end:p+r.getEnd(),text:y.join(`
4
+ `)})}}let m=s(e,a);return{code:m,changed:m!==e,diagnostics:l}}function h(e){return e.replace(/([a-z\d])([A-Z])/g,`$1-$2`).replace(/([A-Z])([A-Z][a-z])/g,`$1-$2`).replace(/(\D)(\d+)/g,`$1-$2`).toLowerCase()}export{m as transformSvelte};
@@ -1,6 +1,5 @@
1
1
  import { ReactV1Mode, TransformResult } from "../types.mjs";
2
2
  //#region src/transforms/vue.d.ts
3
3
  /** Migrates Vue single-file component imports and template component references. */
4
- declare function transformVue(source: string, fileName?: string, mode?: ReactV1Mode): TransformResult;
5
- //#endregion
6
- export { transformVue };
4
+ export declare function transformVue(source: string, fileName?: string, mode?: ReactV1Mode): TransformResult;
5
+ //#endregion
@@ -1,4 +1,4 @@
1
- import{renameIcon as e}from"../icon-renames.mjs";import t from"typescript";import{parse as n}from"@vue/compiler-sfc";const r={Bold:`bold`,BoldDuotone:`bold-duotone`,Broken:`broken`,Linear:`linear`,LineDuotone:`line-duotone`,Outline:`outline`};function i(e){return e.endsWith(`Icon`)?e:`${e}Icon`}function a(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function o(e,t){let n=e.slice(0,t),r=n.split(`
1
+ import{__toESM as e}from"../_virtual/_rolldown/runtime.mjs";import{renameIcon as t}from"../icon-renames.mjs";import{require_typescript as n}from"../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/typescript.mjs";import{parse as r}from"@vue/compiler-sfc";var i=/* @__PURE__ */ e(n(),1);const a={Bold:`bold`,BoldDuotone:`bold-duotone`,Broken:`broken`,Linear:`linear`,LineDuotone:`line-duotone`,Outline:`outline`};function o(e){return e.endsWith(`Icon`)?e:`${e}Icon`}function s(e,t){return t.sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e)}function c(e,t){let n=e.slice(0,t),r=n.split(`
2
2
  `).length;return{column:n.length-n.lastIndexOf(`
3
- `),line:r}}function s(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function c(e,t,n){let i={dynamic:!1,mirroredOffsets:[],styles:new Set,tagEdits:[],weightEdits:[]},a=s(n),o=RegExp(`<(/?)${a}(?=[\\s/>])([^>]*)>`,`g`);for(let a of e.matchAll(o)){let e=t+a.index,o=a[1]??``,s=a[2]??``;if(i.tagEdits.push({start:e+1+o.length,end:e+1+o.length+n.length,text:``}),o)continue;let c=/\s(?:weight|:weight)\s*=\s*("[^"]*"|'[^']*')/.exec(s);if(!c)i.styles.add(`linear`);else{let t=(c[1]?.slice(1,-1))?.replace(/^['"]|['"]$/g,``),a=t&&r[t];if(a){i.styles.add(a);let t=e+1+n.length+c.index;i.weightEdits.push({start:t,end:t+c[0].length,text:``})}else i.dynamic=!0}let l=/\smirrored(?:\s*=\s*(?:"[^"]*"|'[^']*'))?/.exec(s);l&&i.mirroredOffsets.push(e+1+n.length+l.index+1)}return i}function l(s,l=`source.vue`,u=`static`){if(!l.endsWith(`.vue`))return{changed:!1,code:s,diagnostics:[]};let d=n(s,{filename:l}),f=d.descriptor.template,p=[d.descriptor.script,d.descriptor.scriptSetup].filter(e=>!!e),m=[],h=[];if(!f)return{changed:!1,code:s,diagnostics:[{code:`VUE_TEMPLATE_REQUIRES_MANUAL_MIGRATION`,file:l,message:`Skipped Vue icon imports because this component has no template to analyze.`}]};for(let n of p){let a=n.content,d=n.loc.start.offset,p=t.createSourceFile(l,a,t.ScriptTarget.Latest,!0);for(let n of p.statements){if(!t.isImportDeclaration(n)||!t.isStringLiteral(n.moduleSpecifier))continue;let a=n.moduleSpecifier.text;if(a===`@solar-icons/vue/category`){h.push({code:`VUE_CATEGORY_IMPORT_REQUIRES_MANUAL_MIGRATION`,file:l,...o(s,d+n.moduleSpecifier.getStart(p)),message:`Skipped a Vue category import. Replace each category member with an individual v2 icon import.`});continue}if(!a.startsWith(`@solar-icons/vue`))continue;let g=n.importClause?.namedBindings;if(!g||!t.isNamedImports(g)){h.push({code:`UNSUPPORTED_VUE_IMPORT`,file:l,...o(s,d+n.moduleSpecifier.getStart(p)),message:`Skipped non-named import from ${a}. Convert it to individual icon imports manually.`});continue}let _=a===`@solar-icons/vue`;if(g.elements.some(e=>[`SolarProvider`,`SolarIconsPlugin`,`useSolar`].includes((e.propertyName??e.name).text))&&_){h.push({code:`VUE_PROVIDER_REQUIRES_MANUAL_MIGRATION`,file:l,...o(s,d+n.moduleSpecifier.getStart(p)),message:`Skipped a legacy Vue provider, plugin, or useSolar import. Its v1 global configuration semantics require manual migration.`});continue}let v=a.match(/^@solar-icons\/vue\/(Bold|BoldDuotone|Broken|Linear|LineDuotone|Outline)$/);if(!_&&!v){h.push({code:`UNSUPPORTED_VUE_SUBPATH`,file:l,...o(s,d+n.moduleSpecifier.getStart(p)),message:`Skipped unsupported Vue subpath: ${a}.`});continue}let y=[];for(let t of g.elements){let a=(t.propertyName??t.name).text,g=t.name.text,_=c(f.content,f.loc.start.offset,g);if(_.styles.size===0&&!_.dynamic){h.push({code:`VUE_IMPORT_REQUIRES_REVIEW`,file:l,...o(s,d+n.moduleSpecifier.getStart(p)),message:`Skipped Vue import because ${g} is not used as a template component in this file.`});continue}let b=v?.[1],x=b?r[b]:u===`dynamic`||_.dynamic||_.styles.size!==1?`dynamic`:[..._.styles][0],S=i(e(a)),C=t.propertyName?g:S,w=C===S?S:`${S} as ${C}`;if(y.push(`import { ${w} } from '@solar-icons/vue/${x}'`),!t.propertyName&&g!==S)for(let e of _.tagEdits)m.push({...e,text:S});x!==`dynamic`&&m.push(..._.weightEdits);for(let e of _.mirroredOffsets)h.push({code:`VUE_MIRRORED_REQUIRES_MANUAL_MIGRATION`,file:l,...o(s,e),message:`${g} uses the removed mirrored prop. Replace it with CSS transform: scaleX(-1).`,severity:`warning`})}y.length>0&&m.push({start:d+n.getStart(p),end:d+n.getEnd(),text:y.join(`
4
- `)})}}let g=a(s,m);return{code:g,changed:g!==s,diagnostics:h}}export{l as transformVue};
3
+ `),line:r}}function l(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function u(e,t,n){let r={dynamic:!1,mirroredOffsets:[],styles:/* @__PURE__ */ new Set,tagEdits:[],weightEdits:[]},i=l(n),o=RegExp(`<(/?)${i}(?=[\\s/>])([^>]*)>`,`g`);for(let i of e.matchAll(o)){let e=t+i.index,o=i[1]??``,s=i[2]??``;if(r.tagEdits.push({start:e+1+o.length,end:e+1+o.length+n.length,text:``}),o)continue;let c=/\s(?:weight|:weight)\s*=\s*("[^"]*"|'[^']*')/.exec(s);if(!c)r.styles.add(`linear`);else{let t=(c[1]?.slice(1,-1))?.replace(/^['"]|['"]$/g,``),i=t&&a[t];if(i){r.styles.add(i);let t=e+1+n.length+c.index;r.weightEdits.push({start:t,end:t+c[0].length,text:``})}else r.dynamic=!0}let l=/\smirrored(?:\s*=\s*(?:"[^"]*"|'[^']*'))?/.exec(s);l&&r.mirroredOffsets.push(e+1+n.length+l.index+1)}return r}function d(e,n=`source.vue`,l=`static`){if(!n.endsWith(`.vue`))return{changed:!1,code:e,diagnostics:[]};let d=r(e,{filename:n}),f=d.descriptor.template,p=[d.descriptor.script,d.descriptor.scriptSetup].filter(e=>!!e),m=[],h=[];if(!f)return{changed:!1,code:e,diagnostics:[{code:`VUE_TEMPLATE_REQUIRES_MANUAL_MIGRATION`,file:n,message:`Skipped Vue icon imports because this component has no template to analyze.`}]};for(let r of p){let s=r.content,d=r.loc.start.offset,p=i.default.createSourceFile(n,s,i.default.ScriptTarget.Latest,!0);for(let r of p.statements){if(!i.default.isImportDeclaration(r)||!i.default.isStringLiteral(r.moduleSpecifier))continue;let s=r.moduleSpecifier.text;if(s===`@solar-icons/vue/category`){h.push({code:`VUE_CATEGORY_IMPORT_REQUIRES_MANUAL_MIGRATION`,file:n,...c(e,d+r.moduleSpecifier.getStart(p)),message:`Skipped a Vue category import. Replace each category member with an individual v2 icon import.`});continue}if(!s.startsWith(`@solar-icons/vue`))continue;let g=r.importClause?.namedBindings;if(!g||!i.default.isNamedImports(g)){h.push({code:`UNSUPPORTED_VUE_IMPORT`,file:n,...c(e,d+r.moduleSpecifier.getStart(p)),message:`Skipped non-named import from ${s}. Convert it to individual icon imports manually.`});continue}let _=s===`@solar-icons/vue`;if(g.elements.some(e=>[`SolarProvider`,`SolarIconsPlugin`,`useSolar`].includes((e.propertyName??e.name).text))&&_){h.push({code:`VUE_PROVIDER_REQUIRES_MANUAL_MIGRATION`,file:n,...c(e,d+r.moduleSpecifier.getStart(p)),message:`Skipped a legacy Vue provider, plugin, or useSolar import. Its v1 global configuration semantics require manual migration.`});continue}let v=s.match(/^@solar-icons\/vue\/(Bold|BoldDuotone|Broken|Linear|LineDuotone|Outline)$/);if(!_&&!v){h.push({code:`UNSUPPORTED_VUE_SUBPATH`,file:n,...c(e,d+r.moduleSpecifier.getStart(p)),message:`Skipped unsupported Vue subpath: ${s}.`});continue}let y=[];for(let i of g.elements){let s=(i.propertyName??i.name).text,g=i.name.text,_=u(f.content,f.loc.start.offset,g);if(_.styles.size===0&&!_.dynamic){h.push({code:`VUE_IMPORT_REQUIRES_REVIEW`,file:n,...c(e,d+r.moduleSpecifier.getStart(p)),message:`Skipped Vue import because ${g} is not used as a template component in this file.`});continue}let b=v?.[1],x=b?a[b]:l===`dynamic`||_.dynamic||_.styles.size!==1?`dynamic`:[..._.styles][0],S=o(t(s)),C=i.propertyName?g:S,w=C===S?S:`${S} as ${C}`;if(y.push(`import { ${w} } from '@solar-icons/vue/${x}'`),!i.propertyName&&g!==S)for(let e of _.tagEdits)m.push({...e,text:S});x!==`dynamic`&&m.push(..._.weightEdits);for(let t of _.mirroredOffsets)h.push({code:`VUE_MIRRORED_REQUIRES_MANUAL_MIGRATION`,file:n,...c(e,t),message:`${g} uses the removed mirrored prop. Replace it with CSS transform: scaleX(-1).`,severity:`warning`})}y.length>0&&m.push({start:d+r.getStart(p),end:d+r.getEnd(),text:y.join(`
4
+ `)})}}let g=s(e,m);return{code:g,changed:g!==e,diagnostics:h}}export{d as transformVue};
package/dist/types.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  //#region src/types.d.ts
2
- type Framework = 'angular' | 'nuxt' | 'react' | 'react-native' | 'solid' | 'svelte' | 'vue';
3
- interface Diagnostic {
2
+ export type Framework = 'angular' | 'nuxt' | 'react' | 'react-native' | 'solid' | 'svelte' | 'vue';
3
+ export interface Diagnostic {
4
4
  code: string;
5
5
  column?: number;
6
6
  message: string;
@@ -8,23 +8,22 @@ interface Diagnostic {
8
8
  line?: number;
9
9
  severity?: 'warning' | 'error';
10
10
  }
11
- interface TransformResult {
11
+ export interface TransformResult {
12
12
  code: string;
13
13
  changed: boolean;
14
14
  diagnostics: Diagnostic[];
15
15
  }
16
- interface MigrationReport {
16
+ export interface MigrationReport {
17
17
  changedFiles: string[];
18
18
  diagnostics: Diagnostic[];
19
19
  detectedFrameworks: Framework[];
20
20
  }
21
- interface MigrationOptions {
21
+ export interface MigrationOptions {
22
22
  cwd: string;
23
23
  reactV1Mode?: ReactV1Mode;
24
24
  vueV1Mode?: ReactV1Mode;
25
25
  targetVersion?: string;
26
26
  write?: boolean;
27
27
  }
28
- type ReactV1Mode = 'dynamic' | 'static';
29
- //#endregion
30
- export { Diagnostic, Framework, MigrationOptions, MigrationReport, ReactV1Mode, TransformResult };
28
+ export type ReactV1Mode = 'dynamic' | 'static';
29
+ //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solar-icons/codemod",
3
- "version": "2.1.0",
3
+ "version": "2.2.1",
4
4
  "private": false,
5
5
  "description": "Conservative migration codemods for Solar Icons",
6
6
  "keywords": [
@@ -43,19 +43,19 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@clack/prompts": "^1.8.1",
46
- "@vue/compiler-sfc": "^3.5.41",
46
+ "@vue/compiler-sfc": "^3.5.43",
47
47
  "commander": "^15.0.0",
48
48
  "picocolors": "^1.1.1",
49
- "svelte": "^5.57.0",
50
- "typescript": "^6.0.3"
49
+ "svelte": "^5.57.1"
51
50
  },
52
51
  "devDependencies": {
53
- "@tala-tools/tsconfig": "0.0.2",
54
- "@types/node": "^26.5.1",
52
+ "@tala-tools/tsconfig": "0.1.0",
53
+ "@types/node": "^26.6.2",
55
54
  "rimraf": "^6.1.3",
56
- "tsdown": "^0.22.14",
57
- "tsx": "^4.23.13",
58
- "vitest": "^4.1.11"
55
+ "tsdown": "^0.23.0",
56
+ "tsx": "^4.23.15",
57
+ "typescript": "^6.0.3",
58
+ "vitest": "^5.0.2"
59
59
  },
60
60
  "engines": {
61
61
  "node": ">=18"