@soda-gql/tools 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -0
- package/codegen.d.ts +2 -0
- package/codegen.js +1 -0
- package/dist/bin.cjs +15509 -0
- package/dist/bin.cjs.map +1 -0
- package/dist/bin.d.cts +839 -0
- package/dist/bin.d.cts.map +1 -0
- package/dist/chunk-BrXtsOCC.cjs +41 -0
- package/dist/codegen.cjs +4704 -0
- package/dist/codegen.cjs.map +1 -0
- package/dist/codegen.d.cts +416 -0
- package/dist/codegen.d.cts.map +1 -0
- package/dist/codegen.d.mts +416 -0
- package/dist/codegen.d.mts.map +1 -0
- package/dist/codegen.mjs +4712 -0
- package/dist/codegen.mjs.map +1 -0
- package/dist/formatter-Glj5a663.cjs +510 -0
- package/dist/formatter-Glj5a663.cjs.map +1 -0
- package/dist/formatter.cjs +509 -0
- package/dist/formatter.cjs.map +1 -0
- package/dist/formatter.d.cts +33 -0
- package/dist/formatter.d.cts.map +1 -0
- package/dist/formatter.d.mts +33 -0
- package/dist/formatter.d.mts.map +1 -0
- package/dist/formatter.mjs +507 -0
- package/dist/formatter.mjs.map +1 -0
- package/dist/index.cjs +13 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +11 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +11 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +12 -0
- package/dist/index.mjs.map +1 -0
- package/dist/typegen.cjs +864 -0
- package/dist/typegen.cjs.map +1 -0
- package/dist/typegen.d.cts +205 -0
- package/dist/typegen.d.cts.map +1 -0
- package/dist/typegen.d.mts +205 -0
- package/dist/typegen.d.mts.map +1 -0
- package/dist/typegen.mjs +859 -0
- package/dist/typegen.mjs.map +1 -0
- package/formatter.d.ts +2 -0
- package/formatter.js +1 -0
- package/index.d.ts +2 -0
- package/index.js +1 -0
- package/package.json +102 -0
- package/typegen.d.ts +2 -0
- package/typegen.js +1 -0
package/dist/bin.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.cjs","names":["args: BuildArgs","formatSuccess","lines: string[]","meta: BuilderArtifactMeta | undefined","artifactWithMeta: BuilderArtifact","data: BuildData","data","args: ValidateArgs","formatSuccess","lines: string[]","WIN_SLASH","WIN_NO_SLASH","DOT_LITERAL","PLUS_LITERAL","QMARK_LITERAL","SLASH_LITERAL","ONE_CHAR","QMARK","END_ANCHOR","START_ANCHOR","DOTS_SLASH","NO_DOT","NO_DOTS","NO_DOT_SLASH","NO_DOTS_SLASH","QMARK_NO_DOT","STAR","POSIX_CHARS","WINDOWS_CHARS","POSIX_REGEX_SOURCE","chars","win32","REGEX_SPECIAL_CHARS","REGEX_SPECIAL_CHARS_GLOBAL","REGEX_BACKSLASH","platform","REGEX_REMOVE_BACKSLASH","append","path","utils","isPathSeparator","CHAR_FORWARD_SLASH","CHAR_BACKWARD_SLASH","depth","scan","isGlob","isExtglob","braces","CHAR_LEFT_CURLY_BRACE","CHAR_DOT","CHAR_COMMA","CHAR_RIGHT_CURLY_BRACE","CHAR_PLUS","CHAR_AT","CHAR_ASTERISK","CHAR_QUESTION_MARK","CHAR_EXCLAMATION_MARK","CHAR_LEFT_PARENTHESES","CHAR_RIGHT_PARENTHESES","CHAR_LEFT_SQUARE_BRACKET","CHAR_RIGHT_SQUARE_BRACKET","constants","utils","expandRange","syntaxError","parse","REPLACEMENTS","MAX_LENGTH","START_ANCHOR","opts","DOTS_SLASH","DOT_LITERAL","NO_DOT","QMARK","QMARK_NO_DOT","STAR","braces","value","append","isExtglob","ONE_CHAR","REGEX_SPECIAL_CHARS_BACKREF","chars","rest","POSIX_REGEX_SOURCE","escaped","open","SLASH_LITERAL","PLUS_LITERAL","REGEX_NON_SPECIAL_CHARS","NO_DOT_SLASH","NO_DOTS_SLASH","NO_DOTS","source","scan","parse","utils","constants","isObject","picomatch","state","append","err","utils","picomatch","builtinScalarTypes","Kind","isScalarName","isEnumName","defaultSuffix","kind: \"scalar\" | \"enum\" | \"input\"","kind: \"scalar\" | \"enum\" | \"union\" | \"object\"","imports: string[]","exports: string[]","typeExports: string[]","path","exports","injectsImports: string[]","schemaBlocks: string[]","gqlExports: string[]","prebuiltExports: string[]","schemaConfigs: Record<string, any>","scalarVars: string[]","enumVars: string[]","inputVars: string[]","objectVars: string[]","unionVars: string[]","injection: RuntimeTemplateInjection","splitting: SplittingMode","categoryVarsResult: Record<string, CategoryVars>","code","operations: ParsedOperation[]","fragments: ParsedFragment[]","Kind","variables: ParsedVariable[]","levels: TypeLevel[]","lists: (\"[]!\" | \"[]?\")[]","match: RegExpExecArray | null","mergedInner: \"!\" | \"?\"","mergedLists: (\"[]!\" | \"[]?\")[]","usages: VariableUsage[]","error","variables: InferredVariable[]","sorted: ParsedFragment[]","path","fragments: EnrichedFragment[]","operations: EnrichedOperation[]","variables: EnrichedVariable[]","spreadVariables: InferredVariable[]","allUsages: VariableUsage[]","getRootTypeName","lines: string[]","inlineFragments: ParsedInlineFragment[]","otherSelections: ParsedSelection[]","entries: string[]","values: string[]","result","argEntries: string[]","getInjectTemplate","Kind","queue: string[]","rootTypes: string[]","inputQueue: string[]","warnings: string[]","esbuildBundler: Bundler","result: T[][]","imports: string[]","files: Array<{ relativePath: string; content: string }>","importPaths: Record<DefinitionCategory, string>","categories: DefinitionCategory[]","documents: DocumentNode[]","extensionMap: Record<string, string>","toImportSpecifier","withPrefix","currentExt","extensionMap","schemaHashes: Record<string, { schemaHash: string; objects: number; enums: number; inputs: number; unions: number }>","defsPaths: string[]","defaultBundler","warnings: string[]","builderErrors","outputFormatters: TypeFormatters","inputFormatters: TypeFormatters","Kind","lines: string[]","formatters: TypeFormatters","lines: string[]","module","declaration: ImportDeclaration | null","warnings: string[]","warnings: string[]","fg","warnings: string[]","Kind","depth","extensionMap: Record<string, string>","withPrefix","currentExt","z","parsed: Record<string, unknown>","positional: string[]","inputPatterns: readonly string[]","schemaDocument: SchemaDocument","graphqlFiles: string[]","files","files: GeneratedFile[]","imports: string[]","bodies: string[]","formatSuccess","schemas: Record<string, CodegenSchemaConfig>","formatSuccess","result","resolvedSchemas: Record<string, CodegenSchemaConfig>","messages: string[]","compatFiles: Awaited<ReturnType<typeof generateCompatFiles>> | undefined","compatArgs: ParsedGraphqlArgs","resolvedSchemas: Record<string, CodegenSchemaConfig>","typeFilter: TypeFilterConfig | undefined","schemaResults: CodegenFreshnessData[\"schemas\"][number][]","existingPaths: string[]","missingFiles: string[]","packages: DiscoveredPackage[]","allPackages: DiscoveredPackage[]","queue: string[]","realPath: string","duplicates: DuplicatePackageData[\"duplicates\"][number][]","STATUS_SYMBOLS: Record<CheckStatus, string>","isObject","lines: string[]","parts: string[]","checks: CheckResult[]","result: DoctorResult","parts: string[]","files: string[]","targetPatterns: readonly string[]","excludePatterns: readonly string[]","data: FormatData","data","unformatted: string[]","createdPaths: string[]","formatSuccess","files: FileToGenerate[]","createLspServer: typeof import(\"@soda-gql/lsp\")[\"createLspServer\"]","path","WIN_SLASH","WIN_NO_SLASH","DOT_LITERAL","PLUS_LITERAL","QMARK_LITERAL","SLASH_LITERAL","ONE_CHAR","QMARK","END_ANCHOR","START_ANCHOR","DOTS_SLASH","NO_DOT","NO_DOTS","NO_DOT_SLASH","NO_DOTS_SLASH","QMARK_NO_DOT","STAR","POSIX_CHARS","WINDOWS_CHARS","POSIX_REGEX_SOURCE","chars","win32","path","win32","REGEX_SPECIAL_CHARS","REGEX_SPECIAL_CHARS_GLOBAL","REGEX_BACKSLASH","REGEX_REMOVE_BACKSLASH","append","utils","isPathSeparator","CHAR_FORWARD_SLASH","CHAR_BACKWARD_SLASH","depth","scan","isGlob","isExtglob","braces","CHAR_LEFT_CURLY_BRACE","CHAR_DOT","CHAR_COMMA","CHAR_RIGHT_CURLY_BRACE","CHAR_PLUS","CHAR_AT","CHAR_ASTERISK","CHAR_QUESTION_MARK","CHAR_EXCLAMATION_MARK","CHAR_LEFT_PARENTHESES","CHAR_RIGHT_PARENTHESES","CHAR_LEFT_SQUARE_BRACKET","CHAR_RIGHT_SQUARE_BRACKET","constants","utils","expandRange","syntaxError","parse","REPLACEMENTS","MAX_LENGTH","win32","START_ANCHOR","opts","DOTS_SLASH","DOT_LITERAL","NO_DOT","QMARK","QMARK_NO_DOT","STAR","braces","value","append","isExtglob","ONE_CHAR","REGEX_SPECIAL_CHARS_BACKREF","chars","rest","POSIX_REGEX_SOURCE","escaped","open","SLASH_LITERAL","PLUS_LITERAL","REGEX_NON_SPECIAL_CHARS","NO_DOT_SLASH","NO_DOTS_SLASH","NO_DOTS","source","path","scan","parse","utils","constants","isObject","picomatch","state","append","err","fs","sysPath","picomatch","readdir","promisify","stat","lstat","realpath","BANG","path","depth","basename","err","readdirp","resolve","path","STAR","POSIX_REGEX_SOURCE","chars","win32","path","append","utils","scan","isGlob","isExtglob","braces","CHAR_LEFT_CURLY_BRACE","CHAR_DOT","CHAR_COMMA","CHAR_RIGHT_CURLY_BRACE","CHAR_LEFT_PARENTHESES","CHAR_RIGHT_PARENTHESES","CHAR_LEFT_SQUARE_BRACKET","CHAR_RIGHT_SQUARE_BRACKET","constants","utils","parse","MAX_LENGTH","win32","START_ANCHOR","opts","DOTS_SLASH","DOT_LITERAL","NO_DOT","QMARK","QMARK_NO_DOT","STAR","braces","value","append","isExtglob","ONE_CHAR","chars","rest","escaped","open","SLASH_LITERAL","PLUS_LITERAL","NO_DOT_SLASH","NO_DOTS_SLASH","NO_DOTS","source","path","parse","utils","isObject","picomatch","state","append","err","path","normalizePath","BANG","arrify","path","anymatch","returnIndex","testString","isExtglob","open","close","isGlob","isGlob","globParent","node","min","utils","stringify","isNumber","toRegexRange","min","zeros","max","stringify","min","fill","fill","utils","compile","stringify","expand","stringify","parse","depth","open","index","braces","fs","sysPath","promisify","stat","lstat","statMethods","main","path","EV_ERROR","isWindows","err","EV_CHANGE","listener","NodeFsHandler","basename","EMPTY_FN","dirname","newStats","EV_ADD","EMPTY_STR","STR_DATA","depth","STR_END","EV_ADD_DIR","realpath","stats","BRACE_START","fs","sysPath","maj","min","stat","promisify","path","FsEventsHandler","EV_CHANGE","EV_ADD","EV_UNLINK","EV_ADD_DIR","transform","FUNCTION_TYPE","EV_ERROR","EMPTY_FN","STR_END","path","err","now","stat","depth","path","timeout: ReturnType<typeof setTimeout> | null","state: WatchState","lines: string[]","data: TypegenSuccessData","cliErrorHints: Partial<Record<CliErrorCode, string>>","codegenErrorHints: Record<string, string>","configErrorHints: Record<string, string>","artifactErrorHints: Record<string, string>","typegenErrorHints: Record<string, string>","lines: string[]"],"sources":["../src/cli/errors.ts","../src/cli/commands/artifact/build.ts","../src/cli/commands/artifact/validate.ts","../src/cli/commands/artifact/index.ts","../../../node_modules/picomatch/lib/constants.js","../../../node_modules/picomatch/lib/utils.js","../../../node_modules/picomatch/lib/scan.js","../../../node_modules/picomatch/lib/parse.js","../../../node_modules/picomatch/lib/picomatch.js","../../../node_modules/picomatch/index.js","../src/codegen/type-filter.ts","../src/codegen/generator.ts","../src/codegen/graphql-compat/parser.ts","../src/codegen/graphql-compat/transformer.ts","../src/codegen/graphql-compat/emitter.ts","../src/codegen/inject-template.ts","../src/codegen/reachability.ts","../src/codegen/bundler/esbuild.ts","../src/codegen/defs-generator.ts","../src/codegen/file.ts","../src/codegen/schema.ts","../src/codegen/runner.ts","../src/typegen/emitter.ts","../src/typegen/errors.ts","../src/typegen/template-extractor.ts","../src/typegen/template-scanner.ts","../src/typegen/template-to-selections.ts","../src/typegen/runner.ts","../src/cli/schemas/args.ts","../src/cli/utils/parse-args.ts","../src/cli/commands/codegen/graphql.ts","../src/cli/commands/codegen/schema.ts","../src/cli/commands/codegen/index.ts","../src/cli/commands/doctor/checks/codegen-freshness.ts","../src/cli/commands/doctor/checks/config-validation.ts","../src/cli/commands/doctor/discovery.ts","../src/cli/commands/doctor/checks/duplicate-packages.ts","../src/cli/commands/doctor/checks/version-consistency.ts","../src/cli/commands/doctor/output.ts","../src/cli/commands/doctor/index.ts","../src/cli/commands/format.ts","../src/cli/templates/config.template.ts","../src/cli/templates/gitignore.template.ts","../src/cli/templates/inject.template.ts","../src/cli/templates/schema.template.ts","../src/cli/commands/init.ts","../src/cli/commands/lsp.ts","../../../node_modules/readdirp/node_modules/picomatch/lib/constants.js","../../../node_modules/readdirp/node_modules/picomatch/lib/utils.js","../../../node_modules/readdirp/node_modules/picomatch/lib/scan.js","../../../node_modules/readdirp/node_modules/picomatch/lib/parse.js","../../../node_modules/readdirp/node_modules/picomatch/lib/picomatch.js","../../../node_modules/readdirp/node_modules/picomatch/index.js","../../../node_modules/readdirp/index.js","../../../node_modules/anymatch/node_modules/picomatch/lib/constants.js","../../../node_modules/anymatch/node_modules/picomatch/lib/utils.js","../../../node_modules/anymatch/node_modules/picomatch/lib/scan.js","../../../node_modules/anymatch/node_modules/picomatch/lib/parse.js","../../../node_modules/anymatch/node_modules/picomatch/lib/picomatch.js","../../../node_modules/anymatch/node_modules/picomatch/index.js","../../../node_modules/normalize-path/index.js","../../../node_modules/anymatch/index.js","../../../node_modules/is-extglob/index.js","../../../node_modules/is-glob/index.js","../../../node_modules/glob-parent/index.js","../../../node_modules/braces/lib/utils.js","../../../node_modules/braces/lib/stringify.js","../../../node_modules/is-number/index.js","../../../node_modules/to-regex-range/index.js","../../../node_modules/fill-range/index.js","../../../node_modules/braces/lib/compile.js","../../../node_modules/braces/lib/expand.js","../../../node_modules/braces/lib/constants.js","../../../node_modules/braces/lib/parse.js","../../../node_modules/braces/index.js","../../../node_modules/binary-extensions/binary-extensions.json","../../../node_modules/binary-extensions/index.js","../../../node_modules/is-binary-path/index.js","../../../node_modules/chokidar/lib/constants.js","../../../node_modules/chokidar/lib/nodefs-handler.js","../../../node_modules/chokidar/lib/fsevents-handler.js","../../../node_modules/chokidar/index.js","../src/cli/commands/typegen-watch.ts","../src/cli/commands/typegen.ts","../src/cli/utils/format.ts","../src/cli/index.ts"],"sourcesContent":["/**\n * Unified CLI error types and constructors.\n * @module\n */\n\nimport type { ArtifactLoadError, BuilderError } from \"@soda-gql/builder\";\nimport type { ConfigError } from \"@soda-gql/config\";\nimport { err, type Result } from \"neverthrow\";\nimport type { CodegenError } from \"../codegen\";\nimport type { TypegenError } from \"../typegen\";\n\n/**\n * CLI-specific error codes.\n */\nexport type CliErrorCode =\n // Argument parsing errors\n | \"CLI_ARGS_INVALID\"\n | \"CLI_UNKNOWN_COMMAND\"\n | \"CLI_UNKNOWN_SUBCOMMAND\"\n // File operation errors\n | \"CLI_FILE_EXISTS\"\n | \"CLI_FILE_NOT_FOUND\"\n | \"CLI_WRITE_FAILED\"\n | \"CLI_READ_FAILED\"\n // Format command specific\n | \"CLI_NO_PATTERNS\"\n | \"CLI_FORMATTER_NOT_INSTALLED\"\n | \"CLI_PARSE_ERROR\"\n | \"CLI_FORMAT_ERROR\"\n | \"CLI_DUPLICATE_FRAGMENT\"\n | \"CLI_FRAGMENT_NOT_FOUND\"\n // Unexpected errors\n | \"CLI_UNEXPECTED\";\n\n/**\n * Unified CLI error discriminated union.\n * Wraps external errors (codegen, builder, config, typegen) and defines CLI-specific errors.\n */\nexport type CliError =\n // Wrapped external errors (preserve original structure)\n | { readonly category: \"codegen\"; readonly error: CodegenError }\n | { readonly category: \"builder\"; readonly error: BuilderError }\n | { readonly category: \"artifact\"; readonly error: ArtifactLoadError }\n | { readonly category: \"config\"; readonly error: ConfigError }\n | { readonly category: \"typegen\"; readonly error: TypegenError }\n // CLI-specific errors\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_ARGS_INVALID\";\n readonly message: string;\n readonly command: string;\n }\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_UNKNOWN_COMMAND\";\n readonly message: string;\n readonly command: string;\n }\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_UNKNOWN_SUBCOMMAND\";\n readonly message: string;\n readonly parent: string;\n readonly subcommand: string;\n }\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_FILE_EXISTS\";\n readonly message: string;\n readonly filePath: string;\n }\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_FILE_NOT_FOUND\";\n readonly message: string;\n readonly filePath: string;\n }\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_WRITE_FAILED\";\n readonly message: string;\n readonly filePath: string;\n readonly cause?: unknown;\n }\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_READ_FAILED\";\n readonly message: string;\n readonly filePath: string;\n readonly cause?: unknown;\n }\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_NO_PATTERNS\";\n readonly message: string;\n }\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_FORMATTER_NOT_INSTALLED\";\n readonly message: string;\n }\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_PARSE_ERROR\";\n readonly message: string;\n readonly filePath?: string;\n }\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_FORMAT_ERROR\";\n readonly message: string;\n readonly filePath?: string;\n }\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_DUPLICATE_FRAGMENT\";\n readonly message: string;\n readonly fragmentName: string;\n readonly existingFile: string;\n readonly newFile: string;\n }\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_FRAGMENT_NOT_FOUND\";\n readonly message: string;\n readonly fragmentName: string;\n readonly referencedIn: string;\n }\n | {\n readonly category: \"cli\";\n readonly code: \"CLI_UNEXPECTED\";\n readonly message: string;\n readonly cause?: unknown;\n };\n\n/**\n * Result type for CLI operations.\n */\nexport type CliResult<T> = Result<T, CliError>;\n\n// Extract CLI-specific error types for type-safe constructors\ntype CliArgsInvalidError = Extract<CliError, { code: \"CLI_ARGS_INVALID\" }>;\ntype CliUnknownCommandError = Extract<CliError, { code: \"CLI_UNKNOWN_COMMAND\" }>;\ntype CliUnknownSubcommandError = Extract<CliError, { code: \"CLI_UNKNOWN_SUBCOMMAND\" }>;\ntype CliFileExistsError = Extract<CliError, { code: \"CLI_FILE_EXISTS\" }>;\ntype CliFileNotFoundError = Extract<CliError, { code: \"CLI_FILE_NOT_FOUND\" }>;\ntype CliWriteFailedError = Extract<CliError, { code: \"CLI_WRITE_FAILED\" }>;\ntype CliReadFailedError = Extract<CliError, { code: \"CLI_READ_FAILED\" }>;\ntype CliNoPatternsError = Extract<CliError, { code: \"CLI_NO_PATTERNS\" }>;\ntype CliFormatterNotInstalledError = Extract<CliError, { code: \"CLI_FORMATTER_NOT_INSTALLED\" }>;\ntype CliParseErrorError = Extract<CliError, { code: \"CLI_PARSE_ERROR\" }>;\ntype CliFormatErrorError = Extract<CliError, { code: \"CLI_FORMAT_ERROR\" }>;\ntype CliDuplicateFragmentError = Extract<CliError, { code: \"CLI_DUPLICATE_FRAGMENT\" }>;\ntype CliFragmentNotFoundError = Extract<CliError, { code: \"CLI_FRAGMENT_NOT_FOUND\" }>;\ntype CliUnexpectedError = Extract<CliError, { code: \"CLI_UNEXPECTED\" }>;\ntype CliCodegenError = Extract<CliError, { category: \"codegen\" }>;\ntype CliBuilderError = Extract<CliError, { category: \"builder\" }>;\ntype CliArtifactError = Extract<CliError, { category: \"artifact\" }>;\ntype CliConfigError = Extract<CliError, { category: \"config\" }>;\ntype CliTypegenError = Extract<CliError, { category: \"typegen\" }>;\n\n/**\n * Error constructor helpers for concise error creation.\n * Each function returns a specific error type for better type inference.\n */\nexport const cliErrors = {\n argsInvalid: (command: string, message: string): CliArgsInvalidError => ({\n category: \"cli\",\n code: \"CLI_ARGS_INVALID\",\n message,\n command,\n }),\n\n unknownCommand: (command: string): CliUnknownCommandError => ({\n category: \"cli\",\n code: \"CLI_UNKNOWN_COMMAND\",\n message: `Unknown command: ${command}`,\n command,\n }),\n\n unknownSubcommand: (parent: string, subcommand: string): CliUnknownSubcommandError => ({\n category: \"cli\",\n code: \"CLI_UNKNOWN_SUBCOMMAND\",\n message: `Unknown subcommand: ${subcommand}`,\n parent,\n subcommand,\n }),\n\n fileExists: (filePath: string, message?: string): CliFileExistsError => ({\n category: \"cli\",\n code: \"CLI_FILE_EXISTS\",\n message: message ?? `File already exists: ${filePath}. Use --force to overwrite.`,\n filePath,\n }),\n\n fileNotFound: (filePath: string, message?: string): CliFileNotFoundError => ({\n category: \"cli\",\n code: \"CLI_FILE_NOT_FOUND\",\n message: message ?? `File not found: ${filePath}`,\n filePath,\n }),\n\n writeFailed: (filePath: string, message?: string, cause?: unknown): CliWriteFailedError => ({\n category: \"cli\",\n code: \"CLI_WRITE_FAILED\",\n message: message ?? `Failed to write file: ${filePath}`,\n filePath,\n cause,\n }),\n\n readFailed: (filePath: string, message?: string, cause?: unknown): CliReadFailedError => ({\n category: \"cli\",\n code: \"CLI_READ_FAILED\",\n message: message ?? `Failed to read file: ${filePath}`,\n filePath,\n cause,\n }),\n\n noPatterns: (message?: string): CliNoPatternsError => ({\n category: \"cli\",\n code: \"CLI_NO_PATTERNS\",\n message: message ?? \"No patterns provided and config not found. Usage: soda-gql format [patterns...] [--check]\",\n }),\n\n formatterNotInstalled: (message?: string): CliFormatterNotInstalledError => ({\n category: \"cli\",\n code: \"CLI_FORMATTER_NOT_INSTALLED\",\n message: message ?? \"@soda-gql/tools formatter failed to load\",\n }),\n\n parseError: (message: string, filePath?: string): CliParseErrorError => ({\n category: \"cli\",\n code: \"CLI_PARSE_ERROR\",\n message,\n filePath,\n }),\n\n formatError: (message: string, filePath?: string): CliFormatErrorError => ({\n category: \"cli\",\n code: \"CLI_FORMAT_ERROR\",\n message,\n filePath,\n }),\n\n duplicateFragment: (fragmentName: string, existingFile: string, newFile: string): CliDuplicateFragmentError => ({\n category: \"cli\",\n code: \"CLI_DUPLICATE_FRAGMENT\",\n message: `Fragment \"${fragmentName}\" is defined in multiple files:\\n - ${existingFile}\\n - ${newFile}`,\n fragmentName,\n existingFile,\n newFile,\n }),\n\n fragmentNotFound: (fragmentName: string, referencedIn: string): CliFragmentNotFoundError => ({\n category: \"cli\",\n code: \"CLI_FRAGMENT_NOT_FOUND\",\n message: `Fragment \"${fragmentName}\" is referenced but not defined in any input file`,\n fragmentName,\n referencedIn,\n }),\n\n unexpected: (message: string, cause?: unknown): CliUnexpectedError => ({\n category: \"cli\",\n code: \"CLI_UNEXPECTED\",\n message,\n cause,\n }),\n\n // Wrappers for external errors\n fromCodegen: (error: CodegenError): CliCodegenError => ({\n category: \"codegen\",\n error,\n }),\n\n fromBuilder: (error: BuilderError): CliBuilderError => ({\n category: \"builder\",\n error,\n }),\n\n fromArtifact: (error: ArtifactLoadError): CliArtifactError => ({\n category: \"artifact\",\n error,\n }),\n\n fromConfig: (error: ConfigError): CliConfigError => ({\n category: \"config\",\n error,\n }),\n\n fromTypegen: (error: TypegenError): CliTypegenError => ({\n category: \"typegen\",\n error,\n }),\n} as const;\n\n/**\n * Convenience helper to create an err Result from CliError.\n */\nexport const cliErr = <T = never>(error: CliError): CliResult<T> => err(error);\n\n/**\n * Type guard to check if error is a CLI-specific error.\n */\nexport const isCliError = (error: CliError): error is CliError & { category: \"cli\" } => {\n return error.category === \"cli\";\n};\n\n/**\n * Extract error code from any CliError variant.\n */\nexport const getErrorCode = (error: CliError): string => {\n if (error.category === \"cli\") {\n return error.code;\n }\n // codegen, builder, artifact, config all have error.code\n return error.error.code;\n};\n\n/**\n * Extract error message from any CliError variant.\n */\nexport const getErrorMessage = (error: CliError): string => {\n if (error.category === \"cli\") {\n return error.message;\n }\n return error.error.message;\n};\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport type { BuilderArtifact, BuilderArtifactMeta } from \"@soda-gql/builder\";\nimport { createBuilderService } from \"@soda-gql/builder\";\nimport { loadConfig } from \"@soda-gql/config\";\nimport { err, ok } from \"neverthrow\";\nimport { cliErrors } from \"../../errors\";\nimport type { CommandResult, CommandSuccess } from \"../../types\";\n\nconst BUILD_HELP = `Usage: soda-gql artifact build [options]\n\nBuild and validate soda-gql artifacts.\n\nOptions:\n --config <path> Path to soda-gql.config.ts\n --output, -o Output file path (default: ./soda-gql-artifact.json)\n --version, -v Custom version string for the artifact (default: package version)\n --dry-run Validate only, don't write output\n --help, -h Show this help message\n\nExamples:\n soda-gql artifact build\n soda-gql artifact build --output ./dist/artifact.json\n soda-gql artifact build --version \"1.0.0\"\n soda-gql artifact build --dry-run\n soda-gql artifact build --config ./soda-gql.config.ts\n`;\n\ntype BuildArgs = {\n configPath?: string;\n outputPath: string;\n version?: string;\n dryRun: boolean;\n help: boolean;\n};\n\nconst DEFAULT_OUTPUT_PATH = \"./soda-gql-artifact.json\";\n\n/**\n * Parse build command arguments.\n */\nconst parseBuildArgs = (argv: readonly string[]): BuildArgs => {\n const args: BuildArgs = {\n configPath: undefined,\n outputPath: DEFAULT_OUTPUT_PATH,\n version: undefined,\n dryRun: false,\n help: false,\n };\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--config\" || arg === \"-c\") {\n args.configPath = argv[++i];\n } else if (arg === \"--output\" || arg === \"-o\") {\n args.outputPath = argv[++i] ?? DEFAULT_OUTPUT_PATH;\n } else if (arg === \"--version\" || arg === \"-v\") {\n args.version = argv[++i];\n } else if (arg === \"--dry-run\") {\n args.dryRun = true;\n } else if (arg === \"--help\" || arg === \"-h\") {\n args.help = true;\n }\n }\n\n return args;\n};\n\ntype BuildData = {\n artifact: BuilderArtifact;\n outputPath?: string;\n dryRun: boolean;\n};\n\nconst formatSuccess = (data: BuildData): string => {\n const { artifact, outputPath, dryRun } = data;\n const fragmentCount = Object.values(artifact.elements).filter((e) => e.type === \"fragment\").length;\n const operationCount = Object.values(artifact.elements).filter((e) => e.type === \"operation\").length;\n\n const lines: string[] = [];\n if (dryRun) {\n lines.push(`Validation passed: ${fragmentCount} fragments, ${operationCount} operations`);\n } else {\n lines.push(`Build complete: ${fragmentCount} fragments, ${operationCount} operations`);\n }\n\n if (artifact.meta?.version) {\n lines.push(` Version: ${artifact.meta.version}`);\n }\n\n if (outputPath && !dryRun) {\n lines.push(`Artifact written to: ${outputPath}`);\n }\n\n return lines.join(\"\\n\");\n};\n\ntype BuildCommandResult = CommandResult<CommandSuccess & { data?: BuildData }>;\n\n/**\n * Build command - builds and validates soda-gql artifacts.\n */\nexport const buildCommand = async (argv: readonly string[]): Promise<BuildCommandResult> => {\n const args = parseBuildArgs(argv);\n\n if (args.help) {\n return ok({ message: BUILD_HELP });\n }\n\n // Load config\n const configResult = loadConfig(args.configPath);\n if (configResult.isErr()) {\n return err(cliErrors.fromConfig(configResult.error));\n }\n\n const config = configResult.value;\n\n // Create builder service and build\n const service = createBuilderService({ config });\n const buildResult = await service.buildAsync();\n\n if (buildResult.isErr()) {\n return err(cliErrors.fromBuilder(buildResult.error));\n }\n\n const artifact = buildResult.value;\n\n // Create artifact with metadata (only if version is specified)\n const meta: BuilderArtifactMeta | undefined = args.version\n ? {\n version: args.version,\n createdAt: new Date().toISOString(),\n }\n : undefined;\n const artifactWithMeta: BuilderArtifact = {\n ...(meta ? { meta } : {}),\n ...artifact,\n };\n\n if (args.dryRun) {\n const data: BuildData = { artifact: artifactWithMeta, dryRun: true };\n return ok({ message: formatSuccess(data), data });\n }\n\n // Write artifact to output file\n const outputPath = resolve(process.cwd(), args.outputPath);\n const outputDir = dirname(outputPath);\n try {\n await mkdir(outputDir, { recursive: true });\n await writeFile(outputPath, JSON.stringify(artifactWithMeta, null, 2));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return err(cliErrors.writeFailed(outputPath, `Failed to write artifact: ${message}`, error));\n }\n\n const data: BuildData = { artifact: artifactWithMeta, outputPath, dryRun: false };\n return ok({ message: formatSuccess(data), data });\n};\n","import { resolve } from \"node:path\";\nimport type { BuilderArtifact } from \"@soda-gql/builder\";\nimport { loadArtifact } from \"@soda-gql/builder\";\nimport { err, ok } from \"neverthrow\";\nimport { cliErrors } from \"../../errors\";\nimport type { CommandResult, CommandSuccess } from \"../../types\";\n\nconst VALIDATE_HELP = `Usage: soda-gql artifact validate [options] <path>\n\nValidate a pre-built soda-gql artifact file.\n\nArguments:\n <path> Path to artifact JSON file\n\nOptions:\n --help, -h Show this help message\n\nExamples:\n soda-gql artifact validate ./soda-gql-artifact.json\n soda-gql artifact validate ./dist/artifact.json\n`;\n\ntype ValidateArgs = {\n artifactPath?: string;\n help: boolean;\n};\n\n/**\n * Parse validate command arguments.\n */\nconst parseValidateArgs = (argv: readonly string[]): ValidateArgs => {\n const args: ValidateArgs = {\n artifactPath: undefined,\n help: false,\n };\n\n for (const arg of argv) {\n if (arg === \"--help\" || arg === \"-h\") {\n args.help = true;\n } else if (!arg.startsWith(\"-\")) {\n args.artifactPath = arg;\n }\n }\n\n return args;\n};\n\nconst formatSuccess = (artifact: BuilderArtifact): string => {\n const fragmentCount = Object.values(artifact.elements).filter((e) => e.type === \"fragment\").length;\n const operationCount = Object.values(artifact.elements).filter((e) => e.type === \"operation\").length;\n const lines: string[] = [`Artifact valid: ${fragmentCount} fragments, ${operationCount} operations`];\n\n if (artifact.meta) {\n lines.push(` Version: ${artifact.meta.version}`);\n lines.push(` Created: ${artifact.meta.createdAt}`);\n } else {\n lines.push(` (No metadata - legacy artifact format)`);\n }\n\n return lines.join(\"\\n\");\n};\n\ntype ValidateCommandResult = CommandResult<CommandSuccess & { data?: BuilderArtifact }>;\n\n/**\n * Validate command - validates a pre-built artifact file.\n */\nexport const validateCommand = async (argv: readonly string[]): Promise<ValidateCommandResult> => {\n const args = parseValidateArgs(argv);\n\n if (args.help) {\n return ok({ message: VALIDATE_HELP });\n }\n\n if (!args.artifactPath) {\n return err(cliErrors.argsInvalid(\"artifact validate\", \"Missing artifact path argument\"));\n }\n\n const artifactPath = resolve(process.cwd(), args.artifactPath);\n const result = await loadArtifact(artifactPath);\n\n if (result.isErr()) {\n return err(cliErrors.fromArtifact(result.error));\n }\n\n return ok({ message: formatSuccess(result.value), data: result.value });\n};\n","import { err, ok } from \"neverthrow\";\nimport { cliErrors } from \"../../errors\";\nimport type { CommandResult, CommandSuccess } from \"../../types\";\nimport { buildCommand } from \"./build\";\nimport { validateCommand } from \"./validate\";\n\nconst ARTIFACT_HELP = `Usage: soda-gql artifact <subcommand> [options]\n\nManage soda-gql artifacts.\n\nSubcommands:\n build Build artifacts (validate definitions)\n validate Validate a pre-built artifact file\n\nRun 'soda-gql artifact <subcommand> --help' for more information.\n`;\n\ntype ArtifactCommandResult = CommandResult<CommandSuccess>;\n\n/**\n * Dispatcher for artifact subcommands.\n */\nexport const artifactCommand = async (argv: readonly string[]): Promise<ArtifactCommandResult> => {\n const [subcommand, ...rest] = argv;\n\n if (!subcommand || subcommand === \"--help\" || subcommand === \"-h\") {\n return ok({ message: ARTIFACT_HELP });\n }\n\n if (subcommand === \"build\") {\n return buildCommand(rest);\n }\n\n if (subcommand === \"validate\") {\n return validateCommand(rest);\n }\n\n return err(cliErrors.unknownSubcommand(\"artifact\", subcommand));\n};\n","'use strict';\n\nconst WIN_SLASH = '\\\\\\\\/';\nconst WIN_NO_SLASH = `[^${WIN_SLASH}]`;\n\n/**\n * Posix glob regex\n */\n\nconst DOT_LITERAL = '\\\\.';\nconst PLUS_LITERAL = '\\\\+';\nconst QMARK_LITERAL = '\\\\?';\nconst SLASH_LITERAL = '\\\\/';\nconst ONE_CHAR = '(?=.)';\nconst QMARK = '[^/]';\nconst END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;\nconst START_ANCHOR = `(?:^|${SLASH_LITERAL})`;\nconst DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;\nconst NO_DOT = `(?!${DOT_LITERAL})`;\nconst NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;\nconst NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;\nconst NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;\nconst QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;\nconst STAR = `${QMARK}*?`;\nconst SEP = '/';\n\nconst POSIX_CHARS = {\n DOT_LITERAL,\n PLUS_LITERAL,\n QMARK_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n QMARK,\n END_ANCHOR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR,\n SEP\n};\n\n/**\n * Windows glob regex\n */\n\nconst WINDOWS_CHARS = {\n ...POSIX_CHARS,\n\n SLASH_LITERAL: `[${WIN_SLASH}]`,\n QMARK: WIN_NO_SLASH,\n STAR: `${WIN_NO_SLASH}*?`,\n DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,\n NO_DOT: `(?!${DOT_LITERAL})`,\n NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,\n NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n QMARK_NO_DOT: `[^.${WIN_SLASH}]`,\n START_ANCHOR: `(?:^|[${WIN_SLASH}])`,\n END_ANCHOR: `(?:[${WIN_SLASH}]|$)`,\n SEP: '\\\\'\n};\n\n/**\n * POSIX Bracket Regex\n */\n\nconst POSIX_REGEX_SOURCE = {\n alnum: 'a-zA-Z0-9',\n alpha: 'a-zA-Z',\n ascii: '\\\\x00-\\\\x7F',\n blank: ' \\\\t',\n cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n digit: '0-9',\n graph: '\\\\x21-\\\\x7E',\n lower: 'a-z',\n print: '\\\\x20-\\\\x7E ',\n punct: '\\\\-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n upper: 'A-Z',\n word: 'A-Za-z0-9_',\n xdigit: 'A-Fa-f0-9'\n};\n\nmodule.exports = {\n MAX_LENGTH: 1024 * 64,\n POSIX_REGEX_SOURCE,\n\n // regular expressions\n REGEX_BACKSLASH: /\\\\(?![*+?^${}(|)[\\]])/g,\n REGEX_NON_SPECIAL_CHARS: /^[^@![\\].,$*+?^{}()|\\\\/]+/,\n REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\\]]/,\n REGEX_SPECIAL_CHARS_BACKREF: /(\\\\?)((\\W)(\\3*))/g,\n REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\\]])/g,\n REGEX_REMOVE_BACKSLASH: /(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,\n\n // Replace globs with equivalent patterns to reduce parsing time.\n REPLACEMENTS: {\n __proto__: null,\n '***': '*',\n '**/**': '**',\n '**/**/**': '**'\n },\n\n // Digits\n CHAR_0: 48, /* 0 */\n CHAR_9: 57, /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 65, /* A */\n CHAR_LOWERCASE_A: 97, /* a */\n CHAR_UPPERCASE_Z: 90, /* Z */\n CHAR_LOWERCASE_Z: 122, /* z */\n\n CHAR_LEFT_PARENTHESES: 40, /* ( */\n CHAR_RIGHT_PARENTHESES: 41, /* ) */\n\n CHAR_ASTERISK: 42, /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: 38, /* & */\n CHAR_AT: 64, /* @ */\n CHAR_BACKWARD_SLASH: 92, /* \\ */\n CHAR_CARRIAGE_RETURN: 13, /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */\n CHAR_COLON: 58, /* : */\n CHAR_COMMA: 44, /* , */\n CHAR_DOT: 46, /* . */\n CHAR_DOUBLE_QUOTE: 34, /* \" */\n CHAR_EQUAL: 61, /* = */\n CHAR_EXCLAMATION_MARK: 33, /* ! */\n CHAR_FORM_FEED: 12, /* \\f */\n CHAR_FORWARD_SLASH: 47, /* / */\n CHAR_GRAVE_ACCENT: 96, /* ` */\n CHAR_HASH: 35, /* # */\n CHAR_HYPHEN_MINUS: 45, /* - */\n CHAR_LEFT_ANGLE_BRACKET: 60, /* < */\n CHAR_LEFT_CURLY_BRACE: 123, /* { */\n CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */\n CHAR_LINE_FEED: 10, /* \\n */\n CHAR_NO_BREAK_SPACE: 160, /* \\u00A0 */\n CHAR_PERCENT: 37, /* % */\n CHAR_PLUS: 43, /* + */\n CHAR_QUESTION_MARK: 63, /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */\n CHAR_RIGHT_CURLY_BRACE: 125, /* } */\n CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */\n CHAR_SEMICOLON: 59, /* ; */\n CHAR_SINGLE_QUOTE: 39, /* ' */\n CHAR_SPACE: 32, /* */\n CHAR_TAB: 9, /* \\t */\n CHAR_UNDERSCORE: 95, /* _ */\n CHAR_VERTICAL_LINE: 124, /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \\uFEFF */\n\n /**\n * Create EXTGLOB_CHARS\n */\n\n extglobChars(chars) {\n return {\n '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },\n '?': { type: 'qmark', open: '(?:', close: ')?' },\n '+': { type: 'plus', open: '(?:', close: ')+' },\n '*': { type: 'star', open: '(?:', close: ')*' },\n '@': { type: 'at', open: '(?:', close: ')' }\n };\n },\n\n /**\n * Create GLOB_CHARS\n */\n\n globChars(win32) {\n return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;\n }\n};\n","/*global navigator*/\n'use strict';\n\nconst {\n REGEX_BACKSLASH,\n REGEX_REMOVE_BACKSLASH,\n REGEX_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_GLOBAL\n} = require('./constants');\n\nexports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\nexports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);\nexports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);\nexports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\\\$1');\nexports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');\n\nexports.isWindows = () => {\n if (typeof navigator !== 'undefined' && navigator.platform) {\n const platform = navigator.platform.toLowerCase();\n return platform === 'win32' || platform === 'windows';\n }\n\n if (typeof process !== 'undefined' && process.platform) {\n return process.platform === 'win32';\n }\n\n return false;\n};\n\nexports.removeBackslashes = str => {\n return str.replace(REGEX_REMOVE_BACKSLASH, match => {\n return match === '\\\\' ? '' : match;\n });\n};\n\nexports.escapeLast = (input, char, lastIdx) => {\n const idx = input.lastIndexOf(char, lastIdx);\n if (idx === -1) return input;\n if (input[idx - 1] === '\\\\') return exports.escapeLast(input, char, idx - 1);\n return `${input.slice(0, idx)}\\\\${input.slice(idx)}`;\n};\n\nexports.removePrefix = (input, state = {}) => {\n let output = input;\n if (output.startsWith('./')) {\n output = output.slice(2);\n state.prefix = './';\n }\n return output;\n};\n\nexports.wrapOutput = (input, state = {}, options = {}) => {\n const prepend = options.contains ? '' : '^';\n const append = options.contains ? '' : '$';\n\n let output = `${prepend}(?:${input})${append}`;\n if (state.negated === true) {\n output = `(?:^(?!${output}).*$)`;\n }\n return output;\n};\n\nexports.basename = (path, { windows } = {}) => {\n const segs = path.split(windows ? /[\\\\/]/ : '/');\n const last = segs[segs.length - 1];\n\n if (last === '') {\n return segs[segs.length - 2];\n }\n\n return last;\n};\n","'use strict';\n\nconst utils = require('./utils');\nconst {\n CHAR_ASTERISK, /* * */\n CHAR_AT, /* @ */\n CHAR_BACKWARD_SLASH, /* \\ */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_EXCLAMATION_MARK, /* ! */\n CHAR_FORWARD_SLASH, /* / */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_PLUS, /* + */\n CHAR_QUESTION_MARK, /* ? */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_RIGHT_SQUARE_BRACKET /* ] */\n} = require('./constants');\n\nconst isPathSeparator = code => {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n};\n\nconst depth = token => {\n if (token.isPrefix !== true) {\n token.depth = token.isGlobstar ? Infinity : 1;\n }\n};\n\n/**\n * Quickly scans a glob pattern and returns an object with a handful of\n * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),\n * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not\n * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).\n *\n * ```js\n * const pm = require('picomatch');\n * console.log(pm.scan('foo/bar/*.js'));\n * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an object with tokens and regex source string.\n * @api public\n */\n\nconst scan = (input, options) => {\n const opts = options || {};\n\n const length = input.length - 1;\n const scanToEnd = opts.parts === true || opts.scanToEnd === true;\n const slashes = [];\n const tokens = [];\n const parts = [];\n\n let str = input;\n let index = -1;\n let start = 0;\n let lastIndex = 0;\n let isBrace = false;\n let isBracket = false;\n let isGlob = false;\n let isExtglob = false;\n let isGlobstar = false;\n let braceEscaped = false;\n let backslashes = false;\n let negated = false;\n let negatedExtglob = false;\n let finished = false;\n let braces = 0;\n let prev;\n let code;\n let token = { value: '', depth: 0, isGlob: false };\n\n const eos = () => index >= length;\n const peek = () => str.charCodeAt(index + 1);\n const advance = () => {\n prev = code;\n return str.charCodeAt(++index);\n };\n\n while (index < length) {\n code = advance();\n let next;\n\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braceEscaped = true;\n }\n continue;\n }\n\n if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n continue;\n }\n\n if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (braceEscaped !== true && code === CHAR_COMMA) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_RIGHT_CURLY_BRACE) {\n braces--;\n\n if (braces === 0) {\n braceEscaped = false;\n isBrace = token.isBrace = true;\n finished = true;\n break;\n }\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_FORWARD_SLASH) {\n slashes.push(index);\n tokens.push(token);\n token = { value: '', depth: 0, isGlob: false };\n\n if (finished === true) continue;\n if (prev === CHAR_DOT && index === (start + 1)) {\n start += 2;\n continue;\n }\n\n lastIndex = index + 1;\n continue;\n }\n\n if (opts.noext !== true) {\n const isExtglobChar = code === CHAR_PLUS\n || code === CHAR_AT\n || code === CHAR_ASTERISK\n || code === CHAR_QUESTION_MARK\n || code === CHAR_EXCLAMATION_MARK;\n\n if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n isExtglob = token.isExtglob = true;\n finished = true;\n if (code === CHAR_EXCLAMATION_MARK && index === start) {\n negatedExtglob = true;\n }\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n }\n\n if (code === CHAR_ASTERISK) {\n if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_QUESTION_MARK) {\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_LEFT_SQUARE_BRACKET) {\n while (eos() !== true && (next = advance())) {\n if (next === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n isBracket = token.isBracket = true;\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {\n negated = token.negated = true;\n start++;\n continue;\n }\n\n if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_LEFT_PARENTHESES) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n\n if (isGlob === true) {\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n }\n\n if (opts.noext === true) {\n isExtglob = false;\n isGlob = false;\n }\n\n let base = str;\n let prefix = '';\n let glob = '';\n\n if (start > 0) {\n prefix = str.slice(0, start);\n str = str.slice(start);\n lastIndex -= start;\n }\n\n if (base && isGlob === true && lastIndex > 0) {\n base = str.slice(0, lastIndex);\n glob = str.slice(lastIndex);\n } else if (isGlob === true) {\n base = '';\n glob = str;\n } else {\n base = str;\n }\n\n if (base && base !== '' && base !== '/' && base !== str) {\n if (isPathSeparator(base.charCodeAt(base.length - 1))) {\n base = base.slice(0, -1);\n }\n }\n\n if (opts.unescape === true) {\n if (glob) glob = utils.removeBackslashes(glob);\n\n if (base && backslashes === true) {\n base = utils.removeBackslashes(base);\n }\n }\n\n const state = {\n prefix,\n input,\n start,\n base,\n glob,\n isBrace,\n isBracket,\n isGlob,\n isExtglob,\n isGlobstar,\n negated,\n negatedExtglob\n };\n\n if (opts.tokens === true) {\n state.maxDepth = 0;\n if (!isPathSeparator(code)) {\n tokens.push(token);\n }\n state.tokens = tokens;\n }\n\n if (opts.parts === true || opts.tokens === true) {\n let prevIndex;\n\n for (let idx = 0; idx < slashes.length; idx++) {\n const n = prevIndex ? prevIndex + 1 : start;\n const i = slashes[idx];\n const value = input.slice(n, i);\n if (opts.tokens) {\n if (idx === 0 && start !== 0) {\n tokens[idx].isPrefix = true;\n tokens[idx].value = prefix;\n } else {\n tokens[idx].value = value;\n }\n depth(tokens[idx]);\n state.maxDepth += tokens[idx].depth;\n }\n if (idx !== 0 || value !== '') {\n parts.push(value);\n }\n prevIndex = i;\n }\n\n if (prevIndex && prevIndex + 1 < input.length) {\n const value = input.slice(prevIndex + 1);\n parts.push(value);\n\n if (opts.tokens) {\n tokens[tokens.length - 1].value = value;\n depth(tokens[tokens.length - 1]);\n state.maxDepth += tokens[tokens.length - 1].depth;\n }\n }\n\n state.slashes = slashes;\n state.parts = parts;\n }\n\n return state;\n};\n\nmodule.exports = scan;\n","'use strict';\n\nconst constants = require('./constants');\nconst utils = require('./utils');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n POSIX_REGEX_SOURCE,\n REGEX_NON_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_BACKREF,\n REPLACEMENTS\n} = constants;\n\n/**\n * Helpers\n */\n\nconst expandRange = (args, options) => {\n if (typeof options.expandRange === 'function') {\n return options.expandRange(...args, options);\n }\n\n args.sort();\n const value = `[${args.join('-')}]`;\n\n try {\n /* eslint-disable-next-line no-new */\n new RegExp(value);\n } catch (ex) {\n return args.map(v => utils.escapeRegex(v)).join('..');\n }\n\n return value;\n};\n\n/**\n * Create the message for a syntax error\n */\n\nconst syntaxError = (type, char) => {\n return `Missing ${type}: \"${char}\" - use \"\\\\\\\\${char}\" to match literal characters`;\n};\n\n/**\n * Parse the given input string.\n * @param {String} input\n * @param {Object} options\n * @return {Object}\n */\n\nconst parse = (input, options) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n input = REPLACEMENTS[input] || input;\n\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n\n let len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n const bos = { type: 'bos', value: '', output: opts.prepend || '' };\n const tokens = [bos];\n\n const capture = opts.capture ? '' : '?:';\n\n // create constants based on platform, for windows or posix\n const PLATFORM_CHARS = constants.globChars(opts.windows);\n const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);\n\n const {\n DOT_LITERAL,\n PLUS_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n } = PLATFORM_CHARS;\n\n const globstar = opts => {\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const nodot = opts.dot ? '' : NO_DOT;\n const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;\n let star = opts.bash === true ? globstar(opts) : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n // minimatch options support\n if (typeof opts.noext === 'boolean') {\n opts.noextglob = opts.noext;\n }\n\n const state = {\n input,\n index: -1,\n start: 0,\n dot: opts.dot === true,\n consumed: '',\n output: '',\n prefix: '',\n backtrack: false,\n negated: false,\n brackets: 0,\n braces: 0,\n parens: 0,\n quotes: 0,\n globstar: false,\n tokens\n };\n\n input = utils.removePrefix(input, state);\n len = input.length;\n\n const extglobs = [];\n const braces = [];\n const stack = [];\n let prev = bos;\n let value;\n\n /**\n * Tokenizing helpers\n */\n\n const eos = () => state.index === len - 1;\n const peek = state.peek = (n = 1) => input[state.index + n];\n const advance = state.advance = () => input[++state.index] || '';\n const remaining = () => input.slice(state.index + 1);\n const consume = (value = '', num = 0) => {\n state.consumed += value;\n state.index += num;\n };\n\n const append = token => {\n state.output += token.output != null ? token.output : token.value;\n consume(token.value);\n };\n\n const negate = () => {\n let count = 1;\n\n while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {\n advance();\n state.start++;\n count++;\n }\n\n if (count % 2 === 0) {\n return false;\n }\n\n state.negated = true;\n state.start++;\n return true;\n };\n\n const increment = type => {\n state[type]++;\n stack.push(type);\n };\n\n const decrement = type => {\n state[type]--;\n stack.pop();\n };\n\n /**\n * Push tokens onto the tokens array. This helper speeds up\n * tokenizing by 1) helping us avoid backtracking as much as possible,\n * and 2) helping us avoid creating extra tokens when consecutive\n * characters are plain text. This improves performance and simplifies\n * lookbehinds.\n */\n\n const push = tok => {\n if (prev.type === 'globstar') {\n const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');\n const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));\n\n if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {\n state.output = state.output.slice(0, -prev.output.length);\n prev.type = 'star';\n prev.value = '*';\n prev.output = star;\n state.output += prev.output;\n }\n }\n\n if (extglobs.length && tok.type !== 'paren') {\n extglobs[extglobs.length - 1].inner += tok.value;\n }\n\n if (tok.value || tok.output) append(tok);\n if (prev && prev.type === 'text' && tok.type === 'text') {\n prev.output = (prev.output || prev.value) + tok.value;\n prev.value += tok.value;\n return;\n }\n\n tok.prev = prev;\n tokens.push(tok);\n prev = tok;\n };\n\n const extglobOpen = (type, value) => {\n const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };\n\n token.prev = prev;\n token.parens = state.parens;\n token.output = state.output;\n const output = (opts.capture ? '(' : '') + token.open;\n\n increment('parens');\n push({ type, value, output: state.output ? '' : ONE_CHAR });\n push({ type: 'paren', extglob: true, value: advance(), output });\n extglobs.push(token);\n };\n\n const extglobClose = token => {\n let output = token.close + (opts.capture ? ')' : '');\n let rest;\n\n if (token.type === 'negate') {\n let extglobStar = star;\n\n if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {\n extglobStar = globstar(opts);\n }\n\n if (extglobStar !== star || eos() || /^\\)+$/.test(remaining())) {\n output = token.close = `)$))${extglobStar}`;\n }\n\n if (token.inner.includes('*') && (rest = remaining()) && /^\\.[^\\\\/.]+$/.test(rest)) {\n // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.\n // In this case, we need to parse the string and use it in the output of the original pattern.\n // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.\n //\n // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.\n const expression = parse(rest, { ...options, fastpaths: false }).output;\n\n output = token.close = `)${expression})${extglobStar})`;\n }\n\n if (token.prev.type === 'bos') {\n state.negatedExtglob = true;\n }\n }\n\n push({ type: 'paren', extglob: true, value, output });\n decrement('parens');\n };\n\n /**\n * Fast paths\n */\n\n if (opts.fastpaths !== false && !/(^[*!]|[/()[\\]{}\"])/.test(input)) {\n let backslashes = false;\n\n let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {\n if (first === '\\\\') {\n backslashes = true;\n return m;\n }\n\n if (first === '?') {\n if (esc) {\n return esc + first + (rest ? QMARK.repeat(rest.length) : '');\n }\n if (index === 0) {\n return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');\n }\n return QMARK.repeat(chars.length);\n }\n\n if (first === '.') {\n return DOT_LITERAL.repeat(chars.length);\n }\n\n if (first === '*') {\n if (esc) {\n return esc + first + (rest ? star : '');\n }\n return star;\n }\n return esc ? m : `\\\\${m}`;\n });\n\n if (backslashes === true) {\n if (opts.unescape === true) {\n output = output.replace(/\\\\/g, '');\n } else {\n output = output.replace(/\\\\+/g, m => {\n return m.length % 2 === 0 ? '\\\\\\\\' : (m ? '\\\\' : '');\n });\n }\n }\n\n if (output === input && opts.contains === true) {\n state.output = input;\n return state;\n }\n\n state.output = utils.wrapOutput(output, state, options);\n return state;\n }\n\n /**\n * Tokenize input until we reach end-of-string\n */\n\n while (!eos()) {\n value = advance();\n\n if (value === '\\u0000') {\n continue;\n }\n\n /**\n * Escaped characters\n */\n\n if (value === '\\\\') {\n const next = peek();\n\n if (next === '/' && opts.bash !== true) {\n continue;\n }\n\n if (next === '.' || next === ';') {\n continue;\n }\n\n if (!next) {\n value += '\\\\';\n push({ type: 'text', value });\n continue;\n }\n\n // collapse slashes to reduce potential for exploits\n const match = /^\\\\+/.exec(remaining());\n let slashes = 0;\n\n if (match && match[0].length > 2) {\n slashes = match[0].length;\n state.index += slashes;\n if (slashes % 2 !== 0) {\n value += '\\\\';\n }\n }\n\n if (opts.unescape === true) {\n value = advance();\n } else {\n value += advance();\n }\n\n if (state.brackets === 0) {\n push({ type: 'text', value });\n continue;\n }\n }\n\n /**\n * If we're inside a regex character class, continue\n * until we reach the closing bracket.\n */\n\n if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {\n if (opts.posix !== false && value === ':') {\n const inner = prev.value.slice(1);\n if (inner.includes('[')) {\n prev.posix = true;\n\n if (inner.includes(':')) {\n const idx = prev.value.lastIndexOf('[');\n const pre = prev.value.slice(0, idx);\n const rest = prev.value.slice(idx + 2);\n const posix = POSIX_REGEX_SOURCE[rest];\n if (posix) {\n prev.value = pre + posix;\n state.backtrack = true;\n advance();\n\n if (!bos.output && tokens.indexOf(prev) === 1) {\n bos.output = ONE_CHAR;\n }\n continue;\n }\n }\n }\n }\n\n if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {\n value = `\\\\${value}`;\n }\n\n if (value === ']' && (prev.value === '[' || prev.value === '[^')) {\n value = `\\\\${value}`;\n }\n\n if (opts.posix === true && value === '!' && prev.value === '[') {\n value = '^';\n }\n\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * If we're inside a quoted string, continue\n * until we reach the closing double quote.\n */\n\n if (state.quotes === 1 && value !== '\"') {\n value = utils.escapeRegex(value);\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * Double quotes\n */\n\n if (value === '\"') {\n state.quotes = state.quotes === 1 ? 0 : 1;\n if (opts.keepQuotes === true) {\n push({ type: 'text', value });\n }\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === '(') {\n increment('parens');\n push({ type: 'paren', value });\n continue;\n }\n\n if (value === ')') {\n if (state.parens === 0 && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '('));\n }\n\n const extglob = extglobs[extglobs.length - 1];\n if (extglob && state.parens === extglob.parens + 1) {\n extglobClose(extglobs.pop());\n continue;\n }\n\n push({ type: 'paren', value, output: state.parens ? ')' : '\\\\)' });\n decrement('parens');\n continue;\n }\n\n /**\n * Square brackets\n */\n\n if (value === '[') {\n if (opts.nobracket === true || !remaining().includes(']')) {\n if (opts.nobracket !== true && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('closing', ']'));\n }\n\n value = `\\\\${value}`;\n } else {\n increment('brackets');\n }\n\n push({ type: 'bracket', value });\n continue;\n }\n\n if (value === ']') {\n if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n if (state.brackets === 0) {\n if (opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '['));\n }\n\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n decrement('brackets');\n\n const prevValue = prev.value.slice(1);\n if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {\n value = `/${value}`;\n }\n\n prev.value += value;\n append({ value });\n\n // when literal brackets are explicitly disabled\n // assume we should match with a regex character class\n if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {\n continue;\n }\n\n const escaped = utils.escapeRegex(prev.value);\n state.output = state.output.slice(0, -prev.value.length);\n\n // when literal brackets are explicitly enabled\n // assume we should escape the brackets to match literal characters\n if (opts.literalBrackets === true) {\n state.output += escaped;\n prev.value = escaped;\n continue;\n }\n\n // when the user specifies nothing, try to match both\n prev.value = `(${capture}${escaped}|${prev.value})`;\n state.output += prev.value;\n continue;\n }\n\n /**\n * Braces\n */\n\n if (value === '{' && opts.nobrace !== true) {\n increment('braces');\n\n const open = {\n type: 'brace',\n value,\n output: '(',\n outputIndex: state.output.length,\n tokensIndex: state.tokens.length\n };\n\n braces.push(open);\n push(open);\n continue;\n }\n\n if (value === '}') {\n const brace = braces[braces.length - 1];\n\n if (opts.nobrace === true || !brace) {\n push({ type: 'text', value, output: value });\n continue;\n }\n\n let output = ')';\n\n if (brace.dots === true) {\n const arr = tokens.slice();\n const range = [];\n\n for (let i = arr.length - 1; i >= 0; i--) {\n tokens.pop();\n if (arr[i].type === 'brace') {\n break;\n }\n if (arr[i].type !== 'dots') {\n range.unshift(arr[i].value);\n }\n }\n\n output = expandRange(range, opts);\n state.backtrack = true;\n }\n\n if (brace.comma !== true && brace.dots !== true) {\n const out = state.output.slice(0, brace.outputIndex);\n const toks = state.tokens.slice(brace.tokensIndex);\n brace.value = brace.output = '\\\\{';\n value = output = '\\\\}';\n state.output = out;\n for (const t of toks) {\n state.output += (t.output || t.value);\n }\n }\n\n push({ type: 'brace', value, output });\n decrement('braces');\n braces.pop();\n continue;\n }\n\n /**\n * Pipes\n */\n\n if (value === '|') {\n if (extglobs.length > 0) {\n extglobs[extglobs.length - 1].conditions++;\n }\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Commas\n */\n\n if (value === ',') {\n let output = value;\n\n const brace = braces[braces.length - 1];\n if (brace && stack[stack.length - 1] === 'braces') {\n brace.comma = true;\n output = '|';\n }\n\n push({ type: 'comma', value, output });\n continue;\n }\n\n /**\n * Slashes\n */\n\n if (value === '/') {\n // if the beginning of the glob is \"./\", advance the start\n // to the current index, and don't add the \"./\" characters\n // to the state. This greatly simplifies lookbehinds when\n // checking for BOS characters like \"!\" and \".\" (not \"./\")\n if (prev.type === 'dot' && state.index === state.start + 1) {\n state.start = state.index + 1;\n state.consumed = '';\n state.output = '';\n tokens.pop();\n prev = bos; // reset \"prev\" to the first token\n continue;\n }\n\n push({ type: 'slash', value, output: SLASH_LITERAL });\n continue;\n }\n\n /**\n * Dots\n */\n\n if (value === '.') {\n if (state.braces > 0 && prev.type === 'dot') {\n if (prev.value === '.') prev.output = DOT_LITERAL;\n const brace = braces[braces.length - 1];\n prev.type = 'dots';\n prev.output += value;\n prev.value += value;\n brace.dots = true;\n continue;\n }\n\n if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {\n push({ type: 'text', value, output: DOT_LITERAL });\n continue;\n }\n\n push({ type: 'dot', value, output: DOT_LITERAL });\n continue;\n }\n\n /**\n * Question marks\n */\n\n if (value === '?') {\n const isGroup = prev && prev.value === '(';\n if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('qmark', value);\n continue;\n }\n\n if (prev && prev.type === 'paren') {\n const next = peek();\n let output = value;\n\n if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\\w+>)/.test(remaining()))) {\n output = `\\\\${value}`;\n }\n\n push({ type: 'text', value, output });\n continue;\n }\n\n if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {\n push({ type: 'qmark', value, output: QMARK_NO_DOT });\n continue;\n }\n\n push({ type: 'qmark', value, output: QMARK });\n continue;\n }\n\n /**\n * Exclamation\n */\n\n if (value === '!') {\n if (opts.noextglob !== true && peek() === '(') {\n if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {\n extglobOpen('negate', value);\n continue;\n }\n }\n\n if (opts.nonegate !== true && state.index === 0) {\n negate();\n continue;\n }\n }\n\n /**\n * Plus\n */\n\n if (value === '+') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('plus', value);\n continue;\n }\n\n if ((prev && prev.value === '(') || opts.regex === false) {\n push({ type: 'plus', value, output: PLUS_LITERAL });\n continue;\n }\n\n if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {\n push({ type: 'plus', value });\n continue;\n }\n\n push({ type: 'plus', value: PLUS_LITERAL });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value === '@') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n push({ type: 'at', extglob: true, value, output: '' });\n continue;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value !== '*') {\n if (value === '$' || value === '^') {\n value = `\\\\${value}`;\n }\n\n const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());\n if (match) {\n value += match[0];\n state.index += match[0].length;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Stars\n */\n\n if (prev && (prev.type === 'globstar' || prev.star === true)) {\n prev.type = 'star';\n prev.star = true;\n prev.value += value;\n prev.output = star;\n state.backtrack = true;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n let rest = remaining();\n if (opts.noextglob !== true && /^\\([^?]/.test(rest)) {\n extglobOpen('star', value);\n continue;\n }\n\n if (prev.type === 'star') {\n if (opts.noglobstar === true) {\n consume(value);\n continue;\n }\n\n const prior = prev.prev;\n const before = prior.prev;\n const isStart = prior.type === 'slash' || prior.type === 'bos';\n const afterStar = before && (before.type === 'star' || before.type === 'globstar');\n\n if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');\n const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');\n if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n // strip consecutive `/**/`\n while (rest.slice(0, 3) === '/**') {\n const after = input[state.index + 4];\n if (after && after !== '/') {\n break;\n }\n rest = rest.slice(3);\n consume('/**', 3);\n }\n\n if (prior.type === 'bos' && eos()) {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = globstar(opts);\n state.output = prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');\n prev.value += value;\n state.globstar = true;\n state.output += prior.output + prev.output;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {\n const end = rest[1] !== void 0 ? '|$' : '';\n\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;\n prev.value += value;\n\n state.output += prior.output + prev.output;\n state.globstar = true;\n\n consume(value + advance());\n\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n if (prior.type === 'bos' && rest[0] === '/') {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;\n state.output = prev.output;\n state.globstar = true;\n consume(value + advance());\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n // remove single star from output\n state.output = state.output.slice(0, -prev.output.length);\n\n // reset previous token to globstar\n prev.type = 'globstar';\n prev.output = globstar(opts);\n prev.value += value;\n\n // reset output with globstar\n state.output += prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n const token = { type: 'star', value, output: star };\n\n if (opts.bash === true) {\n token.output = '.*?';\n if (prev.type === 'bos' || prev.type === 'slash') {\n token.output = nodot + token.output;\n }\n push(token);\n continue;\n }\n\n if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {\n token.output = value;\n push(token);\n continue;\n }\n\n if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {\n if (prev.type === 'dot') {\n state.output += NO_DOT_SLASH;\n prev.output += NO_DOT_SLASH;\n\n } else if (opts.dot === true) {\n state.output += NO_DOTS_SLASH;\n prev.output += NO_DOTS_SLASH;\n\n } else {\n state.output += nodot;\n prev.output += nodot;\n }\n\n if (peek() !== '*') {\n state.output += ONE_CHAR;\n prev.output += ONE_CHAR;\n }\n }\n\n push(token);\n }\n\n while (state.brackets > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));\n state.output = utils.escapeLast(state.output, '[');\n decrement('brackets');\n }\n\n while (state.parens > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));\n state.output = utils.escapeLast(state.output, '(');\n decrement('parens');\n }\n\n while (state.braces > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));\n state.output = utils.escapeLast(state.output, '{');\n decrement('braces');\n }\n\n if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {\n push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });\n }\n\n // rebuild the output if we had to backtrack at any point\n if (state.backtrack === true) {\n state.output = '';\n\n for (const token of state.tokens) {\n state.output += token.output != null ? token.output : token.value;\n\n if (token.suffix) {\n state.output += token.suffix;\n }\n }\n }\n\n return state;\n};\n\n/**\n * Fast paths for creating regular expressions for common glob patterns.\n * This can significantly speed up processing and has very little downside\n * impact when none of the fast paths match.\n */\n\nparse.fastpaths = (input, options) => {\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n const len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n input = REPLACEMENTS[input] || input;\n\n // create constants based on platform, for windows or posix\n const {\n DOT_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOTS_SLASH,\n STAR,\n START_ANCHOR\n } = constants.globChars(opts.windows);\n\n const nodot = opts.dot ? NO_DOTS : NO_DOT;\n const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;\n const capture = opts.capture ? '' : '?:';\n const state = { negated: false, prefix: '' };\n let star = opts.bash === true ? '.*?' : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n const globstar = opts => {\n if (opts.noglobstar === true) return star;\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const create = str => {\n switch (str) {\n case '*':\n return `${nodot}${ONE_CHAR}${star}`;\n\n case '.*':\n return `${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*.*':\n return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*/*':\n return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;\n\n case '**':\n return nodot + globstar(opts);\n\n case '**/*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;\n\n case '**/*.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '**/.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n default: {\n const match = /^(.*?)\\.(\\w+)$/.exec(str);\n if (!match) return;\n\n const source = create(match[1]);\n if (!source) return;\n\n return source + DOT_LITERAL + match[2];\n }\n }\n };\n\n const output = utils.removePrefix(input, state);\n let source = create(output);\n\n if (source && opts.strictSlashes !== true) {\n source += `${SLASH_LITERAL}?`;\n }\n\n return source;\n};\n\nmodule.exports = parse;\n","'use strict';\n\nconst scan = require('./scan');\nconst parse = require('./parse');\nconst utils = require('./utils');\nconst constants = require('./constants');\nconst isObject = val => val && typeof val === 'object' && !Array.isArray(val);\n\n/**\n * Creates a matcher function from one or more glob patterns. The\n * returned function takes a string to match as its first argument,\n * and returns true if the string is a match. The returned matcher\n * function also takes a boolean as the second argument that, when true,\n * returns an object with additional information.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch(glob[, options]);\n *\n * const isMatch = picomatch('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @name picomatch\n * @param {String|Array} `globs` One or more glob patterns.\n * @param {Object=} `options`\n * @return {Function=} Returns a matcher function.\n * @api public\n */\n\nconst picomatch = (glob, options, returnState = false) => {\n if (Array.isArray(glob)) {\n const fns = glob.map(input => picomatch(input, options, returnState));\n const arrayMatcher = str => {\n for (const isMatch of fns) {\n const state = isMatch(str);\n if (state) return state;\n }\n return false;\n };\n return arrayMatcher;\n }\n\n const isState = isObject(glob) && glob.tokens && glob.input;\n\n if (glob === '' || (typeof glob !== 'string' && !isState)) {\n throw new TypeError('Expected pattern to be a non-empty string');\n }\n\n const opts = options || {};\n const posix = opts.windows;\n const regex = isState\n ? picomatch.compileRe(glob, options)\n : picomatch.makeRe(glob, options, false, true);\n\n const state = regex.state;\n delete regex.state;\n\n let isIgnored = () => false;\n if (opts.ignore) {\n const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };\n isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);\n }\n\n const matcher = (input, returnObject = false) => {\n const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });\n const result = { glob, state, regex, posix, input, output, match, isMatch };\n\n if (typeof opts.onResult === 'function') {\n opts.onResult(result);\n }\n\n if (isMatch === false) {\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (isIgnored(input)) {\n if (typeof opts.onIgnore === 'function') {\n opts.onIgnore(result);\n }\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (typeof opts.onMatch === 'function') {\n opts.onMatch(result);\n }\n return returnObject ? result : true;\n };\n\n if (returnState) {\n matcher.state = state;\n }\n\n return matcher;\n};\n\n/**\n * Test `input` with the given `regex`. This is used by the main\n * `picomatch()` function to test the input string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.test(input, regex[, options]);\n *\n * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\\/([^/]*?))$/));\n * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp} `regex`\n * @return {Object} Returns an object with matching info.\n * @api public\n */\n\npicomatch.test = (input, regex, options, { glob, posix } = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected input to be a string');\n }\n\n if (input === '') {\n return { isMatch: false, output: '' };\n }\n\n const opts = options || {};\n const format = opts.format || (posix ? utils.toPosixSlashes : null);\n let match = input === glob;\n let output = (match && format) ? format(input) : input;\n\n if (match === false) {\n output = format ? format(input) : input;\n match = output === glob;\n }\n\n if (match === false || opts.capture === true) {\n if (opts.matchBase === true || opts.basename === true) {\n match = picomatch.matchBase(input, regex, options, posix);\n } else {\n match = regex.exec(output);\n }\n }\n\n return { isMatch: Boolean(match), match, output };\n};\n\n/**\n * Match the basename of a filepath.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.matchBase(input, glob[, options]);\n * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).\n * @return {Boolean}\n * @api public\n */\n\npicomatch.matchBase = (input, glob, options) => {\n const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);\n return regex.test(utils.basename(input));\n};\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.isMatch(string, patterns[, options]);\n *\n * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String|Array} str The string to test.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} [options] See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\npicomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const result = picomatch.parse(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as a regex source string.\n * @api public\n */\n\npicomatch.parse = (pattern, options) => {\n if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));\n return parse(pattern, { ...options, fastpaths: false });\n};\n\n/**\n * Scan a glob pattern to separate the pattern into segments.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.scan(input[, options]);\n *\n * const result = picomatch.scan('!./foo/*.js');\n * console.log(result);\n * { prefix: '!./',\n * input: '!./foo/*.js',\n * start: 3,\n * base: 'foo',\n * glob: '*.js',\n * isBrace: false,\n * isBracket: false,\n * isGlob: true,\n * isExtglob: false,\n * isGlobstar: false,\n * negated: true }\n * ```\n * @param {String} `input` Glob pattern to scan.\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\npicomatch.scan = (input, options) => scan(input, options);\n\n/**\n * Compile a regular expression from the `state` object returned by the\n * [parse()](#parse) method.\n *\n * @param {Object} `state`\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.\n * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.\n * @return {RegExp}\n * @api public\n */\n\npicomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {\n if (returnOutput === true) {\n return state.output;\n }\n\n const opts = options || {};\n const prepend = opts.contains ? '' : '^';\n const append = opts.contains ? '' : '$';\n\n let source = `${prepend}(?:${state.output})${append}`;\n if (state && state.negated === true) {\n source = `^(?!${source}).*$`;\n }\n\n const regex = picomatch.toRegex(source, options);\n if (returnState === true) {\n regex.state = state;\n }\n\n return regex;\n};\n\n/**\n * Create a regular expression from a parsed glob pattern.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const state = picomatch.parse('*.js');\n * // picomatch.compileRe(state[, options]);\n *\n * console.log(picomatch.compileRe(state));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `state` The object returned from the `.parse` method.\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.\n * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\npicomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {\n if (!input || typeof input !== 'string') {\n throw new TypeError('Expected a non-empty string');\n }\n\n let parsed = { negated: false, fastpaths: true };\n\n if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {\n parsed.output = parse.fastpaths(input, options);\n }\n\n if (!parsed.output) {\n parsed = parse(input, options);\n }\n\n return picomatch.compileRe(parsed, options, returnOutput, returnState);\n};\n\n/**\n * Create a regular expression from the given regex source string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.toRegex(source[, options]);\n *\n * const { output } = picomatch.parse('*.js');\n * console.log(picomatch.toRegex(output));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `source` Regular expression source string.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\npicomatch.toRegex = (source, options) => {\n try {\n const opts = options || {};\n return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));\n } catch (err) {\n if (options && options.debug === true) throw err;\n return /$^/;\n }\n};\n\n/**\n * Picomatch constants.\n * @return {Object}\n */\n\npicomatch.constants = constants;\n\n/**\n * Expose \"picomatch\"\n */\n\nmodule.exports = picomatch;\n","'use strict';\n\nconst pico = require('./lib/picomatch');\nconst utils = require('./lib/utils');\n\nfunction picomatch(glob, options, returnState = false) {\n // default to os.platform()\n if (options && (options.windows === null || options.windows === undefined)) {\n // don't mutate the original options object\n options = { ...options, windows: utils.isWindows() };\n }\n\n return pico(glob, options, returnState);\n}\n\nObject.assign(picomatch, pico);\nmodule.exports = picomatch;\n","import type { TypeCategory, TypeFilterConfig, TypeFilterRule } from \"@soda-gql/config\";\nimport picomatch from \"picomatch\";\n\nexport type FilterContext = {\n readonly name: string;\n readonly category: TypeCategory;\n};\n\ntype CompiledFilter = (context: FilterContext) => boolean;\n\nconst compileRule = (rule: TypeFilterRule): CompiledFilter => {\n const matcher = picomatch(rule.pattern);\n const categories = rule.category ? (Array.isArray(rule.category) ? rule.category : [rule.category]) : null;\n\n return (context) => {\n if (categories && !categories.includes(context.category)) {\n return true; // not excluded (category doesn't match)\n }\n return !matcher(context.name); // true = include (pattern doesn't match)\n };\n};\n\nexport const compileTypeFilter = (config: TypeFilterConfig | undefined): CompiledFilter => {\n if (!config) {\n return () => true; // include all\n }\n\n if (typeof config === \"function\") {\n return config;\n }\n\n const rules = config.exclude.map(compileRule);\n return (context) => rules.every((rule) => rule(context));\n};\n\nexport const buildExclusionSet = (filter: CompiledFilter, typeNames: Map<TypeCategory, readonly string[]>): Set<string> => {\n const excluded = new Set<string>();\n\n for (const [category, names] of typeNames) {\n for (const name of names) {\n if (!filter({ name, category })) {\n excluded.add(name);\n }\n }\n }\n\n return excluded;\n};\n","import type { TypeCategory, TypeFilterConfig } from \"@soda-gql/config\";\nimport {\n createSchemaIndex,\n type DirectiveRecord,\n type EnumRecord,\n type InputRecord,\n type ObjectRecord,\n type OperationTypeNames,\n type ScalarRecord,\n type SchemaIndex,\n type UnionRecord,\n} from \"@soda-gql/core\";\nimport { type DocumentNode, type FieldDefinitionNode, type InputValueDefinitionNode, Kind, type TypeNode } from \"graphql\";\n\nimport type { CategoryVars, DefinitionVar } from \"./defs-generator\";\nimport { buildExclusionSet, compileTypeFilter } from \"./type-filter\";\n\nexport { createSchemaIndex };\nexport type {\n DirectiveRecord,\n EnumRecord,\n InputRecord,\n ObjectRecord,\n OperationTypeNames,\n ScalarRecord,\n SchemaIndex,\n UnionRecord,\n};\n\nconst builtinScalarTypes = new Map<string, { readonly input: string; readonly output: string }>([\n [\"ID\", { input: \"string\", output: \"string\" }],\n [\"String\", { input: \"string\", output: \"string\" }],\n [\"Int\", { input: \"number\", output: \"number\" }],\n [\"Float\", { input: \"number\", output: \"number\" }],\n [\"Boolean\", { input: \"boolean\", output: \"boolean\" }],\n]);\n\ntype TypeLevel = {\n readonly kind: \"list\" | \"named\";\n readonly nonNull: boolean;\n};\n\nconst collectTypeLevels = (\n type: TypeNode,\n nonNull = false,\n levels: TypeLevel[] = [],\n): { readonly name: string; readonly levels: TypeLevel[] } => {\n if (type.kind === Kind.NON_NULL_TYPE) {\n return collectTypeLevels(type.type, true, levels);\n }\n\n if (type.kind === Kind.LIST_TYPE) {\n levels.push({ kind: \"list\", nonNull });\n return collectTypeLevels(type.type, false, levels);\n }\n\n levels.push({ kind: \"named\", nonNull });\n return { name: type.name.value, levels };\n};\n\nconst buildTypeModifier = (levels: TypeLevel[]): string => {\n let modifier = \"?\";\n\n for (const level of levels.slice().reverse()) {\n if (level.kind === \"named\") {\n // Inner type: always explicit nullable marker\n modifier = level.nonNull ? \"!\" : \"?\";\n continue;\n }\n\n // List type: append []? or []! based on list's nullability\n const listSuffix = level.nonNull ? \"[]!\" : \"[]?\";\n modifier = `${modifier}${listSuffix}`;\n }\n\n return modifier;\n};\n\nconst parseTypeReference = (type: TypeNode): { readonly name: string; readonly modifier: string } => {\n const { name, levels } = collectTypeLevels(type);\n return { name, modifier: buildTypeModifier(levels) };\n};\n\nconst isScalarName = (schema: SchemaIndex, name: string): boolean => builtinScalarTypes.has(name) || schema.scalars.has(name);\nconst isEnumName = (schema: SchemaIndex, name: string): boolean => schema.enums.has(name);\nconst _isInputName = (schema: SchemaIndex, name: string): boolean => schema.inputs.has(name);\nconst isUnionName = (schema: SchemaIndex, name: string): boolean => schema.unions.has(name);\nconst isObjectName = (schema: SchemaIndex, name: string): boolean => schema.objects.has(name);\n\n/**\n * Maps type kind to deferred specifier prefix character.\n */\nconst inputKindToChar = (kind: \"scalar\" | \"enum\" | \"input\" | \"excluded\"): string => {\n switch (kind) {\n case \"scalar\":\n return \"s\";\n case \"enum\":\n return \"e\";\n case \"input\":\n return \"i\";\n case \"excluded\":\n return \"x\"; // excluded types use 'x' prefix\n }\n};\n\nconst renderInputRef = (schema: SchemaIndex, definition: InputValueDefinitionNode, excluded: Set<string>): string => {\n const { name, modifier } = parseTypeReference(definition.type);\n const defaultValue = definition.defaultValue;\n\n // Check if referenced type is excluded\n if (excluded.has(name)) {\n // Use string format for consistency with other specifiers\n const defaultSuffix = defaultValue ? \"|D\" : \"\";\n return `\"x|${name}|${modifier}${defaultSuffix}\"`;\n }\n\n let kind: \"scalar\" | \"enum\" | \"input\";\n if (isScalarName(schema, name)) {\n kind = \"scalar\";\n } else if (isEnumName(schema, name)) {\n kind = \"enum\";\n } else {\n kind = \"input\";\n }\n\n // Generate deferred string specifier format: \"{kindChar}|{name}|{modifier}[|D]\"\n const kindChar = inputKindToChar(kind);\n const defaultSuffix = defaultValue ? \"|D\" : \"\";\n return `\"${kindChar}|${name}|${modifier}${defaultSuffix}\"`;\n};\n\n/**\n * Maps output type kind to deferred specifier prefix character.\n */\nconst outputKindToChar = (kind: \"scalar\" | \"enum\" | \"union\" | \"object\" | \"excluded\"): string => {\n switch (kind) {\n case \"scalar\":\n return \"s\";\n case \"enum\":\n return \"e\";\n case \"object\":\n return \"o\";\n case \"union\":\n return \"u\";\n case \"excluded\":\n return \"x\"; // excluded types use 'x' prefix\n }\n};\n\n/**\n * Render arguments as object format for DeferredOutputFieldWithArgs.\n * Returns array of \"argName: \\\"spec\\\"\" entries.\n */\nconst renderArgumentsObjectEntries = (\n schema: SchemaIndex,\n args: readonly InputValueDefinitionNode[],\n excluded: Set<string>,\n): string[] => {\n return [...args]\n .sort((left, right) => left.name.value.localeCompare(right.name.value))\n .map((arg) => {\n const { name, modifier } = parseTypeReference(arg.type);\n // Skip excluded types - they shouldn't appear in field arguments\n if (excluded.has(name)) {\n return null;\n }\n let kind: \"scalar\" | \"enum\" | \"input\";\n if (isScalarName(schema, name)) {\n kind = \"scalar\";\n } else if (isEnumName(schema, name)) {\n kind = \"enum\";\n } else {\n kind = \"input\";\n }\n const kindChar = inputKindToChar(kind);\n const defaultSuffix = arg.defaultValue ? \"|D\" : \"\";\n return `${arg.name.value}: \"${kindChar}|${name}|${modifier}${defaultSuffix}\"`;\n })\n .filter((spec): spec is string => spec !== null);\n};\n\nconst renderArgumentMap = (\n schema: SchemaIndex,\n args: readonly InputValueDefinitionNode[] | undefined,\n excluded: Set<string>,\n): string => {\n const entries = [...(args ?? [])]\n .sort((left, right) => left.name.value.localeCompare(right.name.value))\n .map((arg) => `${arg.name.value}: ${renderInputRef(schema, arg, excluded)}`);\n\n return renderPropertyLines({ entries, indentSize: 8 });\n};\n\nconst renderOutputRef = (\n schema: SchemaIndex,\n type: TypeNode,\n args: readonly InputValueDefinitionNode[] | undefined,\n excluded: Set<string>,\n): string => {\n const { name, modifier } = parseTypeReference(type);\n\n // Check if referenced type is excluded\n if (excluded.has(name)) {\n // Use string format wrapped in DeferredOutputFieldWithArgs object\n const argumentMap = renderArgumentMap(schema, args, excluded);\n return `{ spec: \"x|${name}|${modifier}\", arguments: ${argumentMap} }`;\n }\n\n let kind: \"scalar\" | \"enum\" | \"union\" | \"object\";\n if (isScalarName(schema, name)) {\n kind = \"scalar\";\n } else if (isEnumName(schema, name)) {\n kind = \"enum\";\n } else if (isUnionName(schema, name)) {\n kind = \"union\";\n } else if (isObjectName(schema, name)) {\n kind = \"object\";\n } else {\n kind = \"scalar\"; // fallback for unknown types\n }\n\n const kindChar = outputKindToChar(kind);\n const spec = `${kindChar}|${name}|${modifier}`;\n\n // Always use object format for consistency (avoids union type distribution issues)\n if (args && args.length > 0) {\n const argEntries = renderArgumentsObjectEntries(schema, args, excluded);\n if (argEntries.length > 0) {\n return `{ spec: \"${spec}\", arguments: { ${argEntries.join(\", \")} } }`;\n }\n }\n\n // Fields without arguments still use object format with empty arguments\n return `{ spec: \"${spec}\", arguments: {} }`;\n};\n\nconst renderPropertyLines = ({ entries, indentSize }: { entries: string[]; indentSize: number }) => {\n if (entries.length === 0) {\n return \"{}\";\n }\n\n const indent = \" \".repeat(indentSize);\n const lastIndent = \" \".repeat(indentSize - 2);\n return [\"{\", `${indent}${entries.join(`,\\n${indent}`)},`, `${lastIndent}}`].join(`\\n`);\n};\n\nconst renderObjectFields = (schema: SchemaIndex, fields: Map<string, FieldDefinitionNode>, excluded: Set<string>): string => {\n const entries = Array.from(fields.values())\n .sort((left, right) => left.name.value.localeCompare(right.name.value))\n .map((field) => `${field.name.value}: ${renderOutputRef(schema, field.type, field.arguments, excluded)}`);\n\n return renderPropertyLines({ entries, indentSize: 6 });\n};\n\nconst renderInputFields = (schema: SchemaIndex, fields: Map<string, InputValueDefinitionNode>, excluded: Set<string>): string => {\n const entries = Array.from(fields.values())\n .sort((left, right) => left.name.value.localeCompare(right.name.value))\n .map((field) => `${field.name.value}: ${renderInputRef(schema, field, excluded)}`);\n\n return renderPropertyLines({ entries, indentSize: 6 });\n};\n\n// Granular render functions - each type as its own const variable\nconst renderScalarVar = (schemaName: string, record: ScalarRecord): string => {\n const typeInfo = builtinScalarTypes.get(record.name) ?? { input: \"string\", output: \"string\" };\n return `const scalar_${schemaName}_${record.name} = { name: \"${record.name}\", $type: {} as { input: ${typeInfo.input}; output: ${typeInfo.output}; inputProfile: { kind: \"scalar\"; name: \"${record.name}\"; value: ${typeInfo.input} }; outputProfile: { kind: \"scalar\"; name: \"${record.name}\"; value: ${typeInfo.output} } } } as const;`;\n};\n\nconst renderEnumVar = (schemaName: string, record: EnumRecord): string => {\n const valueNames = Array.from(record.values.values())\n .sort((left, right) => left.name.value.localeCompare(right.name.value))\n .map((value) => value.name.value);\n const valuesObj = valueNames.length === 0 ? \"{}\" : `{ ${valueNames.map((v) => `${v}: true`).join(\", \")} }`;\n const valueUnion = valueNames.length === 0 ? \"never\" : valueNames.map((v) => `\"${v}\"`).join(\" | \");\n return `const enum_${schemaName}_${record.name} = defineEnum<\"${record.name}\", ${valueUnion}>(\"${record.name}\", ${valuesObj});`;\n};\n\nconst renderInputVar = (schemaName: string, schema: SchemaIndex, record: InputRecord, excluded: Set<string>): string => {\n const fields = renderInputFields(schema, record.fields, excluded);\n return `const input_${schemaName}_${record.name} = { name: \"${record.name}\", fields: ${fields} } as const;`;\n};\n\nconst renderObjectVar = (schemaName: string, schema: SchemaIndex, record: ObjectRecord, excluded: Set<string>): string => {\n const fields = renderObjectFields(schema, record.fields, excluded);\n return `const object_${schemaName}_${record.name} = { name: \"${record.name}\", fields: ${fields} } as const;`;\n};\n\nconst renderUnionVar = (schemaName: string, record: UnionRecord, excluded: Set<string>): string => {\n const memberNames = Array.from(record.members.values())\n .filter((member) => !excluded.has(member.name.value))\n .sort((left, right) => left.name.value.localeCompare(right.name.value))\n .map((member) => member.name.value);\n const typesObj = memberNames.length === 0 ? \"{}\" : `{ ${memberNames.map((m) => `${m}: true`).join(\", \")} }`;\n return `const union_${schemaName}_${record.name} = { name: \"${record.name}\", types: ${typesObj} } as const;`;\n};\n\nconst collectObjectTypeNames = (schema: SchemaIndex): string[] =>\n Array.from(schema.objects.keys())\n .filter((name) => !name.startsWith(\"__\"))\n .sort((left, right) => left.localeCompare(right));\n\n// Fragment callback builders removed in Phase 3 — fragments use tagged templates exclusively.\n\nconst collectInputTypeNames = (schema: SchemaIndex): string[] =>\n Array.from(schema.inputs.keys())\n .filter((name) => !name.startsWith(\"__\"))\n .sort((left, right) => left.localeCompare(right));\n\nconst collectEnumTypeNames = (schema: SchemaIndex): string[] =>\n Array.from(schema.enums.keys())\n .filter((name) => !name.startsWith(\"__\"))\n .sort((left, right) => left.localeCompare(right));\n\nconst collectUnionTypeNames = (schema: SchemaIndex): string[] =>\n Array.from(schema.unions.keys())\n .filter((name) => !name.startsWith(\"__\"))\n .sort((left, right) => left.localeCompare(right));\n\nconst collectScalarNames = (schema: SchemaIndex): string[] =>\n Array.from(schema.scalars.keys())\n .filter((name) => !name.startsWith(\"__\"))\n .sort((left, right) => left.localeCompare(right));\n\nconst collectDirectiveNames = (schema: SchemaIndex): string[] =>\n Array.from(schema.directives.keys()).sort((left, right) => left.localeCompare(right));\n\nconst renderInputTypeMethod = (factoryVar: string, kind: \"scalar\" | \"enum\" | \"input\", typeName: string): string =>\n `${typeName}: ${factoryVar}(\"${kind}\", \"${typeName}\")`;\n\nconst renderInputTypeMethods = (schema: SchemaIndex, factoryVar: string, excluded: Set<string>): string => {\n const scalarMethods = Array.from(builtinScalarTypes.keys())\n .concat(collectScalarNames(schema).filter((name) => !builtinScalarTypes.has(name)))\n .filter((name) => !excluded.has(name))\n .map((name) => renderInputTypeMethod(factoryVar, \"scalar\", name));\n\n const enumMethods = collectEnumTypeNames(schema)\n .filter((name) => !excluded.has(name))\n .map((name) => renderInputTypeMethod(factoryVar, \"enum\", name));\n\n const inputMethods = collectInputTypeNames(schema)\n .filter((name) => !excluded.has(name))\n .map((name) => renderInputTypeMethod(factoryVar, \"input\", name));\n\n const allMethods = [...scalarMethods, ...enumMethods, ...inputMethods].sort((left, right) => {\n const leftName = left.split(\":\")[0] ?? \"\";\n const rightName = right.split(\":\")[0] ?? \"\";\n return leftName.localeCompare(rightName);\n });\n\n return renderPropertyLines({ entries: allMethods, indentSize: 2 });\n};\n\n/**\n * Renders an input reference as a deferred string for directive arguments.\n * Format: \"{kindChar}|{name}|{modifier}\"\n */\nconst renderDeferredDirectiveArgRef = (\n schema: SchemaIndex,\n definition: InputValueDefinitionNode,\n excluded: Set<string>,\n): string | null => {\n const { name, modifier } = parseTypeReference(definition.type);\n\n // Skip excluded types\n if (excluded.has(name)) {\n return null;\n }\n\n let kind: \"scalar\" | \"enum\" | \"input\";\n if (isScalarName(schema, name)) {\n kind = \"scalar\";\n } else if (isEnumName(schema, name)) {\n kind = \"enum\";\n } else {\n kind = \"input\";\n }\n\n const kindChar = inputKindToChar(kind);\n return `\"${kindChar}|${name}|${modifier}\"`;\n};\n\n/**\n * Renders argument specifiers for a directive.\n * Returns null if the directive has no arguments.\n * Uses deferred string format for consistency with other type specifiers.\n */\nconst renderDirectiveArgsSpec = (\n schema: SchemaIndex,\n args: Map<string, InputValueDefinitionNode>,\n excluded: Set<string>,\n): string | null => {\n if (args.size === 0) return null;\n\n const entries = Array.from(args.values())\n .sort((left, right) => left.name.value.localeCompare(right.name.value))\n .map((arg) => {\n const ref = renderDeferredDirectiveArgRef(schema, arg, excluded);\n return ref ? `${arg.name.value}: ${ref}` : null;\n })\n .filter((entry): entry is string => entry !== null);\n\n if (entries.length === 0) return null;\n\n return renderPropertyLines({ entries, indentSize: 4 });\n};\n\nconst renderDirectiveMethod = (schema: SchemaIndex, record: DirectiveRecord, excluded: Set<string>): string => {\n const locationsJson = JSON.stringify(record.locations);\n const argsSpec = renderDirectiveArgsSpec(schema, record.args, excluded);\n\n if (argsSpec === null) {\n // No arguments - use simple createDirectiveMethod\n return `${record.name}: createDirectiveMethod(\"${record.name}\", ${locationsJson} as const)`;\n }\n\n // With arguments - use createTypedDirectiveMethod\n return `${record.name}: createTypedDirectiveMethod(\"${record.name}\", ${locationsJson} as const, ${argsSpec})`;\n};\n\nconst renderDirectiveMethods = (schema: SchemaIndex, excluded: Set<string>): string => {\n const directiveNames = collectDirectiveNames(schema);\n if (directiveNames.length === 0) {\n return \"{}\";\n }\n\n const methods = directiveNames\n .map((name) => {\n const record = schema.directives.get(name);\n return record ? renderDirectiveMethod(schema, record, excluded) : null;\n })\n .filter((method): method is string => method !== null);\n\n return renderPropertyLines({ entries: methods, indentSize: 2 });\n};\n\nexport type DefsFile = {\n readonly relativePath: string;\n readonly content: string;\n};\n\nexport type GeneratedModule = {\n readonly code: string;\n readonly injectsCode?: string;\n readonly defsFiles?: readonly DefsFile[];\n readonly categoryVars?: Record<string, CategoryVars>;\n readonly stats: {\n readonly objects: number;\n readonly enums: number;\n readonly inputs: number;\n readonly unions: number;\n };\n};\n\ntype PerSchemaInjection = {\n readonly scalarImportPath: string;\n readonly adapterImportPath?: string;\n};\n\ntype RuntimeTemplateInjection =\n | { readonly mode: \"inline\" }\n | {\n readonly mode: \"inject\";\n readonly perSchema: Map<string, PerSchemaInjection>;\n readonly injectsModulePath: string;\n };\n\nexport type RuntimeGenerationOptions = {\n readonly injection?: Map<string, PerSchemaInjection>;\n readonly defaultInputDepth?: Map<string, number>;\n readonly inputDepthOverrides?: Map<string, Readonly<Record<string, number>>>;\n readonly chunkSize?: number;\n readonly typeFilters?: Map<string, TypeFilterConfig>;\n};\n\ntype SplittingMode = {\n readonly importPaths: {\n readonly enums: string;\n readonly inputs: string;\n readonly objects: string;\n readonly unions: string;\n };\n};\n\ntype MultiRuntimeTemplateOptions = {\n readonly schemas: Record<\n string,\n {\n readonly queryType: string;\n readonly mutationType: string;\n readonly subscriptionType: string;\n // Granular: individual variable declarations\n readonly scalarVars: string[];\n readonly enumVars: string[];\n readonly inputVars: string[];\n readonly objectVars: string[];\n readonly unionVars: string[];\n // Granular: type name lists for assembly\n readonly scalarNames: string[];\n readonly enumNames: string[];\n readonly inputNames: string[];\n readonly objectNames: string[];\n readonly unionNames: string[];\n readonly inputTypeMethodsBlock: string;\n readonly directiveMethodsBlock: string;\n\n readonly defaultInputDepth?: number;\n readonly inputDepthOverrides?: Readonly<Record<string, number>>;\n }\n >;\n readonly injection: RuntimeTemplateInjection;\n readonly splitting: SplittingMode;\n};\n\n/**\n * Generates the _internal-injects.ts module code.\n * This file contains only adapter imports (scalar, adapter) to keep it lightweight.\n * The heavy schema types remain in _internal.ts.\n */\nconst generateInjectsCode = (injection: Map<string, PerSchemaInjection>): string => {\n const imports: string[] = [];\n const exports: string[] = [];\n const typeExports: string[] = [];\n\n // Group imports by file path\n const importsByPath = new Map<string, string[]>();\n\n for (const [schemaName, config] of injection) {\n const scalarAlias = `scalar_${schemaName}`;\n\n // Group scalar import\n const scalarSpecifiers = importsByPath.get(config.scalarImportPath) ?? [];\n if (!importsByPath.has(config.scalarImportPath)) {\n importsByPath.set(config.scalarImportPath, scalarSpecifiers);\n }\n scalarSpecifiers.push(`scalar as ${scalarAlias}`);\n\n exports.push(`export { ${scalarAlias} };`);\n typeExports.push(`export type Scalar_${schemaName} = typeof ${scalarAlias};`);\n\n // Group adapter import (optional)\n if (config.adapterImportPath) {\n const adapterAlias = `adapter_${schemaName}`;\n const adapterSpecifiers = importsByPath.get(config.adapterImportPath) ?? [];\n if (!importsByPath.has(config.adapterImportPath)) {\n importsByPath.set(config.adapterImportPath, adapterSpecifiers);\n }\n adapterSpecifiers.push(`adapter as ${adapterAlias}`);\n\n exports.push(`export { ${adapterAlias} };`);\n typeExports.push(`export type Adapter_${schemaName} = typeof ${adapterAlias} & { _?: never };`);\n }\n }\n\n // Generate grouped imports\n for (const [path, specifiers] of importsByPath) {\n if (specifiers.length === 1) {\n imports.push(`import { ${specifiers[0]} } from \"${path}\";`);\n } else {\n imports.push(`import {\\n ${specifiers.join(\",\\n \")},\\n} from \"${path}\";`);\n }\n }\n\n return `\\\n/**\n * Adapter injections for schema.\n * Separated to allow lightweight imports for prebuilt module.\n * @generated by @soda-gql/tools/codegen\n */\n\n${imports.join(\"\\n\")}\n\n// Value exports\n${exports.join(\"\\n\")}\n\n// Type exports\n${typeExports.join(\"\\n\")}\n`;\n};\n\nconst multiRuntimeTemplate = ($$: MultiRuntimeTemplateOptions) => {\n // Build imports based on injection mode\n const imports: string[] = [];\n const scalarAliases = new Map<string, string>();\n const adapterAliases = new Map<string, string>();\n\n if ($$.injection.mode === \"inject\") {\n // Import from _internal-injects.ts instead of individual files\n const injectsImports: string[] = [];\n\n for (const [schemaName, injection] of $$.injection.perSchema) {\n const scalarAlias = `scalar_${schemaName}`;\n scalarAliases.set(schemaName, scalarAlias);\n injectsImports.push(scalarAlias);\n\n if (injection.adapterImportPath) {\n const adapterAlias = `adapter_${schemaName}`;\n adapterAliases.set(schemaName, adapterAlias);\n injectsImports.push(adapterAlias);\n }\n }\n\n imports.push(`import { ${injectsImports.join(\", \")} } from \"${$$.injection.injectsModulePath}\";`);\n }\n\n // Build imports for split mode (always enabled)\n {\n const { importPaths } = $$.splitting;\n for (const [name, config] of Object.entries($$.schemas)) {\n // Import enums (if any)\n if (config.enumNames.length > 0) {\n const enumImports = config.enumNames.map((n) => `enum_${name}_${n}`).join(\", \");\n imports.push(`import { ${enumImports} } from \"${importPaths.enums}\";`);\n }\n // Import inputs (if any)\n if (config.inputNames.length > 0) {\n const inputImports = config.inputNames.map((n) => `input_${name}_${n}`).join(\", \");\n imports.push(`import { ${inputImports} } from \"${importPaths.inputs}\";`);\n }\n // Import objects (if any)\n if (config.objectNames.length > 0) {\n const objectImports = config.objectNames.map((n) => `object_${name}_${n}`).join(\", \");\n imports.push(`import { ${objectImports} } from \"${importPaths.objects}\";`);\n }\n // Import unions (if any)\n if (config.unionNames.length > 0) {\n const unionImports = config.unionNames.map((n) => `union_${name}_${n}`).join(\", \");\n imports.push(`import { ${unionImports} } from \"${importPaths.unions}\";`);\n }\n }\n }\n\n const extraImports = imports.length > 0 ? `${imports.join(\"\\n\")}\\n` : \"\";\n\n // Generate per-schema definitions (granular pattern)\n const schemaBlocks: string[] = [];\n const gqlExports: string[] = [];\n\n for (const [name, config] of Object.entries($$.schemas)) {\n const schemaVar = `${name}Schema`;\n\n // Get optional adapter\n const adapterVar = adapterAliases.get(name);\n\n // Build type exports\n const typeExports = [`export type Schema_${name} = typeof ${schemaVar} & { _?: never };`];\n if (adapterVar) {\n typeExports.push(`export type Adapter_${name} = typeof ${adapterVar} & { _?: never };`);\n }\n\n const inputTypeMethodsVar = `inputTypeMethods_${name}`;\n const factoryVar = `createMethod_${name}`;\n const customDirectivesVar = `customDirectives_${name}`;\n\n // Generate __defaultInputDepth block if non-default value\n const defaultDepthBlock =\n config.defaultInputDepth !== undefined && config.defaultInputDepth !== 3\n ? `\\n __defaultInputDepth: ${config.defaultInputDepth},`\n : \"\";\n\n // Generate __inputDepthOverrides block if there are overrides\n const depthOverridesBlock =\n config.inputDepthOverrides && Object.keys(config.inputDepthOverrides).length > 0\n ? `\\n __inputDepthOverrides: ${JSON.stringify(config.inputDepthOverrides)},`\n : \"\";\n\n // Always in split mode\n const isSplitMode = true;\n\n // Granular: generate individual variable declarations (skip in split mode - they're imported)\n // Note: Scalars are never split - they're either injected or inlined\n const scalarVarsBlock = config.scalarVars.join(\"\\n\");\n const enumVarsBlock = isSplitMode\n ? \"// (enums imported)\"\n : config.enumVars.length > 0\n ? config.enumVars.join(\"\\n\")\n : \"// (no enums)\";\n const inputVarsBlock = isSplitMode\n ? \"// (inputs imported)\"\n : config.inputVars.length > 0\n ? config.inputVars.join(\"\\n\")\n : \"// (no inputs)\";\n const objectVarsBlock = isSplitMode\n ? \"// (objects imported)\"\n : config.objectVars.length > 0\n ? config.objectVars.join(\"\\n\")\n : \"// (no objects)\";\n const unionVarsBlock = isSplitMode\n ? \"// (unions imported)\"\n : config.unionVars.length > 0\n ? config.unionVars.join(\"\\n\")\n : \"// (no unions)\";\n\n // Granular: generate assembly references\n // For injection mode, use imported scalar object; otherwise assemble from individual vars\n const scalarAssembly =\n $$.injection.mode === \"inject\"\n ? (scalarAliases.get(name) ?? \"{}\")\n : config.scalarNames.length > 0\n ? `{ ${config.scalarNames.map((n) => `${n}: scalar_${name}_${n}`).join(\", \")} }`\n : \"{}\";\n const enumAssembly =\n config.enumNames.length > 0 ? `{ ${config.enumNames.map((n) => `${n}: enum_${name}_${n}`).join(\", \")} }` : \"{}\";\n const inputAssembly =\n config.inputNames.length > 0 ? `{ ${config.inputNames.map((n) => `${n}: input_${name}_${n}`).join(\", \")} }` : \"{}\";\n const objectAssembly =\n config.objectNames.length > 0 ? `{ ${config.objectNames.map((n) => `${n}: object_${name}_${n}`).join(\", \")} }` : \"{}\";\n const unionAssembly =\n config.unionNames.length > 0 ? `{ ${config.unionNames.map((n) => `${n}: union_${name}_${n}`).join(\", \")} }` : \"{}\";\n\n // Granular: skip individual scalar vars when using injection (scalars come from import)\n // Note: Even in split mode, scalars are inlined unless injection is used\n const scalarVarsSection = $$.injection.mode === \"inject\" ? \"// (scalars imported)\" : scalarVarsBlock;\n\n // When injecting scalars, use the imported alias directly; otherwise use the assembled category object\n const scalarAssemblyLine =\n $$.injection.mode === \"inject\"\n ? `// scalar_${name} is imported directly`\n : `const scalar_${name} = ${scalarAssembly} as const;`;\n const scalarRef = $$.injection.mode === \"inject\" ? (scalarAliases.get(name) ?? `scalar_${name}`) : `scalar_${name}`;\n\n schemaBlocks.push(`\n// Individual scalar definitions\n${scalarVarsSection}\n\n// Individual enum definitions\n${enumVarsBlock}\n\n// Individual input definitions\n${inputVarsBlock}\n\n// Individual object definitions\n${objectVarsBlock}\n\n// Individual union definitions\n${unionVarsBlock}\n\n// Category assembly\n${scalarAssemblyLine}\nconst enum_${name} = ${enumAssembly} as const;\nconst input_${name} = ${inputAssembly} as const;\nconst object_${name} = ${objectAssembly} as const;\nconst union_${name} = ${unionAssembly} as const;\n\n// Schema assembly\nconst ${schemaVar} = {\n label: \"${name}\" as const,\n operations: { query: \"${config.queryType}\", mutation: \"${config.mutationType}\", subscription: \"${config.subscriptionType}\" } as const,\n scalar: ${scalarRef},\n enum: enum_${name},\n input: input_${name},\n object: object_${name},\n union: union_${name},${defaultDepthBlock}${depthOverridesBlock}\n} as const satisfies AnyGraphqlSchema;\n\nconst ${factoryVar} = createVarMethodFactory<typeof ${schemaVar}>();\nconst ${inputTypeMethodsVar} = ${config.inputTypeMethodsBlock};\nconst ${customDirectivesVar} = { ...createStandardDirectives(), ...${config.directiveMethodsBlock} };\n\n${typeExports.join(\"\\n\")}`);\n\n // Build gql composer as a named variable for Context type extraction\n const gqlVarName = `gql_${name}`;\n if (adapterVar) {\n const typeParams = `<Schema_${name}, typeof ${customDirectivesVar}, Adapter_${name}>`;\n schemaBlocks.push(\n `const ${gqlVarName} = createGqlElementComposer${typeParams}(${schemaVar}, { adapter: ${adapterVar}, inputTypeMethods: ${inputTypeMethodsVar}, directiveMethods: ${customDirectivesVar} });`,\n );\n } else {\n const typeParams = `<Schema_${name}, typeof ${customDirectivesVar}>`;\n schemaBlocks.push(\n `const ${gqlVarName} = createGqlElementComposer${typeParams}(${schemaVar}, { inputTypeMethods: ${inputTypeMethodsVar}, directiveMethods: ${customDirectivesVar} });`,\n );\n }\n\n // Export Context type extracted from the gql composer\n schemaBlocks.push(\n `export type Context_${name} = Parameters<typeof ${gqlVarName}>[0] extends (ctx: infer C) => unknown ? C : never;`,\n );\n\n // Prebuilt module exports (for typegen)\n const prebuiltExports: string[] = [\n `export { ${schemaVar} as __schema_${name} }`,\n `export { ${inputTypeMethodsVar} as __inputTypeMethods_${name} }`,\n `export { ${customDirectivesVar} as __directiveMethods_${name} }`,\n ];\n if (adapterVar) {\n prebuiltExports.push(`export { ${adapterVar} as __adapter_${name} }`);\n }\n schemaBlocks.push(`${prebuiltExports.join(\";\\n\")};`);\n\n gqlExports.push(`export { ${gqlVarName} as __gql_${name} }`);\n }\n\n // In split mode (always on), we don't need defineEnum in _internal.ts since enums are defined in _defs/enums.ts\n const needsDefineEnum = false;\n\n return `\\\nimport {${needsDefineEnum ? \"\\n defineEnum,\" : \"\"}\n type AnyGraphqlSchema,\n createDirectiveMethod,\n createTypedDirectiveMethod,\n createGqlElementComposer,\n createStandardDirectives,\n createVarMethodFactory,\n} from \"@soda-gql/core\";\n${extraImports}\n${schemaBlocks.join(\"\\n\")}\n\n${gqlExports.join(\";\\n\")};\n`;\n};\n\nexport const generateMultiSchemaModule = (\n schemas: Map<string, DocumentNode>,\n options?: RuntimeGenerationOptions,\n): GeneratedModule => {\n // biome-ignore lint/suspicious/noExplicitAny: complex schema config type\n const schemaConfigs: Record<string, any> = {};\n const allStats = {\n objects: 0,\n enums: 0,\n inputs: 0,\n unions: 0,\n };\n\n for (const [name, document] of schemas.entries()) {\n const schema = createSchemaIndex(document);\n\n // Build type filter for this schema\n const typeFilterConfig = options?.typeFilters?.get(name);\n const typeFilter = compileTypeFilter(typeFilterConfig);\n\n // Collect all type names for exclusion set building\n const allTypeNames = new Map<TypeCategory, readonly string[]>([\n [\"object\", Array.from(schema.objects.keys()).filter((n) => !n.startsWith(\"__\"))],\n [\"input\", Array.from(schema.inputs.keys()).filter((n) => !n.startsWith(\"__\"))],\n [\"enum\", Array.from(schema.enums.keys()).filter((n) => !n.startsWith(\"__\"))],\n [\"union\", Array.from(schema.unions.keys()).filter((n) => !n.startsWith(\"__\"))],\n [\"scalar\", Array.from(schema.scalars.keys()).filter((n) => !n.startsWith(\"__\"))],\n ]);\n\n // Build exclusion set\n const excluded = buildExclusionSet(typeFilter, allTypeNames);\n\n // Collect type names (filtered)\n const objectTypeNames = collectObjectTypeNames(schema).filter((n) => !excluded.has(n));\n const enumTypeNames = collectEnumTypeNames(schema).filter((n) => !excluded.has(n));\n const inputTypeNames = collectInputTypeNames(schema).filter((n) => !excluded.has(n));\n const unionTypeNames = collectUnionTypeNames(schema).filter((n) => !excluded.has(n));\n const customScalarNames = collectScalarNames(schema).filter((n) => !builtinScalarTypes.has(n) && !excluded.has(n));\n\n // Generate individual variable declarations (granular pattern)\n const scalarVars: string[] = [];\n const enumVars: string[] = [];\n const inputVars: string[] = [];\n const objectVars: string[] = [];\n const unionVars: string[] = [];\n\n // Builtin scalars\n for (const scalarName of builtinScalarTypes.keys()) {\n const record = schema.scalars.get(scalarName) ?? { name: scalarName, directives: [] };\n scalarVars.push(renderScalarVar(name, record));\n }\n\n // Custom scalars\n for (const scalarName of customScalarNames) {\n const record = schema.scalars.get(scalarName);\n if (record) {\n scalarVars.push(renderScalarVar(name, record));\n }\n }\n\n // Enums\n for (const enumName of enumTypeNames) {\n const record = schema.enums.get(enumName);\n if (record) {\n enumVars.push(renderEnumVar(name, record));\n }\n }\n\n // Inputs\n for (const inputName of inputTypeNames) {\n const record = schema.inputs.get(inputName);\n if (record) {\n inputVars.push(renderInputVar(name, schema, record, excluded));\n }\n }\n\n // Objects\n for (const objectName of objectTypeNames) {\n const record = schema.objects.get(objectName);\n if (record) {\n objectVars.push(renderObjectVar(name, schema, record, excluded));\n }\n }\n\n // Unions\n for (const unionName of unionTypeNames) {\n const record = schema.unions.get(unionName);\n if (record) {\n unionVars.push(renderUnionVar(name, record, excluded));\n }\n }\n\n // Type name lists for assembly\n const allScalarNames = [...builtinScalarTypes.keys(), ...customScalarNames];\n\n const factoryVar = `createMethod_${name}`;\n const inputTypeMethodsBlock = renderInputTypeMethods(schema, factoryVar, excluded);\n const directiveMethodsBlock = renderDirectiveMethods(schema, excluded);\n // Fragment callback builders removed in Phase 3 — adapter type for fragments no longer needed\n\n const queryType = schema.operationTypes.query ?? \"Query\";\n const mutationType = schema.operationTypes.mutation ?? \"Mutation\";\n const subscriptionType = schema.operationTypes.subscription ?? \"Subscription\";\n\n schemaConfigs[name] = {\n queryType,\n mutationType,\n subscriptionType,\n // Granular: individual variable declarations\n scalarVars,\n enumVars,\n inputVars,\n objectVars,\n unionVars,\n // Granular: type name lists for assembly\n scalarNames: allScalarNames,\n enumNames: enumTypeNames,\n inputNames: inputTypeNames,\n objectNames: objectTypeNames,\n unionNames: unionTypeNames,\n inputTypeMethodsBlock,\n directiveMethodsBlock,\n defaultInputDepth: options?.defaultInputDepth?.get(name),\n inputDepthOverrides: options?.inputDepthOverrides?.get(name),\n };\n\n // Accumulate stats\n allStats.objects += objectVars.length;\n allStats.enums += enumVars.length;\n allStats.inputs += inputVars.length;\n allStats.unions += unionVars.length;\n }\n\n const injection: RuntimeTemplateInjection = options?.injection\n ? { mode: \"inject\", perSchema: options.injection, injectsModulePath: \"./_internal-injects\" }\n : { mode: \"inline\" };\n\n // Always use split mode\n const splitting: SplittingMode = {\n importPaths: {\n enums: \"./_defs/enums\",\n inputs: \"./_defs/inputs\",\n objects: \"./_defs/objects\",\n unions: \"./_defs/unions\",\n },\n };\n\n const code = multiRuntimeTemplate({\n schemas: schemaConfigs,\n injection,\n splitting,\n });\n\n // Generate injects code if in inject mode\n const injectsCode = options?.injection ? generateInjectsCode(options.injection) : undefined;\n\n // Always build categoryVars (splitting is always enabled)\n const categoryVarsResult: Record<string, CategoryVars> = Object.fromEntries(\n Object.entries(schemaConfigs).map(([schemaName, config]) => {\n const toDefVar = (code: string, prefix: string): DefinitionVar => {\n // Extract name from \"const {prefix}_{schemaName}_{name} = ...\"\n const match = code.match(new RegExp(`const (${prefix}_${schemaName}_(\\\\w+))`));\n return {\n name: match?.[1] ?? \"\",\n code,\n };\n };\n\n return [\n schemaName,\n {\n enums: (config.enumVars as string[]).map((c) => toDefVar(c, \"enum\")),\n inputs: (config.inputVars as string[]).map((c) => toDefVar(c, \"input\")),\n objects: (config.objectVars as string[]).map((c) => toDefVar(c, \"object\")),\n unions: (config.unionVars as string[]).map((c) => toDefVar(c, \"union\")),\n } satisfies CategoryVars,\n ];\n }),\n );\n\n return {\n code,\n injectsCode,\n categoryVars: categoryVarsResult,\n stats: allStats,\n };\n};\n\n/**\n * Generate a stub `types.prebuilt.ts` file with empty PrebuiltTypes registries.\n * This stub is only written when `types.prebuilt.ts` does not already exist.\n * Typegen will later overwrite it with the real type registry.\n */\nexport const generatePrebuiltStub = (schemaNames: string[]): string => {\n const typeDeclarations = schemaNames\n .map(\n (name) => `export type PrebuiltTypes_${name} = {\n readonly fragments: {};\n readonly operations: {};\n};`,\n )\n .join(\"\\n\\n\");\n\n return `\\\n/**\n * Prebuilt type registry stub.\n *\n * This file was generated by @soda-gql/tools/codegen as an empty stub.\n * Run 'soda-gql typegen' to populate with real prebuilt types.\n *\n * @module\n * @generated\n */\n\n${typeDeclarations}\n`;\n};\n\n/**\n * Generate the `index.ts` module that re-exports from `_internal`\n * and constructs the `gql` object from individual `__gql_*` exports.\n *\n * The `gql` object preserves the original inferred types from schema inference.\n * PrebuiltContext types will be integrated once the type resolution strategy\n * is redesigned to match the tagged template runtime API.\n */\nexport const generateIndexModule = (schemaNames: string[], allFieldNames?: ReadonlyMap<string, readonly string[]>): string => {\n const gqlImports = schemaNames.map((name) => `__gql_${name}`).join(\", \");\n const prebuiltImports = schemaNames.map((name) => `PrebuiltTypes_${name}`).join(\", \");\n const schemaTypeImports = schemaNames.map((name) => `Schema_${name}`).join(\", \");\n const directiveImports = schemaNames.map((name) => `__directiveMethods_${name}`).join(\", \");\n\n const perSchemaTypes = schemaNames\n .map(\n (name) => `\ntype ResolveFragmentAtBuilder_${name}<TKey extends string> =\n TKey extends keyof PrebuiltTypes_${name}[\"fragments\"]\n ? Fragment<\n PrebuiltTypes_${name}[\"fragments\"][TKey][\"typename\"],\n PrebuiltTypes_${name}[\"fragments\"][TKey][\"input\"] extends void\n ? void\n : Partial<PrebuiltTypes_${name}[\"fragments\"][TKey][\"input\"] & AnyConstAssignableInput>,\n Partial<AnyFields>,\n PrebuiltTypes_${name}[\"fragments\"][TKey][\"output\"] & object\n >\n : Fragment<\"(unknown)\", PrebuiltEntryNotFound<TKey, \"fragment\">, Partial<AnyFields>, PrebuiltEntryNotFound<TKey, \"fragment\">>;\n\ntype ResolveOperationAtBuilder_${name}<TOperationType extends OperationType, TName extends string> =\n TName extends keyof PrebuiltTypes_${name}[\"operations\"]\n ? Operation<\n TOperationType,\n TName,\n string[],\n PrebuiltTypes_${name}[\"operations\"][TName][\"input\"],\n Partial<AnyFields>,\n PrebuiltTypes_${name}[\"operations\"][TName][\"output\"] & object\n >\n : Operation<\n TOperationType,\n TName,\n string[],\n PrebuiltEntryNotFound<TName, \"operation\">,\n Partial<AnyFields>,\n PrebuiltEntryNotFound<TName, \"operation\">\n >;\n\ntype PrebuiltCurriedFragment_${name} = <TKey extends string>(\n name: TKey,\n typeName: string,\n) => (...args: unknown[]) => (...args: unknown[]) => ResolveFragmentAtBuilder_${name}<TKey>;\n\ntype PrebuiltCurriedOperation_${name}<TOperationType extends OperationType> = <TName extends string>(\n operationName: TName,\n) => (...args: unknown[]) => (...args: unknown[]) => ResolveOperationAtBuilder_${name}<TOperationType, TName>;\n\ntype FieldFactoryFn_${name} = (...args: unknown[]) => Record<string, unknown> & ((callback: (tools: GenericFieldsBuilderTools_${name}) => Record<string, unknown>) => Record<string, unknown>);\n${(() => {\n const fieldNames = allFieldNames?.get(name);\n if (fieldNames && fieldNames.length > 0) {\n const union = fieldNames.map((n) => JSON.stringify(n)).join(\" | \");\n return `type AllObjectFieldNames_${name} = ${union};\ntype GenericFieldFactory_${name} = { readonly [K in AllObjectFieldNames_${name}]: FieldFactoryFn_${name} } & Record<string, FieldFactoryFn_${name}>;`;\n }\n return `type GenericFieldFactory_${name} = Record<string, FieldFactoryFn_${name}>;`;\n})()}\ntype GenericFieldsBuilderTools_${name} = { readonly f: GenericFieldFactory_${name}; readonly $: Readonly<Record<string, never>> };\n\ntype PrebuiltCallbackOperation_${name}<TOperationType extends OperationType> = <TName extends string>(\n options: { name: TName; fields: (tools: GenericFieldsBuilderTools_${name}) => Record<string, unknown>; variables?: Record<string, unknown>; metadata?: (tools: { readonly $: Readonly<Record<string, never>>; readonly fragmentMetadata: unknown[] | undefined }) => Record<string, unknown> },\n) => ResolveOperationAtBuilder_${name}<TOperationType, TName>;\n\nexport type PrebuiltContext_${name} = {\n readonly fragment: PrebuiltCurriedFragment_${name};\n readonly query: PrebuiltCurriedOperation_${name}<\"query\"> & {\n readonly operation: PrebuiltCallbackOperation_${name}<\"query\">;\n readonly compat: (operationName: string) => (strings: TemplateStringsArray, ...values: never[]) => GqlDefine<unknown>;\n };\n readonly mutation: PrebuiltCurriedOperation_${name}<\"mutation\"> & {\n readonly operation: PrebuiltCallbackOperation_${name}<\"mutation\">;\n readonly compat: (operationName: string) => (strings: TemplateStringsArray, ...values: never[]) => GqlDefine<unknown>;\n };\n readonly subscription: PrebuiltCurriedOperation_${name}<\"subscription\"> & {\n readonly operation: PrebuiltCallbackOperation_${name}<\"subscription\">;\n readonly compat: (operationName: string) => (strings: TemplateStringsArray, ...values: never[]) => GqlDefine<unknown>;\n };\n readonly define: <TValue>(factory: () => TValue | Promise<TValue>) => GqlDefine<TValue>;\n readonly extend: (...args: unknown[]) => AnyOperation;\n readonly $var: VarBuilder<Schema_${name}>;\n readonly $dir: typeof __directiveMethods_${name};\n readonly $colocate: <T extends Record<string, unknown>>(projections: T) => T;\n};\n\ntype GqlComposer_${name} = {\n <TResult>(composeElement: (context: PrebuiltContext_${name}) => TResult): TResult;\n readonly $schema: AnyGraphqlSchema;\n};`,\n )\n .join(\"\\n\");\n\n const gqlEntries = schemaNames.map((name) => ` ${name}: __gql_${name} as unknown as GqlComposer_${name}`).join(\",\\n\");\n\n return `\\\n/**\n * Generated by @soda-gql/tools/codegen\n * @module\n * @generated\n */\n\nexport * from \"./_internal\";\nimport { ${gqlImports} } from \"./_internal\";\nimport type { ${schemaTypeImports} } from \"./_internal\";\nimport type { ${directiveImports} } from \"./_internal\";\nimport type { ${prebuiltImports} } from \"./types.prebuilt\";\nimport type { Fragment, Operation, OperationType, PrebuiltEntryNotFound, AnyConstAssignableInput, AnyFields, AnyGraphqlSchema, AnyOperation, VarBuilder, GqlDefine } from \"@soda-gql/core\";\n${perSchemaTypes}\n\nexport const gql = {\n${gqlEntries}\n};\n`;\n};\n","/**\n * Parser for .graphql operation files.\n * Extracts operations and fragments from GraphQL documents.\n * @module\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n type ArgumentNode,\n type DocumentNode,\n type FieldNode,\n type FragmentDefinitionNode,\n type FragmentSpreadNode,\n type InlineFragmentNode,\n Kind,\n type OperationDefinitionNode,\n parse,\n type SelectionNode,\n type TypeNode,\n type ValueNode,\n type VariableDefinitionNode,\n} from \"graphql\";\nimport { err, ok, type Result } from \"neverthrow\";\n\nimport type {\n GraphqlCompatError,\n ParsedArgument,\n ParsedFieldSelection,\n ParsedFragment,\n ParsedFragmentSpread,\n ParsedInlineFragment,\n ParsedOperation,\n ParsedSelection,\n ParsedValue,\n ParsedVariable,\n ParseResult,\n TypeInfo,\n} from \"./types\";\n\n/**\n * Parse a single .graphql file and extract operations and fragments.\n */\nexport const parseGraphqlFile = (filePath: string): Result<ParseResult, GraphqlCompatError> => {\n const resolvedPath = resolve(filePath);\n\n if (!existsSync(resolvedPath)) {\n return err({\n code: \"GRAPHQL_FILE_NOT_FOUND\",\n message: `GraphQL file not found at ${resolvedPath}`,\n filePath: resolvedPath,\n });\n }\n\n try {\n const source = readFileSync(resolvedPath, \"utf8\");\n const document = parse(source);\n return ok(extractFromDocument(document, resolvedPath));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return err({\n code: \"GRAPHQL_PARSE_ERROR\",\n message: `GraphQL parse error: ${message}`,\n filePath: resolvedPath,\n });\n }\n};\n\n/**\n * Parse GraphQL source string directly.\n */\nexport const parseGraphqlSource = (source: string, sourceFile: string): Result<ParseResult, GraphqlCompatError> => {\n try {\n const document = parse(source);\n return ok(extractFromDocument(document, sourceFile));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return err({\n code: \"GRAPHQL_PARSE_ERROR\",\n message: `GraphQL parse error: ${message}`,\n filePath: sourceFile,\n });\n }\n};\n\n/**\n * Extract operations and fragments from a parsed GraphQL document.\n */\nconst extractFromDocument = (document: DocumentNode, sourceFile: string): ParseResult => {\n const operations: ParsedOperation[] = [];\n const fragments: ParsedFragment[] = [];\n\n for (const definition of document.definitions) {\n if (definition.kind === Kind.OPERATION_DEFINITION) {\n const operation = extractOperation(definition, sourceFile);\n if (operation) {\n operations.push(operation);\n }\n } else if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n fragments.push(extractFragment(definition, sourceFile));\n }\n }\n\n return { operations, fragments };\n};\n\n/**\n * Extract a single operation from an OperationDefinitionNode.\n */\nconst extractOperation = (node: OperationDefinitionNode, sourceFile: string): ParsedOperation | null => {\n // Anonymous operations are not supported\n if (!node.name) {\n return null;\n }\n\n const variables: ParsedVariable[] = (node.variableDefinitions ?? []).map(extractVariable);\n const selections = extractSelections(node.selectionSet.selections);\n\n return {\n kind: node.operation,\n name: node.name.value,\n variables,\n selections,\n sourceFile,\n };\n};\n\n/**\n * Extract a fragment from a FragmentDefinitionNode.\n */\nconst extractFragment = (node: FragmentDefinitionNode, sourceFile: string): ParsedFragment => {\n const selections = extractSelections(node.selectionSet.selections);\n\n return {\n name: node.name.value,\n onType: node.typeCondition.name.value,\n selections,\n sourceFile,\n };\n};\n\n/**\n * Extract a variable definition.\n */\nconst extractVariable = (node: VariableDefinitionNode): ParsedVariable => {\n const { typeName, modifier } = parseTypeNode(node.type);\n const defaultValue = node.defaultValue ? extractValue(node.defaultValue) : undefined;\n\n return {\n name: node.variable.name.value,\n typeName,\n modifier,\n // Type kind will be determined later when we have schema context\n typeKind: \"scalar\",\n defaultValue,\n };\n};\n\n/**\n * Parse a GraphQL TypeNode into type name and modifier.\n *\n * Format: inner nullability + list modifiers\n * - Inner: `!` (non-null) or `?` (nullable)\n * - List: `[]!` (non-null list) or `[]?` (nullable list)\n */\nexport const parseTypeNode = (node: TypeNode): TypeInfo => {\n type TypeLevel = { kind: \"list\" | \"named\"; nonNull: boolean };\n const levels: TypeLevel[] = [];\n\n const collect = (n: TypeNode, nonNull: boolean): string => {\n if (n.kind === Kind.NON_NULL_TYPE) {\n return collect(n.type, true);\n }\n if (n.kind === Kind.LIST_TYPE) {\n levels.push({ kind: \"list\", nonNull });\n return collect(n.type, false);\n }\n levels.push({ kind: \"named\", nonNull });\n return n.name.value;\n };\n\n const typeName = collect(node, false);\n\n // Build modifier from levels (reverse order)\n let modifier = \"?\";\n for (const level of levels.slice().reverse()) {\n if (level.kind === \"named\") {\n modifier = level.nonNull ? \"!\" : \"?\";\n continue;\n }\n const listSuffix = level.nonNull ? \"[]!\" : \"[]?\";\n modifier = `${modifier}${listSuffix}`;\n }\n\n return { typeName, modifier };\n};\n\n/**\n * Extract selections from a SelectionSet.\n */\nconst extractSelections = (selections: readonly SelectionNode[]): ParsedSelection[] => {\n return selections.map(extractSelection);\n};\n\n/**\n * Extract a single selection.\n */\nconst extractSelection = (node: SelectionNode): ParsedSelection => {\n switch (node.kind) {\n case Kind.FIELD:\n return extractFieldSelection(node);\n case Kind.FRAGMENT_SPREAD:\n return extractFragmentSpread(node);\n case Kind.INLINE_FRAGMENT:\n return extractInlineFragment(node);\n }\n};\n\n/**\n * Extract a field selection.\n */\nconst extractFieldSelection = (node: FieldNode): ParsedFieldSelection => {\n const args = node.arguments?.length ? node.arguments.map(extractArgument) : undefined;\n const selections = node.selectionSet ? extractSelections(node.selectionSet.selections) : undefined;\n\n return {\n kind: \"field\",\n name: node.name.value,\n alias: node.alias?.value,\n arguments: args,\n selections,\n };\n};\n\n/**\n * Extract a fragment spread.\n */\nconst extractFragmentSpread = (node: FragmentSpreadNode): ParsedFragmentSpread => {\n return {\n kind: \"fragmentSpread\",\n name: node.name.value,\n };\n};\n\n/**\n * Extract an inline fragment.\n */\nconst extractInlineFragment = (node: InlineFragmentNode): ParsedInlineFragment => {\n return {\n kind: \"inlineFragment\",\n onType: node.typeCondition?.name.value ?? \"\",\n selections: extractSelections(node.selectionSet.selections),\n };\n};\n\n/**\n * Extract an argument.\n */\nconst extractArgument = (node: ArgumentNode): ParsedArgument => {\n return {\n name: node.name.value,\n value: extractValue(node.value),\n };\n};\n\n/**\n * Assert unreachable code path (for exhaustiveness checks).\n */\nconst assertUnreachable = (value: never): never => {\n throw new Error(`Unexpected value: ${JSON.stringify(value)}`);\n};\n\n/**\n * Extract a value (literal or variable reference).\n */\nconst extractValue = (node: ValueNode): ParsedValue => {\n switch (node.kind) {\n case Kind.VARIABLE:\n return { kind: \"variable\", name: node.name.value };\n case Kind.INT:\n return { kind: \"int\", value: node.value };\n case Kind.FLOAT:\n return { kind: \"float\", value: node.value };\n case Kind.STRING:\n return { kind: \"string\", value: node.value };\n case Kind.BOOLEAN:\n return { kind: \"boolean\", value: node.value };\n case Kind.NULL:\n return { kind: \"null\" };\n case Kind.ENUM:\n return { kind: \"enum\", value: node.value };\n case Kind.LIST:\n return { kind: \"list\", values: node.values.map(extractValue) };\n case Kind.OBJECT:\n return {\n kind: \"object\",\n fields: node.fields.map((field) => ({\n name: field.name.value,\n value: extractValue(field.value),\n })),\n };\n default:\n return assertUnreachable(node);\n }\n};\n","/**\n * Transformer for enriching parsed GraphQL operations with schema information.\n * @module\n */\n\nimport { err, ok, type Result } from \"neverthrow\";\nimport { createSchemaIndex } from \"../generator\";\nimport { parseTypeNode } from \"./parser\";\nimport type {\n EnrichedFragment,\n EnrichedOperation,\n EnrichedVariable,\n GraphqlCompatError,\n InferredVariable,\n ParsedArgument,\n ParsedFragment,\n ParsedOperation,\n ParsedSelection,\n ParsedValue,\n ParseResult,\n TransformOptions,\n TransformResult,\n TypeInfo,\n} from \"./types\";\n\n/**\n * Schema index type extracted from generator.\n */\ntype SchemaIndex = ReturnType<typeof createSchemaIndex>;\n\n/**\n * Built-in GraphQL scalar types.\n */\nconst builtinScalarTypes = new Set([\"ID\", \"String\", \"Int\", \"Float\", \"Boolean\"]);\n\n// ============================================================================\n// Modifier Merging Utilities\n// ============================================================================\n\n/**\n * Parsed structure of a modifier for comparison and merging.\n * Example: \"![]?\" -> { inner: \"!\", lists: [\"[]?\"] }\n */\ntype ModifierStructure = {\n readonly inner: \"!\" | \"?\";\n readonly lists: readonly (\"[]!\" | \"[]?\")[];\n};\n\n/**\n * Parse a modifier string into its structural components.\n * @param modifier - Modifier string like \"!\", \"?\", \"![]!\", \"?[]?[]!\"\n * @returns Parsed structure with inner nullability and list modifiers\n */\nconst parseModifierStructure = (modifier: string): ModifierStructure => {\n // Extract inner nullability (first character)\n const inner = modifier[0] === \"!\" ? \"!\" : \"?\";\n\n // Extract list modifiers ([]! or []?)\n const lists: (\"[]!\" | \"[]?\")[] = [];\n const listPattern = /\\[\\]([!?])/g;\n let match: RegExpExecArray | null;\n while ((match = listPattern.exec(modifier)) !== null) {\n lists.push(`[]${match[1]}` as \"[]!\" | \"[]?\");\n }\n\n return { inner, lists };\n};\n\n/**\n * Rebuild modifier string from structure.\n */\nconst buildModifier = (structure: ModifierStructure): string => {\n return structure.inner + structure.lists.join(\"\");\n};\n\n/**\n * Check if source modifier can be assigned to target modifier.\n * Implements GraphQL List Coercion: depth difference of 0 or 1 is allowed.\n *\n * Rules:\n * - A single value can be coerced into a list (depth diff = 1)\n * - At each level, non-null can be assigned to nullable (but not vice versa)\n *\n * @param source - The modifier of the value being assigned (variable's type)\n * @param target - The modifier expected by the position (field argument's type)\n * @returns true if assignment is valid\n */\nexport const isModifierAssignable = (source: string, target: string): boolean => {\n const srcStruct = parseModifierStructure(source);\n const tgtStruct = parseModifierStructure(target);\n\n const depthDiff = tgtStruct.lists.length - srcStruct.lists.length;\n\n // Depth difference must be 0 or 1 (List Coercion only wraps one level)\n if (depthDiff < 0 || depthDiff > 1) return false;\n\n // When List Coercion applies (depth diff = 1), compare inner levels only\n // The outer list level of target is satisfied by the coercion itself\n const tgtListsToCompare = depthDiff === 1 ? tgtStruct.lists.slice(1) : tgtStruct.lists;\n\n // When coercing a nullable scalar to a list, target's outer list must be nullable\n // A null scalar would produce null (not [null]), violating non-null list constraint\n // This only applies to scalars (no lists), not when coercing list to nested list\n if (depthDiff === 1 && srcStruct.lists.length === 0 && srcStruct.inner === \"?\" && tgtStruct.lists[0] === \"[]!\") {\n return false;\n }\n\n // Inner nullability: non-null can go to nullable, but not vice versa\n if (srcStruct.inner === \"?\" && tgtStruct.inner === \"!\") return false;\n\n // List level nullability: check each corresponding level\n for (let i = 0; i < srcStruct.lists.length; i++) {\n const srcList = srcStruct.lists[i];\n const tgtList = tgtListsToCompare[i];\n if (srcList === undefined || tgtList === undefined) break;\n if (srcList === \"[]?\" && tgtList === \"[]!\") return false;\n }\n\n return true;\n};\n\n/**\n * Derive minimum modifier needed to satisfy expected modifier.\n * When List Coercion can apply, returns one level shallower.\n *\n * @param expectedModifier - The modifier expected by the field argument\n * @returns The minimum modifier the variable must have\n */\nconst deriveMinimumModifier = (expectedModifier: string): string => {\n const struct = parseModifierStructure(expectedModifier);\n if (struct.lists.length > 0) {\n return buildModifier({ inner: struct.inner, lists: struct.lists.slice(1) });\n }\n return expectedModifier;\n};\n\n/**\n * Merge two modifiers by taking the stricter constraint at each level.\n * - Non-null (!) is stricter than nullable (?)\n * - List depths must match\n *\n * @param a - First modifier\n * @param b - Second modifier\n * @returns Merged modifier or error if incompatible\n */\nexport const mergeModifiers = (a: string, b: string): { ok: true; value: string } | { ok: false; reason: string } => {\n const structA = parseModifierStructure(a);\n const structB = parseModifierStructure(b);\n\n // List depths must match\n if (structA.lists.length !== structB.lists.length) {\n return {\n ok: false,\n reason: `Incompatible list depths: \"${a}\" has ${structA.lists.length} list level(s), \"${b}\" has ${structB.lists.length}`,\n };\n }\n\n // Take stricter inner constraint (! beats ?)\n const mergedInner: \"!\" | \"?\" = structA.inner === \"!\" || structB.inner === \"!\" ? \"!\" : \"?\";\n\n // Merge each list level (! beats ?)\n const mergedLists: (\"[]!\" | \"[]?\")[] = [];\n for (let i = 0; i < structA.lists.length; i++) {\n const listA = structA.lists[i];\n const listB = structB.lists[i];\n if (listA === undefined || listB === undefined) break;\n mergedLists.push(listA === \"[]!\" || listB === \"[]!\" ? \"[]!\" : \"[]?\");\n }\n\n return { ok: true, value: buildModifier({ inner: mergedInner, lists: mergedLists }) };\n};\n\n// ============================================================================\n// Variable Collection from Selections\n// ============================================================================\n\n/**\n * Intermediate type for tracking variable usages before merging.\n */\ntype VariableUsage = {\n readonly name: string;\n readonly typeName: string;\n /** The modifier expected by the field/argument position */\n readonly expectedModifier: string;\n /** The minimum modifier the variable needs (after applying List Coercion) */\n readonly minimumModifier: string;\n readonly typeKind: \"scalar\" | \"enum\" | \"input\";\n};\n\n/**\n * Get the expected type for a field argument from the schema.\n * Returns null if the field or argument is not found.\n */\nexport const getArgumentType = (\n schema: SchemaIndex,\n parentTypeName: string,\n fieldName: string,\n argumentName: string,\n): TypeInfo | null => {\n const objectRecord = schema.objects.get(parentTypeName);\n if (!objectRecord) return null;\n\n const fieldDef = objectRecord.fields.get(fieldName);\n if (!fieldDef) return null;\n\n const argDef = fieldDef.arguments?.find((arg) => arg.name.value === argumentName);\n if (!argDef) return null;\n\n return parseTypeNode(argDef.type);\n};\n\n/**\n * Get the expected type for an input object field from the schema.\n */\nexport const getInputFieldType = (schema: SchemaIndex, inputTypeName: string, fieldName: string): TypeInfo | null => {\n const inputRecord = schema.inputs.get(inputTypeName);\n if (!inputRecord) return null;\n\n const fieldDef = inputRecord.fields.get(fieldName);\n if (!fieldDef) return null;\n\n return parseTypeNode(fieldDef.type);\n};\n\n/**\n * Resolve the type kind for a type name.\n */\nconst resolveTypeKindFromName = (schema: SchemaIndex, typeName: string): \"scalar\" | \"enum\" | \"input\" | null => {\n if (isScalarName(schema, typeName)) return \"scalar\";\n if (isEnumName(schema, typeName)) return \"enum\";\n if (schema.inputs.has(typeName)) return \"input\";\n return null;\n};\n\n/**\n * Extract variable usages from a parsed value, given the expected type.\n * Handles nested input objects recursively.\n */\nconst collectVariablesFromValue = (\n value: ParsedValue,\n expectedTypeName: string,\n expectedModifier: string,\n schema: SchemaIndex,\n usages: VariableUsage[],\n): GraphqlCompatError | null => {\n if (value.kind === \"variable\") {\n const typeKind = resolveTypeKindFromName(schema, expectedTypeName);\n if (!typeKind) {\n return {\n code: \"GRAPHQL_UNKNOWN_TYPE\",\n message: `Unknown type \"${expectedTypeName}\" for variable \"$${value.name}\"`,\n typeName: expectedTypeName,\n };\n }\n usages.push({\n name: value.name,\n typeName: expectedTypeName,\n expectedModifier,\n minimumModifier: deriveMinimumModifier(expectedModifier),\n typeKind,\n });\n return null;\n }\n\n if (value.kind === \"object\") {\n // For object values, check each field against input type definition\n for (const field of value.fields) {\n const fieldType = getInputFieldType(schema, expectedTypeName, field.name);\n if (!fieldType) {\n return {\n code: \"GRAPHQL_UNKNOWN_FIELD\",\n message: `Unknown field \"${field.name}\" on input type \"${expectedTypeName}\"`,\n typeName: expectedTypeName,\n fieldName: field.name,\n };\n }\n const error = collectVariablesFromValue(field.value, fieldType.typeName, fieldType.modifier, schema, usages);\n if (error) return error;\n }\n return null;\n }\n\n if (value.kind === \"list\") {\n // For list values, unwrap one level of list modifier\n // e.g., [ID!]! -> ID! for elements\n const struct = parseModifierStructure(expectedModifier);\n if (struct.lists.length > 0) {\n const innerModifier = buildModifier({\n inner: struct.inner,\n lists: struct.lists.slice(1),\n });\n for (const item of value.values) {\n const error = collectVariablesFromValue(item, expectedTypeName, innerModifier, schema, usages);\n if (error) return error;\n }\n }\n }\n\n // Other value kinds (int, float, string, etc.) don't contain variables\n return null;\n};\n\n/**\n * Collect variable usages from field arguments.\n */\nconst collectVariablesFromArguments = (\n args: readonly ParsedArgument[],\n parentTypeName: string,\n fieldName: string,\n schema: SchemaIndex,\n usages: VariableUsage[],\n): GraphqlCompatError | null => {\n for (const arg of args) {\n const argType = getArgumentType(schema, parentTypeName, fieldName, arg.name);\n if (!argType) {\n return {\n code: \"GRAPHQL_UNKNOWN_ARGUMENT\",\n message: `Unknown argument \"${arg.name}\" on field \"${fieldName}\"`,\n fieldName,\n argumentName: arg.name,\n };\n }\n const error = collectVariablesFromValue(arg.value, argType.typeName, argType.modifier, schema, usages);\n if (error) return error;\n }\n return null;\n};\n\n/**\n * Recursively collect all variable usages from selections.\n */\nexport const collectVariableUsages = (\n selections: readonly ParsedSelection[],\n parentTypeName: string,\n schema: SchemaIndex,\n): Result<VariableUsage[], GraphqlCompatError> => {\n const usages: VariableUsage[] = [];\n\n const collect = (sels: readonly ParsedSelection[], parentType: string): GraphqlCompatError | null => {\n for (const sel of sels) {\n switch (sel.kind) {\n case \"field\": {\n // Collect from arguments\n if (sel.arguments && sel.arguments.length > 0) {\n const error = collectVariablesFromArguments(sel.arguments, parentType, sel.name, schema, usages);\n if (error) return error;\n }\n\n // Recurse into nested selections\n if (sel.selections && sel.selections.length > 0) {\n // Need to determine the field's return type for nested selections\n const fieldReturnType = getFieldReturnType(schema, parentType, sel.name);\n if (!fieldReturnType) {\n return {\n code: \"GRAPHQL_UNKNOWN_FIELD\",\n message: `Unknown field \"${sel.name}\" on type \"${parentType}\"`,\n typeName: parentType,\n fieldName: sel.name,\n };\n }\n const error = collect(sel.selections, fieldReturnType);\n if (error) return error;\n }\n break;\n }\n case \"inlineFragment\": {\n // Use the inline fragment's type condition\n const error = collect(sel.selections, sel.onType);\n if (error) return error;\n break;\n }\n case \"fragmentSpread\":\n // Fragment spreads are handled separately (variables from spread fragments)\n break;\n }\n }\n return null;\n };\n\n const error = collect(selections, parentTypeName);\n if (error) return err(error);\n\n return ok(usages);\n};\n\n/**\n * Get the return type of a field (unwrapped from modifiers).\n */\nexport const getFieldReturnType = (schema: SchemaIndex, parentTypeName: string, fieldName: string): string | null => {\n const objectRecord = schema.objects.get(parentTypeName);\n if (!objectRecord) return null;\n\n const fieldDef = objectRecord.fields.get(fieldName);\n if (!fieldDef) return null;\n\n const { typeName } = parseTypeNode(fieldDef.type);\n return typeName;\n};\n\n/**\n * Merge multiple variable usages into a single InferredVariable.\n * Validates type compatibility and merges modifiers using List Coercion rules.\n *\n * The algorithm:\n * 1. Validate all usages have the same type name\n * 2. Merge minimumModifiers to find the candidate (shallowest type that could work)\n * 3. Verify the candidate can satisfy ALL expected modifiers via isModifierAssignable\n */\nexport const mergeVariableUsages = (\n variableName: string,\n usages: readonly VariableUsage[],\n): Result<InferredVariable, GraphqlCompatError> => {\n const first = usages[0];\n if (!first) {\n return err({\n code: \"GRAPHQL_UNDECLARED_VARIABLE\",\n message: `No usages found for variable \"${variableName}\"`,\n variableName,\n });\n }\n\n // Validate all usages have the same type name\n for (const usage of usages) {\n if (usage.typeName !== first.typeName) {\n return err({\n code: \"GRAPHQL_VARIABLE_TYPE_MISMATCH\",\n message: `Variable \"$${variableName}\" has conflicting types: \"${first.typeName}\" and \"${usage.typeName}\"`,\n variableName,\n });\n }\n }\n\n // Merge minimumModifiers to find candidate\n let candidateModifier = first.minimumModifier;\n for (let i = 1; i < usages.length; i++) {\n const usage = usages[i];\n if (!usage) break;\n const result = mergeModifiers(candidateModifier, usage.minimumModifier);\n if (!result.ok) {\n return err({\n code: \"GRAPHQL_VARIABLE_MODIFIER_INCOMPATIBLE\",\n message: `Variable \"$${variableName}\" has incompatible modifiers: ${result.reason}`,\n variableName,\n });\n }\n candidateModifier = result.value;\n }\n\n // Verify candidate satisfies all expected modifiers\n for (const usage of usages) {\n if (!isModifierAssignable(candidateModifier, usage.expectedModifier)) {\n return err({\n code: \"GRAPHQL_VARIABLE_MODIFIER_INCOMPATIBLE\",\n message: `Variable \"$${variableName}\" with modifier \"${candidateModifier}\" cannot satisfy expected \"${usage.expectedModifier}\"`,\n variableName,\n });\n }\n }\n\n return ok({\n name: variableName,\n typeName: first.typeName,\n modifier: candidateModifier,\n typeKind: first.typeKind,\n });\n};\n\n/**\n * Infer variables from collected usages.\n * Groups by variable name and merges each group.\n */\nexport const inferVariablesFromUsages = (usages: readonly VariableUsage[]): Result<InferredVariable[], GraphqlCompatError> => {\n // Group usages by variable name\n const byName = new Map<string, VariableUsage[]>();\n for (const usage of usages) {\n const existing = byName.get(usage.name);\n if (existing) {\n existing.push(usage);\n } else {\n byName.set(usage.name, [usage]);\n }\n }\n\n // Merge each group\n const variables: InferredVariable[] = [];\n for (const [name, group] of byName) {\n const result = mergeVariableUsages(name, group);\n if (result.isErr()) return err(result.error);\n variables.push(result.value);\n }\n\n // Sort by name for deterministic output\n variables.sort((a, b) => a.name.localeCompare(b.name));\n\n return ok(variables);\n};\n\n/**\n * Check if a type name is a scalar type.\n */\nconst isScalarName = (schema: SchemaIndex, name: string): boolean => builtinScalarTypes.has(name) || schema.scalars.has(name);\n\n// ============================================================================\n// Fragment Dependency Ordering\n// ============================================================================\n\n/**\n * Topologically sort fragments so dependencies come before dependents.\n * Detects circular dependencies.\n *\n * Note: Uses the existing collectFragmentDependencies function defined below.\n */\nexport const sortFragmentsByDependency = (fragments: readonly ParsedFragment[]): Result<ParsedFragment[], GraphqlCompatError> => {\n // Build dependency graph using existing function\n const graph = new Map<string, Set<string>>();\n for (const fragment of fragments) {\n const deps = collectFragmentDependenciesSet(fragment.selections);\n graph.set(fragment.name, deps);\n }\n\n const fragmentByName = new Map<string, ParsedFragment>();\n for (const f of fragments) {\n fragmentByName.set(f.name, f);\n }\n\n const sorted: ParsedFragment[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>(); // For cycle detection\n\n const visit = (name: string, path: string[]): GraphqlCompatError | null => {\n if (visited.has(name)) return null;\n\n if (visiting.has(name)) {\n // Found a cycle\n const cycleStart = path.indexOf(name);\n const cycle = path.slice(cycleStart).concat(name);\n return {\n code: \"GRAPHQL_FRAGMENT_CIRCULAR_DEPENDENCY\",\n message: `Circular dependency detected in fragments: ${cycle.join(\" -> \")}`,\n fragmentNames: cycle,\n };\n }\n\n // Fragment might not be in our list (external dependency)\n const fragment = fragmentByName.get(name);\n if (!fragment) {\n // External fragment, skip\n visited.add(name);\n return null;\n }\n\n visiting.add(name);\n const deps = graph.get(name) ?? new Set();\n\n for (const dep of deps) {\n const error = visit(dep, [...path, name]);\n if (error) return error;\n }\n\n visiting.delete(name);\n visited.add(name);\n sorted.push(fragment);\n return null;\n };\n\n for (const fragment of fragments) {\n const error = visit(fragment.name, []);\n if (error) return err(error);\n }\n\n return ok(sorted);\n};\n\n/**\n * Recursively collect fragment spread names from selections into a Set.\n * Internal helper for sortFragmentsByDependency.\n */\nconst collectFragmentDependenciesSet = (selections: readonly ParsedSelection[]): Set<string> => {\n const deps = new Set<string>();\n\n const collect = (sels: readonly ParsedSelection[]): void => {\n for (const sel of sels) {\n switch (sel.kind) {\n case \"fragmentSpread\":\n deps.add(sel.name);\n break;\n case \"field\":\n if (sel.selections) {\n collect(sel.selections);\n }\n break;\n case \"inlineFragment\":\n collect(sel.selections);\n break;\n }\n }\n };\n\n collect(selections);\n return deps;\n};\n\n/**\n * Check if a type name is an enum type.\n */\nconst isEnumName = (schema: SchemaIndex, name: string): boolean => schema.enums.has(name);\n\n/**\n * Transform parsed operations/fragments by enriching them with schema information.\n *\n * This resolves variable type kinds (scalar, enum, input), collects\n * fragment dependencies, and infers variables for fragments.\n */\nexport const transformParsedGraphql = (\n parsed: ParseResult,\n options: TransformOptions,\n): Result<TransformResult, GraphqlCompatError> => {\n const schema = createSchemaIndex(options.schemaDocument);\n\n // Sort fragments by dependency (dependencies first)\n const sortResult = sortFragmentsByDependency(parsed.fragments);\n if (sortResult.isErr()) {\n return err(sortResult.error);\n }\n const sortedFragments = sortResult.value;\n\n // Transform fragments in dependency order, building up resolved variables map\n const resolvedFragmentVariables = new Map<string, readonly InferredVariable[]>();\n const fragments: EnrichedFragment[] = [];\n\n for (const frag of sortedFragments) {\n const result = transformFragment(frag, schema, resolvedFragmentVariables);\n if (result.isErr()) {\n return err(result.error);\n }\n resolvedFragmentVariables.set(frag.name, result.value.variables);\n fragments.push(result.value);\n }\n\n // Transform operations\n const operations: EnrichedOperation[] = [];\n for (const op of parsed.operations) {\n const result = transformOperation(op, schema);\n if (result.isErr()) {\n return err(result.error);\n }\n operations.push(result.value);\n }\n\n return ok({ operations, fragments });\n};\n\n/**\n * Transform a single operation.\n */\nconst transformOperation = (op: ParsedOperation, schema: SchemaIndex): Result<EnrichedOperation, GraphqlCompatError> => {\n // Resolve variable type kinds\n const variables: EnrichedVariable[] = [];\n for (const v of op.variables) {\n const typeKind = resolveTypeKind(schema, v.typeName);\n if (typeKind === null) {\n return err({\n code: \"GRAPHQL_UNKNOWN_TYPE\",\n message: `Unknown type \"${v.typeName}\" in variable \"${v.name}\"`,\n typeName: v.typeName,\n });\n }\n variables.push({ ...v, typeKind });\n }\n\n // Collect fragment dependencies\n const fragmentDependencies = collectFragmentDependencies(op.selections);\n\n return ok({\n ...op,\n variables,\n fragmentDependencies,\n });\n};\n\n/**\n * Transform a single fragment.\n * Infers variables from field arguments and propagates variables from spread fragments.\n */\nconst transformFragment = (\n frag: ParsedFragment,\n schema: SchemaIndex,\n resolvedFragmentVariables: Map<string, readonly InferredVariable[]>,\n): Result<EnrichedFragment, GraphqlCompatError> => {\n // Collect fragment dependencies (fragments used within this fragment)\n const fragmentDependencies = collectFragmentDependencies(frag.selections);\n\n // Collect direct variable usages from this fragment's selections\n const directUsagesResult = collectVariableUsages(frag.selections, frag.onType, schema);\n if (directUsagesResult.isErr()) {\n return err(directUsagesResult.error);\n }\n const directUsages = directUsagesResult.value;\n\n // Collect variables from spread fragments\n const spreadVariables: InferredVariable[] = [];\n for (const depName of fragmentDependencies) {\n const depVariables = resolvedFragmentVariables.get(depName);\n if (depVariables) {\n spreadVariables.push(...depVariables);\n }\n // If not found, it's an external fragment - skip\n }\n\n // Combine direct usages with spread variables\n // Convert spread variables (InferredVariable) to usages for merging\n // For already-inferred variables, expectedModifier and minimumModifier are the same\n const allUsages: VariableUsage[] = [\n ...directUsages,\n ...spreadVariables.map((v) => ({\n name: v.name,\n typeName: v.typeName,\n expectedModifier: v.modifier,\n minimumModifier: v.modifier,\n typeKind: v.typeKind,\n })),\n ];\n\n // Infer final variables\n const variablesResult = inferVariablesFromUsages(allUsages);\n if (variablesResult.isErr()) {\n return err(variablesResult.error);\n }\n\n return ok({\n ...frag,\n fragmentDependencies,\n variables: variablesResult.value,\n });\n};\n\n/**\n * Resolve the type kind for a type name.\n */\nconst resolveTypeKind = (schema: SchemaIndex, typeName: string): \"scalar\" | \"enum\" | \"input\" | null => {\n if (isScalarName(schema, typeName)) {\n return \"scalar\";\n }\n if (isEnumName(schema, typeName)) {\n return \"enum\";\n }\n if (schema.inputs.has(typeName)) {\n return \"input\";\n }\n return null;\n};\n\n/**\n * Collect fragment names used in selections (recursively).\n */\nconst collectFragmentDependencies = (selections: readonly import(\"./types\").ParsedSelection[]): readonly string[] => {\n const fragments = new Set<string>();\n\n const collect = (sels: readonly import(\"./types\").ParsedSelection[]): void => {\n for (const sel of sels) {\n switch (sel.kind) {\n case \"fragmentSpread\":\n fragments.add(sel.name);\n break;\n case \"field\":\n if (sel.selections) {\n collect(sel.selections);\n }\n break;\n case \"inlineFragment\":\n collect(sel.selections);\n break;\n }\n }\n };\n\n collect(selections);\n return [...fragments];\n};\n","/**\n * Emitter for generating TypeScript compat code from enriched operations.\n * @module\n */\n\nimport type { DocumentNode } from \"graphql\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport { createSchemaIndex } from \"../generator\";\nimport { getArgumentType, getFieldReturnType, getInputFieldType } from \"./transformer\";\nimport type {\n EnrichedFragment,\n EnrichedOperation,\n GraphqlCompatError,\n ParsedArgument,\n ParsedInlineFragment,\n ParsedSelection,\n ParsedValue,\n TypeInfo,\n} from \"./types\";\n\n/**\n * Schema index for type lookups.\n */\ntype SchemaIndex = ReturnType<typeof createSchemaIndex>;\n\n/**\n * Options for code emission.\n */\nexport type EmitOptions = {\n /** Schema name to use in gql.schemaName() call */\n readonly schemaName: string;\n /** Import path for graphql-system module */\n readonly graphqlSystemPath: string;\n /** Schema document for type lookups (required for inline fragment support) */\n readonly schemaDocument?: DocumentNode;\n};\n\n/**\n * Map operation kind to root type name.\n * Uses schema.operationTypes if available, falls back to standard names.\n */\nconst getRootTypeName = (schema: SchemaIndex | null, kind: \"query\" | \"mutation\" | \"subscription\"): string => {\n if (schema) {\n switch (kind) {\n case \"query\":\n return schema.operationTypes.query ?? \"Query\";\n case \"mutation\":\n return schema.operationTypes.mutation ?? \"Mutation\";\n case \"subscription\":\n return schema.operationTypes.subscription ?? \"Subscription\";\n }\n }\n // Fallback when no schema is available\n switch (kind) {\n case \"query\":\n return \"Query\";\n case \"mutation\":\n return \"Mutation\";\n case \"subscription\":\n return \"Subscription\";\n }\n};\n\n/**\n * Emit TypeScript code for an operation.\n */\nexport const emitOperation = (operation: EnrichedOperation, options: EmitOptions): Result<string, GraphqlCompatError> => {\n const lines: string[] = [];\n const schema = options.schemaDocument ? createSchemaIndex(options.schemaDocument) : null;\n\n // Note: imports (gql and fragment) are handled by the caller\n\n // Generate export\n const exportName = `${operation.name}Compat`;\n const operationType = operation.kind;\n\n lines.push(`export const ${exportName} = gql.${options.schemaName}(({ ${operationType}, $var }) =>`);\n lines.push(` ${operationType}.compat({`);\n lines.push(` name: ${JSON.stringify(operation.name)},`);\n\n // Variables\n if (operation.variables.length > 0) {\n lines.push(` variables: { ${emitVariables(operation.variables)} },`);\n }\n\n // Fields - pass root type name for list coercion\n const rootTypeName = getRootTypeName(schema, operation.kind);\n lines.push(` fields: ({ f, $ }) => ({`);\n const fieldLinesResult = emitSelections(operation.selections, 3, operation.variables, schema, rootTypeName);\n if (fieldLinesResult.isErr()) {\n return err(fieldLinesResult.error);\n }\n lines.push(fieldLinesResult.value);\n lines.push(` }),`);\n\n lines.push(` }),`);\n lines.push(`);`);\n\n return ok(lines.join(\"\\n\"));\n};\n\n/**\n * Emit TypeScript code for a fragment.\n */\nexport const emitFragment = (fragment: EnrichedFragment, options: EmitOptions): Result<string, GraphqlCompatError> => {\n const lines: string[] = [];\n const schema = options.schemaDocument ? createSchemaIndex(options.schemaDocument) : null;\n const hasVariables = fragment.variables.length > 0;\n\n // Note: imports (gql and fragment) are handled by the caller\n\n // Generate export\n const exportName = `${fragment.name}Fragment`;\n\n // Include $var in destructure if fragment has variables\n const destructure = hasVariables ? \"fragment, $var\" : \"fragment\";\n lines.push(`export const ${exportName} = gql.${options.schemaName}(({ ${destructure} }) =>`);\n lines.push(` fragment.${fragment.onType}({`);\n\n // Variables block (if any)\n if (hasVariables) {\n lines.push(` variables: { ${emitVariables(fragment.variables)} },`);\n }\n\n // Fields - include $ in context if fragment has variables\n // Pass fragment.onType as the parent type for list coercion\n const fieldsContext = hasVariables ? \"{ f, $ }\" : \"{ f }\";\n lines.push(` fields: (${fieldsContext}) => ({`);\n const fieldLinesResult = emitSelections(fragment.selections, 3, fragment.variables, schema, fragment.onType);\n if (fieldLinesResult.isErr()) {\n return err(fieldLinesResult.error);\n }\n lines.push(fieldLinesResult.value);\n lines.push(` }),`);\n\n lines.push(` }),`);\n lines.push(`);`);\n\n return ok(lines.join(\"\\n\"));\n};\n\n/**\n * Common variable type for emission (both EnrichedVariable and InferredVariable have these fields).\n */\ntype EmittableVariable = {\n readonly name: string;\n readonly typeName: string;\n readonly modifier: string;\n};\n\n/**\n * Emit variable definitions.\n */\nconst emitVariables = (variables: readonly EmittableVariable[]): string => {\n return variables.map((v) => `...$var(${JSON.stringify(v.name)}).${v.typeName}(${JSON.stringify(v.modifier)})`).join(\", \");\n};\n\n/**\n * Emit field selections (public API).\n * Converts variable array to Set<string> and delegates to internal implementation.\n */\nconst emitSelections = (\n selections: readonly ParsedSelection[],\n indent: number,\n variables: readonly EmittableVariable[],\n schema: SchemaIndex | null,\n parentTypeName: string | undefined,\n): Result<string, GraphqlCompatError> => {\n const variableNames = new Set(variables.map((v) => v.name));\n return emitSelectionsInternal(selections, indent, variableNames, schema, parentTypeName);\n};\n\n/**\n * Internal implementation for emitting field selections.\n * Takes variableNames as Set<string> for recursive calls.\n */\nconst emitSelectionsInternal = (\n selections: readonly ParsedSelection[],\n indent: number,\n variableNames: Set<string>,\n schema: SchemaIndex | null,\n parentTypeName: string | undefined,\n): Result<string, GraphqlCompatError> => {\n const lines: string[] = [];\n\n // Separate inline fragments from other selections, detecting __typename field\n const inlineFragments: ParsedInlineFragment[] = [];\n const otherSelections: ParsedSelection[] = [];\n let hasTypenameField = false;\n\n for (const sel of selections) {\n if (sel.kind === \"inlineFragment\") {\n inlineFragments.push(sel);\n } else if (sel.kind === \"field\" && sel.name === \"__typename\" && !sel.alias) {\n // Detect non-aliased __typename field for union selection\n hasTypenameField = true;\n } else {\n otherSelections.push(sel);\n }\n }\n\n // Emit regular selections (fields and fragment spreads)\n for (const sel of otherSelections) {\n const result = emitSingleSelection(sel, indent, variableNames, schema, parentTypeName);\n if (result.isErr()) {\n return err(result.error);\n }\n lines.push(result.value);\n }\n\n // Emit grouped inline fragments as union selections\n if (inlineFragments.length > 0) {\n // Pass hasTypenameField to include __typename: true inside union object\n const unionResult = emitInlineFragmentsAsUnion(inlineFragments, indent, variableNames, schema, hasTypenameField);\n if (unionResult.isErr()) {\n return err(unionResult.error);\n }\n lines.push(unionResult.value);\n } else if (hasTypenameField) {\n // __typename without inline fragments: emit as regular field\n const padding = \" \".repeat(indent);\n lines.push(`${padding}__typename: true,`);\n }\n\n return ok(lines.join(\"\\n\"));\n};\n\n/**\n * Emit a single selection (field or fragment spread).\n */\nconst emitSingleSelection = (\n sel: ParsedSelection,\n indent: number,\n variableNames: Set<string>,\n schema: SchemaIndex | null,\n parentTypeName: string | undefined,\n): Result<string, GraphqlCompatError> => {\n const padding = \" \".repeat(indent);\n\n switch (sel.kind) {\n case \"field\":\n return emitFieldSelection(sel, indent, variableNames, schema, parentTypeName);\n case \"fragmentSpread\":\n return ok(`${padding}...${sel.name}Fragment.spread(),`);\n case \"inlineFragment\":\n // This should not happen as inline fragments are handled separately\n return ok(\"\");\n }\n};\n\n/**\n * Emit inline fragments grouped as a union selection.\n * Format: { TypeA: ({ f }) => ({ ...fields }), TypeB: ({ f }) => ({ ...fields }), __typename: true }\n */\nconst emitInlineFragmentsAsUnion = (\n inlineFragments: readonly ParsedInlineFragment[],\n indent: number,\n variableNames: Set<string>,\n schema: SchemaIndex | null,\n includeTypename: boolean,\n): Result<string, GraphqlCompatError> => {\n const padding = \" \".repeat(indent);\n\n // Validate inline fragments have type conditions\n for (const frag of inlineFragments) {\n if (frag.onType === \"\") {\n return err({\n code: \"GRAPHQL_INLINE_FRAGMENT_WITHOUT_TYPE\",\n message: \"Inline fragments without type condition are not supported. Use `... on TypeName { }` syntax.\",\n });\n }\n }\n\n // Validate all inline fragments are on union types (not interfaces)\n for (const frag of inlineFragments) {\n if (schema && !schema.objects.has(frag.onType)) {\n // If it's not a known object type, it might be an interface\n // Check if any union contains this type as a member\n let isUnionMember = false;\n for (const [, unionDef] of schema.unions) {\n if (unionDef.members.has(frag.onType)) {\n isUnionMember = true;\n break;\n }\n }\n if (!isUnionMember) {\n return err({\n code: \"GRAPHQL_INLINE_FRAGMENT_ON_INTERFACE\",\n message: `Inline fragments on interface type \"${frag.onType}\" are not supported. Use union types instead.`,\n onType: frag.onType,\n });\n }\n }\n }\n\n // Build union member entries\n const entries: string[] = [];\n for (const frag of inlineFragments) {\n const innerPadding = \" \".repeat(indent + 1);\n // Use the inline fragment's type condition as the parent type for nested selections\n const fieldsResult = emitSelectionsInternal(frag.selections, indent + 2, variableNames, schema, frag.onType);\n if (fieldsResult.isErr()) {\n return err(fieldsResult.error);\n }\n\n entries.push(`${innerPadding}${frag.onType}: ({ f }) => ({\n${fieldsResult.value}\n${innerPadding}}),`);\n }\n\n // Include __typename: true inside union object when flag is set\n if (includeTypename) {\n const innerPadding = \" \".repeat(indent + 1);\n entries.push(`${innerPadding}__typename: true,`);\n }\n\n // Emit as spread with union callback: ...f.fieldName()({ Type: ... })\n // Note: This assumes the parent field handles the union - we emit just the union object\n return ok(`${padding}...({\n${entries.join(\"\\n\")}\n${padding}}),`);\n};\n\n/**\n * Emit a single field selection.\n */\nconst emitFieldSelection = (\n field: ParsedSelection & { kind: \"field\" },\n indent: number,\n variableNames: Set<string>,\n schema: SchemaIndex | null,\n parentTypeName: string | undefined,\n): Result<string, GraphqlCompatError> => {\n const padding = \" \".repeat(indent);\n\n // Extract optional fields for type narrowing\n const args = field.arguments;\n const selections = field.selections;\n const hasArgs = args && args.length > 0;\n const hasSelections = selections && selections.length > 0;\n\n // Use shorthand syntax for scalar fields (no args, no nested selections, no alias)\n if (!hasArgs && !hasSelections && !field.alias) {\n return ok(`${padding}${field.name}: true,`);\n }\n\n let line = `${padding}...f.${field.name}(`;\n\n if (hasArgs) {\n const argsResult = emitArguments(args, variableNames, schema, parentTypeName, field.name);\n if (argsResult.isErr()) {\n return err(argsResult.error);\n }\n line += argsResult.value;\n if (field.alias) {\n line += `, { alias: ${JSON.stringify(field.alias)} }`;\n }\n } else if (field.alias) {\n // No args but has alias: pass null for args, then alias option\n line += `null, { alias: ${JSON.stringify(field.alias)} }`;\n }\n\n line += \")\";\n\n if (hasSelections) {\n // Check if selections contain inline fragments (union field)\n const hasInlineFragments = selections.some((s) => s.kind === \"inlineFragment\");\n\n // Determine nested parent type for recursive selections\n const nestedParentType =\n schema && parentTypeName ? (getFieldReturnType(schema, parentTypeName, field.name) ?? undefined) : undefined;\n\n if (hasInlineFragments) {\n // Union field: emit with union callback pattern\n const nestedResult = emitSelectionsInternal(selections, indent + 1, variableNames, schema, nestedParentType);\n if (nestedResult.isErr()) {\n return err(nestedResult.error);\n }\n line += \"({\\n\";\n line += `${nestedResult.value}\\n`;\n line += `${padding}})`;\n } else {\n // Regular nested selections\n line += \"(({ f }) => ({\\n\";\n const nestedResult = emitSelectionsInternal(selections, indent + 1, variableNames, schema, nestedParentType);\n if (nestedResult.isErr()) {\n return err(nestedResult.error);\n }\n line += `${nestedResult.value}\\n`;\n line += `${padding}}))`;\n }\n }\n\n line += \",\";\n\n return ok(line);\n};\n\n// ============================================================================\n// List Coercion Utilities\n// ============================================================================\n\n/**\n * Check if a modifier represents a list type (contains []).\n */\nconst isListModifier = (modifier: string): boolean => {\n return modifier.includes(\"[]\");\n};\n\n/**\n * Determine if a value needs to be wrapped in an array for list coercion.\n * Returns true if:\n * - Expected type is a list\n * - Value is NOT already a list\n * - Value is NOT a variable (runtime handles coercion)\n * - Value is NOT null\n */\nconst needsListCoercion = (value: ParsedValue, expectedModifier: string | undefined): boolean => {\n // No coercion if no expected type info\n if (!expectedModifier) return false;\n\n // No coercion if expected type is not a list\n if (!isListModifier(expectedModifier)) return false;\n\n // No coercion for variables (runtime handles this)\n if (value.kind === \"variable\") return false;\n\n // No coercion for null\n if (value.kind === \"null\") return false;\n\n // No coercion if value is already a list\n if (value.kind === \"list\") return false;\n\n return true;\n};\n\n/**\n * Extract the element type from a list type by removing the outermost list modifier.\n * For example: \"![]!\" (non-null list of non-null) → \"!\" (non-null element)\n * \"?[]![]!\" (nested lists) → \"?[]!\" (inner list type)\n * Returns null if the modifier doesn't represent a list type.\n */\nconst getListElementType = (expectedType: TypeInfo): TypeInfo | null => {\n const { modifier, typeName } = expectedType;\n // Modifier format: {inner}{list_modifiers}\n // Strip the outermost list modifier ([]! or []?)\n const listMatch = modifier.match(/^(.+?)(\\[\\][!?])$/);\n if (!listMatch || !listMatch[1]) return null;\n return { typeName, modifier: listMatch[1] };\n};\n\n/**\n * Emit a value with type context for list coercion.\n */\nconst emitValueWithType = (\n value: ParsedValue,\n expectedType: TypeInfo | null,\n variableNames: Set<string>,\n schema: SchemaIndex | null,\n): Result<string, GraphqlCompatError> => {\n // Check if list coercion is needed\n const shouldCoerce = needsListCoercion(value, expectedType?.modifier);\n\n // Handle object values with recursive type context\n if (value.kind === \"object\" && expectedType && schema) {\n return emitObjectWithType(value, expectedType.typeName, variableNames, schema, shouldCoerce);\n }\n\n // Handle list values with recursive type context for element coercion\n if (value.kind === \"list\" && expectedType && schema) {\n const elementType = getListElementType(expectedType);\n if (elementType) {\n const values: string[] = [];\n for (const v of value.values) {\n const result = emitValueWithType(v, elementType, variableNames, schema);\n if (result.isErr()) return result;\n values.push(result.value);\n }\n return ok(`[${values.join(\", \")}]`);\n }\n }\n\n // Emit the value normally\n const result = emitValue(value, variableNames);\n if (result.isErr()) return result;\n\n // Wrap in array if coercion needed\n if (shouldCoerce) {\n return ok(`[${result.value}]`);\n }\n\n return result;\n};\n\n/**\n * Emit an object value with type context for recursive list coercion.\n */\nconst emitObjectWithType = (\n value: ParsedValue & { kind: \"object\" },\n inputTypeName: string,\n variableNames: Set<string>,\n schema: SchemaIndex,\n wrapInArray: boolean,\n): Result<string, GraphqlCompatError> => {\n if (value.fields.length === 0) {\n return ok(wrapInArray ? \"[{}]\" : \"{}\");\n }\n\n const entries: string[] = [];\n for (const f of value.fields) {\n // Look up field type from input object definition\n const fieldType = getInputFieldType(schema, inputTypeName, f.name);\n if (fieldType === null) {\n return err({\n code: \"GRAPHQL_UNKNOWN_FIELD\",\n message: `Unknown field \"${f.name}\" on input type \"${inputTypeName}\"`,\n typeName: inputTypeName,\n fieldName: f.name,\n });\n }\n\n const result = emitValueWithType(f.value, fieldType, variableNames, schema);\n if (result.isErr()) {\n return err(result.error);\n }\n entries.push(`${f.name}: ${result.value}`);\n }\n\n const objectStr = `{ ${entries.join(\", \")} }`;\n return ok(wrapInArray ? `[${objectStr}]` : objectStr);\n};\n\n// ============================================================================\n// Argument Emission\n// ============================================================================\n\n/**\n * Emit field arguments with type context for list coercion.\n */\nconst emitArguments = (\n args: readonly ParsedArgument[],\n variableNames: Set<string>,\n schema: SchemaIndex | null,\n parentTypeName: string | undefined,\n fieldName: string | undefined,\n): Result<string, GraphqlCompatError> => {\n if (args.length === 0) {\n return ok(\"\");\n }\n\n const argEntries: string[] = [];\n for (const arg of args) {\n // Look up expected type from schema\n const expectedType =\n schema && parentTypeName && fieldName ? getArgumentType(schema, parentTypeName, fieldName, arg.name) : null;\n\n const result = emitValueWithType(arg.value, expectedType, variableNames, schema);\n if (result.isErr()) {\n return err(result.error);\n }\n argEntries.push(`${arg.name}: ${result.value}`);\n }\n return ok(`{ ${argEntries.join(\", \")} }`);\n};\n\n/**\n * Emit a value (literal or variable reference).\n */\nconst emitValue = (value: ParsedValue, variableNames: Set<string>): Result<string, GraphqlCompatError> => {\n switch (value.kind) {\n case \"variable\":\n // Check if it's a declared variable\n if (variableNames.has(value.name)) {\n return ok(`$.${value.name}`);\n }\n return err({\n code: \"GRAPHQL_UNDECLARED_VARIABLE\",\n message: `Variable \"$${value.name}\" is not declared in the operation`,\n variableName: value.name,\n });\n case \"int\":\n case \"float\":\n return ok(value.value);\n case \"string\":\n return ok(JSON.stringify(value.value));\n case \"boolean\":\n return ok(value.value ? \"true\" : \"false\");\n case \"null\":\n return ok(\"null\");\n case \"enum\":\n // Enums are emitted as string literals in soda-gql\n return ok(JSON.stringify(value.value));\n case \"list\": {\n const values: string[] = [];\n for (const v of value.values) {\n const result = emitValue(v, variableNames);\n if (result.isErr()) {\n return err(result.error);\n }\n values.push(result.value);\n }\n return ok(`[${values.join(\", \")}]`);\n }\n case \"object\": {\n if (value.fields.length === 0) {\n return ok(\"{}\");\n }\n const entries: string[] = [];\n for (const f of value.fields) {\n const result = emitValue(f.value, variableNames);\n if (result.isErr()) {\n return err(result.error);\n }\n entries.push(`${f.name}: ${result.value}`);\n }\n return ok(`{ ${entries.join(\", \")} }`);\n }\n }\n};\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { err, ok } from \"neverthrow\";\n\nimport type { CodegenError } from \"./types\";\n\nconst templateContents = `\\\nimport { defineScalar } from \"@soda-gql/core\";\n\nexport const scalar = {\n ...defineScalar<\"ID\", string, string>(\"ID\"),\n ...defineScalar<\"String\", string, string>(\"String\"),\n ...defineScalar<\"Int\", number, number>(\"Int\"),\n ...defineScalar<\"Float\", number, number>(\"Float\"),\n ...defineScalar<\"Boolean\", boolean, boolean>(\"Boolean\"),\n} as const;\n`;\n\nexport const writeInjectTemplate = (outPath: string) => {\n const targetPath = resolve(outPath);\n\n try {\n if (existsSync(targetPath)) {\n return err<void, CodegenError>({\n code: \"INJECT_TEMPLATE_EXISTS\",\n message: `Inject module already exists: ${targetPath}`,\n outPath: targetPath,\n });\n }\n\n mkdirSync(dirname(targetPath), { recursive: true });\n writeFileSync(targetPath, `${templateContents}\\n`);\n return ok<void, CodegenError>(undefined);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return err<void, CodegenError>({\n code: \"INJECT_TEMPLATE_FAILED\",\n message,\n outPath: targetPath,\n });\n }\n};\n\nexport const getInjectTemplate = (): string => `${templateContents}\\n`;\n","/**\n * Schema type reachability analysis.\n *\n * Determines which types are reachable from root types (Query/Mutation/Subscription)\n * to specified target types (e.g., fragment onType values from .graphql files).\n * Produces a CompiledFilter for use with existing buildExclusionSet.\n *\n * @module\n */\n\nimport { type DocumentNode, Kind, type TypeNode } from \"graphql\";\n\nimport { createSchemaIndex } from \"./generator\";\nimport type { FilterContext } from \"./type-filter\";\n\ntype TypeGraph = {\n readonly forward: ReadonlyMap<string, ReadonlySet<string>>;\n readonly reverse: ReadonlyMap<string, ReadonlySet<string>>;\n};\n\nconst extractNamedType = (typeNode: TypeNode): string => {\n switch (typeNode.kind) {\n case Kind.NAMED_TYPE:\n return typeNode.name.value;\n case Kind.LIST_TYPE:\n return extractNamedType(typeNode.type);\n case Kind.NON_NULL_TYPE:\n return extractNamedType(typeNode.type);\n }\n};\n\nconst addEdge = (graph: Map<string, Set<string>>, from: string, to: string): void => {\n let edges = graph.get(from);\n if (!edges) {\n edges = new Set();\n graph.set(from, edges);\n }\n edges.add(to);\n};\n\nconst buildTypeGraph = (document: DocumentNode): { graph: TypeGraph; schema: ReturnType<typeof createSchemaIndex> } => {\n const schema = createSchemaIndex(document);\n const forward = new Map<string, Set<string>>();\n const reverse = new Map<string, Set<string>>();\n\n const addBidirectional = (from: string, to: string): void => {\n addEdge(forward, from, to);\n addEdge(reverse, to, from);\n };\n\n // Object types: fields return types + field argument types\n for (const [typeName, record] of schema.objects) {\n for (const field of record.fields.values()) {\n const returnType = extractNamedType(field.type);\n addBidirectional(typeName, returnType);\n\n if (field.arguments) {\n for (const arg of field.arguments) {\n const argType = extractNamedType(arg.type);\n addBidirectional(typeName, argType);\n }\n }\n }\n }\n\n // Input types: field types\n for (const [typeName, record] of schema.inputs) {\n for (const field of record.fields.values()) {\n const fieldType = extractNamedType(field.type);\n addBidirectional(typeName, fieldType);\n }\n }\n\n // Union types: member types\n for (const [typeName, record] of schema.unions) {\n for (const memberName of record.members.keys()) {\n addBidirectional(typeName, memberName);\n }\n }\n\n return {\n graph: { forward, reverse },\n schema,\n };\n};\n\n/**\n * BFS traversal collecting all reachable nodes from seeds.\n */\nconst bfs = (\n adjacency: ReadonlyMap<string, ReadonlySet<string>>,\n seeds: Iterable<string>,\n constraint?: ReadonlySet<string>,\n): Set<string> => {\n const visited = new Set<string>();\n const queue: string[] = [];\n\n for (const seed of seeds) {\n if (!visited.has(seed)) {\n visited.add(seed);\n queue.push(seed);\n }\n }\n\n let head = 0;\n while (head < queue.length) {\n const current = queue[head++];\n if (current === undefined) break;\n const neighbors = adjacency.get(current);\n if (!neighbors) continue;\n\n for (const neighbor of neighbors) {\n if (visited.has(neighbor)) continue;\n if (constraint && !constraint.has(neighbor)) continue;\n visited.add(neighbor);\n queue.push(neighbor);\n }\n }\n\n return visited;\n};\n\n/**\n * Compute the set of type names reachable on paths from root types to target types.\n *\n * Algorithm:\n * 1. Backward BFS from target types to find all upstream types\n * 2. Forward BFS from root types, constrained to upstream set, to find actual paths\n * 3. Collect input/enum/scalar types used as field arguments on reachable object types\n */\nconst computeReachableTypes = (\n graph: TypeGraph,\n schema: ReturnType<typeof createSchemaIndex>,\n targetTypes: ReadonlySet<string>,\n usedArgumentTypes?: ReadonlySet<string>,\n): Set<string> => {\n // Step 1: Backward BFS from targets\n const upstream = bfs(graph.reverse, targetTypes);\n\n // Step 2: Forward BFS from roots, constrained to upstream set\n const rootTypes: string[] = [];\n if (schema.operationTypes.query) rootTypes.push(schema.operationTypes.query);\n if (schema.operationTypes.mutation) rootTypes.push(schema.operationTypes.mutation);\n if (schema.operationTypes.subscription) rootTypes.push(schema.operationTypes.subscription);\n\n // Only start from roots that are in the upstream set (i.e., can reach a target)\n const validRoots = rootTypes.filter((r) => upstream.has(r));\n const pathTypes = bfs(graph.forward, validRoots, upstream);\n\n // Step 3: Collect argument types (inputs, enums, scalars) for reachable object types\n const reachable = new Set(pathTypes);\n const inputQueue: string[] = [];\n\n for (const typeName of pathTypes) {\n const objectRecord = schema.objects.get(typeName);\n if (!objectRecord) continue;\n\n for (const field of objectRecord.fields.values()) {\n // Collect field return type scalars/enums referenced by reachable types\n const returnType = extractNamedType(field.type);\n if (!reachable.has(returnType)) {\n // Include scalars (both custom and builtin) and enums\n const isKnownComposite = schema.objects.has(returnType) || schema.inputs.has(returnType) || schema.unions.has(returnType);\n if (!isKnownComposite) {\n // It's a scalar (builtin or custom) or enum\n reachable.add(returnType);\n }\n }\n\n // Collect argument types (only when usedArgumentTypes is not provided)\n if (!usedArgumentTypes && field.arguments) {\n for (const arg of field.arguments) {\n const argType = extractNamedType(arg.type);\n if (!reachable.has(argType)) {\n reachable.add(argType);\n if (schema.inputs.has(argType)) {\n inputQueue.push(argType);\n }\n }\n }\n }\n }\n }\n\n // When usedArgumentTypes is provided, seed from it instead of field arguments\n if (usedArgumentTypes) {\n for (const inputName of usedArgumentTypes) {\n if (!reachable.has(inputName)) {\n reachable.add(inputName);\n inputQueue.push(inputName);\n }\n }\n }\n\n // Transitively resolve input types\n let inputHead = 0;\n while (inputHead < inputQueue.length) {\n const inputName = inputQueue[inputHead++];\n if (inputName === undefined) break;\n const inputRecord = schema.inputs.get(inputName);\n if (!inputRecord) continue;\n\n for (const field of inputRecord.fields.values()) {\n const fieldType = extractNamedType(field.type);\n if (!reachable.has(fieldType)) {\n reachable.add(fieldType);\n if (schema.inputs.has(fieldType)) {\n inputQueue.push(fieldType);\n }\n }\n }\n }\n\n return reachable;\n};\n\nexport type ReachabilityResult = {\n readonly filter: (context: FilterContext) => boolean;\n readonly warnings: readonly string[];\n};\n\n/**\n * Compute a filter function that includes only types reachable from root types\n * to the specified target types.\n *\n * When targetTypes is empty, returns a pass-all filter (no filtering).\n * Warns when target types are not found in the schema.\n *\n * @param document - The parsed GraphQL schema document\n * @param targetTypes - Set of type names that fragments target (e.g., from ParsedFragment.onType)\n * @returns Filter function and any warnings\n */\nexport const computeReachabilityFilter = (\n document: DocumentNode,\n targetTypes: ReadonlySet<string>,\n usedArgumentTypes?: ReadonlySet<string>,\n): ReachabilityResult => {\n if (targetTypes.size === 0) {\n return { filter: () => true, warnings: [] };\n }\n\n const { graph, schema } = buildTypeGraph(document);\n\n // Validate target types exist in schema\n const allTypeNames = new Set([\n ...schema.objects.keys(),\n ...schema.inputs.keys(),\n ...schema.enums.keys(),\n ...schema.unions.keys(),\n ...schema.scalars.keys(),\n ]);\n const warnings: string[] = [];\n const validTargets = new Set<string>();\n for (const target of targetTypes) {\n if (allTypeNames.has(target)) {\n validTargets.add(target);\n } else {\n warnings.push(`Target type \"${target}\" not found in schema`);\n }\n }\n\n if (validTargets.size === 0) {\n return { filter: () => true, warnings };\n }\n\n const reachable = computeReachableTypes(graph, schema, validTargets, usedArgumentTypes);\n\n if (reachable.size === 0) {\n warnings.push(\n `No types reachable from root operations to target types: ${[...validTargets].join(\", \")}; skipping reachability filter`,\n );\n return { filter: () => true, warnings };\n }\n\n return {\n filter: (context: FilterContext) => reachable.has(context.name),\n warnings,\n };\n};\n","import { extname } from \"node:path\";\nimport { build } from \"esbuild\";\nimport { err, ok } from \"neverthrow\";\nimport type { Bundler } from \"./types\";\n\nexport const esbuildBundler: Bundler = {\n name: \"esbuild\",\n bundle: async ({ sourcePath, external }) => {\n try {\n const sourceExt = extname(sourcePath);\n const baseName = sourcePath.slice(0, -sourceExt.length);\n const cjsPath = `${baseName}.cjs`;\n\n await build({\n entryPoints: [sourcePath],\n outfile: cjsPath,\n format: \"cjs\",\n platform: \"node\",\n bundle: true,\n external: [...external],\n sourcemap: false,\n minify: false,\n treeShaking: false,\n });\n\n return ok({ cjsPath });\n } catch (error) {\n return err({\n code: \"EMIT_FAILED\" as const,\n message: `[esbuild] Failed to bundle: ${error instanceof Error ? error.message : String(error)}`,\n outPath: sourcePath,\n });\n }\n },\n};\n","/**\n * Definition file generator for split codegen.\n * Generates separate files for each definition category (enums, inputs, objects, unions).\n */\n\nexport type DefinitionCategory = \"enums\" | \"inputs\" | \"objects\" | \"unions\";\n\nexport type DefinitionVar = {\n readonly name: string;\n readonly code: string;\n};\n\n/**\n * Split an array into chunks of the specified size.\n */\nexport const chunkArray = <T>(array: readonly T[], size: number): T[][] => {\n if (size <= 0) {\n return [Array.from(array)];\n }\n\n const result: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n result.push(array.slice(i, i + size));\n }\n\n return result;\n};\n\n/**\n * Determine if chunking is needed based on the number of definitions.\n */\nexport const needsChunking = (vars: readonly DefinitionVar[], chunkSize: number): boolean => {\n return vars.length > chunkSize;\n};\n\ntype DefinitionFileOptions = {\n readonly category: DefinitionCategory;\n readonly schemaName: string;\n readonly vars: readonly DefinitionVar[];\n readonly needsDefineEnum: boolean;\n};\n\n/**\n * Generate a single definition file content.\n */\nexport const generateDefinitionFile = (options: DefinitionFileOptions): string => {\n const { category, vars, needsDefineEnum } = options;\n\n if (vars.length === 0) {\n return `/**\n * ${category} definitions (empty)\n * @generated by @soda-gql/tools/codegen\n */\n`;\n }\n\n const imports: string[] = [];\n if (needsDefineEnum && category === \"enums\") {\n imports.push('import { defineEnum } from \"@soda-gql/core\";');\n }\n\n const importsBlock = imports.length > 0 ? `${imports.join(\"\\n\")}\\n\\n` : \"\";\n const exportStatements = vars.map((v) => `export ${v.code}`).join(\"\\n\");\n\n return `/**\n * ${category} definitions\n * @generated by @soda-gql/tools/codegen\n */\n${importsBlock}${exportStatements}\n`;\n};\n\ntype ChunkFileOptions = {\n readonly category: DefinitionCategory;\n readonly schemaName: string;\n readonly vars: readonly DefinitionVar[];\n readonly chunkIndex: number;\n readonly needsDefineEnum: boolean;\n};\n\n/**\n * Generate a chunk file content.\n */\nexport const generateChunkFile = (options: ChunkFileOptions): string => {\n const { category, vars, chunkIndex, needsDefineEnum } = options;\n\n if (vars.length === 0) {\n return `/**\n * ${category} chunk ${chunkIndex} (empty)\n * @generated by @soda-gql/tools/codegen\n */\n`;\n }\n\n const imports: string[] = [];\n if (needsDefineEnum && category === \"enums\") {\n imports.push('import { defineEnum } from \"@soda-gql/core\";');\n }\n\n const importsBlock = imports.length > 0 ? `${imports.join(\"\\n\")}\\n\\n` : \"\";\n const exportStatements = vars.map((v) => `export ${v.code}`).join(\"\\n\");\n\n return `/**\n * ${category} chunk ${chunkIndex}\n * @generated by @soda-gql/tools/codegen\n */\n${importsBlock}${exportStatements}\n`;\n};\n\ntype ChunkIndexOptions = {\n readonly category: DefinitionCategory;\n readonly chunkCount: number;\n readonly varNames: readonly string[];\n};\n\n/**\n * Generate the index file that re-exports all chunks.\n */\nexport const generateChunkIndex = (options: ChunkIndexOptions): string => {\n const { category, chunkCount } = options;\n\n const reExports = Array.from({ length: chunkCount }, (_, i) => `export * from \"./chunk-${i}\";`).join(\"\\n\");\n\n return `/**\n * ${category} index (re-exports all chunks)\n * @generated by @soda-gql/tools/codegen\n */\n${reExports}\n`;\n};\n\nexport type ChunkedDefinitionFiles = {\n readonly indexContent: string;\n readonly chunks: ReadonlyArray<{\n readonly chunkIndex: number;\n readonly content: string;\n readonly varNames: readonly string[];\n }>;\n};\n\n/**\n * Generate chunked definition files.\n */\nexport const generateChunkedDefinitionFiles = (\n category: DefinitionCategory,\n schemaName: string,\n vars: readonly DefinitionVar[],\n chunkSize: number,\n): ChunkedDefinitionFiles => {\n const chunks = chunkArray(vars, chunkSize);\n const needsDefineEnum = category === \"enums\";\n\n const chunkContents = chunks.map((chunkVars, chunkIndex) => ({\n chunkIndex,\n content: generateChunkFile({\n category,\n schemaName,\n vars: chunkVars,\n chunkIndex,\n needsDefineEnum,\n }),\n varNames: chunkVars.map((v) => v.name),\n }));\n\n const allVarNames = vars.map((v) => v.name);\n const indexContent = generateChunkIndex({\n category,\n chunkCount: chunks.length,\n varNames: allVarNames,\n });\n\n return {\n indexContent,\n chunks: chunkContents,\n };\n};\n\ntype DefsDirectoryStructure = {\n readonly files: ReadonlyArray<{\n readonly relativePath: string;\n readonly content: string;\n }>;\n readonly importPaths: Record<DefinitionCategory, string>;\n};\n\nexport type CategoryVars = {\n readonly enums: readonly DefinitionVar[];\n readonly inputs: readonly DefinitionVar[];\n readonly objects: readonly DefinitionVar[];\n readonly unions: readonly DefinitionVar[];\n};\n\n/**\n * Generate the complete _defs directory structure.\n */\nexport const generateDefsStructure = (\n schemaName: string,\n categoryVars: CategoryVars,\n chunkSize: number,\n): DefsDirectoryStructure => {\n const files: Array<{ relativePath: string; content: string }> = [];\n const importPaths: Record<DefinitionCategory, string> = {\n enums: \"./_defs/enums\",\n inputs: \"./_defs/inputs\",\n objects: \"./_defs/objects\",\n unions: \"./_defs/unions\",\n };\n\n const categories: DefinitionCategory[] = [\"enums\", \"inputs\", \"objects\", \"unions\"];\n\n for (const category of categories) {\n const vars = categoryVars[category];\n const needsDefineEnum = category === \"enums\";\n\n if (needsChunking(vars, chunkSize)) {\n // Generate chunked files\n const chunked = generateChunkedDefinitionFiles(category, schemaName, vars, chunkSize);\n\n // Update import path to point to the directory (which has index.ts)\n importPaths[category] = `./_defs/${category}`;\n\n // Add index file\n files.push({\n relativePath: `_defs/${category}/index.ts`,\n content: chunked.indexContent,\n });\n\n // Add chunk files\n for (const chunk of chunked.chunks) {\n files.push({\n relativePath: `_defs/${category}/chunk-${chunk.chunkIndex}.ts`,\n content: chunk.content,\n });\n }\n } else {\n // Generate single file\n const content = generateDefinitionFile({\n category,\n schemaName,\n vars,\n needsDefineEnum,\n });\n\n files.push({\n relativePath: `_defs/${category}.ts`,\n content,\n });\n }\n }\n\n return { files, importPaths };\n};\n","import { mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { err, ok } from \"neverthrow\";\n\nimport type { CodegenError } from \"./types\";\n\nexport const removeDirectory = (dirPath: string) => {\n const targetPath = resolve(dirPath);\n try {\n rmSync(targetPath, { recursive: true, force: true });\n return ok<void, CodegenError>(undefined);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return err<void, CodegenError>({\n code: \"REMOVE_FAILED\",\n message,\n outPath: targetPath,\n });\n }\n};\n\nexport const readModule = (filePath: string) => {\n const targetPath = resolve(filePath);\n try {\n const content = readFileSync(targetPath, \"utf-8\");\n return ok<string, CodegenError>(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return err<string, CodegenError>({\n code: \"READ_FAILED\",\n message,\n outPath: targetPath,\n });\n }\n};\n\nexport const writeModule = (outPath: string, contents: string) => {\n const targetPath = resolve(outPath);\n\n try {\n mkdirSync(dirname(targetPath), { recursive: true });\n writeFileSync(targetPath, contents);\n return ok<void, CodegenError>(undefined);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return err<void, CodegenError>({\n code: \"EMIT_FAILED\",\n message,\n outPath: targetPath,\n });\n }\n};\n","import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { concatAST, type DocumentNode, parse, print } from \"graphql\";\nimport { err, ok } from \"neverthrow\";\n\nimport type { CodegenError } from \"./types\";\n\n/**\n * Load a single schema file.\n * @internal Use loadSchema for public API.\n */\nexport const loadSingleSchema = (schemaPath: string) => {\n const resolvedPath = resolve(schemaPath);\n\n if (!existsSync(resolvedPath)) {\n return err<DocumentNode, CodegenError>({\n code: \"SCHEMA_NOT_FOUND\",\n message: `Schema file not found at ${resolvedPath}`,\n schemaPath: resolvedPath,\n });\n }\n\n try {\n const schemaSource = readFileSync(resolvedPath, \"utf8\");\n const document = parse(schemaSource);\n return ok<DocumentNode, CodegenError>(document);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return err<DocumentNode, CodegenError>({\n code: \"SCHEMA_INVALID\",\n message: `SchemaValidationError: ${message}`,\n schemaPath: resolvedPath,\n });\n }\n};\n\n/**\n * Load and merge multiple schema files into a single DocumentNode.\n * Uses GraphQL's concatAST to combine definitions from all files.\n */\nexport const loadSchema = (schemaPaths: readonly string[]) => {\n const documents: DocumentNode[] = [];\n\n for (const schemaPath of schemaPaths) {\n const result = loadSingleSchema(schemaPath);\n if (result.isErr()) {\n return err<DocumentNode, CodegenError>(result.error);\n }\n documents.push(result.value);\n }\n\n // Merge all documents into one\n const merged = concatAST(documents);\n return ok<DocumentNode, CodegenError>(merged);\n};\n\nexport const hashSchema = (document: DocumentNode): string => createHash(\"sha256\").update(print(document)).digest(\"hex\");\n","import { existsSync } from \"node:fs\";\nimport { basename, dirname, extname, join, relative, resolve } from \"node:path\";\nimport type { TypeFilterConfig } from \"@soda-gql/config\";\nimport { err, ok } from \"neverthrow\";\nimport { defaultBundler } from \"./bundler\";\nimport { generateDefsStructure } from \"./defs-generator\";\nimport { readModule, removeDirectory, writeModule } from \"./file\";\nimport { createSchemaIndex, generateIndexModule, generateMultiSchemaModule, generatePrebuiltStub } from \"./generator\";\nimport { hashSchema, loadSchema } from \"./schema\";\nimport type { CodegenOptions, CodegenResult, CodegenSuccess } from \"./types\";\n\nconst extensionMap: Record<string, string> = {\n \".ts\": \".js\",\n \".tsx\": \".js\",\n \".mts\": \".mjs\",\n \".cts\": \".cjs\",\n \".js\": \".js\",\n \".mjs\": \".mjs\",\n \".cjs\": \".cjs\",\n};\n\ntype ImportSpecifierOptions = {\n includeExtension?: boolean;\n};\n\nconst toImportSpecifier = (fromPath: string, targetPath: string, options?: ImportSpecifierOptions): string => {\n const fromDir = dirname(fromPath);\n const normalized = relative(fromDir, targetPath).replace(/\\\\/g, \"/\");\n const sourceExt = extname(targetPath);\n\n // When includeExtension is false (default), strip the extension entirely\n if (!options?.includeExtension) {\n if (normalized.length === 0) {\n return `./${basename(targetPath, sourceExt)}`;\n }\n const withPrefix = normalized.startsWith(\".\") ? normalized : `./${normalized}`;\n const currentExt = extname(withPrefix);\n return currentExt ? withPrefix.slice(0, -currentExt.length) : withPrefix;\n }\n\n // When includeExtension is true, convert to runtime extension\n const runtimeExt = extensionMap[sourceExt] ?? sourceExt;\n\n if (normalized.length === 0) {\n const base = runtimeExt !== sourceExt ? basename(targetPath, sourceExt) : basename(targetPath);\n return `./${base}${runtimeExt}`;\n }\n\n const withPrefix = normalized.startsWith(\".\") ? normalized : `./${normalized}`;\n if (!runtimeExt) {\n return withPrefix;\n }\n if (withPrefix.endsWith(runtimeExt)) {\n return withPrefix;\n }\n\n const currentExt = extname(withPrefix);\n const withoutExt = currentExt ? withPrefix.slice(0, -currentExt.length) : withPrefix;\n return `${withoutExt}${runtimeExt}`;\n};\n\nexport const runCodegen = async (options: CodegenOptions): Promise<CodegenResult> => {\n const outPath = resolve(options.outPath);\n const importSpecifierOptions = { includeExtension: options.importExtension };\n\n // Validate that all schema and inject files exist\n for (const [schemaName, schemaConfig] of Object.entries(options.schemas)) {\n const scalarPath = resolve(schemaConfig.inject.scalars);\n if (!existsSync(scalarPath)) {\n return err({\n code: \"INJECT_MODULE_NOT_FOUND\",\n message: `Scalar module not found for schema '${schemaName}': ${scalarPath}`,\n injectPath: scalarPath,\n });\n }\n\n if (schemaConfig.inject.adapter) {\n const adapterPath = resolve(schemaConfig.inject.adapter);\n if (!existsSync(adapterPath)) {\n return err({\n code: \"INJECT_MODULE_NOT_FOUND\",\n message: `Adapter module not found for schema '${schemaName}': ${adapterPath}`,\n injectPath: adapterPath,\n });\n }\n }\n }\n\n // Load all schemas (use preloaded when available)\n const schemas = new Map<string, import(\"graphql\").DocumentNode>();\n const schemaHashes: Record<string, { schemaHash: string; objects: number; enums: number; inputs: number; unions: number }> = {};\n\n for (const [name, schemaConfig] of Object.entries(options.schemas)) {\n const preloaded = options.preloadedSchemas?.get(name);\n if (preloaded) {\n schemas.set(name, preloaded);\n } else {\n const result = await loadSchema(schemaConfig.schema).match(\n (doc) => Promise.resolve(ok(doc)),\n (error) => Promise.resolve(err(error)),\n );\n\n if (result.isErr()) {\n return err(result.error);\n }\n\n schemas.set(name, result.value);\n }\n }\n\n // Build injection config for each schema\n const injectionConfig = new Map<\n string,\n {\n scalarImportPath: string;\n adapterImportPath?: string;\n }\n >();\n\n for (const [schemaName, schemaConfig] of Object.entries(options.schemas)) {\n const injectConfig = schemaConfig.inject;\n\n injectionConfig.set(schemaName, {\n scalarImportPath: toImportSpecifier(outPath, resolve(injectConfig.scalars), importSpecifierOptions),\n ...(injectConfig.adapter\n ? { adapterImportPath: toImportSpecifier(outPath, resolve(injectConfig.adapter), importSpecifierOptions) }\n : {}),\n });\n }\n\n // Build defaultInputDepth and inputDepthOverrides config for each schema\n const defaultInputDepthConfig = new Map<string, number>();\n const inputDepthOverridesConfig = new Map<string, Readonly<Record<string, number>>>();\n\n for (const [schemaName, schemaConfig] of Object.entries(options.schemas)) {\n if (schemaConfig.defaultInputDepth !== undefined && schemaConfig.defaultInputDepth !== 3) {\n defaultInputDepthConfig.set(schemaName, schemaConfig.defaultInputDepth);\n }\n if (schemaConfig.inputDepthOverrides && Object.keys(schemaConfig.inputDepthOverrides).length > 0) {\n inputDepthOverridesConfig.set(schemaName, schemaConfig.inputDepthOverrides);\n }\n }\n\n // Get chunkSize config (default: 100)\n const chunkSize = options.chunkSize ?? 100;\n\n // Build typeFilters config for each schema\n const typeFiltersConfig = new Map<string, TypeFilterConfig>();\n for (const [schemaName, schemaConfig] of Object.entries(options.schemas)) {\n if (schemaConfig.typeFilter) {\n typeFiltersConfig.set(schemaName, schemaConfig.typeFilter);\n }\n }\n\n // Generate multi-schema module (this becomes _internal.ts content)\n const {\n code: internalCode,\n injectsCode,\n categoryVars,\n } = generateMultiSchemaModule(schemas, {\n injection: injectionConfig,\n defaultInputDepth: defaultInputDepthConfig.size > 0 ? defaultInputDepthConfig : undefined,\n inputDepthOverrides: inputDepthOverridesConfig.size > 0 ? inputDepthOverridesConfig : undefined,\n chunkSize,\n typeFilters: typeFiltersConfig.size > 0 ? typeFiltersConfig : undefined,\n });\n\n // Generate index.ts wrapper with prebuilt-style typing\n const schemaNames = Object.keys(options.schemas);\n\n // Collect field names and calculate stats/hashes per schema\n const allFieldNames = new Map<string, string[]>();\n for (const [name, document] of schemas.entries()) {\n const schemaIndex = createSchemaIndex(document);\n\n // Collect field names from all object types\n const fieldNameSet = new Set<string>();\n for (const [objectName, record] of schemaIndex.objects.entries()) {\n if (objectName.startsWith(\"__\")) continue;\n for (const fieldName of record.fields.keys()) {\n fieldNameSet.add(fieldName);\n }\n }\n allFieldNames.set(name, Array.from(fieldNameSet).sort());\n\n // Calculate stats and hash\n const objects = Array.from(schemaIndex.objects.keys()).filter((n) => !n.startsWith(\"__\")).length;\n const enums = Array.from(schemaIndex.enums.keys()).filter((n) => !n.startsWith(\"__\")).length;\n const inputs = Array.from(schemaIndex.inputs.keys()).filter((n) => !n.startsWith(\"__\")).length;\n const unions = Array.from(schemaIndex.unions.keys()).filter((n) => !n.startsWith(\"__\")).length;\n\n schemaHashes[name] = {\n schemaHash: hashSchema(document),\n objects,\n enums,\n inputs,\n unions,\n };\n }\n\n const indexCode = generateIndexModule(schemaNames, allFieldNames);\n\n // Write _internal-injects.ts (adapter imports only, referenced by both _internal.ts and prebuilt)\n const injectsPath = join(dirname(outPath), \"_internal-injects.ts\");\n if (injectsCode) {\n const injectsWriteResult = await writeModule(injectsPath, injectsCode).match(\n () => Promise.resolve(ok(undefined)),\n (error) => Promise.resolve(err(error)),\n );\n\n if (injectsWriteResult.isErr()) {\n return err(injectsWriteResult.error);\n }\n }\n\n // Write _defs/ files (always enabled)\n const defsPaths: string[] = [];\n if (categoryVars) {\n const outDir = dirname(outPath);\n\n // Clean up existing _defs directory to prevent stale files\n const defsDir = join(outDir, \"_defs\");\n if (existsSync(defsDir)) {\n const removeResult = removeDirectory(defsDir);\n if (removeResult.isErr()) {\n return err(removeResult.error);\n }\n }\n\n // Merge all schema categoryVars into a single combined structure\n // This ensures all definitions from all schemas go into the same defs files\n type DefinitionVar = { name: string; code: string };\n const combinedVars = {\n enums: [] as DefinitionVar[],\n inputs: [] as DefinitionVar[],\n objects: [] as DefinitionVar[],\n unions: [] as DefinitionVar[],\n };\n\n for (const vars of Object.values(categoryVars)) {\n combinedVars.enums.push(...vars.enums);\n combinedVars.inputs.push(...vars.inputs);\n combinedVars.objects.push(...vars.objects);\n combinedVars.unions.push(...vars.unions);\n }\n\n // Generate defs structure for all schemas combined\n const defsStructure = generateDefsStructure(\"combined\", combinedVars, chunkSize);\n\n for (const file of defsStructure.files) {\n const filePath = join(outDir, file.relativePath);\n\n // writeModule handles directory creation internally via mkdirSync\n const writeResult = await writeModule(filePath, file.content).match(\n () => Promise.resolve(ok(undefined)),\n (error) => Promise.resolve(err(error)),\n );\n\n if (writeResult.isErr()) {\n return err(writeResult.error);\n }\n\n defsPaths.push(filePath);\n }\n }\n\n // Write _internal.ts (implementation)\n const internalPath = join(dirname(outPath), \"_internal.ts\");\n const internalWriteResult = await writeModule(internalPath, internalCode).match(\n () => Promise.resolve(ok(undefined)),\n (error) => Promise.resolve(err(error)),\n );\n\n if (internalWriteResult.isErr()) {\n return err(internalWriteResult.error);\n }\n\n // Write index.ts (re-export wrapper)\n const indexWriteResult = await writeModule(outPath, indexCode).match(\n () => Promise.resolve(ok(undefined)),\n (error) => Promise.resolve(err(error)),\n );\n\n if (indexWriteResult.isErr()) {\n return err(indexWriteResult.error);\n }\n\n // Write types.prebuilt.ts stub — additive patching for new schemas\n const prebuiltStubPath = join(dirname(outPath), \"types.prebuilt.ts\");\n if (!existsSync(prebuiltStubPath)) {\n // File doesn't exist: write full stub\n const prebuiltStubCode = generatePrebuiltStub(schemaNames);\n const prebuiltWriteResult = await writeModule(prebuiltStubPath, prebuiltStubCode).match(\n () => Promise.resolve(ok(undefined)),\n (error) => Promise.resolve(err(error)),\n );\n\n if (prebuiltWriteResult.isErr()) {\n return err(prebuiltWriteResult.error);\n }\n } else {\n // File exists: check for missing schema stubs and append\n const readResult = readModule(prebuiltStubPath);\n if (readResult.isErr()) {\n return err(readResult.error);\n }\n const existingContent = readResult.value;\n const existingNames = new Set<string>();\n for (const match of existingContent.matchAll(/export type PrebuiltTypes_(\\w+)/g)) {\n const name = match[1];\n if (name) existingNames.add(name);\n }\n const missingNames = schemaNames.filter((name) => !existingNames.has(name));\n if (missingNames.length > 0) {\n const missingStubs = generatePrebuiltStub(missingNames);\n // Extract only the type declarations (skip the header comment)\n const stubDeclarations = missingStubs.replace(/^\\/\\*\\*[\\s\\S]*?\\*\\/\\n\\n/, \"\");\n const updatedContent = `${existingContent.trimEnd()}\\n\\n${stubDeclarations}`;\n const patchResult = writeModule(prebuiltStubPath, updatedContent);\n if (patchResult.isErr()) {\n return err(patchResult.error);\n }\n }\n }\n\n // Bundle the generated module\n const bundleOutcome = await defaultBundler.bundle({\n sourcePath: outPath,\n external: [\"@soda-gql/core\", \"@soda-gql/core/runtime\"],\n });\n const bundleResult = bundleOutcome.match(\n (result) => ok(result),\n (error) => err(error),\n );\n\n if (bundleResult.isErr()) {\n return err(bundleResult.error);\n }\n\n return ok({\n schemas: schemaHashes,\n outPath,\n internalPath,\n injectsPath,\n cjsPath: bundleResult.value.cjsPath,\n ...(defsPaths.length > 0 ? { defsPaths } : {}),\n } satisfies CodegenSuccess);\n};\n","/**\n * Prebuilt types emitter.\n *\n * Generates TypeScript type definitions for PrebuiltTypes registry\n * from field selection data and schema.\n *\n * ## Error Handling Strategy\n *\n * The emitter uses a partial failure approach for type calculation errors:\n *\n * **Recoverable errors** (result in warnings, element skipped):\n * - Type calculation failures (e.g., `calculateFieldsType` throws)\n * - Input type generation failures (e.g., `generateInputType` throws)\n * - These are caught per-element, logged as warnings, and the element is omitted\n *\n * **Fatal errors** (result in error result):\n * - `SCHEMA_NOT_FOUND`: Selection references non-existent schema\n * - `WRITE_FAILED`: Cannot write output file to disk\n *\n * This allows builds to succeed with partial type coverage when some elements\n * have issues, while providing visibility into problems via warnings.\n *\n * @module\n */\n\nimport { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type BuilderError, builderErrors, type FieldSelectionsMap } from \"@soda-gql/builder\";\nimport type { AnyGraphqlSchema, InputTypeSpecifiers, TypeFormatters } from \"@soda-gql/core\";\nimport {\n calculateFieldsType,\n generateInputObjectType,\n generateInputType,\n generateInputTypeFromVarDefs,\n parseInputSpecifier,\n} from \"@soda-gql/core\";\nimport { Kind, type TypeNode, type VariableDefinitionNode } from \"graphql\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport type { TypegenError } from \"./errors\";\n\n/**\n * Options for emitting prebuilt types.\n */\nexport type PrebuiltTypesEmitterOptions = {\n /**\n * Schema definitions per schema name.\n * These come from the codegen output.\n */\n readonly schemas: Record<string, AnyGraphqlSchema>;\n /**\n * Field selections extracted from the builder.\n */\n readonly fieldSelections: FieldSelectionsMap;\n /**\n * Output directory (where types.prebuilt.ts should be written).\n * This should be the same as config.outdir.\n */\n readonly outdir: string;\n /**\n * Relative import path to _internal-injects.ts from types.prebuilt.ts.\n * Example: \"./_internal-injects\"\n */\n readonly injectsModulePath: string;\n};\n\ntype PrebuiltFragmentEntry = {\n readonly key: string;\n readonly typename: string;\n readonly inputType: string;\n readonly outputType: string;\n};\n\ntype PrebuiltOperationEntry = {\n readonly key: string;\n readonly inputType: string;\n readonly outputType: string;\n};\n\ntype SchemaGroup = {\n fragments: PrebuiltFragmentEntry[];\n operations: PrebuiltOperationEntry[];\n inputObjects: Set<string>;\n};\n\ntype GroupBySchemaResult = {\n readonly grouped: Map<string, SchemaGroup>;\n readonly warnings: string[];\n readonly skippedFragmentCount: number;\n};\n\n/**\n * Group field selections by schema.\n * Uses the schemaLabel from each selection to group them correctly.\n *\n * Fragments without a 'key' property are skipped (not included in PrebuiltTypes)\n * and a warning is added. This allows projects to use fragments without keys\n * while still generating prebuilt types for those that have keys.\n *\n * @returns Result containing grouped selections and warnings, or error if schema not found\n */\nconst groupBySchema = (\n fieldSelections: FieldSelectionsMap,\n schemas: Record<string, AnyGraphqlSchema>,\n): Result<GroupBySchemaResult, BuilderError | TypegenError> => {\n const grouped = new Map<string, SchemaGroup>();\n const warnings: string[] = [];\n let skippedFragmentCount = 0;\n\n // Initialize groups for each schema\n for (const schemaName of Object.keys(schemas)) {\n grouped.set(schemaName, { fragments: [], operations: [], inputObjects: new Set() });\n }\n\n for (const [canonicalId, selection] of fieldSelections) {\n // Use schemaLabel to determine which schema this selection belongs to\n const schemaName = selection.schemaLabel;\n const schema = schemas[schemaName];\n const group = grouped.get(schemaName);\n\n if (!schema || !group) {\n return err(builderErrors.schemaNotFound(schemaName, canonicalId));\n }\n\n // Create formatters for schema-specific type names\n const outputFormatters: TypeFormatters = {\n scalarOutput: (name) => `ScalarOutput_${schemaName}<\"${name}\">`,\n };\n const inputFormatters: TypeFormatters = {\n scalarInput: (name) => `ScalarInput_${schemaName}<\"${name}\">`,\n inputObject: (name) => `Input_${schemaName}_${name}`,\n };\n\n if (selection.type === \"fragment\") {\n // Skip fragments without keys (they won't be included in PrebuiltTypes)\n if (!selection.key) {\n skippedFragmentCount++;\n warnings.push(\n `[prebuilt] Fragment \"${canonicalId}\" skipped: missing 'key' property. ` +\n `Use tagged template syntax fragment(\"Name\", \"Type\")\\`{ ... }\\` to auto-assign a key, ` +\n `or set 'key' explicitly in the callback builder.`,\n );\n continue;\n }\n\n try {\n // Collect input objects used in fragment variables\n const usedInputObjects = collectUsedInputObjectsFromVarDefs(schema, selection.variableDefinitions);\n for (const inputName of usedInputObjects) {\n group.inputObjects.add(inputName);\n }\n\n // Generate output type with schema-specific scalar names\n const outputType = calculateFieldsType(schema, selection.fields, outputFormatters, selection.typename);\n\n // Generate input type from variableDefinitions with schema-specific names\n const hasVariables = Object.keys(selection.variableDefinitions).length > 0;\n const inputType = hasVariables\n ? generateInputTypeFromVarDefs(schema, selection.variableDefinitions, { formatters: inputFormatters })\n : \"void\";\n\n group.fragments.push({\n key: selection.key,\n typename: selection.typename,\n inputType,\n outputType,\n });\n } catch (error) {\n warnings.push(\n `[prebuilt] Failed to calculate type for fragment \"${selection.key}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n } else if (selection.type === \"operation\") {\n try {\n // Collect input objects used in this operation\n const usedInputObjects = collectUsedInputObjects(schema, selection.variableDefinitions);\n for (const inputName of usedInputObjects) {\n group.inputObjects.add(inputName);\n }\n\n // Generate output type with schema-specific scalar names\n // Get the root type name from schema operations (Query, Mutation, Subscription)\n const rootTypeName = schema.operations[selection.operationType as keyof typeof schema.operations];\n const outputType = calculateFieldsType(schema, selection.fields, outputFormatters, rootTypeName ?? undefined);\n\n // Generate input type with schema-specific scalar and input object names\n const inputType = generateInputType(schema, selection.variableDefinitions, inputFormatters);\n\n group.operations.push({\n key: selection.operationName,\n inputType,\n outputType,\n });\n } catch (error) {\n warnings.push(\n `[prebuilt] Failed to calculate type for operation \"${selection.operationName}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n }\n\n return ok({ grouped, warnings, skippedFragmentCount });\n};\n\n/**\n * Extract input object names from a GraphQL TypeNode.\n */\nconst extractInputObjectsFromType = (schema: AnyGraphqlSchema, typeNode: TypeNode, inputObjects: Set<string>): void => {\n switch (typeNode.kind) {\n case Kind.NON_NULL_TYPE:\n extractInputObjectsFromType(schema, typeNode.type, inputObjects);\n break;\n case Kind.LIST_TYPE:\n extractInputObjectsFromType(schema, typeNode.type, inputObjects);\n break;\n case Kind.NAMED_TYPE: {\n const name = typeNode.name.value;\n // Check if it's an input object (not a scalar or enum)\n if (!schema.scalar[name] && !schema.enum[name] && schema.input[name]) {\n inputObjects.add(name);\n }\n break;\n }\n }\n};\n\n/**\n * Recursively collect nested input objects from schema definitions.\n * Takes a set of initial input names and expands to include all nested inputs.\n */\nconst collectNestedInputObjects = (schema: AnyGraphqlSchema, initialInputNames: Set<string>): Set<string> => {\n const inputObjects = new Set(initialInputNames);\n\n const collectNested = (inputName: string, seen: Set<string>): void => {\n if (seen.has(inputName)) {\n return;\n }\n seen.add(inputName);\n\n const inputDef = schema.input[inputName];\n if (!inputDef) {\n return;\n }\n\n for (const fieldSpec of Object.values(inputDef.fields)) {\n const parsed = parseInputSpecifier(fieldSpec);\n if (parsed.kind === \"input\" && !inputObjects.has(parsed.name)) {\n inputObjects.add(parsed.name);\n collectNested(parsed.name, seen);\n }\n }\n };\n\n for (const inputName of Array.from(initialInputNames)) {\n collectNested(inputName, new Set());\n }\n\n return inputObjects;\n};\n\n/**\n * Collect all input object types used in variable definitions.\n * Recursively collects nested input objects from the schema.\n */\nconst collectUsedInputObjects = (\n schema: AnyGraphqlSchema,\n variableDefinitions: readonly VariableDefinitionNode[],\n): Set<string> => {\n const directInputs = new Set<string>();\n for (const varDef of variableDefinitions) {\n extractInputObjectsFromType(schema, varDef.type, directInputs);\n }\n return collectNestedInputObjects(schema, directInputs);\n};\n\n/**\n * Collect all input object types used in InputTypeSpecifiers.\n * Recursively collects nested input objects from the schema.\n */\nconst _collectUsedInputObjectsFromSpecifiers = (schema: AnyGraphqlSchema, specifiers: InputTypeSpecifiers): Set<string> => {\n const directInputs = new Set<string>();\n for (const specStr of Object.values(specifiers)) {\n const parsed = parseInputSpecifier(specStr);\n if (parsed.kind === \"input\" && schema.input[parsed.name]) {\n directInputs.add(parsed.name);\n }\n }\n return collectNestedInputObjects(schema, directInputs);\n};\n\n/**\n * Collect all input object types used in VariableDefinitions (VarSpecifier objects).\n * Used for fragment variable definitions.\n */\nconst collectUsedInputObjectsFromVarDefs = (\n schema: AnyGraphqlSchema,\n varDefs: Record<string, { kind: string; name: string }>,\n): Set<string> => {\n const directInputs = new Set<string>();\n for (const varSpec of Object.values(varDefs)) {\n if (varSpec.kind === \"input\" && schema.input[varSpec.name]) {\n directInputs.add(varSpec.name);\n }\n }\n return collectNestedInputObjects(schema, directInputs);\n};\n\n/**\n * Generate type definitions for input objects.\n */\nconst generateInputObjectTypeDefinitions = (schema: AnyGraphqlSchema, schemaName: string, inputNames: Set<string>): string[] => {\n const lines: string[] = [];\n\n // Get depth config from schema (optional properties defined in AnyGraphqlSchema)\n const defaultDepth = schema.__defaultInputDepth ?? 3;\n const depthOverrides = schema.__inputDepthOverrides ?? {};\n\n // Create formatters for schema-specific type names\n const formatters: TypeFormatters = {\n scalarInput: (name) => `ScalarInput_${schemaName}<\"${name}\">`,\n inputObject: (name) => `Input_${schemaName}_${name}`,\n };\n\n // Sort for deterministic output\n const sortedNames = Array.from(inputNames).sort();\n\n for (const inputName of sortedNames) {\n const typeString = generateInputObjectType(schema, inputName, {\n defaultDepth,\n depthOverrides,\n formatters,\n });\n\n lines.push(`export type Input_${schemaName}_${inputName} = ${typeString};`);\n }\n\n return lines;\n};\n\n/**\n * Generate the TypeScript code for prebuilt types.\n */\nconst generateTypesCode = (\n grouped: Map<string, SchemaGroup>,\n schemas: Record<string, AnyGraphqlSchema>,\n injectsModulePath: string,\n): string => {\n const schemaNames = Object.keys(schemas);\n\n const lines: string[] = [\n \"/**\",\n \" * Prebuilt type registry.\",\n \" *\",\n \" * This file is auto-generated by @soda-gql/tools/typegen.\",\n \" * Do not edit manually.\",\n \" *\",\n \" * @module\",\n \" * @generated\",\n \" */\",\n \"\",\n 'import type { AssertExtends, PrebuiltTypeRegistry } from \"@soda-gql/core\";',\n ];\n\n // Generate import from _internal-injects.ts\n const scalarImports = schemaNames.map((name) => `scalar_${name}`).join(\", \");\n lines.push(`import type { ${scalarImports} } from \"${injectsModulePath}\";`);\n\n lines.push(\"\");\n\n // Generate ScalarInput and ScalarOutput helper types\n for (const schemaName of schemaNames) {\n lines.push(\n `type ScalarInput_${schemaName}<T extends keyof typeof scalar_${schemaName}> = ` +\n `typeof scalar_${schemaName}[T][\"$type\"][\"input\"];`,\n );\n lines.push(\n `type ScalarOutput_${schemaName}<T extends keyof typeof scalar_${schemaName}> = ` +\n `typeof scalar_${schemaName}[T][\"$type\"][\"output\"];`,\n );\n }\n\n lines.push(\"\");\n\n for (const [schemaName, { fragments, operations, inputObjects }] of grouped) {\n const schema = schemas[schemaName];\n\n // Generate input object type definitions if there are any\n if (inputObjects.size > 0 && schema) {\n lines.push(\"// Input object types\");\n const inputTypeLines = generateInputObjectTypeDefinitions(schema, schemaName, inputObjects);\n lines.push(...inputTypeLines);\n lines.push(\"\");\n }\n\n // Generate fragments type (deduplicate by key — last occurrence wins)\n const deduplicatedFragments = new Map<string, PrebuiltFragmentEntry>();\n for (const f of fragments) {\n deduplicatedFragments.set(f.key, f);\n }\n const fragmentEntries = Array.from(deduplicatedFragments.values())\n .sort((a, b) => a.key.localeCompare(b.key))\n .map(\n (f) =>\n ` readonly \"${f.key}\": { readonly typename: \"${f.typename}\"; readonly input: ${f.inputType}; readonly output: ${f.outputType} };`,\n );\n\n // Generate operations type (deduplicate by key — last occurrence wins)\n const deduplicatedOperations = new Map<string, PrebuiltOperationEntry>();\n for (const o of operations) {\n deduplicatedOperations.set(o.key, o);\n }\n const operationEntries = Array.from(deduplicatedOperations.values())\n .sort((a, b) => a.key.localeCompare(b.key))\n .map((o) => ` readonly \"${o.key}\": { readonly input: ${o.inputType}; readonly output: ${o.outputType} };`);\n\n lines.push(`export type PrebuiltTypes_${schemaName} = {`);\n lines.push(\" readonly fragments: {\");\n if (fragmentEntries.length > 0) {\n lines.push(...fragmentEntries);\n }\n lines.push(\" };\");\n lines.push(\" readonly operations: {\");\n if (operationEntries.length > 0) {\n lines.push(...operationEntries);\n }\n lines.push(\" };\");\n lines.push(\"};\");\n lines.push(`type _AssertPrebuiltTypes_${schemaName} = AssertExtends<PrebuiltTypes_${schemaName}, PrebuiltTypeRegistry>;`);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n};\n\n/**\n * Result of emitting prebuilt types.\n */\nexport type PrebuiltTypesEmitResult = {\n readonly path: string;\n readonly warnings: readonly string[];\n readonly skippedFragmentCount: number;\n};\n\n/**\n * Emit prebuilt types to the types.prebuilt.ts file.\n *\n * This function uses a partial failure strategy: if type calculation fails for\n * individual elements (e.g., due to invalid field selections or missing schema\n * types), those elements are skipped and warnings are collected rather than\n * failing the entire emission. This allows builds to succeed even when some\n * elements have issues, while still reporting problems via warnings.\n *\n * @param options - Emitter options including schemas, field selections, and output directory\n * @returns Result containing output path and warnings, or error if a hard failure occurs\n *\n * @example\n * ```typescript\n * const result = await emitPrebuiltTypes({\n * schemas: { mySchema: schema },\n * fieldSelections,\n * outdir: \"./generated\",\n * injects: { mySchema: { scalars: \"./scalars.ts\" } },\n * });\n *\n * if (result.isOk()) {\n * console.log(`Generated: ${result.value.path}`);\n * if (result.value.warnings.length > 0) {\n * console.warn(\"Warnings:\", result.value.warnings);\n * }\n * }\n * ```\n */\nexport const emitPrebuiltTypes = async (\n options: PrebuiltTypesEmitterOptions,\n): Promise<Result<PrebuiltTypesEmitResult, BuilderError | TypegenError>> => {\n const { schemas, fieldSelections, outdir, injectsModulePath } = options;\n\n // Group selections by schema\n const groupResult = groupBySchema(fieldSelections, schemas);\n if (groupResult.isErr()) {\n return err(groupResult.error);\n }\n const { grouped, warnings, skippedFragmentCount } = groupResult.value;\n\n // Generate the types code\n const code = generateTypesCode(grouped, schemas, injectsModulePath);\n\n // Write to types.prebuilt.ts\n const typesPath = join(outdir, \"types.prebuilt.ts\");\n\n try {\n await writeFile(typesPath, code, \"utf-8\");\n return ok({ path: typesPath, warnings, skippedFragmentCount });\n } catch (error) {\n return err(\n builderErrors.writeFailed(\n typesPath,\n `Failed to write prebuilt types: ${error instanceof Error ? error.message : String(error)}`,\n error,\n ),\n );\n }\n};\n","/**\n * Error types for typegen package.\n *\n * @module\n */\n\nimport type { BuilderError } from \"@soda-gql/builder\";\n\n/**\n * Error codes specific to typegen operations.\n */\nexport type TypegenErrorCode = \"TYPEGEN_CODEGEN_REQUIRED\" | \"TYPEGEN_SCHEMA_LOAD_FAILED\" | \"TYPEGEN_BUILD_FAILED\";\n\n/**\n * Typegen-specific error type.\n */\nexport type TypegenSpecificError =\n | {\n readonly code: \"TYPEGEN_CODEGEN_REQUIRED\";\n readonly message: string;\n readonly outdir: string;\n }\n | {\n readonly code: \"TYPEGEN_SCHEMA_LOAD_FAILED\";\n readonly message: string;\n readonly schemaNames: readonly string[];\n readonly cause?: unknown;\n }\n | {\n readonly code: \"TYPEGEN_BUILD_FAILED\";\n readonly message: string;\n readonly cause?: unknown;\n };\n\n/**\n * Union of all typegen errors (specific + builder errors).\n */\nexport type TypegenError = TypegenSpecificError | BuilderError;\n\n/**\n * Error constructor helpers for concise error creation.\n */\nexport const typegenErrors = {\n codegenRequired: (outdir: string): TypegenSpecificError => ({\n code: \"TYPEGEN_CODEGEN_REQUIRED\",\n message: `Generated graphql-system module not found at '${outdir}'. Run 'soda-gql codegen' first.`,\n outdir,\n }),\n\n schemaLoadFailed: (schemaNames: readonly string[], cause?: unknown): TypegenSpecificError => ({\n code: \"TYPEGEN_SCHEMA_LOAD_FAILED\",\n message: `Failed to load schemas: ${schemaNames.join(\", \")}`,\n schemaNames,\n cause,\n }),\n\n buildFailed: (message: string, cause?: unknown): TypegenSpecificError => ({\n code: \"TYPEGEN_BUILD_FAILED\",\n message,\n cause,\n }),\n} as const;\n\n/**\n * Format TypegenError for console output (human-readable).\n */\nexport const formatTypegenError = (error: TypegenError): string => {\n const lines: string[] = [];\n\n lines.push(`Error [${error.code}]: ${error.message}`);\n\n switch (error.code) {\n case \"TYPEGEN_CODEGEN_REQUIRED\":\n lines.push(` Output directory: ${error.outdir}`);\n lines.push(\" Hint: Run 'soda-gql codegen' to generate the graphql-system module first.\");\n break;\n case \"TYPEGEN_SCHEMA_LOAD_FAILED\":\n lines.push(` Schemas: ${error.schemaNames.join(\", \")}`);\n break;\n }\n\n if (\"cause\" in error && error.cause) {\n lines.push(` Caused by: ${error.cause}`);\n }\n\n return lines.join(\"\\n\");\n};\n","/**\n * Template extractor for typegen.\n *\n * Extracts tagged template GraphQL content from TypeScript source files\n * using SWC parsing. Uses shared extraction logic from @soda-gql/common\n * but simplified for batch extraction (no position tracking, no state management).\n *\n * @module\n */\n\nimport type { GraphqlSystemIdentifyHelper } from \"@soda-gql/builder\";\nimport type { ExtractedTemplate } from \"@soda-gql/common/template-extraction\";\nimport { walkAndExtract } from \"@soda-gql/common/template-extraction\";\n\nimport { parseSync } from \"@swc/core\";\nimport type { ImportDeclaration, Module, Node } from \"@swc/types\";\n\nexport type { ExtractedTemplate, OperationKind } from \"@soda-gql/common/template-extraction\";\n\n/** Result of extracting templates from a source file. */\nexport type ExtractionResult = {\n readonly templates: readonly ExtractedTemplate[];\n readonly warnings: readonly string[];\n};\n\n/**\n * Parse TypeScript source with SWC, returning null on failure.\n */\nconst safeParseSync = (source: string, tsx: boolean): ReturnType<typeof parseSync> | null => {\n try {\n return parseSync(source, {\n syntax: \"typescript\",\n tsx,\n decorators: false,\n dynamicImport: true,\n });\n } catch {\n return null;\n }\n};\n\n/**\n * Collect gql identifiers from import declarations.\n * Finds imports like `import { gql } from \"./graphql-system\"`.\n */\nconst collectGqlIdentifiers = (module: Module, filePath: string, helper: GraphqlSystemIdentifyHelper): ReadonlySet<string> => {\n const identifiers = new Set<string>();\n\n for (const item of module.body) {\n let declaration: ImportDeclaration | null = null;\n\n if (item.type === \"ImportDeclaration\") {\n declaration = item;\n } else if (\n \"declaration\" in item &&\n item.declaration &&\n // biome-ignore lint/suspicious/noExplicitAny: SWC AST type checking\n (item.declaration as any).type === \"ImportDeclaration\"\n ) {\n declaration = item.declaration as unknown as ImportDeclaration;\n }\n\n if (!declaration) {\n continue;\n }\n\n if (!helper.isGraphqlSystemImportSpecifier({ filePath, specifier: declaration.source.value })) {\n continue;\n }\n\n for (const specifier of declaration.specifiers ?? []) {\n if (specifier.type === \"ImportSpecifier\") {\n const imported = specifier.imported ? specifier.imported.value : specifier.local.value;\n if (imported === \"gql\" && !specifier.imported) {\n identifiers.add(specifier.local.value);\n }\n }\n }\n }\n\n return identifiers;\n};\n\n/**\n * Extract all tagged templates from a TypeScript source file.\n *\n * @param filePath - Absolute path to the source file (used for import resolution)\n * @param source - TypeScript source code\n * @param helper - GraphQL system identifier for resolving gql imports\n * @returns Extracted templates and any warnings\n */\nexport const extractTemplatesFromSource = (\n filePath: string,\n source: string,\n helper: GraphqlSystemIdentifyHelper,\n): ExtractionResult => {\n const warnings: string[] = [];\n const isTsx = filePath.endsWith(\".tsx\");\n\n const program = safeParseSync(source, isTsx);\n if (!program || program.type !== \"Module\") {\n if (source.includes(\"gql\")) {\n warnings.push(`[typegen-extract] Failed to parse ${filePath}`);\n }\n return { templates: [], warnings };\n }\n\n const gqlIdentifiers = collectGqlIdentifiers(program, filePath, helper);\n if (gqlIdentifiers.size === 0) {\n return { templates: [], warnings };\n }\n\n return { templates: walkAndExtract(program as unknown as Node, gqlIdentifiers), warnings };\n};\n","/**\n * Source file scanner for tagged template extraction.\n *\n * Discovers source files from config include/exclude patterns,\n * reads them, and extracts tagged templates using the template extractor.\n *\n * @module\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { normalize, resolve } from \"node:path\";\nimport type { GraphqlSystemIdentifyHelper } from \"@soda-gql/builder\";\nimport fg from \"fast-glob\";\nimport { type ExtractedTemplate, extractTemplatesFromSource } from \"./template-extractor\";\n\nexport type ScanSourceFilesOptions = {\n /** Glob patterns for source files to include. */\n readonly include: readonly string[];\n /** Glob patterns for source files to exclude. */\n readonly exclude: readonly string[];\n /** Base directory for resolving glob patterns. */\n readonly baseDir: string;\n /** Helper for identifying graphql-system imports. */\n readonly helper: GraphqlSystemIdentifyHelper;\n};\n\nexport type ScanResult = {\n /** Templates keyed by file path. */\n readonly templates: ReadonlyMap<string, readonly ExtractedTemplate[]>;\n /** Warnings from scanning. */\n readonly warnings: readonly string[];\n};\n\n/**\n * Scan source files for tagged templates.\n *\n * Uses fast-glob to discover files matching include/exclude patterns,\n * then extracts tagged templates from each file.\n */\nexport const scanSourceFiles = (options: ScanSourceFilesOptions): ScanResult => {\n const { include, exclude, baseDir, helper } = options;\n const warnings: string[] = [];\n\n // Build exclusion patterns\n const ignorePatterns = exclude.map((pattern) => (pattern.startsWith(\"!\") ? pattern.slice(1) : pattern));\n\n // Discover files via fast-glob\n const matchedFiles = fg.sync(include as string[], {\n cwd: baseDir,\n ignore: ignorePatterns,\n onlyFiles: true,\n absolute: true,\n });\n\n const templates = new Map<string, readonly ExtractedTemplate[]>();\n\n for (const filePath of matchedFiles) {\n const normalizedPath = normalize(resolve(filePath)).replace(/\\\\/g, \"/\");\n\n try {\n const source = readFileSync(normalizedPath, \"utf-8\");\n const { templates: extracted, warnings: extractionWarnings } = extractTemplatesFromSource(normalizedPath, source, helper);\n warnings.push(...extractionWarnings);\n\n if (extracted.length > 0) {\n templates.set(normalizedPath, extracted);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n warnings.push(`[typegen-scan] Failed to read ${normalizedPath}: ${message}`);\n }\n }\n\n return { templates, warnings };\n};\n","/**\n * Converts extracted tagged template GraphQL content into FieldSelectionData.\n *\n * Takes the output of template-extractor and produces FieldSelectionData entries\n * compatible with the emitter pipeline. Uses the shared field-building utilities\n * from core to produce AnyFieldsExtended from GraphQL AST.\n *\n * @module\n */\n\nimport type { FieldSelectionData, FieldSelectionsMap } from \"@soda-gql/builder\";\nimport type { CanonicalId } from \"@soda-gql/common\";\nimport {\n type AnyGraphqlSchema,\n buildFieldsFromSelectionSet,\n createSchemaIndexFromSchema,\n extractFragmentVariables,\n preprocessFragmentArgs,\n} from \"@soda-gql/core\";\nimport { Kind, parse as parseGraphql, type SelectionSetNode } from \"graphql\";\nimport type { ExtractedTemplate } from \"./template-extractor\";\n\n/** Result of converting templates to field selections. */\nexport type TemplateConversionResult = {\n readonly selections: FieldSelectionsMap;\n readonly warnings: readonly string[];\n};\n\n/**\n * Convert extracted templates into field selections for the emitter.\n *\n * @param templates - Templates extracted from source files, keyed by file path\n * @param schemas - Loaded schema objects keyed by schema name\n * @returns Map of canonical IDs to field selection data, plus any warnings\n */\nexport const convertTemplatesToSelections = (\n templates: ReadonlyMap<string, readonly ExtractedTemplate[]>,\n schemas: Record<string, AnyGraphqlSchema>,\n): TemplateConversionResult => {\n const selections = new Map<CanonicalId, FieldSelectionData>();\n const warnings: string[] = [];\n\n // Build schema indexes once per schema\n const schemaIndexes = new Map(Object.entries(schemas).map(([name, schema]) => [name, createSchemaIndexFromSchema(schema)]));\n\n for (const [filePath, fileTemplates] of templates) {\n for (const template of fileTemplates) {\n const schema = schemas[template.schemaName];\n if (!schema) {\n warnings.push(`[typegen-template] Unknown schema \"${template.schemaName}\" in ${filePath}`);\n continue;\n }\n\n const schemaIndex = schemaIndexes.get(template.schemaName);\n if (!schemaIndex) {\n continue;\n }\n\n try {\n if (template.kind === \"fragment\") {\n const selection = convertFragmentTemplate(template, schema, filePath);\n if (selection) {\n selections.set(selection.id, selection.data);\n }\n } else {\n const selection = convertOperationTemplate(template, schema, filePath);\n if (selection) {\n selections.set(selection.id, selection.data);\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n warnings.push(`[typegen-template] Failed to process ${template.kind} in ${filePath}: ${message}`);\n }\n }\n }\n\n return { selections, warnings };\n};\n\n/**\n * Recursively filter out __FRAG_SPREAD_ placeholder nodes from a selection set.\n * These placeholders are created by template-extractor for interpolated fragment references.\n * buildFieldsFromSelectionSet would throw on them since no interpolationMap is available.\n */\nconst filterPlaceholderSpreads = (selectionSet: SelectionSetNode): SelectionSetNode => ({\n ...selectionSet,\n selections: selectionSet.selections\n .filter((sel) => !(sel.kind === Kind.FRAGMENT_SPREAD && sel.name.value.startsWith(\"__FRAG_SPREAD_\")))\n .map((sel) => {\n if (sel.kind === Kind.FIELD && sel.selectionSet) {\n return { ...sel, selectionSet: filterPlaceholderSpreads(sel.selectionSet) };\n }\n if (sel.kind === Kind.INLINE_FRAGMENT && sel.selectionSet) {\n return { ...sel, selectionSet: filterPlaceholderSpreads(sel.selectionSet) };\n }\n return sel;\n }),\n});\n\n/** Simple matching-paren finder for template content (no comments/strings to handle). */\nconst findClosingParen = (source: string, openIndex: number): number => {\n let depth = 0;\n for (let i = openIndex; i < source.length; i++) {\n if (source[i] === \"(\") depth++;\n else if (source[i] === \")\") {\n depth--;\n if (depth === 0) return i;\n }\n }\n return -1;\n};\n\n/**\n * Reconstruct full GraphQL source from an extracted template.\n * For curried syntax (new), prepends the definition header from tag call arguments.\n * For curried fragments with Fragment Arguments, repositions variable declarations\n * before the on-clause to produce RFC-compliant syntax.\n * For old syntax, returns content as-is.\n */\nconst reconstructGraphql = (template: ExtractedTemplate): string => {\n if (template.elementName) {\n if (template.kind === \"fragment\" && template.typeName) {\n const trimmed = template.content.trim();\n if (trimmed.startsWith(\"(\")) {\n const closeIdx = findClosingParen(trimmed, 0);\n if (closeIdx !== -1) {\n const varDecls = trimmed.slice(0, closeIdx + 1);\n const selectionSet = trimmed.slice(closeIdx + 1).trim();\n return `fragment ${template.elementName}${varDecls} on ${template.typeName} ${selectionSet}`;\n }\n }\n return `fragment ${template.elementName} on ${template.typeName} ${trimmed}`;\n }\n return `${template.kind} ${template.elementName} ${template.content}`;\n }\n return template.content;\n};\n\n/**\n * Convert a fragment template into FieldSelectionData.\n */\nconst convertFragmentTemplate = (\n template: ExtractedTemplate,\n schema: AnyGraphqlSchema,\n filePath: string,\n): { id: CanonicalId; data: FieldSelectionData } | null => {\n const schemaIndex = createSchemaIndexFromSchema(schema);\n const graphqlSource = reconstructGraphql(template);\n\n // Extract variable definitions from Fragment Arguments syntax\n const variableDefinitions = extractFragmentVariables(graphqlSource, schemaIndex);\n\n // Preprocess to strip Fragment Arguments\n const { preprocessed } = preprocessFragmentArgs(graphqlSource);\n\n const document = parseGraphql(preprocessed);\n const fragDef = document.definitions.find((d) => d.kind === Kind.FRAGMENT_DEFINITION);\n if (!fragDef || fragDef.kind !== Kind.FRAGMENT_DEFINITION) {\n return null;\n }\n\n const fragmentName = fragDef.name.value;\n const onType = fragDef.typeCondition.name.value;\n\n // Build fields from selection set (filter placeholder spreads from interpolated fragments)\n const fields = buildFieldsFromSelectionSet(filterPlaceholderSpreads(fragDef.selectionSet), schema, onType);\n\n // Generate a canonical ID from file path + fragment name\n const id = `${filePath}::${fragmentName}` as CanonicalId;\n\n return {\n id,\n data: {\n type: \"fragment\",\n schemaLabel: schema.label,\n key: fragmentName,\n typename: onType,\n fields,\n variableDefinitions,\n },\n };\n};\n\n/**\n * Convert an operation template into FieldSelectionData.\n */\nconst convertOperationTemplate = (\n template: ExtractedTemplate,\n schema: AnyGraphqlSchema,\n filePath: string,\n): { id: CanonicalId; data: FieldSelectionData } | null => {\n const graphqlSource = reconstructGraphql(template);\n const document = parseGraphql(graphqlSource);\n const opDef = document.definitions.find((d) => d.kind === Kind.OPERATION_DEFINITION);\n if (!opDef || opDef.kind !== Kind.OPERATION_DEFINITION) {\n return null;\n }\n\n const operationName = opDef.name?.value ?? \"Anonymous\";\n const operationType = opDef.operation;\n\n // Determine root type name based on operation type\n const rootTypeName = getRootTypeName(schema, operationType);\n\n // Build fields from selection set (filter placeholder spreads from interpolated fragments)\n const fields = buildFieldsFromSelectionSet(filterPlaceholderSpreads(opDef.selectionSet), schema, rootTypeName);\n\n // Variable definitions from the operation AST\n const variableDefinitions = opDef.variableDefinitions ?? [];\n\n // Generate a canonical ID from file path + operation name\n const id = `${filePath}::${operationName}` as CanonicalId;\n\n return {\n id,\n data: {\n type: \"operation\",\n schemaLabel: schema.label,\n operationName,\n operationType,\n fields,\n variableDefinitions: [...variableDefinitions],\n },\n };\n};\n\n/**\n * Get the root type name for an operation type from the schema.\n */\nconst getRootTypeName = (schema: AnyGraphqlSchema, operationType: string): string => {\n switch (operationType) {\n case \"query\":\n return schema.operations.query ?? \"Query\";\n case \"mutation\":\n return schema.operations.mutation ?? \"Mutation\";\n case \"subscription\":\n return schema.operations.subscription ?? \"Subscription\";\n default:\n return \"Query\";\n }\n};\n","/**\n * Main typegen runner.\n *\n * Orchestrates the prebuilt type generation process:\n * 1. Load schemas from generated CJS bundle\n * 2. Build artifact to evaluate elements\n * 3. Extract field selections from builder\n * 4. Scan source files for tagged templates and merge selections\n * 5. Emit types.prebuilt.ts\n *\n * @module\n */\n\nimport { existsSync } from \"node:fs\";\nimport { dirname, extname, join, relative, resolve } from \"node:path\";\nimport {\n createBuilderService,\n createGraphqlSystemIdentifyHelper,\n extractFieldSelections,\n type FieldSelectionData,\n type IntermediateArtifactElement,\n loadSchemasFromBundle,\n} from \"@soda-gql/builder\";\nimport type { CanonicalId } from \"@soda-gql/common\";\nimport type { ResolvedSodaGqlConfig } from \"@soda-gql/config\";\nimport { err, ok } from \"neverthrow\";\nimport { emitPrebuiltTypes } from \"./emitter\";\nimport { typegenErrors } from \"./errors\";\nimport { scanSourceFiles } from \"./template-scanner\";\nimport { convertTemplatesToSelections } from \"./template-to-selections\";\nimport type { TypegenResult, TypegenSuccess } from \"./types\";\n\n/**\n * Options for running typegen.\n */\nexport type RunTypegenOptions = {\n /**\n * Resolved soda-gql configuration.\n */\n readonly config: ResolvedSodaGqlConfig;\n};\n\nconst extensionMap: Record<string, string> = {\n \".ts\": \".js\",\n \".tsx\": \".js\",\n \".mts\": \".mjs\",\n \".cts\": \".cjs\",\n \".js\": \".js\",\n \".mjs\": \".mjs\",\n \".cjs\": \".cjs\",\n};\n\ntype ImportSpecifierOptions = {\n includeExtension?: boolean;\n};\n\nconst toImportSpecifier = (fromPath: string, targetPath: string, options?: ImportSpecifierOptions): string => {\n const fromDir = dirname(fromPath);\n const normalized = relative(fromDir, targetPath).replace(/\\\\/g, \"/\");\n const sourceExt = extname(targetPath);\n\n // When includeExtension is false (default), strip the extension entirely\n if (!options?.includeExtension) {\n if (normalized.length === 0) {\n return `./${targetPath.slice(0, -sourceExt.length).split(\"/\").pop()}`;\n }\n const withPrefix = normalized.startsWith(\".\") ? normalized : `./${normalized}`;\n const currentExt = extname(withPrefix);\n return currentExt ? withPrefix.slice(0, -currentExt.length) : withPrefix;\n }\n\n // When includeExtension is true, convert to runtime extension\n const runtimeExt = extensionMap[sourceExt] ?? sourceExt;\n\n if (normalized.length === 0) {\n const base = runtimeExt !== sourceExt ? targetPath.slice(0, -sourceExt.length).split(\"/\").pop() : targetPath.split(\"/\").pop();\n return `./${base}${runtimeExt}`;\n }\n\n const withPrefix = normalized.startsWith(\".\") ? normalized : `./${normalized}`;\n if (!runtimeExt) {\n return withPrefix;\n }\n if (withPrefix.endsWith(runtimeExt)) {\n return withPrefix;\n }\n\n const currentExt = extname(withPrefix);\n const withoutExt = currentExt ? withPrefix.slice(0, -currentExt.length) : withPrefix;\n return `${withoutExt}${runtimeExt}`;\n};\n\n/**\n * Run the typegen process.\n *\n * This function:\n * 1. Loads schemas from the generated CJS bundle\n * 2. Creates a BuilderService and builds the artifact\n * 3. Extracts field selections from the artifact\n * 4. Scans source files for tagged templates and merges selections\n * 5. Emits types.prebuilt.ts using emitPrebuiltTypes\n *\n * @param options - Typegen options including config\n * @returns Result containing success data or error\n */\nexport const runTypegen = async (options: RunTypegenOptions): Promise<TypegenResult> => {\n const { config } = options;\n const outdir = resolve(config.outdir);\n const cjsPath = join(outdir, \"index.cjs\");\n const importSpecifierOptions = { includeExtension: config.styles.importExtension };\n\n // Step 1: Check if codegen has been run\n if (!existsSync(cjsPath)) {\n return err(typegenErrors.codegenRequired(outdir));\n }\n\n // Step 2: Load schemas from CJS bundle\n const schemaNames = Object.keys(config.schemas);\n const schemasResult = loadSchemasFromBundle(cjsPath, schemaNames);\n if (schemasResult.isErr()) {\n return err(typegenErrors.schemaLoadFailed(schemaNames, schemasResult.error));\n }\n const schemas = schemasResult.value;\n\n // Calculate import path for types.prebuilt.ts to _internal-injects.ts\n const prebuiltTypesPath = join(outdir, \"types.prebuilt.ts\");\n const injectsModulePath = toImportSpecifier(prebuiltTypesPath, join(outdir, \"_internal-injects.ts\"), importSpecifierOptions);\n\n // Step 3: Build artifact using BuilderService\n const builderService = createBuilderService({\n config,\n });\n\n const artifactResult = await builderService.buildAsync();\n\n if (artifactResult.isErr()) {\n return err(typegenErrors.buildFailed(`Builder failed: ${artifactResult.error.message}`, artifactResult.error));\n }\n\n // Step 4: Extract field selections from intermediate elements\n const intermediateElements = builderService.getIntermediateElements();\n if (!intermediateElements) {\n return err(typegenErrors.buildFailed(\"No intermediate elements available after build\", undefined));\n }\n\n const fieldSelectionsResult = extractFieldSelections(intermediateElements as Record<CanonicalId, IntermediateArtifactElement>);\n const { selections: builderSelections, warnings: extractWarnings } = fieldSelectionsResult;\n\n // Step 4b: Scan source files for tagged templates and merge selections\n const graphqlHelper = createGraphqlSystemIdentifyHelper(config);\n const scanResult = scanSourceFiles({\n include: [...config.include],\n exclude: [...config.exclude],\n baseDir: config.baseDir,\n helper: graphqlHelper,\n });\n\n const templateSelections = convertTemplatesToSelections(scanResult.templates, schemas);\n\n const fieldSelections = mergeSelections(builderSelections, templateSelections.selections, config.baseDir);\n\n const scanWarnings = [...scanResult.warnings, ...templateSelections.warnings];\n\n // Step 5: Emit types.prebuilt.ts\n const emitResult = await emitPrebuiltTypes({\n schemas,\n fieldSelections,\n outdir,\n injectsModulePath,\n });\n\n if (emitResult.isErr()) {\n return err(emitResult.error);\n }\n\n const { warnings: emitWarnings, skippedFragmentCount } = emitResult.value;\n\n // Count fragments and operations\n let fragmentCount = 0;\n let operationCount = 0;\n for (const selection of fieldSelections.values()) {\n if (selection.type === \"fragment\" && selection.key) {\n fragmentCount++;\n } else if (selection.type === \"operation\") {\n operationCount++;\n }\n }\n\n const allWarnings = [...extractWarnings, ...scanWarnings, ...emitWarnings];\n\n return ok({\n prebuiltTypesPath,\n fragmentCount,\n operationCount,\n skippedFragmentCount,\n warnings: allWarnings,\n } satisfies TypegenSuccess);\n};\n\nconst extractElementName = (data: FieldSelectionData): string | undefined =>\n data.type === \"fragment\" ? data.key : data.operationName;\n\n/**\n * Merge builder and template selections into a combined map.\n *\n * Builder selections are authoritative — VM evaluation correctly resolves\n * fragment spreads that static template analysis cannot handle.\n * Template selections serve as fallback for elements only found by the scanner.\n *\n * Deduplication is per-element (file + GraphQL name), not per-file, so that\n * callback-builder operations in files that also contain tagged templates are preserved.\n */\nexport const mergeSelections = (\n builderSelections: ReadonlyMap<CanonicalId, FieldSelectionData>,\n templateSelections: ReadonlyMap<CanonicalId, FieldSelectionData>,\n baseDir: string,\n): Map<CanonicalId, FieldSelectionData> => {\n // Builder uses relative paths (e.g. \"src/foo.ts::varName\"), template scanner uses\n // absolute paths (e.g. \"/abs/path/src/foo.ts::FragmentName\"). Normalize to relative.\n const extractFilePart = (id: string): string => {\n const filePart = id.split(\"::\")[0] ?? \"\";\n if (filePart.startsWith(\"/\")) {\n return relative(baseDir, filePart);\n }\n return filePart;\n };\n\n // Build set of (file, elementName) pairs from builder selections\n const builderElements = new Set<string>();\n for (const [id, data] of builderSelections) {\n const name = extractElementName(data);\n if (name) builderElements.add(`${extractFilePart(id)}::${name}`);\n }\n\n const fieldSelections = new Map<CanonicalId, FieldSelectionData>();\n // Builder selections first (authoritative)\n for (const [id, data] of builderSelections) {\n fieldSelections.set(id, data);\n }\n // Template selections as fallback for elements not found by builder\n for (const [id, data] of templateSelections) {\n const name = extractElementName(data);\n if (name && builderElements.has(`${extractFilePart(id)}::${name}`)) continue;\n fieldSelections.set(id, data);\n }\n\n return fieldSelections;\n};\n","import { z } from \"zod\";\n\n/**\n * Args for `codegen schema` subcommand.\n */\nexport const CodegenSchemaArgsSchema = z.object({\n config: z.string().optional(),\n \"emit-inject-template\": z.string().optional(),\n});\n\n/**\n * Legacy alias for backwards compatibility.\n * @deprecated Use CodegenSchemaArgsSchema instead.\n */\nexport const CodegenArgsSchema = CodegenSchemaArgsSchema;\n\nexport const BuilderArgsSchema = z.object({\n mode: z.enum([\"runtime\", \"zero-runtime\"]),\n entry: z.string(),\n out: z.string(),\n format: z.enum([\"human\", \"json\"]).optional().default(\"human\"),\n});\n\nexport const FormatArgsSchema = z.object({\n _: z.array(z.string()).optional(),\n config: z.string().optional(),\n check: z.boolean().optional(),\n \"inject-fragment-keys\": z.boolean().optional(),\n});\n\nexport const InitArgsSchema = z.object({\n force: z.boolean().optional(),\n});\n\nexport const TypegenArgsSchema = z.object({\n config: z.string().optional(),\n watch: z.boolean().optional(),\n});\n\n/**\n * Args for `codegen graphql` subcommand.\n */\nexport const CodegenGraphqlArgsSchema = z.object({\n config: z.string().optional(),\n schema: z.string().optional(),\n input: z.array(z.string()).or(z.string()).optional(),\n suffix: z.string().optional(),\n});\n\nexport type CodegenSchemaArgs = z.infer<typeof CodegenSchemaArgsSchema>;\nexport type CodegenGraphqlArgs = z.infer<typeof CodegenGraphqlArgsSchema>;\n/** @deprecated Use CodegenSchemaArgs instead. */\nexport type CodegenArgs = CodegenSchemaArgs;\nexport type BuilderArgs = z.infer<typeof BuilderArgsSchema>;\nexport type FormatArgs = z.infer<typeof FormatArgsSchema>;\nexport type InitArgs = z.infer<typeof InitArgsSchema>;\nexport type TypegenArgs = z.infer<typeof TypegenArgsSchema>;\n","import { err, ok, type Result } from \"neverthrow\";\nimport type { z } from \"zod\";\n\nexport type AliasMap = Record<string, string>;\n\nexport const parseArgs = <T extends z.ZodType>(args: string[], schema: T, aliases?: AliasMap): Result<z.infer<T>, string> => {\n const parsed: Record<string, unknown> = {};\n const positional: string[] = [];\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (!arg) continue;\n\n if (arg.startsWith(\"--\")) {\n const key = arg.slice(2);\n const nextArg = args[i + 1];\n\n if (!nextArg || nextArg.startsWith(\"--\") || nextArg.startsWith(\"-\")) {\n parsed[key] = true;\n } else {\n parsed[key] = nextArg;\n i++;\n }\n } else if (arg.startsWith(\"-\") && aliases) {\n const shortKey = arg.slice(1);\n const longKey = aliases[shortKey];\n if (longKey) {\n parsed[longKey] = true;\n } else {\n positional.push(arg);\n }\n } else {\n positional.push(arg);\n }\n }\n\n if (positional.length > 0) {\n parsed._ = positional;\n }\n\n const result = schema.safeParse(parsed);\n if (!result.success) {\n return err(result.error.issues.map((e) => e.message).join(\", \"));\n }\n\n return ok(result.data);\n};\n","/**\n * Codegen graphql subcommand - generates compat code from .graphql files.\n * @module\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport { normalizePath } from \"@soda-gql/common\";\nimport { loadConfig } from \"@soda-gql/config\";\nimport fg from \"fast-glob\";\nimport { err, ok } from \"neverthrow\";\nimport type { EnrichedFragment, EnrichedOperation, ParseResult } from \"../../../codegen\";\nimport { emitFragment, emitOperation, loadSchema, parseGraphqlSource, transformParsedGraphql } from \"../../../codegen\";\nimport { type CliResult, cliErrors } from \"../../errors\";\nimport { CodegenGraphqlArgsSchema } from \"../../schemas/args\";\nimport type { CommandResult, CommandSuccess } from \"../../types\";\nimport { parseArgs } from \"../../utils/parse-args\";\n\n/** Schema document type inferred from transformParsedGraphql to avoid graphql version mismatch. */\ntype SchemaDocument = Parameters<typeof transformParsedGraphql>[1][\"schemaDocument\"];\n\nexport type ParsedGraphqlArgs = {\n schemaName: string;\n schemaFiles: readonly string[];\n inputPatterns: readonly string[];\n /** Output file suffix (e.g., \".compat.ts\", \".generated.ts\") */\n suffix: string;\n /** Resolved absolute path to graphql-system directory (config.outdir) */\n graphqlSystemDir: string;\n /** Pre-loaded schema document. If provided, skips loadSchema. */\n schemaDocument?: SchemaDocument;\n};\n\nconst parseGraphqlArgs = (argv: readonly string[]): CliResult<ParsedGraphqlArgs> => {\n const parsed = parseArgs([...argv], CodegenGraphqlArgsSchema);\n\n if (!parsed.isOk()) {\n return err(cliErrors.argsInvalid(\"codegen graphql\", parsed.error));\n }\n\n const args = parsed.value;\n\n // Load config from @soda-gql/config\n const configResult = loadConfig(args.config);\n if (configResult.isErr()) {\n return err(cliErrors.fromConfig(configResult.error));\n }\n\n const config = configResult.value;\n\n // Get schema name (required if multiple schemas, or use the only one)\n const schemaNames = Object.keys(config.schemas ?? {});\n if (schemaNames.length === 0) {\n return err(cliErrors.argsInvalid(\"codegen graphql\", \"No schemas configured in soda-gql.config.ts\"));\n }\n\n let schemaName = args.schema;\n if (!schemaName) {\n const firstSchema = schemaNames[0];\n if (schemaNames.length > 1 || !firstSchema) {\n return err(\n cliErrors.argsInvalid(\n \"codegen graphql\",\n `Multiple schemas configured. Use --schema to specify: ${schemaNames.join(\", \")}`,\n ),\n );\n }\n schemaName = firstSchema;\n }\n\n const schemaConfig = config.schemas?.[schemaName];\n if (!schemaConfig) {\n return err(cliErrors.argsInvalid(\"codegen graphql\", `Schema \"${schemaName}\" not found in config`));\n }\n\n // Get input patterns from args\n let inputPatterns: readonly string[] = [];\n if (args.input) {\n inputPatterns = Array.isArray(args.input) ? args.input : [args.input];\n }\n\n if (inputPatterns.length === 0) {\n return err(\n cliErrors.argsInvalid(\"codegen graphql\", \"No input patterns provided. Use --input to specify .graphql file patterns\"),\n );\n }\n\n // Get suffix from CLI args or use default\n const suffix = args.suffix ?? \".compat.ts\";\n\n return ok({\n schemaName,\n schemaFiles: schemaConfig.schema,\n inputPatterns,\n suffix,\n graphqlSystemDir: resolve(config.outdir),\n });\n};\n\ntype GeneratedFile = {\n inputPath: string;\n outputPath: string;\n content: string;\n};\n\nexport type GraphqlGenerationResult = {\n files: GeneratedFile[];\n operationCount: number;\n fragmentCount: number;\n /** Fragment target type names (onType values from parsed fragments). */\n targetTypes: ReadonlySet<string>;\n /** Input type names actually used as argument types by fragments and operations. */\n usedArgumentTypes: ReadonlySet<string>;\n};\n\nexport const generateCompatFiles = async (args: ParsedGraphqlArgs): Promise<CliResult<GraphqlGenerationResult>> => {\n // Load schema (use pre-loaded if available)\n let schemaDocument: SchemaDocument;\n if (args.schemaDocument) {\n schemaDocument = args.schemaDocument;\n } else {\n const schemaResult = loadSchema(args.schemaFiles.map((s) => resolve(s)));\n if (schemaResult.isErr()) {\n return err(cliErrors.fromCodegen(schemaResult.error));\n }\n schemaDocument = schemaResult.value;\n }\n\n // Find all .graphql files matching input patterns\n const graphqlFiles: string[] = [];\n for (const pattern of args.inputPatterns) {\n const files = await fg(pattern, { cwd: process.cwd(), absolute: true });\n for (const file of files) {\n if (file.endsWith(\".graphql\") || file.endsWith(\".gql\")) {\n graphqlFiles.push(file);\n }\n }\n }\n\n if (graphqlFiles.length === 0) {\n return err(\n cliErrors.argsInvalid(\"codegen graphql\", `No .graphql files found matching patterns: ${args.inputPatterns.join(\", \")}`),\n );\n }\n\n // Track all fragments for cross-file imports\n const fragmentsByName = new Map<string, { file: string; outputPath: string }>();\n // Collect fragment target types for reachability analysis\n const targetTypes = new Set<string>();\n // Cache parsed results to avoid re-reading and re-parsing files\n const parseCache = new Map<string, ParseResult>();\n\n // First pass: collect all fragments and cache parse results\n for (const file of graphqlFiles) {\n const source = await readFile(file, \"utf-8\");\n const parseResult = parseGraphqlSource(source, file);\n if (parseResult.isErr()) {\n return err(cliErrors.parseError(parseResult.error.message, file));\n }\n\n const parsed = parseResult.value;\n parseCache.set(file, parsed);\n\n const outputBase = basename(file).replace(/\\.(graphql|gql)$/, args.suffix);\n const outputPath = join(dirname(file), outputBase);\n\n for (const frag of parsed.fragments) {\n targetTypes.add(frag.onType);\n const existing = fragmentsByName.get(frag.name);\n if (existing && existing.file !== file) {\n return err(cliErrors.duplicateFragment(frag.name, existing.file, file));\n }\n fragmentsByName.set(frag.name, { file, outputPath });\n }\n }\n\n // Second pass: generate code (using cached parse results)\n const files: GeneratedFile[] = [];\n const usedArgumentTypes = new Set<string>();\n let operationCount = 0;\n let fragmentCount = 0;\n\n for (const file of graphqlFiles) {\n // Use cached parse result instead of re-reading file\n const parsed = parseCache.get(file);\n if (!parsed) {\n throw new Error(`Internal error: parse cache missing for ${file}`);\n }\n\n const transformResult = transformParsedGraphql(parsed, { schemaDocument });\n if (transformResult.isErr()) {\n const error = transformResult.error;\n return err(cliErrors.parseError(error.message, file));\n }\n\n const { operations, fragments } = transformResult.value;\n\n const outputBase = basename(file).replace(/\\.(graphql|gql)$/, args.suffix);\n const outputPath = join(dirname(file), outputBase);\n\n // Build fragment imports map for this file\n const fragmentImports = new Map<string, string>();\n const collectDeps = (deps: readonly string[]): CliResult<void> => {\n for (const fragName of deps) {\n const fragInfo = fragmentsByName.get(fragName);\n if (!fragInfo) {\n return err(cliErrors.fragmentNotFound(fragName, file));\n }\n if (fragInfo.outputPath !== outputPath) {\n // Calculate relative import path (normalize for cross-platform compatibility)\n const relativePath = normalizePath(relative(dirname(outputPath), fragInfo.outputPath)).replace(/\\.ts$/, \"\");\n const importPath = relativePath.startsWith(\".\") ? relativePath : `./${relativePath}`;\n fragmentImports.set(fragName, importPath);\n }\n }\n return ok(undefined);\n };\n\n // Collect dependencies from operations and fragments\n for (const op of operations) {\n const result = collectDeps(op.fragmentDependencies);\n if (result.isErr()) {\n return err(result.error);\n }\n }\n for (const frag of fragments) {\n const result = collectDeps(frag.fragmentDependencies);\n if (result.isErr()) {\n return err(result.error);\n }\n }\n\n // Collect all types used as argument types (input, enum, scalar)\n for (const frag of fragments) {\n for (const v of (frag as EnrichedFragment).variables) {\n usedArgumentTypes.add(v.typeName);\n }\n }\n for (const op of operations) {\n for (const v of (op as EnrichedOperation).variables) {\n usedArgumentTypes.add(v.typeName);\n }\n }\n\n // Calculate graphqlSystemPath as relative path from output file (normalize for cross-platform compatibility)\n const graphqlSystemRelative = normalizePath(relative(dirname(outputPath), args.graphqlSystemDir));\n const graphqlSystemPath = graphqlSystemRelative.startsWith(\".\") ? graphqlSystemRelative : `./${graphqlSystemRelative}`;\n\n // Generate code\n const emitOptions = {\n schemaName: args.schemaName,\n graphqlSystemPath,\n fragmentImports,\n schemaDocument,\n };\n\n const imports: string[] = [];\n const bodies: string[] = [];\n\n // Add gql import once at the top\n imports.push(`import { gql } from \"${graphqlSystemPath}\";`);\n\n // Collect fragment imports (deduplicated via fragmentImports Map)\n for (const [fragName, importPath] of fragmentImports) {\n imports.push(`import { ${fragName}Fragment } from \"${importPath}\";`);\n }\n\n for (const op of operations) {\n const emitResult = emitOperation(op as EnrichedOperation, emitOptions);\n if (emitResult.isErr()) {\n return err(cliErrors.parseError(emitResult.error.message, file));\n }\n bodies.push(emitResult.value);\n operationCount++;\n }\n\n for (const frag of fragments) {\n const emitResult = emitFragment(frag as EnrichedFragment, emitOptions);\n if (emitResult.isErr()) {\n return err(cliErrors.parseError(emitResult.error.message, file));\n }\n bodies.push(emitResult.value);\n fragmentCount++;\n }\n\n if (bodies.length > 0) {\n files.push({\n inputPath: file,\n outputPath,\n content: `${imports.join(\"\\n\")}\\n\\n${bodies.join(\"\\n\\n\")}`,\n });\n }\n }\n\n return ok({ files, operationCount, fragmentCount, targetTypes, usedArgumentTypes });\n};\n\nexport const writeGeneratedFiles = async (files: GeneratedFile[]): Promise<CliResult<void>> => {\n for (const file of files) {\n // Ensure directory exists\n const dir = dirname(file.outputPath);\n await mkdir(dir, { recursive: true });\n\n // Write file\n await writeFile(file.outputPath, file.content, \"utf-8\");\n }\n return ok(undefined);\n};\n\nconst formatSuccess = (result: GraphqlGenerationResult): string => {\n const lines = [\n `Generated ${result.operationCount} operation(s) and ${result.fragmentCount} fragment(s) from ${result.files.length} file(s):`,\n ];\n for (const file of result.files) {\n lines.push(` ${relative(process.cwd(), file.outputPath)}`);\n }\n return lines.join(\"\\n\");\n};\n\nexport const GRAPHQL_HELP = `Usage: soda-gql codegen graphql [options]\n\nGenerate TypeScript compat code from .graphql operation files.\nOutput files are created alongside input files.\n\nOptions:\n --config <path> Path to soda-gql.config.ts\n --schema <name> Schema name (required if multiple schemas configured)\n --input <glob> Glob pattern for .graphql files (repeatable)\n --suffix <ext> Output file suffix (default: \".compat.ts\")\n --help, -h Show this help message\n\nExamples:\n soda-gql codegen graphql --input \"src/**/*.graphql\"\n soda-gql codegen graphql --input \"queries/*.graphql\" --suffix \".generated.ts\"\n`;\n\ntype GraphqlCommandResult = CommandResult<CommandSuccess & { data?: GraphqlGenerationResult }>;\n\nexport const graphqlCommand = async (argv: readonly string[]): Promise<GraphqlCommandResult> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n return ok({ message: GRAPHQL_HELP });\n }\n\n const parsed = parseGraphqlArgs(argv);\n if (parsed.isErr()) {\n return err(parsed.error);\n }\n\n const result = await generateCompatFiles(parsed.value);\n if (result.isErr()) {\n return err(result.error);\n }\n\n const writeResult = await writeGeneratedFiles(result.value.files);\n if (writeResult.isErr()) {\n return err(writeResult.error);\n }\n\n return ok({ message: formatSuccess(result.value), data: result.value });\n};\n","/**\n * Codegen schema subcommand - generates graphql-system runtime module.\n * @module\n */\n\nimport { resolve } from \"node:path\";\nimport { loadConfig } from \"@soda-gql/config\";\nimport { err, ok } from \"neverthrow\";\nimport type { CodegenSchemaConfig, CodegenSuccess } from \"../../../codegen\";\nimport { runCodegen, writeInjectTemplate } from \"../../../codegen\";\nimport { type CliResult, cliErrors } from \"../../errors\";\nimport { CodegenSchemaArgsSchema } from \"../../schemas/args\";\nimport type { CommandResult, CommandSuccess } from \"../../types\";\nimport { parseArgs } from \"../../utils/parse-args\";\n\ntype ParsedCommand =\n | {\n kind: \"emitInjectTemplate\";\n outPath: string;\n }\n | {\n kind: \"generate\";\n schemas: Record<string, CodegenSchemaConfig>;\n outPath: string;\n importExtension: boolean;\n chunkSize: number;\n };\n\nconst parseSchemaArgs = (argv: readonly string[]): CliResult<ParsedCommand> => {\n const parsed = parseArgs([...argv], CodegenSchemaArgsSchema);\n\n if (!parsed.isOk()) {\n return err(cliErrors.argsInvalid(\"codegen schema\", parsed.error));\n }\n\n const args = parsed.value;\n\n // Handle emit inject template\n if (args[\"emit-inject-template\"]) {\n return ok({\n kind: \"emitInjectTemplate\",\n outPath: args[\"emit-inject-template\"],\n });\n }\n\n // Load config from @soda-gql/config\n const configResult = loadConfig(args.config);\n if (configResult.isErr()) {\n return err(cliErrors.fromConfig(configResult.error));\n }\n\n const config = configResult.value;\n\n // Check if schemas config exists\n if (!config.schemas || Object.keys(config.schemas).length === 0) {\n return err(cliErrors.argsInvalid(\"codegen schema\", \"schemas configuration is required in soda-gql.config.ts\"));\n }\n\n // Build schemas config with resolved paths\n const schemas: Record<string, CodegenSchemaConfig> = {};\n\n for (const [name, schemaConfig] of Object.entries(config.schemas)) {\n schemas[name] = {\n schema: schemaConfig.schema,\n inject: schemaConfig.inject,\n defaultInputDepth: schemaConfig.defaultInputDepth,\n inputDepthOverrides: schemaConfig.inputDepthOverrides,\n typeFilter: schemaConfig.typeFilter,\n };\n }\n\n // Derive output path from outdir (default to index.ts)\n const outPath = resolve(config.outdir, \"index.ts\");\n\n return ok({\n kind: \"generate\",\n schemas,\n outPath,\n importExtension: config.styles.importExtension,\n chunkSize: config.codegen.chunkSize,\n });\n};\n\nconst formatSuccess = (success: CodegenSuccess): string => {\n const schemaNames = Object.keys(success.schemas).join(\", \");\n const totalObjects = Object.values(success.schemas).reduce((sum, s) => sum + s.objects, 0);\n return `Generated ${totalObjects} objects from schemas: ${schemaNames}\\n TypeScript: ${success.outPath}\\n CommonJS: ${success.cjsPath}`;\n};\n\nconst formatTemplateSuccess = (outPath: string): string => {\n return `Created inject template → ${outPath}`;\n};\n\nexport const SCHEMA_HELP = `Usage: soda-gql codegen schema [options]\n\nGenerate graphql-system runtime module from GraphQL schema.\n\nOptions:\n --config <path> Path to soda-gql.config.ts\n --emit-inject-template <path> Create inject template file\n --help, -h Show this help message\n\nExamples:\n soda-gql codegen schema\n soda-gql codegen schema --config ./soda-gql.config.ts\n soda-gql codegen schema --emit-inject-template ./src/graphql/scalars.ts\n\nNote: Run 'soda-gql typegen' after codegen to generate prebuilt types.\n`;\n\ntype SchemaCommandResult = CommandResult<CommandSuccess & { data?: CodegenSuccess }>;\n\nexport const schemaCommand = async (argv: readonly string[]): Promise<SchemaCommandResult> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n return ok({ message: SCHEMA_HELP });\n }\n\n const parsed = parseSchemaArgs(argv);\n\n if (parsed.isErr()) {\n return err(parsed.error);\n }\n\n const command = parsed.value;\n\n if (command.kind === \"emitInjectTemplate\") {\n const outPath = resolve(command.outPath);\n const result = writeInjectTemplate(outPath);\n if (result.isErr()) {\n return err(cliErrors.fromCodegen(result.error));\n }\n return ok({ message: formatTemplateSuccess(outPath) });\n }\n\n // Resolve all paths in schemas config\n const resolvedSchemas: Record<string, CodegenSchemaConfig> = {};\n for (const [name, schemaConfig] of Object.entries(command.schemas)) {\n resolvedSchemas[name] = {\n schema: schemaConfig.schema.map((s) => resolve(s)),\n inject: {\n scalars: resolve(schemaConfig.inject.scalars),\n ...(schemaConfig.inject.adapter ? { adapter: resolve(schemaConfig.inject.adapter) } : {}),\n },\n defaultInputDepth: schemaConfig.defaultInputDepth,\n inputDepthOverrides: schemaConfig.inputDepthOverrides,\n typeFilter: schemaConfig.typeFilter,\n };\n }\n\n const result = await runCodegen({\n schemas: resolvedSchemas,\n outPath: resolve(command.outPath),\n format: \"human\",\n importExtension: command.importExtension,\n chunkSize: command.chunkSize,\n });\n\n if (result.isErr()) {\n return err(cliErrors.fromCodegen(result.error));\n }\n\n return ok({ message: formatSuccess(result.value), data: result.value });\n};\n","/**\n * Codegen command dispatcher.\n *\n * When run without a subcommand, executes the full pipeline:\n * codegen graphql (if configured) → codegen schema (with reachability filter)\n *\n * @module\n */\n\nimport { resolve } from \"node:path\";\nimport type { TypeFilterConfig } from \"@soda-gql/config\";\nimport { loadConfig } from \"@soda-gql/config\";\nimport { err, ok } from \"neverthrow\";\nimport type { CodegenSchemaConfig } from \"../../../codegen\";\nimport {\n compileTypeFilter,\n computeReachabilityFilter,\n loadSchema,\n runCodegen,\n type transformParsedGraphql,\n} from \"../../../codegen\";\nimport { runTypegen } from \"../../../typegen\";\nimport { cliErrors } from \"../../errors\";\nimport type { CommandResult, CommandSuccess } from \"../../types\";\nimport { generateCompatFiles, graphqlCommand, type ParsedGraphqlArgs, writeGeneratedFiles } from \"./graphql\";\nimport { schemaCommand } from \"./schema\";\n\n/** Schema document type inferred from transformParsedGraphql to avoid graphql version mismatch. */\ntype SchemaDocument = Parameters<typeof transformParsedGraphql>[1][\"schemaDocument\"];\n\nconst CODEGEN_HELP = `Usage: soda-gql codegen [subcommand] [options]\n\nWhen run without a subcommand, executes the full pipeline:\n codegen graphql (if configured) → codegen schema → typegen\n\nSubcommands:\n schema Generate graphql-system runtime module from schema\n graphql Generate compat code from .graphql operation files\n\nOptions:\n --config <path> Path to soda-gql.config.ts\n --skip-typegen Skip prebuilt type generation in unified pipeline\n --help, -h Show this help message\n`;\n\ntype CodegenCommandResult = CommandResult<CommandSuccess>;\n\n/**\n * Check if argv contains legacy schema-specific flags.\n */\nconst isLegacySchemaArgs = (argv: readonly string[]): boolean => {\n return argv.some((arg) => arg === \"--emit-inject-template\" || arg.startsWith(\"--emit-inject-template=\"));\n};\n\n/**\n * Run the unified codegen pipeline: graphql compat → schema (with reachability filter).\n */\nconst unifiedCodegen = async (argv: readonly string[]): Promise<CodegenCommandResult> => {\n // Parse --config flag\n const configFlag = extractConfigFlag(argv);\n\n // Step 0: Load config once\n const configResult = loadConfig(configFlag);\n if (configResult.isErr()) {\n return err(cliErrors.fromConfig(configResult.error));\n }\n const config = configResult.value;\n\n // Check schemas are configured\n if (!config.schemas || Object.keys(config.schemas).length === 0) {\n return err(cliErrors.argsInvalid(\"codegen\", \"schemas configuration is required in soda-gql.config.ts\"));\n }\n\n // Step 0.5: Pre-load schema DocumentNodes (shared across steps)\n const schemaDocuments = new Map<string, SchemaDocument>();\n for (const [name, schemaConfig] of Object.entries(config.schemas)) {\n const loadResult = loadSchema(schemaConfig.schema.map((s) => resolve(s)));\n if (loadResult.isErr()) {\n return err(cliErrors.fromCodegen(loadResult.error));\n }\n schemaDocuments.set(name, loadResult.value);\n }\n\n const messages: string[] = [];\n\n // Step 1: codegen graphql (optional, before schema to get targetTypes for reachability)\n // Collect target types per schema for reachability filtering\n const targetTypesBySchema = new Map<string, ReadonlySet<string>>();\n const usedArgumentTypesBySchema = new Map<string, ReadonlySet<string>>();\n let compatFiles: Awaited<ReturnType<typeof generateCompatFiles>> | undefined;\n\n if (config.graphqlCompat) {\n const { graphqlCompat } = config;\n const schemaConfig = config.schemas[graphqlCompat.schema];\n if (!schemaConfig) {\n return err(cliErrors.argsInvalid(\"codegen\", `Schema \"${graphqlCompat.schema}\" not found in config`));\n }\n\n const compatArgs: ParsedGraphqlArgs = {\n schemaName: graphqlCompat.schema,\n schemaFiles: schemaConfig.schema,\n inputPatterns: graphqlCompat.input,\n suffix: graphqlCompat.suffix,\n graphqlSystemDir: resolve(config.outdir),\n schemaDocument: schemaDocuments.get(graphqlCompat.schema),\n };\n\n compatFiles = await generateCompatFiles(compatArgs);\n if (compatFiles.isErr()) {\n return err(compatFiles.error);\n }\n\n targetTypesBySchema.set(graphqlCompat.schema, compatFiles.value.targetTypes);\n usedArgumentTypesBySchema.set(graphqlCompat.schema, compatFiles.value.usedArgumentTypes);\n\n messages.push(\n `[graphql] Generated ${compatFiles.value.operationCount} operation(s) and ${compatFiles.value.fragmentCount} fragment(s) from ${compatFiles.value.files.length} file(s)`,\n );\n }\n\n // Step 2: codegen schema (with reachability filter composed with user typeFilter)\n const resolvedSchemas: Record<string, CodegenSchemaConfig> = {};\n for (const [name, schemaConfig] of Object.entries(config.schemas)) {\n // Compose reachability filter with user-defined typeFilter\n const targetTypes = targetTypesBySchema.get(name);\n const usedArgumentTypes = usedArgumentTypesBySchema.get(name);\n const document = schemaDocuments.get(name);\n let typeFilter: TypeFilterConfig | undefined = schemaConfig.typeFilter;\n\n if (targetTypes && targetTypes.size > 0 && document) {\n const { filter: reachFilter, warnings: reachWarnings } = computeReachabilityFilter(\n document,\n targetTypes,\n usedArgumentTypes,\n );\n for (const w of reachWarnings) {\n messages.push(` warning: ${w}`);\n }\n if (typeFilter) {\n const compiledUserFilter = compileTypeFilter(typeFilter);\n typeFilter = (ctx) => compiledUserFilter(ctx) && reachFilter(ctx);\n } else {\n typeFilter = reachFilter;\n }\n }\n\n resolvedSchemas[name] = {\n schema: schemaConfig.schema.map((s) => resolve(s)),\n inject: {\n scalars: resolve(schemaConfig.inject.scalars),\n ...(schemaConfig.inject.adapter ? { adapter: resolve(schemaConfig.inject.adapter) } : {}),\n },\n defaultInputDepth: schemaConfig.defaultInputDepth,\n inputDepthOverrides: schemaConfig.inputDepthOverrides,\n typeFilter,\n };\n }\n\n const codegenResult = await runCodegen({\n schemas: resolvedSchemas,\n outPath: resolve(config.outdir, \"index.ts\"),\n format: \"human\",\n importExtension: config.styles.importExtension,\n chunkSize: config.codegen.chunkSize,\n preloadedSchemas: schemaDocuments as ReadonlyMap<string, import(\"graphql\").DocumentNode>,\n });\n\n if (codegenResult.isErr()) {\n return err(cliErrors.fromCodegen(codegenResult.error));\n }\n\n const codegenSuccess = codegenResult.value;\n\n const schemaNames = Object.keys(codegenSuccess.schemas).join(\", \");\n const totalObjects = Object.values(codegenSuccess.schemas).reduce((sum, s) => sum + s.objects, 0);\n const reachabilityNote = targetTypesBySchema.size > 0 ? \" (filtered by reachability)\" : \"\";\n messages.push(`[schema] Generated ${totalObjects} objects from schemas: ${schemaNames}${reachabilityNote}`);\n\n // Step 3: Write compat files (deferred from step 1 to after schema codegen)\n if (compatFiles?.isOk()) {\n const writeResult = await writeGeneratedFiles(compatFiles.value.files);\n if (writeResult.isErr()) {\n return err(writeResult.error);\n }\n }\n\n // Step 4: typegen (generate prebuilt types)\n const skipTypegen = argv.includes(\"--skip-typegen\");\n if (!skipTypegen) {\n const typegenResult = await runTypegen({ config });\n if (typegenResult.isErr()) {\n return err(cliErrors.fromTypegen(typegenResult.error));\n }\n const { fragmentCount, operationCount, skippedFragmentCount, warnings: typegenWarnings } = typegenResult.value;\n const skippedNote = skippedFragmentCount > 0 ? ` (${skippedFragmentCount} skipped)` : \"\";\n messages.push(`[typegen] Generated ${fragmentCount} fragment(s)${skippedNote} and ${operationCount} operation(s)`);\n for (const w of typegenWarnings) {\n messages.push(` warning: ${w}`);\n }\n }\n\n return ok({ message: messages.join(\"\\n\") });\n};\n\n/**\n * Extract --config value from argv.\n */\nconst extractConfigFlag = (argv: readonly string[]): string | undefined => {\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--config\" && i + 1 < argv.length) {\n return argv[i + 1];\n }\n if (arg?.startsWith(\"--config=\")) {\n return arg.slice(\"--config=\".length);\n }\n }\n return undefined;\n};\n\n/**\n * Dispatcher for codegen subcommands.\n */\nexport const codegenCommand = async (argv: readonly string[]): Promise<CodegenCommandResult> => {\n const [subcommand, ...rest] = argv;\n\n // No args - run unified pipeline\n if (!subcommand) {\n return unifiedCodegen(argv);\n }\n\n // Help\n if (subcommand === \"--help\" || subcommand === \"-h\") {\n return ok({ message: CODEGEN_HELP });\n }\n\n // Explicit schema subcommand\n if (subcommand === \"schema\") {\n return schemaCommand(rest);\n }\n\n // Explicit graphql subcommand\n if (subcommand === \"graphql\") {\n return graphqlCommand(rest);\n }\n\n // Legacy support: --emit-inject-template routes to schema command\n if (isLegacySchemaArgs(argv)) {\n return schemaCommand(argv);\n }\n\n // Unknown subcommand\n if (!subcommand.startsWith(\"-\")) {\n return err(cliErrors.unknownSubcommand(\"codegen\", subcommand));\n }\n\n // Flags without subcommand (e.g., --config) - run unified pipeline\n return unifiedCodegen(argv);\n};\n","/**\n * Codegen freshness check.\n * @module\n */\n\nimport { existsSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { findConfigFile, loadConfig } from \"@soda-gql/config\";\nimport type { CheckResult, CodegenFreshnessData } from \"../types\";\n\n/**\n * Check if generated code is newer than schema files.\n */\nexport const checkCodegenFreshness = (): CheckResult<CodegenFreshnessData> => {\n const configPath = findConfigFile();\n\n if (!configPath) {\n return {\n name: \"Codegen Freshness\",\n status: \"skip\",\n message: \"No soda-gql.config.ts found\",\n data: { schemas: [] },\n };\n }\n\n const configResult = loadConfig(configPath);\n\n if (configResult.isErr()) {\n return {\n name: \"Codegen Freshness\",\n status: \"skip\",\n message: \"Could not load config\",\n data: { schemas: [] },\n };\n }\n\n const config = configResult.value;\n const generatedPath = join(config.outdir, \"index.ts\");\n\n if (!existsSync(generatedPath)) {\n return {\n name: \"Codegen Freshness\",\n status: \"warn\",\n message: \"Generated code not found - run codegen\",\n data: { schemas: [] },\n fix: \"Run: soda-gql codegen\",\n };\n }\n\n const generatedStat = statSync(generatedPath);\n const generatedMtime = generatedStat.mtimeMs;\n\n const schemaResults: CodegenFreshnessData[\"schemas\"][number][] = [];\n let hasStale = false;\n\n for (const [name, schemaConfig] of Object.entries(config.schemas)) {\n // Get the latest mtime from all schema files\n let maxSchemaMtime = 0;\n const existingPaths: string[] = [];\n\n for (const schemaPath of schemaConfig.schema) {\n if (!existsSync(schemaPath)) {\n continue; // Handled by config validation check\n }\n existingPaths.push(schemaPath);\n const schemaStat = statSync(schemaPath);\n maxSchemaMtime = Math.max(maxSchemaMtime, schemaStat.mtimeMs);\n }\n\n // Skip if no schema files exist\n if (existingPaths.length === 0) {\n continue;\n }\n\n const isStale = maxSchemaMtime > generatedMtime;\n if (isStale) hasStale = true;\n\n schemaResults.push({\n name,\n schemaPath: existingPaths.join(\", \"),\n generatedPath,\n schemaMtime: maxSchemaMtime,\n generatedMtime,\n isStale,\n });\n }\n\n if (hasStale) {\n const staleSchemas = schemaResults.filter((s) => s.isStale);\n return {\n name: \"Codegen Freshness\",\n status: \"warn\",\n message: `Schema modified after codegen: ${staleSchemas.map((s) => s.name).join(\", \")}`,\n data: { schemas: schemaResults },\n fix: \"Run: soda-gql codegen\",\n };\n }\n\n return {\n name: \"Codegen Freshness\",\n status: \"pass\",\n message: \"Generated code is up to date\",\n data: { schemas: schemaResults },\n };\n};\n","/**\n * Config validation check.\n * @module\n */\n\nimport { existsSync } from \"node:fs\";\nimport { findConfigFile, loadConfig } from \"@soda-gql/config\";\nimport type { CheckResult, ConfigValidationData } from \"../types\";\n\n/**\n * Check that config file is valid and referenced files exist.\n */\nexport const checkConfigValidation = (): CheckResult<ConfigValidationData> => {\n const configPath = findConfigFile();\n\n if (!configPath) {\n return {\n name: \"Config Validation\",\n status: \"skip\",\n message: \"No soda-gql.config.ts found\",\n data: { configPath: null, missingFiles: [] },\n };\n }\n\n const configResult = loadConfig(configPath);\n\n if (configResult.isErr()) {\n return {\n name: \"Config Validation\",\n status: \"fail\",\n message: `Config error: ${configResult.error.message}`,\n data: { configPath, missingFiles: [] },\n fix: \"Check your soda-gql.config.ts for syntax errors\",\n };\n }\n\n const config = configResult.value;\n const missingFiles: string[] = [];\n\n // Check schema files exist\n for (const [name, schemaConfig] of Object.entries(config.schemas)) {\n for (const schemaPath of schemaConfig.schema) {\n if (!existsSync(schemaPath)) {\n missingFiles.push(`Schema '${name}': ${schemaPath}`);\n }\n }\n if (!existsSync(schemaConfig.inject.scalars)) {\n missingFiles.push(`Scalars '${name}': ${schemaConfig.inject.scalars}`);\n }\n if (schemaConfig.inject.adapter && !existsSync(schemaConfig.inject.adapter)) {\n missingFiles.push(`Adapter '${name}': ${schemaConfig.inject.adapter}`);\n }\n }\n\n if (missingFiles.length > 0) {\n return {\n name: \"Config Validation\",\n status: \"fail\",\n message: `${missingFiles.length} referenced file(s) not found`,\n data: { configPath, missingFiles },\n fix: \"Create the missing files or update paths in config\",\n };\n }\n\n return {\n name: \"Config Validation\",\n status: \"pass\",\n message: \"Config loaded successfully\",\n data: { configPath, missingFiles: [] },\n };\n};\n","/**\n * Package discovery utilities for doctor command.\n * @module\n */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport type { DiscoveredPackage } from \"./types\";\n\nconst SODA_GQL_SCOPE = \"@soda-gql\";\n\n/**\n * Find the nearest node_modules directory.\n */\nexport const findNodeModules = (startDir: string = process.cwd()): string | null => {\n let currentDir = startDir;\n while (currentDir !== dirname(currentDir)) {\n const nodeModulesPath = join(currentDir, \"node_modules\");\n if (existsSync(nodeModulesPath) && statSync(nodeModulesPath).isDirectory()) {\n return nodeModulesPath;\n }\n currentDir = dirname(currentDir);\n }\n return null;\n};\n\n/**\n * Read package.json from a directory.\n */\nconst readPackageJson = (dir: string): Result<{ name: string; version: string }, string> => {\n const packageJsonPath = join(dir, \"package.json\");\n try {\n const content = readFileSync(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content) as { name?: string; version?: string };\n if (!pkg.name || !pkg.version) {\n return err(`Invalid package.json at ${packageJsonPath}`);\n }\n return ok({ name: pkg.name, version: pkg.version });\n } catch {\n return err(`Failed to read package.json at ${packageJsonPath}`);\n }\n};\n\n/**\n * Discover @soda-gql packages at a specific node_modules path.\n */\nconst discoverAtPath = (nodeModulesPath: string): DiscoveredPackage[] => {\n const scopePath = join(nodeModulesPath, SODA_GQL_SCOPE);\n if (!existsSync(scopePath)) {\n return [];\n }\n\n const packages: DiscoveredPackage[] = [];\n\n try {\n const entries = readdirSync(scopePath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const packageDir = join(scopePath, entry.name);\n const result = readPackageJson(packageDir);\n\n if (result.isOk()) {\n packages.push({\n name: result.value.name,\n version: result.value.version,\n path: packageDir,\n });\n }\n }\n } catch {\n // Ignore read errors\n }\n\n return packages;\n};\n\n/**\n * Discover all @soda-gql packages including nested node_modules.\n * Uses breadth-first search to avoid deep recursion.\n */\nexport const discoverAllSodaGqlPackages = (startDir: string = process.cwd()): Result<DiscoveredPackage[], string> => {\n const rootNodeModules = findNodeModules(startDir);\n if (!rootNodeModules) {\n return err(\"No node_modules directory found\");\n }\n\n const allPackages: DiscoveredPackage[] = [];\n const visitedPaths = new Set<string>();\n const queue: string[] = [rootNodeModules];\n\n while (queue.length > 0) {\n const nodeModulesPath = queue.shift();\n if (!nodeModulesPath) continue;\n\n // Resolve to handle symlinks\n let realPath: string;\n try {\n realPath = resolve(nodeModulesPath);\n } catch {\n continue;\n }\n\n if (visitedPaths.has(realPath)) continue;\n visitedPaths.add(realPath);\n\n // Discover packages at this level\n const packages = discoverAtPath(nodeModulesPath);\n allPackages.push(...packages);\n\n // Look for nested node_modules\n try {\n const entries = readdirSync(nodeModulesPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n // Check scoped packages\n if (entry.name.startsWith(\"@\")) {\n const scopeDir = join(nodeModulesPath, entry.name);\n try {\n const scopeEntries = readdirSync(scopeDir, { withFileTypes: true });\n\n for (const scopeEntry of scopeEntries) {\n if (!scopeEntry.isDirectory()) continue;\n const nestedNodeModules = join(scopeDir, scopeEntry.name, \"node_modules\");\n if (existsSync(nestedNodeModules)) {\n queue.push(nestedNodeModules);\n }\n }\n } catch {\n // Ignore read errors\n }\n } else {\n // Check regular packages\n const nestedNodeModules = join(nodeModulesPath, entry.name, \"node_modules\");\n if (existsSync(nestedNodeModules)) {\n queue.push(nestedNodeModules);\n }\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n\n return ok(allPackages);\n};\n\n/**\n * Get the soda-gql CLI version.\n */\nexport const getCliVersion = (): string => {\n try {\n // Navigate from this file (commands/doctor/discovery.ts) to package.json\n // Path: discovery.ts -> doctor/ -> commands/ -> src/ -> cli/package.json\n const cliPackageJsonPath = join(import.meta.dirname, \"..\", \"..\", \"..\", \"package.json\");\n const content = readFileSync(cliPackageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content) as { version?: string };\n return pkg.version ?? \"unknown\";\n } catch {\n return \"unknown\";\n }\n};\n\n/**\n * Get TypeScript version from node_modules.\n */\nexport const getTypescriptVersion = (startDir: string = process.cwd()): string | null => {\n const nodeModulesPath = findNodeModules(startDir);\n if (!nodeModulesPath) return null;\n\n const tsPackageJson = join(nodeModulesPath, \"typescript\", \"package.json\");\n try {\n const content = readFileSync(tsPackageJson, \"utf-8\");\n const pkg = JSON.parse(content) as { version?: string };\n return pkg.version ?? null;\n } catch {\n return null;\n }\n};\n","/**\n * Duplicate packages check.\n * @module\n */\n\nimport { discoverAllSodaGqlPackages } from \"../discovery\";\nimport type { CheckResult, DuplicatePackageData } from \"../types\";\n\n/**\n * Check for duplicate @soda-gql packages installed at different paths.\n */\nexport const checkDuplicatePackages = (): CheckResult<DuplicatePackageData> => {\n const packagesResult = discoverAllSodaGqlPackages();\n\n if (packagesResult.isErr()) {\n return {\n name: \"Duplicate Packages\",\n status: \"skip\",\n message: packagesResult.error,\n data: { duplicates: [] },\n };\n }\n\n const packages = packagesResult.value;\n\n // Group by package name\n const byName = new Map<string, typeof packages>();\n for (const pkg of packages) {\n const existing = byName.get(pkg.name) ?? [];\n existing.push(pkg);\n byName.set(pkg.name, existing);\n }\n\n // Find duplicates (same name, multiple paths)\n const duplicates: DuplicatePackageData[\"duplicates\"][number][] = [];\n for (const [name, instances] of byName) {\n if (instances.length > 1) {\n duplicates.push({\n name,\n instances: instances.map((i) => ({\n path: i.path,\n version: i.version,\n })),\n });\n }\n }\n\n if (duplicates.length === 0) {\n return {\n name: \"Duplicate Packages\",\n status: \"pass\",\n message: \"No duplicate packages detected\",\n data: { duplicates: [] },\n };\n }\n\n const duplicateNames = duplicates.map((d) => d.name).join(\", \");\n return {\n name: \"Duplicate Packages\",\n status: \"warn\",\n message: `Duplicate packages found: ${duplicateNames}`,\n data: { duplicates },\n fix: \"Run: rm -rf node_modules && bun install\",\n };\n};\n","/**\n * Version consistency check.\n * @module\n */\n\nimport { discoverAllSodaGqlPackages } from \"../discovery\";\nimport type { CheckResult, VersionConsistencyData } from \"../types\";\n\n/**\n * Check that all @soda-gql packages have consistent versions.\n */\nexport const checkVersionConsistency = (): CheckResult<VersionConsistencyData> => {\n const packagesResult = discoverAllSodaGqlPackages();\n\n if (packagesResult.isErr()) {\n return {\n name: \"Version Consistency\",\n status: \"skip\",\n message: packagesResult.error,\n data: { packages: [], expectedVersion: null },\n };\n }\n\n const packages = packagesResult.value;\n\n if (packages.length === 0) {\n return {\n name: \"Version Consistency\",\n status: \"skip\",\n message: \"No @soda-gql packages found\",\n data: { packages: [], expectedVersion: null },\n };\n }\n\n // Group by package name (to handle duplicates separately)\n const byName = new Map<string, typeof packages>();\n for (const pkg of packages) {\n const existing = byName.get(pkg.name) ?? [];\n existing.push(pkg);\n byName.set(pkg.name, existing);\n }\n\n // Get unique packages (first instance of each)\n const uniquePackages = Array.from(byName.values())\n .map((instances) => instances[0])\n .filter((pkg): pkg is (typeof packages)[number] => pkg !== undefined);\n\n // Determine expected version (most common version)\n const versionCounts = new Map<string, number>();\n for (const pkg of uniquePackages) {\n versionCounts.set(pkg.version, (versionCounts.get(pkg.version) ?? 0) + 1);\n }\n\n let expectedVersion = uniquePackages[0]?.version ?? null;\n let maxCount = 0;\n for (const [version, count] of versionCounts) {\n if (count > maxCount) {\n maxCount = count;\n expectedVersion = version;\n }\n }\n\n // Find mismatches\n const packageResults = uniquePackages.map((pkg) => ({\n name: pkg.name,\n version: pkg.version,\n path: pkg.path,\n isMismatch: pkg.version !== expectedVersion,\n }));\n\n const mismatches = packageResults.filter((p) => p.isMismatch);\n\n if (mismatches.length === 0) {\n return {\n name: \"Version Consistency\",\n status: \"pass\",\n message: `All ${uniquePackages.length} packages at version ${expectedVersion}`,\n data: { packages: packageResults, expectedVersion },\n };\n }\n\n const mismatchNames = mismatches.map((p) => p.name).join(\", \");\n return {\n name: \"Version Consistency\",\n status: \"fail\",\n message: `Version mismatch: ${mismatchNames}`,\n data: { packages: packageResults, expectedVersion },\n fix: `Run: bun update ${mismatches.map((p) => p.name).join(\" \")}`,\n };\n};\n","/**\n * Doctor command output formatting.\n * @module\n */\n\nimport type { CheckResult, CheckStatus, DoctorResult, DuplicatePackageData, VersionConsistencyData } from \"./types\";\n\nconst STATUS_SYMBOLS: Record<CheckStatus, string> = {\n pass: \"\\u2713\", // checkmark\n warn: \"!\",\n fail: \"\\u2717\", // X\n skip: \"-\",\n};\n\n/**\n * Type guard to check if data is an object (not null/primitive).\n */\nconst isObject = (data: unknown): data is Record<string, unknown> => {\n return typeof data === \"object\" && data !== null;\n};\n\n/**\n * Format a single check result for human output.\n */\nconst formatCheckResult = (result: CheckResult): string[] => {\n const lines: string[] = [];\n const symbol = STATUS_SYMBOLS[result.status];\n\n lines.push(`${symbol} ${result.message}`);\n\n // Add detailed data for failures/warnings\n if (result.status === \"fail\" || result.status === \"warn\") {\n const data = result.data;\n\n // Version consistency details\n if (isObject(data) && \"packages\" in data && \"expectedVersion\" in data) {\n const versionData = data as VersionConsistencyData;\n const mismatched = versionData.packages.filter((p) => p.isMismatch);\n for (const pkg of mismatched) {\n lines.push(` ${pkg.name}: ${pkg.version} <- mismatch`);\n }\n if (versionData.expectedVersion && mismatched.length > 0) {\n lines.push(` Expected: ${versionData.expectedVersion}`);\n }\n }\n\n // Duplicate packages details\n if (isObject(data) && \"duplicates\" in data) {\n const dupData = data as DuplicatePackageData;\n for (const dup of dupData.duplicates) {\n lines.push(` ${dup.name}:`);\n for (const instance of dup.instances) {\n lines.push(` ${instance.version} at ${instance.path}`);\n }\n }\n }\n\n // Fix suggestion\n if (result.fix) {\n lines.push(\"\");\n lines.push(` Fix: ${result.fix}`);\n }\n }\n\n return lines;\n};\n\n/**\n * Format the complete doctor result for human output.\n */\nexport const formatDoctorResult = (result: DoctorResult): string => {\n const lines: string[] = [];\n\n lines.push(`soda-gql doctor v${result.version}`);\n lines.push(\"\");\n\n for (const check of result.checks) {\n lines.push(...formatCheckResult(check));\n lines.push(\"\");\n }\n\n // Summary\n const passed = result.checks.filter((c) => c.status === \"pass\").length;\n\n if (result.issueCount === 0 && result.warningCount === 0) {\n lines.push(`Summary: All ${passed} checks passed`);\n } else {\n const parts: string[] = [];\n if (result.issueCount > 0) {\n parts.push(`${result.issueCount} issue${result.issueCount > 1 ? \"s\" : \"\"}`);\n }\n if (result.warningCount > 0) {\n parts.push(`${result.warningCount} warning${result.warningCount > 1 ? \"s\" : \"\"}`);\n }\n lines.push(`Summary: ${parts.join(\", \")} found`);\n }\n\n return lines.join(\"\\n\");\n};\n","/**\n * Doctor command entry point.\n * @module\n */\n\nimport { ok } from \"neverthrow\";\nimport type { CommandResult, CommandSuccess } from \"../../types\";\nimport { checkCodegenFreshness } from \"./checks/codegen-freshness\";\nimport { checkConfigValidation } from \"./checks/config-validation\";\nimport { checkDuplicatePackages } from \"./checks/duplicate-packages\";\nimport { checkVersionConsistency } from \"./checks/version-consistency\";\nimport { getCliVersion, getTypescriptVersion } from \"./discovery\";\nimport { formatDoctorResult } from \"./output\";\nimport type { CheckResult, DoctorResult } from \"./types\";\n\nconst DOCTOR_HELP = `Usage: soda-gql doctor\n\nRun diagnostic checks on your soda-gql installation.\n\nChecks performed:\n - Version consistency across @soda-gql packages\n - Duplicate package detection\n - Config file validation\n - Codegen freshness (schema vs generated code)\n\nOptions:\n --help, -h Show this help message\n`;\n\ntype DoctorCommandResult = CommandResult<CommandSuccess & { data?: DoctorResult }>;\n\nexport const doctorCommand = (argv: readonly string[]): DoctorCommandResult => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n return ok({ message: DOCTOR_HELP });\n }\n\n const version = getCliVersion();\n const tsVersion = getTypescriptVersion();\n\n // Run all checks\n const checks: CheckResult[] = [];\n\n // Add TypeScript version as informational\n if (tsVersion) {\n checks.push({\n name: \"TypeScript Version\",\n status: \"pass\",\n message: `TypeScript version: ${tsVersion}`,\n });\n }\n\n // Phase 1 checks\n checks.push(checkVersionConsistency());\n checks.push(checkDuplicatePackages());\n\n // Phase 2 checks\n checks.push(checkConfigValidation());\n checks.push(checkCodegenFreshness());\n\n // Calculate summary\n const issueCount = checks.filter((c) => c.status === \"fail\").length;\n const warningCount = checks.filter((c) => c.status === \"warn\").length;\n\n const result: DoctorResult = {\n version,\n checks,\n issueCount,\n warningCount,\n };\n\n const message = formatDoctorResult(result);\n\n return ok({ message, data: result });\n};\n","import { access, readFile, writeFile } from \"node:fs/promises\";\nimport { loadConfig } from \"@soda-gql/config\";\nimport fg from \"fast-glob\";\nimport { err, ok } from \"neverthrow\";\nimport { cliErrors } from \"../errors\";\nimport { FormatArgsSchema } from \"../schemas/args\";\nimport type { CommandResult, CommandSuccess } from \"../types\";\nimport { parseArgs } from \"../utils/parse-args\";\n\ntype FormatterModule = typeof import(\"../../formatter\");\n\nconst loadFormatter = async (): Promise<FormatterModule | null> => {\n try {\n return await import(\"../../formatter\");\n } catch {\n return null;\n }\n};\n\ntype FormatData = {\n mode: \"format\" | \"check\";\n total: number;\n modified: number;\n unchanged: number;\n errors: number;\n unformatted: string[];\n hasFormattingIssues: boolean;\n};\n\nconst formatResultMessage = (data: FormatData): string => {\n if (data.mode === \"check\") {\n if (data.unformatted.length > 0) {\n const files = data.unformatted.map((f) => ` ${f}`).join(\"\\n\");\n return `${data.unformatted.length} file(s) need formatting:\\n${files}`;\n }\n const msg = `All ${data.total} file(s) are properly formatted`;\n if (data.errors > 0) {\n return `${msg} (${data.errors} file(s) had parse errors)`;\n }\n return msg;\n }\n\n const parts: string[] = [];\n if (data.modified > 0) {\n parts.push(`${data.modified} formatted`);\n }\n if (data.unchanged > 0) {\n parts.push(`${data.unchanged} unchanged`);\n }\n if (data.errors > 0) {\n parts.push(`${data.errors} errors`);\n }\n return `${data.total} file(s) checked: ${parts.join(\", \")}`;\n};\n\nconst isGlobPattern = (pattern: string): boolean => {\n return /[*?[\\]{}]/.test(pattern);\n};\n\nconst expandGlobPatterns = async (patterns: readonly string[], excludePatterns: readonly string[] = []): Promise<string[]> => {\n const files: string[] = [];\n\n for (const pattern of patterns) {\n if (!isGlobPattern(pattern)) {\n // Direct file path - check if it exists\n try {\n await access(pattern);\n files.push(pattern);\n } catch {\n // File doesn't exist, skip it\n }\n continue;\n }\n\n // Glob pattern - use fast-glob with ignore\n const matches = await fg(pattern, {\n absolute: true,\n ignore: [...excludePatterns],\n });\n files.push(...matches);\n }\n\n return [...new Set(files)];\n};\n\nconst FORMAT_HELP = `Usage: soda-gql format [patterns...] [options]\n\nFormat soda-gql field selections by inserting empty comments.\n\nOptions:\n --config <path> Path to soda-gql.config.ts (auto-detected if omitted)\n --check Check if files need formatting (exit 1 if unformatted)\n --inject-fragment-keys Inject unique keys into anonymous fragments\n --help, -h Show this help message\n\nExamples:\n soda-gql format # Use config include/exclude\n soda-gql format \"src/**/*.ts\" # Override with explicit patterns\n soda-gql format --check # Check mode with config\n soda-gql format --inject-fragment-keys # Inject fragment keys\n`;\n\ntype FormatCommandResult = CommandResult<CommandSuccess & { data?: FormatData }>;\n\nexport const formatCommand = async (argv: readonly string[]): Promise<FormatCommandResult> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n return ok({ message: FORMAT_HELP });\n }\n\n const parsed = parseArgs([...argv], FormatArgsSchema);\n\n if (!parsed.isOk()) {\n return err(cliErrors.argsInvalid(\"format\", parsed.error));\n }\n\n const args = parsed.value;\n const isCheckMode = args.check === true;\n const injectFragmentKeys = args[\"inject-fragment-keys\"] === true;\n const explicitPatterns = args._ ?? [];\n\n // Determine patterns: use explicit patterns or load from config\n let targetPatterns: readonly string[];\n let excludePatterns: readonly string[] = [];\n\n if (explicitPatterns.length > 0) {\n targetPatterns = explicitPatterns;\n } else {\n // Try to load patterns from config\n const configResult = loadConfig(args.config);\n if (configResult.isErr()) {\n return err(cliErrors.noPatterns());\n }\n targetPatterns = configResult.value.include;\n excludePatterns = configResult.value.exclude;\n }\n\n // Load formatter lazily - it's an optional dependency\n const formatter = await loadFormatter();\n if (!formatter) {\n return err(cliErrors.formatterNotInstalled());\n }\n\n const files = await expandGlobPatterns(targetPatterns, excludePatterns);\n\n if (files.length === 0) {\n const data: FormatData = {\n mode: isCheckMode ? \"check\" : \"format\",\n total: 0,\n modified: 0,\n unchanged: 0,\n errors: 0,\n unformatted: [],\n hasFormattingIssues: false,\n };\n return ok({ message: formatResultMessage(data), data });\n }\n\n let modified = 0;\n let unchanged = 0;\n let errors = 0;\n const unformatted: string[] = [];\n\n for (const filePath of files) {\n const sourceCode = await readFile(filePath, \"utf-8\");\n\n if (isCheckMode) {\n const result = formatter.needsFormat({ sourceCode, filePath });\n if (result.isErr()) {\n errors++;\n continue;\n }\n if (result.value) {\n unformatted.push(filePath);\n modified++;\n } else {\n unchanged++;\n }\n } else {\n const result = formatter.format({ sourceCode, filePath, injectFragmentKeys });\n if (result.isErr()) {\n errors++;\n continue;\n }\n if (result.value.modified) {\n try {\n await writeFile(filePath, result.value.sourceCode, \"utf-8\");\n modified++;\n } catch {\n errors++;\n }\n } else {\n unchanged++;\n }\n }\n }\n\n const data: FormatData = {\n mode: isCheckMode ? \"check\" : \"format\",\n total: files.length,\n modified,\n unchanged,\n errors,\n unformatted,\n hasFormattingIssues: isCheckMode\n ? unformatted.length > 0 || errors > 0 // check mode: unformatted or parse errors\n : errors > 0, // format mode: errors (write failures, etc.) still trigger exit 1\n };\n\n return ok({ message: formatResultMessage(data), data });\n};\n","export const getConfigTemplate = (): string => `\\\nimport { defineConfig } from \"@soda-gql/config\";\n\nexport default defineConfig({\n outdir: \"./graphql-system\",\n include: [\"./src/**/*.ts\"],\n schemas: {\n default: {\n schema: \"./schema.graphql\",\n inject: \"./graphql-system/default.inject.ts\",\n },\n },\n});\n`;\n","export const getGitignoreTemplate = (): string => `\\\n/index.ts\n/index.cjs\n`;\n","export const getInjectTemplate = (): string => `\\\nimport { defineAdapter, defineScalar } from \"@soda-gql/core/adapter\";\n\nexport const scalar = {\n ...defineScalar<\"ID\", string, string>(\"ID\"),\n ...defineScalar<\"String\", string, string>(\"String\"),\n ...defineScalar<\"Int\", number, number>(\"Int\"),\n ...defineScalar<\"Float\", number, number>(\"Float\"),\n ...defineScalar<\"Boolean\", boolean, boolean>(\"Boolean\"),\n} as const;\n\nexport const adapter = defineAdapter({\n helpers: {},\n metadata: {\n aggregateFragmentMetadata: (fragments) => fragments.map((m) => m.metadata),\n },\n});\n`;\n","export const getSchemaTemplate = (): string => `\\\ntype Query {\n hello: String!\n}\n`;\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { err, ok, type Result } from \"neverthrow\";\n\nimport { type CliError, cliErrors } from \"../errors\";\nimport { InitArgsSchema } from \"../schemas/args\";\nimport { getConfigTemplate } from \"../templates/config.template\";\nimport { getGitignoreTemplate } from \"../templates/gitignore.template\";\nimport { getInjectTemplate } from \"../templates/inject.template\";\nimport { getSchemaTemplate } from \"../templates/schema.template\";\nimport type { CommandResult, CommandSuccess } from \"../types\";\nimport { parseArgs } from \"../utils/parse-args\";\n\ntype FileToGenerate = {\n readonly path: string;\n readonly content: string;\n readonly description: string;\n};\n\ntype InitSuccess = {\n readonly filesCreated: readonly string[];\n};\n\nconst INIT_HELP = `Usage: soda-gql init [options]\n\nInitialize a new soda-gql project with starter configuration.\n\nOptions:\n --force Overwrite existing files\n --help, -h Show this help message\n\nGenerated files:\n soda-gql.config.ts Configuration file\n schema.graphql Sample GraphQL schema\n graphql-system/default.inject.ts Scalars, helpers, and metadata adapter\n graphql-system/.gitignore Ignore generated files\n`;\n\nconst checkFilesExist = (files: readonly FileToGenerate[], force: boolean): Result<void, CliError> => {\n if (force) {\n return ok(undefined);\n }\n\n for (const file of files) {\n if (existsSync(file.path)) {\n return err(cliErrors.fileExists(file.path));\n }\n }\n\n return ok(undefined);\n};\n\nconst writeFiles = (files: readonly FileToGenerate[]): Result<InitSuccess, CliError> => {\n const createdPaths: string[] = [];\n\n for (const file of files) {\n try {\n const dir = dirname(file.path);\n mkdirSync(dir, { recursive: true });\n writeFileSync(file.path, file.content);\n createdPaths.push(file.path);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return err(cliErrors.writeFailed(file.path, `Failed to write ${file.description}: ${message}`, error));\n }\n }\n\n return ok({ filesCreated: createdPaths });\n};\n\nconst formatSuccess = (result: InitSuccess): string => {\n const lines = [\"soda-gql project initialized successfully!\", \"\", \"Created files:\"];\n for (const file of result.filesCreated) {\n lines.push(` ${file}`);\n }\n lines.push(\"\", \"Next steps:\");\n lines.push(\" 1. Edit schema.graphql with your GraphQL types\");\n lines.push(\" 2. Run: soda-gql codegen\");\n lines.push(\" 3. Import gql from ./graphql-system\");\n return lines.join(\"\\n\");\n};\n\ntype InitCommandResult = CommandResult<CommandSuccess & { data?: InitSuccess }>;\n\nexport const initCommand = async (argv: readonly string[]): Promise<InitCommandResult> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n return ok({ message: INIT_HELP });\n }\n\n const parsed = parseArgs([...argv], InitArgsSchema);\n\n if (!parsed.isOk()) {\n return err(cliErrors.argsInvalid(\"init\", parsed.error));\n }\n\n const args = parsed.value;\n const force = args.force === true;\n const cwd = process.cwd();\n\n const files: FileToGenerate[] = [\n {\n path: resolve(cwd, \"soda-gql.config.ts\"),\n content: getConfigTemplate(),\n description: \"configuration file\",\n },\n {\n path: resolve(cwd, \"schema.graphql\"),\n content: getSchemaTemplate(),\n description: \"GraphQL schema\",\n },\n {\n path: resolve(cwd, \"graphql-system/default.inject.ts\"),\n content: getInjectTemplate(),\n description: \"inject module\",\n },\n {\n path: resolve(cwd, \"graphql-system/.gitignore\"),\n content: getGitignoreTemplate(),\n description: \"gitignore file\",\n },\n ];\n\n const existsCheck = checkFilesExist(files, force);\n if (existsCheck.isErr()) {\n return err(existsCheck.error);\n }\n\n const writeResult = writeFiles(files);\n if (writeResult.isErr()) {\n return err(writeResult.error);\n }\n\n return ok({ message: formatSuccess(writeResult.value), data: writeResult.value });\n};\n","const LSP_HELP = `Usage: soda-gql lsp [options]\n\nStart the GraphQL Language Server Protocol server.\n\nThe LSP server communicates over stdio and provides:\n - Diagnostics (validation errors in GraphQL templates)\n - Autocompletion (field, argument, type suggestions)\n - Hover information (type details on hover)\n\nOptions:\n --help, -h Show this help message\n\nThe server is typically started by an editor extension, not directly by users.\nConfigure your editor to use 'soda-gql lsp' as the GraphQL language server command.`;\n\nexport const lspCommand = async (argv: readonly string[]): Promise<never> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n process.stdout.write(`${LSP_HELP}\\n`);\n process.exit(0);\n }\n\n // Dynamic import to avoid loading LSP deps for other commands\n let createLspServer: typeof import(\"@soda-gql/lsp\")[\"createLspServer\"];\n try {\n ({ createLspServer } = await import(\"@soda-gql/lsp\"));\n } catch {\n process.stderr.write(\"Error: @soda-gql/lsp is not installed.\\n\" + \"Install it with: bun add -D @soda-gql/lsp\\n\");\n process.exit(1);\n }\n const server = createLspServer();\n server.start();\n\n // Server runs indefinitely via stdio; this promise never resolves\n await new Promise(() => {});\n // TypeScript needs this for the `never` return type\n throw new Error(\"unreachable\");\n};\n","'use strict';\n\nconst path = require('path');\nconst WIN_SLASH = '\\\\\\\\/';\nconst WIN_NO_SLASH = `[^${WIN_SLASH}]`;\n\n/**\n * Posix glob regex\n */\n\nconst DOT_LITERAL = '\\\\.';\nconst PLUS_LITERAL = '\\\\+';\nconst QMARK_LITERAL = '\\\\?';\nconst SLASH_LITERAL = '\\\\/';\nconst ONE_CHAR = '(?=.)';\nconst QMARK = '[^/]';\nconst END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;\nconst START_ANCHOR = `(?:^|${SLASH_LITERAL})`;\nconst DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;\nconst NO_DOT = `(?!${DOT_LITERAL})`;\nconst NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;\nconst NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;\nconst NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;\nconst QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;\nconst STAR = `${QMARK}*?`;\n\nconst POSIX_CHARS = {\n DOT_LITERAL,\n PLUS_LITERAL,\n QMARK_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n QMARK,\n END_ANCHOR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n};\n\n/**\n * Windows glob regex\n */\n\nconst WINDOWS_CHARS = {\n ...POSIX_CHARS,\n\n SLASH_LITERAL: `[${WIN_SLASH}]`,\n QMARK: WIN_NO_SLASH,\n STAR: `${WIN_NO_SLASH}*?`,\n DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,\n NO_DOT: `(?!${DOT_LITERAL})`,\n NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,\n NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n QMARK_NO_DOT: `[^.${WIN_SLASH}]`,\n START_ANCHOR: `(?:^|[${WIN_SLASH}])`,\n END_ANCHOR: `(?:[${WIN_SLASH}]|$)`\n};\n\n/**\n * POSIX Bracket Regex\n */\n\nconst POSIX_REGEX_SOURCE = {\n alnum: 'a-zA-Z0-9',\n alpha: 'a-zA-Z',\n ascii: '\\\\x00-\\\\x7F',\n blank: ' \\\\t',\n cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n digit: '0-9',\n graph: '\\\\x21-\\\\x7E',\n lower: 'a-z',\n print: '\\\\x20-\\\\x7E ',\n punct: '\\\\-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n upper: 'A-Z',\n word: 'A-Za-z0-9_',\n xdigit: 'A-Fa-f0-9'\n};\n\nmodule.exports = {\n MAX_LENGTH: 1024 * 64,\n POSIX_REGEX_SOURCE,\n\n // regular expressions\n REGEX_BACKSLASH: /\\\\(?![*+?^${}(|)[\\]])/g,\n REGEX_NON_SPECIAL_CHARS: /^[^@![\\].,$*+?^{}()|\\\\/]+/,\n REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\\]]/,\n REGEX_SPECIAL_CHARS_BACKREF: /(\\\\?)((\\W)(\\3*))/g,\n REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\\]])/g,\n REGEX_REMOVE_BACKSLASH: /(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,\n\n // Replace globs with equivalent patterns to reduce parsing time.\n REPLACEMENTS: {\n '***': '*',\n '**/**': '**',\n '**/**/**': '**'\n },\n\n // Digits\n CHAR_0: 48, /* 0 */\n CHAR_9: 57, /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 65, /* A */\n CHAR_LOWERCASE_A: 97, /* a */\n CHAR_UPPERCASE_Z: 90, /* Z */\n CHAR_LOWERCASE_Z: 122, /* z */\n\n CHAR_LEFT_PARENTHESES: 40, /* ( */\n CHAR_RIGHT_PARENTHESES: 41, /* ) */\n\n CHAR_ASTERISK: 42, /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: 38, /* & */\n CHAR_AT: 64, /* @ */\n CHAR_BACKWARD_SLASH: 92, /* \\ */\n CHAR_CARRIAGE_RETURN: 13, /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */\n CHAR_COLON: 58, /* : */\n CHAR_COMMA: 44, /* , */\n CHAR_DOT: 46, /* . */\n CHAR_DOUBLE_QUOTE: 34, /* \" */\n CHAR_EQUAL: 61, /* = */\n CHAR_EXCLAMATION_MARK: 33, /* ! */\n CHAR_FORM_FEED: 12, /* \\f */\n CHAR_FORWARD_SLASH: 47, /* / */\n CHAR_GRAVE_ACCENT: 96, /* ` */\n CHAR_HASH: 35, /* # */\n CHAR_HYPHEN_MINUS: 45, /* - */\n CHAR_LEFT_ANGLE_BRACKET: 60, /* < */\n CHAR_LEFT_CURLY_BRACE: 123, /* { */\n CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */\n CHAR_LINE_FEED: 10, /* \\n */\n CHAR_NO_BREAK_SPACE: 160, /* \\u00A0 */\n CHAR_PERCENT: 37, /* % */\n CHAR_PLUS: 43, /* + */\n CHAR_QUESTION_MARK: 63, /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */\n CHAR_RIGHT_CURLY_BRACE: 125, /* } */\n CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */\n CHAR_SEMICOLON: 59, /* ; */\n CHAR_SINGLE_QUOTE: 39, /* ' */\n CHAR_SPACE: 32, /* */\n CHAR_TAB: 9, /* \\t */\n CHAR_UNDERSCORE: 95, /* _ */\n CHAR_VERTICAL_LINE: 124, /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \\uFEFF */\n\n SEP: path.sep,\n\n /**\n * Create EXTGLOB_CHARS\n */\n\n extglobChars(chars) {\n return {\n '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },\n '?': { type: 'qmark', open: '(?:', close: ')?' },\n '+': { type: 'plus', open: '(?:', close: ')+' },\n '*': { type: 'star', open: '(?:', close: ')*' },\n '@': { type: 'at', open: '(?:', close: ')' }\n };\n },\n\n /**\n * Create GLOB_CHARS\n */\n\n globChars(win32) {\n return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;\n }\n};\n","'use strict';\n\nconst path = require('path');\nconst win32 = process.platform === 'win32';\nconst {\n REGEX_BACKSLASH,\n REGEX_REMOVE_BACKSLASH,\n REGEX_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_GLOBAL\n} = require('./constants');\n\nexports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\nexports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);\nexports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);\nexports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\\\$1');\nexports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');\n\nexports.removeBackslashes = str => {\n return str.replace(REGEX_REMOVE_BACKSLASH, match => {\n return match === '\\\\' ? '' : match;\n });\n};\n\nexports.supportsLookbehinds = () => {\n const segs = process.version.slice(1).split('.').map(Number);\n if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {\n return true;\n }\n return false;\n};\n\nexports.isWindows = options => {\n if (options && typeof options.windows === 'boolean') {\n return options.windows;\n }\n return win32 === true || path.sep === '\\\\';\n};\n\nexports.escapeLast = (input, char, lastIdx) => {\n const idx = input.lastIndexOf(char, lastIdx);\n if (idx === -1) return input;\n if (input[idx - 1] === '\\\\') return exports.escapeLast(input, char, idx - 1);\n return `${input.slice(0, idx)}\\\\${input.slice(idx)}`;\n};\n\nexports.removePrefix = (input, state = {}) => {\n let output = input;\n if (output.startsWith('./')) {\n output = output.slice(2);\n state.prefix = './';\n }\n return output;\n};\n\nexports.wrapOutput = (input, state = {}, options = {}) => {\n const prepend = options.contains ? '' : '^';\n const append = options.contains ? '' : '$';\n\n let output = `${prepend}(?:${input})${append}`;\n if (state.negated === true) {\n output = `(?:^(?!${output}).*$)`;\n }\n return output;\n};\n","'use strict';\n\nconst utils = require('./utils');\nconst {\n CHAR_ASTERISK, /* * */\n CHAR_AT, /* @ */\n CHAR_BACKWARD_SLASH, /* \\ */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_EXCLAMATION_MARK, /* ! */\n CHAR_FORWARD_SLASH, /* / */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_PLUS, /* + */\n CHAR_QUESTION_MARK, /* ? */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_RIGHT_SQUARE_BRACKET /* ] */\n} = require('./constants');\n\nconst isPathSeparator = code => {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n};\n\nconst depth = token => {\n if (token.isPrefix !== true) {\n token.depth = token.isGlobstar ? Infinity : 1;\n }\n};\n\n/**\n * Quickly scans a glob pattern and returns an object with a handful of\n * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),\n * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not\n * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).\n *\n * ```js\n * const pm = require('picomatch');\n * console.log(pm.scan('foo/bar/*.js'));\n * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an object with tokens and regex source string.\n * @api public\n */\n\nconst scan = (input, options) => {\n const opts = options || {};\n\n const length = input.length - 1;\n const scanToEnd = opts.parts === true || opts.scanToEnd === true;\n const slashes = [];\n const tokens = [];\n const parts = [];\n\n let str = input;\n let index = -1;\n let start = 0;\n let lastIndex = 0;\n let isBrace = false;\n let isBracket = false;\n let isGlob = false;\n let isExtglob = false;\n let isGlobstar = false;\n let braceEscaped = false;\n let backslashes = false;\n let negated = false;\n let negatedExtglob = false;\n let finished = false;\n let braces = 0;\n let prev;\n let code;\n let token = { value: '', depth: 0, isGlob: false };\n\n const eos = () => index >= length;\n const peek = () => str.charCodeAt(index + 1);\n const advance = () => {\n prev = code;\n return str.charCodeAt(++index);\n };\n\n while (index < length) {\n code = advance();\n let next;\n\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braceEscaped = true;\n }\n continue;\n }\n\n if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n continue;\n }\n\n if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (braceEscaped !== true && code === CHAR_COMMA) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_RIGHT_CURLY_BRACE) {\n braces--;\n\n if (braces === 0) {\n braceEscaped = false;\n isBrace = token.isBrace = true;\n finished = true;\n break;\n }\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_FORWARD_SLASH) {\n slashes.push(index);\n tokens.push(token);\n token = { value: '', depth: 0, isGlob: false };\n\n if (finished === true) continue;\n if (prev === CHAR_DOT && index === (start + 1)) {\n start += 2;\n continue;\n }\n\n lastIndex = index + 1;\n continue;\n }\n\n if (opts.noext !== true) {\n const isExtglobChar = code === CHAR_PLUS\n || code === CHAR_AT\n || code === CHAR_ASTERISK\n || code === CHAR_QUESTION_MARK\n || code === CHAR_EXCLAMATION_MARK;\n\n if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n isExtglob = token.isExtglob = true;\n finished = true;\n if (code === CHAR_EXCLAMATION_MARK && index === start) {\n negatedExtglob = true;\n }\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n }\n\n if (code === CHAR_ASTERISK) {\n if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_QUESTION_MARK) {\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_LEFT_SQUARE_BRACKET) {\n while (eos() !== true && (next = advance())) {\n if (next === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n isBracket = token.isBracket = true;\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {\n negated = token.negated = true;\n start++;\n continue;\n }\n\n if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_LEFT_PARENTHESES) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n\n if (isGlob === true) {\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n }\n\n if (opts.noext === true) {\n isExtglob = false;\n isGlob = false;\n }\n\n let base = str;\n let prefix = '';\n let glob = '';\n\n if (start > 0) {\n prefix = str.slice(0, start);\n str = str.slice(start);\n lastIndex -= start;\n }\n\n if (base && isGlob === true && lastIndex > 0) {\n base = str.slice(0, lastIndex);\n glob = str.slice(lastIndex);\n } else if (isGlob === true) {\n base = '';\n glob = str;\n } else {\n base = str;\n }\n\n if (base && base !== '' && base !== '/' && base !== str) {\n if (isPathSeparator(base.charCodeAt(base.length - 1))) {\n base = base.slice(0, -1);\n }\n }\n\n if (opts.unescape === true) {\n if (glob) glob = utils.removeBackslashes(glob);\n\n if (base && backslashes === true) {\n base = utils.removeBackslashes(base);\n }\n }\n\n const state = {\n prefix,\n input,\n start,\n base,\n glob,\n isBrace,\n isBracket,\n isGlob,\n isExtglob,\n isGlobstar,\n negated,\n negatedExtglob\n };\n\n if (opts.tokens === true) {\n state.maxDepth = 0;\n if (!isPathSeparator(code)) {\n tokens.push(token);\n }\n state.tokens = tokens;\n }\n\n if (opts.parts === true || opts.tokens === true) {\n let prevIndex;\n\n for (let idx = 0; idx < slashes.length; idx++) {\n const n = prevIndex ? prevIndex + 1 : start;\n const i = slashes[idx];\n const value = input.slice(n, i);\n if (opts.tokens) {\n if (idx === 0 && start !== 0) {\n tokens[idx].isPrefix = true;\n tokens[idx].value = prefix;\n } else {\n tokens[idx].value = value;\n }\n depth(tokens[idx]);\n state.maxDepth += tokens[idx].depth;\n }\n if (idx !== 0 || value !== '') {\n parts.push(value);\n }\n prevIndex = i;\n }\n\n if (prevIndex && prevIndex + 1 < input.length) {\n const value = input.slice(prevIndex + 1);\n parts.push(value);\n\n if (opts.tokens) {\n tokens[tokens.length - 1].value = value;\n depth(tokens[tokens.length - 1]);\n state.maxDepth += tokens[tokens.length - 1].depth;\n }\n }\n\n state.slashes = slashes;\n state.parts = parts;\n }\n\n return state;\n};\n\nmodule.exports = scan;\n","'use strict';\n\nconst constants = require('./constants');\nconst utils = require('./utils');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n POSIX_REGEX_SOURCE,\n REGEX_NON_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_BACKREF,\n REPLACEMENTS\n} = constants;\n\n/**\n * Helpers\n */\n\nconst expandRange = (args, options) => {\n if (typeof options.expandRange === 'function') {\n return options.expandRange(...args, options);\n }\n\n args.sort();\n const value = `[${args.join('-')}]`;\n\n try {\n /* eslint-disable-next-line no-new */\n new RegExp(value);\n } catch (ex) {\n return args.map(v => utils.escapeRegex(v)).join('..');\n }\n\n return value;\n};\n\n/**\n * Create the message for a syntax error\n */\n\nconst syntaxError = (type, char) => {\n return `Missing ${type}: \"${char}\" - use \"\\\\\\\\${char}\" to match literal characters`;\n};\n\n/**\n * Parse the given input string.\n * @param {String} input\n * @param {Object} options\n * @return {Object}\n */\n\nconst parse = (input, options) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n input = REPLACEMENTS[input] || input;\n\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n\n let len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n const bos = { type: 'bos', value: '', output: opts.prepend || '' };\n const tokens = [bos];\n\n const capture = opts.capture ? '' : '?:';\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const PLATFORM_CHARS = constants.globChars(win32);\n const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);\n\n const {\n DOT_LITERAL,\n PLUS_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n } = PLATFORM_CHARS;\n\n const globstar = opts => {\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const nodot = opts.dot ? '' : NO_DOT;\n const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;\n let star = opts.bash === true ? globstar(opts) : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n // minimatch options support\n if (typeof opts.noext === 'boolean') {\n opts.noextglob = opts.noext;\n }\n\n const state = {\n input,\n index: -1,\n start: 0,\n dot: opts.dot === true,\n consumed: '',\n output: '',\n prefix: '',\n backtrack: false,\n negated: false,\n brackets: 0,\n braces: 0,\n parens: 0,\n quotes: 0,\n globstar: false,\n tokens\n };\n\n input = utils.removePrefix(input, state);\n len = input.length;\n\n const extglobs = [];\n const braces = [];\n const stack = [];\n let prev = bos;\n let value;\n\n /**\n * Tokenizing helpers\n */\n\n const eos = () => state.index === len - 1;\n const peek = state.peek = (n = 1) => input[state.index + n];\n const advance = state.advance = () => input[++state.index] || '';\n const remaining = () => input.slice(state.index + 1);\n const consume = (value = '', num = 0) => {\n state.consumed += value;\n state.index += num;\n };\n\n const append = token => {\n state.output += token.output != null ? token.output : token.value;\n consume(token.value);\n };\n\n const negate = () => {\n let count = 1;\n\n while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {\n advance();\n state.start++;\n count++;\n }\n\n if (count % 2 === 0) {\n return false;\n }\n\n state.negated = true;\n state.start++;\n return true;\n };\n\n const increment = type => {\n state[type]++;\n stack.push(type);\n };\n\n const decrement = type => {\n state[type]--;\n stack.pop();\n };\n\n /**\n * Push tokens onto the tokens array. This helper speeds up\n * tokenizing by 1) helping us avoid backtracking as much as possible,\n * and 2) helping us avoid creating extra tokens when consecutive\n * characters are plain text. This improves performance and simplifies\n * lookbehinds.\n */\n\n const push = tok => {\n if (prev.type === 'globstar') {\n const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');\n const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));\n\n if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {\n state.output = state.output.slice(0, -prev.output.length);\n prev.type = 'star';\n prev.value = '*';\n prev.output = star;\n state.output += prev.output;\n }\n }\n\n if (extglobs.length && tok.type !== 'paren') {\n extglobs[extglobs.length - 1].inner += tok.value;\n }\n\n if (tok.value || tok.output) append(tok);\n if (prev && prev.type === 'text' && tok.type === 'text') {\n prev.value += tok.value;\n prev.output = (prev.output || '') + tok.value;\n return;\n }\n\n tok.prev = prev;\n tokens.push(tok);\n prev = tok;\n };\n\n const extglobOpen = (type, value) => {\n const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };\n\n token.prev = prev;\n token.parens = state.parens;\n token.output = state.output;\n const output = (opts.capture ? '(' : '') + token.open;\n\n increment('parens');\n push({ type, value, output: state.output ? '' : ONE_CHAR });\n push({ type: 'paren', extglob: true, value: advance(), output });\n extglobs.push(token);\n };\n\n const extglobClose = token => {\n let output = token.close + (opts.capture ? ')' : '');\n let rest;\n\n if (token.type === 'negate') {\n let extglobStar = star;\n\n if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {\n extglobStar = globstar(opts);\n }\n\n if (extglobStar !== star || eos() || /^\\)+$/.test(remaining())) {\n output = token.close = `)$))${extglobStar}`;\n }\n\n if (token.inner.includes('*') && (rest = remaining()) && /^\\.[^\\\\/.]+$/.test(rest)) {\n // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.\n // In this case, we need to parse the string and use it in the output of the original pattern.\n // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.\n //\n // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.\n const expression = parse(rest, { ...options, fastpaths: false }).output;\n\n output = token.close = `)${expression})${extglobStar})`;\n }\n\n if (token.prev.type === 'bos') {\n state.negatedExtglob = true;\n }\n }\n\n push({ type: 'paren', extglob: true, value, output });\n decrement('parens');\n };\n\n /**\n * Fast paths\n */\n\n if (opts.fastpaths !== false && !/(^[*!]|[/()[\\]{}\"])/.test(input)) {\n let backslashes = false;\n\n let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {\n if (first === '\\\\') {\n backslashes = true;\n return m;\n }\n\n if (first === '?') {\n if (esc) {\n return esc + first + (rest ? QMARK.repeat(rest.length) : '');\n }\n if (index === 0) {\n return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');\n }\n return QMARK.repeat(chars.length);\n }\n\n if (first === '.') {\n return DOT_LITERAL.repeat(chars.length);\n }\n\n if (first === '*') {\n if (esc) {\n return esc + first + (rest ? star : '');\n }\n return star;\n }\n return esc ? m : `\\\\${m}`;\n });\n\n if (backslashes === true) {\n if (opts.unescape === true) {\n output = output.replace(/\\\\/g, '');\n } else {\n output = output.replace(/\\\\+/g, m => {\n return m.length % 2 === 0 ? '\\\\\\\\' : (m ? '\\\\' : '');\n });\n }\n }\n\n if (output === input && opts.contains === true) {\n state.output = input;\n return state;\n }\n\n state.output = utils.wrapOutput(output, state, options);\n return state;\n }\n\n /**\n * Tokenize input until we reach end-of-string\n */\n\n while (!eos()) {\n value = advance();\n\n if (value === '\\u0000') {\n continue;\n }\n\n /**\n * Escaped characters\n */\n\n if (value === '\\\\') {\n const next = peek();\n\n if (next === '/' && opts.bash !== true) {\n continue;\n }\n\n if (next === '.' || next === ';') {\n continue;\n }\n\n if (!next) {\n value += '\\\\';\n push({ type: 'text', value });\n continue;\n }\n\n // collapse slashes to reduce potential for exploits\n const match = /^\\\\+/.exec(remaining());\n let slashes = 0;\n\n if (match && match[0].length > 2) {\n slashes = match[0].length;\n state.index += slashes;\n if (slashes % 2 !== 0) {\n value += '\\\\';\n }\n }\n\n if (opts.unescape === true) {\n value = advance();\n } else {\n value += advance();\n }\n\n if (state.brackets === 0) {\n push({ type: 'text', value });\n continue;\n }\n }\n\n /**\n * If we're inside a regex character class, continue\n * until we reach the closing bracket.\n */\n\n if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {\n if (opts.posix !== false && value === ':') {\n const inner = prev.value.slice(1);\n if (inner.includes('[')) {\n prev.posix = true;\n\n if (inner.includes(':')) {\n const idx = prev.value.lastIndexOf('[');\n const pre = prev.value.slice(0, idx);\n const rest = prev.value.slice(idx + 2);\n const posix = POSIX_REGEX_SOURCE[rest];\n if (posix) {\n prev.value = pre + posix;\n state.backtrack = true;\n advance();\n\n if (!bos.output && tokens.indexOf(prev) === 1) {\n bos.output = ONE_CHAR;\n }\n continue;\n }\n }\n }\n }\n\n if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {\n value = `\\\\${value}`;\n }\n\n if (value === ']' && (prev.value === '[' || prev.value === '[^')) {\n value = `\\\\${value}`;\n }\n\n if (opts.posix === true && value === '!' && prev.value === '[') {\n value = '^';\n }\n\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * If we're inside a quoted string, continue\n * until we reach the closing double quote.\n */\n\n if (state.quotes === 1 && value !== '\"') {\n value = utils.escapeRegex(value);\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * Double quotes\n */\n\n if (value === '\"') {\n state.quotes = state.quotes === 1 ? 0 : 1;\n if (opts.keepQuotes === true) {\n push({ type: 'text', value });\n }\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === '(') {\n increment('parens');\n push({ type: 'paren', value });\n continue;\n }\n\n if (value === ')') {\n if (state.parens === 0 && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '('));\n }\n\n const extglob = extglobs[extglobs.length - 1];\n if (extglob && state.parens === extglob.parens + 1) {\n extglobClose(extglobs.pop());\n continue;\n }\n\n push({ type: 'paren', value, output: state.parens ? ')' : '\\\\)' });\n decrement('parens');\n continue;\n }\n\n /**\n * Square brackets\n */\n\n if (value === '[') {\n if (opts.nobracket === true || !remaining().includes(']')) {\n if (opts.nobracket !== true && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('closing', ']'));\n }\n\n value = `\\\\${value}`;\n } else {\n increment('brackets');\n }\n\n push({ type: 'bracket', value });\n continue;\n }\n\n if (value === ']') {\n if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n if (state.brackets === 0) {\n if (opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '['));\n }\n\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n decrement('brackets');\n\n const prevValue = prev.value.slice(1);\n if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {\n value = `/${value}`;\n }\n\n prev.value += value;\n append({ value });\n\n // when literal brackets are explicitly disabled\n // assume we should match with a regex character class\n if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {\n continue;\n }\n\n const escaped = utils.escapeRegex(prev.value);\n state.output = state.output.slice(0, -prev.value.length);\n\n // when literal brackets are explicitly enabled\n // assume we should escape the brackets to match literal characters\n if (opts.literalBrackets === true) {\n state.output += escaped;\n prev.value = escaped;\n continue;\n }\n\n // when the user specifies nothing, try to match both\n prev.value = `(${capture}${escaped}|${prev.value})`;\n state.output += prev.value;\n continue;\n }\n\n /**\n * Braces\n */\n\n if (value === '{' && opts.nobrace !== true) {\n increment('braces');\n\n const open = {\n type: 'brace',\n value,\n output: '(',\n outputIndex: state.output.length,\n tokensIndex: state.tokens.length\n };\n\n braces.push(open);\n push(open);\n continue;\n }\n\n if (value === '}') {\n const brace = braces[braces.length - 1];\n\n if (opts.nobrace === true || !brace) {\n push({ type: 'text', value, output: value });\n continue;\n }\n\n let output = ')';\n\n if (brace.dots === true) {\n const arr = tokens.slice();\n const range = [];\n\n for (let i = arr.length - 1; i >= 0; i--) {\n tokens.pop();\n if (arr[i].type === 'brace') {\n break;\n }\n if (arr[i].type !== 'dots') {\n range.unshift(arr[i].value);\n }\n }\n\n output = expandRange(range, opts);\n state.backtrack = true;\n }\n\n if (brace.comma !== true && brace.dots !== true) {\n const out = state.output.slice(0, brace.outputIndex);\n const toks = state.tokens.slice(brace.tokensIndex);\n brace.value = brace.output = '\\\\{';\n value = output = '\\\\}';\n state.output = out;\n for (const t of toks) {\n state.output += (t.output || t.value);\n }\n }\n\n push({ type: 'brace', value, output });\n decrement('braces');\n braces.pop();\n continue;\n }\n\n /**\n * Pipes\n */\n\n if (value === '|') {\n if (extglobs.length > 0) {\n extglobs[extglobs.length - 1].conditions++;\n }\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Commas\n */\n\n if (value === ',') {\n let output = value;\n\n const brace = braces[braces.length - 1];\n if (brace && stack[stack.length - 1] === 'braces') {\n brace.comma = true;\n output = '|';\n }\n\n push({ type: 'comma', value, output });\n continue;\n }\n\n /**\n * Slashes\n */\n\n if (value === '/') {\n // if the beginning of the glob is \"./\", advance the start\n // to the current index, and don't add the \"./\" characters\n // to the state. This greatly simplifies lookbehinds when\n // checking for BOS characters like \"!\" and \".\" (not \"./\")\n if (prev.type === 'dot' && state.index === state.start + 1) {\n state.start = state.index + 1;\n state.consumed = '';\n state.output = '';\n tokens.pop();\n prev = bos; // reset \"prev\" to the first token\n continue;\n }\n\n push({ type: 'slash', value, output: SLASH_LITERAL });\n continue;\n }\n\n /**\n * Dots\n */\n\n if (value === '.') {\n if (state.braces > 0 && prev.type === 'dot') {\n if (prev.value === '.') prev.output = DOT_LITERAL;\n const brace = braces[braces.length - 1];\n prev.type = 'dots';\n prev.output += value;\n prev.value += value;\n brace.dots = true;\n continue;\n }\n\n if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {\n push({ type: 'text', value, output: DOT_LITERAL });\n continue;\n }\n\n push({ type: 'dot', value, output: DOT_LITERAL });\n continue;\n }\n\n /**\n * Question marks\n */\n\n if (value === '?') {\n const isGroup = prev && prev.value === '(';\n if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('qmark', value);\n continue;\n }\n\n if (prev && prev.type === 'paren') {\n const next = peek();\n let output = value;\n\n if (next === '<' && !utils.supportsLookbehinds()) {\n throw new Error('Node.js v10 or higher is required for regex lookbehinds');\n }\n\n if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\\w+>)/.test(remaining()))) {\n output = `\\\\${value}`;\n }\n\n push({ type: 'text', value, output });\n continue;\n }\n\n if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {\n push({ type: 'qmark', value, output: QMARK_NO_DOT });\n continue;\n }\n\n push({ type: 'qmark', value, output: QMARK });\n continue;\n }\n\n /**\n * Exclamation\n */\n\n if (value === '!') {\n if (opts.noextglob !== true && peek() === '(') {\n if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {\n extglobOpen('negate', value);\n continue;\n }\n }\n\n if (opts.nonegate !== true && state.index === 0) {\n negate();\n continue;\n }\n }\n\n /**\n * Plus\n */\n\n if (value === '+') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('plus', value);\n continue;\n }\n\n if ((prev && prev.value === '(') || opts.regex === false) {\n push({ type: 'plus', value, output: PLUS_LITERAL });\n continue;\n }\n\n if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {\n push({ type: 'plus', value });\n continue;\n }\n\n push({ type: 'plus', value: PLUS_LITERAL });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value === '@') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n push({ type: 'at', extglob: true, value, output: '' });\n continue;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value !== '*') {\n if (value === '$' || value === '^') {\n value = `\\\\${value}`;\n }\n\n const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());\n if (match) {\n value += match[0];\n state.index += match[0].length;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Stars\n */\n\n if (prev && (prev.type === 'globstar' || prev.star === true)) {\n prev.type = 'star';\n prev.star = true;\n prev.value += value;\n prev.output = star;\n state.backtrack = true;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n let rest = remaining();\n if (opts.noextglob !== true && /^\\([^?]/.test(rest)) {\n extglobOpen('star', value);\n continue;\n }\n\n if (prev.type === 'star') {\n if (opts.noglobstar === true) {\n consume(value);\n continue;\n }\n\n const prior = prev.prev;\n const before = prior.prev;\n const isStart = prior.type === 'slash' || prior.type === 'bos';\n const afterStar = before && (before.type === 'star' || before.type === 'globstar');\n\n if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');\n const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');\n if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n // strip consecutive `/**/`\n while (rest.slice(0, 3) === '/**') {\n const after = input[state.index + 4];\n if (after && after !== '/') {\n break;\n }\n rest = rest.slice(3);\n consume('/**', 3);\n }\n\n if (prior.type === 'bos' && eos()) {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = globstar(opts);\n state.output = prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');\n prev.value += value;\n state.globstar = true;\n state.output += prior.output + prev.output;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {\n const end = rest[1] !== void 0 ? '|$' : '';\n\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;\n prev.value += value;\n\n state.output += prior.output + prev.output;\n state.globstar = true;\n\n consume(value + advance());\n\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n if (prior.type === 'bos' && rest[0] === '/') {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;\n state.output = prev.output;\n state.globstar = true;\n consume(value + advance());\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n // remove single star from output\n state.output = state.output.slice(0, -prev.output.length);\n\n // reset previous token to globstar\n prev.type = 'globstar';\n prev.output = globstar(opts);\n prev.value += value;\n\n // reset output with globstar\n state.output += prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n const token = { type: 'star', value, output: star };\n\n if (opts.bash === true) {\n token.output = '.*?';\n if (prev.type === 'bos' || prev.type === 'slash') {\n token.output = nodot + token.output;\n }\n push(token);\n continue;\n }\n\n if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {\n token.output = value;\n push(token);\n continue;\n }\n\n if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {\n if (prev.type === 'dot') {\n state.output += NO_DOT_SLASH;\n prev.output += NO_DOT_SLASH;\n\n } else if (opts.dot === true) {\n state.output += NO_DOTS_SLASH;\n prev.output += NO_DOTS_SLASH;\n\n } else {\n state.output += nodot;\n prev.output += nodot;\n }\n\n if (peek() !== '*') {\n state.output += ONE_CHAR;\n prev.output += ONE_CHAR;\n }\n }\n\n push(token);\n }\n\n while (state.brackets > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));\n state.output = utils.escapeLast(state.output, '[');\n decrement('brackets');\n }\n\n while (state.parens > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));\n state.output = utils.escapeLast(state.output, '(');\n decrement('parens');\n }\n\n while (state.braces > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));\n state.output = utils.escapeLast(state.output, '{');\n decrement('braces');\n }\n\n if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {\n push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });\n }\n\n // rebuild the output if we had to backtrack at any point\n if (state.backtrack === true) {\n state.output = '';\n\n for (const token of state.tokens) {\n state.output += token.output != null ? token.output : token.value;\n\n if (token.suffix) {\n state.output += token.suffix;\n }\n }\n }\n\n return state;\n};\n\n/**\n * Fast paths for creating regular expressions for common glob patterns.\n * This can significantly speed up processing and has very little downside\n * impact when none of the fast paths match.\n */\n\nparse.fastpaths = (input, options) => {\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n const len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n input = REPLACEMENTS[input] || input;\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const {\n DOT_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOTS_SLASH,\n STAR,\n START_ANCHOR\n } = constants.globChars(win32);\n\n const nodot = opts.dot ? NO_DOTS : NO_DOT;\n const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;\n const capture = opts.capture ? '' : '?:';\n const state = { negated: false, prefix: '' };\n let star = opts.bash === true ? '.*?' : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n const globstar = opts => {\n if (opts.noglobstar === true) return star;\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const create = str => {\n switch (str) {\n case '*':\n return `${nodot}${ONE_CHAR}${star}`;\n\n case '.*':\n return `${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*.*':\n return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*/*':\n return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;\n\n case '**':\n return nodot + globstar(opts);\n\n case '**/*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;\n\n case '**/*.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '**/.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n default: {\n const match = /^(.*?)\\.(\\w+)$/.exec(str);\n if (!match) return;\n\n const source = create(match[1]);\n if (!source) return;\n\n return source + DOT_LITERAL + match[2];\n }\n }\n };\n\n const output = utils.removePrefix(input, state);\n let source = create(output);\n\n if (source && opts.strictSlashes !== true) {\n source += `${SLASH_LITERAL}?`;\n }\n\n return source;\n};\n\nmodule.exports = parse;\n","'use strict';\n\nconst path = require('path');\nconst scan = require('./scan');\nconst parse = require('./parse');\nconst utils = require('./utils');\nconst constants = require('./constants');\nconst isObject = val => val && typeof val === 'object' && !Array.isArray(val);\n\n/**\n * Creates a matcher function from one or more glob patterns. The\n * returned function takes a string to match as its first argument,\n * and returns true if the string is a match. The returned matcher\n * function also takes a boolean as the second argument that, when true,\n * returns an object with additional information.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch(glob[, options]);\n *\n * const isMatch = picomatch('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @name picomatch\n * @param {String|Array} `globs` One or more glob patterns.\n * @param {Object=} `options`\n * @return {Function=} Returns a matcher function.\n * @api public\n */\n\nconst picomatch = (glob, options, returnState = false) => {\n if (Array.isArray(glob)) {\n const fns = glob.map(input => picomatch(input, options, returnState));\n const arrayMatcher = str => {\n for (const isMatch of fns) {\n const state = isMatch(str);\n if (state) return state;\n }\n return false;\n };\n return arrayMatcher;\n }\n\n const isState = isObject(glob) && glob.tokens && glob.input;\n\n if (glob === '' || (typeof glob !== 'string' && !isState)) {\n throw new TypeError('Expected pattern to be a non-empty string');\n }\n\n const opts = options || {};\n const posix = utils.isWindows(options);\n const regex = isState\n ? picomatch.compileRe(glob, options)\n : picomatch.makeRe(glob, options, false, true);\n\n const state = regex.state;\n delete regex.state;\n\n let isIgnored = () => false;\n if (opts.ignore) {\n const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };\n isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);\n }\n\n const matcher = (input, returnObject = false) => {\n const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });\n const result = { glob, state, regex, posix, input, output, match, isMatch };\n\n if (typeof opts.onResult === 'function') {\n opts.onResult(result);\n }\n\n if (isMatch === false) {\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (isIgnored(input)) {\n if (typeof opts.onIgnore === 'function') {\n opts.onIgnore(result);\n }\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (typeof opts.onMatch === 'function') {\n opts.onMatch(result);\n }\n return returnObject ? result : true;\n };\n\n if (returnState) {\n matcher.state = state;\n }\n\n return matcher;\n};\n\n/**\n * Test `input` with the given `regex`. This is used by the main\n * `picomatch()` function to test the input string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.test(input, regex[, options]);\n *\n * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\\/([^/]*?))$/));\n * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp} `regex`\n * @return {Object} Returns an object with matching info.\n * @api public\n */\n\npicomatch.test = (input, regex, options, { glob, posix } = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected input to be a string');\n }\n\n if (input === '') {\n return { isMatch: false, output: '' };\n }\n\n const opts = options || {};\n const format = opts.format || (posix ? utils.toPosixSlashes : null);\n let match = input === glob;\n let output = (match && format) ? format(input) : input;\n\n if (match === false) {\n output = format ? format(input) : input;\n match = output === glob;\n }\n\n if (match === false || opts.capture === true) {\n if (opts.matchBase === true || opts.basename === true) {\n match = picomatch.matchBase(input, regex, options, posix);\n } else {\n match = regex.exec(output);\n }\n }\n\n return { isMatch: Boolean(match), match, output };\n};\n\n/**\n * Match the basename of a filepath.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.matchBase(input, glob[, options]);\n * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).\n * @return {Boolean}\n * @api public\n */\n\npicomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => {\n const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);\n return regex.test(path.basename(input));\n};\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.isMatch(string, patterns[, options]);\n *\n * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String|Array} str The string to test.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} [options] See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\npicomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const result = picomatch.parse(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as a regex source string.\n * @api public\n */\n\npicomatch.parse = (pattern, options) => {\n if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));\n return parse(pattern, { ...options, fastpaths: false });\n};\n\n/**\n * Scan a glob pattern to separate the pattern into segments.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.scan(input[, options]);\n *\n * const result = picomatch.scan('!./foo/*.js');\n * console.log(result);\n * { prefix: '!./',\n * input: '!./foo/*.js',\n * start: 3,\n * base: 'foo',\n * glob: '*.js',\n * isBrace: false,\n * isBracket: false,\n * isGlob: true,\n * isExtglob: false,\n * isGlobstar: false,\n * negated: true }\n * ```\n * @param {String} `input` Glob pattern to scan.\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\npicomatch.scan = (input, options) => scan(input, options);\n\n/**\n * Compile a regular expression from the `state` object returned by the\n * [parse()](#parse) method.\n *\n * @param {Object} `state`\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.\n * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.\n * @return {RegExp}\n * @api public\n */\n\npicomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {\n if (returnOutput === true) {\n return state.output;\n }\n\n const opts = options || {};\n const prepend = opts.contains ? '' : '^';\n const append = opts.contains ? '' : '$';\n\n let source = `${prepend}(?:${state.output})${append}`;\n if (state && state.negated === true) {\n source = `^(?!${source}).*$`;\n }\n\n const regex = picomatch.toRegex(source, options);\n if (returnState === true) {\n regex.state = state;\n }\n\n return regex;\n};\n\n/**\n * Create a regular expression from a parsed glob pattern.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const state = picomatch.parse('*.js');\n * // picomatch.compileRe(state[, options]);\n *\n * console.log(picomatch.compileRe(state));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `state` The object returned from the `.parse` method.\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.\n * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\npicomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {\n if (!input || typeof input !== 'string') {\n throw new TypeError('Expected a non-empty string');\n }\n\n let parsed = { negated: false, fastpaths: true };\n\n if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {\n parsed.output = parse.fastpaths(input, options);\n }\n\n if (!parsed.output) {\n parsed = parse(input, options);\n }\n\n return picomatch.compileRe(parsed, options, returnOutput, returnState);\n};\n\n/**\n * Create a regular expression from the given regex source string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.toRegex(source[, options]);\n *\n * const { output } = picomatch.parse('*.js');\n * console.log(picomatch.toRegex(output));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `source` Regular expression source string.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\npicomatch.toRegex = (source, options) => {\n try {\n const opts = options || {};\n return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));\n } catch (err) {\n if (options && options.debug === true) throw err;\n return /$^/;\n }\n};\n\n/**\n * Picomatch constants.\n * @return {Object}\n */\n\npicomatch.constants = constants;\n\n/**\n * Expose \"picomatch\"\n */\n\nmodule.exports = picomatch;\n","'use strict';\n\nmodule.exports = require('./lib/picomatch');\n","'use strict';\n\nconst fs = require('fs');\nconst { Readable } = require('stream');\nconst sysPath = require('path');\nconst { promisify } = require('util');\nconst picomatch = require('picomatch');\n\nconst readdir = promisify(fs.readdir);\nconst stat = promisify(fs.stat);\nconst lstat = promisify(fs.lstat);\nconst realpath = promisify(fs.realpath);\n\n/**\n * @typedef {Object} EntryInfo\n * @property {String} path\n * @property {String} fullPath\n * @property {fs.Stats=} stats\n * @property {fs.Dirent=} dirent\n * @property {String} basename\n */\n\nconst BANG = '!';\nconst RECURSIVE_ERROR_CODE = 'READDIRP_RECURSIVE_ERROR';\nconst NORMAL_FLOW_ERRORS = new Set(['ENOENT', 'EPERM', 'EACCES', 'ELOOP', RECURSIVE_ERROR_CODE]);\nconst FILE_TYPE = 'files';\nconst DIR_TYPE = 'directories';\nconst FILE_DIR_TYPE = 'files_directories';\nconst EVERYTHING_TYPE = 'all';\nconst ALL_TYPES = [FILE_TYPE, DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE];\n\nconst isNormalFlowError = error => NORMAL_FLOW_ERRORS.has(error.code);\nconst [maj, min] = process.versions.node.split('.').slice(0, 2).map(n => Number.parseInt(n, 10));\nconst wantBigintFsStats = process.platform === 'win32' && (maj > 10 || (maj === 10 && min >= 5));\n\nconst normalizeFilter = filter => {\n if (filter === undefined) return;\n if (typeof filter === 'function') return filter;\n\n if (typeof filter === 'string') {\n const glob = picomatch(filter.trim());\n return entry => glob(entry.basename);\n }\n\n if (Array.isArray(filter)) {\n const positive = [];\n const negative = [];\n for (const item of filter) {\n const trimmed = item.trim();\n if (trimmed.charAt(0) === BANG) {\n negative.push(picomatch(trimmed.slice(1)));\n } else {\n positive.push(picomatch(trimmed));\n }\n }\n\n if (negative.length > 0) {\n if (positive.length > 0) {\n return entry =>\n positive.some(f => f(entry.basename)) && !negative.some(f => f(entry.basename));\n }\n return entry => !negative.some(f => f(entry.basename));\n }\n return entry => positive.some(f => f(entry.basename));\n }\n};\n\nclass ReaddirpStream extends Readable {\n static get defaultOptions() {\n return {\n root: '.',\n /* eslint-disable no-unused-vars */\n fileFilter: (path) => true,\n directoryFilter: (path) => true,\n /* eslint-enable no-unused-vars */\n type: FILE_TYPE,\n lstat: false,\n depth: 2147483648,\n alwaysStat: false\n };\n }\n\n constructor(options = {}) {\n super({\n objectMode: true,\n autoDestroy: true,\n highWaterMark: options.highWaterMark || 4096\n });\n const opts = { ...ReaddirpStream.defaultOptions, ...options };\n const { root, type } = opts;\n\n this._fileFilter = normalizeFilter(opts.fileFilter);\n this._directoryFilter = normalizeFilter(opts.directoryFilter);\n\n const statMethod = opts.lstat ? lstat : stat;\n // Use bigint stats if it's windows and stat() supports options (node 10+).\n if (wantBigintFsStats) {\n this._stat = path => statMethod(path, { bigint: true });\n } else {\n this._stat = statMethod;\n }\n\n this._maxDepth = opts.depth;\n this._wantsDir = [DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type);\n this._wantsFile = [FILE_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type);\n this._wantsEverything = type === EVERYTHING_TYPE;\n this._root = sysPath.resolve(root);\n this._isDirent = ('Dirent' in fs) && !opts.alwaysStat;\n this._statsProp = this._isDirent ? 'dirent' : 'stats';\n this._rdOptions = { encoding: 'utf8', withFileTypes: this._isDirent };\n\n // Launch stream with one parent, the root dir.\n this.parents = [this._exploreDir(root, 1)];\n this.reading = false;\n this.parent = undefined;\n }\n\n async _read(batch) {\n if (this.reading) return;\n this.reading = true;\n\n try {\n while (!this.destroyed && batch > 0) {\n const { path, depth, files = [] } = this.parent || {};\n\n if (files.length > 0) {\n const slice = files.splice(0, batch).map(dirent => this._formatEntry(dirent, path));\n for (const entry of await Promise.all(slice)) {\n if (this.destroyed) return;\n\n const entryType = await this._getEntryType(entry);\n if (entryType === 'directory' && this._directoryFilter(entry)) {\n if (depth <= this._maxDepth) {\n this.parents.push(this._exploreDir(entry.fullPath, depth + 1));\n }\n\n if (this._wantsDir) {\n this.push(entry);\n batch--;\n }\n } else if ((entryType === 'file' || this._includeAsFile(entry)) && this._fileFilter(entry)) {\n if (this._wantsFile) {\n this.push(entry);\n batch--;\n }\n }\n }\n } else {\n const parent = this.parents.pop();\n if (!parent) {\n this.push(null);\n break;\n }\n this.parent = await parent;\n if (this.destroyed) return;\n }\n }\n } catch (error) {\n this.destroy(error);\n } finally {\n this.reading = false;\n }\n }\n\n async _exploreDir(path, depth) {\n let files;\n try {\n files = await readdir(path, this._rdOptions);\n } catch (error) {\n this._onError(error);\n }\n return { files, depth, path };\n }\n\n async _formatEntry(dirent, path) {\n let entry;\n try {\n const basename = this._isDirent ? dirent.name : dirent;\n const fullPath = sysPath.resolve(sysPath.join(path, basename));\n entry = { path: sysPath.relative(this._root, fullPath), fullPath, basename };\n entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath);\n } catch (err) {\n this._onError(err);\n }\n return entry;\n }\n\n _onError(err) {\n if (isNormalFlowError(err) && !this.destroyed) {\n this.emit('warn', err);\n } else {\n this.destroy(err);\n }\n }\n\n async _getEntryType(entry) {\n // entry may be undefined, because a warning or an error were emitted\n // and the statsProp is undefined\n const stats = entry && entry[this._statsProp];\n if (!stats) {\n return;\n }\n if (stats.isFile()) {\n return 'file';\n }\n if (stats.isDirectory()) {\n return 'directory';\n }\n if (stats && stats.isSymbolicLink()) {\n const full = entry.fullPath;\n try {\n const entryRealPath = await realpath(full);\n const entryRealPathStats = await lstat(entryRealPath);\n if (entryRealPathStats.isFile()) {\n return 'file';\n }\n if (entryRealPathStats.isDirectory()) {\n const len = entryRealPath.length;\n if (full.startsWith(entryRealPath) && full.substr(len, 1) === sysPath.sep) {\n const recursiveError = new Error(\n `Circular symlink detected: \"${full}\" points to \"${entryRealPath}\"`\n );\n recursiveError.code = RECURSIVE_ERROR_CODE;\n return this._onError(recursiveError);\n }\n return 'directory';\n }\n } catch (error) {\n this._onError(error);\n }\n }\n }\n\n _includeAsFile(entry) {\n const stats = entry && entry[this._statsProp];\n\n return stats && this._wantsEverything && !stats.isDirectory();\n }\n}\n\n/**\n * @typedef {Object} ReaddirpArguments\n * @property {Function=} fileFilter\n * @property {Function=} directoryFilter\n * @property {String=} type\n * @property {Number=} depth\n * @property {String=} root\n * @property {Boolean=} lstat\n * @property {Boolean=} bigint\n */\n\n/**\n * Main function which ends up calling readdirRec and reads all files and directories in given root recursively.\n * @param {String} root Root directory\n * @param {ReaddirpArguments=} options Options to specify root (start directory), filters and recursion depth\n */\nconst readdirp = (root, options = {}) => {\n let type = options.entryType || options.type;\n if (type === 'both') type = FILE_DIR_TYPE; // backwards-compatibility\n if (type) options.type = type;\n if (!root) {\n throw new Error('readdirp: root argument is required. Usage: readdirp(root, options)');\n } else if (typeof root !== 'string') {\n throw new TypeError('readdirp: root argument must be a string. Usage: readdirp(root, options)');\n } else if (type && !ALL_TYPES.includes(type)) {\n throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(', ')}`);\n }\n\n options.root = root;\n return new ReaddirpStream(options);\n};\n\nconst readdirpPromise = (root, options = {}) => {\n return new Promise((resolve, reject) => {\n const files = [];\n readdirp(root, options)\n .on('data', entry => files.push(entry))\n .on('end', () => resolve(files))\n .on('error', error => reject(error));\n });\n};\n\nreaddirp.promise = readdirpPromise;\nreaddirp.ReaddirpStream = ReaddirpStream;\nreaddirp.default = readdirp;\n\nmodule.exports = readdirp;\n","'use strict';\n\nconst path = require('path');\nconst WIN_SLASH = '\\\\\\\\/';\nconst WIN_NO_SLASH = `[^${WIN_SLASH}]`;\n\n/**\n * Posix glob regex\n */\n\nconst DOT_LITERAL = '\\\\.';\nconst PLUS_LITERAL = '\\\\+';\nconst QMARK_LITERAL = '\\\\?';\nconst SLASH_LITERAL = '\\\\/';\nconst ONE_CHAR = '(?=.)';\nconst QMARK = '[^/]';\nconst END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;\nconst START_ANCHOR = `(?:^|${SLASH_LITERAL})`;\nconst DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;\nconst NO_DOT = `(?!${DOT_LITERAL})`;\nconst NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;\nconst NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;\nconst NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;\nconst QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;\nconst STAR = `${QMARK}*?`;\n\nconst POSIX_CHARS = {\n DOT_LITERAL,\n PLUS_LITERAL,\n QMARK_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n QMARK,\n END_ANCHOR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n};\n\n/**\n * Windows glob regex\n */\n\nconst WINDOWS_CHARS = {\n ...POSIX_CHARS,\n\n SLASH_LITERAL: `[${WIN_SLASH}]`,\n QMARK: WIN_NO_SLASH,\n STAR: `${WIN_NO_SLASH}*?`,\n DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,\n NO_DOT: `(?!${DOT_LITERAL})`,\n NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,\n NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n QMARK_NO_DOT: `[^.${WIN_SLASH}]`,\n START_ANCHOR: `(?:^|[${WIN_SLASH}])`,\n END_ANCHOR: `(?:[${WIN_SLASH}]|$)`\n};\n\n/**\n * POSIX Bracket Regex\n */\n\nconst POSIX_REGEX_SOURCE = {\n alnum: 'a-zA-Z0-9',\n alpha: 'a-zA-Z',\n ascii: '\\\\x00-\\\\x7F',\n blank: ' \\\\t',\n cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n digit: '0-9',\n graph: '\\\\x21-\\\\x7E',\n lower: 'a-z',\n print: '\\\\x20-\\\\x7E ',\n punct: '\\\\-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n upper: 'A-Z',\n word: 'A-Za-z0-9_',\n xdigit: 'A-Fa-f0-9'\n};\n\nmodule.exports = {\n MAX_LENGTH: 1024 * 64,\n POSIX_REGEX_SOURCE,\n\n // regular expressions\n REGEX_BACKSLASH: /\\\\(?![*+?^${}(|)[\\]])/g,\n REGEX_NON_SPECIAL_CHARS: /^[^@![\\].,$*+?^{}()|\\\\/]+/,\n REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\\]]/,\n REGEX_SPECIAL_CHARS_BACKREF: /(\\\\?)((\\W)(\\3*))/g,\n REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\\]])/g,\n REGEX_REMOVE_BACKSLASH: /(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,\n\n // Replace globs with equivalent patterns to reduce parsing time.\n REPLACEMENTS: {\n '***': '*',\n '**/**': '**',\n '**/**/**': '**'\n },\n\n // Digits\n CHAR_0: 48, /* 0 */\n CHAR_9: 57, /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 65, /* A */\n CHAR_LOWERCASE_A: 97, /* a */\n CHAR_UPPERCASE_Z: 90, /* Z */\n CHAR_LOWERCASE_Z: 122, /* z */\n\n CHAR_LEFT_PARENTHESES: 40, /* ( */\n CHAR_RIGHT_PARENTHESES: 41, /* ) */\n\n CHAR_ASTERISK: 42, /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: 38, /* & */\n CHAR_AT: 64, /* @ */\n CHAR_BACKWARD_SLASH: 92, /* \\ */\n CHAR_CARRIAGE_RETURN: 13, /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */\n CHAR_COLON: 58, /* : */\n CHAR_COMMA: 44, /* , */\n CHAR_DOT: 46, /* . */\n CHAR_DOUBLE_QUOTE: 34, /* \" */\n CHAR_EQUAL: 61, /* = */\n CHAR_EXCLAMATION_MARK: 33, /* ! */\n CHAR_FORM_FEED: 12, /* \\f */\n CHAR_FORWARD_SLASH: 47, /* / */\n CHAR_GRAVE_ACCENT: 96, /* ` */\n CHAR_HASH: 35, /* # */\n CHAR_HYPHEN_MINUS: 45, /* - */\n CHAR_LEFT_ANGLE_BRACKET: 60, /* < */\n CHAR_LEFT_CURLY_BRACE: 123, /* { */\n CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */\n CHAR_LINE_FEED: 10, /* \\n */\n CHAR_NO_BREAK_SPACE: 160, /* \\u00A0 */\n CHAR_PERCENT: 37, /* % */\n CHAR_PLUS: 43, /* + */\n CHAR_QUESTION_MARK: 63, /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */\n CHAR_RIGHT_CURLY_BRACE: 125, /* } */\n CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */\n CHAR_SEMICOLON: 59, /* ; */\n CHAR_SINGLE_QUOTE: 39, /* ' */\n CHAR_SPACE: 32, /* */\n CHAR_TAB: 9, /* \\t */\n CHAR_UNDERSCORE: 95, /* _ */\n CHAR_VERTICAL_LINE: 124, /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \\uFEFF */\n\n SEP: path.sep,\n\n /**\n * Create EXTGLOB_CHARS\n */\n\n extglobChars(chars) {\n return {\n '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },\n '?': { type: 'qmark', open: '(?:', close: ')?' },\n '+': { type: 'plus', open: '(?:', close: ')+' },\n '*': { type: 'star', open: '(?:', close: ')*' },\n '@': { type: 'at', open: '(?:', close: ')' }\n };\n },\n\n /**\n * Create GLOB_CHARS\n */\n\n globChars(win32) {\n return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;\n }\n};\n","'use strict';\n\nconst path = require('path');\nconst win32 = process.platform === 'win32';\nconst {\n REGEX_BACKSLASH,\n REGEX_REMOVE_BACKSLASH,\n REGEX_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_GLOBAL\n} = require('./constants');\n\nexports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\nexports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);\nexports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);\nexports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\\\$1');\nexports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');\n\nexports.removeBackslashes = str => {\n return str.replace(REGEX_REMOVE_BACKSLASH, match => {\n return match === '\\\\' ? '' : match;\n });\n};\n\nexports.supportsLookbehinds = () => {\n const segs = process.version.slice(1).split('.').map(Number);\n if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {\n return true;\n }\n return false;\n};\n\nexports.isWindows = options => {\n if (options && typeof options.windows === 'boolean') {\n return options.windows;\n }\n return win32 === true || path.sep === '\\\\';\n};\n\nexports.escapeLast = (input, char, lastIdx) => {\n const idx = input.lastIndexOf(char, lastIdx);\n if (idx === -1) return input;\n if (input[idx - 1] === '\\\\') return exports.escapeLast(input, char, idx - 1);\n return `${input.slice(0, idx)}\\\\${input.slice(idx)}`;\n};\n\nexports.removePrefix = (input, state = {}) => {\n let output = input;\n if (output.startsWith('./')) {\n output = output.slice(2);\n state.prefix = './';\n }\n return output;\n};\n\nexports.wrapOutput = (input, state = {}, options = {}) => {\n const prepend = options.contains ? '' : '^';\n const append = options.contains ? '' : '$';\n\n let output = `${prepend}(?:${input})${append}`;\n if (state.negated === true) {\n output = `(?:^(?!${output}).*$)`;\n }\n return output;\n};\n","'use strict';\n\nconst utils = require('./utils');\nconst {\n CHAR_ASTERISK, /* * */\n CHAR_AT, /* @ */\n CHAR_BACKWARD_SLASH, /* \\ */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_EXCLAMATION_MARK, /* ! */\n CHAR_FORWARD_SLASH, /* / */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_PLUS, /* + */\n CHAR_QUESTION_MARK, /* ? */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_RIGHT_SQUARE_BRACKET /* ] */\n} = require('./constants');\n\nconst isPathSeparator = code => {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n};\n\nconst depth = token => {\n if (token.isPrefix !== true) {\n token.depth = token.isGlobstar ? Infinity : 1;\n }\n};\n\n/**\n * Quickly scans a glob pattern and returns an object with a handful of\n * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),\n * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not\n * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).\n *\n * ```js\n * const pm = require('picomatch');\n * console.log(pm.scan('foo/bar/*.js'));\n * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an object with tokens and regex source string.\n * @api public\n */\n\nconst scan = (input, options) => {\n const opts = options || {};\n\n const length = input.length - 1;\n const scanToEnd = opts.parts === true || opts.scanToEnd === true;\n const slashes = [];\n const tokens = [];\n const parts = [];\n\n let str = input;\n let index = -1;\n let start = 0;\n let lastIndex = 0;\n let isBrace = false;\n let isBracket = false;\n let isGlob = false;\n let isExtglob = false;\n let isGlobstar = false;\n let braceEscaped = false;\n let backslashes = false;\n let negated = false;\n let negatedExtglob = false;\n let finished = false;\n let braces = 0;\n let prev;\n let code;\n let token = { value: '', depth: 0, isGlob: false };\n\n const eos = () => index >= length;\n const peek = () => str.charCodeAt(index + 1);\n const advance = () => {\n prev = code;\n return str.charCodeAt(++index);\n };\n\n while (index < length) {\n code = advance();\n let next;\n\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braceEscaped = true;\n }\n continue;\n }\n\n if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n continue;\n }\n\n if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (braceEscaped !== true && code === CHAR_COMMA) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_RIGHT_CURLY_BRACE) {\n braces--;\n\n if (braces === 0) {\n braceEscaped = false;\n isBrace = token.isBrace = true;\n finished = true;\n break;\n }\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_FORWARD_SLASH) {\n slashes.push(index);\n tokens.push(token);\n token = { value: '', depth: 0, isGlob: false };\n\n if (finished === true) continue;\n if (prev === CHAR_DOT && index === (start + 1)) {\n start += 2;\n continue;\n }\n\n lastIndex = index + 1;\n continue;\n }\n\n if (opts.noext !== true) {\n const isExtglobChar = code === CHAR_PLUS\n || code === CHAR_AT\n || code === CHAR_ASTERISK\n || code === CHAR_QUESTION_MARK\n || code === CHAR_EXCLAMATION_MARK;\n\n if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n isExtglob = token.isExtglob = true;\n finished = true;\n if (code === CHAR_EXCLAMATION_MARK && index === start) {\n negatedExtglob = true;\n }\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n }\n\n if (code === CHAR_ASTERISK) {\n if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_QUESTION_MARK) {\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_LEFT_SQUARE_BRACKET) {\n while (eos() !== true && (next = advance())) {\n if (next === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n isBracket = token.isBracket = true;\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {\n negated = token.negated = true;\n start++;\n continue;\n }\n\n if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_LEFT_PARENTHESES) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n\n if (isGlob === true) {\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n }\n\n if (opts.noext === true) {\n isExtglob = false;\n isGlob = false;\n }\n\n let base = str;\n let prefix = '';\n let glob = '';\n\n if (start > 0) {\n prefix = str.slice(0, start);\n str = str.slice(start);\n lastIndex -= start;\n }\n\n if (base && isGlob === true && lastIndex > 0) {\n base = str.slice(0, lastIndex);\n glob = str.slice(lastIndex);\n } else if (isGlob === true) {\n base = '';\n glob = str;\n } else {\n base = str;\n }\n\n if (base && base !== '' && base !== '/' && base !== str) {\n if (isPathSeparator(base.charCodeAt(base.length - 1))) {\n base = base.slice(0, -1);\n }\n }\n\n if (opts.unescape === true) {\n if (glob) glob = utils.removeBackslashes(glob);\n\n if (base && backslashes === true) {\n base = utils.removeBackslashes(base);\n }\n }\n\n const state = {\n prefix,\n input,\n start,\n base,\n glob,\n isBrace,\n isBracket,\n isGlob,\n isExtglob,\n isGlobstar,\n negated,\n negatedExtglob\n };\n\n if (opts.tokens === true) {\n state.maxDepth = 0;\n if (!isPathSeparator(code)) {\n tokens.push(token);\n }\n state.tokens = tokens;\n }\n\n if (opts.parts === true || opts.tokens === true) {\n let prevIndex;\n\n for (let idx = 0; idx < slashes.length; idx++) {\n const n = prevIndex ? prevIndex + 1 : start;\n const i = slashes[idx];\n const value = input.slice(n, i);\n if (opts.tokens) {\n if (idx === 0 && start !== 0) {\n tokens[idx].isPrefix = true;\n tokens[idx].value = prefix;\n } else {\n tokens[idx].value = value;\n }\n depth(tokens[idx]);\n state.maxDepth += tokens[idx].depth;\n }\n if (idx !== 0 || value !== '') {\n parts.push(value);\n }\n prevIndex = i;\n }\n\n if (prevIndex && prevIndex + 1 < input.length) {\n const value = input.slice(prevIndex + 1);\n parts.push(value);\n\n if (opts.tokens) {\n tokens[tokens.length - 1].value = value;\n depth(tokens[tokens.length - 1]);\n state.maxDepth += tokens[tokens.length - 1].depth;\n }\n }\n\n state.slashes = slashes;\n state.parts = parts;\n }\n\n return state;\n};\n\nmodule.exports = scan;\n","'use strict';\n\nconst constants = require('./constants');\nconst utils = require('./utils');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n POSIX_REGEX_SOURCE,\n REGEX_NON_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_BACKREF,\n REPLACEMENTS\n} = constants;\n\n/**\n * Helpers\n */\n\nconst expandRange = (args, options) => {\n if (typeof options.expandRange === 'function') {\n return options.expandRange(...args, options);\n }\n\n args.sort();\n const value = `[${args.join('-')}]`;\n\n try {\n /* eslint-disable-next-line no-new */\n new RegExp(value);\n } catch (ex) {\n return args.map(v => utils.escapeRegex(v)).join('..');\n }\n\n return value;\n};\n\n/**\n * Create the message for a syntax error\n */\n\nconst syntaxError = (type, char) => {\n return `Missing ${type}: \"${char}\" - use \"\\\\\\\\${char}\" to match literal characters`;\n};\n\n/**\n * Parse the given input string.\n * @param {String} input\n * @param {Object} options\n * @return {Object}\n */\n\nconst parse = (input, options) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n input = REPLACEMENTS[input] || input;\n\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n\n let len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n const bos = { type: 'bos', value: '', output: opts.prepend || '' };\n const tokens = [bos];\n\n const capture = opts.capture ? '' : '?:';\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const PLATFORM_CHARS = constants.globChars(win32);\n const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);\n\n const {\n DOT_LITERAL,\n PLUS_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n } = PLATFORM_CHARS;\n\n const globstar = opts => {\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const nodot = opts.dot ? '' : NO_DOT;\n const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;\n let star = opts.bash === true ? globstar(opts) : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n // minimatch options support\n if (typeof opts.noext === 'boolean') {\n opts.noextglob = opts.noext;\n }\n\n const state = {\n input,\n index: -1,\n start: 0,\n dot: opts.dot === true,\n consumed: '',\n output: '',\n prefix: '',\n backtrack: false,\n negated: false,\n brackets: 0,\n braces: 0,\n parens: 0,\n quotes: 0,\n globstar: false,\n tokens\n };\n\n input = utils.removePrefix(input, state);\n len = input.length;\n\n const extglobs = [];\n const braces = [];\n const stack = [];\n let prev = bos;\n let value;\n\n /**\n * Tokenizing helpers\n */\n\n const eos = () => state.index === len - 1;\n const peek = state.peek = (n = 1) => input[state.index + n];\n const advance = state.advance = () => input[++state.index] || '';\n const remaining = () => input.slice(state.index + 1);\n const consume = (value = '', num = 0) => {\n state.consumed += value;\n state.index += num;\n };\n\n const append = token => {\n state.output += token.output != null ? token.output : token.value;\n consume(token.value);\n };\n\n const negate = () => {\n let count = 1;\n\n while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {\n advance();\n state.start++;\n count++;\n }\n\n if (count % 2 === 0) {\n return false;\n }\n\n state.negated = true;\n state.start++;\n return true;\n };\n\n const increment = type => {\n state[type]++;\n stack.push(type);\n };\n\n const decrement = type => {\n state[type]--;\n stack.pop();\n };\n\n /**\n * Push tokens onto the tokens array. This helper speeds up\n * tokenizing by 1) helping us avoid backtracking as much as possible,\n * and 2) helping us avoid creating extra tokens when consecutive\n * characters are plain text. This improves performance and simplifies\n * lookbehinds.\n */\n\n const push = tok => {\n if (prev.type === 'globstar') {\n const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');\n const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));\n\n if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {\n state.output = state.output.slice(0, -prev.output.length);\n prev.type = 'star';\n prev.value = '*';\n prev.output = star;\n state.output += prev.output;\n }\n }\n\n if (extglobs.length && tok.type !== 'paren') {\n extglobs[extglobs.length - 1].inner += tok.value;\n }\n\n if (tok.value || tok.output) append(tok);\n if (prev && prev.type === 'text' && tok.type === 'text') {\n prev.value += tok.value;\n prev.output = (prev.output || '') + tok.value;\n return;\n }\n\n tok.prev = prev;\n tokens.push(tok);\n prev = tok;\n };\n\n const extglobOpen = (type, value) => {\n const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };\n\n token.prev = prev;\n token.parens = state.parens;\n token.output = state.output;\n const output = (opts.capture ? '(' : '') + token.open;\n\n increment('parens');\n push({ type, value, output: state.output ? '' : ONE_CHAR });\n push({ type: 'paren', extglob: true, value: advance(), output });\n extglobs.push(token);\n };\n\n const extglobClose = token => {\n let output = token.close + (opts.capture ? ')' : '');\n let rest;\n\n if (token.type === 'negate') {\n let extglobStar = star;\n\n if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {\n extglobStar = globstar(opts);\n }\n\n if (extglobStar !== star || eos() || /^\\)+$/.test(remaining())) {\n output = token.close = `)$))${extglobStar}`;\n }\n\n if (token.inner.includes('*') && (rest = remaining()) && /^\\.[^\\\\/.]+$/.test(rest)) {\n // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.\n // In this case, we need to parse the string and use it in the output of the original pattern.\n // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.\n //\n // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.\n const expression = parse(rest, { ...options, fastpaths: false }).output;\n\n output = token.close = `)${expression})${extglobStar})`;\n }\n\n if (token.prev.type === 'bos') {\n state.negatedExtglob = true;\n }\n }\n\n push({ type: 'paren', extglob: true, value, output });\n decrement('parens');\n };\n\n /**\n * Fast paths\n */\n\n if (opts.fastpaths !== false && !/(^[*!]|[/()[\\]{}\"])/.test(input)) {\n let backslashes = false;\n\n let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {\n if (first === '\\\\') {\n backslashes = true;\n return m;\n }\n\n if (first === '?') {\n if (esc) {\n return esc + first + (rest ? QMARK.repeat(rest.length) : '');\n }\n if (index === 0) {\n return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');\n }\n return QMARK.repeat(chars.length);\n }\n\n if (first === '.') {\n return DOT_LITERAL.repeat(chars.length);\n }\n\n if (first === '*') {\n if (esc) {\n return esc + first + (rest ? star : '');\n }\n return star;\n }\n return esc ? m : `\\\\${m}`;\n });\n\n if (backslashes === true) {\n if (opts.unescape === true) {\n output = output.replace(/\\\\/g, '');\n } else {\n output = output.replace(/\\\\+/g, m => {\n return m.length % 2 === 0 ? '\\\\\\\\' : (m ? '\\\\' : '');\n });\n }\n }\n\n if (output === input && opts.contains === true) {\n state.output = input;\n return state;\n }\n\n state.output = utils.wrapOutput(output, state, options);\n return state;\n }\n\n /**\n * Tokenize input until we reach end-of-string\n */\n\n while (!eos()) {\n value = advance();\n\n if (value === '\\u0000') {\n continue;\n }\n\n /**\n * Escaped characters\n */\n\n if (value === '\\\\') {\n const next = peek();\n\n if (next === '/' && opts.bash !== true) {\n continue;\n }\n\n if (next === '.' || next === ';') {\n continue;\n }\n\n if (!next) {\n value += '\\\\';\n push({ type: 'text', value });\n continue;\n }\n\n // collapse slashes to reduce potential for exploits\n const match = /^\\\\+/.exec(remaining());\n let slashes = 0;\n\n if (match && match[0].length > 2) {\n slashes = match[0].length;\n state.index += slashes;\n if (slashes % 2 !== 0) {\n value += '\\\\';\n }\n }\n\n if (opts.unescape === true) {\n value = advance();\n } else {\n value += advance();\n }\n\n if (state.brackets === 0) {\n push({ type: 'text', value });\n continue;\n }\n }\n\n /**\n * If we're inside a regex character class, continue\n * until we reach the closing bracket.\n */\n\n if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {\n if (opts.posix !== false && value === ':') {\n const inner = prev.value.slice(1);\n if (inner.includes('[')) {\n prev.posix = true;\n\n if (inner.includes(':')) {\n const idx = prev.value.lastIndexOf('[');\n const pre = prev.value.slice(0, idx);\n const rest = prev.value.slice(idx + 2);\n const posix = POSIX_REGEX_SOURCE[rest];\n if (posix) {\n prev.value = pre + posix;\n state.backtrack = true;\n advance();\n\n if (!bos.output && tokens.indexOf(prev) === 1) {\n bos.output = ONE_CHAR;\n }\n continue;\n }\n }\n }\n }\n\n if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {\n value = `\\\\${value}`;\n }\n\n if (value === ']' && (prev.value === '[' || prev.value === '[^')) {\n value = `\\\\${value}`;\n }\n\n if (opts.posix === true && value === '!' && prev.value === '[') {\n value = '^';\n }\n\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * If we're inside a quoted string, continue\n * until we reach the closing double quote.\n */\n\n if (state.quotes === 1 && value !== '\"') {\n value = utils.escapeRegex(value);\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * Double quotes\n */\n\n if (value === '\"') {\n state.quotes = state.quotes === 1 ? 0 : 1;\n if (opts.keepQuotes === true) {\n push({ type: 'text', value });\n }\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === '(') {\n increment('parens');\n push({ type: 'paren', value });\n continue;\n }\n\n if (value === ')') {\n if (state.parens === 0 && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '('));\n }\n\n const extglob = extglobs[extglobs.length - 1];\n if (extglob && state.parens === extglob.parens + 1) {\n extglobClose(extglobs.pop());\n continue;\n }\n\n push({ type: 'paren', value, output: state.parens ? ')' : '\\\\)' });\n decrement('parens');\n continue;\n }\n\n /**\n * Square brackets\n */\n\n if (value === '[') {\n if (opts.nobracket === true || !remaining().includes(']')) {\n if (opts.nobracket !== true && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('closing', ']'));\n }\n\n value = `\\\\${value}`;\n } else {\n increment('brackets');\n }\n\n push({ type: 'bracket', value });\n continue;\n }\n\n if (value === ']') {\n if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n if (state.brackets === 0) {\n if (opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '['));\n }\n\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n decrement('brackets');\n\n const prevValue = prev.value.slice(1);\n if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {\n value = `/${value}`;\n }\n\n prev.value += value;\n append({ value });\n\n // when literal brackets are explicitly disabled\n // assume we should match with a regex character class\n if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {\n continue;\n }\n\n const escaped = utils.escapeRegex(prev.value);\n state.output = state.output.slice(0, -prev.value.length);\n\n // when literal brackets are explicitly enabled\n // assume we should escape the brackets to match literal characters\n if (opts.literalBrackets === true) {\n state.output += escaped;\n prev.value = escaped;\n continue;\n }\n\n // when the user specifies nothing, try to match both\n prev.value = `(${capture}${escaped}|${prev.value})`;\n state.output += prev.value;\n continue;\n }\n\n /**\n * Braces\n */\n\n if (value === '{' && opts.nobrace !== true) {\n increment('braces');\n\n const open = {\n type: 'brace',\n value,\n output: '(',\n outputIndex: state.output.length,\n tokensIndex: state.tokens.length\n };\n\n braces.push(open);\n push(open);\n continue;\n }\n\n if (value === '}') {\n const brace = braces[braces.length - 1];\n\n if (opts.nobrace === true || !brace) {\n push({ type: 'text', value, output: value });\n continue;\n }\n\n let output = ')';\n\n if (brace.dots === true) {\n const arr = tokens.slice();\n const range = [];\n\n for (let i = arr.length - 1; i >= 0; i--) {\n tokens.pop();\n if (arr[i].type === 'brace') {\n break;\n }\n if (arr[i].type !== 'dots') {\n range.unshift(arr[i].value);\n }\n }\n\n output = expandRange(range, opts);\n state.backtrack = true;\n }\n\n if (brace.comma !== true && brace.dots !== true) {\n const out = state.output.slice(0, brace.outputIndex);\n const toks = state.tokens.slice(brace.tokensIndex);\n brace.value = brace.output = '\\\\{';\n value = output = '\\\\}';\n state.output = out;\n for (const t of toks) {\n state.output += (t.output || t.value);\n }\n }\n\n push({ type: 'brace', value, output });\n decrement('braces');\n braces.pop();\n continue;\n }\n\n /**\n * Pipes\n */\n\n if (value === '|') {\n if (extglobs.length > 0) {\n extglobs[extglobs.length - 1].conditions++;\n }\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Commas\n */\n\n if (value === ',') {\n let output = value;\n\n const brace = braces[braces.length - 1];\n if (brace && stack[stack.length - 1] === 'braces') {\n brace.comma = true;\n output = '|';\n }\n\n push({ type: 'comma', value, output });\n continue;\n }\n\n /**\n * Slashes\n */\n\n if (value === '/') {\n // if the beginning of the glob is \"./\", advance the start\n // to the current index, and don't add the \"./\" characters\n // to the state. This greatly simplifies lookbehinds when\n // checking for BOS characters like \"!\" and \".\" (not \"./\")\n if (prev.type === 'dot' && state.index === state.start + 1) {\n state.start = state.index + 1;\n state.consumed = '';\n state.output = '';\n tokens.pop();\n prev = bos; // reset \"prev\" to the first token\n continue;\n }\n\n push({ type: 'slash', value, output: SLASH_LITERAL });\n continue;\n }\n\n /**\n * Dots\n */\n\n if (value === '.') {\n if (state.braces > 0 && prev.type === 'dot') {\n if (prev.value === '.') prev.output = DOT_LITERAL;\n const brace = braces[braces.length - 1];\n prev.type = 'dots';\n prev.output += value;\n prev.value += value;\n brace.dots = true;\n continue;\n }\n\n if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {\n push({ type: 'text', value, output: DOT_LITERAL });\n continue;\n }\n\n push({ type: 'dot', value, output: DOT_LITERAL });\n continue;\n }\n\n /**\n * Question marks\n */\n\n if (value === '?') {\n const isGroup = prev && prev.value === '(';\n if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('qmark', value);\n continue;\n }\n\n if (prev && prev.type === 'paren') {\n const next = peek();\n let output = value;\n\n if (next === '<' && !utils.supportsLookbehinds()) {\n throw new Error('Node.js v10 or higher is required for regex lookbehinds');\n }\n\n if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\\w+>)/.test(remaining()))) {\n output = `\\\\${value}`;\n }\n\n push({ type: 'text', value, output });\n continue;\n }\n\n if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {\n push({ type: 'qmark', value, output: QMARK_NO_DOT });\n continue;\n }\n\n push({ type: 'qmark', value, output: QMARK });\n continue;\n }\n\n /**\n * Exclamation\n */\n\n if (value === '!') {\n if (opts.noextglob !== true && peek() === '(') {\n if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {\n extglobOpen('negate', value);\n continue;\n }\n }\n\n if (opts.nonegate !== true && state.index === 0) {\n negate();\n continue;\n }\n }\n\n /**\n * Plus\n */\n\n if (value === '+') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('plus', value);\n continue;\n }\n\n if ((prev && prev.value === '(') || opts.regex === false) {\n push({ type: 'plus', value, output: PLUS_LITERAL });\n continue;\n }\n\n if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {\n push({ type: 'plus', value });\n continue;\n }\n\n push({ type: 'plus', value: PLUS_LITERAL });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value === '@') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n push({ type: 'at', extglob: true, value, output: '' });\n continue;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value !== '*') {\n if (value === '$' || value === '^') {\n value = `\\\\${value}`;\n }\n\n const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());\n if (match) {\n value += match[0];\n state.index += match[0].length;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Stars\n */\n\n if (prev && (prev.type === 'globstar' || prev.star === true)) {\n prev.type = 'star';\n prev.star = true;\n prev.value += value;\n prev.output = star;\n state.backtrack = true;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n let rest = remaining();\n if (opts.noextglob !== true && /^\\([^?]/.test(rest)) {\n extglobOpen('star', value);\n continue;\n }\n\n if (prev.type === 'star') {\n if (opts.noglobstar === true) {\n consume(value);\n continue;\n }\n\n const prior = prev.prev;\n const before = prior.prev;\n const isStart = prior.type === 'slash' || prior.type === 'bos';\n const afterStar = before && (before.type === 'star' || before.type === 'globstar');\n\n if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');\n const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');\n if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n // strip consecutive `/**/`\n while (rest.slice(0, 3) === '/**') {\n const after = input[state.index + 4];\n if (after && after !== '/') {\n break;\n }\n rest = rest.slice(3);\n consume('/**', 3);\n }\n\n if (prior.type === 'bos' && eos()) {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = globstar(opts);\n state.output = prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');\n prev.value += value;\n state.globstar = true;\n state.output += prior.output + prev.output;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {\n const end = rest[1] !== void 0 ? '|$' : '';\n\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;\n prev.value += value;\n\n state.output += prior.output + prev.output;\n state.globstar = true;\n\n consume(value + advance());\n\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n if (prior.type === 'bos' && rest[0] === '/') {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;\n state.output = prev.output;\n state.globstar = true;\n consume(value + advance());\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n // remove single star from output\n state.output = state.output.slice(0, -prev.output.length);\n\n // reset previous token to globstar\n prev.type = 'globstar';\n prev.output = globstar(opts);\n prev.value += value;\n\n // reset output with globstar\n state.output += prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n const token = { type: 'star', value, output: star };\n\n if (opts.bash === true) {\n token.output = '.*?';\n if (prev.type === 'bos' || prev.type === 'slash') {\n token.output = nodot + token.output;\n }\n push(token);\n continue;\n }\n\n if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {\n token.output = value;\n push(token);\n continue;\n }\n\n if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {\n if (prev.type === 'dot') {\n state.output += NO_DOT_SLASH;\n prev.output += NO_DOT_SLASH;\n\n } else if (opts.dot === true) {\n state.output += NO_DOTS_SLASH;\n prev.output += NO_DOTS_SLASH;\n\n } else {\n state.output += nodot;\n prev.output += nodot;\n }\n\n if (peek() !== '*') {\n state.output += ONE_CHAR;\n prev.output += ONE_CHAR;\n }\n }\n\n push(token);\n }\n\n while (state.brackets > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));\n state.output = utils.escapeLast(state.output, '[');\n decrement('brackets');\n }\n\n while (state.parens > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));\n state.output = utils.escapeLast(state.output, '(');\n decrement('parens');\n }\n\n while (state.braces > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));\n state.output = utils.escapeLast(state.output, '{');\n decrement('braces');\n }\n\n if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {\n push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });\n }\n\n // rebuild the output if we had to backtrack at any point\n if (state.backtrack === true) {\n state.output = '';\n\n for (const token of state.tokens) {\n state.output += token.output != null ? token.output : token.value;\n\n if (token.suffix) {\n state.output += token.suffix;\n }\n }\n }\n\n return state;\n};\n\n/**\n * Fast paths for creating regular expressions for common glob patterns.\n * This can significantly speed up processing and has very little downside\n * impact when none of the fast paths match.\n */\n\nparse.fastpaths = (input, options) => {\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n const len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n input = REPLACEMENTS[input] || input;\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const {\n DOT_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOTS_SLASH,\n STAR,\n START_ANCHOR\n } = constants.globChars(win32);\n\n const nodot = opts.dot ? NO_DOTS : NO_DOT;\n const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;\n const capture = opts.capture ? '' : '?:';\n const state = { negated: false, prefix: '' };\n let star = opts.bash === true ? '.*?' : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n const globstar = opts => {\n if (opts.noglobstar === true) return star;\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const create = str => {\n switch (str) {\n case '*':\n return `${nodot}${ONE_CHAR}${star}`;\n\n case '.*':\n return `${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*.*':\n return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*/*':\n return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;\n\n case '**':\n return nodot + globstar(opts);\n\n case '**/*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;\n\n case '**/*.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '**/.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n default: {\n const match = /^(.*?)\\.(\\w+)$/.exec(str);\n if (!match) return;\n\n const source = create(match[1]);\n if (!source) return;\n\n return source + DOT_LITERAL + match[2];\n }\n }\n };\n\n const output = utils.removePrefix(input, state);\n let source = create(output);\n\n if (source && opts.strictSlashes !== true) {\n source += `${SLASH_LITERAL}?`;\n }\n\n return source;\n};\n\nmodule.exports = parse;\n","'use strict';\n\nconst path = require('path');\nconst scan = require('./scan');\nconst parse = require('./parse');\nconst utils = require('./utils');\nconst constants = require('./constants');\nconst isObject = val => val && typeof val === 'object' && !Array.isArray(val);\n\n/**\n * Creates a matcher function from one or more glob patterns. The\n * returned function takes a string to match as its first argument,\n * and returns true if the string is a match. The returned matcher\n * function also takes a boolean as the second argument that, when true,\n * returns an object with additional information.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch(glob[, options]);\n *\n * const isMatch = picomatch('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @name picomatch\n * @param {String|Array} `globs` One or more glob patterns.\n * @param {Object=} `options`\n * @return {Function=} Returns a matcher function.\n * @api public\n */\n\nconst picomatch = (glob, options, returnState = false) => {\n if (Array.isArray(glob)) {\n const fns = glob.map(input => picomatch(input, options, returnState));\n const arrayMatcher = str => {\n for (const isMatch of fns) {\n const state = isMatch(str);\n if (state) return state;\n }\n return false;\n };\n return arrayMatcher;\n }\n\n const isState = isObject(glob) && glob.tokens && glob.input;\n\n if (glob === '' || (typeof glob !== 'string' && !isState)) {\n throw new TypeError('Expected pattern to be a non-empty string');\n }\n\n const opts = options || {};\n const posix = utils.isWindows(options);\n const regex = isState\n ? picomatch.compileRe(glob, options)\n : picomatch.makeRe(glob, options, false, true);\n\n const state = regex.state;\n delete regex.state;\n\n let isIgnored = () => false;\n if (opts.ignore) {\n const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };\n isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);\n }\n\n const matcher = (input, returnObject = false) => {\n const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });\n const result = { glob, state, regex, posix, input, output, match, isMatch };\n\n if (typeof opts.onResult === 'function') {\n opts.onResult(result);\n }\n\n if (isMatch === false) {\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (isIgnored(input)) {\n if (typeof opts.onIgnore === 'function') {\n opts.onIgnore(result);\n }\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (typeof opts.onMatch === 'function') {\n opts.onMatch(result);\n }\n return returnObject ? result : true;\n };\n\n if (returnState) {\n matcher.state = state;\n }\n\n return matcher;\n};\n\n/**\n * Test `input` with the given `regex`. This is used by the main\n * `picomatch()` function to test the input string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.test(input, regex[, options]);\n *\n * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\\/([^/]*?))$/));\n * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp} `regex`\n * @return {Object} Returns an object with matching info.\n * @api public\n */\n\npicomatch.test = (input, regex, options, { glob, posix } = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected input to be a string');\n }\n\n if (input === '') {\n return { isMatch: false, output: '' };\n }\n\n const opts = options || {};\n const format = opts.format || (posix ? utils.toPosixSlashes : null);\n let match = input === glob;\n let output = (match && format) ? format(input) : input;\n\n if (match === false) {\n output = format ? format(input) : input;\n match = output === glob;\n }\n\n if (match === false || opts.capture === true) {\n if (opts.matchBase === true || opts.basename === true) {\n match = picomatch.matchBase(input, regex, options, posix);\n } else {\n match = regex.exec(output);\n }\n }\n\n return { isMatch: Boolean(match), match, output };\n};\n\n/**\n * Match the basename of a filepath.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.matchBase(input, glob[, options]);\n * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).\n * @return {Boolean}\n * @api public\n */\n\npicomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => {\n const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);\n return regex.test(path.basename(input));\n};\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.isMatch(string, patterns[, options]);\n *\n * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String|Array} str The string to test.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} [options] See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\npicomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const result = picomatch.parse(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as a regex source string.\n * @api public\n */\n\npicomatch.parse = (pattern, options) => {\n if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));\n return parse(pattern, { ...options, fastpaths: false });\n};\n\n/**\n * Scan a glob pattern to separate the pattern into segments.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.scan(input[, options]);\n *\n * const result = picomatch.scan('!./foo/*.js');\n * console.log(result);\n * { prefix: '!./',\n * input: '!./foo/*.js',\n * start: 3,\n * base: 'foo',\n * glob: '*.js',\n * isBrace: false,\n * isBracket: false,\n * isGlob: true,\n * isExtglob: false,\n * isGlobstar: false,\n * negated: true }\n * ```\n * @param {String} `input` Glob pattern to scan.\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\npicomatch.scan = (input, options) => scan(input, options);\n\n/**\n * Compile a regular expression from the `state` object returned by the\n * [parse()](#parse) method.\n *\n * @param {Object} `state`\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.\n * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.\n * @return {RegExp}\n * @api public\n */\n\npicomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {\n if (returnOutput === true) {\n return state.output;\n }\n\n const opts = options || {};\n const prepend = opts.contains ? '' : '^';\n const append = opts.contains ? '' : '$';\n\n let source = `${prepend}(?:${state.output})${append}`;\n if (state && state.negated === true) {\n source = `^(?!${source}).*$`;\n }\n\n const regex = picomatch.toRegex(source, options);\n if (returnState === true) {\n regex.state = state;\n }\n\n return regex;\n};\n\n/**\n * Create a regular expression from a parsed glob pattern.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const state = picomatch.parse('*.js');\n * // picomatch.compileRe(state[, options]);\n *\n * console.log(picomatch.compileRe(state));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `state` The object returned from the `.parse` method.\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.\n * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\npicomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {\n if (!input || typeof input !== 'string') {\n throw new TypeError('Expected a non-empty string');\n }\n\n let parsed = { negated: false, fastpaths: true };\n\n if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {\n parsed.output = parse.fastpaths(input, options);\n }\n\n if (!parsed.output) {\n parsed = parse(input, options);\n }\n\n return picomatch.compileRe(parsed, options, returnOutput, returnState);\n};\n\n/**\n * Create a regular expression from the given regex source string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.toRegex(source[, options]);\n *\n * const { output } = picomatch.parse('*.js');\n * console.log(picomatch.toRegex(output));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `source` Regular expression source string.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\npicomatch.toRegex = (source, options) => {\n try {\n const opts = options || {};\n return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));\n } catch (err) {\n if (options && options.debug === true) throw err;\n return /$^/;\n }\n};\n\n/**\n * Picomatch constants.\n * @return {Object}\n */\n\npicomatch.constants = constants;\n\n/**\n * Expose \"picomatch\"\n */\n\nmodule.exports = picomatch;\n","'use strict';\n\nmodule.exports = require('./lib/picomatch');\n","/*!\n * normalize-path <https://github.com/jonschlinkert/normalize-path>\n *\n * Copyright (c) 2014-2018, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nmodule.exports = function(path, stripTrailing) {\n if (typeof path !== 'string') {\n throw new TypeError('expected path to be a string');\n }\n\n if (path === '\\\\' || path === '/') return '/';\n\n var len = path.length;\n if (len <= 1) return path;\n\n // ensure that win32 namespaces has two leading slashes, so that the path is\n // handled properly by the win32 version of path.parse() after being normalized\n // https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces\n var prefix = '';\n if (len > 4 && path[3] === '\\\\') {\n var ch = path[2];\n if ((ch === '?' || ch === '.') && path.slice(0, 2) === '\\\\\\\\') {\n path = path.slice(2);\n prefix = '//';\n }\n }\n\n var segs = path.split(/[/\\\\]+/);\n if (stripTrailing !== false && segs[segs.length - 1] === '') {\n segs.pop();\n }\n return prefix + segs.join('/');\n};\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n\nconst picomatch = require('picomatch');\nconst normalizePath = require('normalize-path');\n\n/**\n * @typedef {(testString: string) => boolean} AnymatchFn\n * @typedef {string|RegExp|AnymatchFn} AnymatchPattern\n * @typedef {AnymatchPattern|AnymatchPattern[]} AnymatchMatcher\n */\nconst BANG = '!';\nconst DEFAULT_OPTIONS = {returnIndex: false};\nconst arrify = (item) => Array.isArray(item) ? item : [item];\n\n/**\n * @param {AnymatchPattern} matcher\n * @param {object} options\n * @returns {AnymatchFn}\n */\nconst createPattern = (matcher, options) => {\n if (typeof matcher === 'function') {\n return matcher;\n }\n if (typeof matcher === 'string') {\n const glob = picomatch(matcher, options);\n return (string) => matcher === string || glob(string);\n }\n if (matcher instanceof RegExp) {\n return (string) => matcher.test(string);\n }\n return (string) => false;\n};\n\n/**\n * @param {Array<Function>} patterns\n * @param {Array<Function>} negPatterns\n * @param {String|Array} args\n * @param {Boolean} returnIndex\n * @returns {boolean|number}\n */\nconst matchPatterns = (patterns, negPatterns, args, returnIndex) => {\n const isList = Array.isArray(args);\n const _path = isList ? args[0] : args;\n if (!isList && typeof _path !== 'string') {\n throw new TypeError('anymatch: second argument must be a string: got ' +\n Object.prototype.toString.call(_path))\n }\n const path = normalizePath(_path, false);\n\n for (let index = 0; index < negPatterns.length; index++) {\n const nglob = negPatterns[index];\n if (nglob(path)) {\n return returnIndex ? -1 : false;\n }\n }\n\n const applied = isList && [path].concat(args.slice(1));\n for (let index = 0; index < patterns.length; index++) {\n const pattern = patterns[index];\n if (isList ? pattern(...applied) : pattern(path)) {\n return returnIndex ? index : true;\n }\n }\n\n return returnIndex ? -1 : false;\n};\n\n/**\n * @param {AnymatchMatcher} matchers\n * @param {Array|string} testString\n * @param {object} options\n * @returns {boolean|number|Function}\n */\nconst anymatch = (matchers, testString, options = DEFAULT_OPTIONS) => {\n if (matchers == null) {\n throw new TypeError('anymatch: specify first argument');\n }\n const opts = typeof options === 'boolean' ? {returnIndex: options} : options;\n const returnIndex = opts.returnIndex || false;\n\n // Early cache for matchers.\n const mtchers = arrify(matchers);\n const negatedGlobs = mtchers\n .filter(item => typeof item === 'string' && item.charAt(0) === BANG)\n .map(item => item.slice(1))\n .map(item => picomatch(item, opts));\n const patterns = mtchers\n .filter(item => typeof item !== 'string' || (typeof item === 'string' && item.charAt(0) !== BANG))\n .map(matcher => createPattern(matcher, opts));\n\n if (testString == null) {\n return (testString, ri = false) => {\n const returnIndex = typeof ri === 'boolean' ? ri : false;\n return matchPatterns(patterns, negatedGlobs, testString, returnIndex);\n }\n }\n\n return matchPatterns(patterns, negatedGlobs, testString, returnIndex);\n};\n\nanymatch.default = anymatch;\nmodule.exports = anymatch;\n","/*!\n * is-extglob <https://github.com/jonschlinkert/is-extglob>\n *\n * Copyright (c) 2014-2016, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\nmodule.exports = function isExtglob(str) {\n if (typeof str !== 'string' || str === '') {\n return false;\n }\n\n var match;\n while ((match = /(\\\\).|([@?!+*]\\(.*\\))/g.exec(str))) {\n if (match[2]) return true;\n str = str.slice(match.index + match[0].length);\n }\n\n return false;\n};\n","/*!\n * is-glob <https://github.com/jonschlinkert/is-glob>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nvar isExtglob = require('is-extglob');\nvar chars = { '{': '}', '(': ')', '[': ']'};\nvar strictCheck = function(str) {\n if (str[0] === '!') {\n return true;\n }\n var index = 0;\n var pipeIndex = -2;\n var closeSquareIndex = -2;\n var closeCurlyIndex = -2;\n var closeParenIndex = -2;\n var backSlashIndex = -2;\n while (index < str.length) {\n if (str[index] === '*') {\n return true;\n }\n\n if (str[index + 1] === '?' && /[\\].+)]/.test(str[index])) {\n return true;\n }\n\n if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') {\n if (closeSquareIndex < index) {\n closeSquareIndex = str.indexOf(']', index);\n }\n if (closeSquareIndex > index) {\n if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {\n return true;\n }\n backSlashIndex = str.indexOf('\\\\', index);\n if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {\n return true;\n }\n }\n }\n\n if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') {\n closeCurlyIndex = str.indexOf('}', index);\n if (closeCurlyIndex > index) {\n backSlashIndex = str.indexOf('\\\\', index);\n if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) {\n return true;\n }\n }\n }\n\n if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') {\n closeParenIndex = str.indexOf(')', index);\n if (closeParenIndex > index) {\n backSlashIndex = str.indexOf('\\\\', index);\n if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {\n return true;\n }\n }\n }\n\n if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') {\n if (pipeIndex < index) {\n pipeIndex = str.indexOf('|', index);\n }\n if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') {\n closeParenIndex = str.indexOf(')', pipeIndex);\n if (closeParenIndex > pipeIndex) {\n backSlashIndex = str.indexOf('\\\\', pipeIndex);\n if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {\n return true;\n }\n }\n }\n }\n\n if (str[index] === '\\\\') {\n var open = str[index + 1];\n index += 2;\n var close = chars[open];\n\n if (close) {\n var n = str.indexOf(close, index);\n if (n !== -1) {\n index = n + 1;\n }\n }\n\n if (str[index] === '!') {\n return true;\n }\n } else {\n index++;\n }\n }\n return false;\n};\n\nvar relaxedCheck = function(str) {\n if (str[0] === '!') {\n return true;\n }\n var index = 0;\n while (index < str.length) {\n if (/[*?{}()[\\]]/.test(str[index])) {\n return true;\n }\n\n if (str[index] === '\\\\') {\n var open = str[index + 1];\n index += 2;\n var close = chars[open];\n\n if (close) {\n var n = str.indexOf(close, index);\n if (n !== -1) {\n index = n + 1;\n }\n }\n\n if (str[index] === '!') {\n return true;\n }\n } else {\n index++;\n }\n }\n return false;\n};\n\nmodule.exports = function isGlob(str, options) {\n if (typeof str !== 'string' || str === '') {\n return false;\n }\n\n if (isExtglob(str)) {\n return true;\n }\n\n var check = strictCheck;\n\n // optionally relax check\n if (options && options.strict === false) {\n check = relaxedCheck;\n }\n\n return check(str);\n};\n","'use strict';\n\nvar isGlob = require('is-glob');\nvar pathPosixDirname = require('path').posix.dirname;\nvar isWin32 = require('os').platform() === 'win32';\n\nvar slash = '/';\nvar backslash = /\\\\/g;\nvar enclosure = /[\\{\\[].*[\\}\\]]$/;\nvar globby = /(^|[^\\\\])([\\{\\[]|\\([^\\)]+$)/;\nvar escaped = /\\\\([\\!\\*\\?\\|\\[\\]\\(\\)\\{\\}])/g;\n\n/**\n * @param {string} str\n * @param {Object} opts\n * @param {boolean} [opts.flipBackslashes=true]\n * @returns {string}\n */\nmodule.exports = function globParent(str, opts) {\n var options = Object.assign({ flipBackslashes: true }, opts);\n\n // flip windows path separators\n if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) {\n str = str.replace(backslash, slash);\n }\n\n // special case for strings ending in enclosure containing path separator\n if (enclosure.test(str)) {\n str += slash;\n }\n\n // preserves full path in case of trailing path separator\n str += 'a';\n\n // remove path parts that are globby\n do {\n str = pathPosixDirname(str);\n } while (isGlob(str) || globby.test(str));\n\n // remove escape chars and return result\n return str.replace(escaped, '$1');\n};\n","'use strict';\n\nexports.isInteger = num => {\n if (typeof num === 'number') {\n return Number.isInteger(num);\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isInteger(Number(num));\n }\n return false;\n};\n\n/**\n * Find a node of the given type\n */\n\nexports.find = (node, type) => node.nodes.find(node => node.type === type);\n\n/**\n * Find a node of the given type\n */\n\nexports.exceedsLimit = (min, max, step = 1, limit) => {\n if (limit === false) return false;\n if (!exports.isInteger(min) || !exports.isInteger(max)) return false;\n return ((Number(max) - Number(min)) / Number(step)) >= limit;\n};\n\n/**\n * Escape the given node with '\\\\' before node.value\n */\n\nexports.escapeNode = (block, n = 0, type) => {\n const node = block.nodes[n];\n if (!node) return;\n\n if ((type && node.type === type) || node.type === 'open' || node.type === 'close') {\n if (node.escaped !== true) {\n node.value = '\\\\' + node.value;\n node.escaped = true;\n }\n }\n};\n\n/**\n * Returns true if the given brace node should be enclosed in literal braces\n */\n\nexports.encloseBrace = node => {\n if (node.type !== 'brace') return false;\n if ((node.commas >> 0 + node.ranges >> 0) === 0) {\n node.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a brace node is invalid.\n */\n\nexports.isInvalidBrace = block => {\n if (block.type !== 'brace') return false;\n if (block.invalid === true || block.dollar) return true;\n if ((block.commas >> 0 + block.ranges >> 0) === 0) {\n block.invalid = true;\n return true;\n }\n if (block.open !== true || block.close !== true) {\n block.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a node is an open or close node\n */\n\nexports.isOpenOrClose = node => {\n if (node.type === 'open' || node.type === 'close') {\n return true;\n }\n return node.open === true || node.close === true;\n};\n\n/**\n * Reduce an array of text nodes.\n */\n\nexports.reduce = nodes => nodes.reduce((acc, node) => {\n if (node.type === 'text') acc.push(node.value);\n if (node.type === 'range') node.type = 'text';\n return acc;\n}, []);\n\n/**\n * Flatten an array\n */\n\nexports.flatten = (...args) => {\n const result = [];\n\n const flat = arr => {\n for (let i = 0; i < arr.length; i++) {\n const ele = arr[i];\n\n if (Array.isArray(ele)) {\n flat(ele);\n continue;\n }\n\n if (ele !== undefined) {\n result.push(ele);\n }\n }\n return result;\n };\n\n flat(args);\n return result;\n};\n","'use strict';\n\nconst utils = require('./utils');\n\nmodule.exports = (ast, options = {}) => {\n const stringify = (node, parent = {}) => {\n const invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent);\n const invalidNode = node.invalid === true && options.escapeInvalid === true;\n let output = '';\n\n if (node.value) {\n if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) {\n return '\\\\' + node.value;\n }\n return node.value;\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes) {\n for (const child of node.nodes) {\n output += stringify(child);\n }\n }\n return output;\n };\n\n return stringify(ast);\n};\n\n","/*!\n * is-number <https://github.com/jonschlinkert/is-number>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function(num) {\n if (typeof num === 'number') {\n return num - num === 0;\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isFinite ? Number.isFinite(+num) : isFinite(+num);\n }\n return false;\n};\n","/*!\n * to-regex-range <https://github.com/micromatch/to-regex-range>\n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nconst isNumber = require('is-number');\n\nconst toRegexRange = (min, max, options) => {\n if (isNumber(min) === false) {\n throw new TypeError('toRegexRange: expected the first argument to be a number');\n }\n\n if (max === void 0 || min === max) {\n return String(min);\n }\n\n if (isNumber(max) === false) {\n throw new TypeError('toRegexRange: expected the second argument to be a number.');\n }\n\n let opts = { relaxZeros: true, ...options };\n if (typeof opts.strictZeros === 'boolean') {\n opts.relaxZeros = opts.strictZeros === false;\n }\n\n let relax = String(opts.relaxZeros);\n let shorthand = String(opts.shorthand);\n let capture = String(opts.capture);\n let wrap = String(opts.wrap);\n let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap;\n\n if (toRegexRange.cache.hasOwnProperty(cacheKey)) {\n return toRegexRange.cache[cacheKey].result;\n }\n\n let a = Math.min(min, max);\n let b = Math.max(min, max);\n\n if (Math.abs(a - b) === 1) {\n let result = min + '|' + max;\n if (opts.capture) {\n return `(${result})`;\n }\n if (opts.wrap === false) {\n return result;\n }\n return `(?:${result})`;\n }\n\n let isPadded = hasPadding(min) || hasPadding(max);\n let state = { min, max, a, b };\n let positives = [];\n let negatives = [];\n\n if (isPadded) {\n state.isPadded = isPadded;\n state.maxLen = String(state.max).length;\n }\n\n if (a < 0) {\n let newMin = b < 0 ? Math.abs(b) : 1;\n negatives = splitToPatterns(newMin, Math.abs(a), state, opts);\n a = state.a = 0;\n }\n\n if (b >= 0) {\n positives = splitToPatterns(a, b, state, opts);\n }\n\n state.negatives = negatives;\n state.positives = positives;\n state.result = collatePatterns(negatives, positives, opts);\n\n if (opts.capture === true) {\n state.result = `(${state.result})`;\n } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) {\n state.result = `(?:${state.result})`;\n }\n\n toRegexRange.cache[cacheKey] = state;\n return state.result;\n};\n\nfunction collatePatterns(neg, pos, options) {\n let onlyNegative = filterPatterns(neg, pos, '-', false, options) || [];\n let onlyPositive = filterPatterns(pos, neg, '', false, options) || [];\n let intersected = filterPatterns(neg, pos, '-?', true, options) || [];\n let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive);\n return subpatterns.join('|');\n}\n\nfunction splitToRanges(min, max) {\n let nines = 1;\n let zeros = 1;\n\n let stop = countNines(min, nines);\n let stops = new Set([max]);\n\n while (min <= stop && stop <= max) {\n stops.add(stop);\n nines += 1;\n stop = countNines(min, nines);\n }\n\n stop = countZeros(max + 1, zeros) - 1;\n\n while (min < stop && stop <= max) {\n stops.add(stop);\n zeros += 1;\n stop = countZeros(max + 1, zeros) - 1;\n }\n\n stops = [...stops];\n stops.sort(compare);\n return stops;\n}\n\n/**\n * Convert a range to a regex pattern\n * @param {Number} `start`\n * @param {Number} `stop`\n * @return {String}\n */\n\nfunction rangeToPattern(start, stop, options) {\n if (start === stop) {\n return { pattern: start, count: [], digits: 0 };\n }\n\n let zipped = zip(start, stop);\n let digits = zipped.length;\n let pattern = '';\n let count = 0;\n\n for (let i = 0; i < digits; i++) {\n let [startDigit, stopDigit] = zipped[i];\n\n if (startDigit === stopDigit) {\n pattern += startDigit;\n\n } else if (startDigit !== '0' || stopDigit !== '9') {\n pattern += toCharacterClass(startDigit, stopDigit, options);\n\n } else {\n count++;\n }\n }\n\n if (count) {\n pattern += options.shorthand === true ? '\\\\d' : '[0-9]';\n }\n\n return { pattern, count: [count], digits };\n}\n\nfunction splitToPatterns(min, max, tok, options) {\n let ranges = splitToRanges(min, max);\n let tokens = [];\n let start = min;\n let prev;\n\n for (let i = 0; i < ranges.length; i++) {\n let max = ranges[i];\n let obj = rangeToPattern(String(start), String(max), options);\n let zeros = '';\n\n if (!tok.isPadded && prev && prev.pattern === obj.pattern) {\n if (prev.count.length > 1) {\n prev.count.pop();\n }\n\n prev.count.push(obj.count[0]);\n prev.string = prev.pattern + toQuantifier(prev.count);\n start = max + 1;\n continue;\n }\n\n if (tok.isPadded) {\n zeros = padZeros(max, tok, options);\n }\n\n obj.string = zeros + obj.pattern + toQuantifier(obj.count);\n tokens.push(obj);\n start = max + 1;\n prev = obj;\n }\n\n return tokens;\n}\n\nfunction filterPatterns(arr, comparison, prefix, intersection, options) {\n let result = [];\n\n for (let ele of arr) {\n let { string } = ele;\n\n // only push if _both_ are negative...\n if (!intersection && !contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n\n // or _both_ are positive\n if (intersection && contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n }\n return result;\n}\n\n/**\n * Zip strings\n */\n\nfunction zip(a, b) {\n let arr = [];\n for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]);\n return arr;\n}\n\nfunction compare(a, b) {\n return a > b ? 1 : b > a ? -1 : 0;\n}\n\nfunction contains(arr, key, val) {\n return arr.some(ele => ele[key] === val);\n}\n\nfunction countNines(min, len) {\n return Number(String(min).slice(0, -len) + '9'.repeat(len));\n}\n\nfunction countZeros(integer, zeros) {\n return integer - (integer % Math.pow(10, zeros));\n}\n\nfunction toQuantifier(digits) {\n let [start = 0, stop = ''] = digits;\n if (stop || start > 1) {\n return `{${start + (stop ? ',' + stop : '')}}`;\n }\n return '';\n}\n\nfunction toCharacterClass(a, b, options) {\n return `[${a}${(b - a === 1) ? '' : '-'}${b}]`;\n}\n\nfunction hasPadding(str) {\n return /^-?(0+)\\d/.test(str);\n}\n\nfunction padZeros(value, tok, options) {\n if (!tok.isPadded) {\n return value;\n }\n\n let diff = Math.abs(tok.maxLen - String(value).length);\n let relax = options.relaxZeros !== false;\n\n switch (diff) {\n case 0:\n return '';\n case 1:\n return relax ? '0?' : '0';\n case 2:\n return relax ? '0{0,2}' : '00';\n default: {\n return relax ? `0{0,${diff}}` : `0{${diff}}`;\n }\n }\n}\n\n/**\n * Cache\n */\n\ntoRegexRange.cache = {};\ntoRegexRange.clearCache = () => (toRegexRange.cache = {});\n\n/**\n * Expose `toRegexRange`\n */\n\nmodule.exports = toRegexRange;\n","/*!\n * fill-range <https://github.com/jonschlinkert/fill-range>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nconst util = require('util');\nconst toRegexRange = require('to-regex-range');\n\nconst isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\n\nconst transform = toNumber => {\n return value => toNumber === true ? Number(value) : String(value);\n};\n\nconst isValidValue = value => {\n return typeof value === 'number' || (typeof value === 'string' && value !== '');\n};\n\nconst isNumber = num => Number.isInteger(+num);\n\nconst zeros = input => {\n let value = `${input}`;\n let index = -1;\n if (value[0] === '-') value = value.slice(1);\n if (value === '0') return false;\n while (value[++index] === '0');\n return index > 0;\n};\n\nconst stringify = (start, end, options) => {\n if (typeof start === 'string' || typeof end === 'string') {\n return true;\n }\n return options.stringify === true;\n};\n\nconst pad = (input, maxLength, toNumber) => {\n if (maxLength > 0) {\n let dash = input[0] === '-' ? '-' : '';\n if (dash) input = input.slice(1);\n input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0'));\n }\n if (toNumber === false) {\n return String(input);\n }\n return input;\n};\n\nconst toMaxLen = (input, maxLength) => {\n let negative = input[0] === '-' ? '-' : '';\n if (negative) {\n input = input.slice(1);\n maxLength--;\n }\n while (input.length < maxLength) input = '0' + input;\n return negative ? ('-' + input) : input;\n};\n\nconst toSequence = (parts, options, maxLen) => {\n parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n\n let prefix = options.capture ? '' : '?:';\n let positives = '';\n let negatives = '';\n let result;\n\n if (parts.positives.length) {\n positives = parts.positives.map(v => toMaxLen(String(v), maxLen)).join('|');\n }\n\n if (parts.negatives.length) {\n negatives = `-(${prefix}${parts.negatives.map(v => toMaxLen(String(v), maxLen)).join('|')})`;\n }\n\n if (positives && negatives) {\n result = `${positives}|${negatives}`;\n } else {\n result = positives || negatives;\n }\n\n if (options.wrap) {\n return `(${prefix}${result})`;\n }\n\n return result;\n};\n\nconst toRange = (a, b, isNumbers, options) => {\n if (isNumbers) {\n return toRegexRange(a, b, { wrap: false, ...options });\n }\n\n let start = String.fromCharCode(a);\n if (a === b) return start;\n\n let stop = String.fromCharCode(b);\n return `[${start}-${stop}]`;\n};\n\nconst toRegex = (start, end, options) => {\n if (Array.isArray(start)) {\n let wrap = options.wrap === true;\n let prefix = options.capture ? '' : '?:';\n return wrap ? `(${prefix}${start.join('|')})` : start.join('|');\n }\n return toRegexRange(start, end, options);\n};\n\nconst rangeError = (...args) => {\n return new RangeError('Invalid range arguments: ' + util.inspect(...args));\n};\n\nconst invalidRange = (start, end, options) => {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n};\n\nconst invalidStep = (step, options) => {\n if (options.strictRanges === true) {\n throw new TypeError(`Expected step \"${step}\" to be a number`);\n }\n return [];\n};\n\nconst fillNumbers = (start, end, step = 1, options = {}) => {\n let a = Number(start);\n let b = Number(end);\n\n if (!Number.isInteger(a) || !Number.isInteger(b)) {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n }\n\n // fix negative zero\n if (a === 0) a = 0;\n if (b === 0) b = 0;\n\n let descending = a > b;\n let startString = String(start);\n let endString = String(end);\n let stepString = String(step);\n step = Math.max(Math.abs(step), 1);\n\n let padded = zeros(startString) || zeros(endString) || zeros(stepString);\n let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0;\n let toNumber = padded === false && stringify(start, end, options) === false;\n let format = options.transform || transform(toNumber);\n\n if (options.toRegex && step === 1) {\n return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options);\n }\n\n let parts = { negatives: [], positives: [] };\n let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num));\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n if (options.toRegex === true && step > 1) {\n push(a);\n } else {\n range.push(pad(format(a, index), maxLen, toNumber));\n }\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return step > 1\n ? toSequence(parts, options, maxLen)\n : toRegex(range, null, { wrap: false, ...options });\n }\n\n return range;\n};\n\nconst fillLetters = (start, end, step = 1, options = {}) => {\n if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) {\n return invalidRange(start, end, options);\n }\n\n let format = options.transform || (val => String.fromCharCode(val));\n let a = `${start}`.charCodeAt(0);\n let b = `${end}`.charCodeAt(0);\n\n let descending = a > b;\n let min = Math.min(a, b);\n let max = Math.max(a, b);\n\n if (options.toRegex && step === 1) {\n return toRange(min, max, false, options);\n }\n\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n range.push(format(a, index));\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return toRegex(range, null, { wrap: false, options });\n }\n\n return range;\n};\n\nconst fill = (start, end, step, options = {}) => {\n if (end == null && isValidValue(start)) {\n return [start];\n }\n\n if (!isValidValue(start) || !isValidValue(end)) {\n return invalidRange(start, end, options);\n }\n\n if (typeof step === 'function') {\n return fill(start, end, 1, { transform: step });\n }\n\n if (isObject(step)) {\n return fill(start, end, 0, step);\n }\n\n let opts = { ...options };\n if (opts.capture === true) opts.wrap = true;\n step = step || opts.step || 1;\n\n if (!isNumber(step)) {\n if (step != null && !isObject(step)) return invalidStep(step, opts);\n return fill(start, end, 1, step);\n }\n\n if (isNumber(start) && isNumber(end)) {\n return fillNumbers(start, end, step, opts);\n }\n\n return fillLetters(start, end, Math.max(Math.abs(step), 1), opts);\n};\n\nmodule.exports = fill;\n","'use strict';\n\nconst fill = require('fill-range');\nconst utils = require('./utils');\n\nconst compile = (ast, options = {}) => {\n const walk = (node, parent = {}) => {\n const invalidBlock = utils.isInvalidBrace(parent);\n const invalidNode = node.invalid === true && options.escapeInvalid === true;\n const invalid = invalidBlock === true || invalidNode === true;\n const prefix = options.escapeInvalid === true ? '\\\\' : '';\n let output = '';\n\n if (node.isOpen === true) {\n return prefix + node.value;\n }\n\n if (node.isClose === true) {\n console.log('node.isClose', prefix, node.value);\n return prefix + node.value;\n }\n\n if (node.type === 'open') {\n return invalid ? prefix + node.value : '(';\n }\n\n if (node.type === 'close') {\n return invalid ? prefix + node.value : ')';\n }\n\n if (node.type === 'comma') {\n return node.prev.type === 'comma' ? '' : invalid ? node.value : '|';\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes && node.ranges > 0) {\n const args = utils.reduce(node.nodes);\n const range = fill(...args, { ...options, wrap: false, toRegex: true, strictZeros: true });\n\n if (range.length !== 0) {\n return args.length > 1 && range.length > 1 ? `(${range})` : range;\n }\n }\n\n if (node.nodes) {\n for (const child of node.nodes) {\n output += walk(child, node);\n }\n }\n\n return output;\n };\n\n return walk(ast);\n};\n\nmodule.exports = compile;\n","'use strict';\n\nconst fill = require('fill-range');\nconst stringify = require('./stringify');\nconst utils = require('./utils');\n\nconst append = (queue = '', stash = '', enclose = false) => {\n const result = [];\n\n queue = [].concat(queue);\n stash = [].concat(stash);\n\n if (!stash.length) return queue;\n if (!queue.length) {\n return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash;\n }\n\n for (const item of queue) {\n if (Array.isArray(item)) {\n for (const value of item) {\n result.push(append(value, stash, enclose));\n }\n } else {\n for (let ele of stash) {\n if (enclose === true && typeof ele === 'string') ele = `{${ele}}`;\n result.push(Array.isArray(ele) ? append(item, ele, enclose) : item + ele);\n }\n }\n }\n return utils.flatten(result);\n};\n\nconst expand = (ast, options = {}) => {\n const rangeLimit = options.rangeLimit === undefined ? 1000 : options.rangeLimit;\n\n const walk = (node, parent = {}) => {\n node.queue = [];\n\n let p = parent;\n let q = parent.queue;\n\n while (p.type !== 'brace' && p.type !== 'root' && p.parent) {\n p = p.parent;\n q = p.queue;\n }\n\n if (node.invalid || node.dollar) {\n q.push(append(q.pop(), stringify(node, options)));\n return;\n }\n\n if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) {\n q.push(append(q.pop(), ['{}']));\n return;\n }\n\n if (node.nodes && node.ranges > 0) {\n const args = utils.reduce(node.nodes);\n\n if (utils.exceedsLimit(...args, options.step, rangeLimit)) {\n throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');\n }\n\n let range = fill(...args, options);\n if (range.length === 0) {\n range = stringify(node, options);\n }\n\n q.push(append(q.pop(), range));\n node.nodes = [];\n return;\n }\n\n const enclose = utils.encloseBrace(node);\n let queue = node.queue;\n let block = node;\n\n while (block.type !== 'brace' && block.type !== 'root' && block.parent) {\n block = block.parent;\n queue = block.queue;\n }\n\n for (let i = 0; i < node.nodes.length; i++) {\n const child = node.nodes[i];\n\n if (child.type === 'comma' && node.type === 'brace') {\n if (i === 1) queue.push('');\n queue.push('');\n continue;\n }\n\n if (child.type === 'close') {\n q.push(append(q.pop(), queue, enclose));\n continue;\n }\n\n if (child.value && child.type !== 'open') {\n queue.push(append(queue.pop(), child.value));\n continue;\n }\n\n if (child.nodes) {\n walk(child, node);\n }\n }\n\n return queue;\n };\n\n return utils.flatten(walk(ast));\n};\n\nmodule.exports = expand;\n","'use strict';\n\nmodule.exports = {\n MAX_LENGTH: 10000,\n\n // Digits\n CHAR_0: '0', /* 0 */\n CHAR_9: '9', /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 'A', /* A */\n CHAR_LOWERCASE_A: 'a', /* a */\n CHAR_UPPERCASE_Z: 'Z', /* Z */\n CHAR_LOWERCASE_Z: 'z', /* z */\n\n CHAR_LEFT_PARENTHESES: '(', /* ( */\n CHAR_RIGHT_PARENTHESES: ')', /* ) */\n\n CHAR_ASTERISK: '*', /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: '&', /* & */\n CHAR_AT: '@', /* @ */\n CHAR_BACKSLASH: '\\\\', /* \\ */\n CHAR_BACKTICK: '`', /* ` */\n CHAR_CARRIAGE_RETURN: '\\r', /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */\n CHAR_COLON: ':', /* : */\n CHAR_COMMA: ',', /* , */\n CHAR_DOLLAR: '$', /* . */\n CHAR_DOT: '.', /* . */\n CHAR_DOUBLE_QUOTE: '\"', /* \" */\n CHAR_EQUAL: '=', /* = */\n CHAR_EXCLAMATION_MARK: '!', /* ! */\n CHAR_FORM_FEED: '\\f', /* \\f */\n CHAR_FORWARD_SLASH: '/', /* / */\n CHAR_HASH: '#', /* # */\n CHAR_HYPHEN_MINUS: '-', /* - */\n CHAR_LEFT_ANGLE_BRACKET: '<', /* < */\n CHAR_LEFT_CURLY_BRACE: '{', /* { */\n CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */\n CHAR_LINE_FEED: '\\n', /* \\n */\n CHAR_NO_BREAK_SPACE: '\\u00A0', /* \\u00A0 */\n CHAR_PERCENT: '%', /* % */\n CHAR_PLUS: '+', /* + */\n CHAR_QUESTION_MARK: '?', /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */\n CHAR_RIGHT_CURLY_BRACE: '}', /* } */\n CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */\n CHAR_SEMICOLON: ';', /* ; */\n CHAR_SINGLE_QUOTE: '\\'', /* ' */\n CHAR_SPACE: ' ', /* */\n CHAR_TAB: '\\t', /* \\t */\n CHAR_UNDERSCORE: '_', /* _ */\n CHAR_VERTICAL_LINE: '|', /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\\uFEFF' /* \\uFEFF */\n};\n","'use strict';\n\nconst stringify = require('./stringify');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n CHAR_BACKSLASH, /* \\ */\n CHAR_BACKTICK, /* ` */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_RIGHT_SQUARE_BRACKET, /* ] */\n CHAR_DOUBLE_QUOTE, /* \" */\n CHAR_SINGLE_QUOTE, /* ' */\n CHAR_NO_BREAK_SPACE,\n CHAR_ZERO_WIDTH_NOBREAK_SPACE\n} = require('./constants');\n\n/**\n * parse\n */\n\nconst parse = (input, options = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n const opts = options || {};\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n if (input.length > max) {\n throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`);\n }\n\n const ast = { type: 'root', input, nodes: [] };\n const stack = [ast];\n let block = ast;\n let prev = ast;\n let brackets = 0;\n const length = input.length;\n let index = 0;\n let depth = 0;\n let value;\n\n /**\n * Helpers\n */\n\n const advance = () => input[index++];\n const push = node => {\n if (node.type === 'text' && prev.type === 'dot') {\n prev.type = 'text';\n }\n\n if (prev && prev.type === 'text' && node.type === 'text') {\n prev.value += node.value;\n return;\n }\n\n block.nodes.push(node);\n node.parent = block;\n node.prev = prev;\n prev = node;\n return node;\n };\n\n push({ type: 'bos' });\n\n while (index < length) {\n block = stack[stack.length - 1];\n value = advance();\n\n /**\n * Invalid chars\n */\n\n if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) {\n continue;\n }\n\n /**\n * Escaped chars\n */\n\n if (value === CHAR_BACKSLASH) {\n push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() });\n continue;\n }\n\n /**\n * Right square bracket (literal): ']'\n */\n\n if (value === CHAR_RIGHT_SQUARE_BRACKET) {\n push({ type: 'text', value: '\\\\' + value });\n continue;\n }\n\n /**\n * Left square bracket: '['\n */\n\n if (value === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n\n let next;\n\n while (index < length && (next = advance())) {\n value += next;\n\n if (next === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n continue;\n }\n\n if (next === CHAR_BACKSLASH) {\n value += advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n brackets--;\n\n if (brackets === 0) {\n break;\n }\n }\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === CHAR_LEFT_PARENTHESES) {\n block = push({ type: 'paren', nodes: [] });\n stack.push(block);\n push({ type: 'text', value });\n continue;\n }\n\n if (value === CHAR_RIGHT_PARENTHESES) {\n if (block.type !== 'paren') {\n push({ type: 'text', value });\n continue;\n }\n block = stack.pop();\n push({ type: 'text', value });\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Quotes: '|\"|`\n */\n\n if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) {\n const open = value;\n let next;\n\n if (options.keepQuotes !== true) {\n value = '';\n }\n\n while (index < length && (next = advance())) {\n if (next === CHAR_BACKSLASH) {\n value += next + advance();\n continue;\n }\n\n if (next === open) {\n if (options.keepQuotes === true) value += next;\n break;\n }\n\n value += next;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Left curly brace: '{'\n */\n\n if (value === CHAR_LEFT_CURLY_BRACE) {\n depth++;\n\n const dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true;\n const brace = {\n type: 'brace',\n open: true,\n close: false,\n dollar,\n depth,\n commas: 0,\n ranges: 0,\n nodes: []\n };\n\n block = push(brace);\n stack.push(block);\n push({ type: 'open', value });\n continue;\n }\n\n /**\n * Right curly brace: '}'\n */\n\n if (value === CHAR_RIGHT_CURLY_BRACE) {\n if (block.type !== 'brace') {\n push({ type: 'text', value });\n continue;\n }\n\n const type = 'close';\n block = stack.pop();\n block.close = true;\n\n push({ type, value });\n depth--;\n\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Comma: ','\n */\n\n if (value === CHAR_COMMA && depth > 0) {\n if (block.ranges > 0) {\n block.ranges = 0;\n const open = block.nodes.shift();\n block.nodes = [open, { type: 'text', value: stringify(block) }];\n }\n\n push({ type: 'comma', value });\n block.commas++;\n continue;\n }\n\n /**\n * Dot: '.'\n */\n\n if (value === CHAR_DOT && depth > 0 && block.commas === 0) {\n const siblings = block.nodes;\n\n if (depth === 0 || siblings.length === 0) {\n push({ type: 'text', value });\n continue;\n }\n\n if (prev.type === 'dot') {\n block.range = [];\n prev.value += value;\n prev.type = 'range';\n\n if (block.nodes.length !== 3 && block.nodes.length !== 5) {\n block.invalid = true;\n block.ranges = 0;\n prev.type = 'text';\n continue;\n }\n\n block.ranges++;\n block.args = [];\n continue;\n }\n\n if (prev.type === 'range') {\n siblings.pop();\n\n const before = siblings[siblings.length - 1];\n before.value += prev.value + value;\n prev = before;\n block.ranges--;\n continue;\n }\n\n push({ type: 'dot', value });\n continue;\n }\n\n /**\n * Text\n */\n\n push({ type: 'text', value });\n }\n\n // Mark imbalanced braces and brackets as invalid\n do {\n block = stack.pop();\n\n if (block.type !== 'root') {\n block.nodes.forEach(node => {\n if (!node.nodes) {\n if (node.type === 'open') node.isOpen = true;\n if (node.type === 'close') node.isClose = true;\n if (!node.nodes) node.type = 'text';\n node.invalid = true;\n }\n });\n\n // get the location of the block on parent.nodes (block's siblings)\n const parent = stack[stack.length - 1];\n const index = parent.nodes.indexOf(block);\n // replace the (invalid) block with it's nodes\n parent.nodes.splice(index, 1, ...block.nodes);\n }\n } while (stack.length > 0);\n\n push({ type: 'eos' });\n return ast;\n};\n\nmodule.exports = parse;\n","'use strict';\n\nconst stringify = require('./lib/stringify');\nconst compile = require('./lib/compile');\nconst expand = require('./lib/expand');\nconst parse = require('./lib/parse');\n\n/**\n * Expand the given pattern or create a regex-compatible string.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)']\n * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c']\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {String}\n * @api public\n */\n\nconst braces = (input, options = {}) => {\n let output = [];\n\n if (Array.isArray(input)) {\n for (const pattern of input) {\n const result = braces.create(pattern, options);\n if (Array.isArray(result)) {\n output.push(...result);\n } else {\n output.push(result);\n }\n }\n } else {\n output = [].concat(braces.create(input, options));\n }\n\n if (options && options.expand === true && options.nodupes === true) {\n output = [...new Set(output)];\n }\n return output;\n};\n\n/**\n * Parse the given `str` with the given `options`.\n *\n * ```js\n * // braces.parse(pattern, [, options]);\n * const ast = braces.parse('a/{b,c}/d');\n * console.log(ast);\n * ```\n * @param {String} pattern Brace pattern to parse\n * @param {Object} options\n * @return {Object} Returns an AST\n * @api public\n */\n\nbraces.parse = (input, options = {}) => parse(input, options);\n\n/**\n * Creates a braces string from an AST, or an AST node.\n *\n * ```js\n * const braces = require('braces');\n * let ast = braces.parse('foo/{a,b}/bar');\n * console.log(stringify(ast.nodes[2])); //=> '{a,b}'\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.stringify = (input, options = {}) => {\n if (typeof input === 'string') {\n return stringify(braces.parse(input, options), options);\n }\n return stringify(input, options);\n};\n\n/**\n * Compiles a brace pattern into a regex-compatible, optimized string.\n * This method is called by the main [braces](#braces) function by default.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.compile('a/{b,c}/d'));\n * //=> ['a/(b|c)/d']\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.compile = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n return compile(input, options);\n};\n\n/**\n * Expands a brace pattern into an array. This method is called by the\n * main [braces](#braces) function when `options.expand` is true. Before\n * using this method it's recommended that you read the [performance notes](#performance))\n * and advantages of using [.compile](#compile) instead.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.expand('a/{b,c}/d'));\n * //=> ['a/b/d', 'a/c/d'];\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.expand = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n\n let result = expand(input, options);\n\n // filter out empty strings if specified\n if (options.noempty === true) {\n result = result.filter(Boolean);\n }\n\n // filter out duplicates if specified\n if (options.nodupes === true) {\n result = [...new Set(result)];\n }\n\n return result;\n};\n\n/**\n * Processes a brace pattern and returns either an expanded array\n * (if `options.expand` is true), a highly optimized regex-compatible string.\n * This method is called by the main [braces](#braces) function.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}'))\n * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)'\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.create = (input, options = {}) => {\n if (input === '' || input.length < 3) {\n return [input];\n }\n\n return options.expand !== true\n ? braces.compile(input, options)\n : braces.expand(input, options);\n};\n\n/**\n * Expose \"braces\"\n */\n\nmodule.exports = braces;\n","[\n\t\"3dm\",\n\t\"3ds\",\n\t\"3g2\",\n\t\"3gp\",\n\t\"7z\",\n\t\"a\",\n\t\"aac\",\n\t\"adp\",\n\t\"afdesign\",\n\t\"afphoto\",\n\t\"afpub\",\n\t\"ai\",\n\t\"aif\",\n\t\"aiff\",\n\t\"alz\",\n\t\"ape\",\n\t\"apk\",\n\t\"appimage\",\n\t\"ar\",\n\t\"arj\",\n\t\"asf\",\n\t\"au\",\n\t\"avi\",\n\t\"bak\",\n\t\"baml\",\n\t\"bh\",\n\t\"bin\",\n\t\"bk\",\n\t\"bmp\",\n\t\"btif\",\n\t\"bz2\",\n\t\"bzip2\",\n\t\"cab\",\n\t\"caf\",\n\t\"cgm\",\n\t\"class\",\n\t\"cmx\",\n\t\"cpio\",\n\t\"cr2\",\n\t\"cur\",\n\t\"dat\",\n\t\"dcm\",\n\t\"deb\",\n\t\"dex\",\n\t\"djvu\",\n\t\"dll\",\n\t\"dmg\",\n\t\"dng\",\n\t\"doc\",\n\t\"docm\",\n\t\"docx\",\n\t\"dot\",\n\t\"dotm\",\n\t\"dra\",\n\t\"DS_Store\",\n\t\"dsk\",\n\t\"dts\",\n\t\"dtshd\",\n\t\"dvb\",\n\t\"dwg\",\n\t\"dxf\",\n\t\"ecelp4800\",\n\t\"ecelp7470\",\n\t\"ecelp9600\",\n\t\"egg\",\n\t\"eol\",\n\t\"eot\",\n\t\"epub\",\n\t\"exe\",\n\t\"f4v\",\n\t\"fbs\",\n\t\"fh\",\n\t\"fla\",\n\t\"flac\",\n\t\"flatpak\",\n\t\"fli\",\n\t\"flv\",\n\t\"fpx\",\n\t\"fst\",\n\t\"fvt\",\n\t\"g3\",\n\t\"gh\",\n\t\"gif\",\n\t\"graffle\",\n\t\"gz\",\n\t\"gzip\",\n\t\"h261\",\n\t\"h263\",\n\t\"h264\",\n\t\"icns\",\n\t\"ico\",\n\t\"ief\",\n\t\"img\",\n\t\"ipa\",\n\t\"iso\",\n\t\"jar\",\n\t\"jpeg\",\n\t\"jpg\",\n\t\"jpgv\",\n\t\"jpm\",\n\t\"jxr\",\n\t\"key\",\n\t\"ktx\",\n\t\"lha\",\n\t\"lib\",\n\t\"lvp\",\n\t\"lz\",\n\t\"lzh\",\n\t\"lzma\",\n\t\"lzo\",\n\t\"m3u\",\n\t\"m4a\",\n\t\"m4v\",\n\t\"mar\",\n\t\"mdi\",\n\t\"mht\",\n\t\"mid\",\n\t\"midi\",\n\t\"mj2\",\n\t\"mka\",\n\t\"mkv\",\n\t\"mmr\",\n\t\"mng\",\n\t\"mobi\",\n\t\"mov\",\n\t\"movie\",\n\t\"mp3\",\n\t\"mp4\",\n\t\"mp4a\",\n\t\"mpeg\",\n\t\"mpg\",\n\t\"mpga\",\n\t\"mxu\",\n\t\"nef\",\n\t\"npx\",\n\t\"numbers\",\n\t\"nupkg\",\n\t\"o\",\n\t\"odp\",\n\t\"ods\",\n\t\"odt\",\n\t\"oga\",\n\t\"ogg\",\n\t\"ogv\",\n\t\"otf\",\n\t\"ott\",\n\t\"pages\",\n\t\"pbm\",\n\t\"pcx\",\n\t\"pdb\",\n\t\"pdf\",\n\t\"pea\",\n\t\"pgm\",\n\t\"pic\",\n\t\"png\",\n\t\"pnm\",\n\t\"pot\",\n\t\"potm\",\n\t\"potx\",\n\t\"ppa\",\n\t\"ppam\",\n\t\"ppm\",\n\t\"pps\",\n\t\"ppsm\",\n\t\"ppsx\",\n\t\"ppt\",\n\t\"pptm\",\n\t\"pptx\",\n\t\"psd\",\n\t\"pya\",\n\t\"pyc\",\n\t\"pyo\",\n\t\"pyv\",\n\t\"qt\",\n\t\"rar\",\n\t\"ras\",\n\t\"raw\",\n\t\"resources\",\n\t\"rgb\",\n\t\"rip\",\n\t\"rlc\",\n\t\"rmf\",\n\t\"rmvb\",\n\t\"rpm\",\n\t\"rtf\",\n\t\"rz\",\n\t\"s3m\",\n\t\"s7z\",\n\t\"scpt\",\n\t\"sgi\",\n\t\"shar\",\n\t\"snap\",\n\t\"sil\",\n\t\"sketch\",\n\t\"slk\",\n\t\"smv\",\n\t\"snk\",\n\t\"so\",\n\t\"stl\",\n\t\"suo\",\n\t\"sub\",\n\t\"swf\",\n\t\"tar\",\n\t\"tbz\",\n\t\"tbz2\",\n\t\"tga\",\n\t\"tgz\",\n\t\"thmx\",\n\t\"tif\",\n\t\"tiff\",\n\t\"tlz\",\n\t\"ttc\",\n\t\"ttf\",\n\t\"txz\",\n\t\"udf\",\n\t\"uvh\",\n\t\"uvi\",\n\t\"uvm\",\n\t\"uvp\",\n\t\"uvs\",\n\t\"uvu\",\n\t\"viv\",\n\t\"vob\",\n\t\"war\",\n\t\"wav\",\n\t\"wax\",\n\t\"wbmp\",\n\t\"wdp\",\n\t\"weba\",\n\t\"webm\",\n\t\"webp\",\n\t\"whl\",\n\t\"wim\",\n\t\"wm\",\n\t\"wma\",\n\t\"wmv\",\n\t\"wmx\",\n\t\"woff\",\n\t\"woff2\",\n\t\"wrm\",\n\t\"wvx\",\n\t\"xbm\",\n\t\"xif\",\n\t\"xla\",\n\t\"xlam\",\n\t\"xls\",\n\t\"xlsb\",\n\t\"xlsm\",\n\t\"xlsx\",\n\t\"xlt\",\n\t\"xltm\",\n\t\"xltx\",\n\t\"xm\",\n\t\"xmind\",\n\t\"xpi\",\n\t\"xpm\",\n\t\"xwd\",\n\t\"xz\",\n\t\"z\",\n\t\"zip\",\n\t\"zipx\"\n]\n","module.exports = require('./binary-extensions.json');\n","'use strict';\nconst path = require('path');\nconst binaryExtensions = require('binary-extensions');\n\nconst extensions = new Set(binaryExtensions);\n\nmodule.exports = filePath => extensions.has(path.extname(filePath).slice(1).toLowerCase());\n","'use strict';\n\nconst {sep} = require('path');\nconst {platform} = process;\nconst os = require('os');\n\nexports.EV_ALL = 'all';\nexports.EV_READY = 'ready';\nexports.EV_ADD = 'add';\nexports.EV_CHANGE = 'change';\nexports.EV_ADD_DIR = 'addDir';\nexports.EV_UNLINK = 'unlink';\nexports.EV_UNLINK_DIR = 'unlinkDir';\nexports.EV_RAW = 'raw';\nexports.EV_ERROR = 'error';\n\nexports.STR_DATA = 'data';\nexports.STR_END = 'end';\nexports.STR_CLOSE = 'close';\n\nexports.FSEVENT_CREATED = 'created';\nexports.FSEVENT_MODIFIED = 'modified';\nexports.FSEVENT_DELETED = 'deleted';\nexports.FSEVENT_MOVED = 'moved';\nexports.FSEVENT_CLONED = 'cloned';\nexports.FSEVENT_UNKNOWN = 'unknown';\nexports.FSEVENT_FLAG_MUST_SCAN_SUBDIRS = 1;\nexports.FSEVENT_TYPE_FILE = 'file';\nexports.FSEVENT_TYPE_DIRECTORY = 'directory';\nexports.FSEVENT_TYPE_SYMLINK = 'symlink';\n\nexports.KEY_LISTENERS = 'listeners';\nexports.KEY_ERR = 'errHandlers';\nexports.KEY_RAW = 'rawEmitters';\nexports.HANDLER_KEYS = [exports.KEY_LISTENERS, exports.KEY_ERR, exports.KEY_RAW];\n\nexports.DOT_SLASH = `.${sep}`;\n\nexports.BACK_SLASH_RE = /\\\\/g;\nexports.DOUBLE_SLASH_RE = /\\/\\//;\nexports.SLASH_OR_BACK_SLASH_RE = /[/\\\\]/;\nexports.DOT_RE = /\\..*\\.(sw[px])$|~$|\\.subl.*\\.tmp/;\nexports.REPLACER_RE = /^\\.[/\\\\]/;\n\nexports.SLASH = '/';\nexports.SLASH_SLASH = '//';\nexports.BRACE_START = '{';\nexports.BANG = '!';\nexports.ONE_DOT = '.';\nexports.TWO_DOTS = '..';\nexports.STAR = '*';\nexports.GLOBSTAR = '**';\nexports.ROOT_GLOBSTAR = '/**/*';\nexports.SLASH_GLOBSTAR = '/**';\nexports.DIR_SUFFIX = 'Dir';\nexports.ANYMATCH_OPTS = {dot: true};\nexports.STRING_TYPE = 'string';\nexports.FUNCTION_TYPE = 'function';\nexports.EMPTY_STR = '';\nexports.EMPTY_FN = () => {};\nexports.IDENTITY_FN = val => val;\n\nexports.isWindows = platform === 'win32';\nexports.isMacos = platform === 'darwin';\nexports.isLinux = platform === 'linux';\nexports.isIBMi = os.type() === 'OS400';\n","'use strict';\n\nconst fs = require('fs');\nconst sysPath = require('path');\nconst { promisify } = require('util');\nconst isBinaryPath = require('is-binary-path');\nconst {\n isWindows,\n isLinux,\n EMPTY_FN,\n EMPTY_STR,\n KEY_LISTENERS,\n KEY_ERR,\n KEY_RAW,\n HANDLER_KEYS,\n EV_CHANGE,\n EV_ADD,\n EV_ADD_DIR,\n EV_ERROR,\n STR_DATA,\n STR_END,\n BRACE_START,\n STAR\n} = require('./constants');\n\nconst THROTTLE_MODE_WATCH = 'watch';\n\nconst open = promisify(fs.open);\nconst stat = promisify(fs.stat);\nconst lstat = promisify(fs.lstat);\nconst close = promisify(fs.close);\nconst fsrealpath = promisify(fs.realpath);\n\nconst statMethods = { lstat, stat };\n\n// TODO: emit errors properly. Example: EMFILE on Macos.\nconst foreach = (val, fn) => {\n if (val instanceof Set) {\n val.forEach(fn);\n } else {\n fn(val);\n }\n};\n\nconst addAndConvert = (main, prop, item) => {\n let container = main[prop];\n if (!(container instanceof Set)) {\n main[prop] = container = new Set([container]);\n }\n container.add(item);\n};\n\nconst clearItem = cont => key => {\n const set = cont[key];\n if (set instanceof Set) {\n set.clear();\n } else {\n delete cont[key];\n }\n};\n\nconst delFromSet = (main, prop, item) => {\n const container = main[prop];\n if (container instanceof Set) {\n container.delete(item);\n } else if (container === item) {\n delete main[prop];\n }\n};\n\nconst isEmptySet = (val) => val instanceof Set ? val.size === 0 : !val;\n\n/**\n * @typedef {String} Path\n */\n\n// fs_watch helpers\n\n// object to hold per-process fs_watch instances\n// (may be shared across chokidar FSWatcher instances)\n\n/**\n * @typedef {Object} FsWatchContainer\n * @property {Set} listeners\n * @property {Set} errHandlers\n * @property {Set} rawEmitters\n * @property {fs.FSWatcher=} watcher\n * @property {Boolean=} watcherUnusable\n */\n\n/**\n * @type {Map<String,FsWatchContainer>}\n */\nconst FsWatchInstances = new Map();\n\n/**\n * Instantiates the fs_watch interface\n * @param {String} path to be watched\n * @param {Object} options to be passed to fs_watch\n * @param {Function} listener main event handler\n * @param {Function} errHandler emits info about errors\n * @param {Function} emitRaw emits raw event data\n * @returns {fs.FSWatcher} new fsevents instance\n */\nfunction createFsWatchInstance(path, options, listener, errHandler, emitRaw) {\n const handleEvent = (rawEvent, evPath) => {\n listener(path);\n emitRaw(rawEvent, evPath, {watchedPath: path});\n\n // emit based on events occurring for files from a directory's watcher in\n // case the file's watcher misses it (and rely on throttling to de-dupe)\n if (evPath && path !== evPath) {\n fsWatchBroadcast(\n sysPath.resolve(path, evPath), KEY_LISTENERS, sysPath.join(path, evPath)\n );\n }\n };\n try {\n return fs.watch(path, options, handleEvent);\n } catch (error) {\n errHandler(error);\n }\n}\n\n/**\n * Helper for passing fs_watch event data to a collection of listeners\n * @param {Path} fullPath absolute path bound to fs_watch instance\n * @param {String} type listener type\n * @param {*=} val1 arguments to be passed to listeners\n * @param {*=} val2\n * @param {*=} val3\n */\nconst fsWatchBroadcast = (fullPath, type, val1, val2, val3) => {\n const cont = FsWatchInstances.get(fullPath);\n if (!cont) return;\n foreach(cont[type], (listener) => {\n listener(val1, val2, val3);\n });\n};\n\n/**\n * Instantiates the fs_watch interface or binds listeners\n * to an existing one covering the same file system entry\n * @param {String} path\n * @param {String} fullPath absolute path\n * @param {Object} options to be passed to fs_watch\n * @param {Object} handlers container for event listener functions\n */\nconst setFsWatchListener = (path, fullPath, options, handlers) => {\n const {listener, errHandler, rawEmitter} = handlers;\n let cont = FsWatchInstances.get(fullPath);\n\n /** @type {fs.FSWatcher=} */\n let watcher;\n if (!options.persistent) {\n watcher = createFsWatchInstance(\n path, options, listener, errHandler, rawEmitter\n );\n return watcher.close.bind(watcher);\n }\n if (cont) {\n addAndConvert(cont, KEY_LISTENERS, listener);\n addAndConvert(cont, KEY_ERR, errHandler);\n addAndConvert(cont, KEY_RAW, rawEmitter);\n } else {\n watcher = createFsWatchInstance(\n path,\n options,\n fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS),\n errHandler, // no need to use broadcast here\n fsWatchBroadcast.bind(null, fullPath, KEY_RAW)\n );\n if (!watcher) return;\n watcher.on(EV_ERROR, async (error) => {\n const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR);\n cont.watcherUnusable = true; // documented since Node 10.4.1\n // Workaround for https://github.com/joyent/node/issues/4337\n if (isWindows && error.code === 'EPERM') {\n try {\n const fd = await open(path, 'r');\n await close(fd);\n broadcastErr(error);\n } catch (err) {}\n } else {\n broadcastErr(error);\n }\n });\n cont = {\n listeners: listener,\n errHandlers: errHandler,\n rawEmitters: rawEmitter,\n watcher\n };\n FsWatchInstances.set(fullPath, cont);\n }\n // const index = cont.listeners.indexOf(listener);\n\n // removes this instance's listeners and closes the underlying fs_watch\n // instance if there are no more listeners left\n return () => {\n delFromSet(cont, KEY_LISTENERS, listener);\n delFromSet(cont, KEY_ERR, errHandler);\n delFromSet(cont, KEY_RAW, rawEmitter);\n if (isEmptySet(cont.listeners)) {\n // Check to protect against issue gh-730.\n // if (cont.watcherUnusable) {\n cont.watcher.close();\n // }\n FsWatchInstances.delete(fullPath);\n HANDLER_KEYS.forEach(clearItem(cont));\n cont.watcher = undefined;\n Object.freeze(cont);\n }\n };\n};\n\n// fs_watchFile helpers\n\n// object to hold per-process fs_watchFile instances\n// (may be shared across chokidar FSWatcher instances)\nconst FsWatchFileInstances = new Map();\n\n/**\n * Instantiates the fs_watchFile interface or binds listeners\n * to an existing one covering the same file system entry\n * @param {String} path to be watched\n * @param {String} fullPath absolute path\n * @param {Object} options options to be passed to fs_watchFile\n * @param {Object} handlers container for event listener functions\n * @returns {Function} closer\n */\nconst setFsWatchFileListener = (path, fullPath, options, handlers) => {\n const {listener, rawEmitter} = handlers;\n let cont = FsWatchFileInstances.get(fullPath);\n\n /* eslint-disable no-unused-vars, prefer-destructuring */\n let listeners = new Set();\n let rawEmitters = new Set();\n\n const copts = cont && cont.options;\n if (copts && (copts.persistent < options.persistent || copts.interval > options.interval)) {\n // \"Upgrade\" the watcher to persistence or a quicker interval.\n // This creates some unlikely edge case issues if the user mixes\n // settings in a very weird way, but solving for those cases\n // doesn't seem worthwhile for the added complexity.\n listeners = cont.listeners;\n rawEmitters = cont.rawEmitters;\n fs.unwatchFile(fullPath);\n cont = undefined;\n }\n\n /* eslint-enable no-unused-vars, prefer-destructuring */\n\n if (cont) {\n addAndConvert(cont, KEY_LISTENERS, listener);\n addAndConvert(cont, KEY_RAW, rawEmitter);\n } else {\n // TODO\n // listeners.add(listener);\n // rawEmitters.add(rawEmitter);\n cont = {\n listeners: listener,\n rawEmitters: rawEmitter,\n options,\n watcher: fs.watchFile(fullPath, options, (curr, prev) => {\n foreach(cont.rawEmitters, (rawEmitter) => {\n rawEmitter(EV_CHANGE, fullPath, {curr, prev});\n });\n const currmtime = curr.mtimeMs;\n if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) {\n foreach(cont.listeners, (listener) => listener(path, curr));\n }\n })\n };\n FsWatchFileInstances.set(fullPath, cont);\n }\n // const index = cont.listeners.indexOf(listener);\n\n // Removes this instance's listeners and closes the underlying fs_watchFile\n // instance if there are no more listeners left.\n return () => {\n delFromSet(cont, KEY_LISTENERS, listener);\n delFromSet(cont, KEY_RAW, rawEmitter);\n if (isEmptySet(cont.listeners)) {\n FsWatchFileInstances.delete(fullPath);\n fs.unwatchFile(fullPath);\n cont.options = cont.watcher = undefined;\n Object.freeze(cont);\n }\n };\n};\n\n/**\n * @mixin\n */\nclass NodeFsHandler {\n\n/**\n * @param {import(\"../index\").FSWatcher} fsW\n */\nconstructor(fsW) {\n this.fsw = fsW;\n this._boundHandleError = (error) => fsW._handleError(error);\n}\n\n/**\n * Watch file for changes with fs_watchFile or fs_watch.\n * @param {String} path to file or dir\n * @param {Function} listener on fs change\n * @returns {Function} closer for the watcher instance\n */\n_watchWithNodeFs(path, listener) {\n const opts = this.fsw.options;\n const directory = sysPath.dirname(path);\n const basename = sysPath.basename(path);\n const parent = this.fsw._getWatchedDir(directory);\n parent.add(basename);\n const absolutePath = sysPath.resolve(path);\n const options = {persistent: opts.persistent};\n if (!listener) listener = EMPTY_FN;\n\n let closer;\n if (opts.usePolling) {\n options.interval = opts.enableBinaryInterval && isBinaryPath(basename) ?\n opts.binaryInterval : opts.interval;\n closer = setFsWatchFileListener(path, absolutePath, options, {\n listener,\n rawEmitter: this.fsw._emitRaw\n });\n } else {\n closer = setFsWatchListener(path, absolutePath, options, {\n listener,\n errHandler: this._boundHandleError,\n rawEmitter: this.fsw._emitRaw\n });\n }\n return closer;\n}\n\n/**\n * Watch a file and emit add event if warranted.\n * @param {Path} file Path\n * @param {fs.Stats} stats result of fs_stat\n * @param {Boolean} initialAdd was the file added at watch instantiation?\n * @returns {Function} closer for the watcher instance\n */\n_handleFile(file, stats, initialAdd) {\n if (this.fsw.closed) {\n return;\n }\n const dirname = sysPath.dirname(file);\n const basename = sysPath.basename(file);\n const parent = this.fsw._getWatchedDir(dirname);\n // stats is always present\n let prevStats = stats;\n\n // if the file is already being watched, do nothing\n if (parent.has(basename)) return;\n\n const listener = async (path, newStats) => {\n if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5)) return;\n if (!newStats || newStats.mtimeMs === 0) {\n try {\n const newStats = await stat(file);\n if (this.fsw.closed) return;\n // Check that change event was not fired because of changed only accessTime.\n const at = newStats.atimeMs;\n const mt = newStats.mtimeMs;\n if (!at || at <= mt || mt !== prevStats.mtimeMs) {\n this.fsw._emit(EV_CHANGE, file, newStats);\n }\n if (isLinux && prevStats.ino !== newStats.ino) {\n this.fsw._closeFile(path)\n prevStats = newStats;\n this.fsw._addPathCloser(path, this._watchWithNodeFs(file, listener));\n } else {\n prevStats = newStats;\n }\n } catch (error) {\n // Fix issues where mtime is null but file is still present\n this.fsw._remove(dirname, basename);\n }\n // add is about to be emitted if file not already tracked in parent\n } else if (parent.has(basename)) {\n // Check that change event was not fired because of changed only accessTime.\n const at = newStats.atimeMs;\n const mt = newStats.mtimeMs;\n if (!at || at <= mt || mt !== prevStats.mtimeMs) {\n this.fsw._emit(EV_CHANGE, file, newStats);\n }\n prevStats = newStats;\n }\n }\n // kick off the watcher\n const closer = this._watchWithNodeFs(file, listener);\n\n // emit an add event if we're supposed to\n if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) {\n if (!this.fsw._throttle(EV_ADD, file, 0)) return;\n this.fsw._emit(EV_ADD, file, stats);\n }\n\n return closer;\n}\n\n/**\n * Handle symlinks encountered while reading a dir.\n * @param {Object} entry returned by readdirp\n * @param {String} directory path of dir being read\n * @param {String} path of this item\n * @param {String} item basename of this item\n * @returns {Promise<Boolean>} true if no more processing is needed for this entry.\n */\nasync _handleSymlink(entry, directory, path, item) {\n if (this.fsw.closed) {\n return;\n }\n const full = entry.fullPath;\n const dir = this.fsw._getWatchedDir(directory);\n\n if (!this.fsw.options.followSymlinks) {\n // watch symlink directly (don't follow) and detect changes\n this.fsw._incrReadyCount();\n\n let linkPath;\n try {\n linkPath = await fsrealpath(path);\n } catch (e) {\n this.fsw._emitReady();\n return true;\n }\n\n if (this.fsw.closed) return;\n if (dir.has(item)) {\n if (this.fsw._symlinkPaths.get(full) !== linkPath) {\n this.fsw._symlinkPaths.set(full, linkPath);\n this.fsw._emit(EV_CHANGE, path, entry.stats);\n }\n } else {\n dir.add(item);\n this.fsw._symlinkPaths.set(full, linkPath);\n this.fsw._emit(EV_ADD, path, entry.stats);\n }\n this.fsw._emitReady();\n return true;\n }\n\n // don't follow the same symlink more than once\n if (this.fsw._symlinkPaths.has(full)) {\n return true;\n }\n\n this.fsw._symlinkPaths.set(full, true);\n}\n\n_handleRead(directory, initialAdd, wh, target, dir, depth, throttler) {\n // Normalize the directory name on Windows\n directory = sysPath.join(directory, EMPTY_STR);\n\n if (!wh.hasGlob) {\n throttler = this.fsw._throttle('readdir', directory, 1000);\n if (!throttler) return;\n }\n\n const previous = this.fsw._getWatchedDir(wh.path);\n const current = new Set();\n\n let stream = this.fsw._readdirp(directory, {\n fileFilter: entry => wh.filterPath(entry),\n directoryFilter: entry => wh.filterDir(entry),\n depth: 0\n }).on(STR_DATA, async (entry) => {\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n const item = entry.path;\n let path = sysPath.join(directory, item);\n current.add(item);\n\n if (entry.stats.isSymbolicLink() && await this._handleSymlink(entry, directory, path, item)) {\n return;\n }\n\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n // Files that present in current directory snapshot\n // but absent in previous are added to watch list and\n // emit `add` event.\n if (item === target || !target && !previous.has(item)) {\n this.fsw._incrReadyCount();\n\n // ensure relativeness of path is preserved in case of watcher reuse\n path = sysPath.join(dir, sysPath.relative(dir, path));\n\n this._addToNodeFs(path, initialAdd, wh, depth + 1);\n }\n }).on(EV_ERROR, this._boundHandleError);\n\n return new Promise(resolve =>\n stream.once(STR_END, () => {\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n const wasThrottled = throttler ? throttler.clear() : false;\n\n resolve();\n\n // Files that absent in current directory snapshot\n // but present in previous emit `remove` event\n // and are removed from @watched[directory].\n previous.getChildren().filter((item) => {\n return item !== directory &&\n !current.has(item) &&\n // in case of intersecting globs;\n // a path may have been filtered out of this readdir, but\n // shouldn't be removed because it matches a different glob\n (!wh.hasGlob || wh.filterPath({\n fullPath: sysPath.resolve(directory, item)\n }));\n }).forEach((item) => {\n this.fsw._remove(directory, item);\n });\n\n stream = undefined;\n\n // one more time for any missed in case changes came in extremely quickly\n if (wasThrottled) this._handleRead(directory, false, wh, target, dir, depth, throttler);\n })\n );\n}\n\n/**\n * Read directory to add / remove files from `@watched` list and re-read it on change.\n * @param {String} dir fs path\n * @param {fs.Stats} stats\n * @param {Boolean} initialAdd\n * @param {Number} depth relative to user-supplied path\n * @param {String} target child path targeted for watch\n * @param {Object} wh Common watch helpers for this path\n * @param {String} realpath\n * @returns {Promise<Function>} closer for the watcher instance.\n */\nasync _handleDir(dir, stats, initialAdd, depth, target, wh, realpath) {\n const parentDir = this.fsw._getWatchedDir(sysPath.dirname(dir));\n const tracked = parentDir.has(sysPath.basename(dir));\n if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) {\n if (!wh.hasGlob || wh.globFilter(dir)) this.fsw._emit(EV_ADD_DIR, dir, stats);\n }\n\n // ensure dir is tracked (harmless if redundant)\n parentDir.add(sysPath.basename(dir));\n this.fsw._getWatchedDir(dir);\n let throttler;\n let closer;\n\n const oDepth = this.fsw.options.depth;\n if ((oDepth == null || depth <= oDepth) && !this.fsw._symlinkPaths.has(realpath)) {\n if (!target) {\n await this._handleRead(dir, initialAdd, wh, target, dir, depth, throttler);\n if (this.fsw.closed) return;\n }\n\n closer = this._watchWithNodeFs(dir, (dirPath, stats) => {\n // if current directory is removed, do nothing\n if (stats && stats.mtimeMs === 0) return;\n\n this._handleRead(dirPath, false, wh, target, dir, depth, throttler);\n });\n }\n return closer;\n}\n\n/**\n * Handle added file, directory, or glob pattern.\n * Delegates call to _handleFile / _handleDir after checks.\n * @param {String} path to file or ir\n * @param {Boolean} initialAdd was the file added at watch instantiation?\n * @param {Object} priorWh depth relative to user-supplied path\n * @param {Number} depth Child path actually targeted for watch\n * @param {String=} target Child path actually targeted for watch\n * @returns {Promise}\n */\nasync _addToNodeFs(path, initialAdd, priorWh, depth, target) {\n const ready = this.fsw._emitReady;\n if (this.fsw._isIgnored(path) || this.fsw.closed) {\n ready();\n return false;\n }\n\n const wh = this.fsw._getWatchHelpers(path, depth);\n if (!wh.hasGlob && priorWh) {\n wh.hasGlob = priorWh.hasGlob;\n wh.globFilter = priorWh.globFilter;\n wh.filterPath = entry => priorWh.filterPath(entry);\n wh.filterDir = entry => priorWh.filterDir(entry);\n }\n\n // evaluate what is at the path we're being asked to watch\n try {\n const stats = await statMethods[wh.statMethod](wh.watchPath);\n if (this.fsw.closed) return;\n if (this.fsw._isIgnored(wh.watchPath, stats)) {\n ready();\n return false;\n }\n\n const follow = this.fsw.options.followSymlinks && !path.includes(STAR) && !path.includes(BRACE_START);\n let closer;\n if (stats.isDirectory()) {\n const absPath = sysPath.resolve(path);\n const targetPath = follow ? await fsrealpath(path) : path;\n if (this.fsw.closed) return;\n closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath);\n if (this.fsw.closed) return;\n // preserve this symlink's target path\n if (absPath !== targetPath && targetPath !== undefined) {\n this.fsw._symlinkPaths.set(absPath, targetPath);\n }\n } else if (stats.isSymbolicLink()) {\n const targetPath = follow ? await fsrealpath(path) : path;\n if (this.fsw.closed) return;\n const parent = sysPath.dirname(wh.watchPath);\n this.fsw._getWatchedDir(parent).add(wh.watchPath);\n this.fsw._emit(EV_ADD, wh.watchPath, stats);\n closer = await this._handleDir(parent, stats, initialAdd, depth, path, wh, targetPath);\n if (this.fsw.closed) return;\n\n // preserve this symlink's target path\n if (targetPath !== undefined) {\n this.fsw._symlinkPaths.set(sysPath.resolve(path), targetPath);\n }\n } else {\n closer = this._handleFile(wh.watchPath, stats, initialAdd);\n }\n ready();\n\n this.fsw._addPathCloser(path, closer);\n return false;\n\n } catch (error) {\n if (this.fsw._handleError(error)) {\n ready();\n return path;\n }\n }\n}\n\n}\n\nmodule.exports = NodeFsHandler;\n","'use strict';\n\nconst fs = require('fs');\nconst sysPath = require('path');\nconst { promisify } = require('util');\n\nlet fsevents;\ntry {\n fsevents = require('fsevents');\n} catch (error) {\n if (process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR) console.error(error);\n}\n\nif (fsevents) {\n // TODO: real check\n const mtch = process.version.match(/v(\\d+)\\.(\\d+)/);\n if (mtch && mtch[1] && mtch[2]) {\n const maj = Number.parseInt(mtch[1], 10);\n const min = Number.parseInt(mtch[2], 10);\n if (maj === 8 && min < 16) {\n fsevents = undefined;\n }\n }\n}\n\nconst {\n EV_ADD,\n EV_CHANGE,\n EV_ADD_DIR,\n EV_UNLINK,\n EV_ERROR,\n STR_DATA,\n STR_END,\n FSEVENT_CREATED,\n FSEVENT_MODIFIED,\n FSEVENT_DELETED,\n FSEVENT_MOVED,\n // FSEVENT_CLONED,\n FSEVENT_UNKNOWN,\n FSEVENT_FLAG_MUST_SCAN_SUBDIRS,\n FSEVENT_TYPE_FILE,\n FSEVENT_TYPE_DIRECTORY,\n FSEVENT_TYPE_SYMLINK,\n\n ROOT_GLOBSTAR,\n DIR_SUFFIX,\n DOT_SLASH,\n FUNCTION_TYPE,\n EMPTY_FN,\n IDENTITY_FN\n} = require('./constants');\n\nconst Depth = (value) => isNaN(value) ? {} : {depth: value};\n\nconst stat = promisify(fs.stat);\nconst lstat = promisify(fs.lstat);\nconst realpath = promisify(fs.realpath);\n\nconst statMethods = { stat, lstat };\n\n/**\n * @typedef {String} Path\n */\n\n/**\n * @typedef {Object} FsEventsWatchContainer\n * @property {Set<Function>} listeners\n * @property {Function} rawEmitter\n * @property {{stop: Function}} watcher\n */\n\n// fsevents instance helper functions\n/**\n * Object to hold per-process fsevents instances (may be shared across chokidar FSWatcher instances)\n * @type {Map<Path,FsEventsWatchContainer>}\n */\nconst FSEventsWatchers = new Map();\n\n// Threshold of duplicate path prefixes at which to start\n// consolidating going forward\nconst consolidateThreshhold = 10;\n\nconst wrongEventFlags = new Set([\n 69888, 70400, 71424, 72704, 73472, 131328, 131840, 262912\n]);\n\n/**\n * Instantiates the fsevents interface\n * @param {Path} path path to be watched\n * @param {Function} callback called when fsevents is bound and ready\n * @returns {{stop: Function}} new fsevents instance\n */\nconst createFSEventsInstance = (path, callback) => {\n const stop = fsevents.watch(path, callback);\n return {stop};\n};\n\n/**\n * Instantiates the fsevents interface or binds listeners to an existing one covering\n * the same file tree.\n * @param {Path} path - to be watched\n * @param {Path} realPath - real path for symlinks\n * @param {Function} listener - called when fsevents emits events\n * @param {Function} rawEmitter - passes data to listeners of the 'raw' event\n * @returns {Function} closer\n */\nfunction setFSEventsListener(path, realPath, listener, rawEmitter) {\n let watchPath = sysPath.extname(realPath) ? sysPath.dirname(realPath) : realPath;\n\n const parentPath = sysPath.dirname(watchPath);\n let cont = FSEventsWatchers.get(watchPath);\n\n // If we've accumulated a substantial number of paths that\n // could have been consolidated by watching one directory\n // above the current one, create a watcher on the parent\n // path instead, so that we do consolidate going forward.\n if (couldConsolidate(parentPath)) {\n watchPath = parentPath;\n }\n\n const resolvedPath = sysPath.resolve(path);\n const hasSymlink = resolvedPath !== realPath;\n\n const filteredListener = (fullPath, flags, info) => {\n if (hasSymlink) fullPath = fullPath.replace(realPath, resolvedPath);\n if (\n fullPath === resolvedPath ||\n !fullPath.indexOf(resolvedPath + sysPath.sep)\n ) listener(fullPath, flags, info);\n };\n\n // check if there is already a watcher on a parent path\n // modifies `watchPath` to the parent path when it finds a match\n let watchedParent = false;\n for (const watchedPath of FSEventsWatchers.keys()) {\n if (realPath.indexOf(sysPath.resolve(watchedPath) + sysPath.sep) === 0) {\n watchPath = watchedPath;\n cont = FSEventsWatchers.get(watchPath);\n watchedParent = true;\n break;\n }\n }\n\n if (cont || watchedParent) {\n cont.listeners.add(filteredListener);\n } else {\n cont = {\n listeners: new Set([filteredListener]),\n rawEmitter,\n watcher: createFSEventsInstance(watchPath, (fullPath, flags) => {\n if (!cont.listeners.size) return;\n if (flags & FSEVENT_FLAG_MUST_SCAN_SUBDIRS) return;\n const info = fsevents.getInfo(fullPath, flags);\n cont.listeners.forEach(list => {\n list(fullPath, flags, info);\n });\n\n cont.rawEmitter(info.event, fullPath, info);\n })\n };\n FSEventsWatchers.set(watchPath, cont);\n }\n\n // removes this instance's listeners and closes the underlying fsevents\n // instance if there are no more listeners left\n return () => {\n const lst = cont.listeners;\n\n lst.delete(filteredListener);\n if (!lst.size) {\n FSEventsWatchers.delete(watchPath);\n if (cont.watcher) return cont.watcher.stop().then(() => {\n cont.rawEmitter = cont.watcher = undefined;\n Object.freeze(cont);\n });\n }\n };\n}\n\n// Decide whether or not we should start a new higher-level\n// parent watcher\nconst couldConsolidate = (path) => {\n let count = 0;\n for (const watchPath of FSEventsWatchers.keys()) {\n if (watchPath.indexOf(path) === 0) {\n count++;\n if (count >= consolidateThreshhold) {\n return true;\n }\n }\n }\n\n return false;\n};\n\n// returns boolean indicating whether fsevents can be used\nconst canUse = () => fsevents && FSEventsWatchers.size < 128;\n\n// determines subdirectory traversal levels from root to path\nconst calcDepth = (path, root) => {\n let i = 0;\n while (!path.indexOf(root) && (path = sysPath.dirname(path)) !== root) i++;\n return i;\n};\n\n// returns boolean indicating whether the fsevents' event info has the same type\n// as the one returned by fs.stat\nconst sameTypes = (info, stats) => (\n info.type === FSEVENT_TYPE_DIRECTORY && stats.isDirectory() ||\n info.type === FSEVENT_TYPE_SYMLINK && stats.isSymbolicLink() ||\n info.type === FSEVENT_TYPE_FILE && stats.isFile()\n)\n\n/**\n * @mixin\n */\nclass FsEventsHandler {\n\n/**\n * @param {import('../index').FSWatcher} fsw\n */\nconstructor(fsw) {\n this.fsw = fsw;\n}\ncheckIgnored(path, stats) {\n const ipaths = this.fsw._ignoredPaths;\n if (this.fsw._isIgnored(path, stats)) {\n ipaths.add(path);\n if (stats && stats.isDirectory()) {\n ipaths.add(path + ROOT_GLOBSTAR);\n }\n return true;\n }\n\n ipaths.delete(path);\n ipaths.delete(path + ROOT_GLOBSTAR);\n}\n\naddOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts) {\n const event = watchedDir.has(item) ? EV_CHANGE : EV_ADD;\n this.handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts);\n}\n\nasync checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts) {\n try {\n const stats = await stat(path)\n if (this.fsw.closed) return;\n if (sameTypes(info, stats)) {\n this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts);\n } else {\n this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts);\n }\n } catch (error) {\n if (error.code === 'EACCES') {\n this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts);\n } else {\n this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts);\n }\n }\n}\n\nhandleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts) {\n if (this.fsw.closed || this.checkIgnored(path)) return;\n\n if (event === EV_UNLINK) {\n const isDirectory = info.type === FSEVENT_TYPE_DIRECTORY\n // suppress unlink events on never before seen files\n if (isDirectory || watchedDir.has(item)) {\n this.fsw._remove(parent, item, isDirectory);\n }\n } else {\n if (event === EV_ADD) {\n // track new directories\n if (info.type === FSEVENT_TYPE_DIRECTORY) this.fsw._getWatchedDir(path);\n\n if (info.type === FSEVENT_TYPE_SYMLINK && opts.followSymlinks) {\n // push symlinks back to the top of the stack to get handled\n const curDepth = opts.depth === undefined ?\n undefined : calcDepth(fullPath, realPath) + 1;\n return this._addToFsEvents(path, false, true, curDepth);\n }\n\n // track new paths\n // (other than symlinks being followed, which will be tracked soon)\n this.fsw._getWatchedDir(parent).add(item);\n }\n /**\n * @type {'add'|'addDir'|'unlink'|'unlinkDir'}\n */\n const eventName = info.type === FSEVENT_TYPE_DIRECTORY ? event + DIR_SUFFIX : event;\n this.fsw._emit(eventName, path);\n if (eventName === EV_ADD_DIR) this._addToFsEvents(path, false, true);\n }\n}\n\n/**\n * Handle symlinks encountered during directory scan\n * @param {String} watchPath - file/dir path to be watched with fsevents\n * @param {String} realPath - real path (in case of symlinks)\n * @param {Function} transform - path transformer\n * @param {Function} globFilter - path filter in case a glob pattern was provided\n * @returns {Function} closer for the watcher instance\n*/\n_watchWithFsEvents(watchPath, realPath, transform, globFilter) {\n if (this.fsw.closed || this.fsw._isIgnored(watchPath)) return;\n const opts = this.fsw.options;\n const watchCallback = async (fullPath, flags, info) => {\n if (this.fsw.closed) return;\n if (\n opts.depth !== undefined &&\n calcDepth(fullPath, realPath) > opts.depth\n ) return;\n const path = transform(sysPath.join(\n watchPath, sysPath.relative(watchPath, fullPath)\n ));\n if (globFilter && !globFilter(path)) return;\n // ensure directories are tracked\n const parent = sysPath.dirname(path);\n const item = sysPath.basename(path);\n const watchedDir = this.fsw._getWatchedDir(\n info.type === FSEVENT_TYPE_DIRECTORY ? path : parent\n );\n\n // correct for wrong events emitted\n if (wrongEventFlags.has(flags) || info.event === FSEVENT_UNKNOWN) {\n if (typeof opts.ignored === FUNCTION_TYPE) {\n let stats;\n try {\n stats = await stat(path);\n } catch (error) {}\n if (this.fsw.closed) return;\n if (this.checkIgnored(path, stats)) return;\n if (sameTypes(info, stats)) {\n this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts);\n } else {\n this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts);\n }\n } else {\n this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts);\n }\n } else {\n switch (info.event) {\n case FSEVENT_CREATED:\n case FSEVENT_MODIFIED:\n return this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts);\n case FSEVENT_DELETED:\n case FSEVENT_MOVED:\n return this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts);\n }\n }\n };\n\n const closer = setFSEventsListener(\n watchPath,\n realPath,\n watchCallback,\n this.fsw._emitRaw\n );\n\n this.fsw._emitReady();\n return closer;\n}\n\n/**\n * Handle symlinks encountered during directory scan\n * @param {String} linkPath path to symlink\n * @param {String} fullPath absolute path to the symlink\n * @param {Function} transform pre-existing path transformer\n * @param {Number} curDepth level of subdirectories traversed to where symlink is\n * @returns {Promise<void>}\n */\nasync _handleFsEventsSymlink(linkPath, fullPath, transform, curDepth) {\n // don't follow the same symlink more than once\n if (this.fsw.closed || this.fsw._symlinkPaths.has(fullPath)) return;\n\n this.fsw._symlinkPaths.set(fullPath, true);\n this.fsw._incrReadyCount();\n\n try {\n const linkTarget = await realpath(linkPath);\n if (this.fsw.closed) return;\n if (this.fsw._isIgnored(linkTarget)) {\n return this.fsw._emitReady();\n }\n\n this.fsw._incrReadyCount();\n\n // add the linkTarget for watching with a wrapper for transform\n // that causes emitted paths to incorporate the link's path\n this._addToFsEvents(linkTarget || linkPath, (path) => {\n let aliasedPath = linkPath;\n if (linkTarget && linkTarget !== DOT_SLASH) {\n aliasedPath = path.replace(linkTarget, linkPath);\n } else if (path !== DOT_SLASH) {\n aliasedPath = sysPath.join(linkPath, path);\n }\n return transform(aliasedPath);\n }, false, curDepth);\n } catch(error) {\n if (this.fsw._handleError(error)) {\n return this.fsw._emitReady();\n }\n }\n}\n\n/**\n *\n * @param {Path} newPath\n * @param {fs.Stats} stats\n */\nemitAdd(newPath, stats, processPath, opts, forceAdd) {\n const pp = processPath(newPath);\n const isDir = stats.isDirectory();\n const dirObj = this.fsw._getWatchedDir(sysPath.dirname(pp));\n const base = sysPath.basename(pp);\n\n // ensure empty dirs get tracked\n if (isDir) this.fsw._getWatchedDir(pp);\n if (dirObj.has(base)) return;\n dirObj.add(base);\n\n if (!opts.ignoreInitial || forceAdd === true) {\n this.fsw._emit(isDir ? EV_ADD_DIR : EV_ADD, pp, stats);\n }\n}\n\ninitWatch(realPath, path, wh, processPath) {\n if (this.fsw.closed) return;\n const closer = this._watchWithFsEvents(\n wh.watchPath,\n sysPath.resolve(realPath || wh.watchPath),\n processPath,\n wh.globFilter\n );\n this.fsw._addPathCloser(path, closer);\n}\n\n/**\n * Handle added path with fsevents\n * @param {String} path file/dir path or glob pattern\n * @param {Function|Boolean=} transform converts working path to what the user expects\n * @param {Boolean=} forceAdd ensure add is emitted\n * @param {Number=} priorDepth Level of subdirectories already traversed.\n * @returns {Promise<void>}\n */\nasync _addToFsEvents(path, transform, forceAdd, priorDepth) {\n if (this.fsw.closed) {\n return;\n }\n const opts = this.fsw.options;\n const processPath = typeof transform === FUNCTION_TYPE ? transform : IDENTITY_FN;\n\n const wh = this.fsw._getWatchHelpers(path);\n\n // evaluate what is at the path we're being asked to watch\n try {\n const stats = await statMethods[wh.statMethod](wh.watchPath);\n if (this.fsw.closed) return;\n if (this.fsw._isIgnored(wh.watchPath, stats)) {\n throw null;\n }\n if (stats.isDirectory()) {\n // emit addDir unless this is a glob parent\n if (!wh.globFilter) this.emitAdd(processPath(path), stats, processPath, opts, forceAdd);\n\n // don't recurse further if it would exceed depth setting\n if (priorDepth && priorDepth > opts.depth) return;\n\n // scan the contents of the dir\n this.fsw._readdirp(wh.watchPath, {\n fileFilter: entry => wh.filterPath(entry),\n directoryFilter: entry => wh.filterDir(entry),\n ...Depth(opts.depth - (priorDepth || 0))\n }).on(STR_DATA, (entry) => {\n // need to check filterPath on dirs b/c filterDir is less restrictive\n if (this.fsw.closed) {\n return;\n }\n if (entry.stats.isDirectory() && !wh.filterPath(entry)) return;\n\n const joinedPath = sysPath.join(wh.watchPath, entry.path);\n const {fullPath} = entry;\n\n if (wh.followSymlinks && entry.stats.isSymbolicLink()) {\n // preserve the current depth here since it can't be derived from\n // real paths past the symlink\n const curDepth = opts.depth === undefined ?\n undefined : calcDepth(joinedPath, sysPath.resolve(wh.watchPath)) + 1;\n\n this._handleFsEventsSymlink(joinedPath, fullPath, processPath, curDepth);\n } else {\n this.emitAdd(joinedPath, entry.stats, processPath, opts, forceAdd);\n }\n }).on(EV_ERROR, EMPTY_FN).on(STR_END, () => {\n this.fsw._emitReady();\n });\n } else {\n this.emitAdd(wh.watchPath, stats, processPath, opts, forceAdd);\n this.fsw._emitReady();\n }\n } catch (error) {\n if (!error || this.fsw._handleError(error)) {\n // TODO: Strange thing: \"should not choke on an ignored watch path\" will be failed without 2 ready calls -__-\n this.fsw._emitReady();\n this.fsw._emitReady();\n }\n }\n\n if (opts.persistent && forceAdd !== true) {\n if (typeof transform === FUNCTION_TYPE) {\n // realpath has already been resolved\n this.initWatch(undefined, path, wh, processPath);\n } else {\n let realPath;\n try {\n realPath = await realpath(wh.watchPath);\n } catch (e) {}\n this.initWatch(realPath, path, wh, processPath);\n }\n }\n}\n\n}\n\nmodule.exports = FsEventsHandler;\nmodule.exports.canUse = canUse;\n","'use strict';\n\nconst { EventEmitter } = require('events');\nconst fs = require('fs');\nconst sysPath = require('path');\nconst { promisify } = require('util');\nconst readdirp = require('readdirp');\nconst anymatch = require('anymatch').default;\nconst globParent = require('glob-parent');\nconst isGlob = require('is-glob');\nconst braces = require('braces');\nconst normalizePath = require('normalize-path');\n\nconst NodeFsHandler = require('./lib/nodefs-handler');\nconst FsEventsHandler = require('./lib/fsevents-handler');\nconst {\n EV_ALL,\n EV_READY,\n EV_ADD,\n EV_CHANGE,\n EV_UNLINK,\n EV_ADD_DIR,\n EV_UNLINK_DIR,\n EV_RAW,\n EV_ERROR,\n\n STR_CLOSE,\n STR_END,\n\n BACK_SLASH_RE,\n DOUBLE_SLASH_RE,\n SLASH_OR_BACK_SLASH_RE,\n DOT_RE,\n REPLACER_RE,\n\n SLASH,\n SLASH_SLASH,\n BRACE_START,\n BANG,\n ONE_DOT,\n TWO_DOTS,\n GLOBSTAR,\n SLASH_GLOBSTAR,\n ANYMATCH_OPTS,\n STRING_TYPE,\n FUNCTION_TYPE,\n EMPTY_STR,\n EMPTY_FN,\n\n isWindows,\n isMacos,\n isIBMi\n} = require('./lib/constants');\n\nconst stat = promisify(fs.stat);\nconst readdir = promisify(fs.readdir);\n\n/**\n * @typedef {String} Path\n * @typedef {'all'|'add'|'addDir'|'change'|'unlink'|'unlinkDir'|'raw'|'error'|'ready'} EventName\n * @typedef {'readdir'|'watch'|'add'|'remove'|'change'} ThrottleType\n */\n\n/**\n *\n * @typedef {Object} WatchHelpers\n * @property {Boolean} followSymlinks\n * @property {'stat'|'lstat'} statMethod\n * @property {Path} path\n * @property {Path} watchPath\n * @property {Function} entryPath\n * @property {Boolean} hasGlob\n * @property {Object} globFilter\n * @property {Function} filterPath\n * @property {Function} filterDir\n */\n\nconst arrify = (value = []) => Array.isArray(value) ? value : [value];\nconst flatten = (list, result = []) => {\n list.forEach(item => {\n if (Array.isArray(item)) {\n flatten(item, result);\n } else {\n result.push(item);\n }\n });\n return result;\n};\n\nconst unifyPaths = (paths_) => {\n /**\n * @type {Array<String>}\n */\n const paths = flatten(arrify(paths_));\n if (!paths.every(p => typeof p === STRING_TYPE)) {\n throw new TypeError(`Non-string provided as watch path: ${paths}`);\n }\n return paths.map(normalizePathToUnix);\n};\n\n// If SLASH_SLASH occurs at the beginning of path, it is not replaced\n// because \"//StoragePC/DrivePool/Movies\" is a valid network path\nconst toUnix = (string) => {\n let str = string.replace(BACK_SLASH_RE, SLASH);\n let prepend = false;\n if (str.startsWith(SLASH_SLASH)) {\n prepend = true;\n }\n while (str.match(DOUBLE_SLASH_RE)) {\n str = str.replace(DOUBLE_SLASH_RE, SLASH);\n }\n if (prepend) {\n str = SLASH + str;\n }\n return str;\n};\n\n// Our version of upath.normalize\n// TODO: this is not equal to path-normalize module - investigate why\nconst normalizePathToUnix = (path) => toUnix(sysPath.normalize(toUnix(path)));\n\nconst normalizeIgnored = (cwd = EMPTY_STR) => (path) => {\n if (typeof path !== STRING_TYPE) return path;\n return normalizePathToUnix(sysPath.isAbsolute(path) ? path : sysPath.join(cwd, path));\n};\n\nconst getAbsolutePath = (path, cwd) => {\n if (sysPath.isAbsolute(path)) {\n return path;\n }\n if (path.startsWith(BANG)) {\n return BANG + sysPath.join(cwd, path.slice(1));\n }\n return sysPath.join(cwd, path);\n};\n\nconst undef = (opts, key) => opts[key] === undefined;\n\n/**\n * Directory entry.\n * @property {Path} path\n * @property {Set<Path>} items\n */\nclass DirEntry {\n /**\n * @param {Path} dir\n * @param {Function} removeWatcher\n */\n constructor(dir, removeWatcher) {\n this.path = dir;\n this._removeWatcher = removeWatcher;\n /** @type {Set<Path>} */\n this.items = new Set();\n }\n\n add(item) {\n const {items} = this;\n if (!items) return;\n if (item !== ONE_DOT && item !== TWO_DOTS) items.add(item);\n }\n\n async remove(item) {\n const {items} = this;\n if (!items) return;\n items.delete(item);\n if (items.size > 0) return;\n\n const dir = this.path;\n try {\n await readdir(dir);\n } catch (err) {\n if (this._removeWatcher) {\n this._removeWatcher(sysPath.dirname(dir), sysPath.basename(dir));\n }\n }\n }\n\n has(item) {\n const {items} = this;\n if (!items) return;\n return items.has(item);\n }\n\n /**\n * @returns {Array<String>}\n */\n getChildren() {\n const {items} = this;\n if (!items) return;\n return [...items.values()];\n }\n\n dispose() {\n this.items.clear();\n delete this.path;\n delete this._removeWatcher;\n delete this.items;\n Object.freeze(this);\n }\n}\n\nconst STAT_METHOD_F = 'stat';\nconst STAT_METHOD_L = 'lstat';\nclass WatchHelper {\n constructor(path, watchPath, follow, fsw) {\n this.fsw = fsw;\n this.path = path = path.replace(REPLACER_RE, EMPTY_STR);\n this.watchPath = watchPath;\n this.fullWatchPath = sysPath.resolve(watchPath);\n this.hasGlob = watchPath !== path;\n /** @type {object|boolean} */\n if (path === EMPTY_STR) this.hasGlob = false;\n this.globSymlink = this.hasGlob && follow ? undefined : false;\n this.globFilter = this.hasGlob ? anymatch(path, undefined, ANYMATCH_OPTS) : false;\n this.dirParts = this.getDirParts(path);\n this.dirParts.forEach((parts) => {\n if (parts.length > 1) parts.pop();\n });\n this.followSymlinks = follow;\n this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L;\n }\n\n checkGlobSymlink(entry) {\n // only need to resolve once\n // first entry should always have entry.parentDir === EMPTY_STR\n if (this.globSymlink === undefined) {\n this.globSymlink = entry.fullParentDir === this.fullWatchPath ?\n false : {realPath: entry.fullParentDir, linkPath: this.fullWatchPath};\n }\n\n if (this.globSymlink) {\n return entry.fullPath.replace(this.globSymlink.realPath, this.globSymlink.linkPath);\n }\n\n return entry.fullPath;\n }\n\n entryPath(entry) {\n return sysPath.join(this.watchPath,\n sysPath.relative(this.watchPath, this.checkGlobSymlink(entry))\n );\n }\n\n filterPath(entry) {\n const {stats} = entry;\n if (stats && stats.isSymbolicLink()) return this.filterDir(entry);\n const resolvedPath = this.entryPath(entry);\n const matchesGlob = this.hasGlob && typeof this.globFilter === FUNCTION_TYPE ?\n this.globFilter(resolvedPath) : true;\n return matchesGlob &&\n this.fsw._isntIgnored(resolvedPath, stats) &&\n this.fsw._hasReadPermissions(stats);\n }\n\n getDirParts(path) {\n if (!this.hasGlob) return [];\n const parts = [];\n const expandedPath = path.includes(BRACE_START) ? braces.expand(path) : [path];\n expandedPath.forEach((path) => {\n parts.push(sysPath.relative(this.watchPath, path).split(SLASH_OR_BACK_SLASH_RE));\n });\n return parts;\n }\n\n filterDir(entry) {\n if (this.hasGlob) {\n const entryParts = this.getDirParts(this.checkGlobSymlink(entry));\n let globstar = false;\n this.unmatchedGlob = !this.dirParts.some((parts) => {\n return parts.every((part, i) => {\n if (part === GLOBSTAR) globstar = true;\n return globstar || !entryParts[0][i] || anymatch(part, entryParts[0][i], ANYMATCH_OPTS);\n });\n });\n }\n return !this.unmatchedGlob && this.fsw._isntIgnored(this.entryPath(entry), entry.stats);\n }\n}\n\n/**\n * Watches files & directories for changes. Emitted events:\n * `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error`\n *\n * new FSWatcher()\n * .add(directories)\n * .on('add', path => log('File', path, 'was added'))\n */\nclass FSWatcher extends EventEmitter {\n// Not indenting methods for history sake; for now.\nconstructor(_opts) {\n super();\n\n const opts = {};\n if (_opts) Object.assign(opts, _opts); // for frozen objects\n\n /** @type {Map<String, DirEntry>} */\n this._watched = new Map();\n /** @type {Map<String, Array>} */\n this._closers = new Map();\n /** @type {Set<String>} */\n this._ignoredPaths = new Set();\n\n /** @type {Map<ThrottleType, Map>} */\n this._throttled = new Map();\n\n /** @type {Map<Path, String|Boolean>} */\n this._symlinkPaths = new Map();\n\n this._streams = new Set();\n this.closed = false;\n\n // Set up default options.\n if (undef(opts, 'persistent')) opts.persistent = true;\n if (undef(opts, 'ignoreInitial')) opts.ignoreInitial = false;\n if (undef(opts, 'ignorePermissionErrors')) opts.ignorePermissionErrors = false;\n if (undef(opts, 'interval')) opts.interval = 100;\n if (undef(opts, 'binaryInterval')) opts.binaryInterval = 300;\n if (undef(opts, 'disableGlobbing')) opts.disableGlobbing = false;\n opts.enableBinaryInterval = opts.binaryInterval !== opts.interval;\n\n // Enable fsevents on OS X when polling isn't explicitly enabled.\n if (undef(opts, 'useFsEvents')) opts.useFsEvents = !opts.usePolling;\n\n // If we can't use fsevents, ensure the options reflect it's disabled.\n const canUseFsEvents = FsEventsHandler.canUse();\n if (!canUseFsEvents) opts.useFsEvents = false;\n\n // Use polling on Mac if not using fsevents.\n // Other platforms use non-polling fs_watch.\n if (undef(opts, 'usePolling') && !opts.useFsEvents) {\n opts.usePolling = isMacos;\n }\n\n // Always default to polling on IBM i because fs.watch() is not available on IBM i.\n if(isIBMi) {\n opts.usePolling = true;\n }\n\n // Global override (useful for end-developers that need to force polling for all\n // instances of chokidar, regardless of usage/dependency depth)\n const envPoll = process.env.CHOKIDAR_USEPOLLING;\n if (envPoll !== undefined) {\n const envLower = envPoll.toLowerCase();\n\n if (envLower === 'false' || envLower === '0') {\n opts.usePolling = false;\n } else if (envLower === 'true' || envLower === '1') {\n opts.usePolling = true;\n } else {\n opts.usePolling = !!envLower;\n }\n }\n const envInterval = process.env.CHOKIDAR_INTERVAL;\n if (envInterval) {\n opts.interval = Number.parseInt(envInterval, 10);\n }\n\n // Editor atomic write normalization enabled by default with fs.watch\n if (undef(opts, 'atomic')) opts.atomic = !opts.usePolling && !opts.useFsEvents;\n if (opts.atomic) this._pendingUnlinks = new Map();\n\n if (undef(opts, 'followSymlinks')) opts.followSymlinks = true;\n\n if (undef(opts, 'awaitWriteFinish')) opts.awaitWriteFinish = false;\n if (opts.awaitWriteFinish === true) opts.awaitWriteFinish = {};\n const awf = opts.awaitWriteFinish;\n if (awf) {\n if (!awf.stabilityThreshold) awf.stabilityThreshold = 2000;\n if (!awf.pollInterval) awf.pollInterval = 100;\n this._pendingWrites = new Map();\n }\n if (opts.ignored) opts.ignored = arrify(opts.ignored);\n\n let readyCalls = 0;\n this._emitReady = () => {\n readyCalls++;\n if (readyCalls >= this._readyCount) {\n this._emitReady = EMPTY_FN;\n this._readyEmitted = true;\n // use process.nextTick to allow time for listener to be bound\n process.nextTick(() => this.emit(EV_READY));\n }\n };\n this._emitRaw = (...args) => this.emit(EV_RAW, ...args);\n this._readyEmitted = false;\n this.options = opts;\n\n // Initialize with proper watcher.\n if (opts.useFsEvents) {\n this._fsEventsHandler = new FsEventsHandler(this);\n } else {\n this._nodeFsHandler = new NodeFsHandler(this);\n }\n\n // You’re frozen when your heart’s not open.\n Object.freeze(opts);\n}\n\n// Public methods\n\n/**\n * Adds paths to be watched on an existing FSWatcher instance\n * @param {Path|Array<Path>} paths_\n * @param {String=} _origAdd private; for handling non-existent paths to be watched\n * @param {Boolean=} _internal private; indicates a non-user add\n * @returns {FSWatcher} for chaining\n */\nadd(paths_, _origAdd, _internal) {\n const {cwd, disableGlobbing} = this.options;\n this.closed = false;\n let paths = unifyPaths(paths_);\n if (cwd) {\n paths = paths.map((path) => {\n const absPath = getAbsolutePath(path, cwd);\n\n // Check `path` instead of `absPath` because the cwd portion can't be a glob\n if (disableGlobbing || !isGlob(path)) {\n return absPath;\n }\n return normalizePath(absPath);\n });\n }\n\n // set aside negated glob strings\n paths = paths.filter((path) => {\n if (path.startsWith(BANG)) {\n this._ignoredPaths.add(path.slice(1));\n return false;\n }\n\n // if a path is being added that was previously ignored, stop ignoring it\n this._ignoredPaths.delete(path);\n this._ignoredPaths.delete(path + SLASH_GLOBSTAR);\n\n // reset the cached userIgnored anymatch fn\n // to make ignoredPaths changes effective\n this._userIgnored = undefined;\n\n return true;\n });\n\n if (this.options.useFsEvents && this._fsEventsHandler) {\n if (!this._readyCount) this._readyCount = paths.length;\n if (this.options.persistent) this._readyCount += paths.length;\n paths.forEach((path) => this._fsEventsHandler._addToFsEvents(path));\n } else {\n if (!this._readyCount) this._readyCount = 0;\n this._readyCount += paths.length;\n Promise.all(\n paths.map(async path => {\n const res = await this._nodeFsHandler._addToNodeFs(path, !_internal, 0, 0, _origAdd);\n if (res) this._emitReady();\n return res;\n })\n ).then(results => {\n if (this.closed) return;\n results.filter(item => item).forEach(item => {\n this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item));\n });\n });\n }\n\n return this;\n}\n\n/**\n * Close watchers or start ignoring events from specified paths.\n * @param {Path|Array<Path>} paths_ - string or array of strings, file/directory paths and/or globs\n * @returns {FSWatcher} for chaining\n*/\nunwatch(paths_) {\n if (this.closed) return this;\n const paths = unifyPaths(paths_);\n const {cwd} = this.options;\n\n paths.forEach((path) => {\n // convert to absolute path unless relative path already matches\n if (!sysPath.isAbsolute(path) && !this._closers.has(path)) {\n if (cwd) path = sysPath.join(cwd, path);\n path = sysPath.resolve(path);\n }\n\n this._closePath(path);\n\n this._ignoredPaths.add(path);\n if (this._watched.has(path)) {\n this._ignoredPaths.add(path + SLASH_GLOBSTAR);\n }\n\n // reset the cached userIgnored anymatch fn\n // to make ignoredPaths changes effective\n this._userIgnored = undefined;\n });\n\n return this;\n}\n\n/**\n * Close watchers and remove all listeners from watched paths.\n * @returns {Promise<void>}.\n*/\nclose() {\n if (this.closed) return this._closePromise;\n this.closed = true;\n\n // Memory management.\n this.removeAllListeners();\n const closers = [];\n this._closers.forEach(closerList => closerList.forEach(closer => {\n const promise = closer();\n if (promise instanceof Promise) closers.push(promise);\n }));\n this._streams.forEach(stream => stream.destroy());\n this._userIgnored = undefined;\n this._readyCount = 0;\n this._readyEmitted = false;\n this._watched.forEach(dirent => dirent.dispose());\n ['closers', 'watched', 'streams', 'symlinkPaths', 'throttled'].forEach(key => {\n this[`_${key}`].clear();\n });\n\n this._closePromise = closers.length ? Promise.all(closers).then(() => undefined) : Promise.resolve();\n return this._closePromise;\n}\n\n/**\n * Expose list of watched paths\n * @returns {Object} for chaining\n*/\ngetWatched() {\n const watchList = {};\n this._watched.forEach((entry, dir) => {\n const key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir;\n watchList[key || ONE_DOT] = entry.getChildren().sort();\n });\n return watchList;\n}\n\nemitWithAll(event, args) {\n this.emit(...args);\n if (event !== EV_ERROR) this.emit(EV_ALL, ...args);\n}\n\n// Common helpers\n// --------------\n\n/**\n * Normalize and emit events.\n * Calling _emit DOES NOT MEAN emit() would be called!\n * @param {EventName} event Type of event\n * @param {Path} path File or directory path\n * @param {*=} val1 arguments to be passed with event\n * @param {*=} val2\n * @param {*=} val3\n * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag\n */\nasync _emit(event, path, val1, val2, val3) {\n if (this.closed) return;\n\n const opts = this.options;\n if (isWindows) path = sysPath.normalize(path);\n if (opts.cwd) path = sysPath.relative(opts.cwd, path);\n /** @type Array<any> */\n const args = [event, path];\n if (val3 !== undefined) args.push(val1, val2, val3);\n else if (val2 !== undefined) args.push(val1, val2);\n else if (val1 !== undefined) args.push(val1);\n\n const awf = opts.awaitWriteFinish;\n let pw;\n if (awf && (pw = this._pendingWrites.get(path))) {\n pw.lastChange = new Date();\n return this;\n }\n\n if (opts.atomic) {\n if (event === EV_UNLINK) {\n this._pendingUnlinks.set(path, args);\n setTimeout(() => {\n this._pendingUnlinks.forEach((entry, path) => {\n this.emit(...entry);\n this.emit(EV_ALL, ...entry);\n this._pendingUnlinks.delete(path);\n });\n }, typeof opts.atomic === 'number' ? opts.atomic : 100);\n return this;\n }\n if (event === EV_ADD && this._pendingUnlinks.has(path)) {\n event = args[0] = EV_CHANGE;\n this._pendingUnlinks.delete(path);\n }\n }\n\n if (awf && (event === EV_ADD || event === EV_CHANGE) && this._readyEmitted) {\n const awfEmit = (err, stats) => {\n if (err) {\n event = args[0] = EV_ERROR;\n args[1] = err;\n this.emitWithAll(event, args);\n } else if (stats) {\n // if stats doesn't exist the file must have been deleted\n if (args.length > 2) {\n args[2] = stats;\n } else {\n args.push(stats);\n }\n this.emitWithAll(event, args);\n }\n };\n\n this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit);\n return this;\n }\n\n if (event === EV_CHANGE) {\n const isThrottled = !this._throttle(EV_CHANGE, path, 50);\n if (isThrottled) return this;\n }\n\n if (opts.alwaysStat && val1 === undefined &&\n (event === EV_ADD || event === EV_ADD_DIR || event === EV_CHANGE)\n ) {\n const fullPath = opts.cwd ? sysPath.join(opts.cwd, path) : path;\n let stats;\n try {\n stats = await stat(fullPath);\n } catch (err) {}\n // Suppress event when fs_stat fails, to avoid sending undefined 'stat'\n if (!stats || this.closed) return;\n args.push(stats);\n }\n this.emitWithAll(event, args);\n\n return this;\n}\n\n/**\n * Common handler for errors\n * @param {Error} error\n * @returns {Error|Boolean} The error if defined, otherwise the value of the FSWatcher instance's `closed` flag\n */\n_handleError(error) {\n const code = error && error.code;\n if (error && code !== 'ENOENT' && code !== 'ENOTDIR' &&\n (!this.options.ignorePermissionErrors || (code !== 'EPERM' && code !== 'EACCES'))\n ) {\n this.emit(EV_ERROR, error);\n }\n return error || this.closed;\n}\n\n/**\n * Helper utility for throttling\n * @param {ThrottleType} actionType type being throttled\n * @param {Path} path being acted upon\n * @param {Number} timeout duration of time to suppress duplicate actions\n * @returns {Object|false} tracking object or false if action should be suppressed\n */\n_throttle(actionType, path, timeout) {\n if (!this._throttled.has(actionType)) {\n this._throttled.set(actionType, new Map());\n }\n\n /** @type {Map<Path, Object>} */\n const action = this._throttled.get(actionType);\n /** @type {Object} */\n const actionPath = action.get(path);\n\n if (actionPath) {\n actionPath.count++;\n return false;\n }\n\n let timeoutObject;\n const clear = () => {\n const item = action.get(path);\n const count = item ? item.count : 0;\n action.delete(path);\n clearTimeout(timeoutObject);\n if (item) clearTimeout(item.timeoutObject);\n return count;\n };\n timeoutObject = setTimeout(clear, timeout);\n const thr = {timeoutObject, clear, count: 0};\n action.set(path, thr);\n return thr;\n}\n\n_incrReadyCount() {\n return this._readyCount++;\n}\n\n/**\n * Awaits write operation to finish.\n * Polls a newly created file for size variations. When files size does not change for 'threshold' milliseconds calls callback.\n * @param {Path} path being acted upon\n * @param {Number} threshold Time in milliseconds a file size must be fixed before acknowledging write OP is finished\n * @param {EventName} event\n * @param {Function} awfEmit Callback to be called when ready for event to be emitted.\n */\n_awaitWriteFinish(path, threshold, event, awfEmit) {\n let timeoutHandler;\n\n let fullPath = path;\n if (this.options.cwd && !sysPath.isAbsolute(path)) {\n fullPath = sysPath.join(this.options.cwd, path);\n }\n\n const now = new Date();\n\n const awaitWriteFinish = (prevStat) => {\n fs.stat(fullPath, (err, curStat) => {\n if (err || !this._pendingWrites.has(path)) {\n if (err && err.code !== 'ENOENT') awfEmit(err);\n return;\n }\n\n const now = Number(new Date());\n\n if (prevStat && curStat.size !== prevStat.size) {\n this._pendingWrites.get(path).lastChange = now;\n }\n const pw = this._pendingWrites.get(path);\n const df = now - pw.lastChange;\n\n if (df >= threshold) {\n this._pendingWrites.delete(path);\n awfEmit(undefined, curStat);\n } else {\n timeoutHandler = setTimeout(\n awaitWriteFinish,\n this.options.awaitWriteFinish.pollInterval,\n curStat\n );\n }\n });\n };\n\n if (!this._pendingWrites.has(path)) {\n this._pendingWrites.set(path, {\n lastChange: now,\n cancelWait: () => {\n this._pendingWrites.delete(path);\n clearTimeout(timeoutHandler);\n return event;\n }\n });\n timeoutHandler = setTimeout(\n awaitWriteFinish,\n this.options.awaitWriteFinish.pollInterval\n );\n }\n}\n\n_getGlobIgnored() {\n return [...this._ignoredPaths.values()];\n}\n\n/**\n * Determines whether user has asked to ignore this path.\n * @param {Path} path filepath or dir\n * @param {fs.Stats=} stats result of fs.stat\n * @returns {Boolean}\n */\n_isIgnored(path, stats) {\n if (this.options.atomic && DOT_RE.test(path)) return true;\n if (!this._userIgnored) {\n const {cwd} = this.options;\n const ign = this.options.ignored;\n\n const ignored = ign && ign.map(normalizeIgnored(cwd));\n const paths = arrify(ignored)\n .filter((path) => typeof path === STRING_TYPE && !isGlob(path))\n .map((path) => path + SLASH_GLOBSTAR);\n const list = this._getGlobIgnored().map(normalizeIgnored(cwd)).concat(ignored, paths);\n this._userIgnored = anymatch(list, undefined, ANYMATCH_OPTS);\n }\n\n return this._userIgnored([path, stats]);\n}\n\n_isntIgnored(path, stat) {\n return !this._isIgnored(path, stat);\n}\n\n/**\n * Provides a set of common helpers and properties relating to symlink and glob handling.\n * @param {Path} path file, directory, or glob pattern being watched\n * @param {Number=} depth at any depth > 0, this isn't a glob\n * @returns {WatchHelper} object containing helpers for this path\n */\n_getWatchHelpers(path, depth) {\n const watchPath = depth || this.options.disableGlobbing || !isGlob(path) ? path : globParent(path);\n const follow = this.options.followSymlinks;\n\n return new WatchHelper(path, watchPath, follow, this);\n}\n\n// Directory helpers\n// -----------------\n\n/**\n * Provides directory tracking objects\n * @param {String} directory path of the directory\n * @returns {DirEntry} the directory's tracking object\n */\n_getWatchedDir(directory) {\n if (!this._boundRemove) this._boundRemove = this._remove.bind(this);\n const dir = sysPath.resolve(directory);\n if (!this._watched.has(dir)) this._watched.set(dir, new DirEntry(dir, this._boundRemove));\n return this._watched.get(dir);\n}\n\n// File helpers\n// ------------\n\n/**\n * Check for read permissions.\n * Based on this answer on SO: https://stackoverflow.com/a/11781404/1358405\n * @param {fs.Stats} stats - object, result of fs_stat\n * @returns {Boolean} indicates whether the file can be read\n*/\n_hasReadPermissions(stats) {\n if (this.options.ignorePermissionErrors) return true;\n\n // stats.mode may be bigint\n const md = stats && Number.parseInt(stats.mode, 10);\n const st = md & 0o777;\n const it = Number.parseInt(st.toString(8)[0], 10);\n return Boolean(4 & it);\n}\n\n/**\n * Handles emitting unlink events for\n * files and directories, and via recursion, for\n * files and directories within directories that are unlinked\n * @param {String} directory within which the following item is located\n * @param {String} item base path of item/directory\n * @returns {void}\n*/\n_remove(directory, item, isDirectory) {\n // if what is being deleted is a directory, get that directory's paths\n // for recursive deleting and cleaning of watched object\n // if it is not a directory, nestedDirectoryChildren will be empty array\n const path = sysPath.join(directory, item);\n const fullPath = sysPath.resolve(path);\n isDirectory = isDirectory != null\n ? isDirectory\n : this._watched.has(path) || this._watched.has(fullPath);\n\n // prevent duplicate handling in case of arriving here nearly simultaneously\n // via multiple paths (such as _handleFile and _handleDir)\n if (!this._throttle('remove', path, 100)) return;\n\n // if the only watched file is removed, watch for its return\n if (!isDirectory && !this.options.useFsEvents && this._watched.size === 1) {\n this.add(directory, item, true);\n }\n\n // This will create a new entry in the watched object in either case\n // so we got to do the directory check beforehand\n const wp = this._getWatchedDir(path);\n const nestedDirectoryChildren = wp.getChildren();\n\n // Recursively remove children directories / files.\n nestedDirectoryChildren.forEach(nested => this._remove(path, nested));\n\n // Check if item was on the watched list and remove it\n const parent = this._getWatchedDir(directory);\n const wasTracked = parent.has(item);\n parent.remove(item);\n\n // Fixes issue #1042 -> Relative paths were detected and added as symlinks\n // (https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L612),\n // but never removed from the map in case the path was deleted.\n // This leads to an incorrect state if the path was recreated:\n // https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L553\n if (this._symlinkPaths.has(fullPath)) {\n this._symlinkPaths.delete(fullPath);\n }\n\n // If we wait for this file to be fully written, cancel the wait.\n let relPath = path;\n if (this.options.cwd) relPath = sysPath.relative(this.options.cwd, path);\n if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) {\n const event = this._pendingWrites.get(relPath).cancelWait();\n if (event === EV_ADD) return;\n }\n\n // The Entry will either be a directory that just got removed\n // or a bogus entry to a file, in either case we have to remove it\n this._watched.delete(path);\n this._watched.delete(fullPath);\n const eventName = isDirectory ? EV_UNLINK_DIR : EV_UNLINK;\n if (wasTracked && !this._isIgnored(path)) this._emit(eventName, path);\n\n // Avoid conflicts if we later create another file with the same name\n if (!this.options.useFsEvents) {\n this._closePath(path);\n }\n}\n\n/**\n * Closes all watchers for a path\n * @param {Path} path\n */\n_closePath(path) {\n this._closeFile(path)\n const dir = sysPath.dirname(path);\n this._getWatchedDir(dir).remove(sysPath.basename(path));\n}\n\n/**\n * Closes only file-specific watchers\n * @param {Path} path\n */\n_closeFile(path) {\n const closers = this._closers.get(path);\n if (!closers) return;\n closers.forEach(closer => closer());\n this._closers.delete(path);\n}\n\n/**\n *\n * @param {Path} path\n * @param {Function} closer\n */\n_addPathCloser(path, closer) {\n if (!closer) return;\n let list = this._closers.get(path);\n if (!list) {\n list = [];\n this._closers.set(path, list);\n }\n list.push(closer);\n}\n\n_readdirp(root, opts) {\n if (this.closed) return;\n const options = {type: EV_ALL, alwaysStat: true, lstat: true, ...opts};\n let stream = readdirp(root, options);\n this._streams.add(stream);\n stream.once(STR_CLOSE, () => {\n stream = undefined;\n });\n stream.once(STR_END, () => {\n if (stream) {\n this._streams.delete(stream);\n stream = undefined;\n }\n });\n return stream;\n}\n\n}\n\n// Export FSWatcher class\nexports.FSWatcher = FSWatcher;\n\n/**\n * Instantiates watcher with paths to be tracked.\n * @param {String|Array<String>} paths file/directory paths and/or globs\n * @param {Object=} options chokidar opts\n * @returns an instance of FSWatcher for chaining.\n */\nconst watch = (paths, options) => {\n const watcher = new FSWatcher(options);\n watcher.add(paths);\n return watcher;\n};\n\nexports.watch = watch;\n","/**\n * Watch mode implementation for typegen command.\n *\n * Watches source files and regenerates prebuilt types on changes.\n * Uses debouncing to batch rapid file changes.\n *\n * @module\n */\n\nimport type { ResolvedSodaGqlConfig } from \"@soda-gql/config\";\nimport chokidar from \"chokidar\";\nimport { runTypegen } from \"../../typegen\";\n\nconst DEBOUNCE_MS = 150;\n\n/**\n * Options for running typegen in watch mode.\n */\nexport type TypegenWatchOptions = {\n /**\n * Resolved soda-gql configuration.\n */\n readonly config: ResolvedSodaGqlConfig;\n};\n\ntype WatchState = {\n isRunning: boolean;\n pendingRun: boolean;\n pendingPaths: Set<string>;\n generation: number;\n};\n\n/**\n * Execute a single regeneration cycle.\n */\nconst executeRegenerate = async (\n config: ResolvedSodaGqlConfig,\n state: WatchState,\n changedPaths: readonly string[],\n): Promise<void> => {\n // Prevent concurrent runs - accumulate paths for deferred execution\n if (state.isRunning) {\n state.pendingRun = true;\n for (const path of changedPaths) {\n state.pendingPaths.add(path);\n }\n return;\n }\n\n state.isRunning = true;\n const startTime = Date.now();\n\n // Clear console for fresh output\n console.clear();\n console.log(`[typegen] Regenerating... (gen ${state.generation + 1})`);\n\n if (changedPaths.length > 0) {\n const displayPaths = changedPaths.slice(0, 3).join(\", \");\n const overflow = changedPaths.length > 3 ? ` (+${changedPaths.length - 3} more)` : \"\";\n console.log(` Changed: ${displayPaths}${overflow}`);\n }\n\n // NOTE: This try-catch is intentionally used as a defensive boundary for the\n // long-running watch process. The primary error handling uses Result types from\n // runTypegen (properly handled via isOk/isErr). This catch is a last-resort\n // safety net for truly unexpected exceptions (V8 errors, memory issues, etc.)\n // that would otherwise crash the entire watch mode.\n try {\n const result = await runTypegen({\n config,\n });\n\n const elapsed = Date.now() - startTime;\n\n if (result.isOk()) {\n state.generation++;\n console.log(`[typegen] Done in ${elapsed}ms`);\n const skippedNote = result.value.skippedFragmentCount > 0 ? ` (${result.value.skippedFragmentCount} skipped)` : \"\";\n console.log(` Fragments: ${result.value.fragmentCount}${skippedNote}, Operations: ${result.value.operationCount}`);\n\n if (result.value.warnings.length > 0) {\n console.log(` Warnings: ${result.value.warnings.length}`);\n for (const warning of result.value.warnings.slice(0, 3)) {\n console.log(` - ${warning}`);\n }\n if (result.value.warnings.length > 3) {\n console.log(` ... and ${result.value.warnings.length - 3} more`);\n }\n }\n } else {\n const error = result.error;\n console.error(`[typegen] Error [${error.code}]: ${error.message}`);\n\n if (error.code === \"TYPEGEN_CODEGEN_REQUIRED\") {\n console.error(\" Hint: Run 'soda-gql codegen' first.\");\n }\n }\n } catch (error) {\n console.error(\"[typegen] Unexpected error:\", error);\n } finally {\n state.isRunning = false;\n\n // If changes came in during run, trigger another run with accumulated paths\n if (state.pendingRun) {\n state.pendingRun = false;\n const pathsToReport = [...state.pendingPaths];\n state.pendingPaths.clear();\n setTimeout(() => executeRegenerate(config, state, pathsToReport), 50);\n }\n }\n\n console.log(\"\\n[typegen] Watching for changes... (Ctrl+C to stop)\");\n};\n\n/**\n * Create a debounced regenerate function that accumulates changed paths.\n */\nconst createDebouncedRegenerate = (config: ResolvedSodaGqlConfig, state: WatchState): ((paths: readonly string[]) => void) => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n let changedPaths = new Set<string>();\n\n return (paths: readonly string[]) => {\n // Accumulate changed paths\n for (const path of paths) {\n changedPaths.add(path);\n }\n\n // Clear existing timeout\n if (timeout) {\n clearTimeout(timeout);\n }\n\n // Set new timeout\n timeout = setTimeout(() => {\n const pathsToReport = [...changedPaths];\n changedPaths = new Set();\n timeout = null;\n\n executeRegenerate(config, state, pathsToReport);\n }, DEBOUNCE_MS);\n };\n};\n\n/**\n * Run typegen in watch mode.\n *\n * This function watches source files and regenerates prebuilt types on changes.\n * It runs indefinitely until SIGINT/SIGTERM is received.\n *\n * @param options - Watch options including config\n * @returns Never returns (runs indefinitely)\n */\nexport const runTypegenWatch = async (options: TypegenWatchOptions): Promise<never> => {\n const { config } = options;\n\n const state: WatchState = {\n isRunning: false,\n pendingRun: false,\n pendingPaths: new Set(),\n generation: 0,\n };\n\n // Create debounced regenerate function\n const regenerate = createDebouncedRegenerate(config, state);\n\n // Setup watcher\n const watcher = chokidar.watch([...config.include], {\n ignored: [...config.exclude],\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 100,\n pollInterval: 50,\n },\n });\n\n // Setup SIGINT/SIGTERM handler for graceful shutdown\n const cleanup = () => {\n console.log(\"\\n[typegen] Shutting down...\");\n watcher.close();\n process.exit(0);\n };\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n // Wire up file events\n watcher.on(\"add\", (path) => regenerate([path]));\n watcher.on(\"change\", (path) => regenerate([path]));\n watcher.on(\"unlink\", (path) => regenerate([path]));\n watcher.on(\"error\", (error) => {\n console.error(\"[typegen] Watcher error:\", error);\n });\n\n // Initial run\n console.log(\"[typegen] Starting watch mode...\");\n console.log(` Watching: ${config.include.join(\", \")}`);\n console.log(\"\");\n\n await executeRegenerate(config, state, []);\n\n // Keep alive indefinitely\n await new Promise(() => {});\n throw new Error(\"unreachable\");\n};\n","import { loadConfig } from \"@soda-gql/config\";\nimport { err, ok } from \"neverthrow\";\nimport { runTypegen } from \"../../typegen\";\nimport { type CliResult, cliErrors } from \"../errors\";\nimport { TypegenArgsSchema } from \"../schemas/args\";\nimport type { CommandResult, CommandSuccess } from \"../types\";\nimport { parseArgs } from \"../utils/parse-args\";\nimport { runTypegenWatch } from \"./typegen-watch\";\n\ntype ParsedCommand = { kind: \"generate\"; configPath?: string } | { kind: \"watch\"; configPath?: string };\n\nconst TYPEGEN_ALIASES = { w: \"watch\" };\n\nconst parseTypegenArgs = (argv: readonly string[]): CliResult<ParsedCommand> => {\n const parsed = parseArgs([...argv], TypegenArgsSchema, TYPEGEN_ALIASES);\n\n if (!parsed.isOk()) {\n return err(cliErrors.argsInvalid(\"typegen\", parsed.error));\n }\n\n const isWatch = parsed.value.watch;\n\n if (isWatch) {\n return ok({\n kind: \"watch\",\n configPath: parsed.value.config,\n });\n }\n\n return ok({\n kind: \"generate\",\n configPath: parsed.value.config,\n });\n};\n\ntype TypegenSuccessData = {\n prebuiltTypesPath: string;\n fragmentCount: number;\n operationCount: number;\n skippedFragmentCount: number;\n warnings: readonly string[];\n};\n\nconst formatSuccess = (data: TypegenSuccessData): string => {\n const lines: string[] = [];\n lines.push(`Generated prebuilt types:`);\n lines.push(` Types: ${data.prebuiltTypesPath}`);\n const skippedNote = data.skippedFragmentCount > 0 ? ` (${data.skippedFragmentCount} skipped)` : \"\";\n lines.push(` Fragments: ${data.fragmentCount}${skippedNote}, Operations: ${data.operationCount}`);\n\n if (data.warnings.length > 0) {\n lines.push(\"\");\n lines.push(\"Warnings:\");\n for (const warning of data.warnings) {\n lines.push(` ${warning}`);\n }\n }\n\n return lines.join(\"\\n\");\n};\n\nconst TYPEGEN_HELP = `Usage: soda-gql typegen [options]\n\nGenerate prebuilt types from source code.\n\nOptions:\n --config <path> Path to soda-gql.config.ts\n --watch, -w Watch for file changes and regenerate\n --help, -h Show this help message\n\nExamples:\n soda-gql typegen\n soda-gql typegen --watch\n soda-gql typegen --config ./soda-gql.config.ts\n\nNote: Run 'soda-gql codegen' first to generate the graphql-system module.\n`;\n\ntype TypegenCommandResult = CommandResult<CommandSuccess & { data?: TypegenSuccessData }>;\n\nexport const typegenCommand = async (argv: readonly string[]): Promise<TypegenCommandResult> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n return ok({ message: TYPEGEN_HELP });\n }\n\n const parsed = parseTypegenArgs(argv);\n\n if (parsed.isErr()) {\n return err(parsed.error);\n }\n\n const command = parsed.value;\n\n // Load config from @soda-gql/config\n const configResult = loadConfig(command.configPath);\n if (configResult.isErr()) {\n return err(cliErrors.fromConfig(configResult.error));\n }\n\n const config = configResult.value;\n\n // Watch mode - runs indefinitely\n if (command.kind === \"watch\") {\n await runTypegenWatch({ config });\n return ok({ message: \"\" }); // unreachable\n }\n\n // Run typegen (single run)\n const result = await runTypegen({\n config,\n });\n\n if (result.isErr()) {\n // Handle typegen-specific errors\n const error = result.error;\n if (error.code === \"TYPEGEN_CODEGEN_REQUIRED\") {\n return err(cliErrors.argsInvalid(\"typegen\", `${error.message}\\nRun 'soda-gql codegen' first.`));\n }\n return err(cliErrors.fromTypegen(error));\n }\n\n const data: TypegenSuccessData = {\n prebuiltTypesPath: result.value.prebuiltTypesPath,\n fragmentCount: result.value.fragmentCount,\n operationCount: result.value.operationCount,\n skippedFragmentCount: result.value.skippedFragmentCount,\n warnings: result.value.warnings,\n };\n\n return ok({ message: formatSuccess(data), data });\n};\n","import { formatBuilderErrorForCLI } from \"@soda-gql/builder\";\nimport type { CliError, CliErrorCode } from \"../errors\";\nimport type { OutputFormat } from \"../types\";\n\nexport type { OutputFormat } from \"../types\";\n\n/**\n * CLI-specific error hints to help users fix issues.\n */\nconst cliErrorHints: Partial<Record<CliErrorCode, string>> = {\n CLI_ARGS_INVALID: \"Check command usage with --help\",\n CLI_UNKNOWN_COMMAND: \"Run 'soda-gql --help' for available commands\",\n CLI_UNKNOWN_SUBCOMMAND: \"Run the parent command with --help for available subcommands\",\n CLI_FILE_EXISTS: \"Use --force flag to overwrite existing files\",\n CLI_FILE_NOT_FOUND: \"Verify the file path exists\",\n CLI_WRITE_FAILED: \"Check write permissions and disk space\",\n CLI_READ_FAILED: \"Check file permissions and verify the file is not locked\",\n CLI_NO_PATTERNS: \"Provide file patterns or create soda-gql.config.ts\",\n CLI_FORMATTER_NOT_INSTALLED: \"Formatter failed to load from @soda-gql/tools\",\n CLI_PARSE_ERROR: \"Check the file for syntax errors\",\n CLI_FORMAT_ERROR: \"Verify the file contains valid soda-gql code\",\n CLI_UNEXPECTED: \"This is an unexpected error. Please report at https://github.com/soda-gql/soda-gql/issues\",\n};\n\n/**\n * Codegen-specific error hints.\n */\nconst codegenErrorHints: Record<string, string> = {\n SCHEMA_NOT_FOUND: \"Verify the schema path in soda-gql.config.ts\",\n SCHEMA_INVALID: \"Check your GraphQL schema for syntax errors\",\n INJECT_MODULE_NOT_FOUND: \"Run: soda-gql codegen --emit-inject-template <path>\",\n INJECT_MODULE_REQUIRED: \"Add inject configuration to your schema in soda-gql.config.ts\",\n INJECT_TEMPLATE_EXISTS: \"Delete the existing file to regenerate, or use a different path\",\n EMIT_FAILED: \"Check write permissions and that the output directory exists\",\n INJECT_TEMPLATE_FAILED: \"Check write permissions for the output path\",\n};\n\n/**\n * Config-specific error hints.\n */\nconst configErrorHints: Record<string, string> = {\n CONFIG_NOT_FOUND: \"Create a soda-gql.config.ts file in your project root\",\n CONFIG_LOAD_FAILED: \"Check your configuration file for syntax errors\",\n CONFIG_VALIDATION_FAILED: \"Verify your configuration matches the expected schema\",\n CONFIG_INVALID_PATH: \"Verify the path in your configuration exists\",\n};\n\n/**\n * Artifact-specific error hints.\n */\nconst artifactErrorHints: Record<string, string> = {\n ARTIFACT_NOT_FOUND: \"Verify the artifact file path exists\",\n ARTIFACT_PARSE_ERROR: \"Check that the artifact file is valid JSON\",\n ARTIFACT_VALIDATION_ERROR: \"Verify the artifact was built with a compatible version of soda-gql\",\n};\n\n/**\n * Typegen-specific error hints.\n */\nconst typegenErrorHints: Record<string, string> = {\n TYPEGEN_CODEGEN_REQUIRED: \"Run 'soda-gql codegen' before running typegen\",\n TYPEGEN_SCHEMA_LOAD_FAILED: \"Verify the generated CJS bundle is valid\",\n TYPEGEN_BUILD_FAILED: \"Check for errors in your source files\",\n};\n\n/**\n * Get hint for any error type.\n */\nconst getErrorHint = (error: CliError): string | undefined => {\n if (error.category === \"cli\") {\n return cliErrorHints[error.code];\n }\n if (error.category === \"codegen\") {\n return codegenErrorHints[error.error.code];\n }\n if (error.category === \"config\") {\n return configErrorHints[error.error.code];\n }\n if (error.category === \"artifact\") {\n return artifactErrorHints[error.error.code];\n }\n if (error.category === \"typegen\") {\n return typegenErrorHints[error.error.code];\n }\n // Builder errors use their own hints via formatBuilderErrorForCLI\n return undefined;\n};\n\n/**\n * Format CliError to human-readable string with hints.\n */\nexport const formatCliErrorHuman = (error: CliError): string => {\n // Delegate to builder's formatter for builder errors\n if (error.category === \"builder\") {\n return formatBuilderErrorForCLI(error.error);\n }\n\n const lines: string[] = [];\n\n if (error.category === \"codegen\") {\n const codegenError = error.error;\n lines.push(`Error [${codegenError.code}]: ${codegenError.message}`);\n\n // Add context based on error type\n if (\"schemaPath\" in codegenError) {\n lines.push(` Schema: ${codegenError.schemaPath}`);\n }\n if (\"outPath\" in codegenError && codegenError.outPath) {\n lines.push(` Output: ${codegenError.outPath}`);\n }\n if (\"injectPath\" in codegenError) {\n lines.push(` Inject: ${codegenError.injectPath}`);\n }\n } else if (error.category === \"config\") {\n const configError = error.error;\n lines.push(`Error [${configError.code}]: ${configError.message}`);\n if (configError.filePath) {\n lines.push(` Config: ${configError.filePath}`);\n }\n } else if (error.category === \"artifact\") {\n const artifactError = error.error;\n lines.push(`Error [${artifactError.code}]: ${artifactError.message}`);\n if (artifactError.filePath) {\n lines.push(` Artifact: ${artifactError.filePath}`);\n }\n } else if (error.category === \"typegen\") {\n const typegenError = error.error;\n lines.push(`Error [${typegenError.code}]: ${typegenError.message}`);\n } else {\n // CLI errors\n lines.push(`Error [${error.code}]: ${error.message}`);\n\n if (\"filePath\" in error && error.filePath) {\n lines.push(` File: ${error.filePath}`);\n }\n if (\"command\" in error && error.code !== \"CLI_UNKNOWN_COMMAND\") {\n lines.push(` Command: ${error.command}`);\n }\n if (\"parent\" in error) {\n lines.push(` Parent: ${error.parent}`);\n }\n }\n\n const hint = getErrorHint(error);\n if (hint) {\n lines.push(\"\");\n lines.push(` Hint: ${hint}`);\n }\n\n return lines.join(\"\\n\");\n};\n\n/**\n * Format CliError to JSON string.\n */\nexport const formatCliErrorJson = (error: CliError): string => {\n if (error.category === \"cli\") {\n const { category: _category, ...rest } = error;\n return JSON.stringify({ error: rest }, null, 2);\n }\n return JSON.stringify({ error: error.error }, null, 2);\n};\n\n/**\n * Format CliError with output format preference.\n */\nexport const formatCliError = (error: CliError, format: OutputFormat = \"human\"): string => {\n return format === \"json\" ? formatCliErrorJson(error) : formatCliErrorHuman(error);\n};\n\n// ---- Legacy formatters (kept for backward compatibility) ----\n\nexport const formatters = {\n json: (data: unknown) => JSON.stringify(data, null, 2),\n human: (data: unknown) => {\n if (typeof data === \"string\") return data;\n if (data instanceof Error) return data.message;\n return JSON.stringify(data, null, 2);\n },\n} as const;\n\nexport const formatOutput = (data: unknown, format: OutputFormat = \"human\"): string => {\n return formatters[format](data);\n};\n\n/**\n * @deprecated Use formatCliError instead for CliError types.\n */\nexport const formatError = (error: unknown, format: OutputFormat = \"human\"): string => {\n if (format === \"json\") {\n return JSON.stringify(\n {\n error: error,\n },\n null,\n 2,\n );\n }\n return error instanceof Error ? error.message : String(error);\n};\n","import { err, ok } from \"neverthrow\";\nimport { artifactCommand } from \"./commands/artifact\";\nimport { codegenCommand } from \"./commands/codegen/index\";\nimport { doctorCommand } from \"./commands/doctor\";\nimport { formatCommand } from \"./commands/format\";\nimport { initCommand } from \"./commands/init\";\nimport { lspCommand } from \"./commands/lsp\";\nimport { typegenCommand } from \"./commands/typegen\";\nimport { cliErrors } from \"./errors\";\nimport type { CommandResult, CommandSuccess, OutputFormat } from \"./types\";\nimport { formatCliError } from \"./utils/format\";\n\nconst MAIN_HELP = `Usage: soda-gql <command> [options]\n\nCommands:\n init Initialize a new soda-gql project\n codegen Generate graphql-system runtime module\n typegen Generate prebuilt types from source code\n format Format soda-gql field selections\n artifact Manage soda-gql artifacts\n doctor Run diagnostic checks\n lsp Start the GraphQL language server\n\nRun 'soda-gql <command> --help' for more information on a specific command.\n`;\n\n/**\n * Parse output format from argv.\n * Returns \"json\" if --format=json or --json flag is present, otherwise \"human\".\n */\nconst getOutputFormat = (argv: readonly string[]): OutputFormat => {\n for (const arg of argv) {\n if (arg === \"--format=json\" || arg === \"--json\") {\n return \"json\";\n }\n if (arg === \"--format=human\") {\n return \"human\";\n }\n }\n return \"human\";\n};\n\ntype DispatchResult = CommandResult<CommandSuccess & { exitCode?: number }>;\n\nconst dispatch = async (argv: readonly string[]): Promise<DispatchResult> => {\n const [command, ...rest] = argv;\n\n if (!command || command === \"--help\" || command === \"-h\") {\n return ok({ message: MAIN_HELP });\n }\n\n if (command === \"init\") {\n return initCommand(rest);\n }\n\n if (command === \"codegen\") {\n return codegenCommand(rest);\n }\n\n if (command === \"typegen\") {\n return typegenCommand(rest);\n }\n\n if (command === \"format\") {\n const result = await formatCommand(rest);\n if (result.isOk()) {\n // Format command uses exit 1 for unformatted files in check mode or errors\n const exitCode = result.value.data?.hasFormattingIssues ? 1 : 0;\n return ok({ ...result.value, exitCode });\n }\n return err(result.error);\n }\n\n if (command === \"artifact\") {\n return artifactCommand(rest);\n }\n\n if (command === \"lsp\") {\n await lspCommand(rest);\n return ok({ message: \"\" }); // unreachable, lsp runs forever\n }\n\n if (command === \"doctor\") {\n const result = doctorCommand(rest);\n if (result.isOk()) {\n // Doctor uses exit 1 if issues found\n const exitCode = result.value.data?.issueCount ? 1 : 0;\n return ok({ ...result.value, exitCode });\n }\n return result;\n }\n\n return err(cliErrors.unknownCommand(command));\n};\n\n// Run CLI when executed directly\nconst main = async () => {\n const argv = process.argv.slice(2);\n const format = getOutputFormat(argv);\n\n const result = await dispatch(argv);\n\n if (result.isOk()) {\n process.stdout.write(`${result.value.message}\\n`);\n process.exitCode = result.value.exitCode ?? 0;\n } else {\n process.stderr.write(`${formatCliError(result.error, format)}\\n`);\n process.exitCode = 1;\n }\n};\n\nmain().catch((error) => {\n const unexpectedError = cliErrors.unexpected(error instanceof Error ? error.message : String(error), error);\n const format = getOutputFormat(process.argv.slice(2));\n process.stderr.write(`${formatCliError(unexpectedError, format)}\\n`);\n process.exitCode = 1;\n});\n\nexport { dispatch };\n"],"x_google_ignoreList":[4,5,6,7,8,9,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81],"mappings":"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AAU,OAAO,UAAU,EAAE,KAAK;AACvC,MAAI,UAAU,MAAM,MAAM,SAAS,GAAG;AACpC,UAAO,CAAC,MAAM;;AAGhB,SAAO,QAAQ,WAAW,OACtBA,SAAO,QAAQ,OAAO,QAAQ,GAC9BA,SAAO,OAAO,OAAO,QAAQ;;;;;AAOnC,QAAO,UAAUA;;;;;;kBCzKjB;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA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"}
|