@verdaccio/plugin-verifier 1.0.0-next-9.17 → 1.0.0-next-9.18

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/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @verdaccio/plugin-verifier
2
2
 
3
+ ## 1.0.0-next-9.18
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [d3b0352]
8
+ - Updated dependencies [c499c4e]
9
+ - @verdaccio/loaders@9.0.0-next-9.22
10
+ - @verdaccio/logger@9.0.0-next-9.22
11
+ - @verdaccio/core@9.0.0-next-9.22
12
+
3
13
  ## 1.0.0-next-9.17
4
14
 
5
15
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"verify.cjs","names":[],"sources":["../../src/commands/verify.ts"],"sourcesContent":["import { Command, Option } from 'clipanion';\nimport buildDebug from 'debug';\n\nimport { PLUGIN_CATEGORY, PLUGIN_PREFIX } from '@verdaccio/core';\n\nimport { verifyPlugin } from '../verify-plugin';\n\nconst debug = buildDebug('verdaccio:plugin:verifier:cli');\nconst VALID_CATEGORIES = Object.values(PLUGIN_CATEGORY);\n\nexport class VerifyCommand extends Command {\n public static paths = [Command.Default];\n\n static usage = Command.Usage({\n description: 'Verify that a Verdaccio plugin can be loaded and passes sanity checks',\n details: `\n This command uses the same plugin loader that Verdaccio runs at startup\n (\\`asyncLoadPlugin\\` from \\`@verdaccio/loaders\\`) to verify that a plugin\n can be resolved, instantiated, and passes the required sanity checks\n for its category.\n\n The plugin is identified by its short name (as it appears in \\`config.yaml\\`),\n and the loader applies the prefix automatically. For example, \\`my-auth\\`\n resolves to \\`verdaccio-my-auth\\` in the plugins folder or \\`node_modules\\`.\n\n Scoped packages (e.g. \\`@myorg/my-plugin\\`) are used as-is without a prefix.\n\n Enable debug output with the DEBUG environment variable:\n DEBUG=verdaccio:plugin:verifier* verdaccio-plugin-verifier my-auth --category authentication\n `,\n examples: [\n [\n 'Verify an auth plugin from a plugins folder',\n 'verdaccio-plugin-verifier my-auth --category authentication --plugins-folder ./plugins',\n ],\n [\n 'Verify a storage plugin installed via npm',\n 'verdaccio-plugin-verifier my-storage --category storage',\n ],\n [\n 'Verify a scoped plugin with a custom prefix',\n 'verdaccio-plugin-verifier @myorg/my-plugin --category middleware --prefix mycompany',\n ],\n ],\n });\n\n private pluginPath = Option.String({\n required: true,\n name: 'plugin',\n });\n\n private category = Option.String('--category,-c', {\n required: true,\n description: `Plugin category: ${VALID_CATEGORIES.join(', ')}`,\n });\n\n private pluginsFolder = Option.String('--plugins-folder,-d', {\n description: 'Absolute path to the plugins directory (maps to config.plugins)',\n });\n\n private prefix = Option.String('--prefix,-p', {\n description: `Plugin name prefix (default: \"${PLUGIN_PREFIX}\")`,\n });\n\n public async execute(): Promise<number> {\n debug('command invoked with plugin=%o category=%o', this.pluginPath, this.category);\n debug('pluginsFolder=%o prefix=%o', this.pluginsFolder, this.prefix);\n\n if (!VALID_CATEGORIES.includes(this.category)) {\n this.context.stderr.write(\n `Error: Invalid category \"${this.category}\". Must be one of: ${VALID_CATEGORIES.join(', ')}\\n`\n );\n return 1;\n }\n\n const result = await verifyPlugin({\n pluginPath: this.pluginPath,\n category: this.category,\n pluginsFolder: this.pluginsFolder,\n prefix: this.prefix,\n });\n\n if (result.success) {\n this.context.stdout.write(\n `Plugin \"${result.pluginName}\" verified successfully for category \"${result.category}\" (${result.pluginsLoaded} instance(s) loaded)\\n`\n );\n return 0;\n }\n\n this.context.stderr.write(`Plugin verification failed: ${result.error}\\n`);\n if (result.diagnostics && result.diagnostics.length > 0) {\n this.context.stderr.write('\\nDiagnostics:\\n');\n for (const step of result.diagnostics) {\n const icon = step.pass ? 'PASS' : 'FAIL';\n this.context.stderr.write(` [${icon}] ${step.phase}: ${step.message}\\n`);\n }\n }\n return 1;\n }\n}\n"],"mappings":";;;;;;;AAOA,IAAM,WAAA,GAAA,MAAA,SAAmB,+BAA+B;AACxD,IAAM,mBAAmB,OAAO,OAAO,gBAAA,eAAe;AAEtD,IAAa,gBAAb,cAAmC,UAAA,QAAQ;CACzC,OAAc,QAAQ,CAAC,UAAA,QAAQ,OAAO;CAEtC,OAAO,QAAQ,UAAA,QAAQ,MAAM;EAC3B,aAAa;EACb,SAAS;;;;;;;;;;;;;;;EAeT,UAAU;GACR,CACE,+CACA,wFACF;GACA,CACE,6CACA,yDACF;GACA,CACE,+CACA,qFACF;EACF;CACF,CAAC;CAED,aAAqB,UAAA,OAAO,OAAO;EACjC,UAAU;EACV,MAAM;CACR,CAAC;CAED,WAAmB,UAAA,OAAO,OAAO,iBAAiB;EAChD,UAAU;EACV,aAAa,oBAAoB,iBAAiB,KAAK,IAAI;CAC7D,CAAC;CAED,gBAAwB,UAAA,OAAO,OAAO,uBAAuB,EAC3D,aAAa,kEACf,CAAC;CAED,SAAiB,UAAA,OAAO,OAAO,eAAe,EAC5C,aAAa,iCAAiC,gBAAA,cAAc,IAC9D,CAAC;CAED,MAAa,UAA2B;EACtC,QAAM,8CAA8C,KAAK,YAAY,KAAK,QAAQ;EAClF,QAAM,8BAA8B,KAAK,eAAe,KAAK,MAAM;EAEnE,IAAI,CAAC,iBAAiB,SAAS,KAAK,QAAQ,GAAG;GAC7C,KAAK,QAAQ,OAAO,MAClB,4BAA4B,KAAK,SAAS,qBAAqB,iBAAiB,KAAK,IAAI,EAAE,GAC7F;GACA,OAAO;EACT;EAEA,MAAM,SAAS,MAAM,sBAAA,aAAa;GAChC,YAAY,KAAK;GACjB,UAAU,KAAK;GACf,eAAe,KAAK;GACpB,QAAQ,KAAK;EACf,CAAC;EAED,IAAI,OAAO,SAAS;GAClB,KAAK,QAAQ,OAAO,MAClB,WAAW,OAAO,WAAW,wCAAwC,OAAO,SAAS,KAAK,OAAO,cAAc,uBACjH;GACA,OAAO;EACT;EAEA,KAAK,QAAQ,OAAO,MAAM,+BAA+B,OAAO,MAAM,GAAG;EACzE,IAAI,OAAO,eAAe,OAAO,YAAY,SAAS,GAAG;GACvD,KAAK,QAAQ,OAAO,MAAM,kBAAkB;GAC5C,KAAK,MAAM,QAAQ,OAAO,aAAa;IACrC,MAAM,OAAO,KAAK,OAAO,SAAS;IAClC,KAAK,QAAQ,OAAO,MAAM,MAAM,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,QAAQ,GAAG;GAC1E;EACF;EACA,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"verify.cjs","names":[],"sources":["../../src/commands/verify.ts"],"sourcesContent":["import { Command, Option } from 'clipanion';\nimport buildDebug from 'debug';\n\nimport { PLUGIN_CATEGORY, PLUGIN_PREFIX } from '@verdaccio/core';\n\nimport { verifyPlugin } from '../verify-plugin';\n\nconst debug = buildDebug('verdaccio:plugin:verifier:cli');\nconst VALID_CATEGORIES = Object.values(PLUGIN_CATEGORY);\n\nexport class VerifyCommand extends Command {\n public static paths = [Command.Default];\n\n static usage = Command.Usage({\n description: 'Verify that a Verdaccio plugin can be loaded and passes sanity checks',\n details: `\n This command uses the same plugin loader that Verdaccio runs at startup\n (\\`asyncLoadPlugin\\` from \\`@verdaccio/loaders\\`) to verify that a plugin\n can be resolved, instantiated, and passes the required sanity checks\n for its category.\n\n The plugin is identified by its short name (as it appears in \\`config.yaml\\`),\n and the loader applies the prefix automatically. For example, \\`my-auth\\`\n resolves to \\`verdaccio-my-auth\\` in the plugins folder or \\`node_modules\\`.\n\n Scoped packages (e.g. \\`@myorg/my-plugin\\`) are used as-is without a prefix.\n\n Enable debug output with the DEBUG environment variable:\n DEBUG=verdaccio:plugin:verifier* verdaccio-plugin-verifier my-auth --category authentication\n `,\n examples: [\n [\n 'Verify an auth plugin from a plugins folder',\n 'verdaccio-plugin-verifier my-auth --category authentication --plugins-folder ./plugins',\n ],\n [\n 'Verify a storage plugin installed via npm',\n 'verdaccio-plugin-verifier my-storage --category storage',\n ],\n [\n 'Verify a scoped plugin with a custom prefix',\n 'verdaccio-plugin-verifier @myorg/my-plugin --category middleware --prefix mycompany',\n ],\n ],\n });\n\n private pluginPath = Option.String({\n required: true,\n name: 'plugin',\n });\n\n private category = Option.String('--category,-c', {\n required: true,\n description: `Plugin category: ${VALID_CATEGORIES.join(', ')}`,\n });\n\n private pluginsFolder = Option.String('--plugins-folder,-d', {\n description: 'Absolute path to the plugins directory (maps to config.plugins)',\n });\n\n private prefix = Option.String('--prefix,-p', {\n description: `Plugin name prefix (default: \"${PLUGIN_PREFIX}\")`,\n });\n\n public async execute(): Promise<number> {\n debug('command invoked with plugin=%o category=%o', this.pluginPath, this.category);\n debug('pluginsFolder=%o prefix=%o', this.pluginsFolder, this.prefix);\n\n if (!VALID_CATEGORIES.includes(this.category)) {\n this.context.stderr.write(\n `Error: Invalid category \"${this.category}\". Must be one of: ${VALID_CATEGORIES.join(', ')}\\n`\n );\n return 1;\n }\n\n const result = await verifyPlugin({\n pluginPath: this.pluginPath,\n category: this.category,\n pluginsFolder: this.pluginsFolder,\n prefix: this.prefix,\n });\n\n if (result.success) {\n this.context.stdout.write(\n `Plugin \"${result.pluginName}\" verified successfully for category \"${result.category}\" (${result.pluginsLoaded} instance(s) loaded)\\n`\n );\n return 0;\n }\n\n this.context.stderr.write(`Plugin verification failed: ${result.error}\\n`);\n if (result.diagnostics && result.diagnostics.length > 0) {\n this.context.stderr.write('\\nDiagnostics:\\n');\n for (const step of result.diagnostics) {\n const icon = step.pass ? 'PASS' : 'FAIL';\n this.context.stderr.write(` [${icon}] ${step.phase}: ${step.message}\\n`);\n }\n }\n return 1;\n }\n}\n"],"mappings":";;;;;;;AAOA,IAAM,WAAA,GAAA,MAAA,QAAA,CAAmB,+BAA+B;AACxD,IAAM,mBAAmB,OAAO,OAAO,gBAAA,eAAe;AAEtD,IAAa,gBAAb,cAAmC,UAAA,QAAQ;CACzC,OAAc,QAAQ,CAAC,UAAA,QAAQ,OAAO;CAEtC,OAAO,QAAQ,UAAA,QAAQ,MAAM;EAC3B,aAAa;EACb,SAAS;;;;;;;;;;;;;;;EAeT,UAAU;GACR,CACE,+CACA,wFACF;GACA,CACE,6CACA,yDACF;GACA,CACE,+CACA,qFACF;EACF;CACF,CAAC;CAED,aAAqB,UAAA,OAAO,OAAO;EACjC,UAAU;EACV,MAAM;CACR,CAAC;CAED,WAAmB,UAAA,OAAO,OAAO,iBAAiB;EAChD,UAAU;EACV,aAAa,oBAAoB,iBAAiB,KAAK,IAAI;CAC7D,CAAC;CAED,gBAAwB,UAAA,OAAO,OAAO,uBAAuB,EAC3D,aAAa,kEACf,CAAC;CAED,SAAiB,UAAA,OAAO,OAAO,eAAe,EAC5C,aAAa,iCAAiC,gBAAA,cAAc,IAC9D,CAAC;CAED,MAAa,UAA2B;EACtC,QAAM,8CAA8C,KAAK,YAAY,KAAK,QAAQ;EAClF,QAAM,8BAA8B,KAAK,eAAe,KAAK,MAAM;EAEnE,IAAI,CAAC,iBAAiB,SAAS,KAAK,QAAQ,GAAG;GAC7C,KAAK,QAAQ,OAAO,MAClB,4BAA4B,KAAK,SAAS,qBAAqB,iBAAiB,KAAK,IAAI,EAAE,GAC7F;GACA,OAAO;EACT;EAEA,MAAM,SAAS,MAAM,sBAAA,aAAa;GAChC,YAAY,KAAK;GACjB,UAAU,KAAK;GACf,eAAe,KAAK;GACpB,QAAQ,KAAK;EACf,CAAC;EAED,IAAI,OAAO,SAAS;GAClB,KAAK,QAAQ,OAAO,MAClB,WAAW,OAAO,WAAW,wCAAwC,OAAO,SAAS,KAAK,OAAO,cAAc,uBACjH;GACA,OAAO;EACT;EAEA,KAAK,QAAQ,OAAO,MAAM,+BAA+B,OAAO,MAAM,GAAG;EACzE,IAAI,OAAO,eAAe,OAAO,YAAY,SAAS,GAAG;GACvD,KAAK,QAAQ,OAAO,MAAM,kBAAkB;GAC5C,KAAK,MAAM,QAAQ,OAAO,aAAa;IACrC,MAAM,OAAO,KAAK,OAAO,SAAS;IAClC,KAAK,QAAQ,OAAO,MAAM,MAAM,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,QAAQ,GAAG;GAC1E;EACF;EACA,OAAO;CACT;AACF"}
@@ -1,7 +1,7 @@
1
1
  import { Command } from 'clipanion';
2
2
  export declare class VerifyCommand extends Command {
3
3
  static paths: never[][];
4
- static usage: import('clipanion').Usage;
4
+ static usage: import("clipanion").Usage;
5
5
  private pluginPath;
6
6
  private category;
7
7
  private pluginsFolder;
@@ -1 +1 @@
1
- {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAU5C,qBAAa,aAAc,SAAQ,OAAO;IACxC,OAAc,KAAK,YAAqB;IAExC,MAAM,CAAC,KAAK,4BA+BT;IAEH,OAAO,CAAC,UAAU,CAGf;IAEH,OAAO,CAAC,QAAQ,CAGb;IAEH,OAAO,CAAC,aAAa,CAElB;IAEH,OAAO,CAAC,MAAM,CAEX;IAEU,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAmCxC"}
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAU5C,qBAAa,aAAc,SAAQ,OAAO;IACxC,OAAc,KAAK,YAAqB;IAExC,MAAM,CAAC,KAAK,4BA+BT;IAEH,OAAO,CAAC,UAAU,CAGf;IAEH,OAAO,CAAC,QAAQ,CAGb;IAEH,OAAO,CAAC,aAAa,CAElB;IAEH,OAAO,CAAC,MAAM,CAEX;IAEU,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAkCtC;CACF"}
@@ -204,6 +204,7 @@ function parseMissingDependency(message, pluginPath) {
204
204
  return null;
205
205
  }
206
206
  //#endregion
207
+ exports.resolveEntryPoint = resolveEntryPoint;
207
208
  exports.runDiagnostics = runDiagnostics;
208
209
 
209
210
  //# sourceMappingURL=diagnostics.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.cjs","names":[],"sources":["../src/diagnostics.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { join, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport { PLUGIN_PREFIX } from '@verdaccio/core';\n\nimport { getSanityCheck } from './sanity-checks';\nimport type { DiagnosticStep, VerifyPluginOptions } from './types';\n\nconst debug = buildDebug('verdaccio:plugin:verifier:diagnostics');\n\n// createRequire needs an absolute path; works in both ESM and CJS contexts\nconst requireModule = createRequire(\n typeof __filename !== 'undefined' ? __filename : import.meta.url\n);\n\nfunction isValidExport(plugin: any): boolean {\n return typeof plugin === 'function' || typeof plugin?.default === 'function';\n}\n\nfunction isES6(plugin: any): boolean {\n return plugin && typeof plugin === 'object' && 'default' in plugin;\n}\n\n/**\n * Resolve the ESM entry point for a directory-based plugin.\n * import() doesn't support directory imports, so we resolve via package.json.\n */\nexport function resolveEntryPoint(dirPath: string): string {\n const pkgPath = join(dirPath, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (pkg.exports) {\n const dotExport = pkg.exports['.'];\n if (typeof dotExport === 'string') {\n return join(dirPath, dotExport);\n }\n if (dotExport?.import?.default) {\n return join(dirPath, dotExport.import.default);\n }\n if (dotExport?.import && typeof dotExport.import === 'string') {\n return join(dirPath, dotExport.import);\n }\n if (dotExport?.default) {\n return join(dirPath, dotExport.default);\n }\n }\n if (pkg.module) {\n return join(dirPath, pkg.module);\n }\n if (pkg.main) {\n return join(dirPath, pkg.main);\n }\n } catch {\n // fall through\n }\n }\n return join(dirPath, 'index.js');\n}\n\n/**\n * Try to load a module, falling back from require() to import() for ESM.\n * Handles CJS require(), ESM require() shim errors (bundlers), and\n * ERR_REQUIRE_ESM — always falls through to dynamic import() on any\n * require() failure.\n */\nasync function tryResolve(modulePath: string): Promise<{ module: any; error?: string }> {\n // Try require() first (fast path for CJS modules)\n try {\n return { module: requireModule(modulePath) };\n } catch (requireErr: any) {\n debug('require() failed for %o: %s — trying dynamic import', modulePath, requireErr.message);\n }\n\n // Fallback to dynamic import() for ESM modules\n try {\n let importPath = modulePath;\n if (existsSync(modulePath) && existsSync(join(modulePath, 'package.json'))) {\n importPath = resolveEntryPoint(modulePath);\n debug('resolved ESM entry point: %o', importPath);\n }\n const importUrl = importPath.startsWith('/') ? pathToFileURL(importPath).href : importPath;\n const mod = await import(importUrl);\n return { module: mod };\n } catch (importErr: any) {\n return { module: null, error: importErr.message };\n }\n}\n\n/**\n * Runs step-by-step diagnostics to identify exactly which phase of\n * plugin loading fails. This replicates the same resolution logic\n * as `asyncLoadPlugin` but tests each step independently.\n */\nexport async function runDiagnostics(options: VerifyPluginOptions): Promise<DiagnosticStep[]> {\n const {\n pluginPath,\n category,\n pluginConfig = {},\n sanityCheck: customSanityCheck,\n prefix = PLUGIN_PREFIX,\n pluginsFolder,\n } = options;\n\n const steps: DiagnosticStep[] = [];\n const isScoped = pluginPath.startsWith('@') && pluginPath.includes('/');\n const pluginName = isScoped ? pluginPath : `${prefix}-${pluginPath}`;\n\n debug('running diagnostics for %o (resolved name: %o)', pluginPath, pluginName);\n\n // --- Phase 1: Resolve ---\n let pluginModule: any = null;\n let resolvedFrom = '';\n\n // Try plugins folder first\n if (pluginsFolder) {\n const absFolder = resolve(pluginsFolder);\n const pluginDir = join(absFolder, pluginName);\n debug('checking plugins folder: %o', pluginDir);\n\n if (!existsSync(absFolder)) {\n steps.push({\n phase: 'resolve',\n pass: false,\n message: `Plugins folder does not exist: ${absFolder}`,\n });\n return steps;\n }\n\n if (!existsSync(pluginDir)) {\n debug('plugin directory not found: %o', pluginDir);\n steps.push({\n phase: 'resolve',\n pass: false,\n message: `Plugin directory not found: ${pluginDir} — expected a folder named \"${pluginName}\" inside \"${absFolder}\"`,\n });\n return steps;\n }\n\n const result = await tryResolve(pluginDir);\n if (result.module) {\n pluginModule = result.module;\n resolvedFrom = pluginDir;\n debug('resolved from plugins folder: %o', pluginDir);\n } else {\n const missingDep = parseMissingDependency(result.error ?? '', pluginDir);\n steps.push({\n phase: 'resolve',\n pass: false,\n message: missingDep\n ? `Plugin found at ${pluginDir} but has a missing dependency: ${missingDep}`\n : `Plugin found at ${pluginDir} but failed to load: ${result.error}`,\n });\n return steps;\n }\n }\n\n // Try node_modules if not found in plugins folder\n if (!pluginModule) {\n const result = await tryResolve(pluginName);\n if (result.module) {\n pluginModule = result.module;\n resolvedFrom = pluginName;\n debug('resolved from node_modules: %o', pluginName);\n } else {\n const missingDep = parseMissingDependency(result.error ?? '', pluginName);\n steps.push({\n phase: 'resolve',\n pass: false,\n message: missingDep\n ? `Package \"${pluginName}\" found but has a missing dependency: ${missingDep}`\n : `Package \"${pluginName}\" not found in node_modules — try: npm install ${pluginName}`,\n });\n return steps;\n }\n }\n\n steps.push({\n phase: 'resolve',\n pass: true,\n message: `Module resolved from ${resolvedFrom}`,\n });\n\n // --- Phase 2: Export validation ---\n if (!isValidExport(pluginModule)) {\n const exportKeys = pluginModule ? Object.keys(pluginModule).join(', ') : 'none';\n steps.push({\n phase: 'export',\n pass: false,\n message: `Module does not export a function or class (default export). Exported keys: [${exportKeys}]`,\n });\n return steps;\n }\n\n const moduleType = isES6(pluginModule) ? 'ES6 (default export)' : 'CommonJS (factory function)';\n steps.push({\n phase: 'export',\n pass: true,\n message: `Valid ${moduleType} plugin export detected`,\n });\n\n // --- Phase 3: Instantiation ---\n let instance: any;\n try {\n if (isES6(pluginModule)) {\n instance = new pluginModule.default(pluginConfig, { config: pluginConfig, logger: console });\n } else {\n instance = pluginModule(pluginConfig, { config: pluginConfig, logger: console });\n }\n } catch (err: any) {\n steps.push({\n phase: 'instantiate',\n pass: false,\n message: `Plugin threw during instantiation: ${err.message}`,\n });\n return steps;\n }\n\n if (!instance || (typeof instance !== 'object' && typeof instance !== 'function')) {\n steps.push({\n phase: 'instantiate',\n pass: false,\n message: `Plugin constructor/factory returned ${instance === null ? 'null' : typeof instance} instead of an object`,\n });\n return steps;\n }\n\n steps.push({\n phase: 'instantiate',\n pass: true,\n message: 'Plugin instantiated successfully',\n });\n\n // --- Phase 4: Sanity check ---\n const sanityCheck = customSanityCheck ?? getSanityCheck(category);\n const passed = sanityCheck(instance);\n\n if (!passed) {\n const methods = Object.getOwnPropertyNames(Object.getPrototypeOf(instance) ?? {})\n .filter((m) => m !== 'constructor')\n .concat(Object.keys(instance));\n const unique = [...new Set(methods)];\n\n steps.push({\n phase: 'sanity-check',\n pass: false,\n message: `Plugin does not implement the required methods for category \"${category}\". Available methods: [${unique.join(', ')}]`,\n });\n return steps;\n }\n\n steps.push({\n phase: 'sanity-check',\n pass: true,\n message: `Plugin passes sanity check for category \"${category}\"`,\n });\n\n return steps;\n}\n\n/**\n * When a MODULE_NOT_FOUND error is about a transitive dependency\n * (not the plugin itself), extract the missing module name.\n */\nfunction parseMissingDependency(message: string, pluginPath: string): string | null {\n const match = message.match(/Cannot find module '([^']+)'/);\n if (match && match[1] && !match[1].includes(pluginPath)) {\n return match[1];\n }\n return null;\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAM,WAAA,GAAA,MAAA,SAAmB,uCAAuC;AAGhE,IAAM,iBAAA,GAAA,YAAA,eACJ,OAAO,eAAe,cAAc,aAAA,CAAA,EAAyB,GAC/D;AAEA,SAAS,cAAc,QAAsB;CAC3C,OAAO,OAAO,WAAW,cAAc,OAAO,QAAQ,YAAY;AACpE;AAEA,SAAS,MAAM,QAAsB;CACnC,OAAO,UAAU,OAAO,WAAW,YAAY,aAAa;AAC9D;;;;;AAMA,SAAgB,kBAAkB,SAAyB;CACzD,MAAM,WAAA,GAAA,UAAA,MAAe,SAAS,cAAc;CAC5C,KAAA,GAAA,QAAA,YAAe,OAAO,GACpB,IAAI;EACF,MAAM,MAAM,KAAK,OAAA,GAAA,QAAA,cAAmB,SAAS,OAAO,CAAC;EACrD,IAAI,IAAI,SAAS;GACf,MAAM,YAAY,IAAI,QAAQ;GAC9B,IAAI,OAAO,cAAc,UACvB,QAAA,GAAA,UAAA,MAAY,SAAS,SAAS;GAEhC,IAAI,WAAW,QAAQ,SACrB,QAAA,GAAA,UAAA,MAAY,SAAS,UAAU,OAAO,OAAO;GAE/C,IAAI,WAAW,UAAU,OAAO,UAAU,WAAW,UACnD,QAAA,GAAA,UAAA,MAAY,SAAS,UAAU,MAAM;GAEvC,IAAI,WAAW,SACb,QAAA,GAAA,UAAA,MAAY,SAAS,UAAU,OAAO;EAE1C;EACA,IAAI,IAAI,QACN,QAAA,GAAA,UAAA,MAAY,SAAS,IAAI,MAAM;EAEjC,IAAI,IAAI,MACN,QAAA,GAAA,UAAA,MAAY,SAAS,IAAI,IAAI;CAEjC,QAAQ,CAER;CAEF,QAAA,GAAA,UAAA,MAAY,SAAS,UAAU;AACjC;;;;;;;AAQA,eAAe,WAAW,YAA8D;CAEtF,IAAI;EACF,OAAO,EAAE,QAAQ,cAAc,UAAU,EAAE;CAC7C,SAAS,YAAiB;EACxB,QAAM,uDAAuD,YAAY,WAAW,OAAO;CAC7F;CAGA,IAAI;EACF,IAAI,aAAa;EACjB,KAAA,GAAA,QAAA,YAAe,UAAU,MAAA,GAAA,QAAA,aAAA,GAAA,UAAA,MAAqB,YAAY,cAAc,CAAC,GAAG;GAC1E,aAAa,kBAAkB,UAAU;GACzC,QAAM,gCAAgC,UAAU;EAClD;EAGA,OAAO,EAAE,QAAQ,OAFC,WAAW,WAAW,GAAG,IAAA,QAAA,GAAA,SAAA,eAAkB,UAAU,EAAE,QAAA,OAAO,aAE3D;CACvB,SAAS,WAAgB;EACvB,OAAO;GAAE,QAAQ;GAAM,OAAO,UAAU;EAAQ;CAClD;AACF;;;;;;AAOA,eAAsB,eAAe,SAAyD;CAC5F,MAAM,EACJ,YACA,UACA,eAAe,CAAC,GAChB,aAAa,mBACb,SAAS,gBAAA,eACT,kBACE;CAEJ,MAAM,QAA0B,CAAC;CAEjC,MAAM,aADW,WAAW,WAAW,GAAG,KAAK,WAAW,SAAS,GAAG,IACxC,aAAa,GAAG,OAAO,GAAG;CAExD,QAAM,kDAAkD,YAAY,UAAU;CAG9E,IAAI,eAAoB;CACxB,IAAI,eAAe;CAGnB,IAAI,eAAe;EACjB,MAAM,aAAA,GAAA,UAAA,SAAoB,aAAa;EACvC,MAAM,aAAA,GAAA,UAAA,MAAiB,WAAW,UAAU;EAC5C,QAAM,+BAA+B,SAAS;EAE9C,IAAI,EAAA,GAAA,QAAA,YAAY,SAAS,GAAG;GAC1B,MAAM,KAAK;IACT,OAAO;IACP,MAAM;IACN,SAAS,kCAAkC;GAC7C,CAAC;GACD,OAAO;EACT;EAEA,IAAI,EAAA,GAAA,QAAA,YAAY,SAAS,GAAG;GAC1B,QAAM,kCAAkC,SAAS;GACjD,MAAM,KAAK;IACT,OAAO;IACP,MAAM;IACN,SAAS,+BAA+B,UAAU,8BAA8B,WAAW,YAAY,UAAU;GACnH,CAAC;GACD,OAAO;EACT;EAEA,MAAM,SAAS,MAAM,WAAW,SAAS;EACzC,IAAI,OAAO,QAAQ;GACjB,eAAe,OAAO;GACtB,eAAe;GACf,QAAM,oCAAoC,SAAS;EACrD,OAAO;GACL,MAAM,aAAa,uBAAuB,OAAO,SAAS,IAAI,SAAS;GACvE,MAAM,KAAK;IACT,OAAO;IACP,MAAM;IACN,SAAS,aACL,mBAAmB,UAAU,iCAAiC,eAC9D,mBAAmB,UAAU,uBAAuB,OAAO;GACjE,CAAC;GACD,OAAO;EACT;CACF;CAGA,IAAI,CAAC,cAAc;EACjB,MAAM,SAAS,MAAM,WAAW,UAAU;EAC1C,IAAI,OAAO,QAAQ;GACjB,eAAe,OAAO;GACtB,eAAe;GACf,QAAM,kCAAkC,UAAU;EACpD,OAAO;GACL,MAAM,aAAa,uBAAuB,OAAO,SAAS,IAAI,UAAU;GACxE,MAAM,KAAK;IACT,OAAO;IACP,MAAM;IACN,SAAS,aACL,YAAY,WAAW,wCAAwC,eAC/D,YAAY,WAAW,iDAAiD;GAC9E,CAAC;GACD,OAAO;EACT;CACF;CAEA,MAAM,KAAK;EACT,OAAO;EACP,MAAM;EACN,SAAS,wBAAwB;CACnC,CAAC;CAGD,IAAI,CAAC,cAAc,YAAY,GAAG;EAChC,MAAM,aAAa,eAAe,OAAO,KAAK,YAAY,EAAE,KAAK,IAAI,IAAI;EACzE,MAAM,KAAK;GACT,OAAO;GACP,MAAM;GACN,SAAS,gFAAgF,WAAW;EACtG,CAAC;EACD,OAAO;CACT;CAEA,MAAM,aAAa,MAAM,YAAY,IAAI,yBAAyB;CAClE,MAAM,KAAK;EACT,OAAO;EACP,MAAM;EACN,SAAS,SAAS,WAAW;CAC/B,CAAC;CAGD,IAAI;CACJ,IAAI;EACF,IAAI,MAAM,YAAY,GACpB,WAAW,IAAI,aAAa,QAAQ,cAAc;GAAE,QAAQ;GAAc,QAAQ;EAAQ,CAAC;OAE3F,WAAW,aAAa,cAAc;GAAE,QAAQ;GAAc,QAAQ;EAAQ,CAAC;CAEnF,SAAS,KAAU;EACjB,MAAM,KAAK;GACT,OAAO;GACP,MAAM;GACN,SAAS,sCAAsC,IAAI;EACrD,CAAC;EACD,OAAO;CACT;CAEA,IAAI,CAAC,YAAa,OAAO,aAAa,YAAY,OAAO,aAAa,YAAa;EACjF,MAAM,KAAK;GACT,OAAO;GACP,MAAM;GACN,SAAS,uCAAuC,aAAa,OAAO,SAAS,OAAO,SAAS;EAC/F,CAAC;EACD,OAAO;CACT;CAEA,MAAM,KAAK;EACT,OAAO;EACP,MAAM;EACN,SAAS;CACX,CAAC;CAMD,IAAI,EAHgB,qBAAqB,sBAAA,eAAe,QAAQ,GACrC,QAEtB,GAAQ;EACX,MAAM,UAAU,OAAO,oBAAoB,OAAO,eAAe,QAAQ,KAAK,CAAC,CAAC,EAC7E,QAAQ,MAAM,MAAM,aAAa,EACjC,OAAO,OAAO,KAAK,QAAQ,CAAC;EAC/B,MAAM,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;EAEnC,MAAM,KAAK;GACT,OAAO;GACP,MAAM;GACN,SAAS,gEAAgE,SAAS,yBAAyB,OAAO,KAAK,IAAI,EAAE;EAC/H,CAAC;EACD,OAAO;CACT;CAEA,MAAM,KAAK;EACT,OAAO;EACP,MAAM;EACN,SAAS,4CAA4C,SAAS;CAChE,CAAC;CAED,OAAO;AACT;;;;;AAMA,SAAS,uBAAuB,SAAiB,YAAmC;CAClF,MAAM,QAAQ,QAAQ,MAAM,8BAA8B;CAC1D,IAAI,SAAS,MAAM,MAAM,CAAC,MAAM,GAAG,SAAS,UAAU,GACpD,OAAO,MAAM;CAEf,OAAO;AACT"}
1
+ {"version":3,"file":"diagnostics.cjs","names":[],"sources":["../src/diagnostics.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { join, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport { PLUGIN_PREFIX } from '@verdaccio/core';\n\nimport { getSanityCheck } from './sanity-checks';\nimport type { DiagnosticStep, VerifyPluginOptions } from './types';\n\nconst debug = buildDebug('verdaccio:plugin:verifier:diagnostics');\n\n// createRequire needs an absolute path; works in both ESM and CJS contexts\nconst requireModule = createRequire(\n typeof __filename !== 'undefined' ? __filename : import.meta.url\n);\n\nfunction isValidExport(plugin: any): boolean {\n return typeof plugin === 'function' || typeof plugin?.default === 'function';\n}\n\nfunction isES6(plugin: any): boolean {\n return plugin && typeof plugin === 'object' && 'default' in plugin;\n}\n\n/**\n * Resolve the ESM entry point for a directory-based plugin.\n * import() doesn't support directory imports, so we resolve via package.json.\n */\nexport function resolveEntryPoint(dirPath: string): string {\n const pkgPath = join(dirPath, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (pkg.exports) {\n const dotExport = pkg.exports['.'];\n if (typeof dotExport === 'string') {\n return join(dirPath, dotExport);\n }\n if (dotExport?.import?.default) {\n return join(dirPath, dotExport.import.default);\n }\n if (dotExport?.import && typeof dotExport.import === 'string') {\n return join(dirPath, dotExport.import);\n }\n if (dotExport?.default) {\n return join(dirPath, dotExport.default);\n }\n }\n if (pkg.module) {\n return join(dirPath, pkg.module);\n }\n if (pkg.main) {\n return join(dirPath, pkg.main);\n }\n } catch {\n // fall through\n }\n }\n return join(dirPath, 'index.js');\n}\n\n/**\n * Try to load a module, falling back from require() to import() for ESM.\n * Handles CJS require(), ESM require() shim errors (bundlers), and\n * ERR_REQUIRE_ESM — always falls through to dynamic import() on any\n * require() failure.\n */\nasync function tryResolve(modulePath: string): Promise<{ module: any; error?: string }> {\n // Try require() first (fast path for CJS modules)\n try {\n return { module: requireModule(modulePath) };\n } catch (requireErr: any) {\n debug('require() failed for %o: %s — trying dynamic import', modulePath, requireErr.message);\n }\n\n // Fallback to dynamic import() for ESM modules\n try {\n let importPath = modulePath;\n if (existsSync(modulePath) && existsSync(join(modulePath, 'package.json'))) {\n importPath = resolveEntryPoint(modulePath);\n debug('resolved ESM entry point: %o', importPath);\n }\n const importUrl = importPath.startsWith('/') ? pathToFileURL(importPath).href : importPath;\n const mod = await import(importUrl);\n return { module: mod };\n } catch (importErr: any) {\n return { module: null, error: importErr.message };\n }\n}\n\n/**\n * Runs step-by-step diagnostics to identify exactly which phase of\n * plugin loading fails. This replicates the same resolution logic\n * as `asyncLoadPlugin` but tests each step independently.\n */\nexport async function runDiagnostics(options: VerifyPluginOptions): Promise<DiagnosticStep[]> {\n const {\n pluginPath,\n category,\n pluginConfig = {},\n sanityCheck: customSanityCheck,\n prefix = PLUGIN_PREFIX,\n pluginsFolder,\n } = options;\n\n const steps: DiagnosticStep[] = [];\n const isScoped = pluginPath.startsWith('@') && pluginPath.includes('/');\n const pluginName = isScoped ? pluginPath : `${prefix}-${pluginPath}`;\n\n debug('running diagnostics for %o (resolved name: %o)', pluginPath, pluginName);\n\n // --- Phase 1: Resolve ---\n let pluginModule: any = null;\n let resolvedFrom = '';\n\n // Try plugins folder first\n if (pluginsFolder) {\n const absFolder = resolve(pluginsFolder);\n const pluginDir = join(absFolder, pluginName);\n debug('checking plugins folder: %o', pluginDir);\n\n if (!existsSync(absFolder)) {\n steps.push({\n phase: 'resolve',\n pass: false,\n message: `Plugins folder does not exist: ${absFolder}`,\n });\n return steps;\n }\n\n if (!existsSync(pluginDir)) {\n debug('plugin directory not found: %o', pluginDir);\n steps.push({\n phase: 'resolve',\n pass: false,\n message: `Plugin directory not found: ${pluginDir} — expected a folder named \"${pluginName}\" inside \"${absFolder}\"`,\n });\n return steps;\n }\n\n const result = await tryResolve(pluginDir);\n if (result.module) {\n pluginModule = result.module;\n resolvedFrom = pluginDir;\n debug('resolved from plugins folder: %o', pluginDir);\n } else {\n const missingDep = parseMissingDependency(result.error ?? '', pluginDir);\n steps.push({\n phase: 'resolve',\n pass: false,\n message: missingDep\n ? `Plugin found at ${pluginDir} but has a missing dependency: ${missingDep}`\n : `Plugin found at ${pluginDir} but failed to load: ${result.error}`,\n });\n return steps;\n }\n }\n\n // Try node_modules if not found in plugins folder\n if (!pluginModule) {\n const result = await tryResolve(pluginName);\n if (result.module) {\n pluginModule = result.module;\n resolvedFrom = pluginName;\n debug('resolved from node_modules: %o', pluginName);\n } else {\n const missingDep = parseMissingDependency(result.error ?? '', pluginName);\n steps.push({\n phase: 'resolve',\n pass: false,\n message: missingDep\n ? `Package \"${pluginName}\" found but has a missing dependency: ${missingDep}`\n : `Package \"${pluginName}\" not found in node_modules — try: npm install ${pluginName}`,\n });\n return steps;\n }\n }\n\n steps.push({\n phase: 'resolve',\n pass: true,\n message: `Module resolved from ${resolvedFrom}`,\n });\n\n // --- Phase 2: Export validation ---\n if (!isValidExport(pluginModule)) {\n const exportKeys = pluginModule ? Object.keys(pluginModule).join(', ') : 'none';\n steps.push({\n phase: 'export',\n pass: false,\n message: `Module does not export a function or class (default export). Exported keys: [${exportKeys}]`,\n });\n return steps;\n }\n\n const moduleType = isES6(pluginModule) ? 'ES6 (default export)' : 'CommonJS (factory function)';\n steps.push({\n phase: 'export',\n pass: true,\n message: `Valid ${moduleType} plugin export detected`,\n });\n\n // --- Phase 3: Instantiation ---\n let instance: any;\n try {\n if (isES6(pluginModule)) {\n instance = new pluginModule.default(pluginConfig, { config: pluginConfig, logger: console });\n } else {\n instance = pluginModule(pluginConfig, { config: pluginConfig, logger: console });\n }\n } catch (err: any) {\n steps.push({\n phase: 'instantiate',\n pass: false,\n message: `Plugin threw during instantiation: ${err.message}`,\n });\n return steps;\n }\n\n if (!instance || (typeof instance !== 'object' && typeof instance !== 'function')) {\n steps.push({\n phase: 'instantiate',\n pass: false,\n message: `Plugin constructor/factory returned ${instance === null ? 'null' : typeof instance} instead of an object`,\n });\n return steps;\n }\n\n steps.push({\n phase: 'instantiate',\n pass: true,\n message: 'Plugin instantiated successfully',\n });\n\n // --- Phase 4: Sanity check ---\n const sanityCheck = customSanityCheck ?? getSanityCheck(category);\n const passed = sanityCheck(instance);\n\n if (!passed) {\n const methods = Object.getOwnPropertyNames(Object.getPrototypeOf(instance) ?? {})\n .filter((m) => m !== 'constructor')\n .concat(Object.keys(instance));\n const unique = [...new Set(methods)];\n\n steps.push({\n phase: 'sanity-check',\n pass: false,\n message: `Plugin does not implement the required methods for category \"${category}\". Available methods: [${unique.join(', ')}]`,\n });\n return steps;\n }\n\n steps.push({\n phase: 'sanity-check',\n pass: true,\n message: `Plugin passes sanity check for category \"${category}\"`,\n });\n\n return steps;\n}\n\n/**\n * When a MODULE_NOT_FOUND error is about a transitive dependency\n * (not the plugin itself), extract the missing module name.\n */\nfunction parseMissingDependency(message: string, pluginPath: string): string | null {\n const match = message.match(/Cannot find module '([^']+)'/);\n if (match && match[1] && !match[1].includes(pluginPath)) {\n return match[1];\n }\n return null;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { DiagnosticStep, VerifyPluginOptions } from './types';
1
+ import type { DiagnosticStep, VerifyPluginOptions } from './types';
2
2
  /**
3
3
  * Resolve the ESM entry point for a directory-based plugin.
4
4
  * import() doesn't support directory imports, so we resolve via package.json.
@@ -202,6 +202,6 @@ function parseMissingDependency(message, pluginPath) {
202
202
  return null;
203
203
  }
204
204
  //#endregion
205
- export { runDiagnostics };
205
+ export { resolveEntryPoint, runDiagnostics };
206
206
 
207
207
  //# sourceMappingURL=diagnostics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.js","names":[],"sources":["../src/diagnostics.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { join, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport { PLUGIN_PREFIX } from '@verdaccio/core';\n\nimport { getSanityCheck } from './sanity-checks';\nimport type { DiagnosticStep, VerifyPluginOptions } from './types';\n\nconst debug = buildDebug('verdaccio:plugin:verifier:diagnostics');\n\n// createRequire needs an absolute path; works in both ESM and CJS contexts\nconst requireModule = createRequire(\n typeof __filename !== 'undefined' ? __filename : import.meta.url\n);\n\nfunction isValidExport(plugin: any): boolean {\n return typeof plugin === 'function' || typeof plugin?.default === 'function';\n}\n\nfunction isES6(plugin: any): boolean {\n return plugin && typeof plugin === 'object' && 'default' in plugin;\n}\n\n/**\n * Resolve the ESM entry point for a directory-based plugin.\n * import() doesn't support directory imports, so we resolve via package.json.\n */\nexport function resolveEntryPoint(dirPath: string): string {\n const pkgPath = join(dirPath, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (pkg.exports) {\n const dotExport = pkg.exports['.'];\n if (typeof dotExport === 'string') {\n return join(dirPath, dotExport);\n }\n if (dotExport?.import?.default) {\n return join(dirPath, dotExport.import.default);\n }\n if (dotExport?.import && typeof dotExport.import === 'string') {\n return join(dirPath, dotExport.import);\n }\n if (dotExport?.default) {\n return join(dirPath, dotExport.default);\n }\n }\n if (pkg.module) {\n return join(dirPath, pkg.module);\n }\n if (pkg.main) {\n return join(dirPath, pkg.main);\n }\n } catch {\n // fall through\n }\n }\n return join(dirPath, 'index.js');\n}\n\n/**\n * Try to load a module, falling back from require() to import() for ESM.\n * Handles CJS require(), ESM require() shim errors (bundlers), and\n * ERR_REQUIRE_ESM — always falls through to dynamic import() on any\n * require() failure.\n */\nasync function tryResolve(modulePath: string): Promise<{ module: any; error?: string }> {\n // Try require() first (fast path for CJS modules)\n try {\n return { module: requireModule(modulePath) };\n } catch (requireErr: any) {\n debug('require() failed for %o: %s — trying dynamic import', modulePath, requireErr.message);\n }\n\n // Fallback to dynamic import() for ESM modules\n try {\n let importPath = modulePath;\n if (existsSync(modulePath) && existsSync(join(modulePath, 'package.json'))) {\n importPath = resolveEntryPoint(modulePath);\n debug('resolved ESM entry point: %o', importPath);\n }\n const importUrl = importPath.startsWith('/') ? pathToFileURL(importPath).href : importPath;\n const mod = await import(importUrl);\n return { module: mod };\n } catch (importErr: any) {\n return { module: null, error: importErr.message };\n }\n}\n\n/**\n * Runs step-by-step diagnostics to identify exactly which phase of\n * plugin loading fails. This replicates the same resolution logic\n * as `asyncLoadPlugin` but tests each step independently.\n */\nexport async function runDiagnostics(options: VerifyPluginOptions): Promise<DiagnosticStep[]> {\n const {\n pluginPath,\n category,\n pluginConfig = {},\n sanityCheck: customSanityCheck,\n prefix = PLUGIN_PREFIX,\n pluginsFolder,\n } = options;\n\n const steps: DiagnosticStep[] = [];\n const isScoped = pluginPath.startsWith('@') && pluginPath.includes('/');\n const pluginName = isScoped ? pluginPath : `${prefix}-${pluginPath}`;\n\n debug('running diagnostics for %o (resolved name: %o)', pluginPath, pluginName);\n\n // --- Phase 1: Resolve ---\n let pluginModule: any = null;\n let resolvedFrom = '';\n\n // Try plugins folder first\n if (pluginsFolder) {\n const absFolder = resolve(pluginsFolder);\n const pluginDir = join(absFolder, pluginName);\n debug('checking plugins folder: %o', pluginDir);\n\n if (!existsSync(absFolder)) {\n steps.push({\n phase: 'resolve',\n pass: false,\n message: `Plugins folder does not exist: ${absFolder}`,\n });\n return steps;\n }\n\n if (!existsSync(pluginDir)) {\n debug('plugin directory not found: %o', pluginDir);\n steps.push({\n phase: 'resolve',\n pass: false,\n message: `Plugin directory not found: ${pluginDir} — expected a folder named \"${pluginName}\" inside \"${absFolder}\"`,\n });\n return steps;\n }\n\n const result = await tryResolve(pluginDir);\n if (result.module) {\n pluginModule = result.module;\n resolvedFrom = pluginDir;\n debug('resolved from plugins folder: %o', pluginDir);\n } else {\n const missingDep = parseMissingDependency(result.error ?? '', pluginDir);\n steps.push({\n phase: 'resolve',\n pass: false,\n message: missingDep\n ? `Plugin found at ${pluginDir} but has a missing dependency: ${missingDep}`\n : `Plugin found at ${pluginDir} but failed to load: ${result.error}`,\n });\n return steps;\n }\n }\n\n // Try node_modules if not found in plugins folder\n if (!pluginModule) {\n const result = await tryResolve(pluginName);\n if (result.module) {\n pluginModule = result.module;\n resolvedFrom = pluginName;\n debug('resolved from node_modules: %o', pluginName);\n } else {\n const missingDep = parseMissingDependency(result.error ?? '', pluginName);\n steps.push({\n phase: 'resolve',\n pass: false,\n message: missingDep\n ? `Package \"${pluginName}\" found but has a missing dependency: ${missingDep}`\n : `Package \"${pluginName}\" not found in node_modules — try: npm install ${pluginName}`,\n });\n return steps;\n }\n }\n\n steps.push({\n phase: 'resolve',\n pass: true,\n message: `Module resolved from ${resolvedFrom}`,\n });\n\n // --- Phase 2: Export validation ---\n if (!isValidExport(pluginModule)) {\n const exportKeys = pluginModule ? Object.keys(pluginModule).join(', ') : 'none';\n steps.push({\n phase: 'export',\n pass: false,\n message: `Module does not export a function or class (default export). Exported keys: [${exportKeys}]`,\n });\n return steps;\n }\n\n const moduleType = isES6(pluginModule) ? 'ES6 (default export)' : 'CommonJS (factory function)';\n steps.push({\n phase: 'export',\n pass: true,\n message: `Valid ${moduleType} plugin export detected`,\n });\n\n // --- Phase 3: Instantiation ---\n let instance: any;\n try {\n if (isES6(pluginModule)) {\n instance = new pluginModule.default(pluginConfig, { config: pluginConfig, logger: console });\n } else {\n instance = pluginModule(pluginConfig, { config: pluginConfig, logger: console });\n }\n } catch (err: any) {\n steps.push({\n phase: 'instantiate',\n pass: false,\n message: `Plugin threw during instantiation: ${err.message}`,\n });\n return steps;\n }\n\n if (!instance || (typeof instance !== 'object' && typeof instance !== 'function')) {\n steps.push({\n phase: 'instantiate',\n pass: false,\n message: `Plugin constructor/factory returned ${instance === null ? 'null' : typeof instance} instead of an object`,\n });\n return steps;\n }\n\n steps.push({\n phase: 'instantiate',\n pass: true,\n message: 'Plugin instantiated successfully',\n });\n\n // --- Phase 4: Sanity check ---\n const sanityCheck = customSanityCheck ?? getSanityCheck(category);\n const passed = sanityCheck(instance);\n\n if (!passed) {\n const methods = Object.getOwnPropertyNames(Object.getPrototypeOf(instance) ?? {})\n .filter((m) => m !== 'constructor')\n .concat(Object.keys(instance));\n const unique = [...new Set(methods)];\n\n steps.push({\n phase: 'sanity-check',\n pass: false,\n message: `Plugin does not implement the required methods for category \"${category}\". Available methods: [${unique.join(', ')}]`,\n });\n return steps;\n }\n\n steps.push({\n phase: 'sanity-check',\n pass: true,\n message: `Plugin passes sanity check for category \"${category}\"`,\n });\n\n return steps;\n}\n\n/**\n * When a MODULE_NOT_FOUND error is about a transitive dependency\n * (not the plugin itself), extract the missing module name.\n */\nfunction parseMissingDependency(message: string, pluginPath: string): string | null {\n const match = message.match(/Cannot find module '([^']+)'/);\n if (match && match[1] && !match[1].includes(pluginPath)) {\n return match[1];\n }\n return null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"diagnostics.js","names":[],"sources":["../src/diagnostics.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { join, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport { PLUGIN_PREFIX } from '@verdaccio/core';\n\nimport { getSanityCheck } from './sanity-checks';\nimport type { DiagnosticStep, VerifyPluginOptions } from './types';\n\nconst debug = buildDebug('verdaccio:plugin:verifier:diagnostics');\n\n// createRequire needs an absolute path; works in both ESM and CJS contexts\nconst requireModule = createRequire(\n typeof __filename !== 'undefined' ? __filename : import.meta.url\n);\n\nfunction isValidExport(plugin: any): boolean {\n return typeof plugin === 'function' || typeof plugin?.default === 'function';\n}\n\nfunction isES6(plugin: any): boolean {\n return plugin && typeof plugin === 'object' && 'default' in plugin;\n}\n\n/**\n * Resolve the ESM entry point for a directory-based plugin.\n * import() doesn't support directory imports, so we resolve via package.json.\n */\nexport function resolveEntryPoint(dirPath: string): string {\n const pkgPath = join(dirPath, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (pkg.exports) {\n const dotExport = pkg.exports['.'];\n if (typeof dotExport === 'string') {\n return join(dirPath, dotExport);\n }\n if (dotExport?.import?.default) {\n return join(dirPath, dotExport.import.default);\n }\n if (dotExport?.import && typeof dotExport.import === 'string') {\n return join(dirPath, dotExport.import);\n }\n if (dotExport?.default) {\n return join(dirPath, dotExport.default);\n }\n }\n if (pkg.module) {\n return join(dirPath, pkg.module);\n }\n if (pkg.main) {\n return join(dirPath, pkg.main);\n }\n } catch {\n // fall through\n }\n }\n return join(dirPath, 'index.js');\n}\n\n/**\n * Try to load a module, falling back from require() to import() for ESM.\n * Handles CJS require(), ESM require() shim errors (bundlers), and\n * ERR_REQUIRE_ESM — always falls through to dynamic import() on any\n * require() failure.\n */\nasync function tryResolve(modulePath: string): Promise<{ module: any; error?: string }> {\n // Try require() first (fast path for CJS modules)\n try {\n return { module: requireModule(modulePath) };\n } catch (requireErr: any) {\n debug('require() failed for %o: %s — trying dynamic import', modulePath, requireErr.message);\n }\n\n // Fallback to dynamic import() for ESM modules\n try {\n let importPath = modulePath;\n if (existsSync(modulePath) && existsSync(join(modulePath, 'package.json'))) {\n importPath = resolveEntryPoint(modulePath);\n debug('resolved ESM entry point: %o', importPath);\n }\n const importUrl = importPath.startsWith('/') ? pathToFileURL(importPath).href : importPath;\n const mod = await import(importUrl);\n return { module: mod };\n } catch (importErr: any) {\n return { module: null, error: importErr.message };\n }\n}\n\n/**\n * Runs step-by-step diagnostics to identify exactly which phase of\n * plugin loading fails. This replicates the same resolution logic\n * as `asyncLoadPlugin` but tests each step independently.\n */\nexport async function runDiagnostics(options: VerifyPluginOptions): Promise<DiagnosticStep[]> {\n const {\n pluginPath,\n category,\n pluginConfig = {},\n sanityCheck: customSanityCheck,\n prefix = PLUGIN_PREFIX,\n pluginsFolder,\n } = options;\n\n const steps: DiagnosticStep[] = [];\n const isScoped = pluginPath.startsWith('@') && pluginPath.includes('/');\n const pluginName = isScoped ? pluginPath : `${prefix}-${pluginPath}`;\n\n debug('running diagnostics for %o (resolved name: %o)', pluginPath, pluginName);\n\n // --- Phase 1: Resolve ---\n let pluginModule: any = null;\n let resolvedFrom = '';\n\n // Try plugins folder first\n if (pluginsFolder) {\n const absFolder = resolve(pluginsFolder);\n const pluginDir = join(absFolder, pluginName);\n debug('checking plugins folder: %o', pluginDir);\n\n if (!existsSync(absFolder)) {\n steps.push({\n phase: 'resolve',\n pass: false,\n message: `Plugins folder does not exist: ${absFolder}`,\n });\n return steps;\n }\n\n if (!existsSync(pluginDir)) {\n debug('plugin directory not found: %o', pluginDir);\n steps.push({\n phase: 'resolve',\n pass: false,\n message: `Plugin directory not found: ${pluginDir} — expected a folder named \"${pluginName}\" inside \"${absFolder}\"`,\n });\n return steps;\n }\n\n const result = await tryResolve(pluginDir);\n if (result.module) {\n pluginModule = result.module;\n resolvedFrom = pluginDir;\n debug('resolved from plugins folder: %o', pluginDir);\n } else {\n const missingDep = parseMissingDependency(result.error ?? '', pluginDir);\n steps.push({\n phase: 'resolve',\n pass: false,\n message: missingDep\n ? `Plugin found at ${pluginDir} but has a missing dependency: ${missingDep}`\n : `Plugin found at ${pluginDir} but failed to load: ${result.error}`,\n });\n return steps;\n }\n }\n\n // Try node_modules if not found in plugins folder\n if (!pluginModule) {\n const result = await tryResolve(pluginName);\n if (result.module) {\n pluginModule = result.module;\n resolvedFrom = pluginName;\n debug('resolved from node_modules: %o', pluginName);\n } else {\n const missingDep = parseMissingDependency(result.error ?? '', pluginName);\n steps.push({\n phase: 'resolve',\n pass: false,\n message: missingDep\n ? `Package \"${pluginName}\" found but has a missing dependency: ${missingDep}`\n : `Package \"${pluginName}\" not found in node_modules — try: npm install ${pluginName}`,\n });\n return steps;\n }\n }\n\n steps.push({\n phase: 'resolve',\n pass: true,\n message: `Module resolved from ${resolvedFrom}`,\n });\n\n // --- Phase 2: Export validation ---\n if (!isValidExport(pluginModule)) {\n const exportKeys = pluginModule ? Object.keys(pluginModule).join(', ') : 'none';\n steps.push({\n phase: 'export',\n pass: false,\n message: `Module does not export a function or class (default export). Exported keys: [${exportKeys}]`,\n });\n return steps;\n }\n\n const moduleType = isES6(pluginModule) ? 'ES6 (default export)' : 'CommonJS (factory function)';\n steps.push({\n phase: 'export',\n pass: true,\n message: `Valid ${moduleType} plugin export detected`,\n });\n\n // --- Phase 3: Instantiation ---\n let instance: any;\n try {\n if (isES6(pluginModule)) {\n instance = new pluginModule.default(pluginConfig, { config: pluginConfig, logger: console });\n } else {\n instance = pluginModule(pluginConfig, { config: pluginConfig, logger: console });\n }\n } catch (err: any) {\n steps.push({\n phase: 'instantiate',\n pass: false,\n message: `Plugin threw during instantiation: ${err.message}`,\n });\n return steps;\n }\n\n if (!instance || (typeof instance !== 'object' && typeof instance !== 'function')) {\n steps.push({\n phase: 'instantiate',\n pass: false,\n message: `Plugin constructor/factory returned ${instance === null ? 'null' : typeof instance} instead of an object`,\n });\n return steps;\n }\n\n steps.push({\n phase: 'instantiate',\n pass: true,\n message: 'Plugin instantiated successfully',\n });\n\n // --- Phase 4: Sanity check ---\n const sanityCheck = customSanityCheck ?? getSanityCheck(category);\n const passed = sanityCheck(instance);\n\n if (!passed) {\n const methods = Object.getOwnPropertyNames(Object.getPrototypeOf(instance) ?? {})\n .filter((m) => m !== 'constructor')\n .concat(Object.keys(instance));\n const unique = [...new Set(methods)];\n\n steps.push({\n phase: 'sanity-check',\n pass: false,\n message: `Plugin does not implement the required methods for category \"${category}\". Available methods: [${unique.join(', ')}]`,\n });\n return steps;\n }\n\n steps.push({\n phase: 'sanity-check',\n pass: true,\n message: `Plugin passes sanity check for category \"${category}\"`,\n });\n\n return steps;\n}\n\n/**\n * When a MODULE_NOT_FOUND error is about a transitive dependency\n * (not the plugin itself), extract the missing module name.\n */\nfunction parseMissingDependency(message: string, pluginPath: string): string | null {\n const match = message.match(/Cannot find module '([^']+)'/);\n if (match && match[1] && !match[1].includes(pluginPath)) {\n return match[1];\n }\n return null;\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { pluginUtils } from '@verdaccio/core';
2
- import { PluginCategory } from './types';
2
+ import type { PluginCategory } from './types';
3
3
  export declare const authSanityCheck: typeof pluginUtils.authSanityCheck;
4
4
  export declare const storageSanityCheck: typeof pluginUtils.storageSanityCheck;
5
5
  export declare const middlewareSanityCheck: typeof pluginUtils.middlewareSanityCheck;
package/build/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { PLUGIN_CATEGORY } from '@verdaccio/core';
1
+ import type { PLUGIN_CATEGORY } from '@verdaccio/core';
2
2
  export type PluginCategory = (typeof PLUGIN_CATEGORY)[keyof typeof PLUGIN_CATEGORY];
3
3
  export interface VerifyPluginOptions {
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"verify-plugin.cjs","names":[],"sources":["../src/verify-plugin.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { resolve } from 'node:path';\n\nimport { PLUGIN_PREFIX } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport { logger, setup } from '@verdaccio/logger';\n\nimport { runDiagnostics } from './diagnostics';\nimport { getSanityCheck } from './sanity-checks';\nimport type { VerifyPluginOptions, VerifyResult } from './types';\n\nconst debug = buildDebug('verdaccio:plugin:verifier');\n\n/**\n * Verifies that a plugin can be loaded by Verdaccio.\n *\n * Uses `asyncLoadPlugin` from `@verdaccio/loaders` — the same loader\n * Verdaccio uses at startup — so the verification is identical to what\n * happens in production.\n *\n * Steps verified:\n * 1. Module resolution — can the plugin be found/required?\n * 2. Export validation — does it export a function or a class (default export)?\n * 3. Instantiation — can the plugin be instantiated with a config and options?\n * 4. Sanity check — does the instance implement the required methods for its category?\n *\n * When loading fails, detailed diagnostics are included in the result\n * to pinpoint exactly which step failed and why.\n */\nexport async function verifyPlugin(options: VerifyPluginOptions): Promise<VerifyResult> {\n const {\n pluginPath,\n category,\n pluginConfig = {},\n sanityCheck: customSanityCheck,\n prefix = PLUGIN_PREFIX,\n pluginsFolder,\n configPath,\n } = options;\n\n debug('verifying plugin %o for category %o', pluginPath, category);\n debug('prefix: %o, pluginsFolder: %o', prefix, pluginsFolder);\n\n await setup({});\n\n const sanityCheck = customSanityCheck ?? getSanityCheck(category);\n debug('using %s sanity check', customSanityCheck ? 'custom' : 'default');\n\n const config: any = {\n ...pluginConfig,\n };\n\n if (pluginsFolder) {\n config.plugins = resolve(pluginsFolder);\n debug('resolved plugins folder: %o', config.plugins);\n }\n\n if (configPath) {\n config.configPath = configPath;\n debug('config path: %o', config.configPath);\n }\n\n const pluginConfigs = { [pluginPath]: pluginConfig };\n debug('plugin config: %o', pluginConfigs);\n\n try {\n const plugins = await asyncLoadPlugin(\n pluginConfigs,\n { config, logger },\n sanityCheck,\n false,\n prefix,\n category\n );\n\n debug('plugins loaded: %o', plugins.length);\n\n if (plugins.length > 0) {\n debug('verification succeeded for %o', pluginPath);\n return {\n success: true,\n pluginName: pluginPath,\n category,\n pluginsLoaded: plugins.length,\n };\n }\n\n debug('verification failed, running diagnostics for %o', pluginPath);\n const diagnostics = await runDiagnostics(options);\n const failedStep = diagnostics.find((d) => !d.pass);\n\n return {\n success: false,\n pluginName: pluginPath,\n category,\n pluginsLoaded: 0,\n error:\n failedStep?.message ??\n `Plugin \"${pluginPath}\" could not be loaded for category \"${category}\"`,\n diagnostics,\n };\n } catch (err: any) {\n debug('verification error for %o: %o', pluginPath, err.message);\n const diagnostics = await runDiagnostics(options);\n\n return {\n success: false,\n pluginName: pluginPath,\n category,\n pluginsLoaded: 0,\n error: err.message,\n diagnostics,\n };\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAM,WAAA,GAAA,MAAA,SAAmB,2BAA2B;;;;;;;;;;;;;;;;;AAkBpD,eAAsB,aAAa,SAAqD;CACtF,MAAM,EACJ,YACA,UACA,eAAe,CAAC,GAChB,aAAa,mBACb,SAAS,gBAAA,eACT,eACA,eACE;CAEJ,QAAM,uCAAuC,YAAY,QAAQ;CACjE,QAAM,iCAAiC,QAAQ,aAAa;CAE5D,OAAA,GAAA,kBAAA,OAAY,CAAC,CAAC;CAEd,MAAM,cAAc,qBAAqB,sBAAA,eAAe,QAAQ;CAChE,QAAM,yBAAyB,oBAAoB,WAAW,SAAS;CAEvE,MAAM,SAAc,EAClB,GAAG,aACL;CAEA,IAAI,eAAe;EACjB,OAAO,WAAA,GAAA,UAAA,SAAkB,aAAa;EACtC,QAAM,+BAA+B,OAAO,OAAO;CACrD;CAEA,IAAI,YAAY;EACd,OAAO,aAAa;EACpB,QAAM,mBAAmB,OAAO,UAAU;CAC5C;CAEA,MAAM,gBAAgB,GAAG,aAAa,aAAa;CACnD,QAAM,qBAAqB,aAAa;CAExC,IAAI;EACF,MAAM,UAAU,OAAA,GAAA,mBAAA,iBACd,eACA;GAAE;GAAQ,QAAA,kBAAA;EAAO,GACjB,aACA,OACA,QACA,QACF;EAEA,QAAM,sBAAsB,QAAQ,MAAM;EAE1C,IAAI,QAAQ,SAAS,GAAG;GACtB,QAAM,iCAAiC,UAAU;GACjD,OAAO;IACL,SAAS;IACT,YAAY;IACZ;IACA,eAAe,QAAQ;GACzB;EACF;EAEA,QAAM,mDAAmD,UAAU;EACnE,MAAM,cAAc,MAAM,oBAAA,eAAe,OAAO;EAGhD,OAAO;GACL,SAAS;GACT,YAAY;GACZ;GACA,eAAe;GACf,OAPiB,YAAY,MAAM,MAAM,CAAC,EAAE,IAQ1C,GAAY,WACZ,WAAW,WAAW,sCAAsC,SAAS;GACvE;EACF;CACF,SAAS,KAAU;EACjB,QAAM,iCAAiC,YAAY,IAAI,OAAO;EAC9D,MAAM,cAAc,MAAM,oBAAA,eAAe,OAAO;EAEhD,OAAO;GACL,SAAS;GACT,YAAY;GACZ;GACA,eAAe;GACf,OAAO,IAAI;GACX;EACF;CACF;AACF"}
1
+ {"version":3,"file":"verify-plugin.cjs","names":[],"sources":["../src/verify-plugin.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { resolve } from 'node:path';\n\nimport { PLUGIN_PREFIX } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport { logger, setup } from '@verdaccio/logger';\n\nimport { runDiagnostics } from './diagnostics';\nimport { getSanityCheck } from './sanity-checks';\nimport type { VerifyPluginOptions, VerifyResult } from './types';\n\nconst debug = buildDebug('verdaccio:plugin:verifier');\n\n/**\n * Verifies that a plugin can be loaded by Verdaccio.\n *\n * Uses `asyncLoadPlugin` from `@verdaccio/loaders` — the same loader\n * Verdaccio uses at startup — so the verification is identical to what\n * happens in production.\n *\n * Steps verified:\n * 1. Module resolution — can the plugin be found/required?\n * 2. Export validation — does it export a function or a class (default export)?\n * 3. Instantiation — can the plugin be instantiated with a config and options?\n * 4. Sanity check — does the instance implement the required methods for its category?\n *\n * When loading fails, detailed diagnostics are included in the result\n * to pinpoint exactly which step failed and why.\n */\nexport async function verifyPlugin(options: VerifyPluginOptions): Promise<VerifyResult> {\n const {\n pluginPath,\n category,\n pluginConfig = {},\n sanityCheck: customSanityCheck,\n prefix = PLUGIN_PREFIX,\n pluginsFolder,\n configPath,\n } = options;\n\n debug('verifying plugin %o for category %o', pluginPath, category);\n debug('prefix: %o, pluginsFolder: %o', prefix, pluginsFolder);\n\n await setup({});\n\n const sanityCheck = customSanityCheck ?? getSanityCheck(category);\n debug('using %s sanity check', customSanityCheck ? 'custom' : 'default');\n\n const config: any = {\n ...pluginConfig,\n };\n\n if (pluginsFolder) {\n config.plugins = resolve(pluginsFolder);\n debug('resolved plugins folder: %o', config.plugins);\n }\n\n if (configPath) {\n config.configPath = configPath;\n debug('config path: %o', config.configPath);\n }\n\n const pluginConfigs = { [pluginPath]: pluginConfig };\n debug('plugin config: %o', pluginConfigs);\n\n try {\n const plugins = await asyncLoadPlugin(\n pluginConfigs,\n { config, logger },\n sanityCheck,\n false,\n prefix,\n category\n );\n\n debug('plugins loaded: %o', plugins.length);\n\n if (plugins.length > 0) {\n debug('verification succeeded for %o', pluginPath);\n return {\n success: true,\n pluginName: pluginPath,\n category,\n pluginsLoaded: plugins.length,\n };\n }\n\n debug('verification failed, running diagnostics for %o', pluginPath);\n const diagnostics = await runDiagnostics(options);\n const failedStep = diagnostics.find((d) => !d.pass);\n\n return {\n success: false,\n pluginName: pluginPath,\n category,\n pluginsLoaded: 0,\n error:\n failedStep?.message ??\n `Plugin \"${pluginPath}\" could not be loaded for category \"${category}\"`,\n diagnostics,\n };\n } catch (err: any) {\n debug('verification error for %o: %o', pluginPath, err.message);\n const diagnostics = await runDiagnostics(options);\n\n return {\n success: false,\n pluginName: pluginPath,\n category,\n pluginsLoaded: 0,\n error: err.message,\n diagnostics,\n };\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAM,WAAA,GAAA,MAAA,QAAA,CAAmB,2BAA2B;;;;;;;;;;;;;;;;;AAkBpD,eAAsB,aAAa,SAAqD;CACtF,MAAM,EACJ,YACA,UACA,eAAe,CAAC,GAChB,aAAa,mBACb,SAAS,gBAAA,eACT,eACA,eACE;CAEJ,QAAM,uCAAuC,YAAY,QAAQ;CACjE,QAAM,iCAAiC,QAAQ,aAAa;CAE5D,OAAA,GAAA,kBAAA,MAAA,CAAY,CAAC,CAAC;CAEd,MAAM,cAAc,qBAAqB,sBAAA,eAAe,QAAQ;CAChE,QAAM,yBAAyB,oBAAoB,WAAW,SAAS;CAEvE,MAAM,SAAc,EAClB,GAAG,aACL;CAEA,IAAI,eAAe;EACjB,OAAO,WAAA,GAAA,UAAA,QAAA,CAAkB,aAAa;EACtC,QAAM,+BAA+B,OAAO,OAAO;CACrD;CAEA,IAAI,YAAY;EACd,OAAO,aAAa;EACpB,QAAM,mBAAmB,OAAO,UAAU;CAC5C;CAEA,MAAM,gBAAgB,GAAG,aAAa,aAAa;CACnD,QAAM,qBAAqB,aAAa;CAExC,IAAI;EACF,MAAM,UAAU,OAAA,GAAA,mBAAA,gBAAA,CACd,eACA;GAAE;GAAQ,QAAA,kBAAA;EAAO,GACjB,aACA,OACA,QACA,QACF;EAEA,QAAM,sBAAsB,QAAQ,MAAM;EAE1C,IAAI,QAAQ,SAAS,GAAG;GACtB,QAAM,iCAAiC,UAAU;GACjD,OAAO;IACL,SAAS;IACT,YAAY;IACZ;IACA,eAAe,QAAQ;GACzB;EACF;EAEA,QAAM,mDAAmD,UAAU;EACnE,MAAM,cAAc,MAAM,oBAAA,eAAe,OAAO;EAGhD,OAAO;GACL,SAAS;GACT,YAAY;GACZ;GACA,eAAe;GACf,OAPiB,YAAY,MAAM,MAAM,CAAC,EAAE,IAQ1C,CAAA,EAAY,WACZ,WAAW,WAAW,sCAAsC,SAAS;GACvE;EACF;CACF,SAAS,KAAU;EACjB,QAAM,iCAAiC,YAAY,IAAI,OAAO;EAC9D,MAAM,cAAc,MAAM,oBAAA,eAAe,OAAO;EAEhD,OAAO;GACL,SAAS;GACT,YAAY;GACZ;GACA,eAAe;GACf,OAAO,IAAI;GACX;EACF;CACF;AACF"}
@@ -1,4 +1,4 @@
1
- import { VerifyPluginOptions, VerifyResult } from './types';
1
+ import type { VerifyPluginOptions, VerifyResult } from './types';
2
2
  /**
3
3
  * Verifies that a plugin can be loaded by Verdaccio.
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"verify-plugin.js","names":[],"sources":["../src/verify-plugin.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { resolve } from 'node:path';\n\nimport { PLUGIN_PREFIX } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport { logger, setup } from '@verdaccio/logger';\n\nimport { runDiagnostics } from './diagnostics';\nimport { getSanityCheck } from './sanity-checks';\nimport type { VerifyPluginOptions, VerifyResult } from './types';\n\nconst debug = buildDebug('verdaccio:plugin:verifier');\n\n/**\n * Verifies that a plugin can be loaded by Verdaccio.\n *\n * Uses `asyncLoadPlugin` from `@verdaccio/loaders` — the same loader\n * Verdaccio uses at startup — so the verification is identical to what\n * happens in production.\n *\n * Steps verified:\n * 1. Module resolution — can the plugin be found/required?\n * 2. Export validation — does it export a function or a class (default export)?\n * 3. Instantiation — can the plugin be instantiated with a config and options?\n * 4. Sanity check — does the instance implement the required methods for its category?\n *\n * When loading fails, detailed diagnostics are included in the result\n * to pinpoint exactly which step failed and why.\n */\nexport async function verifyPlugin(options: VerifyPluginOptions): Promise<VerifyResult> {\n const {\n pluginPath,\n category,\n pluginConfig = {},\n sanityCheck: customSanityCheck,\n prefix = PLUGIN_PREFIX,\n pluginsFolder,\n configPath,\n } = options;\n\n debug('verifying plugin %o for category %o', pluginPath, category);\n debug('prefix: %o, pluginsFolder: %o', prefix, pluginsFolder);\n\n await setup({});\n\n const sanityCheck = customSanityCheck ?? getSanityCheck(category);\n debug('using %s sanity check', customSanityCheck ? 'custom' : 'default');\n\n const config: any = {\n ...pluginConfig,\n };\n\n if (pluginsFolder) {\n config.plugins = resolve(pluginsFolder);\n debug('resolved plugins folder: %o', config.plugins);\n }\n\n if (configPath) {\n config.configPath = configPath;\n debug('config path: %o', config.configPath);\n }\n\n const pluginConfigs = { [pluginPath]: pluginConfig };\n debug('plugin config: %o', pluginConfigs);\n\n try {\n const plugins = await asyncLoadPlugin(\n pluginConfigs,\n { config, logger },\n sanityCheck,\n false,\n prefix,\n category\n );\n\n debug('plugins loaded: %o', plugins.length);\n\n if (plugins.length > 0) {\n debug('verification succeeded for %o', pluginPath);\n return {\n success: true,\n pluginName: pluginPath,\n category,\n pluginsLoaded: plugins.length,\n };\n }\n\n debug('verification failed, running diagnostics for %o', pluginPath);\n const diagnostics = await runDiagnostics(options);\n const failedStep = diagnostics.find((d) => !d.pass);\n\n return {\n success: false,\n pluginName: pluginPath,\n category,\n pluginsLoaded: 0,\n error:\n failedStep?.message ??\n `Plugin \"${pluginPath}\" could not be loaded for category \"${category}\"`,\n diagnostics,\n };\n } catch (err: any) {\n debug('verification error for %o: %o', pluginPath, err.message);\n const diagnostics = await runDiagnostics(options);\n\n return {\n success: false,\n pluginName: pluginPath,\n category,\n pluginsLoaded: 0,\n error: err.message,\n diagnostics,\n };\n }\n}\n"],"mappings":";;;;;;;;AAWA,IAAM,QAAQ,WAAW,2BAA2B;;;;;;;;;;;;;;;;;AAkBpD,eAAsB,aAAa,SAAqD;CACtF,MAAM,EACJ,YACA,UACA,eAAe,CAAC,GAChB,aAAa,mBACb,SAAS,eACT,eACA,eACE;CAEJ,MAAM,uCAAuC,YAAY,QAAQ;CACjE,MAAM,iCAAiC,QAAQ,aAAa;CAE5D,MAAM,MAAM,CAAC,CAAC;CAEd,MAAM,cAAc,qBAAqB,eAAe,QAAQ;CAChE,MAAM,yBAAyB,oBAAoB,WAAW,SAAS;CAEvE,MAAM,SAAc,EAClB,GAAG,aACL;CAEA,IAAI,eAAe;EACjB,OAAO,UAAU,QAAQ,aAAa;EACtC,MAAM,+BAA+B,OAAO,OAAO;CACrD;CAEA,IAAI,YAAY;EACd,OAAO,aAAa;EACpB,MAAM,mBAAmB,OAAO,UAAU;CAC5C;CAEA,MAAM,gBAAgB,GAAG,aAAa,aAAa;CACnD,MAAM,qBAAqB,aAAa;CAExC,IAAI;EACF,MAAM,UAAU,MAAM,gBACpB,eACA;GAAE;GAAQ;EAAO,GACjB,aACA,OACA,QACA,QACF;EAEA,MAAM,sBAAsB,QAAQ,MAAM;EAE1C,IAAI,QAAQ,SAAS,GAAG;GACtB,MAAM,iCAAiC,UAAU;GACjD,OAAO;IACL,SAAS;IACT,YAAY;IACZ;IACA,eAAe,QAAQ;GACzB;EACF;EAEA,MAAM,mDAAmD,UAAU;EACnE,MAAM,cAAc,MAAM,eAAe,OAAO;EAGhD,OAAO;GACL,SAAS;GACT,YAAY;GACZ;GACA,eAAe;GACf,OAPiB,YAAY,MAAM,MAAM,CAAC,EAAE,IAQ1C,GAAY,WACZ,WAAW,WAAW,sCAAsC,SAAS;GACvE;EACF;CACF,SAAS,KAAU;EACjB,MAAM,iCAAiC,YAAY,IAAI,OAAO;EAC9D,MAAM,cAAc,MAAM,eAAe,OAAO;EAEhD,OAAO;GACL,SAAS;GACT,YAAY;GACZ;GACA,eAAe;GACf,OAAO,IAAI;GACX;EACF;CACF;AACF"}
1
+ {"version":3,"file":"verify-plugin.js","names":[],"sources":["../src/verify-plugin.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { resolve } from 'node:path';\n\nimport { PLUGIN_PREFIX } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport { logger, setup } from '@verdaccio/logger';\n\nimport { runDiagnostics } from './diagnostics';\nimport { getSanityCheck } from './sanity-checks';\nimport type { VerifyPluginOptions, VerifyResult } from './types';\n\nconst debug = buildDebug('verdaccio:plugin:verifier');\n\n/**\n * Verifies that a plugin can be loaded by Verdaccio.\n *\n * Uses `asyncLoadPlugin` from `@verdaccio/loaders` — the same loader\n * Verdaccio uses at startup — so the verification is identical to what\n * happens in production.\n *\n * Steps verified:\n * 1. Module resolution — can the plugin be found/required?\n * 2. Export validation — does it export a function or a class (default export)?\n * 3. Instantiation — can the plugin be instantiated with a config and options?\n * 4. Sanity check — does the instance implement the required methods for its category?\n *\n * When loading fails, detailed diagnostics are included in the result\n * to pinpoint exactly which step failed and why.\n */\nexport async function verifyPlugin(options: VerifyPluginOptions): Promise<VerifyResult> {\n const {\n pluginPath,\n category,\n pluginConfig = {},\n sanityCheck: customSanityCheck,\n prefix = PLUGIN_PREFIX,\n pluginsFolder,\n configPath,\n } = options;\n\n debug('verifying plugin %o for category %o', pluginPath, category);\n debug('prefix: %o, pluginsFolder: %o', prefix, pluginsFolder);\n\n await setup({});\n\n const sanityCheck = customSanityCheck ?? getSanityCheck(category);\n debug('using %s sanity check', customSanityCheck ? 'custom' : 'default');\n\n const config: any = {\n ...pluginConfig,\n };\n\n if (pluginsFolder) {\n config.plugins = resolve(pluginsFolder);\n debug('resolved plugins folder: %o', config.plugins);\n }\n\n if (configPath) {\n config.configPath = configPath;\n debug('config path: %o', config.configPath);\n }\n\n const pluginConfigs = { [pluginPath]: pluginConfig };\n debug('plugin config: %o', pluginConfigs);\n\n try {\n const plugins = await asyncLoadPlugin(\n pluginConfigs,\n { config, logger },\n sanityCheck,\n false,\n prefix,\n category\n );\n\n debug('plugins loaded: %o', plugins.length);\n\n if (plugins.length > 0) {\n debug('verification succeeded for %o', pluginPath);\n return {\n success: true,\n pluginName: pluginPath,\n category,\n pluginsLoaded: plugins.length,\n };\n }\n\n debug('verification failed, running diagnostics for %o', pluginPath);\n const diagnostics = await runDiagnostics(options);\n const failedStep = diagnostics.find((d) => !d.pass);\n\n return {\n success: false,\n pluginName: pluginPath,\n category,\n pluginsLoaded: 0,\n error:\n failedStep?.message ??\n `Plugin \"${pluginPath}\" could not be loaded for category \"${category}\"`,\n diagnostics,\n };\n } catch (err: any) {\n debug('verification error for %o: %o', pluginPath, err.message);\n const diagnostics = await runDiagnostics(options);\n\n return {\n success: false,\n pluginName: pluginPath,\n category,\n pluginsLoaded: 0,\n error: err.message,\n diagnostics,\n };\n }\n}\n"],"mappings":";;;;;;;;AAWA,IAAM,QAAQ,WAAW,2BAA2B;;;;;;;;;;;;;;;;;AAkBpD,eAAsB,aAAa,SAAqD;CACtF,MAAM,EACJ,YACA,UACA,eAAe,CAAC,GAChB,aAAa,mBACb,SAAS,eACT,eACA,eACE;CAEJ,MAAM,uCAAuC,YAAY,QAAQ;CACjE,MAAM,iCAAiC,QAAQ,aAAa;CAE5D,MAAM,MAAM,CAAC,CAAC;CAEd,MAAM,cAAc,qBAAqB,eAAe,QAAQ;CAChE,MAAM,yBAAyB,oBAAoB,WAAW,SAAS;CAEvE,MAAM,SAAc,EAClB,GAAG,aACL;CAEA,IAAI,eAAe;EACjB,OAAO,UAAU,QAAQ,aAAa;EACtC,MAAM,+BAA+B,OAAO,OAAO;CACrD;CAEA,IAAI,YAAY;EACd,OAAO,aAAa;EACpB,MAAM,mBAAmB,OAAO,UAAU;CAC5C;CAEA,MAAM,gBAAgB,GAAG,aAAa,aAAa;CACnD,MAAM,qBAAqB,aAAa;CAExC,IAAI;EACF,MAAM,UAAU,MAAM,gBACpB,eACA;GAAE;GAAQ;EAAO,GACjB,aACA,OACA,QACA,QACF;EAEA,MAAM,sBAAsB,QAAQ,MAAM;EAE1C,IAAI,QAAQ,SAAS,GAAG;GACtB,MAAM,iCAAiC,UAAU;GACjD,OAAO;IACL,SAAS;IACT,YAAY;IACZ;IACA,eAAe,QAAQ;GACzB;EACF;EAEA,MAAM,mDAAmD,UAAU;EACnE,MAAM,cAAc,MAAM,eAAe,OAAO;EAGhD,OAAO;GACL,SAAS;GACT,YAAY;GACZ;GACA,eAAe;GACf,OAPiB,YAAY,MAAM,MAAM,CAAC,EAAE,IAQ1C,CAAA,EAAY,WACZ,WAAW,WAAW,sCAAsC,SAAS;GACvE;EACF;CACF,SAAS,KAAU;EACjB,MAAM,iCAAiC,YAAY,IAAI,OAAO;EAC9D,MAAM,cAAc,MAAM,eAAe,OAAO;EAEhD,OAAO;GACL,SAAS;GACT,YAAY;GACZ;GACA,eAAe;GACf,OAAO,IAAI;GACX;EACF;CACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/plugin-verifier",
3
- "version": "1.0.0-next-9.17",
3
+ "version": "1.0.0-next-9.18",
4
4
  "description": "Tool to verify that a Verdaccio plugin can be loaded and passes sanity checks",
5
5
  "type": "module",
6
6
  "main": "./build/index.js",
@@ -33,17 +33,16 @@
33
33
  "node": ">=24"
34
34
  },
35
35
  "dependencies": {
36
- "@verdaccio/core": "9.0.0-next-9.21",
37
- "@verdaccio/loaders": "9.0.0-next-9.21",
38
- "@verdaccio/logger": "9.0.0-next-9.21",
36
+ "@verdaccio/core": "9.0.0-next-9.22",
37
+ "@verdaccio/loaders": "9.0.0-next-9.22",
38
+ "@verdaccio/logger": "9.0.0-next-9.22",
39
39
  "clipanion": "4.0.0-rc.4",
40
40
  "debug": "4.4.3"
41
41
  },
42
42
  "devDependencies": {
43
43
  "rimraf": "6.1.3",
44
- "vite": "8.0.16",
45
- "vite-plugin-dts": "5.0.1",
46
- "vitest": "4.1.7"
44
+ "vite": "8.1.4",
45
+ "vitest": "4.1.10"
47
46
  },
48
47
  "funding": {
49
48
  "type": "opencollective",
@@ -0,0 +1 @@
1
+ {"version":"7.0.2","root":[[270,276]],"packageJsons":["../../../node_modules/.pnpm/@types+body-parser@1.19.6/node_modules/@types/body-parser/package.json","../../../node_modules/.pnpm/@types+connect@3.4.38/node_modules/@types/connect/package.json","../../../node_modules/.pnpm/@types+debug@4.1.13/node_modules/@types/debug/package.json","../../../node_modules/.pnpm/@types+express-serve-static-core@5.1.1/node_modules/@types/express-serve-static-core/package.json","../../../node_modules/.pnpm/@types+express@5.0.6/node_modules/@types/express/package.json","../../../node_modules/.pnpm/@types+http-errors@2.0.5/node_modules/@types/http-errors/package.json","../../../node_modules/.pnpm/@types+jsonwebtoken@9.0.10/node_modules/@types/jsonwebtoken/package.json","../../../node_modules/.pnpm/@types+ms@2.1.0/node_modules/@types/ms/package.json","../../../node_modules/.pnpm/@types+node@24.13.2/node_modules/@types/node/package.json","../../../node_modules/.pnpm/@types+qs@6.15.1/node_modules/@types/qs/package.json","../../../node_modules/.pnpm/@types+range-parser@1.2.7/node_modules/@types/range-parser/package.json","../../../node_modules/.pnpm/@types+send@1.2.1/node_modules/@types/send/package.json","../../../node_modules/.pnpm/@types+serve-static@2.2.0/node_modules/@types/serve-static/package.json","../../../node_modules/.pnpm/clipanion@4.0.0-rc.4_typanion@3.14.0/node_modules/clipanion/package.json","../../../node_modules/.pnpm/colorette@2.0.20/node_modules/colorette/package.json","../../../node_modules/.pnpm/debug@4.4.3_supports-color@5.5.0/node_modules/debug/package.json","../../../node_modules/.pnpm/express@5.2.1/node_modules/express/package.json","../../../node_modules/.pnpm/http-errors@2.0.1/node_modules/http-errors/package.json","../../../node_modules/.pnpm/pino-abstract-transport@3.0.0/node_modules/pino-abstract-transport/package.json","../../../node_modules/.pnpm/pino@10.3.1/node_modules/pino/package.json","../../../node_modules/.pnpm/sonic-boom@4.2.1/node_modules/sonic-boom/package.json","../../../node_modules/.pnpm/typanion@3.14.0/node_modules/typanion/package.json","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/package.json","../../core/core/package.json","../../core/types/package.json","../../loaders/package.json","../../logger/package.json","./package.json"],"missingPackageJsons":["../../../node_modules/@types/assert/package.json","../../../node_modules/@types/assert/strict/package.json","../../../node_modules/@types/async_hooks/package.json","../../../node_modules/@types/buffer/package.json","../../../node_modules/@types/child_process/package.json","../../../node_modules/@types/cluster/package.json","../../../node_modules/@types/console/package.json","../../../node_modules/@types/constants/package.json","../../../node_modules/@types/crypto/package.json","../../../node_modules/@types/dgram/package.json","../../../node_modules/@types/diagnostics_channel/package.json","../../../node_modules/@types/dns/package.json","../../../node_modules/@types/dns/promises/package.json","../../../node_modules/@types/domain/package.json","../../../node_modules/@types/events/package.json","../../../node_modules/@types/fs/package.json","../../../node_modules/@types/fs/promises/package.json","../../../node_modules/@types/http/package.json","../../../node_modules/@types/http2/package.json","../../../node_modules/@types/https/package.json","../../../node_modules/@types/inspector/package.json","../../../node_modules/@types/inspector/promises/package.json","../../../node_modules/@types/module/package.json","../../../node_modules/@types/net/package.json","../../../node_modules/@types/node/assert/package.json","../../../node_modules/@types/node/compatibility/package.json","../../../node_modules/@types/node/dns/package.json","../../../node_modules/@types/node/fs/package.json","../../../node_modules/@types/node/readline/package.json","../../../node_modules/@types/node/stream/package.json","../../../node_modules/@types/node/timers/package.json","../../../node_modules/@types/node/web-globals/package.json","../../../node_modules/@types/os/package.json","../../../node_modules/@types/path/package.json","../../../node_modules/@types/path/posix/package.json","../../../node_modules/@types/path/win32/package.json","../../../node_modules/@types/perf_hooks/package.json","../../../node_modules/@types/pino-std-serializers/package.json","../../../node_modules/@types/process/package.json","../../../node_modules/@types/punycode/package.json","../../../node_modules/@types/querystring/package.json","../../../node_modules/@types/readline/package.json","../../../node_modules/@types/readline/promises/package.json","../../../node_modules/@types/repl/package.json","../../../node_modules/@types/stream/consumers/package.json","../../../node_modules/@types/stream/package.json","../../../node_modules/@types/stream/promises/package.json","../../../node_modules/@types/stream/web/package.json","../../../node_modules/@types/string_decoder/package.json","../../../node_modules/@types/thread-stream/package.json","../../../node_modules/@types/timers/package.json","../../../node_modules/@types/timers/promises/package.json","../../../node_modules/@types/tls/package.json","../../../node_modules/@types/trace_events/package.json","../../../node_modules/@types/tty/package.json","../../../node_modules/@types/typanion/package.json","../../../node_modules/@types/url/package.json","../../../node_modules/@types/util/package.json","../../../node_modules/@types/util/types/package.json","../../../node_modules/@types/v8/package.json","../../../node_modules/@types/vm/package.json","../../../node_modules/@types/wasi/package.json","../../../node_modules/@types/worker_threads/package.json","../../../node_modules/@types/zlib/package.json","../../../node_modules/assert/package.json","../../../node_modules/assert/strict/package.json","../../../node_modules/async_hooks/package.json","../../../node_modules/body-parser/package.json","../../../node_modules/buffer/package.json","../../../node_modules/child_process/package.json","../../../node_modules/cluster/package.json","../../../node_modules/connect/package.json","../../../node_modules/console/package.json","../../../node_modules/constants/package.json","../../../node_modules/crypto/package.json","../../../node_modules/dgram/package.json","../../../node_modules/diagnostics_channel/package.json","../../../node_modules/dns/package.json","../../../node_modules/dns/promises/package.json","../../../node_modules/domain/package.json","../../../node_modules/events/package.json","../../../node_modules/express-serve-static-core/package.json","../../../node_modules/express/package.json","../../../node_modules/fs/package.json","../../../node_modules/fs/promises/package.json","../../../node_modules/http-errors/package.json","../../../node_modules/http/package.json","../../../node_modules/http2/package.json","../../../node_modules/https/package.json","../../../node_modules/inspector/package.json","../../../node_modules/inspector/promises/package.json","../../../node_modules/module/package.json","../../../node_modules/ms/package.json","../../../node_modules/net/package.json","../../../node_modules/os/package.json","../../../node_modules/path/package.json","../../../node_modules/path/posix/package.json","../../../node_modules/path/win32/package.json","../../../node_modules/perf_hooks/package.json","../../../node_modules/pino-std-serializers/package.json","../../../node_modules/process/package.json","../../../node_modules/punycode/package.json","../../../node_modules/qs/package.json","../../../node_modules/querystring/package.json","../../../node_modules/range-parser/package.json","../../../node_modules/readline/package.json","../../../node_modules/readline/promises/package.json","../../../node_modules/repl/package.json","../../../node_modules/send/package.json","../../../node_modules/serve-static/package.json","../../../node_modules/stream/consumers/package.json","../../../node_modules/stream/package.json","../../../node_modules/stream/promises/package.json","../../../node_modules/stream/web/package.json","../../../node_modules/string_decoder/package.json","../../../node_modules/thread-stream/package.json","../../../node_modules/timers/package.json","../../../node_modules/timers/promises/package.json","../../../node_modules/tls/package.json","../../../node_modules/trace_events/package.json","../../../node_modules/tty/package.json","../../../node_modules/typanion/package.json","../../../node_modules/url/package.json","../../../node_modules/util/package.json","../../../node_modules/util/types/package.json","../../../node_modules/v8/package.json","../../../node_modules/vm/package.json","../../../node_modules/wasi/package.json","../../../node_modules/worker_threads/package.json","../../../node_modules/zlib/package.json","./node_modules/@verdaccio/core/build/package.json","./node_modules/@verdaccio/core/build/schemes/package.json","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/node_modules/@types/crypto/package.json","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/node_modules/@types/ms/package.json","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/node_modules/crypto/package.json","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/node_modules/jsonwebtoken/package.json","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/node_modules/ms/package.json","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/src/package.json","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/src/plugins/package.json","./node_modules/@verdaccio/core/node_modules/crypto/package.json","./node_modules/@verdaccio/core/node_modules/ms/package.json","./node_modules/@verdaccio/loaders/build/package.json","./node_modules/@verdaccio/loaders/node_modules/@types/crypto/package.json","./node_modules/@verdaccio/loaders/node_modules/@types/express/package.json","./node_modules/@verdaccio/loaders/node_modules/@types/http-errors/package.json","./node_modules/@verdaccio/loaders/node_modules/@types/ms/package.json","./node_modules/@verdaccio/loaders/node_modules/@verdaccio/core/build/package.json","./node_modules/@verdaccio/loaders/node_modules/@verdaccio/core/build/schemes/package.json","./node_modules/@verdaccio/loaders/node_modules/@verdaccio/core/node_modules/@verdaccio/types/node_modules/@types/crypto/package.json","./node_modules/@verdaccio/loaders/node_modules/@verdaccio/core/node_modules/@verdaccio/types/node_modules/@types/ms/package.json","./node_modules/@verdaccio/loaders/node_modules/@verdaccio/core/node_modules/@verdaccio/types/node_modules/crypto/package.json","./node_modules/@verdaccio/loaders/node_modules/@verdaccio/core/node_modules/@verdaccio/types/node_modules/jsonwebtoken/package.json","./node_modules/@verdaccio/loaders/node_modules/@verdaccio/core/node_modules/@verdaccio/types/node_modules/ms/package.json","./node_modules/@verdaccio/loaders/node_modules/@verdaccio/core/node_modules/@verdaccio/types/src/package.json","./node_modules/@verdaccio/loaders/node_modules/@verdaccio/core/node_modules/@verdaccio/types/src/plugins/package.json","./node_modules/@verdaccio/loaders/node_modules/@verdaccio/core/node_modules/crypto/package.json","./node_modules/@verdaccio/loaders/node_modules/@verdaccio/core/node_modules/ms/package.json","./node_modules/@verdaccio/loaders/node_modules/crypto/package.json","./node_modules/@verdaccio/loaders/node_modules/express/package.json","./node_modules/@verdaccio/loaders/node_modules/http-errors/package.json","./node_modules/@verdaccio/loaders/node_modules/ms/package.json","./node_modules/@verdaccio/logger/build/package.json","./node_modules/@verdaccio/logger/node_modules/@verdaccio/types/node_modules/@types/crypto/package.json","./node_modules/@verdaccio/logger/node_modules/@verdaccio/types/node_modules/@types/ms/package.json","./node_modules/@verdaccio/logger/node_modules/@verdaccio/types/node_modules/crypto/package.json","./node_modules/@verdaccio/logger/node_modules/@verdaccio/types/node_modules/jsonwebtoken/package.json","./node_modules/@verdaccio/logger/node_modules/@verdaccio/types/node_modules/ms/package.json","./node_modules/@verdaccio/logger/node_modules/@verdaccio/types/src/package.json","./node_modules/@verdaccio/logger/node_modules/@verdaccio/types/src/plugins/package.json","./node_modules/@verdaccio/logger/node_modules/crypto/package.json","./node_modules/@verdaccio/logger/node_modules/events/package.json","./node_modules/@verdaccio/logger/node_modules/ms/package.json","./node_modules/@verdaccio/logger/node_modules/pino-std-serializers/package.json","./node_modules/@verdaccio/logger/node_modules/sonic-boom/types/package.json","./node_modules/@verdaccio/logger/node_modules/stream/package.json","./node_modules/@verdaccio/logger/node_modules/thread-stream/package.json","./node_modules/@verdaccio/logger/node_modules/worker_threads/package.json","./node_modules/clipanion/lib/advanced/builtins/package.json","./node_modules/clipanion/lib/advanced/options/package.json","./node_modules/clipanion/lib/advanced/package.json","./node_modules/clipanion/lib/package.json","./node_modules/crypto/package.json","./node_modules/events/package.json","./node_modules/express/package.json","./node_modules/http-errors/package.json","./node_modules/ms/package.json","./node_modules/pino-std-serializers/package.json","./node_modules/stream/package.json","./node_modules/thread-stream/package.json","./node_modules/typanion/package.json","./node_modules/worker_threads/package.json"],"fileNames":["lib.es5.d.ts","lib.es2015.d.ts","lib.es2016.d.ts","lib.es2017.d.ts","lib.es2018.d.ts","lib.es2019.d.ts","lib.es2020.d.ts","lib.es2021.d.ts","lib.es2022.d.ts","lib.es2023.d.ts","lib.es2024.d.ts","lib.es2025.d.ts","lib.esnext.d.ts","lib.dom.d.ts","lib.dom.iterable.d.ts","lib.dom.asynciterable.d.ts","lib.webworker.importscripts.d.ts","lib.scripthost.d.ts","lib.es2015.core.d.ts","lib.es2015.collection.d.ts","lib.es2015.generator.d.ts","lib.es2015.iterable.d.ts","lib.es2015.promise.d.ts","lib.es2015.proxy.d.ts","lib.es2015.reflect.d.ts","lib.es2015.symbol.d.ts","lib.es2015.symbol.wellknown.d.ts","lib.es2016.array.include.d.ts","lib.es2016.intl.d.ts","lib.es2017.arraybuffer.d.ts","lib.es2017.date.d.ts","lib.es2017.object.d.ts","lib.es2017.sharedmemory.d.ts","lib.es2017.string.d.ts","lib.es2017.intl.d.ts","lib.es2017.typedarrays.d.ts","lib.es2018.asyncgenerator.d.ts","lib.es2018.asynciterable.d.ts","lib.es2018.intl.d.ts","lib.es2018.promise.d.ts","lib.es2018.regexp.d.ts","lib.es2019.array.d.ts","lib.es2019.object.d.ts","lib.es2019.string.d.ts","lib.es2019.symbol.d.ts","lib.es2019.intl.d.ts","lib.es2020.bigint.d.ts","lib.es2020.date.d.ts","lib.es2020.promise.d.ts","lib.es2020.sharedmemory.d.ts","lib.es2020.string.d.ts","lib.es2020.symbol.wellknown.d.ts","lib.es2020.intl.d.ts","lib.es2020.number.d.ts","lib.es2021.promise.d.ts","lib.es2021.string.d.ts","lib.es2021.weakref.d.ts","lib.es2021.intl.d.ts","lib.es2022.array.d.ts","lib.es2022.error.d.ts","lib.es2022.intl.d.ts","lib.es2022.object.d.ts","lib.es2022.string.d.ts","lib.es2022.regexp.d.ts","lib.es2023.array.d.ts","lib.es2023.collection.d.ts","lib.es2023.intl.d.ts","lib.es2024.arraybuffer.d.ts","lib.es2024.collection.d.ts","lib.es2024.object.d.ts","lib.es2024.promise.d.ts","lib.es2024.regexp.d.ts","lib.es2024.sharedmemory.d.ts","lib.es2024.string.d.ts","lib.es2025.collection.d.ts","lib.es2025.float16.d.ts","lib.es2025.intl.d.ts","lib.es2025.iterator.d.ts","lib.es2025.promise.d.ts","lib.es2025.regexp.d.ts","lib.esnext.array.d.ts","lib.esnext.collection.d.ts","lib.esnext.date.d.ts","lib.esnext.decorators.d.ts","lib.esnext.disposable.d.ts","lib.esnext.error.d.ts","lib.esnext.intl.d.ts","lib.esnext.sharedmemory.d.ts","lib.esnext.temporal.d.ts","lib.esnext.typedarrays.d.ts","lib.decorators.d.ts","lib.decorators.legacy.d.ts","lib.esnext.full.d.ts","./node_modules/clipanion/lib/constants.d.ts","./node_modules/clipanion/lib/core.d.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/crypto.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/file.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/filereader.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/sqlite.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts","./node_modules/clipanion/lib/format.d.ts","./node_modules/clipanion/lib/errors.d.ts","./node_modules/clipanion/lib/advanced/options/utils.d.ts","./node_modules/clipanion/lib/advanced/Cli.d.ts","./node_modules/clipanion/lib/advanced/Command.d.ts","./node_modules/clipanion/lib/advanced/builtins/definitions.d.ts","./node_modules/clipanion/lib/advanced/builtins/help.d.ts","./node_modules/clipanion/lib/advanced/builtins/tokens.d.ts","./node_modules/clipanion/lib/advanced/builtins/version.d.ts","./node_modules/clipanion/lib/advanced/builtins/index.d.ts","./node_modules/clipanion/lib/advanced/options/Array.d.ts","./node_modules/clipanion/lib/advanced/options/Boolean.d.ts","./node_modules/clipanion/lib/advanced/options/Counter.d.ts","./node_modules/clipanion/lib/advanced/options/Proxy.d.ts","./node_modules/clipanion/lib/advanced/options/Rest.d.ts","./node_modules/clipanion/lib/advanced/options/String.d.ts","./node_modules/clipanion/lib/advanced/options/index.d.ts","./node_modules/clipanion/lib/advanced/index.d.ts","../../../node_modules/@types/ms/index.d.ts","../../../node_modules/@types/debug/index.d.ts","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/src/commons.ts","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/src/manifest.ts","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/src/plugins/storage.ts","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/src/plugins/index.ts","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/src/search.ts","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/node_modules/@types/jsonwebtoken/index.d.ts","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/src/configuration.ts","./node_modules/@verdaccio/core/node_modules/@verdaccio/types/src/types.ts","./node_modules/@verdaccio/core/build/auth-utils.d.ts","./node_modules/@verdaccio/core/build/constants.d.ts","./node_modules/@verdaccio/core/build/crypto-utils.d.ts","../../../node_modules/@types/http-errors/index.d.ts","./node_modules/@verdaccio/core/build/error-utils.d.ts","./node_modules/@verdaccio/core/build/file-utils.d.ts","./node_modules/@verdaccio/core/build/ip-utils.d.ts","./node_modules/@verdaccio/core/build/pkg-utils.d.ts","../../../node_modules/@types/send/index.d.ts","../../../node_modules/@types/qs/index.d.ts","../../../node_modules/@types/range-parser/index.d.ts","../../../node_modules/@types/express-serve-static-core/index.d.ts","../../../node_modules/@types/serve-static/index.d.ts","../../../node_modules/@types/connect/index.d.ts","../../../node_modules/@types/body-parser/index.d.ts","../../../node_modules/@types/express/index.d.ts","./node_modules/@verdaccio/core/build/plugin-utils.d.ts","./node_modules/@verdaccio/core/build/req-utils.d.ts","./node_modules/@verdaccio/core/build/search-utils.d.ts","./node_modules/@verdaccio/core/build/stream-utils.d.ts","./node_modules/@verdaccio/core/build/string-utils.d.ts","./node_modules/@verdaccio/core/build/tarball-utils.d.ts","./node_modules/@verdaccio/core/build/schemes/publish-manifest.d.ts","./node_modules/@verdaccio/core/build/schemes/unpublish-manifest.d.ts","./node_modules/@verdaccio/core/build/validation-utils.d.ts","./node_modules/@verdaccio/core/build/warning-utils.d.ts","./node_modules/@verdaccio/core/build/index.d.ts","./node_modules/@verdaccio/loaders/build/utils.d.ts","./node_modules/@verdaccio/loaders/build/plugin-async-loader.d.ts","./node_modules/@verdaccio/loaders/build/index.d.ts","./node_modules/@verdaccio/logger/build/logger.d.ts","./node_modules/@verdaccio/logger/node_modules/pino-abstract-transport/index.d.ts","./node_modules/@verdaccio/logger/node_modules/sonic-boom/types/index.d.ts","./node_modules/@verdaccio/logger/node_modules/colorette/index.d.ts","./node_modules/@verdaccio/logger/build/levels.d.ts","./node_modules/@verdaccio/logger/node_modules/pino/pino.d.ts","./node_modules/@verdaccio/logger/build/types.d.ts","./node_modules/@verdaccio/logger/build/formatter.d.ts","./node_modules/@verdaccio/logger/build/colors.d.ts","./node_modules/@verdaccio/logger/build/prettify.d.ts","./node_modules/@verdaccio/logger/build/transport.d.ts","./node_modules/@verdaccio/logger/build/utils.d.ts","./node_modules/@verdaccio/logger/build/index.d.ts","./src/types.ts","./src/sanity-checks.ts","./src/diagnostics.ts","./src/verify-plugin.ts","./src/commands/verify.ts","./src/cli.ts","./src/index.ts"],"fileInfos":[{"version":"16934abaab7026ac114da441aabea1a0","affectsGlobalScope":true,"impliedNodeFormat":1},"d4306fb2e47f74835e8674ffac07d76f","e437c5c1302869326c3bb93da85bbbcf","e4324975a566567b21d350615f1fc6ac","333b1b9a2a9ac3b8497dba5c63b5ba50","6cffacd662b6eb5fa7a36aa2ea366bfa","b4c34f9c23304dbef2d23698637ed638","e5cb86a5fc491796ecd1d2dd348d208f","feb6c6fb19cdb246a5d8acb36a6901c7","9443a7f109277ffaa79d893ed2549995","793cee405385076e27c24f409659dccd","09f69c6610266eaee1ac9e3e30df2c71","62bad718844246b8e17547f37bad6085",{"version":"aae8996e8b5684814785a42cbbefcd79","affectsGlobalScope":true,"impliedNodeFormat":1},"abad6dd56cc8caf095c165df8124d237","abad6dd56cc8caf095c165df8124d237",{"version":"2a9941db0809c9ad0e8837ed629b1dcc","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d051b93324f36bcc68d152a5ca0988cd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"926204c28cd3d073865348473ae28d2e","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"f25e42c801b2cb3cf2b39792006a9beb","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6344b55f26a4e81d9608777dbfb877dd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"3c0ed28e53d3695b363e256ec1c023fd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4c2761daba7f17141c25baa0821ac5da","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b87656acabd63e69379ff6ffcfe52fc7","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"597469522da047a5af5222cc6989f405","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1708ea4d34dc37fadadc63ca01127e80","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"55d97a8c6fbf34a30450a7b1e5f7a298","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0ee05eb59426d33e374226d8dcfa708b","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"e347c14030993906efcfbb88915b6a05","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b0231263857c9b6a03641acdc9280ceb","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"3b15c4a83b598cacb4067676e6f0abed","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b417d97b7934cef63b1889abec0bbfbf","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"09a6cf4032ebba60ce22a501e663f881","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"2b056277dd138e8f5650fc04e20eaa8d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"e22cc07e3f3cc242ba52fa3f8ea1fc58","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"2c45da767a1bfbb220848df1bc4029e4","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b44c3e0fbaf2130cdcf6ac38b120ffa1","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b612fb5cf8e5d964b92063a75207632a","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"02705151a5e1551b9162a9ed8ab763f7","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"41025e398be9215d32e4337335da8f0b","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"52684c2b1f353a5538e4f275182a54cd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6dedb6a4f90d1df3a6fbe5693e44886c","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"ca3f36fe3562c07e0f0d71c2bebd3f6d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"409974d6129befbb8226ddd1c6558568","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4d9cfde2a1ae1b4925f1f9bc10848e5d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7e1daecc66dd564144e3bb1a0266b5fd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"a8e1d9bb35fd0637f2f9fd2b2a54f2ec","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4f168501772a6543182765bfd5f2fbfe","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"a19c80aad1b2162103496f5ba293a732","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b69afa63cd5d059851c78adb2856ee09","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"ae2fc5d954e9b0f5feee3d481b953c27","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1cfd3091a071d8b6feec15277643bafe","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1da2c1f258970fd3cc91184f69e91a9d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"a0d87491913d843139e0c993650a3235","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4ef72aa378127e7b7abba915b0110b1e","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"3ec74c6a7d4463f0254db3a74cf75646","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"84c2bdfa470d075526cce6322d81b0b6","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0b3844c2b8c73e4e1ab91431411cad11","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4fc71cf4a15b8d99675a31df77f26e07","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d1b49564ddaeca3df5b6dbae925d2242","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6a25be566d60ccfc2d6e8b7bfdeefa83","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"8a20e27646985dfd58c57ca6566553dd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"9969f02ad3cdcbf4f709405cda44167f","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"9c9be4792a7a4f42c15ae7360bf28779","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"8cf777fe00349b71ee9c4b6f3fe7fd19","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"74f96bc192530c9723f572bfff3d3078","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1df91c56b25955c56387426f378173c5","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"38856f70edcd2115c355d96ec77cc09e","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"de8700156c1275465bcd473c28b359aa","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d47cfdb6ede40518357bb5a4cd7cd9fb","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6e5773860cd9e5b15e683113f642ab47","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"30ff5fe1682f7fcd629880476ca3c2e0","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"bf23d7d1b40b9015b694ddc2f011752f","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"2cc585d42e2c548f9f24a30a1989fd33","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"713906ce9d332d2242b7f05ed9304be3","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0219894bfe5042c7e1aa2d22e4a91ed0","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6009ffff7e43c93318804d2d28e37fe3","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"03be89b227587594fbb50509fc1c2e45","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b30df52dc24740c0bad7c55c3511df7d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"ab8d3c9b5ed5c2ab8f383607eef439f0","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d950ec671d0a8e07f3c1a31e94abed86","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1abef2ace5eccb02d60dd73cd5a5ee4c","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"f5f0a3044029d1cc081b5887eb4deb07","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d57c697f1446940ec4bfe669c962e2c4","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"be41035d7b941482a1e1ae6a5c5dcca5","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"10f7d9da7564f27f8ddf4a162b6da6d3","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1d0520af549e0c3581f15173cc713ca1","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d65083f97fd741cff028472563eddb79","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"da7f24f00653ebac660ac1c0821ed33d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7cb5ae9e65516ea2235f0721f6aac43c","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"f64453cbf9671f28158677fa5c43967a","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"33f317af5428801f944a478d2c1e38e5","affectsGlobalScope":true,"impliedNodeFormat":1},"2bccd8eaa1dc27e6e29feb6b1baad635","43902f9b8e574f8eb461289baa4d26e1","36c3972b64bd48c06e418b20441f3f43",{"version":"2514e9a2749c0fc18d2f478e9e1e641e","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6ae4c332ecb24e76c1e47c0e21d4663d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"69ee0752d1e70c56ca160360425752a9","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"bf33440030f0a0fae7d1efd6c293a8d2","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"9af0a7e3ef1c42cd066b9f8d365cc1ba","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7b772cebc7136c34fc77954aef70519d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"9eca652586205dc5b07f9ba57b1c8500","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"ec5f75939754ce94652189ec7d0d3058","affectsGlobalScope":true,"impliedNodeFormat":1},"628b774b54637325e286752c79c12432","bb1f9e3091b88e9d0e93b7198c736af3","514fd35e5eb35bb2e5cbb908af0a0aa2","ed57ae88565308729f2327f26d684976","dcd932d6b0038f2e250e30dc10125b22","9508c917bd7e458745e222a82dd24ef0","fabf86f455f96b90538cc26320ab2765","14550b4cd9f433e0addd8b6d67614d23","cf0ac6aebc25cb780674653aaeee688e","35fef7bac8048f583e4ce6eaa0c2a4c0","6752dc653fc7a333027249fd851fdb62","b9ad7e689b46dfba362c1bf174e69018","8b0a2930dfabdf27c69c6bb1eeabcdc8","4513b1ed15523d247040689f37fa9db2","5c0c499eed773a750903d9497beafacd","2377da227d1bac82ff7b3f2081ddf8d3","beef985b474fefeb80d27fb2c8778371","c79fc9d9f09ae598a374ae7c0b5284a4","f2caa3cebb1e6be855519004830a6be0","8ebc9f2a77c900e710801214c5cb994c","ec617a0e0577dd6a3210c3b067ecb325","1db5d06e485bd82d6d5f6e36925a8714","24b864518967840216c779b5e5f00975","8719cd8047700bfb6046798390053823","f2840afb502c94db92dab0fb8d27812f","a7e7d08b372210c203745d3eac61a411","531183cc80535e0e94226d720e5eb038","f627eb958ca52c85e42f04dce4661f86","9a43fc665bce9012a3d5fe1b574ff4dc","13f4b4da6546a34719fd6bde15fb63dd","a589216508844bfc00e62fc2d97fda45","865aea1c3209e31b076cb6fe780e769e","12e64aaf26af0f5c8f1b263dd66e3feb","928971ebbcdf5b093ef37669b33bddf6","b744265d8ad12b7d4d5c5dc35d18d44e","eff32168b8348b822afeed9cbf61afa7","9aafd1f29b4d8861c1c6c34bf83c0721",{"version":"dd1cf1cc3aa21cd78b4869a44d98c6d9","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"292c9398a407b33b1d9c9812b673387a","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"45df94b3c51b898624bacc2bcd6d9eb2","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7d352f71d1b1bcc12c79dd0e4597537c","affectsGlobalScope":true,"impliedNodeFormat":1},"db11b80743ed5356b81d763a708788e6","39078ea063fcaf72bd3cca7e0d13d017","f81aa09811fa65ac6f354ab0018d3c38",{"version":"282318b178d190157a4deacb14f3040a","affectsGlobalScope":true,"impliedNodeFormat":1},"aafe512c4216100fd65028f9b2afce83","54c5c3dcfdb5f7cf5fbbccfff6ead3fa",{"version":"dc14f078230582a2f8fb2138bfcf4f85","affectsGlobalScope":true,"impliedNodeFormat":1},"b2b472cd0bf0f8d5f022e00ca1c401f4","370d966b810b687a9e58851208cb3d4c","39b3089f3df8d14e0f2ddac0479872d9","cc7a57e86f908c313649aea8d90377e1","5c271f10d8a9b9a1206bc82a4fe5b84d","fbe31979333ec391d8b59e8f42236e8e","6751c8c175fac6bbe7b935582cdfdca7",{"version":"a3f111d2a29b6cdd04fc4b41aa560c86","affectsGlobalScope":true,"impliedNodeFormat":1},"5f4ac576bcdc670a8489c881b23a2b17","84c4165c4499465304988f5db8d9940a","02a1ccf1ef65bfbf65865ac4ce346974","d589d01c82f6793f20d2f5c838462e3d","dbe700f7f1fa52fd220c7ee2c6617ebc","579675a2c3b0f8c532a82ad9cbd5d384","b2e8f93606aeb2dee2a4cc9272c56973",{"version":"a8e5d3e42303570b1114b6cd9ef9f38a","affectsGlobalScope":true,"impliedNodeFormat":1},"0003c8459d069181cc4856724fcf2832","c9053dbbe4fa2853f2d3f73b9a2fee81","4e458316a6083cbd2bba2fd29f674dd5",{"version":"3cccee1f2c106192d18ac4e08119f872","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"057189402e597cd50262b082723f21ff","affectsGlobalScope":true,"impliedNodeFormat":1},"6b26581aa2587701d570206a0db8c9ee","88a29e2aac8082c0910733950159e1ca","10282f14d9c2a5cbf3bcf2b1c8cebeaf","0f80958d77cd6301b43c1d7904e3e4bc","3bdc645524ab0d2f6795d3a008833bd7","deb50b47eb75a5566532a763fa1324fa","6e61cd09c2e15845909de3ed59a00b37","3e4ffe5f2733e0589b2612bd86f6cec3","c8206d568b54e5ea06131963eecd576a","15878f4f50c2e562c0768eb735c2aed5",{"version":"cb8f7733bee3d973c152a75fad9f6da6","affectsGlobalScope":true,"impliedNodeFormat":1},"dd404118e8bd70aff746f7d31e46270b","a0fa4618173795c74b488178ea77f951",{"version":"6b8649a280031d9e86955db721cfad87","affectsGlobalScope":true,"impliedNodeFormat":1},"4bc8f13c472858fb74f77388c0c5d885","75ab229142dad0ca2ff14d02d52f11f9","c72d2516d1e8910caca33c4dff75fcd4","f0231f36cb7117fbe9271ff19ef0f5f4",{"version":"8a642eed2a45ac7028479b6089a04842","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1e6ddb6b86dc5d86e75ba797d5324346","affectsGlobalScope":true,"impliedNodeFormat":1},"701aef085585b152042aa216b06bb4b8","e9bc5b1de50e48fa9857b64091673883","9268959cff1006c82e6abbd73824db97",{"version":"8f1c048bd5761910f5ea340fe4d792cd","affectsGlobalScope":true,"impliedNodeFormat":1},"6b1f3649b0eabeaca20c778fcc5f270c","eb567c7b5824aab578f75bbccf9f4b05","a4a64c20828c248f64ab602c65fcc898","aa8fe326a08e391ed85919ae9225b5d8","df2ef139f990dc6798403c348fa0c515","704157a030439c868268d8f88de46072","6a1054783813fcf4b46a86f5a413bac4","7320b55c7d8a1c10845e3a8716d3cccc","d439c023aff246773feabfcdb983e50a","731b2be654a4c294713f67cdd92482a4","17ce17729a326eacbd035cbc718c6426","e60ec934c3a5005f7bcf40adc389c9c0","cf2a06b489c109d7419be9da41301c32","7e25e368ee2a3a23794e7c109d89036e","7e5f04f329f6466604c2bebf9b53785b","e1fc8374904606de16044d56de04d6f6","f75dfe0f453a3bce695c04396208ceca","0799178e06fbbcfbbc1356fb1691563a","0550f001aaf6c4c8d5075d0b131a1ee6","3aa001cc534f90c57017f4247dbf623c","58e9b716b50fdc8506289bd37edd9a55","e57308a210aad8834059b2518d3ed422","02d912d2b8799c299fc1d56e7be02c46","c399780e4a408f406490a1af1aa83020","e262c420af7f309bad69c9fac5ad75f5","d48e8af0231295e2fe1335efaab98950","c7849086f04ff1cff73a7d0c9333d08e","b344c7f362a9fb040f4e7ddfaadffe07","e6dc22ef068708ce0ef02c7607b0c19f","4930a435159fd70bee0be8ce6f5c1c45","911845dc5fddf58136490556f78268e7","7e6764462fc18134ffa2e9fad36b8fab","9de1b139d3a9fa79e667f4d30c5b392b","f8059a9ddf1aeefd103fce9c853541b9","1e393832a15fe0f2b90f6ec4596d4872","7ea1b4e11dda1cb41e3b8a05416064e8","44a579d325b24ec18433ef0f15968ffa","965a1be3a7b16f5ba23ac0923d441755","6d6fcab6a7663b8314c5123ae0389e0a","a918e723cfac239d6a8a521275f9e03b","cd5c183c2bad150213a0cccaafe937e2",{"version":"263587889972efe6a9ca5903476ba213","affectsGlobalScope":true,"impliedNodeFormat":1},"f100181a3e9ff7f5b23eed47dd66a1de","fbb1086d78fad2e81eefa859d53b6ffd","fa614d3a843db2f4f4f804155cf537a6","406d0e50f03efd9f1bf194e636900c24","004596477cb53707f960d3181d6f3289","617399321fc6d3cb670fd86fd16e23fe","725c1c62e849c1c6148c73eb1056f675","d0f08f4378d53b5ff074f35ee958f415","99a5f97607bdc950e62029b9fd6c2cc8","75f88367dfa713c86689a6abb4cc83b6","7a7f77782d759e9c59f836283f32c5e7","035214f788b8788a5105f15de828c94b","9554e9c633a10b8df0037b0f55d0ade9","57f1f28b7116a08815097fc4ab8aad15","2ef88424df20d7e70648957e79bd4894","1e16eca1224df2327ca184d56fa990f8","aa733ff5876e74596a9bc959e052075e","e020135f630a65aee72cc9720d3b3f45","39cf2afa23d9b9b0cd389be526553a99","bac4e79bf597beef4670ba4172cf4601","19ea683f237d4f1a8d1fb5789ed7ff36",{"version":"84abec7188cc883a941b4ccd7fd9d289","impliedNodeFormat":99},"b054c471abb80fc8a43acab9bea000a3","8380977a7a864769d4c9d984bc964574","36ab07a0a935e1fb905248d0f525b297","9b755cebe4e5505cec0f9a6aa7866d4f","aa47ff7f1f61ab4be48e069f6b4d6ccc","d36e24d66e97cf0c76d270e1a8bc02f0","0e05a3914d64387c7a6eca13f97f3d09","115b9f5f1484f3d25821798d1644a2c8","157601ad4f7f7a4021ad53b71fd12776",{"version":"90e6601d79389924f73e179905d010ff","signature":"e547b80183f92e21189a7396c58dcbf7","impliedNodeFormat":1},{"version":"b01deb5dc72d3db32be018a6438bed8c","signature":"782cff46b4396155df88a6e685f81bdd","impliedNodeFormat":1},{"version":"695b73c9221d0af95c0252a63b4af21b","signature":"2e330db4e7778ce0ded31119464426e8","impliedNodeFormat":1},{"version":"a47941acc3cffea7c31b7f5782450718","signature":"c96b805a64adf79eafe76361bfe01a73","impliedNodeFormat":1},{"version":"1b1e1cdf2f8e232d0fbd2495d1949531","signature":"80bc89756e46afe8e231ae2a342593f4","impliedNodeFormat":1},{"version":"3c0ed70dd9a29d1995583d65b20b0319","signature":"abe7d9981d6018efb6b2b794f40a1607","impliedNodeFormat":1},{"version":"9f73306a8a7552f4e69ef205edeb060b","signature":"89c6d09d92c6a361f0cf252f3ab0868e","impliedNodeFormat":1}],"fileIdsList":[[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,240,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,217,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,235,236,237,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,238,239,241,260],[98,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,140,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[96,97,98,99,100,101,102,103,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,196,197,260],[98,140,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,140,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,230,260],[98,112,116,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,112,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,107,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,109,112,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,107,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,260],[98,104,105,108,111,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,112,119,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,104,110,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,112,133,134,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,108,112,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,260],[98,133,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,260],[98,106,107,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,260],[98,106,107,108,109,110,111,112,113,114,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,134,135,136,137,138,139,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,112,127,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,112,119,120,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,110,112,120,121,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,111,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,104,107,112,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,112,116,120,121,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,116,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,110,112,115,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,104,109,112,119,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,107,112,133,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,226,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,230,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,227,228,229,231,232,233,234,243,244,245,246,247,248,251,252,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,226,242,253,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,226,249,250,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,217,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,220,224,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,221,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,219,220,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,219,220,222,223,225,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,255,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,253,254,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,253,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260,261,263],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,226,257,260,261,264,265,266,267,268],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,258,259,260,263,264,265],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260,262],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,259,260],[95,98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,201,203,260],[95,98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,201,202,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,203,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,204,205,206,207,260],[95,98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,199,200,202,203,208,215,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,201,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,201,209,210,211,212,213,214,260],[95,98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,200,202,260],[94,98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,216,260,274],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,216,218,253,260,273],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,218,253,260,270,271],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,260,270,271,272,273],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,253,260,270],[98,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,218,253,256,260,269,270,271,272]],"options":{"composite":true,"emitDeclarationOnly":true,"declaration":true,"declarationMap":true,"jsx":3,"module":200,"noImplicitAny":false,"outDir":"./build","removeComments":false,"rootDir":"./src","skipLibCheck":true,"strict":true,"strictNullChecks":true,"target":99,"allowSyntheticDefaultImports":true,"esModuleInterop":true},"referencedMap":[[91,1],[92,1],[16,1],[14,1],[15,1],[20,1],[19,1],[2,1],[21,1],[22,1],[23,1],[24,1],[25,1],[26,1],[27,1],[28,1],[3,1],[29,1],[30,1],[4,1],[31,1],[35,1],[32,1],[33,1],[34,1],[36,1],[37,1],[38,1],[5,1],[39,1],[40,1],[41,1],[42,1],[6,1],[46,1],[43,1],[44,1],[45,1],[47,1],[7,1],[48,1],[53,1],[54,1],[49,1],[50,1],[51,1],[52,1],[8,1],[58,1],[55,1],[56,1],[57,1],[59,1],[9,1],[60,1],[61,1],[62,1],[64,1],[63,1],[65,1],[66,1],[10,1],[67,1],[68,1],[69,1],[11,1],[70,1],[71,1],[72,1],[73,1],[74,1],[75,1],[12,1],[76,1],[77,1],[78,1],[79,1],[80,1],[1,1],[81,1],[82,1],[13,1],[83,1],[84,1],[85,1],[86,1],[93,1],[87,1],[88,1],[89,1],[90,1],[18,1],[17,1],[241,2],[240,3],[218,4],[238,5],[242,6],[230,1],[217,1],[145,7],[146,8],[147,9],[98,10],[148,11],[149,12],[150,13],[96,1],[151,14],[152,15],[153,16],[154,17],[155,18],[156,19],[157,20],[158,21],[159,22],[160,23],[161,24],[99,1],[97,1],[162,25],[163,26],[164,27],[198,28],[165,29],[166,30],[167,31],[168,32],[169,33],[170,34],[171,35],[172,36],[173,37],[174,38],[175,39],[176,40],[177,41],[178,42],[179,43],[180,44],[182,45],[181,46],[183,47],[184,48],[185,49],[186,50],[187,51],[188,52],[189,53],[190,54],[191,55],[192,56],[193,57],[194,58],[195,59],[100,1],[101,1],[102,1],[103,1],[141,60],[142,1],[143,1],[144,1],[196,61],[197,62],[236,1],[237,1],[235,3],[239,63],[119,64],[129,65],[118,64],[139,66],[110,67],[109,1],[138,3],[132,68],[137,67],[112,69],[126,70],[111,71],[135,72],[107,73],[106,3],[136,74],[108,75],[113,65],[114,1],[117,65],[104,1],[140,76],[130,77],[121,78],[122,79],[124,80],[120,81],[123,82],[133,3],[115,83],[116,84],[125,85],[105,1],[128,77],[127,65],[131,1],[134,86],[227,87],[228,1],[229,1],[231,88],[232,1],[253,89],[233,1],[234,87],[243,90],[244,1],[249,1],[250,1],[245,1],[246,1],[247,1],[248,1],[251,91],[252,1],[224,92],[219,1],[225,93],[220,1],[222,94],[221,95],[223,1],[226,96],[256,97],[255,98],[254,99],[265,1],[264,100],[269,101],[261,1],[257,87],[266,102],[267,87],[263,103],[268,1],[260,104],[258,3],[262,105],[259,3],[202,106],[203,107],[204,108],[205,108],[208,109],[206,108],[207,108],[216,110],[209,111],[210,111],[211,111],[212,1],[213,1],[214,111],[215,112],[201,113],[94,1],[95,114],[200,1],[199,1],[275,115],[274,116],[272,117],[276,118],[271,119],[270,99],[273,120]],"latestChangedDtsFile":"./build/index.d.ts"}
package/vite.config.mjs CHANGED
@@ -1,9 +1,10 @@
1
1
  import { builtinModules, createRequire } from 'node:module';
2
2
  import path from 'node:path';
3
3
 
4
- import dts from 'vite-plugin-dts';
5
4
  import { defineConfig } from 'vite';
6
5
 
6
+ import { nativeDts } from '../../../vite.lib.config.mjs';
7
+
7
8
  const dirname = import.meta.dirname;
8
9
  const require = createRequire(path.resolve(dirname, 'package.json'));
9
10
  const pkg = require('./package.json');
@@ -29,11 +30,7 @@ const sharedOutput = {
29
30
  };
30
31
 
31
32
  export default defineConfig({
32
- plugins: [
33
- dts({
34
- tsconfigPath: path.resolve(dirname, 'tsconfig.build.json'),
35
- }),
36
- ],
33
+ plugins: [nativeDts(dirname)],
37
34
  build: {
38
35
  outDir: 'build',
39
36
  emptyOutDir: true,