{"_id":"@94ai/vue2-runtime-helpers","_rev":"3-e65de093a4e2edd1921ee5e245745233","name":"@94ai/vue2-runtime-helpers","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@94ai/vue2-runtime-helpers","version":"1.0.0","description":"vue2 runtime helpers for Vue SFC.","main":"index.mjs","module":"index.mjs","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"https://gitee.com/xccjh/vue2-runtime-helpers"},"keywords":["vue2","runtime-helpers"],"author":{"name":"zoujiahe"},"license":"MIT","bugs":{"url":"https://gitee.com/xccjh/vue2-runtime-helpers/issues"},"homepage":"https://gitee.com/xccjh/vue2-runtime-helpers#readme","gitHead":"f440b93dc1a033133aa494bfb5c0fdeedbfe2812","_id":"@94ai/vue2-runtime-helpers@1.0.0","_nodeVersion":"16.19.1","_npmVersion":"8.19.3","dist":{"integrity":"sha512-10k9FoLLy8KP1v/aPdNf+NwQgmQuRpqRo0h9aUdhKsqPqUj3RaeY3nhDdJEDRRS6MixaQf1i032rJOKbs8Zy0w==","shasum":"dc14e447e248c99f684d3e31ec753dca895ab966","tarball":"https://registry.npmjs.org/@94ai/vue2-runtime-helpers/-/vue2-runtime-helpers-1.0.0.tgz","fileCount":3,"unpackedSize":17853,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIErfd+nrIodDHzil4HLD2pnTeNoYx64nsWqfHCTgDtOeAiEA+c8IPd3bT19gERjbrL5+ranGjmO2h/mIBs/rjsuxZE0="}]},"_npmUser":{"name":"94ai","email":"zjh15018707394@gmail.com"},"directories":{},"maintainers":[{"name":"94ai","email":"zjh15018707394@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/vue2-runtime-helpers_1.0.0_1693919148110_0.8573537335904684"},"_hasShrinkwrap":false},"1.0.1":{"name":"@94ai/vue2-runtime-helpers","version":"1.0.1","description":"vue2 runtime helpers for Vue SFC.","main":"index.mjs","module":"index.mjs","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"https://gitee.com/xccjh/vue2-runtime-helpers"},"keywords":["vue2","runtime-helpers"],"author":{"name":"zoujiahe"},"license":"MIT","bugs":{"url":"https://gitee.com/xccjh/vue2-runtime-helpers/issues"},"homepage":"https://gitee.com/xccjh/vue2-runtime-helpers#readme","gitHead":"bd72b8e5b0c482af2fbde96b55b889bc2096ab53","_id":"@94ai/vue2-runtime-helpers@1.0.1","_nodeVersion":"16.19.1","_npmVersion":"8.19.3","dist":{"integrity":"sha512-3JJrrTfMYp4k3Xi1WisFC6gRhHZcMOUdWkBwNvHdSszyE0XeokLkiMv/K8hNq2VB/W3VR2tI7cQFqGFOAbJNdg==","shasum":"dbc1c7227a9c4b35ee551070a68649a3ec05ccf7","tarball":"https://registry.npmjs.org/@94ai/vue2-runtime-helpers/-/vue2-runtime-helpers-1.0.1.tgz","fileCount":3,"unpackedSize":17890,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDdMKGb6hA9gh9Puii6856yJfyZ88z+qPYBZfkxYP8BjgIhAJwyyWFnX3HB2+PBBqSzLUmNU1vMkF0+MqVGbFT3PoCh"}]},"_npmUser":{"name":"94ai","email":"zjh15018707394@gmail.com"},"directories":{},"maintainers":[{"name":"94ai","email":"zjh15018707394@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/vue2-runtime-helpers_1.0.1_1693993039186_0.3551810473795569"},"_hasShrinkwrap":false}},"time":{"created":"2023-09-05T13:05:48.011Z","1.0.0":"2023-09-05T13:05:48.294Z","modified":"2024-05-24T09:11:45.750Z","1.0.1":"2023-09-06T09:37:19.349Z"},"maintainers":[{"email":"liuxiangxiang1992@gmail.com","name":"louislxx"},{"email":"zjh15018707394@gmail.com","name":"nfai"}],"description":"vue2 runtime helpers for Vue SFC.","homepage":"https://gitee.com/xccjh/vue2-runtime-helpers#readme","keywords":["vue2","runtime-helpers"],"repository":{"type":"git","url":"https://gitee.com/xccjh/vue2-runtime-helpers"},"author":{"name":"zoujiahe"},"bugs":{"url":"https://gitee.com/xccjh/vue2-runtime-helpers/issues"},"license":"MIT","readme":"## Introduction\r\n\r\nHigh level utilities for compiling Vue2 single file components, runtime helpers for @94ai/vite-plugin-vue2 .\r\n\r\nThis package contains high level utilities that you can also use if you are writing a plugin / transform for a bundler or module system that compiles Vue single file components into JavaScript.\r\n\r\n## Usage\r\n\r\n```typescript\r\n// build.ts\r\nimport path from 'path'\r\nimport fs from 'fs'\r\nimport { fileURLToPath } from 'url'\r\nimport fsExtra from 'fs-extra'\r\nimport type { LibraryFormats } from 'vite'\r\nimport { build } from 'vite'\r\nimport type { ModuleFormat } from 'rollup'\r\nimport babel from '@rollup/plugin-babel'\r\nimport vue from '@94ai/vite-plugin-vue2'\r\nimport vueJsx from '@vitejs/plugin-vue2-jsx'\r\nimport dts from 'vite-plugin-dts'\r\nimport scriptSetup from 'unplugin-vue2-script-setup/vite'\r\nimport Components from 'unplugin-vue-components/vite'\r\nimport requireTransform from 'vite-plugin-require-transform'\r\nimport defineOptions from '@94ai/unplugin-vue-define-options/vite'\r\nimport { NfCommonUIResolver } from '@94ai/common-ui-resolver'\r\n// import { assemble, createDefaultCompiler } from '@vue/component-compiler'\r\n// @ts-ignore\r\nimport { output, src } from './config.ts'\r\n// @ts-ignore\r\nimport { copyFile, getComponentDts } from './utils/index.ts'\r\n\r\nconst __filename = fileURLToPath(import.meta.url)\r\nconst __dirname = path.dirname(__filename)\r\nconst entryDir = path.resolve(__dirname, src)\r\nconst outputDir = path.resolve(__dirname, output)\r\n\r\nconst components: string[] = []\r\nconst themes: string[] = []\r\nfs.readdirSync(entryDir).forEach((name) => {\r\n  const componentDir = path.resolve(entryDir, name)\r\n  const isDir = fs.lstatSync(componentDir).isDirectory()\r\n  if (isDir && fs.readdirSync(componentDir).includes('package.json')) {\r\n    if (name.includes('nf-theme-')) {\r\n      themes.push(name)\r\n    } else {\r\n      components.push(name)\r\n    }\r\n  }\r\n})\r\n\r\nconst getAutoImport = (codepenUmd: boolean) => {\r\n  if (codepenUmd) {\r\n    return Components({\r\n      include: [\r\n        /\\.vue$/,\r\n        /\\.vue\\?vue/,\r\n        /\\.md$/,\r\n        /\\.md\\?vue/,\r\n        /\\.jsx$/,\r\n        /\\.jsx\\?vue/,\r\n        /\\.tsx$/,\r\n        /\\.tsx\\?vue/,\r\n      ],\r\n      extensions: ['vue', 'md', 'jsx', 'tsx', 'mjs', 'mts'],\r\n      resolvers: [\r\n        NfCommonUIResolver({\r\n          mode: 'packages',\r\n          theme: [],\r\n        }),\r\n      ],\r\n    })\r\n  }\r\n  return null\r\n}\r\n\r\n// @ts-ignore\r\n// eslint-disable-next-line no-unused-vars\r\nconst getExternal = (codepenUmd: boolean) => {\r\n  const external = [\r\n    'vue',\r\n    'vue-router',\r\n    'element-ui',\r\n    'vue-demi',\r\n    '@94ai/vue2-runtime-helpers', // 👈 配置构建工具external\r\n  ]\r\n  // if (!codepenUmd) {\r\n  //   return [\r\n  //     ...external,\r\n  //     ...components.concat(themes).map((_) => `${libPrefix}/${_}`),\r\n  //   ]\r\n  // }\r\n  return external\r\n}\r\n\r\n// @ts-ignore\r\n// eslint-disable-next-line no-unused-vars\r\nconst getGlobals = (codepenUmd: boolean) => {\r\n  const globals = {\r\n    vue: 'Vue',\r\n    'vue-router': 'VueRouter',\r\n    'element-ui': 'ELEMENT',\r\n    'vue-demi': 'VueDemi',\r\n  }\r\n  // if (codepenUmd) {\r\n  //   return {\r\n  //     ...globals,\r\n  //     ...components.reduce((component, key) => {\r\n  //       component[`${libPrefix}/${key}`] = key\r\n  //       return component\r\n  //     }, {}),\r\n  //   }\r\n  // }\r\n  return globals\r\n}\r\n\r\nconst getFormats = (codepenUmd: boolean): LibraryFormats[] => {\r\n  if (codepenUmd) {\r\n    return ['umd', 'es']\r\n  } else {\r\n    return ['es', 'cjs']\r\n  }\r\n}\r\n\r\nconst handlePackBundle = async (name, codepenUmd = false) => {\r\n  const entryRoot = path.resolve(__dirname, `${src}/${name}`)\r\n  await build({\r\n    optimizeDeps: {\r\n      exclude: ['vue-demi'],\r\n    },\r\n    configFile: false,\r\n    publicDir: false,\r\n    resolve: {\r\n      alias: [\r\n        {\r\n          find: /^packages\\//,\r\n          replacement: path.resolve('packages') + '/',\r\n        },\r\n        {\r\n          find: /^lib\\//,\r\n          replacement: path.resolve('lib') + '/',\r\n        },\r\n        // {\r\n        //   find: /^vue$/,\r\n        //   replacement: 'vue-demi',\r\n        // },\r\n      ],\r\n    },\r\n    // esbuild: {\r\n    //   tsconfigRaw: {\r\n    //     compilerOptions: {\r\n    //       jsxFactory: 'h',\r\n    //       jsxFragmentFactory: 'Fragment',\r\n    //     },\r\n    //   },\r\n    //   jsxInject: \"import { h } from 'vue-demi';\",\r\n    // },\r\n    plugins: [\r\n      codepenUmd\r\n        ? undefined\r\n        : dts({\r\n          entryRoot,\r\n          include: [\r\n            `${entryRoot}/*.ts`,\r\n            `${entryRoot}/*.tsx`,\r\n            `${entryRoot}/*.d.ts`,\r\n            `${entryRoot}/*.vue`,\r\n            `${entryRoot}/**/*.ts`,\r\n            `${entryRoot}/**/*.tsx`,\r\n            `${entryRoot}/**/*.d.ts`,\r\n            `${entryRoot}/**/*.vue`,\r\n          ],\r\n        }),\r\n      vue({\r\n        normalizerCode: codepenUmd // 👈 指定cjs和esm构建把helpers插入的函数转成import\r\n          ? ''\r\n          : `\r\nimport { normalizeComponent } from '@94ai/vue2-runtime-helpers'\r\nexport default normalizeComponent`,\r\n        include: [/\\.vue$/, /\\.md$/, /\\.jsx$/, /\\.tsx$/],\r\n      }),\r\n      defineOptions(),\r\n      scriptSetup({\r\n        importHelpersFrom: 'vue-demi',\r\n        include: [/\\.vue$/, /\\.md$/, /\\.jsx$/, /\\.tsx$/],\r\n      }),\r\n      vueJsx({\r\n        compositionAPI: 'vue-demi',\r\n        include: [/\\.jsx$/, /\\.tsx$/],\r\n      }),\r\n      getAutoImport(codepenUmd),\r\n    ],\r\n    build: {\r\n      sourcemap: false,\r\n      minify: !!codepenUmd,\r\n      rollupOptions: {\r\n        external: getExternal(codepenUmd),\r\n        output: {\r\n          exports: 'named',\r\n          assetFileNames: ({ name: assetsName }): string => {\r\n            if (/\\.(gif|jpe?g|png|svg)$/.test(assetsName ?? '')) {\r\n              return 'lib/[name]-[hash][extname]'\r\n            }\r\n            if (/\\.css$/.test(assetsName ?? '')) {\r\n              return `lib/${name}[extname]`\r\n            }\r\n            return assetsName as string\r\n          },\r\n          globals: getGlobals(codepenUmd),\r\n        },\r\n        plugins: [\r\n          requireTransform({\r\n            fileRegex: /.js$|.vue$|.jsx$|.tsx$.ts$/,\r\n          }),\r\n          // {\r\n          //   name: 'customize-assemble',\r\n          //   async transform(code, id) {\r\n          //     // 使用assemble处理SFC文件，并应用优化\r\n          //     if (id.endsWith('.vue')) {\r\n          //       const compiler = createDefaultCompiler()\r\n          //       const filename = resolve(id)\r\n          //       const descriptor = compiler.compileToDescriptor(filename, code)\r\n          //       const result = await assemble(compiler, filename, descriptor, {\r\n          //         normalizer: '~@94ai/vue2-runtime-helpers',\r\n          //       })\r\n          //       return {\r\n          //         code: result.code,\r\n          //         map: result.map,\r\n          //       }\r\n          //     }\r\n          //   },\r\n          // },\r\n          codepenUmd\r\n            ? babel({\r\n              babelHelpers: 'runtime',\r\n              exclude: 'node_modules/**',\r\n              extensions: [\r\n                '.ts',\r\n                '.js',\r\n                '.jsx',\r\n                '.es6',\r\n                '.es',\r\n                '.mjs',\r\n                '.tsx',\r\n                '.mtx',\r\n                '.vue',\r\n              ],\r\n            })\r\n            : null,\r\n        ],\r\n      },\r\n      lib: {\r\n        entry: path.resolve(entryDir, `${name}/lib/index.ts`),\r\n        name,\r\n        fileName: (format: ModuleFormat, entryName: string) => {\r\n          if (entryName.indexOf('style') > -1) {\r\n            return ''\r\n          }\r\n          if (codepenUmd) {\r\n            return `${name}.${format}.browser.js`\r\n          }\r\n          return `lib/${name}.${format === 'es' ? 'esm-bundler' : format}.js`\r\n        },\r\n        formats: getFormats(codepenUmd),\r\n      },\r\n      outDir: path.resolve(\r\n        outputDir,\r\n        codepenUmd ? `codepen/lib/${name}` : name\r\n      ),\r\n    },\r\n  })\r\n}\r\n\r\nconst handleConfigFiles = async (name) => {\r\n  const destination = outputDir + `/${name}`\r\n  const resource = entryDir + `/${name}`\r\n  const handleEslint = () => {\r\n    const eslintConfig = eval(\r\n      '(' +\r\n      fs\r\n        .readFileSync(path.join(__dirname, `.eslintrc.cjs`), {\r\n          encoding: 'utf8',\r\n        })\r\n        .replace('module.exports = ', '') +\r\n      ')'\r\n    )\r\n    eslintConfig.extends.length = 1\r\n    const fileStr = JSON.stringify(eslintConfig, null, 2)\r\n    fsExtra.outputFileSync(\r\n      path.join(destination, '.eslintrc.cjs'),\r\n      'module.exports = ' + fileStr,\r\n      'utf-8'\r\n    )\r\n  }\r\n  const handlePkg = () => {\r\n    const srcPkg = JSON.parse(\r\n      fs.readFileSync(path.join(resource, `package.json`), {\r\n        encoding: 'utf8',\r\n      })\r\n    )\r\n    const libPkg: Record<string, any> = {}\r\n    ;[\r\n      'name',\r\n      'version',\r\n      'description',\r\n      'keywords',\r\n      'author',\r\n      'homepage',\r\n      'license',\r\n      'publishConfig',\r\n      'repository',\r\n    ].forEach((key) => {\r\n      libPkg[key] = srcPkg[key]\r\n    })\r\n    if (name !== 'codepen') {\r\n      ;['devDependencies', 'dependencies', 'peerDependenciesMeta'].forEach(\r\n        (key) => {\r\n          libPkg[key] = srcPkg[key]\r\n        }\r\n      )\r\n      libPkg['peerDependencies'] = {\r\n        ...(srcPkg['peerDependencies'] || {}),\r\n        'element-ui': '>=2.13.2',\r\n      }\r\n    }\r\n    libPkg.types = `lib/index.d.ts`\r\n    libPkg.main = `lib/${name}.cjs.js`\r\n    libPkg.module = `lib/${name}.esm-bundler.js`\r\n    const fileStr = JSON.stringify(libPkg, null, 2)\r\n    fsExtra.outputFileSync(\r\n      path.join(destination, `package.json`),\r\n      fileStr,\r\n      'utf-8'\r\n    )\r\n  }\r\n  const handlePostcss = () => {\r\n    fs.copyFileSync(\r\n      path.join(__dirname, 'postcss.config.mjs'),\r\n      path.join(destination, 'postcss.config.js'),\r\n      fs.constants.COPYFILE_FICLONE\r\n    )\r\n  }\r\n  const handleReadMe = () => {\r\n    fs.copyFileSync(\r\n      path.join(resource, `README.md`),\r\n      path.join(destination, 'README.md'),\r\n      fs.constants.COPYFILE_FICLONE\r\n    )\r\n  }\r\n  const handleTheme = (name) => {\r\n    if (name !== 'codepen') {\r\n      const dir = path.resolve(__dirname, output, name, 'lib', 'style')\r\n      if (!fsExtra.existsSync(dir)) {\r\n        fsExtra.mkdirsSync(dir)\r\n      }\r\n      fs.copyFileSync(\r\n        path.resolve(__dirname, src, name, output, 'style/css.ts'),\r\n        path.resolve(__dirname, output, name, output, 'style/css.js'),\r\n        fs.constants.COPYFILE_FICLONE\r\n      )\r\n      fs.copyFileSync(\r\n        path.resolve(__dirname, src, name, output, 'style/index.ts'),\r\n        path.resolve(__dirname, output, name, output, 'style/index.js'),\r\n        fs.constants.COPYFILE_FICLONE\r\n      )\r\n    }\r\n  }\r\n  const handleGlobalDts = (name) => {\r\n    if (name !== 'codepen') {\r\n      const prefix = `export {}\r\n\r\ndeclare module 'vue' {\r\n    export interface GlobalComponents {\r\n        `\r\n      const after = `\r\n    }\r\n}`\r\n      let content = ``\r\n      if (name === 'common-ui') {\r\n        for (const name of components) {\r\n          if (name !== 'common-ui' && name !== 'codepen') {\r\n            content += getComponentDts(name)\r\n          }\r\n        }\r\n      } else {\r\n        content = getComponentDts(name)\r\n      }\r\n      fsExtra.outputFileSync(\r\n        path.join(destination, `components.d.ts`),\r\n        prefix + content + after,\r\n        'utf-8'\r\n      )\r\n    }\r\n  }\r\n  handlePkg()\r\n  handleEslint()\r\n  handlePostcss()\r\n  handleReadMe()\r\n  handleTheme(name)\r\n  handleGlobalDts(name)\r\n}\r\n\r\nconst handleThemePack = (name?: string) => {\r\n  fsExtra.ensureDirSync(path.resolve(__dirname, 'lib'))\r\n  if (name) {\r\n    copyFile(\r\n      path.resolve(__dirname, src, name),\r\n      path.resolve(__dirname, output, name)\r\n    )\r\n    handleSyncVersion(name)\r\n  } else {\r\n    themes.forEach((sigle) => {\r\n      copyFile(\r\n        path.resolve(__dirname, src, sigle),\r\n        path.resolve(__dirname, output, sigle)\r\n      )\r\n      handleSyncVersion(sigle)\r\n    })\r\n  }\r\n  console.log(`${name ?? themes.join(',')}主题构建完成`)\r\n}\r\n\r\nconst handleSyncVersion = async (name) => {\r\n  const targetPackagePath = path.resolve(\r\n    __dirname,\r\n    output,\r\n    name,\r\n    `package.json`\r\n  )\r\n  let version\r\n  if (name !== 'common-ui') {\r\n    const mainPackagePath = path.resolve(\r\n      __dirname,\r\n      output,\r\n      `common-ui/package.json`\r\n    )\r\n    if (fs.existsSync(mainPackagePath)) {\r\n      const commonLibPkg = JSON.parse(\r\n        fs.readFileSync(mainPackagePath, {\r\n          encoding: 'utf8',\r\n        })\r\n      )\r\n      version = commonLibPkg.dependencies[`@94ai/${name}`]\r\n    }\r\n    if (!version || version?.indexOf('workspace:^') > -1) {\r\n      version = JSON.parse(\r\n        fs.readFileSync(path.resolve(__dirname, 'lerna.json'), {\r\n          encoding: 'utf8',\r\n        })\r\n      ).version\r\n    }\r\n  } else {\r\n    version = JSON.parse(\r\n      fs.readFileSync(path.resolve(__dirname, 'lerna.json'), {\r\n        encoding: 'utf8',\r\n      })\r\n    ).version\r\n  }\r\n  const targetLibPkg = JSON.parse(\r\n    fs.readFileSync(targetPackagePath, {\r\n      encoding: 'utf8',\r\n    })\r\n  )\r\n  targetLibPkg.version = version\r\n    .replace('^', '')\r\n    .replace('~', '')\r\n    .replace('@', '')\r\n  fsExtra.outputFileSync(\r\n    targetPackagePath,\r\n    JSON.stringify(targetLibPkg, null, 2),\r\n    'utf-8'\r\n  )\r\n}\r\nconst sourcePackageHandler = (name) => {\r\n  const tagrgetPath = path.resolve(__dirname, output, name, 'package')\r\n  fsExtra.ensureDirSync(tagrgetPath)\r\n  copyFile(path.resolve(__dirname, src, name, 'lib'), tagrgetPath)\r\n}\r\n\r\nconst buildLib = async () => {\r\n  const singles = process.argv.slice(2)\r\n  if (singles?.length) {\r\n    for (const single of singles) {\r\n      if (themes.includes(single)) {\r\n        handleThemePack(single)\r\n        continue\r\n      }\r\n      await handlePackBundle(single)\r\n      await handleConfigFiles(single)\r\n      if (single !== 'codepen') {\r\n        await handlePackBundle(single, true)\r\n      }\r\n      await handleSyncVersion(single)\r\n      sourcePackageHandler(single)\r\n    }\r\n  } else {\r\n    handleThemePack()\r\n    for (const name of components) {\r\n      await handlePackBundle(name)\r\n      await handleConfigFiles(name)\r\n      await handleSyncVersion(name)\r\n      sourcePackageHandler(name)\r\n    }\r\n    for (const name of components) {\r\n      if (name !== 'codepen') {\r\n        await handlePackBundle(name, true)\r\n      }\r\n    }\r\n  }\r\n}\r\nbuildLib()\r\n```\r\n\r\n## License\r\n\r\nThis content is released under the [MIT](http://opensource.org/licenses/MIT) License.\r\n\r\n此内容在[MIT]下发布(http://opensource.org/licenses/MIT)许可证。\r\n","readmeFilename":"README.md"}