@raclettejs/core 0.1.27 → 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/bin/check-dependencies.sh +1 -1
- package/package.json +2 -2
- package/dist/cli.js +0 -1562
- package/dist/cli.js.map +0 -7
- package/dist/index.js +0 -452
- package/dist/index.js.map +0 -7
- package/services/backend/.yarn/install-state.gz +0 -0
- package/services/backend/dist/core/eventBus/index.js +0 -7
- package/services/backend/dist/core/pluginSystem/configGenerator/index.js +0 -346
- package/services/backend/dist/core/sockets/index.js +0 -95
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/account/events/index.js +0 -31
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/account/index.js +0 -48
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/account/routes/index.js +0 -15
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/composition/events/index.js +0 -22
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/composition/index.js +0 -51
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/composition/routes/index.js +0 -19
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/interactionLink/events/index.js +0 -22
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/interactionLink/index.js +0 -48
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/interactionLink/routes/index.js +0 -19
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/project/events/index.js +0 -31
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/project/index.js +0 -49
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/project/routes/index.js +0 -16
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/tag/events/index.js +0 -39
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/tag/index.js +0 -50
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/tag/routes/index.js +0 -19
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/user/events/index.js +0 -31
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/user/index.js +0 -51
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/user/routes/index.js +0 -21
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/workSession/events/index.js +0 -31
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/workSession/index.js +0 -48
- package/services/backend/dist/corePlugins/raclette__core/backend/datatypes/workSession/routes/index.js +0 -15
- package/services/backend/dist/corePlugins/raclette__core/backend/index.js +0 -34
- package/services/backend/dist/domains/index.js +0 -11
- package/services/backend/dist/domains/system/index.js +0 -11
- package/services/backend/dist/domains/system/routes/index.js +0 -17
- package/services/backend/dist/helpers/index.js +0 -14
- package/services/backend/dist/index.js +0 -3
- package/services/backend/dist/modules/authentication/index.js +0 -253
- package/services/backend/dist/shared/types/core/index.js +0 -8
- package/services/backend/dist/shared/types/dataTypes/index.js +0 -6
- package/services/backend/dist/shared/types/index.js +0 -8
- package/services/backend/dist/shared/types/plugins/index.js +0 -8
- package/services/backend/dist/types/index.js +0 -12
- package/services/backend/dist/utils/index.js +0 -2
- package/services/frontend/.yarn/install-state.gz +0 -0
package/dist/cli.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../.yarn/.store/commander-npm-14.0.3-e3f3bb36ca/package/lib/error.js", "../../../.yarn/.store/commander-npm-14.0.3-e3f3bb36ca/package/lib/argument.js", "../../../.yarn/.store/commander-npm-14.0.3-e3f3bb36ca/package/lib/help.js", "../../../.yarn/.store/commander-npm-14.0.3-e3f3bb36ca/package/lib/option.js", "../../../.yarn/.store/commander-npm-14.0.3-e3f3bb36ca/package/lib/suggestSimilar.js", "../../../.yarn/.store/commander-npm-14.0.3-e3f3bb36ca/package/lib/command.js", "../../../.yarn/.store/commander-npm-14.0.3-e3f3bb36ca/package/index.js", "../../../.yarn/.store/dotenv-npm-17.3.1-6caa0b86fa/package/package.json", "../../../.yarn/.store/dotenv-npm-17.3.1-6caa0b86fa/package/lib/main.js", "../package.json", "../../../.yarn/.store/@sindresorhus-merge-streams-npm-4.0.0-abf09348b3/package/index.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/utils/array.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/utils/errno.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/utils/fs.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/utils/path.js", "../../../.yarn/.store/is-extglob-npm-2.1.1-604fef2750/package/index.js", "../../../.yarn/.store/is-glob-npm-4.0.3-09cdc7d0e2/package/index.js", "../../../.yarn/.store/glob-parent-npm-5.1.2-32e552ce79/package/index.js", "../../../.yarn/.store/braces-npm-3.0.3-ea7cd1485a/package/lib/utils.js", "../../../.yarn/.store/braces-npm-3.0.3-ea7cd1485a/package/lib/stringify.js", "../../../.yarn/.store/is-number-npm-7.0.0-6b293483c2/package/index.js", "../../../.yarn/.store/to-regex-range-npm-5.0.1-70aafc9673/package/index.js", "../../../.yarn/.store/fill-range-npm-7.1.1-19e448aba1/package/index.js", "../../../.yarn/.store/braces-npm-3.0.3-ea7cd1485a/package/lib/compile.js", "../../../.yarn/.store/braces-npm-3.0.3-ea7cd1485a/package/lib/expand.js", "../../../.yarn/.store/braces-npm-3.0.3-ea7cd1485a/package/lib/constants.js", "../../../.yarn/.store/braces-npm-3.0.3-ea7cd1485a/package/lib/parse.js", "../../../.yarn/.store/braces-npm-3.0.3-ea7cd1485a/package/index.js", "../../../.yarn/.store/picomatch-npm-2.3.2-6026d9bb28/package/lib/constants.js", "../../../.yarn/.store/picomatch-npm-2.3.2-6026d9bb28/package/lib/utils.js", "../../../.yarn/.store/picomatch-npm-2.3.2-6026d9bb28/package/lib/scan.js", "../../../.yarn/.store/picomatch-npm-2.3.2-6026d9bb28/package/lib/parse.js", "../../../.yarn/.store/picomatch-npm-2.3.2-6026d9bb28/package/lib/picomatch.js", "../../../.yarn/.store/picomatch-npm-2.3.2-6026d9bb28/package/index.js", "../../../.yarn/.store/micromatch-npm-4.0.8-4469d4bbfc/package/index.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/utils/pattern.js", "../../../.yarn/.store/merge2-npm-1.4.1-9197d7d5c7/package/index.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/utils/stream.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/utils/string.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/utils/index.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/managers/tasks.js", "../../../.yarn/.store/@nodelib-fs.stat-npm-2.0.5-7a3560678c/package/out/providers/async.js", "../../../.yarn/.store/@nodelib-fs.stat-npm-2.0.5-7a3560678c/package/out/providers/sync.js", "../../../.yarn/.store/@nodelib-fs.stat-npm-2.0.5-7a3560678c/package/out/adapters/fs.js", "../../../.yarn/.store/@nodelib-fs.stat-npm-2.0.5-7a3560678c/package/out/settings.js", "../../../.yarn/.store/@nodelib-fs.stat-npm-2.0.5-7a3560678c/package/out/index.js", "../../../.yarn/.store/queue-microtask-npm-1.2.3-ea02066ee2/package/index.js", "../../../.yarn/.store/run-parallel-npm-1.2.0-fed2d12c53/package/index.js", "../../../.yarn/.store/@nodelib-fs.scandir-npm-2.1.5-02c0811e18/package/out/constants.js", "../../../.yarn/.store/@nodelib-fs.scandir-npm-2.1.5-02c0811e18/package/out/utils/fs.js", "../../../.yarn/.store/@nodelib-fs.scandir-npm-2.1.5-02c0811e18/package/out/utils/index.js", "../../../.yarn/.store/@nodelib-fs.scandir-npm-2.1.5-02c0811e18/package/out/providers/common.js", "../../../.yarn/.store/@nodelib-fs.scandir-npm-2.1.5-02c0811e18/package/out/providers/async.js", "../../../.yarn/.store/@nodelib-fs.scandir-npm-2.1.5-02c0811e18/package/out/providers/sync.js", "../../../.yarn/.store/@nodelib-fs.scandir-npm-2.1.5-02c0811e18/package/out/adapters/fs.js", "../../../.yarn/.store/@nodelib-fs.scandir-npm-2.1.5-02c0811e18/package/out/settings.js", "../../../.yarn/.store/@nodelib-fs.scandir-npm-2.1.5-02c0811e18/package/out/index.js", "../../../.yarn/.store/reusify-npm-1.1.0-e2493e8828/package/reusify.js", "../../../.yarn/.store/fastq-npm-1.20.1-c009efad0f/package/queue.js", "../../../.yarn/.store/@nodelib-fs.walk-npm-1.2.8-b9f080d810/package/out/readers/common.js", "../../../.yarn/.store/@nodelib-fs.walk-npm-1.2.8-b9f080d810/package/out/readers/reader.js", "../../../.yarn/.store/@nodelib-fs.walk-npm-1.2.8-b9f080d810/package/out/readers/async.js", "../../../.yarn/.store/@nodelib-fs.walk-npm-1.2.8-b9f080d810/package/out/providers/async.js", "../../../.yarn/.store/@nodelib-fs.walk-npm-1.2.8-b9f080d810/package/out/providers/stream.js", "../../../.yarn/.store/@nodelib-fs.walk-npm-1.2.8-b9f080d810/package/out/readers/sync.js", "../../../.yarn/.store/@nodelib-fs.walk-npm-1.2.8-b9f080d810/package/out/providers/sync.js", "../../../.yarn/.store/@nodelib-fs.walk-npm-1.2.8-b9f080d810/package/out/settings.js", "../../../.yarn/.store/@nodelib-fs.walk-npm-1.2.8-b9f080d810/package/out/index.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/readers/reader.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/readers/stream.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/readers/async.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/providers/matchers/matcher.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/providers/matchers/partial.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/providers/filters/deep.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/providers/filters/entry.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/providers/filters/error.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/providers/transformers/entry.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/providers/provider.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/providers/async.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/providers/stream.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/readers/sync.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/providers/sync.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/settings.js", "../../../.yarn/.store/fast-glob-npm-3.3.3-9f1d66bf04/package/out/index.js", "../../../.yarn/.store/unicorn-magic-npm-0.4.0-59be4faf7b/package/default.js", "../../../.yarn/.store/unicorn-magic-npm-0.4.0-59be4faf7b/package/node.js", "../../../.yarn/.store/ignore-npm-7.0.5-a4ce69cb35/package/index.js", "../../../.yarn/.store/is-path-inside-npm-4.0.0-3825cfc72e/package/index.js", "../../../.yarn/.store/slash-npm-5.1.0-34d42c0fd4/package/index.js", "../../../.yarn/.store/globby-npm-16.1.1-69cd39decf/package/utilities.js", "../../../.yarn/.store/globby-npm-16.1.1-69cd39decf/package/ignore.js", "../../../.yarn/.store/globby-npm-16.1.1-69cd39decf/package/index.js", "../src/types.ts", "../../../.yarn/.store/chalk-npm-5.6.2-c1d291da8e/package/source/vendor/ansi-styles/index.js", "../../../.yarn/.store/chalk-npm-5.6.2-c1d291da8e/package/source/vendor/supports-color/index.js", "../../../.yarn/.store/chalk-npm-5.6.2-c1d291da8e/package/source/utilities.js", "../../../.yarn/.store/chalk-npm-5.6.2-c1d291da8e/package/source/index.js", "../../../.yarn/.store/commander-npm-14.0.3-e3f3bb36ca/package/esm.mjs", "../../../.yarn/.store/ramda-npm-0.32.0-a6d40d9d06/package/es/internal/_isPlaceholder.js", "../../../.yarn/.store/ramda-npm-0.32.0-a6d40d9d06/package/es/internal/_curry1.js", "../../../.yarn/.store/ramda-npm-0.32.0-a6d40d9d06/package/es/internal/_curry2.js", "../../../.yarn/.store/ramda-npm-0.32.0-a6d40d9d06/package/es/internal/_curry3.js", "../../../.yarn/.store/ramda-npm-0.32.0-a6d40d9d06/package/es/internal/_has.js", "../../../.yarn/.store/ramda-npm-0.32.0-a6d40d9d06/package/es/internal/_isObject.js", "../../../.yarn/.store/ramda-npm-0.32.0-a6d40d9d06/package/es/mergeWithKey.js", "../../../.yarn/.store/ramda-npm-0.32.0-a6d40d9d06/package/es/mergeDeepWithKey.js", "../../../.yarn/.store/ramda-npm-0.32.0-a6d40d9d06/package/es/mergeDeepRight.js", "../src/cli.ts", "../../../.yarn/.store/js-yaml-npm-4.1.1-dd3afa422f/package/dist/js-yaml.mjs", "../src/config.ts", "../src/file-system.ts", "../src/logger.ts", "../src/builder.ts", "../../../.yarn/.store/mustache-npm-4.2.0-676757d261/package/mustache.mjs", "../src/dev-environment.ts", "../src/docker-generator.ts", "../src/docker-utils.ts", "../src/docker-tracker.ts", "../src/eslint-generator/index.ts", "../src/eslint-generator/configs/core.ts", "../src/eslint-generator/configs/react.ts", "../src/eslint-generator/configs/typescript.ts", "../src/eslint-generator/configs/vue.ts", "../src/eslint-generator/dependencies.ts", "../src/eslint-generator/utils.ts", "../src/package-manager.ts", "../src/ts-generator.ts", "../src/vfs.ts", "../src/config-generator.ts", "../src/package-updater.ts", "../src/log-handler.ts", "../src/raclette-builder.ts", "../src/virtual-file-system.ts", "../src/build-helper.ts", "../src/deploy-guide-generator.ts", "../src/volume-overrides.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * CommanderError class\n */\nclass CommanderError extends Error {\n /**\n * Constructs the CommanderError class\n * @param {number} exitCode suggested exit code which could be used with process.exit\n * @param {string} code an id string representing the error\n * @param {string} message human-readable description of the error\n */\n constructor(exitCode, code, message) {\n super(message);\n // properly capture stack trace in Node.js\n Error.captureStackTrace(this, this.constructor);\n this.name = this.constructor.name;\n this.code = code;\n this.exitCode = exitCode;\n this.nestedError = undefined;\n }\n}\n\n/**\n * InvalidArgumentError class\n */\nclass InvalidArgumentError extends CommanderError {\n /**\n * Constructs the InvalidArgumentError class\n * @param {string} [message] explanation of why argument is invalid\n */\n constructor(message) {\n super(1, 'commander.invalidArgument', message);\n // properly capture stack trace in Node.js\n Error.captureStackTrace(this, this.constructor);\n this.name = this.constructor.name;\n }\n}\n\nexports.CommanderError = CommanderError;\nexports.InvalidArgumentError = InvalidArgumentError;\n", "const { InvalidArgumentError } = require('./error.js');\n\nclass Argument {\n /**\n * Initialize a new command argument with the given name and description.\n * The default is that the argument is required, and you can explicitly\n * indicate this with <> around the name. Put [] around the name for an optional argument.\n *\n * @param {string} name\n * @param {string} [description]\n */\n\n constructor(name, description) {\n this.description = description || '';\n this.variadic = false;\n this.parseArg = undefined;\n this.defaultValue = undefined;\n this.defaultValueDescription = undefined;\n this.argChoices = undefined;\n\n switch (name[0]) {\n case '<': // e.g. <required>\n this.required = true;\n this._name = name.slice(1, -1);\n break;\n case '[': // e.g. [optional]\n this.required = false;\n this._name = name.slice(1, -1);\n break;\n default:\n this.required = true;\n this._name = name;\n break;\n }\n\n if (this._name.endsWith('...')) {\n this.variadic = true;\n this._name = this._name.slice(0, -3);\n }\n }\n\n /**\n * Return argument name.\n *\n * @return {string}\n */\n\n name() {\n return this._name;\n }\n\n /**\n * @package\n */\n\n _collectValue(value, previous) {\n if (previous === this.defaultValue || !Array.isArray(previous)) {\n return [value];\n }\n\n previous.push(value);\n return previous;\n }\n\n /**\n * Set the default value, and optionally supply the description to be displayed in the help.\n *\n * @param {*} value\n * @param {string} [description]\n * @return {Argument}\n */\n\n default(value, description) {\n this.defaultValue = value;\n this.defaultValueDescription = description;\n return this;\n }\n\n /**\n * Set the custom handler for processing CLI command arguments into argument values.\n *\n * @param {Function} [fn]\n * @return {Argument}\n */\n\n argParser(fn) {\n this.parseArg = fn;\n return this;\n }\n\n /**\n * Only allow argument value to be one of choices.\n *\n * @param {string[]} values\n * @return {Argument}\n */\n\n choices(values) {\n this.argChoices = values.slice();\n this.parseArg = (arg, previous) => {\n if (!this.argChoices.includes(arg)) {\n throw new InvalidArgumentError(\n `Allowed choices are ${this.argChoices.join(', ')}.`,\n );\n }\n if (this.variadic) {\n return this._collectValue(arg, previous);\n }\n return arg;\n };\n return this;\n }\n\n /**\n * Make argument required.\n *\n * @returns {Argument}\n */\n argRequired() {\n this.required = true;\n return this;\n }\n\n /**\n * Make argument optional.\n *\n * @returns {Argument}\n */\n argOptional() {\n this.required = false;\n return this;\n }\n}\n\n/**\n * Takes an argument and returns its human readable equivalent for help usage.\n *\n * @param {Argument} arg\n * @return {string}\n * @private\n */\n\nfunction humanReadableArgName(arg) {\n const nameOutput = arg.name() + (arg.variadic === true ? '...' : '');\n\n return arg.required ? '<' + nameOutput + '>' : '[' + nameOutput + ']';\n}\n\nexports.Argument = Argument;\nexports.humanReadableArgName = humanReadableArgName;\n", "const { humanReadableArgName } = require('./argument.js');\n\n/**\n * TypeScript import types for JSDoc, used by Visual Studio Code IntelliSense and `npm run typescript-checkJS`\n * https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#import-types\n * @typedef { import(\"./argument.js\").Argument } Argument\n * @typedef { import(\"./command.js\").Command } Command\n * @typedef { import(\"./option.js\").Option } Option\n */\n\n// Although this is a class, methods are static in style to allow override using subclass or just functions.\nclass Help {\n constructor() {\n this.helpWidth = undefined;\n this.minWidthToWrap = 40;\n this.sortSubcommands = false;\n this.sortOptions = false;\n this.showGlobalOptions = false;\n }\n\n /**\n * prepareContext is called by Commander after applying overrides from `Command.configureHelp()`\n * and just before calling `formatHelp()`.\n *\n * Commander just uses the helpWidth and the rest is provided for optional use by more complex subclasses.\n *\n * @param {{ error?: boolean, helpWidth?: number, outputHasColors?: boolean }} contextOptions\n */\n prepareContext(contextOptions) {\n this.helpWidth = this.helpWidth ?? contextOptions.helpWidth ?? 80;\n }\n\n /**\n * Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one.\n *\n * @param {Command} cmd\n * @returns {Command[]}\n */\n\n visibleCommands(cmd) {\n const visibleCommands = cmd.commands.filter((cmd) => !cmd._hidden);\n const helpCommand = cmd._getHelpCommand();\n if (helpCommand && !helpCommand._hidden) {\n visibleCommands.push(helpCommand);\n }\n if (this.sortSubcommands) {\n visibleCommands.sort((a, b) => {\n // @ts-ignore: because overloaded return type\n return a.name().localeCompare(b.name());\n });\n }\n return visibleCommands;\n }\n\n /**\n * Compare options for sort.\n *\n * @param {Option} a\n * @param {Option} b\n * @returns {number}\n */\n compareOptions(a, b) {\n const getSortKey = (option) => {\n // WYSIWYG for order displayed in help. Short used for comparison if present. No special handling for negated.\n return option.short\n ? option.short.replace(/^-/, '')\n : option.long.replace(/^--/, '');\n };\n return getSortKey(a).localeCompare(getSortKey(b));\n }\n\n /**\n * Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one.\n *\n * @param {Command} cmd\n * @returns {Option[]}\n */\n\n visibleOptions(cmd) {\n const visibleOptions = cmd.options.filter((option) => !option.hidden);\n // Built-in help option.\n const helpOption = cmd._getHelpOption();\n if (helpOption && !helpOption.hidden) {\n // Automatically hide conflicting flags. Bit dubious but a historical behaviour that is convenient for single-command programs.\n const removeShort = helpOption.short && cmd._findOption(helpOption.short);\n const removeLong = helpOption.long && cmd._findOption(helpOption.long);\n if (!removeShort && !removeLong) {\n visibleOptions.push(helpOption); // no changes needed\n } else if (helpOption.long && !removeLong) {\n visibleOptions.push(\n cmd.createOption(helpOption.long, helpOption.description),\n );\n } else if (helpOption.short && !removeShort) {\n visibleOptions.push(\n cmd.createOption(helpOption.short, helpOption.description),\n );\n }\n }\n if (this.sortOptions) {\n visibleOptions.sort(this.compareOptions);\n }\n return visibleOptions;\n }\n\n /**\n * Get an array of the visible global options. (Not including help.)\n *\n * @param {Command} cmd\n * @returns {Option[]}\n */\n\n visibleGlobalOptions(cmd) {\n if (!this.showGlobalOptions) return [];\n\n const globalOptions = [];\n for (\n let ancestorCmd = cmd.parent;\n ancestorCmd;\n ancestorCmd = ancestorCmd.parent\n ) {\n const visibleOptions = ancestorCmd.options.filter(\n (option) => !option.hidden,\n );\n globalOptions.push(...visibleOptions);\n }\n if (this.sortOptions) {\n globalOptions.sort(this.compareOptions);\n }\n return globalOptions;\n }\n\n /**\n * Get an array of the arguments if any have a description.\n *\n * @param {Command} cmd\n * @returns {Argument[]}\n */\n\n visibleArguments(cmd) {\n // Side effect! Apply the legacy descriptions before the arguments are displayed.\n if (cmd._argsDescription) {\n cmd.registeredArguments.forEach((argument) => {\n argument.description =\n argument.description || cmd._argsDescription[argument.name()] || '';\n });\n }\n\n // If there are any arguments with a description then return all the arguments.\n if (cmd.registeredArguments.find((argument) => argument.description)) {\n return cmd.registeredArguments;\n }\n return [];\n }\n\n /**\n * Get the command term to show in the list of subcommands.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n subcommandTerm(cmd) {\n // Legacy. Ignores custom usage string, and nested commands.\n const args = cmd.registeredArguments\n .map((arg) => humanReadableArgName(arg))\n .join(' ');\n return (\n cmd._name +\n (cmd._aliases[0] ? '|' + cmd._aliases[0] : '') +\n (cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option\n (args ? ' ' + args : '')\n );\n }\n\n /**\n * Get the option term to show in the list of options.\n *\n * @param {Option} option\n * @returns {string}\n */\n\n optionTerm(option) {\n return option.flags;\n }\n\n /**\n * Get the argument term to show in the list of arguments.\n *\n * @param {Argument} argument\n * @returns {string}\n */\n\n argumentTerm(argument) {\n return argument.name();\n }\n\n /**\n * Get the longest command term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestSubcommandTermLength(cmd, helper) {\n return helper.visibleCommands(cmd).reduce((max, command) => {\n return Math.max(\n max,\n this.displayWidth(\n helper.styleSubcommandTerm(helper.subcommandTerm(command)),\n ),\n );\n }, 0);\n }\n\n /**\n * Get the longest option term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestOptionTermLength(cmd, helper) {\n return helper.visibleOptions(cmd).reduce((max, option) => {\n return Math.max(\n max,\n this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),\n );\n }, 0);\n }\n\n /**\n * Get the longest global option term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestGlobalOptionTermLength(cmd, helper) {\n return helper.visibleGlobalOptions(cmd).reduce((max, option) => {\n return Math.max(\n max,\n this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),\n );\n }, 0);\n }\n\n /**\n * Get the longest argument term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestArgumentTermLength(cmd, helper) {\n return helper.visibleArguments(cmd).reduce((max, argument) => {\n return Math.max(\n max,\n this.displayWidth(\n helper.styleArgumentTerm(helper.argumentTerm(argument)),\n ),\n );\n }, 0);\n }\n\n /**\n * Get the command usage to be displayed at the top of the built-in help.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n commandUsage(cmd) {\n // Usage\n let cmdName = cmd._name;\n if (cmd._aliases[0]) {\n cmdName = cmdName + '|' + cmd._aliases[0];\n }\n let ancestorCmdNames = '';\n for (\n let ancestorCmd = cmd.parent;\n ancestorCmd;\n ancestorCmd = ancestorCmd.parent\n ) {\n ancestorCmdNames = ancestorCmd.name() + ' ' + ancestorCmdNames;\n }\n return ancestorCmdNames + cmdName + ' ' + cmd.usage();\n }\n\n /**\n * Get the description for the command.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n commandDescription(cmd) {\n // @ts-ignore: because overloaded return type\n return cmd.description();\n }\n\n /**\n * Get the subcommand summary to show in the list of subcommands.\n * (Fallback to description for backwards compatibility.)\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n subcommandDescription(cmd) {\n // @ts-ignore: because overloaded return type\n return cmd.summary() || cmd.description();\n }\n\n /**\n * Get the option description to show in the list of options.\n *\n * @param {Option} option\n * @return {string}\n */\n\n optionDescription(option) {\n const extraInfo = [];\n\n if (option.argChoices) {\n extraInfo.push(\n // use stringify to match the display of the default value\n `choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,\n );\n }\n if (option.defaultValue !== undefined) {\n // default for boolean and negated more for programmer than end user,\n // but show true/false for boolean option as may be for hand-rolled env or config processing.\n const showDefault =\n option.required ||\n option.optional ||\n (option.isBoolean() && typeof option.defaultValue === 'boolean');\n if (showDefault) {\n extraInfo.push(\n `default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`,\n );\n }\n }\n // preset for boolean and negated are more for programmer than end user\n if (option.presetArg !== undefined && option.optional) {\n extraInfo.push(`preset: ${JSON.stringify(option.presetArg)}`);\n }\n if (option.envVar !== undefined) {\n extraInfo.push(`env: ${option.envVar}`);\n }\n if (extraInfo.length > 0) {\n const extraDescription = `(${extraInfo.join(', ')})`;\n if (option.description) {\n return `${option.description} ${extraDescription}`;\n }\n return extraDescription;\n }\n\n return option.description;\n }\n\n /**\n * Get the argument description to show in the list of arguments.\n *\n * @param {Argument} argument\n * @return {string}\n */\n\n argumentDescription(argument) {\n const extraInfo = [];\n if (argument.argChoices) {\n extraInfo.push(\n // use stringify to match the display of the default value\n `choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,\n );\n }\n if (argument.defaultValue !== undefined) {\n extraInfo.push(\n `default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`,\n );\n }\n if (extraInfo.length > 0) {\n const extraDescription = `(${extraInfo.join(', ')})`;\n if (argument.description) {\n return `${argument.description} ${extraDescription}`;\n }\n return extraDescription;\n }\n return argument.description;\n }\n\n /**\n * Format a list of items, given a heading and an array of formatted items.\n *\n * @param {string} heading\n * @param {string[]} items\n * @param {Help} helper\n * @returns string[]\n */\n formatItemList(heading, items, helper) {\n if (items.length === 0) return [];\n\n return [helper.styleTitle(heading), ...items, ''];\n }\n\n /**\n * Group items by their help group heading.\n *\n * @param {Command[] | Option[]} unsortedItems\n * @param {Command[] | Option[]} visibleItems\n * @param {Function} getGroup\n * @returns {Map<string, Command[] | Option[]>}\n */\n groupItems(unsortedItems, visibleItems, getGroup) {\n const result = new Map();\n // Add groups in order of appearance in unsortedItems.\n unsortedItems.forEach((item) => {\n const group = getGroup(item);\n if (!result.has(group)) result.set(group, []);\n });\n // Add items in order of appearance in visibleItems.\n visibleItems.forEach((item) => {\n const group = getGroup(item);\n if (!result.has(group)) {\n result.set(group, []);\n }\n result.get(group).push(item);\n });\n return result;\n }\n\n /**\n * Generate the built-in help text.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {string}\n */\n\n formatHelp(cmd, helper) {\n const termWidth = helper.padWidth(cmd, helper);\n const helpWidth = helper.helpWidth ?? 80; // in case prepareContext() was not called\n\n function callFormatItem(term, description) {\n return helper.formatItem(term, termWidth, description, helper);\n }\n\n // Usage\n let output = [\n `${helper.styleTitle('Usage:')} ${helper.styleUsage(helper.commandUsage(cmd))}`,\n '',\n ];\n\n // Description\n const commandDescription = helper.commandDescription(cmd);\n if (commandDescription.length > 0) {\n output = output.concat([\n helper.boxWrap(\n helper.styleCommandDescription(commandDescription),\n helpWidth,\n ),\n '',\n ]);\n }\n\n // Arguments\n const argumentList = helper.visibleArguments(cmd).map((argument) => {\n return callFormatItem(\n helper.styleArgumentTerm(helper.argumentTerm(argument)),\n helper.styleArgumentDescription(helper.argumentDescription(argument)),\n );\n });\n output = output.concat(\n this.formatItemList('Arguments:', argumentList, helper),\n );\n\n // Options\n const optionGroups = this.groupItems(\n cmd.options,\n helper.visibleOptions(cmd),\n (option) => option.helpGroupHeading ?? 'Options:',\n );\n optionGroups.forEach((options, group) => {\n const optionList = options.map((option) => {\n return callFormatItem(\n helper.styleOptionTerm(helper.optionTerm(option)),\n helper.styleOptionDescription(helper.optionDescription(option)),\n );\n });\n output = output.concat(this.formatItemList(group, optionList, helper));\n });\n\n if (helper.showGlobalOptions) {\n const globalOptionList = helper\n .visibleGlobalOptions(cmd)\n .map((option) => {\n return callFormatItem(\n helper.styleOptionTerm(helper.optionTerm(option)),\n helper.styleOptionDescription(helper.optionDescription(option)),\n );\n });\n output = output.concat(\n this.formatItemList('Global Options:', globalOptionList, helper),\n );\n }\n\n // Commands\n const commandGroups = this.groupItems(\n cmd.commands,\n helper.visibleCommands(cmd),\n (sub) => sub.helpGroup() || 'Commands:',\n );\n commandGroups.forEach((commands, group) => {\n const commandList = commands.map((sub) => {\n return callFormatItem(\n helper.styleSubcommandTerm(helper.subcommandTerm(sub)),\n helper.styleSubcommandDescription(helper.subcommandDescription(sub)),\n );\n });\n output = output.concat(this.formatItemList(group, commandList, helper));\n });\n\n return output.join('\\n');\n }\n\n /**\n * Return display width of string, ignoring ANSI escape sequences. Used in padding and wrapping calculations.\n *\n * @param {string} str\n * @returns {number}\n */\n displayWidth(str) {\n return stripColor(str).length;\n }\n\n /**\n * Style the title for displaying in the help. Called with 'Usage:', 'Options:', etc.\n *\n * @param {string} str\n * @returns {string}\n */\n styleTitle(str) {\n return str;\n }\n\n styleUsage(str) {\n // Usage has lots of parts the user might like to color separately! Assume default usage string which is formed like:\n // command subcommand [options] [command] <foo> [bar]\n return str\n .split(' ')\n .map((word) => {\n if (word === '[options]') return this.styleOptionText(word);\n if (word === '[command]') return this.styleSubcommandText(word);\n if (word[0] === '[' || word[0] === '<')\n return this.styleArgumentText(word);\n return this.styleCommandText(word); // Restrict to initial words?\n })\n .join(' ');\n }\n styleCommandDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleOptionDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleSubcommandDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleArgumentDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleDescriptionText(str) {\n return str;\n }\n styleOptionTerm(str) {\n return this.styleOptionText(str);\n }\n styleSubcommandTerm(str) {\n // This is very like usage with lots of parts! Assume default string which is formed like:\n // subcommand [options] <foo> [bar]\n return str\n .split(' ')\n .map((word) => {\n if (word === '[options]') return this.styleOptionText(word);\n if (word[0] === '[' || word[0] === '<')\n return this.styleArgumentText(word);\n return this.styleSubcommandText(word); // Restrict to initial words?\n })\n .join(' ');\n }\n styleArgumentTerm(str) {\n return this.styleArgumentText(str);\n }\n styleOptionText(str) {\n return str;\n }\n styleArgumentText(str) {\n return str;\n }\n styleSubcommandText(str) {\n return str;\n }\n styleCommandText(str) {\n return str;\n }\n\n /**\n * Calculate the pad width from the maximum term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n padWidth(cmd, helper) {\n return Math.max(\n helper.longestOptionTermLength(cmd, helper),\n helper.longestGlobalOptionTermLength(cmd, helper),\n helper.longestSubcommandTermLength(cmd, helper),\n helper.longestArgumentTermLength(cmd, helper),\n );\n }\n\n /**\n * Detect manually wrapped and indented strings by checking for line break followed by whitespace.\n *\n * @param {string} str\n * @returns {boolean}\n */\n preformatted(str) {\n return /\\n[^\\S\\r\\n]/.test(str);\n }\n\n /**\n * Format the \"item\", which consists of a term and description. Pad the term and wrap the description, indenting the following lines.\n *\n * So \"TTT\", 5, \"DDD DDDD DD DDD\" might be formatted for this.helpWidth=17 like so:\n * TTT DDD DDDD\n * DD DDD\n *\n * @param {string} term\n * @param {number} termWidth\n * @param {string} description\n * @param {Help} helper\n * @returns {string}\n */\n formatItem(term, termWidth, description, helper) {\n const itemIndent = 2;\n const itemIndentStr = ' '.repeat(itemIndent);\n if (!description) return itemIndentStr + term;\n\n // Pad the term out to a consistent width, so descriptions are aligned.\n const paddedTerm = term.padEnd(\n termWidth + term.length - helper.displayWidth(term),\n );\n\n // Format the description.\n const spacerWidth = 2; // between term and description\n const helpWidth = this.helpWidth ?? 80; // in case prepareContext() was not called\n const remainingWidth = helpWidth - termWidth - spacerWidth - itemIndent;\n let formattedDescription;\n if (\n remainingWidth < this.minWidthToWrap ||\n helper.preformatted(description)\n ) {\n formattedDescription = description;\n } else {\n const wrappedDescription = helper.boxWrap(description, remainingWidth);\n formattedDescription = wrappedDescription.replace(\n /\\n/g,\n '\\n' + ' '.repeat(termWidth + spacerWidth),\n );\n }\n\n // Construct and overall indent.\n return (\n itemIndentStr +\n paddedTerm +\n ' '.repeat(spacerWidth) +\n formattedDescription.replace(/\\n/g, `\\n${itemIndentStr}`)\n );\n }\n\n /**\n * Wrap a string at whitespace, preserving existing line breaks.\n * Wrapping is skipped if the width is less than `minWidthToWrap`.\n *\n * @param {string} str\n * @param {number} width\n * @returns {string}\n */\n boxWrap(str, width) {\n if (width < this.minWidthToWrap) return str;\n\n const rawLines = str.split(/\\r\\n|\\n/);\n // split up text by whitespace\n const chunkPattern = /[\\s]*[^\\s]+/g;\n const wrappedLines = [];\n rawLines.forEach((line) => {\n const chunks = line.match(chunkPattern);\n if (chunks === null) {\n wrappedLines.push('');\n return;\n }\n\n let sumChunks = [chunks.shift()];\n let sumWidth = this.displayWidth(sumChunks[0]);\n chunks.forEach((chunk) => {\n const visibleWidth = this.displayWidth(chunk);\n // Accumulate chunks while they fit into width.\n if (sumWidth + visibleWidth <= width) {\n sumChunks.push(chunk);\n sumWidth += visibleWidth;\n return;\n }\n wrappedLines.push(sumChunks.join(''));\n\n const nextChunk = chunk.trimStart(); // trim space at line break\n sumChunks = [nextChunk];\n sumWidth = this.displayWidth(nextChunk);\n });\n wrappedLines.push(sumChunks.join(''));\n });\n\n return wrappedLines.join('\\n');\n }\n}\n\n/**\n * Strip style ANSI escape sequences from the string. In particular, SGR (Select Graphic Rendition) codes.\n *\n * @param {string} str\n * @returns {string}\n * @package\n */\n\nfunction stripColor(str) {\n // eslint-disable-next-line no-control-regex\n const sgrPattern = /\\x1b\\[\\d*(;\\d*)*m/g;\n return str.replace(sgrPattern, '');\n}\n\nexports.Help = Help;\nexports.stripColor = stripColor;\n", "const { InvalidArgumentError } = require('./error.js');\n\nclass Option {\n /**\n * Initialize a new `Option` with the given `flags` and `description`.\n *\n * @param {string} flags\n * @param {string} [description]\n */\n\n constructor(flags, description) {\n this.flags = flags;\n this.description = description || '';\n\n this.required = flags.includes('<'); // A value must be supplied when the option is specified.\n this.optional = flags.includes('['); // A value is optional when the option is specified.\n // variadic test ignores <value,...> et al which might be used to describe custom splitting of single argument\n this.variadic = /\\w\\.\\.\\.[>\\]]$/.test(flags); // The option can take multiple values.\n this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line.\n const optionFlags = splitOptionFlags(flags);\n this.short = optionFlags.shortFlag; // May be a short flag, undefined, or even a long flag (if option has two long flags).\n this.long = optionFlags.longFlag;\n this.negate = false;\n if (this.long) {\n this.negate = this.long.startsWith('--no-');\n }\n this.defaultValue = undefined;\n this.defaultValueDescription = undefined;\n this.presetArg = undefined;\n this.envVar = undefined;\n this.parseArg = undefined;\n this.hidden = false;\n this.argChoices = undefined;\n this.conflictsWith = [];\n this.implied = undefined;\n this.helpGroupHeading = undefined; // soft initialised when option added to command\n }\n\n /**\n * Set the default value, and optionally supply the description to be displayed in the help.\n *\n * @param {*} value\n * @param {string} [description]\n * @return {Option}\n */\n\n default(value, description) {\n this.defaultValue = value;\n this.defaultValueDescription = description;\n return this;\n }\n\n /**\n * Preset to use when option used without option-argument, especially optional but also boolean and negated.\n * The custom processing (parseArg) is called.\n *\n * @example\n * new Option('--color').default('GREYSCALE').preset('RGB');\n * new Option('--donate [amount]').preset('20').argParser(parseFloat);\n *\n * @param {*} arg\n * @return {Option}\n */\n\n preset(arg) {\n this.presetArg = arg;\n return this;\n }\n\n /**\n * Add option name(s) that conflict with this option.\n * An error will be displayed if conflicting options are found during parsing.\n *\n * @example\n * new Option('--rgb').conflicts('cmyk');\n * new Option('--js').conflicts(['ts', 'jsx']);\n *\n * @param {(string | string[])} names\n * @return {Option}\n */\n\n conflicts(names) {\n this.conflictsWith = this.conflictsWith.concat(names);\n return this;\n }\n\n /**\n * Specify implied option values for when this option is set and the implied options are not.\n *\n * The custom processing (parseArg) is not called on the implied values.\n *\n * @example\n * program\n * .addOption(new Option('--log', 'write logging information to file'))\n * .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' }));\n *\n * @param {object} impliedOptionValues\n * @return {Option}\n */\n implies(impliedOptionValues) {\n let newImplied = impliedOptionValues;\n if (typeof impliedOptionValues === 'string') {\n // string is not documented, but easy mistake and we can do what user probably intended.\n newImplied = { [impliedOptionValues]: true };\n }\n this.implied = Object.assign(this.implied || {}, newImplied);\n return this;\n }\n\n /**\n * Set environment variable to check for option value.\n *\n * An environment variable is only used if when processed the current option value is\n * undefined, or the source of the current value is 'default' or 'config' or 'env'.\n *\n * @param {string} name\n * @return {Option}\n */\n\n env(name) {\n this.envVar = name;\n return this;\n }\n\n /**\n * Set the custom handler for processing CLI option arguments into option values.\n *\n * @param {Function} [fn]\n * @return {Option}\n */\n\n argParser(fn) {\n this.parseArg = fn;\n return this;\n }\n\n /**\n * Whether the option is mandatory and must have a value after parsing.\n *\n * @param {boolean} [mandatory=true]\n * @return {Option}\n */\n\n makeOptionMandatory(mandatory = true) {\n this.mandatory = !!mandatory;\n return this;\n }\n\n /**\n * Hide option in help.\n *\n * @param {boolean} [hide=true]\n * @return {Option}\n */\n\n hideHelp(hide = true) {\n this.hidden = !!hide;\n return this;\n }\n\n /**\n * @package\n */\n\n _collectValue(value, previous) {\n if (previous === this.defaultValue || !Array.isArray(previous)) {\n return [value];\n }\n\n previous.push(value);\n return previous;\n }\n\n /**\n * Only allow option value to be one of choices.\n *\n * @param {string[]} values\n * @return {Option}\n */\n\n choices(values) {\n this.argChoices = values.slice();\n this.parseArg = (arg, previous) => {\n if (!this.argChoices.includes(arg)) {\n throw new InvalidArgumentError(\n `Allowed choices are ${this.argChoices.join(', ')}.`,\n );\n }\n if (this.variadic) {\n return this._collectValue(arg, previous);\n }\n return arg;\n };\n return this;\n }\n\n /**\n * Return option name.\n *\n * @return {string}\n */\n\n name() {\n if (this.long) {\n return this.long.replace(/^--/, '');\n }\n return this.short.replace(/^-/, '');\n }\n\n /**\n * Return option name, in a camelcase format that can be used\n * as an object attribute key.\n *\n * @return {string}\n */\n\n attributeName() {\n if (this.negate) {\n return camelcase(this.name().replace(/^no-/, ''));\n }\n return camelcase(this.name());\n }\n\n /**\n * Set the help group heading.\n *\n * @param {string} heading\n * @return {Option}\n */\n helpGroup(heading) {\n this.helpGroupHeading = heading;\n return this;\n }\n\n /**\n * Check if `arg` matches the short or long flag.\n *\n * @param {string} arg\n * @return {boolean}\n * @package\n */\n\n is(arg) {\n return this.short === arg || this.long === arg;\n }\n\n /**\n * Return whether a boolean option.\n *\n * Options are one of boolean, negated, required argument, or optional argument.\n *\n * @return {boolean}\n * @package\n */\n\n isBoolean() {\n return !this.required && !this.optional && !this.negate;\n }\n}\n\n/**\n * This class is to make it easier to work with dual options, without changing the existing\n * implementation. We support separate dual options for separate positive and negative options,\n * like `--build` and `--no-build`, which share a single option value. This works nicely for some\n * use cases, but is tricky for others where we want separate behaviours despite\n * the single shared option value.\n */\nclass DualOptions {\n /**\n * @param {Option[]} options\n */\n constructor(options) {\n this.positiveOptions = new Map();\n this.negativeOptions = new Map();\n this.dualOptions = new Set();\n options.forEach((option) => {\n if (option.negate) {\n this.negativeOptions.set(option.attributeName(), option);\n } else {\n this.positiveOptions.set(option.attributeName(), option);\n }\n });\n this.negativeOptions.forEach((value, key) => {\n if (this.positiveOptions.has(key)) {\n this.dualOptions.add(key);\n }\n });\n }\n\n /**\n * Did the value come from the option, and not from possible matching dual option?\n *\n * @param {*} value\n * @param {Option} option\n * @returns {boolean}\n */\n valueFromOption(value, option) {\n const optionKey = option.attributeName();\n if (!this.dualOptions.has(optionKey)) return true;\n\n // Use the value to deduce if (probably) came from the option.\n const preset = this.negativeOptions.get(optionKey).presetArg;\n const negativeValue = preset !== undefined ? preset : false;\n return option.negate === (negativeValue === value);\n }\n}\n\n/**\n * Convert string from kebab-case to camelCase.\n *\n * @param {string} str\n * @return {string}\n * @private\n */\n\nfunction camelcase(str) {\n return str.split('-').reduce((str, word) => {\n return str + word[0].toUpperCase() + word.slice(1);\n });\n}\n\n/**\n * Split the short and long flag out of something like '-m,--mixed <value>'\n *\n * @private\n */\n\nfunction splitOptionFlags(flags) {\n let shortFlag;\n let longFlag;\n // short flag, single dash and single character\n const shortFlagExp = /^-[^-]$/;\n // long flag, double dash and at least one character\n const longFlagExp = /^--[^-]/;\n\n const flagParts = flags.split(/[ |,]+/).concat('guard');\n // Normal is short and/or long.\n if (shortFlagExp.test(flagParts[0])) shortFlag = flagParts.shift();\n if (longFlagExp.test(flagParts[0])) longFlag = flagParts.shift();\n // Long then short. Rarely used but fine.\n if (!shortFlag && shortFlagExp.test(flagParts[0]))\n shortFlag = flagParts.shift();\n // Allow two long flags, like '--ws, --workspace'\n // This is the supported way to have a shortish option flag.\n if (!shortFlag && longFlagExp.test(flagParts[0])) {\n shortFlag = longFlag;\n longFlag = flagParts.shift();\n }\n\n // Check for unprocessed flag. Fail noisily rather than silently ignore.\n if (flagParts[0].startsWith('-')) {\n const unsupportedFlag = flagParts[0];\n const baseError = `option creation failed due to '${unsupportedFlag}' in option flags '${flags}'`;\n if (/^-[^-][^-]/.test(unsupportedFlag))\n throw new Error(\n `${baseError}\n- a short flag is a single dash and a single character\n - either use a single dash and a single character (for a short flag)\n - or use a double dash for a long option (and can have two, like '--ws, --workspace')`,\n );\n if (shortFlagExp.test(unsupportedFlag))\n throw new Error(`${baseError}\n- too many short flags`);\n if (longFlagExp.test(unsupportedFlag))\n throw new Error(`${baseError}\n- too many long flags`);\n\n throw new Error(`${baseError}\n- unrecognised flag format`);\n }\n if (shortFlag === undefined && longFlag === undefined)\n throw new Error(\n `option creation failed due to no flags found in '${flags}'.`,\n );\n\n return { shortFlag, longFlag };\n}\n\nexports.Option = Option;\nexports.DualOptions = DualOptions;\n", "const maxDistance = 3;\n\nfunction editDistance(a, b) {\n // https://en.wikipedia.org/wiki/Damerau\u2013Levenshtein_distance\n // Calculating optimal string alignment distance, no substring is edited more than once.\n // (Simple implementation.)\n\n // Quick early exit, return worst case.\n if (Math.abs(a.length - b.length) > maxDistance)\n return Math.max(a.length, b.length);\n\n // distance between prefix substrings of a and b\n const d = [];\n\n // pure deletions turn a into empty string\n for (let i = 0; i <= a.length; i++) {\n d[i] = [i];\n }\n // pure insertions turn empty string into b\n for (let j = 0; j <= b.length; j++) {\n d[0][j] = j;\n }\n\n // fill matrix\n for (let j = 1; j <= b.length; j++) {\n for (let i = 1; i <= a.length; i++) {\n let cost = 1;\n if (a[i - 1] === b[j - 1]) {\n cost = 0;\n } else {\n cost = 1;\n }\n d[i][j] = Math.min(\n d[i - 1][j] + 1, // deletion\n d[i][j - 1] + 1, // insertion\n d[i - 1][j - 1] + cost, // substitution\n );\n // transposition\n if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {\n d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1);\n }\n }\n }\n\n return d[a.length][b.length];\n}\n\n/**\n * Find close matches, restricted to same number of edits.\n *\n * @param {string} word\n * @param {string[]} candidates\n * @returns {string}\n */\n\nfunction suggestSimilar(word, candidates) {\n if (!candidates || candidates.length === 0) return '';\n // remove possible duplicates\n candidates = Array.from(new Set(candidates));\n\n const searchingOptions = word.startsWith('--');\n if (searchingOptions) {\n word = word.slice(2);\n candidates = candidates.map((candidate) => candidate.slice(2));\n }\n\n let similar = [];\n let bestDistance = maxDistance;\n const minSimilarity = 0.4;\n candidates.forEach((candidate) => {\n if (candidate.length <= 1) return; // no one character guesses\n\n const distance = editDistance(word, candidate);\n const length = Math.max(word.length, candidate.length);\n const similarity = (length - distance) / length;\n if (similarity > minSimilarity) {\n if (distance < bestDistance) {\n // better edit distance, throw away previous worse matches\n bestDistance = distance;\n similar = [candidate];\n } else if (distance === bestDistance) {\n similar.push(candidate);\n }\n }\n });\n\n similar.sort((a, b) => a.localeCompare(b));\n if (searchingOptions) {\n similar = similar.map((candidate) => `--${candidate}`);\n }\n\n if (similar.length > 1) {\n return `\\n(Did you mean one of ${similar.join(', ')}?)`;\n }\n if (similar.length === 1) {\n return `\\n(Did you mean ${similar[0]}?)`;\n }\n return '';\n}\n\nexports.suggestSimilar = suggestSimilar;\n", "const EventEmitter = require('node:events').EventEmitter;\nconst childProcess = require('node:child_process');\nconst path = require('node:path');\nconst fs = require('node:fs');\nconst process = require('node:process');\n\nconst { Argument, humanReadableArgName } = require('./argument.js');\nconst { CommanderError } = require('./error.js');\nconst { Help, stripColor } = require('./help.js');\nconst { Option, DualOptions } = require('./option.js');\nconst { suggestSimilar } = require('./suggestSimilar');\n\nclass Command extends EventEmitter {\n /**\n * Initialize a new `Command`.\n *\n * @param {string} [name]\n */\n\n constructor(name) {\n super();\n /** @type {Command[]} */\n this.commands = [];\n /** @type {Option[]} */\n this.options = [];\n this.parent = null;\n this._allowUnknownOption = false;\n this._allowExcessArguments = false;\n /** @type {Argument[]} */\n this.registeredArguments = [];\n this._args = this.registeredArguments; // deprecated old name\n /** @type {string[]} */\n this.args = []; // cli args with options removed\n this.rawArgs = [];\n this.processedArgs = []; // like .args but after custom processing and collecting variadic\n this._scriptPath = null;\n this._name = name || '';\n this._optionValues = {};\n this._optionValueSources = {}; // default, env, cli etc\n this._storeOptionsAsProperties = false;\n this._actionHandler = null;\n this._executableHandler = false;\n this._executableFile = null; // custom name for executable\n this._executableDir = null; // custom search directory for subcommands\n this._defaultCommandName = null;\n this._exitCallback = null;\n this._aliases = [];\n this._combineFlagAndOptionalValue = true;\n this._description = '';\n this._summary = '';\n this._argsDescription = undefined; // legacy\n this._enablePositionalOptions = false;\n this._passThroughOptions = false;\n this._lifeCycleHooks = {}; // a hash of arrays\n /** @type {(boolean | string)} */\n this._showHelpAfterError = false;\n this._showSuggestionAfterError = true;\n this._savedState = null; // used in save/restoreStateBeforeParse\n\n // see configureOutput() for docs\n this._outputConfiguration = {\n writeOut: (str) => process.stdout.write(str),\n writeErr: (str) => process.stderr.write(str),\n outputError: (str, write) => write(str),\n getOutHelpWidth: () =>\n process.stdout.isTTY ? process.stdout.columns : undefined,\n getErrHelpWidth: () =>\n process.stderr.isTTY ? process.stderr.columns : undefined,\n getOutHasColors: () =>\n useColor() ?? (process.stdout.isTTY && process.stdout.hasColors?.()),\n getErrHasColors: () =>\n useColor() ?? (process.stderr.isTTY && process.stderr.hasColors?.()),\n stripColor: (str) => stripColor(str),\n };\n\n this._hidden = false;\n /** @type {(Option | null | undefined)} */\n this._helpOption = undefined; // Lazy created on demand. May be null if help option is disabled.\n this._addImplicitHelpCommand = undefined; // undecided whether true or false yet, not inherited\n /** @type {Command} */\n this._helpCommand = undefined; // lazy initialised, inherited\n this._helpConfiguration = {};\n /** @type {string | undefined} */\n this._helpGroupHeading = undefined; // soft initialised when added to parent\n /** @type {string | undefined} */\n this._defaultCommandGroup = undefined;\n /** @type {string | undefined} */\n this._defaultOptionGroup = undefined;\n }\n\n /**\n * Copy settings that are useful to have in common across root command and subcommands.\n *\n * (Used internally when adding a command using `.command()` so subcommands inherit parent settings.)\n *\n * @param {Command} sourceCommand\n * @return {Command} `this` command for chaining\n */\n copyInheritedSettings(sourceCommand) {\n this._outputConfiguration = sourceCommand._outputConfiguration;\n this._helpOption = sourceCommand._helpOption;\n this._helpCommand = sourceCommand._helpCommand;\n this._helpConfiguration = sourceCommand._helpConfiguration;\n this._exitCallback = sourceCommand._exitCallback;\n this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties;\n this._combineFlagAndOptionalValue =\n sourceCommand._combineFlagAndOptionalValue;\n this._allowExcessArguments = sourceCommand._allowExcessArguments;\n this._enablePositionalOptions = sourceCommand._enablePositionalOptions;\n this._showHelpAfterError = sourceCommand._showHelpAfterError;\n this._showSuggestionAfterError = sourceCommand._showSuggestionAfterError;\n\n return this;\n }\n\n /**\n * @returns {Command[]}\n * @private\n */\n\n _getCommandAndAncestors() {\n const result = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n for (let command = this; command; command = command.parent) {\n result.push(command);\n }\n return result;\n }\n\n /**\n * Define a command.\n *\n * There are two styles of command: pay attention to where to put the description.\n *\n * @example\n * // Command implemented using action handler (description is supplied separately to `.command`)\n * program\n * .command('clone <source> [destination]')\n * .description('clone a repository into a newly created directory')\n * .action((source, destination) => {\n * console.log('clone command called');\n * });\n *\n * // Command implemented using separate executable file (description is second parameter to `.command`)\n * program\n * .command('start <service>', 'start named service')\n * .command('stop [service]', 'stop named service, or all if no name supplied');\n *\n * @param {string} nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`\n * @param {(object | string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable)\n * @param {object} [execOpts] - configuration options (for executable)\n * @return {Command} returns new command for action handler, or `this` for executable command\n */\n\n command(nameAndArgs, actionOptsOrExecDesc, execOpts) {\n let desc = actionOptsOrExecDesc;\n let opts = execOpts;\n if (typeof desc === 'object' && desc !== null) {\n opts = desc;\n desc = null;\n }\n opts = opts || {};\n const [, name, args] = nameAndArgs.match(/([^ ]+) *(.*)/);\n\n const cmd = this.createCommand(name);\n if (desc) {\n cmd.description(desc);\n cmd._executableHandler = true;\n }\n if (opts.isDefault) this._defaultCommandName = cmd._name;\n cmd._hidden = !!(opts.noHelp || opts.hidden); // noHelp is deprecated old name for hidden\n cmd._executableFile = opts.executableFile || null; // Custom name for executable file, set missing to null to match constructor\n if (args) cmd.arguments(args);\n this._registerCommand(cmd);\n cmd.parent = this;\n cmd.copyInheritedSettings(this);\n\n if (desc) return this;\n return cmd;\n }\n\n /**\n * Factory routine to create a new unattached command.\n *\n * See .command() for creating an attached subcommand, which uses this routine to\n * create the command. You can override createCommand to customise subcommands.\n *\n * @param {string} [name]\n * @return {Command} new command\n */\n\n createCommand(name) {\n return new Command(name);\n }\n\n /**\n * You can customise the help with a subclass of Help by overriding createHelp,\n * or by overriding Help properties using configureHelp().\n *\n * @return {Help}\n */\n\n createHelp() {\n return Object.assign(new Help(), this.configureHelp());\n }\n\n /**\n * You can customise the help by overriding Help properties using configureHelp(),\n * or with a subclass of Help by overriding createHelp().\n *\n * @param {object} [configuration] - configuration options\n * @return {(Command | object)} `this` command for chaining, or stored configuration\n */\n\n configureHelp(configuration) {\n if (configuration === undefined) return this._helpConfiguration;\n\n this._helpConfiguration = configuration;\n return this;\n }\n\n /**\n * The default output goes to stdout and stderr. You can customise this for special\n * applications. You can also customise the display of errors by overriding outputError.\n *\n * The configuration properties are all functions:\n *\n * // change how output being written, defaults to stdout and stderr\n * writeOut(str)\n * writeErr(str)\n * // change how output being written for errors, defaults to writeErr\n * outputError(str, write) // used for displaying errors and not used for displaying help\n * // specify width for wrapping help\n * getOutHelpWidth()\n * getErrHelpWidth()\n * // color support, currently only used with Help\n * getOutHasColors()\n * getErrHasColors()\n * stripColor() // used to remove ANSI escape codes if output does not have colors\n *\n * @param {object} [configuration] - configuration options\n * @return {(Command | object)} `this` command for chaining, or stored configuration\n */\n\n configureOutput(configuration) {\n if (configuration === undefined) return this._outputConfiguration;\n\n this._outputConfiguration = {\n ...this._outputConfiguration,\n ...configuration,\n };\n return this;\n }\n\n /**\n * Display the help or a custom message after an error occurs.\n *\n * @param {(boolean|string)} [displayHelp]\n * @return {Command} `this` command for chaining\n */\n showHelpAfterError(displayHelp = true) {\n if (typeof displayHelp !== 'string') displayHelp = !!displayHelp;\n this._showHelpAfterError = displayHelp;\n return this;\n }\n\n /**\n * Display suggestion of similar commands for unknown commands, or options for unknown options.\n *\n * @param {boolean} [displaySuggestion]\n * @return {Command} `this` command for chaining\n */\n showSuggestionAfterError(displaySuggestion = true) {\n this._showSuggestionAfterError = !!displaySuggestion;\n return this;\n }\n\n /**\n * Add a prepared subcommand.\n *\n * See .command() for creating an attached subcommand which inherits settings from its parent.\n *\n * @param {Command} cmd - new subcommand\n * @param {object} [opts] - configuration options\n * @return {Command} `this` command for chaining\n */\n\n addCommand(cmd, opts) {\n if (!cmd._name) {\n throw new Error(`Command passed to .addCommand() must have a name\n- specify the name in Command constructor or using .name()`);\n }\n\n opts = opts || {};\n if (opts.isDefault) this._defaultCommandName = cmd._name;\n if (opts.noHelp || opts.hidden) cmd._hidden = true; // modifying passed command due to existing implementation\n\n this._registerCommand(cmd);\n cmd.parent = this;\n cmd._checkForBrokenPassThrough();\n\n return this;\n }\n\n /**\n * Factory routine to create a new unattached argument.\n *\n * See .argument() for creating an attached argument, which uses this routine to\n * create the argument. You can override createArgument to return a custom argument.\n *\n * @param {string} name\n * @param {string} [description]\n * @return {Argument} new argument\n */\n\n createArgument(name, description) {\n return new Argument(name, description);\n }\n\n /**\n * Define argument syntax for command.\n *\n * The default is that the argument is required, and you can explicitly\n * indicate this with <> around the name. Put [] around the name for an optional argument.\n *\n * @example\n * program.argument('<input-file>');\n * program.argument('[output-file]');\n *\n * @param {string} name\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom argument processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n argument(name, description, parseArg, defaultValue) {\n const argument = this.createArgument(name, description);\n if (typeof parseArg === 'function') {\n argument.default(defaultValue).argParser(parseArg);\n } else {\n argument.default(parseArg);\n }\n this.addArgument(argument);\n return this;\n }\n\n /**\n * Define argument syntax for command, adding multiple at once (without descriptions).\n *\n * See also .argument().\n *\n * @example\n * program.arguments('<cmd> [env]');\n *\n * @param {string} names\n * @return {Command} `this` command for chaining\n */\n\n arguments(names) {\n names\n .trim()\n .split(/ +/)\n .forEach((detail) => {\n this.argument(detail);\n });\n return this;\n }\n\n /**\n * Define argument syntax for command, adding a prepared argument.\n *\n * @param {Argument} argument\n * @return {Command} `this` command for chaining\n */\n addArgument(argument) {\n const previousArgument = this.registeredArguments.slice(-1)[0];\n if (previousArgument?.variadic) {\n throw new Error(\n `only the last argument can be variadic '${previousArgument.name()}'`,\n );\n }\n if (\n argument.required &&\n argument.defaultValue !== undefined &&\n argument.parseArg === undefined\n ) {\n throw new Error(\n `a default value for a required argument is never used: '${argument.name()}'`,\n );\n }\n this.registeredArguments.push(argument);\n return this;\n }\n\n /**\n * Customise or override default help command. By default a help command is automatically added if your command has subcommands.\n *\n * @example\n * program.helpCommand('help [cmd]');\n * program.helpCommand('help [cmd]', 'show help');\n * program.helpCommand(false); // suppress default help command\n * program.helpCommand(true); // add help command even if no subcommands\n *\n * @param {string|boolean} enableOrNameAndArgs - enable with custom name and/or arguments, or boolean to override whether added\n * @param {string} [description] - custom description\n * @return {Command} `this` command for chaining\n */\n\n helpCommand(enableOrNameAndArgs, description) {\n if (typeof enableOrNameAndArgs === 'boolean') {\n this._addImplicitHelpCommand = enableOrNameAndArgs;\n if (enableOrNameAndArgs && this._defaultCommandGroup) {\n // make the command to store the group\n this._initCommandGroup(this._getHelpCommand());\n }\n return this;\n }\n\n const nameAndArgs = enableOrNameAndArgs ?? 'help [command]';\n const [, helpName, helpArgs] = nameAndArgs.match(/([^ ]+) *(.*)/);\n const helpDescription = description ?? 'display help for command';\n\n const helpCommand = this.createCommand(helpName);\n helpCommand.helpOption(false);\n if (helpArgs) helpCommand.arguments(helpArgs);\n if (helpDescription) helpCommand.description(helpDescription);\n\n this._addImplicitHelpCommand = true;\n this._helpCommand = helpCommand;\n // init group unless lazy create\n if (enableOrNameAndArgs || description) this._initCommandGroup(helpCommand);\n\n return this;\n }\n\n /**\n * Add prepared custom help command.\n *\n * @param {(Command|string|boolean)} helpCommand - custom help command, or deprecated enableOrNameAndArgs as for `.helpCommand()`\n * @param {string} [deprecatedDescription] - deprecated custom description used with custom name only\n * @return {Command} `this` command for chaining\n */\n addHelpCommand(helpCommand, deprecatedDescription) {\n // If not passed an object, call through to helpCommand for backwards compatibility,\n // as addHelpCommand was originally used like helpCommand is now.\n if (typeof helpCommand !== 'object') {\n this.helpCommand(helpCommand, deprecatedDescription);\n return this;\n }\n\n this._addImplicitHelpCommand = true;\n this._helpCommand = helpCommand;\n this._initCommandGroup(helpCommand);\n return this;\n }\n\n /**\n * Lazy create help command.\n *\n * @return {(Command|null)}\n * @package\n */\n _getHelpCommand() {\n const hasImplicitHelpCommand =\n this._addImplicitHelpCommand ??\n (this.commands.length &&\n !this._actionHandler &&\n !this._findCommand('help'));\n\n if (hasImplicitHelpCommand) {\n if (this._helpCommand === undefined) {\n this.helpCommand(undefined, undefined); // use default name and description\n }\n return this._helpCommand;\n }\n return null;\n }\n\n /**\n * Add hook for life cycle event.\n *\n * @param {string} event\n * @param {Function} listener\n * @return {Command} `this` command for chaining\n */\n\n hook(event, listener) {\n const allowedValues = ['preSubcommand', 'preAction', 'postAction'];\n if (!allowedValues.includes(event)) {\n throw new Error(`Unexpected value for event passed to hook : '${event}'.\nExpecting one of '${allowedValues.join(\"', '\")}'`);\n }\n if (this._lifeCycleHooks[event]) {\n this._lifeCycleHooks[event].push(listener);\n } else {\n this._lifeCycleHooks[event] = [listener];\n }\n return this;\n }\n\n /**\n * Register callback to use as replacement for calling process.exit.\n *\n * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing\n * @return {Command} `this` command for chaining\n */\n\n exitOverride(fn) {\n if (fn) {\n this._exitCallback = fn;\n } else {\n this._exitCallback = (err) => {\n if (err.code !== 'commander.executeSubCommandAsync') {\n throw err;\n } else {\n // Async callback from spawn events, not useful to throw.\n }\n };\n }\n return this;\n }\n\n /**\n * Call process.exit, and _exitCallback if defined.\n *\n * @param {number} exitCode exit code for using with process.exit\n * @param {string} code an id string representing the error\n * @param {string} message human-readable description of the error\n * @return never\n * @private\n */\n\n _exit(exitCode, code, message) {\n if (this._exitCallback) {\n this._exitCallback(new CommanderError(exitCode, code, message));\n // Expecting this line is not reached.\n }\n process.exit(exitCode);\n }\n\n /**\n * Register callback `fn` for the command.\n *\n * @example\n * program\n * .command('serve')\n * .description('start service')\n * .action(function() {\n * // do work here\n * });\n *\n * @param {Function} fn\n * @return {Command} `this` command for chaining\n */\n\n action(fn) {\n const listener = (args) => {\n // The .action callback takes an extra parameter which is the command or options.\n const expectedArgsCount = this.registeredArguments.length;\n const actionArgs = args.slice(0, expectedArgsCount);\n if (this._storeOptionsAsProperties) {\n actionArgs[expectedArgsCount] = this; // backwards compatible \"options\"\n } else {\n actionArgs[expectedArgsCount] = this.opts();\n }\n actionArgs.push(this);\n\n return fn.apply(this, actionArgs);\n };\n this._actionHandler = listener;\n return this;\n }\n\n /**\n * Factory routine to create a new unattached option.\n *\n * See .option() for creating an attached option, which uses this routine to\n * create the option. You can override createOption to return a custom option.\n *\n * @param {string} flags\n * @param {string} [description]\n * @return {Option} new option\n */\n\n createOption(flags, description) {\n return new Option(flags, description);\n }\n\n /**\n * Wrap parseArgs to catch 'commander.invalidArgument'.\n *\n * @param {(Option | Argument)} target\n * @param {string} value\n * @param {*} previous\n * @param {string} invalidArgumentMessage\n * @private\n */\n\n _callParseArg(target, value, previous, invalidArgumentMessage) {\n try {\n return target.parseArg(value, previous);\n } catch (err) {\n if (err.code === 'commander.invalidArgument') {\n const message = `${invalidArgumentMessage} ${err.message}`;\n this.error(message, { exitCode: err.exitCode, code: err.code });\n }\n throw err;\n }\n }\n\n /**\n * Check for option flag conflicts.\n * Register option if no conflicts found, or throw on conflict.\n *\n * @param {Option} option\n * @private\n */\n\n _registerOption(option) {\n const matchingOption =\n (option.short && this._findOption(option.short)) ||\n (option.long && this._findOption(option.long));\n if (matchingOption) {\n const matchingFlag =\n option.long && this._findOption(option.long)\n ? option.long\n : option.short;\n throw new Error(`Cannot add option '${option.flags}'${this._name && ` to command '${this._name}'`} due to conflicting flag '${matchingFlag}'\n- already used by option '${matchingOption.flags}'`);\n }\n\n this._initOptionGroup(option);\n this.options.push(option);\n }\n\n /**\n * Check for command name and alias conflicts with existing commands.\n * Register command if no conflicts found, or throw on conflict.\n *\n * @param {Command} command\n * @private\n */\n\n _registerCommand(command) {\n const knownBy = (cmd) => {\n return [cmd.name()].concat(cmd.aliases());\n };\n\n const alreadyUsed = knownBy(command).find((name) =>\n this._findCommand(name),\n );\n if (alreadyUsed) {\n const existingCmd = knownBy(this._findCommand(alreadyUsed)).join('|');\n const newCmd = knownBy(command).join('|');\n throw new Error(\n `cannot add command '${newCmd}' as already have command '${existingCmd}'`,\n );\n }\n\n this._initCommandGroup(command);\n this.commands.push(command);\n }\n\n /**\n * Add an option.\n *\n * @param {Option} option\n * @return {Command} `this` command for chaining\n */\n addOption(option) {\n this._registerOption(option);\n\n const oname = option.name();\n const name = option.attributeName();\n\n // store default value\n if (option.negate) {\n // --no-foo is special and defaults foo to true, unless a --foo option is already defined\n const positiveLongFlag = option.long.replace(/^--no-/, '--');\n if (!this._findOption(positiveLongFlag)) {\n this.setOptionValueWithSource(\n name,\n option.defaultValue === undefined ? true : option.defaultValue,\n 'default',\n );\n }\n } else if (option.defaultValue !== undefined) {\n this.setOptionValueWithSource(name, option.defaultValue, 'default');\n }\n\n // handler for cli and env supplied values\n const handleOptionValue = (val, invalidValueMessage, valueSource) => {\n // val is null for optional option used without an optional-argument.\n // val is undefined for boolean and negated option.\n if (val == null && option.presetArg !== undefined) {\n val = option.presetArg;\n }\n\n // custom processing\n const oldValue = this.getOptionValue(name);\n if (val !== null && option.parseArg) {\n val = this._callParseArg(option, val, oldValue, invalidValueMessage);\n } else if (val !== null && option.variadic) {\n val = option._collectValue(val, oldValue);\n }\n\n // Fill-in appropriate missing values. Long winded but easy to follow.\n if (val == null) {\n if (option.negate) {\n val = false;\n } else if (option.isBoolean() || option.optional) {\n val = true;\n } else {\n val = ''; // not normal, parseArg might have failed or be a mock function for testing\n }\n }\n this.setOptionValueWithSource(name, val, valueSource);\n };\n\n this.on('option:' + oname, (val) => {\n const invalidValueMessage = `error: option '${option.flags}' argument '${val}' is invalid.`;\n handleOptionValue(val, invalidValueMessage, 'cli');\n });\n\n if (option.envVar) {\n this.on('optionEnv:' + oname, (val) => {\n const invalidValueMessage = `error: option '${option.flags}' value '${val}' from env '${option.envVar}' is invalid.`;\n handleOptionValue(val, invalidValueMessage, 'env');\n });\n }\n\n return this;\n }\n\n /**\n * Internal implementation shared by .option() and .requiredOption()\n *\n * @return {Command} `this` command for chaining\n * @private\n */\n _optionEx(config, flags, description, fn, defaultValue) {\n if (typeof flags === 'object' && flags instanceof Option) {\n throw new Error(\n 'To add an Option object use addOption() instead of option() or requiredOption()',\n );\n }\n const option = this.createOption(flags, description);\n option.makeOptionMandatory(!!config.mandatory);\n if (typeof fn === 'function') {\n option.default(defaultValue).argParser(fn);\n } else if (fn instanceof RegExp) {\n // deprecated\n const regex = fn;\n fn = (val, def) => {\n const m = regex.exec(val);\n return m ? m[0] : def;\n };\n option.default(defaultValue).argParser(fn);\n } else {\n option.default(fn);\n }\n\n return this.addOption(option);\n }\n\n /**\n * Define option with `flags`, `description`, and optional argument parsing function or `defaultValue` or both.\n *\n * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. A required\n * option-argument is indicated by `<>` and an optional option-argument by `[]`.\n *\n * See the README for more details, and see also addOption() and requiredOption().\n *\n * @example\n * program\n * .option('-p, --pepper', 'add pepper')\n * .option('--pt, --pizza-type <TYPE>', 'type of pizza') // required option-argument\n * .option('-c, --cheese [CHEESE]', 'add extra cheese', 'mozzarella') // optional option-argument with default\n * .option('-t, --tip <VALUE>', 'add tip to purchase cost', parseFloat) // custom parse function\n *\n * @param {string} flags\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom option processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n\n option(flags, description, parseArg, defaultValue) {\n return this._optionEx({}, flags, description, parseArg, defaultValue);\n }\n\n /**\n * Add a required option which must have a value after parsing. This usually means\n * the option must be specified on the command line. (Otherwise the same as .option().)\n *\n * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space.\n *\n * @param {string} flags\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom option processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n\n requiredOption(flags, description, parseArg, defaultValue) {\n return this._optionEx(\n { mandatory: true },\n flags,\n description,\n parseArg,\n defaultValue,\n );\n }\n\n /**\n * Alter parsing of short flags with optional values.\n *\n * @example\n * // for `.option('-f,--flag [value]'):\n * program.combineFlagAndOptionalValue(true); // `-f80` is treated like `--flag=80`, this is the default behaviour\n * program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b`\n *\n * @param {boolean} [combine] - if `true` or omitted, an optional value can be specified directly after the flag.\n * @return {Command} `this` command for chaining\n */\n combineFlagAndOptionalValue(combine = true) {\n this._combineFlagAndOptionalValue = !!combine;\n return this;\n }\n\n /**\n * Allow unknown options on the command line.\n *\n * @param {boolean} [allowUnknown] - if `true` or omitted, no error will be thrown for unknown options.\n * @return {Command} `this` command for chaining\n */\n allowUnknownOption(allowUnknown = true) {\n this._allowUnknownOption = !!allowUnknown;\n return this;\n }\n\n /**\n * Allow excess command-arguments on the command line. Pass false to make excess arguments an error.\n *\n * @param {boolean} [allowExcess] - if `true` or omitted, no error will be thrown for excess arguments.\n * @return {Command} `this` command for chaining\n */\n allowExcessArguments(allowExcess = true) {\n this._allowExcessArguments = !!allowExcess;\n return this;\n }\n\n /**\n * Enable positional options. Positional means global options are specified before subcommands which lets\n * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions.\n * The default behaviour is non-positional and global options may appear anywhere on the command line.\n *\n * @param {boolean} [positional]\n * @return {Command} `this` command for chaining\n */\n enablePositionalOptions(positional = true) {\n this._enablePositionalOptions = !!positional;\n return this;\n }\n\n /**\n * Pass through options that come after command-arguments rather than treat them as command-options,\n * so actual command-options come before command-arguments. Turning this on for a subcommand requires\n * positional options to have been enabled on the program (parent commands).\n * The default behaviour is non-positional and options may appear before or after command-arguments.\n *\n * @param {boolean} [passThrough] for unknown options.\n * @return {Command} `this` command for chaining\n */\n passThroughOptions(passThrough = true) {\n this._passThroughOptions = !!passThrough;\n this._checkForBrokenPassThrough();\n return this;\n }\n\n /**\n * @private\n */\n\n _checkForBrokenPassThrough() {\n if (\n this.parent &&\n this._passThroughOptions &&\n !this.parent._enablePositionalOptions\n ) {\n throw new Error(\n `passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`,\n );\n }\n }\n\n /**\n * Whether to store option values as properties on command object,\n * or store separately (specify false). In both cases the option values can be accessed using .opts().\n *\n * @param {boolean} [storeAsProperties=true]\n * @return {Command} `this` command for chaining\n */\n\n storeOptionsAsProperties(storeAsProperties = true) {\n if (this.options.length) {\n throw new Error('call .storeOptionsAsProperties() before adding options');\n }\n if (Object.keys(this._optionValues).length) {\n throw new Error(\n 'call .storeOptionsAsProperties() before setting option values',\n );\n }\n this._storeOptionsAsProperties = !!storeAsProperties;\n return this;\n }\n\n /**\n * Retrieve option value.\n *\n * @param {string} key\n * @return {object} value\n */\n\n getOptionValue(key) {\n if (this._storeOptionsAsProperties) {\n return this[key];\n }\n return this._optionValues[key];\n }\n\n /**\n * Store option value.\n *\n * @param {string} key\n * @param {object} value\n * @return {Command} `this` command for chaining\n */\n\n setOptionValue(key, value) {\n return this.setOptionValueWithSource(key, value, undefined);\n }\n\n /**\n * Store option value and where the value came from.\n *\n * @param {string} key\n * @param {object} value\n * @param {string} source - expected values are default/config/env/cli/implied\n * @return {Command} `this` command for chaining\n */\n\n setOptionValueWithSource(key, value, source) {\n if (this._storeOptionsAsProperties) {\n this[key] = value;\n } else {\n this._optionValues[key] = value;\n }\n this._optionValueSources[key] = source;\n return this;\n }\n\n /**\n * Get source of option value.\n * Expected values are default | config | env | cli | implied\n *\n * @param {string} key\n * @return {string}\n */\n\n getOptionValueSource(key) {\n return this._optionValueSources[key];\n }\n\n /**\n * Get source of option value. See also .optsWithGlobals().\n * Expected values are default | config | env | cli | implied\n *\n * @param {string} key\n * @return {string}\n */\n\n getOptionValueSourceWithGlobals(key) {\n // global overwrites local, like optsWithGlobals\n let source;\n this._getCommandAndAncestors().forEach((cmd) => {\n if (cmd.getOptionValueSource(key) !== undefined) {\n source = cmd.getOptionValueSource(key);\n }\n });\n return source;\n }\n\n /**\n * Get user arguments from implied or explicit arguments.\n * Side-effects: set _scriptPath if args included script. Used for default program name, and subcommand searches.\n *\n * @private\n */\n\n _prepareUserArgs(argv, parseOptions) {\n if (argv !== undefined && !Array.isArray(argv)) {\n throw new Error('first parameter to parse must be array or undefined');\n }\n parseOptions = parseOptions || {};\n\n // auto-detect argument conventions if nothing supplied\n if (argv === undefined && parseOptions.from === undefined) {\n if (process.versions?.electron) {\n parseOptions.from = 'electron';\n }\n // check node specific options for scenarios where user CLI args follow executable without scriptname\n const execArgv = process.execArgv ?? [];\n if (\n execArgv.includes('-e') ||\n execArgv.includes('--eval') ||\n execArgv.includes('-p') ||\n execArgv.includes('--print')\n ) {\n parseOptions.from = 'eval'; // internal usage, not documented\n }\n }\n\n // default to using process.argv\n if (argv === undefined) {\n argv = process.argv;\n }\n this.rawArgs = argv.slice();\n\n // extract the user args and scriptPath\n let userArgs;\n switch (parseOptions.from) {\n case undefined:\n case 'node':\n this._scriptPath = argv[1];\n userArgs = argv.slice(2);\n break;\n case 'electron':\n // @ts-ignore: because defaultApp is an unknown property\n if (process.defaultApp) {\n this._scriptPath = argv[1];\n userArgs = argv.slice(2);\n } else {\n userArgs = argv.slice(1);\n }\n break;\n case 'user':\n userArgs = argv.slice(0);\n break;\n case 'eval':\n userArgs = argv.slice(1);\n break;\n default:\n throw new Error(\n `unexpected parse option { from: '${parseOptions.from}' }`,\n );\n }\n\n // Find default name for program from arguments.\n if (!this._name && this._scriptPath)\n this.nameFromFilename(this._scriptPath);\n this._name = this._name || 'program';\n\n return userArgs;\n }\n\n /**\n * Parse `argv`, setting options and invoking commands when defined.\n *\n * Use parseAsync instead of parse if any of your action handlers are async.\n *\n * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!\n *\n * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:\n * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that\n * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged\n * - `'user'`: just user arguments\n *\n * @example\n * program.parse(); // parse process.argv and auto-detect electron and special node flags\n * program.parse(process.argv); // assume argv[0] is app and argv[1] is script\n * program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]\n *\n * @param {string[]} [argv] - optional, defaults to process.argv\n * @param {object} [parseOptions] - optionally specify style of options with from: node/user/electron\n * @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron'\n * @return {Command} `this` command for chaining\n */\n\n parse(argv, parseOptions) {\n this._prepareForParse();\n const userArgs = this._prepareUserArgs(argv, parseOptions);\n this._parseCommand([], userArgs);\n\n return this;\n }\n\n /**\n * Parse `argv`, setting options and invoking commands when defined.\n *\n * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!\n *\n * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:\n * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that\n * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged\n * - `'user'`: just user arguments\n *\n * @example\n * await program.parseAsync(); // parse process.argv and auto-detect electron and special node flags\n * await program.parseAsync(process.argv); // assume argv[0] is app and argv[1] is script\n * await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]\n *\n * @param {string[]} [argv]\n * @param {object} [parseOptions]\n * @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron'\n * @return {Promise}\n */\n\n async parseAsync(argv, parseOptions) {\n this._prepareForParse();\n const userArgs = this._prepareUserArgs(argv, parseOptions);\n await this._parseCommand([], userArgs);\n\n return this;\n }\n\n _prepareForParse() {\n if (this._savedState === null) {\n this.saveStateBeforeParse();\n } else {\n this.restoreStateBeforeParse();\n }\n }\n\n /**\n * Called the first time parse is called to save state and allow a restore before subsequent calls to parse.\n * Not usually called directly, but available for subclasses to save their custom state.\n *\n * This is called in a lazy way. Only commands used in parsing chain will have state saved.\n */\n saveStateBeforeParse() {\n this._savedState = {\n // name is stable if supplied by author, but may be unspecified for root command and deduced during parsing\n _name: this._name,\n // option values before parse have default values (including false for negated options)\n // shallow clones\n _optionValues: { ...this._optionValues },\n _optionValueSources: { ...this._optionValueSources },\n };\n }\n\n /**\n * Restore state before parse for calls after the first.\n * Not usually called directly, but available for subclasses to save their custom state.\n *\n * This is called in a lazy way. Only commands used in parsing chain will have state restored.\n */\n restoreStateBeforeParse() {\n if (this._storeOptionsAsProperties)\n throw new Error(`Can not call parse again when storeOptionsAsProperties is true.\n- either make a new Command for each call to parse, or stop storing options as properties`);\n\n // clear state from _prepareUserArgs\n this._name = this._savedState._name;\n this._scriptPath = null;\n this.rawArgs = [];\n // clear state from setOptionValueWithSource\n this._optionValues = { ...this._savedState._optionValues };\n this._optionValueSources = { ...this._savedState._optionValueSources };\n // clear state from _parseCommand\n this.args = [];\n // clear state from _processArguments\n this.processedArgs = [];\n }\n\n /**\n * Throw if expected executable is missing. Add lots of help for author.\n *\n * @param {string} executableFile\n * @param {string} executableDir\n * @param {string} subcommandName\n */\n _checkForMissingExecutable(executableFile, executableDir, subcommandName) {\n if (fs.existsSync(executableFile)) return;\n\n const executableDirMessage = executableDir\n ? `searched for local subcommand relative to directory '${executableDir}'`\n : 'no directory for search for local subcommand, use .executableDir() to supply a custom directory';\n const executableMissing = `'${executableFile}' does not exist\n - if '${subcommandName}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead\n - if the default executable name is not suitable, use the executableFile option to supply a custom name or path\n - ${executableDirMessage}`;\n throw new Error(executableMissing);\n }\n\n /**\n * Execute a sub-command executable.\n *\n * @private\n */\n\n _executeSubCommand(subcommand, args) {\n args = args.slice();\n let launchWithNode = false; // Use node for source targets so do not need to get permissions correct, and on Windows.\n const sourceExt = ['.js', '.ts', '.tsx', '.mjs', '.cjs'];\n\n function findFile(baseDir, baseName) {\n // Look for specified file\n const localBin = path.resolve(baseDir, baseName);\n if (fs.existsSync(localBin)) return localBin;\n\n // Stop looking if candidate already has an expected extension.\n if (sourceExt.includes(path.extname(baseName))) return undefined;\n\n // Try all the extensions.\n const foundExt = sourceExt.find((ext) =>\n fs.existsSync(`${localBin}${ext}`),\n );\n if (foundExt) return `${localBin}${foundExt}`;\n\n return undefined;\n }\n\n // Not checking for help first. Unlikely to have mandatory and executable, and can't robustly test for help flags in external command.\n this._checkForMissingMandatoryOptions();\n this._checkForConflictingOptions();\n\n // executableFile and executableDir might be full path, or just a name\n let executableFile =\n subcommand._executableFile || `${this._name}-${subcommand._name}`;\n let executableDir = this._executableDir || '';\n if (this._scriptPath) {\n let resolvedScriptPath; // resolve possible symlink for installed npm binary\n try {\n resolvedScriptPath = fs.realpathSync(this._scriptPath);\n } catch {\n resolvedScriptPath = this._scriptPath;\n }\n executableDir = path.resolve(\n path.dirname(resolvedScriptPath),\n executableDir,\n );\n }\n\n // Look for a local file in preference to a command in PATH.\n if (executableDir) {\n let localFile = findFile(executableDir, executableFile);\n\n // Legacy search using prefix of script name instead of command name\n if (!localFile && !subcommand._executableFile && this._scriptPath) {\n const legacyName = path.basename(\n this._scriptPath,\n path.extname(this._scriptPath),\n );\n if (legacyName !== this._name) {\n localFile = findFile(\n executableDir,\n `${legacyName}-${subcommand._name}`,\n );\n }\n }\n executableFile = localFile || executableFile;\n }\n\n launchWithNode = sourceExt.includes(path.extname(executableFile));\n\n let proc;\n if (process.platform !== 'win32') {\n if (launchWithNode) {\n args.unshift(executableFile);\n // add executable arguments to spawn\n args = incrementNodeInspectorPort(process.execArgv).concat(args);\n\n proc = childProcess.spawn(process.argv[0], args, { stdio: 'inherit' });\n } else {\n proc = childProcess.spawn(executableFile, args, { stdio: 'inherit' });\n }\n } else {\n this._checkForMissingExecutable(\n executableFile,\n executableDir,\n subcommand._name,\n );\n args.unshift(executableFile);\n // add executable arguments to spawn\n args = incrementNodeInspectorPort(process.execArgv).concat(args);\n proc = childProcess.spawn(process.execPath, args, { stdio: 'inherit' });\n }\n\n if (!proc.killed) {\n // testing mainly to avoid leak warnings during unit tests with mocked spawn\n const signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];\n signals.forEach((signal) => {\n process.on(signal, () => {\n if (proc.killed === false && proc.exitCode === null) {\n // @ts-ignore because signals not typed to known strings\n proc.kill(signal);\n }\n });\n });\n }\n\n // By default terminate process when spawned process terminates.\n const exitCallback = this._exitCallback;\n proc.on('close', (code) => {\n code = code ?? 1; // code is null if spawned process terminated due to a signal\n if (!exitCallback) {\n process.exit(code);\n } else {\n exitCallback(\n new CommanderError(\n code,\n 'commander.executeSubCommandAsync',\n '(close)',\n ),\n );\n }\n });\n proc.on('error', (err) => {\n // @ts-ignore: because err.code is an unknown property\n if (err.code === 'ENOENT') {\n this._checkForMissingExecutable(\n executableFile,\n executableDir,\n subcommand._name,\n );\n // @ts-ignore: because err.code is an unknown property\n } else if (err.code === 'EACCES') {\n throw new Error(`'${executableFile}' not executable`);\n }\n if (!exitCallback) {\n process.exit(1);\n } else {\n const wrappedError = new CommanderError(\n 1,\n 'commander.executeSubCommandAsync',\n '(error)',\n );\n wrappedError.nestedError = err;\n exitCallback(wrappedError);\n }\n });\n\n // Store the reference to the child process\n this.runningCommand = proc;\n }\n\n /**\n * @private\n */\n\n _dispatchSubcommand(commandName, operands, unknown) {\n const subCommand = this._findCommand(commandName);\n if (!subCommand) this.help({ error: true });\n\n subCommand._prepareForParse();\n let promiseChain;\n promiseChain = this._chainOrCallSubCommandHook(\n promiseChain,\n subCommand,\n 'preSubcommand',\n );\n promiseChain = this._chainOrCall(promiseChain, () => {\n if (subCommand._executableHandler) {\n this._executeSubCommand(subCommand, operands.concat(unknown));\n } else {\n return subCommand._parseCommand(operands, unknown);\n }\n });\n return promiseChain;\n }\n\n /**\n * Invoke help directly if possible, or dispatch if necessary.\n * e.g. help foo\n *\n * @private\n */\n\n _dispatchHelpCommand(subcommandName) {\n if (!subcommandName) {\n this.help();\n }\n const subCommand = this._findCommand(subcommandName);\n if (subCommand && !subCommand._executableHandler) {\n subCommand.help();\n }\n\n // Fallback to parsing the help flag to invoke the help.\n return this._dispatchSubcommand(\n subcommandName,\n [],\n [this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? '--help'],\n );\n }\n\n /**\n * Check this.args against expected this.registeredArguments.\n *\n * @private\n */\n\n _checkNumberOfArguments() {\n // too few\n this.registeredArguments.forEach((arg, i) => {\n if (arg.required && this.args[i] == null) {\n this.missingArgument(arg.name());\n }\n });\n // too many\n if (\n this.registeredArguments.length > 0 &&\n this.registeredArguments[this.registeredArguments.length - 1].variadic\n ) {\n return;\n }\n if (this.args.length > this.registeredArguments.length) {\n this._excessArguments(this.args);\n }\n }\n\n /**\n * Process this.args using this.registeredArguments and save as this.processedArgs!\n *\n * @private\n */\n\n _processArguments() {\n const myParseArg = (argument, value, previous) => {\n // Extra processing for nice error message on parsing failure.\n let parsedValue = value;\n if (value !== null && argument.parseArg) {\n const invalidValueMessage = `error: command-argument value '${value}' is invalid for argument '${argument.name()}'.`;\n parsedValue = this._callParseArg(\n argument,\n value,\n previous,\n invalidValueMessage,\n );\n }\n return parsedValue;\n };\n\n this._checkNumberOfArguments();\n\n const processedArgs = [];\n this.registeredArguments.forEach((declaredArg, index) => {\n let value = declaredArg.defaultValue;\n if (declaredArg.variadic) {\n // Collect together remaining arguments for passing together as an array.\n if (index < this.args.length) {\n value = this.args.slice(index);\n if (declaredArg.parseArg) {\n value = value.reduce((processed, v) => {\n return myParseArg(declaredArg, v, processed);\n }, declaredArg.defaultValue);\n }\n } else if (value === undefined) {\n value = [];\n }\n } else if (index < this.args.length) {\n value = this.args[index];\n if (declaredArg.parseArg) {\n value = myParseArg(declaredArg, value, declaredArg.defaultValue);\n }\n }\n processedArgs[index] = value;\n });\n this.processedArgs = processedArgs;\n }\n\n /**\n * Once we have a promise we chain, but call synchronously until then.\n *\n * @param {(Promise|undefined)} promise\n * @param {Function} fn\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCall(promise, fn) {\n // thenable\n if (promise?.then && typeof promise.then === 'function') {\n // already have a promise, chain callback\n return promise.then(() => fn());\n }\n // callback might return a promise\n return fn();\n }\n\n /**\n *\n * @param {(Promise|undefined)} promise\n * @param {string} event\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCallHooks(promise, event) {\n let result = promise;\n const hooks = [];\n this._getCommandAndAncestors()\n .reverse()\n .filter((cmd) => cmd._lifeCycleHooks[event] !== undefined)\n .forEach((hookedCommand) => {\n hookedCommand._lifeCycleHooks[event].forEach((callback) => {\n hooks.push({ hookedCommand, callback });\n });\n });\n if (event === 'postAction') {\n hooks.reverse();\n }\n\n hooks.forEach((hookDetail) => {\n result = this._chainOrCall(result, () => {\n return hookDetail.callback(hookDetail.hookedCommand, this);\n });\n });\n return result;\n }\n\n /**\n *\n * @param {(Promise|undefined)} promise\n * @param {Command} subCommand\n * @param {string} event\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCallSubCommandHook(promise, subCommand, event) {\n let result = promise;\n if (this._lifeCycleHooks[event] !== undefined) {\n this._lifeCycleHooks[event].forEach((hook) => {\n result = this._chainOrCall(result, () => {\n return hook(this, subCommand);\n });\n });\n }\n return result;\n }\n\n /**\n * Process arguments in context of this command.\n * Returns action result, in case it is a promise.\n *\n * @private\n */\n\n _parseCommand(operands, unknown) {\n const parsed = this.parseOptions(unknown);\n this._parseOptionsEnv(); // after cli, so parseArg not called on both cli and env\n this._parseOptionsImplied();\n operands = operands.concat(parsed.operands);\n unknown = parsed.unknown;\n this.args = operands.concat(unknown);\n\n if (operands && this._findCommand(operands[0])) {\n return this._dispatchSubcommand(operands[0], operands.slice(1), unknown);\n }\n if (\n this._getHelpCommand() &&\n operands[0] === this._getHelpCommand().name()\n ) {\n return this._dispatchHelpCommand(operands[1]);\n }\n if (this._defaultCommandName) {\n this._outputHelpIfRequested(unknown); // Run the help for default command from parent rather than passing to default command\n return this._dispatchSubcommand(\n this._defaultCommandName,\n operands,\n unknown,\n );\n }\n if (\n this.commands.length &&\n this.args.length === 0 &&\n !this._actionHandler &&\n !this._defaultCommandName\n ) {\n // probably missing subcommand and no handler, user needs help (and exit)\n this.help({ error: true });\n }\n\n this._outputHelpIfRequested(parsed.unknown);\n this._checkForMissingMandatoryOptions();\n this._checkForConflictingOptions();\n\n // We do not always call this check to avoid masking a \"better\" error, like unknown command.\n const checkForUnknownOptions = () => {\n if (parsed.unknown.length > 0) {\n this.unknownOption(parsed.unknown[0]);\n }\n };\n\n const commandEvent = `command:${this.name()}`;\n if (this._actionHandler) {\n checkForUnknownOptions();\n this._processArguments();\n\n let promiseChain;\n promiseChain = this._chainOrCallHooks(promiseChain, 'preAction');\n promiseChain = this._chainOrCall(promiseChain, () =>\n this._actionHandler(this.processedArgs),\n );\n if (this.parent) {\n promiseChain = this._chainOrCall(promiseChain, () => {\n this.parent.emit(commandEvent, operands, unknown); // legacy\n });\n }\n promiseChain = this._chainOrCallHooks(promiseChain, 'postAction');\n return promiseChain;\n }\n if (this.parent?.listenerCount(commandEvent)) {\n checkForUnknownOptions();\n this._processArguments();\n this.parent.emit(commandEvent, operands, unknown); // legacy\n } else if (operands.length) {\n if (this._findCommand('*')) {\n // legacy default command\n return this._dispatchSubcommand('*', operands, unknown);\n }\n if (this.listenerCount('command:*')) {\n // skip option check, emit event for possible misspelling suggestion\n this.emit('command:*', operands, unknown);\n } else if (this.commands.length) {\n this.unknownCommand();\n } else {\n checkForUnknownOptions();\n this._processArguments();\n }\n } else if (this.commands.length) {\n checkForUnknownOptions();\n // This command has subcommands and nothing hooked up at this level, so display help (and exit).\n this.help({ error: true });\n } else {\n checkForUnknownOptions();\n this._processArguments();\n // fall through for caller to handle after calling .parse()\n }\n }\n\n /**\n * Find matching command.\n *\n * @private\n * @return {Command | undefined}\n */\n _findCommand(name) {\n if (!name) return undefined;\n return this.commands.find(\n (cmd) => cmd._name === name || cmd._aliases.includes(name),\n );\n }\n\n /**\n * Return an option matching `arg` if any.\n *\n * @param {string} arg\n * @return {Option}\n * @package\n */\n\n _findOption(arg) {\n return this.options.find((option) => option.is(arg));\n }\n\n /**\n * Display an error message if a mandatory option does not have a value.\n * Called after checking for help flags in leaf subcommand.\n *\n * @private\n */\n\n _checkForMissingMandatoryOptions() {\n // Walk up hierarchy so can call in subcommand after checking for displaying help.\n this._getCommandAndAncestors().forEach((cmd) => {\n cmd.options.forEach((anOption) => {\n if (\n anOption.mandatory &&\n cmd.getOptionValue(anOption.attributeName()) === undefined\n ) {\n cmd.missingMandatoryOptionValue(anOption);\n }\n });\n });\n }\n\n /**\n * Display an error message if conflicting options are used together in this.\n *\n * @private\n */\n _checkForConflictingLocalOptions() {\n const definedNonDefaultOptions = this.options.filter((option) => {\n const optionKey = option.attributeName();\n if (this.getOptionValue(optionKey) === undefined) {\n return false;\n }\n return this.getOptionValueSource(optionKey) !== 'default';\n });\n\n const optionsWithConflicting = definedNonDefaultOptions.filter(\n (option) => option.conflictsWith.length > 0,\n );\n\n optionsWithConflicting.forEach((option) => {\n const conflictingAndDefined = definedNonDefaultOptions.find((defined) =>\n option.conflictsWith.includes(defined.attributeName()),\n );\n if (conflictingAndDefined) {\n this._conflictingOption(option, conflictingAndDefined);\n }\n });\n }\n\n /**\n * Display an error message if conflicting options are used together.\n * Called after checking for help flags in leaf subcommand.\n *\n * @private\n */\n _checkForConflictingOptions() {\n // Walk up hierarchy so can call in subcommand after checking for displaying help.\n this._getCommandAndAncestors().forEach((cmd) => {\n cmd._checkForConflictingLocalOptions();\n });\n }\n\n /**\n * Parse options from `argv` removing known options,\n * and return argv split into operands and unknown arguments.\n *\n * Side effects: modifies command by storing options. Does not reset state if called again.\n *\n * Examples:\n *\n * argv => operands, unknown\n * --known kkk op => [op], []\n * op --known kkk => [op], []\n * sub --unknown uuu op => [sub], [--unknown uuu op]\n * sub -- --unknown uuu op => [sub --unknown uuu op], []\n *\n * @param {string[]} args\n * @return {{operands: string[], unknown: string[]}}\n */\n\n parseOptions(args) {\n const operands = []; // operands, not options or values\n const unknown = []; // first unknown option and remaining unknown args\n let dest = operands;\n\n function maybeOption(arg) {\n return arg.length > 1 && arg[0] === '-';\n }\n\n const negativeNumberArg = (arg) => {\n // return false if not a negative number\n if (!/^-(\\d+|\\d*\\.\\d+)(e[+-]?\\d+)?$/.test(arg)) return false;\n // negative number is ok unless digit used as an option in command hierarchy\n return !this._getCommandAndAncestors().some((cmd) =>\n cmd.options\n .map((opt) => opt.short)\n .some((short) => /^-\\d$/.test(short)),\n );\n };\n\n // parse options\n let activeVariadicOption = null;\n let activeGroup = null; // working through group of short options, like -abc\n let i = 0;\n while (i < args.length || activeGroup) {\n const arg = activeGroup ?? args[i++];\n activeGroup = null;\n\n // literal\n if (arg === '--') {\n if (dest === unknown) dest.push(arg);\n dest.push(...args.slice(i));\n break;\n }\n\n if (\n activeVariadicOption &&\n (!maybeOption(arg) || negativeNumberArg(arg))\n ) {\n this.emit(`option:${activeVariadicOption.name()}`, arg);\n continue;\n }\n activeVariadicOption = null;\n\n if (maybeOption(arg)) {\n const option = this._findOption(arg);\n // recognised option, call listener to assign value with possible custom processing\n if (option) {\n if (option.required) {\n const value = args[i++];\n if (value === undefined) this.optionMissingArgument(option);\n this.emit(`option:${option.name()}`, value);\n } else if (option.optional) {\n let value = null;\n // historical behaviour is optional value is following arg unless an option\n if (\n i < args.length &&\n (!maybeOption(args[i]) || negativeNumberArg(args[i]))\n ) {\n value = args[i++];\n }\n this.emit(`option:${option.name()}`, value);\n } else {\n // boolean flag\n this.emit(`option:${option.name()}`);\n }\n activeVariadicOption = option.variadic ? option : null;\n continue;\n }\n }\n\n // Look for combo options following single dash, eat first one if known.\n if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') {\n const option = this._findOption(`-${arg[1]}`);\n if (option) {\n if (\n option.required ||\n (option.optional && this._combineFlagAndOptionalValue)\n ) {\n // option with value following in same argument\n this.emit(`option:${option.name()}`, arg.slice(2));\n } else {\n // boolean option\n this.emit(`option:${option.name()}`);\n // remove the processed option and keep processing group\n activeGroup = `-${arg.slice(2)}`;\n }\n continue;\n }\n }\n\n // Look for known long flag with value, like --foo=bar\n if (/^--[^=]+=/.test(arg)) {\n const index = arg.indexOf('=');\n const option = this._findOption(arg.slice(0, index));\n if (option && (option.required || option.optional)) {\n this.emit(`option:${option.name()}`, arg.slice(index + 1));\n continue;\n }\n }\n\n // Not a recognised option by this command.\n // Might be a command-argument, or subcommand option, or unknown option, or help command or option.\n\n // An unknown option means further arguments also classified as unknown so can be reprocessed by subcommands.\n // A negative number in a leaf command is not an unknown option.\n if (\n dest === operands &&\n maybeOption(arg) &&\n !(this.commands.length === 0 && negativeNumberArg(arg))\n ) {\n dest = unknown;\n }\n\n // If using positionalOptions, stop processing our options at subcommand.\n if (\n (this._enablePositionalOptions || this._passThroughOptions) &&\n operands.length === 0 &&\n unknown.length === 0\n ) {\n if (this._findCommand(arg)) {\n operands.push(arg);\n unknown.push(...args.slice(i));\n break;\n } else if (\n this._getHelpCommand() &&\n arg === this._getHelpCommand().name()\n ) {\n operands.push(arg, ...args.slice(i));\n break;\n } else if (this._defaultCommandName) {\n unknown.push(arg, ...args.slice(i));\n break;\n }\n }\n\n // If using passThroughOptions, stop processing options at first command-argument.\n if (this._passThroughOptions) {\n dest.push(arg, ...args.slice(i));\n break;\n }\n\n // add arg\n dest.push(arg);\n }\n\n return { operands, unknown };\n }\n\n /**\n * Return an object containing local option values as key-value pairs.\n *\n * @return {object}\n */\n opts() {\n if (this._storeOptionsAsProperties) {\n // Preserve original behaviour so backwards compatible when still using properties\n const result = {};\n const len = this.options.length;\n\n for (let i = 0; i < len; i++) {\n const key = this.options[i].attributeName();\n result[key] =\n key === this._versionOptionName ? this._version : this[key];\n }\n return result;\n }\n\n return this._optionValues;\n }\n\n /**\n * Return an object containing merged local and global option values as key-value pairs.\n *\n * @return {object}\n */\n optsWithGlobals() {\n // globals overwrite locals\n return this._getCommandAndAncestors().reduce(\n (combinedOptions, cmd) => Object.assign(combinedOptions, cmd.opts()),\n {},\n );\n }\n\n /**\n * Display error message and exit (or call exitOverride).\n *\n * @param {string} message\n * @param {object} [errorOptions]\n * @param {string} [errorOptions.code] - an id string representing the error\n * @param {number} [errorOptions.exitCode] - used with process.exit\n */\n error(message, errorOptions) {\n // output handling\n this._outputConfiguration.outputError(\n `${message}\\n`,\n this._outputConfiguration.writeErr,\n );\n if (typeof this._showHelpAfterError === 'string') {\n this._outputConfiguration.writeErr(`${this._showHelpAfterError}\\n`);\n } else if (this._showHelpAfterError) {\n this._outputConfiguration.writeErr('\\n');\n this.outputHelp({ error: true });\n }\n\n // exit handling\n const config = errorOptions || {};\n const exitCode = config.exitCode || 1;\n const code = config.code || 'commander.error';\n this._exit(exitCode, code, message);\n }\n\n /**\n * Apply any option related environment variables, if option does\n * not have a value from cli or client code.\n *\n * @private\n */\n _parseOptionsEnv() {\n this.options.forEach((option) => {\n if (option.envVar && option.envVar in process.env) {\n const optionKey = option.attributeName();\n // Priority check. Do not overwrite cli or options from unknown source (client-code).\n if (\n this.getOptionValue(optionKey) === undefined ||\n ['default', 'config', 'env'].includes(\n this.getOptionValueSource(optionKey),\n )\n ) {\n if (option.required || option.optional) {\n // option can take a value\n // keep very simple, optional always takes value\n this.emit(`optionEnv:${option.name()}`, process.env[option.envVar]);\n } else {\n // boolean\n // keep very simple, only care that envVar defined and not the value\n this.emit(`optionEnv:${option.name()}`);\n }\n }\n }\n });\n }\n\n /**\n * Apply any implied option values, if option is undefined or default value.\n *\n * @private\n */\n _parseOptionsImplied() {\n const dualHelper = new DualOptions(this.options);\n const hasCustomOptionValue = (optionKey) => {\n return (\n this.getOptionValue(optionKey) !== undefined &&\n !['default', 'implied'].includes(this.getOptionValueSource(optionKey))\n );\n };\n this.options\n .filter(\n (option) =>\n option.implied !== undefined &&\n hasCustomOptionValue(option.attributeName()) &&\n dualHelper.valueFromOption(\n this.getOptionValue(option.attributeName()),\n option,\n ),\n )\n .forEach((option) => {\n Object.keys(option.implied)\n .filter((impliedKey) => !hasCustomOptionValue(impliedKey))\n .forEach((impliedKey) => {\n this.setOptionValueWithSource(\n impliedKey,\n option.implied[impliedKey],\n 'implied',\n );\n });\n });\n }\n\n /**\n * Argument `name` is missing.\n *\n * @param {string} name\n * @private\n */\n\n missingArgument(name) {\n const message = `error: missing required argument '${name}'`;\n this.error(message, { code: 'commander.missingArgument' });\n }\n\n /**\n * `Option` is missing an argument.\n *\n * @param {Option} option\n * @private\n */\n\n optionMissingArgument(option) {\n const message = `error: option '${option.flags}' argument missing`;\n this.error(message, { code: 'commander.optionMissingArgument' });\n }\n\n /**\n * `Option` does not have a value, and is a mandatory option.\n *\n * @param {Option} option\n * @private\n */\n\n missingMandatoryOptionValue(option) {\n const message = `error: required option '${option.flags}' not specified`;\n this.error(message, { code: 'commander.missingMandatoryOptionValue' });\n }\n\n /**\n * `Option` conflicts with another option.\n *\n * @param {Option} option\n * @param {Option} conflictingOption\n * @private\n */\n _conflictingOption(option, conflictingOption) {\n // The calling code does not know whether a negated option is the source of the\n // value, so do some work to take an educated guess.\n const findBestOptionFromValue = (option) => {\n const optionKey = option.attributeName();\n const optionValue = this.getOptionValue(optionKey);\n const negativeOption = this.options.find(\n (target) => target.negate && optionKey === target.attributeName(),\n );\n const positiveOption = this.options.find(\n (target) => !target.negate && optionKey === target.attributeName(),\n );\n if (\n negativeOption &&\n ((negativeOption.presetArg === undefined && optionValue === false) ||\n (negativeOption.presetArg !== undefined &&\n optionValue === negativeOption.presetArg))\n ) {\n return negativeOption;\n }\n return positiveOption || option;\n };\n\n const getErrorMessage = (option) => {\n const bestOption = findBestOptionFromValue(option);\n const optionKey = bestOption.attributeName();\n const source = this.getOptionValueSource(optionKey);\n if (source === 'env') {\n return `environment variable '${bestOption.envVar}'`;\n }\n return `option '${bestOption.flags}'`;\n };\n\n const message = `error: ${getErrorMessage(option)} cannot be used with ${getErrorMessage(conflictingOption)}`;\n this.error(message, { code: 'commander.conflictingOption' });\n }\n\n /**\n * Unknown option `flag`.\n *\n * @param {string} flag\n * @private\n */\n\n unknownOption(flag) {\n if (this._allowUnknownOption) return;\n let suggestion = '';\n\n if (flag.startsWith('--') && this._showSuggestionAfterError) {\n // Looping to pick up the global options too\n let candidateFlags = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let command = this;\n do {\n const moreFlags = command\n .createHelp()\n .visibleOptions(command)\n .filter((option) => option.long)\n .map((option) => option.long);\n candidateFlags = candidateFlags.concat(moreFlags);\n command = command.parent;\n } while (command && !command._enablePositionalOptions);\n suggestion = suggestSimilar(flag, candidateFlags);\n }\n\n const message = `error: unknown option '${flag}'${suggestion}`;\n this.error(message, { code: 'commander.unknownOption' });\n }\n\n /**\n * Excess arguments, more than expected.\n *\n * @param {string[]} receivedArgs\n * @private\n */\n\n _excessArguments(receivedArgs) {\n if (this._allowExcessArguments) return;\n\n const expected = this.registeredArguments.length;\n const s = expected === 1 ? '' : 's';\n const forSubcommand = this.parent ? ` for '${this.name()}'` : '';\n const message = `error: too many arguments${forSubcommand}. Expected ${expected} argument${s} but got ${receivedArgs.length}.`;\n this.error(message, { code: 'commander.excessArguments' });\n }\n\n /**\n * Unknown command.\n *\n * @private\n */\n\n unknownCommand() {\n const unknownName = this.args[0];\n let suggestion = '';\n\n if (this._showSuggestionAfterError) {\n const candidateNames = [];\n this.createHelp()\n .visibleCommands(this)\n .forEach((command) => {\n candidateNames.push(command.name());\n // just visible alias\n if (command.alias()) candidateNames.push(command.alias());\n });\n suggestion = suggestSimilar(unknownName, candidateNames);\n }\n\n const message = `error: unknown command '${unknownName}'${suggestion}`;\n this.error(message, { code: 'commander.unknownCommand' });\n }\n\n /**\n * Get or set the program version.\n *\n * This method auto-registers the \"-V, --version\" option which will print the version number.\n *\n * You can optionally supply the flags and description to override the defaults.\n *\n * @param {string} [str]\n * @param {string} [flags]\n * @param {string} [description]\n * @return {(this | string | undefined)} `this` command for chaining, or version string if no arguments\n */\n\n version(str, flags, description) {\n if (str === undefined) return this._version;\n this._version = str;\n flags = flags || '-V, --version';\n description = description || 'output the version number';\n const versionOption = this.createOption(flags, description);\n this._versionOptionName = versionOption.attributeName();\n this._registerOption(versionOption);\n\n this.on('option:' + versionOption.name(), () => {\n this._outputConfiguration.writeOut(`${str}\\n`);\n this._exit(0, 'commander.version', str);\n });\n return this;\n }\n\n /**\n * Set the description.\n *\n * @param {string} [str]\n * @param {object} [argsDescription]\n * @return {(string|Command)}\n */\n description(str, argsDescription) {\n if (str === undefined && argsDescription === undefined)\n return this._description;\n this._description = str;\n if (argsDescription) {\n this._argsDescription = argsDescription;\n }\n return this;\n }\n\n /**\n * Set the summary. Used when listed as subcommand of parent.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n summary(str) {\n if (str === undefined) return this._summary;\n this._summary = str;\n return this;\n }\n\n /**\n * Set an alias for the command.\n *\n * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help.\n *\n * @param {string} [alias]\n * @return {(string|Command)}\n */\n\n alias(alias) {\n if (alias === undefined) return this._aliases[0]; // just return first, for backwards compatibility\n\n /** @type {Command} */\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let command = this;\n if (\n this.commands.length !== 0 &&\n this.commands[this.commands.length - 1]._executableHandler\n ) {\n // assume adding alias for last added executable subcommand, rather than this\n command = this.commands[this.commands.length - 1];\n }\n\n if (alias === command._name)\n throw new Error(\"Command alias can't be the same as its name\");\n const matchingCommand = this.parent?._findCommand(alias);\n if (matchingCommand) {\n // c.f. _registerCommand\n const existingCmd = [matchingCommand.name()]\n .concat(matchingCommand.aliases())\n .join('|');\n throw new Error(\n `cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`,\n );\n }\n\n command._aliases.push(alias);\n return this;\n }\n\n /**\n * Set aliases for the command.\n *\n * Only the first alias is shown in the auto-generated help.\n *\n * @param {string[]} [aliases]\n * @return {(string[]|Command)}\n */\n\n aliases(aliases) {\n // Getter for the array of aliases is the main reason for having aliases() in addition to alias().\n if (aliases === undefined) return this._aliases;\n\n aliases.forEach((alias) => this.alias(alias));\n return this;\n }\n\n /**\n * Set / get the command usage `str`.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n\n usage(str) {\n if (str === undefined) {\n if (this._usage) return this._usage;\n\n const args = this.registeredArguments.map((arg) => {\n return humanReadableArgName(arg);\n });\n return []\n .concat(\n this.options.length || this._helpOption !== null ? '[options]' : [],\n this.commands.length ? '[command]' : [],\n this.registeredArguments.length ? args : [],\n )\n .join(' ');\n }\n\n this._usage = str;\n return this;\n }\n\n /**\n * Get or set the name of the command.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n\n name(str) {\n if (str === undefined) return this._name;\n this._name = str;\n return this;\n }\n\n /**\n * Set/get the help group heading for this subcommand in parent command's help.\n *\n * @param {string} [heading]\n * @return {Command | string}\n */\n\n helpGroup(heading) {\n if (heading === undefined) return this._helpGroupHeading ?? '';\n this._helpGroupHeading = heading;\n return this;\n }\n\n /**\n * Set/get the default help group heading for subcommands added to this command.\n * (This does not override a group set directly on the subcommand using .helpGroup().)\n *\n * @example\n * program.commandsGroup('Development Commands:);\n * program.command('watch')...\n * program.command('lint')...\n * ...\n *\n * @param {string} [heading]\n * @returns {Command | string}\n */\n commandsGroup(heading) {\n if (heading === undefined) return this._defaultCommandGroup ?? '';\n this._defaultCommandGroup = heading;\n return this;\n }\n\n /**\n * Set/get the default help group heading for options added to this command.\n * (This does not override a group set directly on the option using .helpGroup().)\n *\n * @example\n * program\n * .optionsGroup('Development Options:')\n * .option('-d, --debug', 'output extra debugging')\n * .option('-p, --profile', 'output profiling information')\n *\n * @param {string} [heading]\n * @returns {Command | string}\n */\n optionsGroup(heading) {\n if (heading === undefined) return this._defaultOptionGroup ?? '';\n this._defaultOptionGroup = heading;\n return this;\n }\n\n /**\n * @param {Option} option\n * @private\n */\n _initOptionGroup(option) {\n if (this._defaultOptionGroup && !option.helpGroupHeading)\n option.helpGroup(this._defaultOptionGroup);\n }\n\n /**\n * @param {Command} cmd\n * @private\n */\n _initCommandGroup(cmd) {\n if (this._defaultCommandGroup && !cmd.helpGroup())\n cmd.helpGroup(this._defaultCommandGroup);\n }\n\n /**\n * Set the name of the command from script filename, such as process.argv[1],\n * or require.main.filename, or __filename.\n *\n * (Used internally and public although not documented in README.)\n *\n * @example\n * program.nameFromFilename(require.main.filename);\n *\n * @param {string} filename\n * @return {Command}\n */\n\n nameFromFilename(filename) {\n this._name = path.basename(filename, path.extname(filename));\n\n return this;\n }\n\n /**\n * Get or set the directory for searching for executable subcommands of this command.\n *\n * @example\n * program.executableDir(__dirname);\n * // or\n * program.executableDir('subcommands');\n *\n * @param {string} [path]\n * @return {(string|null|Command)}\n */\n\n executableDir(path) {\n if (path === undefined) return this._executableDir;\n this._executableDir = path;\n return this;\n }\n\n /**\n * Return program help documentation.\n *\n * @param {{ error: boolean }} [contextOptions] - pass {error:true} to wrap for stderr instead of stdout\n * @return {string}\n */\n\n helpInformation(contextOptions) {\n const helper = this.createHelp();\n const context = this._getOutputContext(contextOptions);\n helper.prepareContext({\n error: context.error,\n helpWidth: context.helpWidth,\n outputHasColors: context.hasColors,\n });\n const text = helper.formatHelp(this, helper);\n if (context.hasColors) return text;\n return this._outputConfiguration.stripColor(text);\n }\n\n /**\n * @typedef HelpContext\n * @type {object}\n * @property {boolean} error\n * @property {number} helpWidth\n * @property {boolean} hasColors\n * @property {function} write - includes stripColor if needed\n *\n * @returns {HelpContext}\n * @private\n */\n\n _getOutputContext(contextOptions) {\n contextOptions = contextOptions || {};\n const error = !!contextOptions.error;\n let baseWrite;\n let hasColors;\n let helpWidth;\n if (error) {\n baseWrite = (str) => this._outputConfiguration.writeErr(str);\n hasColors = this._outputConfiguration.getErrHasColors();\n helpWidth = this._outputConfiguration.getErrHelpWidth();\n } else {\n baseWrite = (str) => this._outputConfiguration.writeOut(str);\n hasColors = this._outputConfiguration.getOutHasColors();\n helpWidth = this._outputConfiguration.getOutHelpWidth();\n }\n const write = (str) => {\n if (!hasColors) str = this._outputConfiguration.stripColor(str);\n return baseWrite(str);\n };\n return { error, write, hasColors, helpWidth };\n }\n\n /**\n * Output help information for this command.\n *\n * Outputs built-in help, and custom text added using `.addHelpText()`.\n *\n * @param {{ error: boolean } | Function} [contextOptions] - pass {error:true} to write to stderr instead of stdout\n */\n\n outputHelp(contextOptions) {\n let deprecatedCallback;\n if (typeof contextOptions === 'function') {\n deprecatedCallback = contextOptions;\n contextOptions = undefined;\n }\n\n const outputContext = this._getOutputContext(contextOptions);\n /** @type {HelpTextEventContext} */\n const eventContext = {\n error: outputContext.error,\n write: outputContext.write,\n command: this,\n };\n\n this._getCommandAndAncestors()\n .reverse()\n .forEach((command) => command.emit('beforeAllHelp', eventContext));\n this.emit('beforeHelp', eventContext);\n\n let helpInformation = this.helpInformation({ error: outputContext.error });\n if (deprecatedCallback) {\n helpInformation = deprecatedCallback(helpInformation);\n if (\n typeof helpInformation !== 'string' &&\n !Buffer.isBuffer(helpInformation)\n ) {\n throw new Error('outputHelp callback must return a string or a Buffer');\n }\n }\n outputContext.write(helpInformation);\n\n if (this._getHelpOption()?.long) {\n this.emit(this._getHelpOption().long); // deprecated\n }\n this.emit('afterHelp', eventContext);\n this._getCommandAndAncestors().forEach((command) =>\n command.emit('afterAllHelp', eventContext),\n );\n }\n\n /**\n * You can pass in flags and a description to customise the built-in help option.\n * Pass in false to disable the built-in help option.\n *\n * @example\n * program.helpOption('-?, --help' 'show help'); // customise\n * program.helpOption(false); // disable\n *\n * @param {(string | boolean)} flags\n * @param {string} [description]\n * @return {Command} `this` command for chaining\n */\n\n helpOption(flags, description) {\n // Support enabling/disabling built-in help option.\n if (typeof flags === 'boolean') {\n if (flags) {\n if (this._helpOption === null) this._helpOption = undefined; // reenable\n if (this._defaultOptionGroup) {\n // make the option to store the group\n this._initOptionGroup(this._getHelpOption());\n }\n } else {\n this._helpOption = null; // disable\n }\n return this;\n }\n\n // Customise flags and description.\n this._helpOption = this.createOption(\n flags ?? '-h, --help',\n description ?? 'display help for command',\n );\n // init group unless lazy create\n if (flags || description) this._initOptionGroup(this._helpOption);\n\n return this;\n }\n\n /**\n * Lazy create help option.\n * Returns null if has been disabled with .helpOption(false).\n *\n * @returns {(Option | null)} the help option\n * @package\n */\n _getHelpOption() {\n // Lazy create help option on demand.\n if (this._helpOption === undefined) {\n this.helpOption(undefined, undefined);\n }\n return this._helpOption;\n }\n\n /**\n * Supply your own option to use for the built-in help option.\n * This is an alternative to using helpOption() to customise the flags and description etc.\n *\n * @param {Option} option\n * @return {Command} `this` command for chaining\n */\n addHelpOption(option) {\n this._helpOption = option;\n this._initOptionGroup(option);\n return this;\n }\n\n /**\n * Output help information and exit.\n *\n * Outputs built-in help, and custom text added using `.addHelpText()`.\n *\n * @param {{ error: boolean }} [contextOptions] - pass {error:true} to write to stderr instead of stdout\n */\n\n help(contextOptions) {\n this.outputHelp(contextOptions);\n let exitCode = Number(process.exitCode ?? 0); // process.exitCode does allow a string or an integer, but we prefer just a number\n if (\n exitCode === 0 &&\n contextOptions &&\n typeof contextOptions !== 'function' &&\n contextOptions.error\n ) {\n exitCode = 1;\n }\n // message: do not have all displayed text available so only passing placeholder.\n this._exit(exitCode, 'commander.help', '(outputHelp)');\n }\n\n /**\n * // Do a little typing to coordinate emit and listener for the help text events.\n * @typedef HelpTextEventContext\n * @type {object}\n * @property {boolean} error\n * @property {Command} command\n * @property {function} write\n */\n\n /**\n * Add additional text to be displayed with the built-in help.\n *\n * Position is 'before' or 'after' to affect just this command,\n * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands.\n *\n * @param {string} position - before or after built-in help\n * @param {(string | Function)} text - string to add, or a function returning a string\n * @return {Command} `this` command for chaining\n */\n\n addHelpText(position, text) {\n const allowedValues = ['beforeAll', 'before', 'after', 'afterAll'];\n if (!allowedValues.includes(position)) {\n throw new Error(`Unexpected value for position to addHelpText.\nExpecting one of '${allowedValues.join(\"', '\")}'`);\n }\n\n const helpEvent = `${position}Help`;\n this.on(helpEvent, (/** @type {HelpTextEventContext} */ context) => {\n let helpStr;\n if (typeof text === 'function') {\n helpStr = text({ error: context.error, command: context.command });\n } else {\n helpStr = text;\n }\n // Ignore falsy value when nothing to output.\n if (helpStr) {\n context.write(`${helpStr}\\n`);\n }\n });\n return this;\n }\n\n /**\n * Output help information if help flags specified\n *\n * @param {Array} args - array of options to search for help flags\n * @private\n */\n\n _outputHelpIfRequested(args) {\n const helpOption = this._getHelpOption();\n const helpRequested = helpOption && args.find((arg) => helpOption.is(arg));\n if (helpRequested) {\n this.outputHelp();\n // (Do not have all displayed text available so only passing placeholder.)\n this._exit(0, 'commander.helpDisplayed', '(outputHelp)');\n }\n }\n}\n\n/**\n * Scan arguments and increment port number for inspect calls (to avoid conflicts when spawning new command).\n *\n * @param {string[]} args - array of arguments from node.execArgv\n * @returns {string[]}\n * @private\n */\n\nfunction incrementNodeInspectorPort(args) {\n // Testing for these options:\n // --inspect[=[host:]port]\n // --inspect-brk[=[host:]port]\n // --inspect-port=[host:]port\n return args.map((arg) => {\n if (!arg.startsWith('--inspect')) {\n return arg;\n }\n let debugOption;\n let debugHost = '127.0.0.1';\n let debugPort = '9229';\n let match;\n if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) {\n // e.g. --inspect\n debugOption = match[1];\n } else if (\n (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null\n ) {\n debugOption = match[1];\n if (/^\\d+$/.test(match[3])) {\n // e.g. --inspect=1234\n debugPort = match[3];\n } else {\n // e.g. --inspect=localhost\n debugHost = match[3];\n }\n } else if (\n (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\\d+)$/)) !== null\n ) {\n // e.g. --inspect=localhost:1234\n debugOption = match[1];\n debugHost = match[3];\n debugPort = match[4];\n }\n\n if (debugOption && debugPort !== '0') {\n return `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`;\n }\n return arg;\n });\n}\n\n/**\n * @returns {boolean | undefined}\n * @package\n */\nfunction useColor() {\n // Test for common conventions.\n // NB: the observed behaviour is in combination with how author adds color! For example:\n // - we do not test NODE_DISABLE_COLORS, but util:styletext does\n // - we do test NO_COLOR, but Chalk does not\n //\n // References:\n // https://no-color.org\n // https://bixense.com/clicolors/\n // https://github.com/nodejs/node/blob/0a00217a5f67ef4a22384cfc80eb6dd9a917fdc1/lib/internal/tty.js#L109\n // https://github.com/chalk/supports-color/blob/c214314a14bcb174b12b3014b2b0a8de375029ae/index.js#L33\n // (https://force-color.org recent web page from 2023, does not match major javascript implementations)\n\n if (\n process.env.NO_COLOR ||\n process.env.FORCE_COLOR === '0' ||\n process.env.FORCE_COLOR === 'false'\n )\n return false;\n if (process.env.FORCE_COLOR || process.env.CLICOLOR_FORCE !== undefined)\n return true;\n return undefined;\n}\n\nexports.Command = Command;\nexports.useColor = useColor; // exporting for tests\n", "const { Argument } = require('./lib/argument.js');\nconst { Command } = require('./lib/command.js');\nconst { CommanderError, InvalidArgumentError } = require('./lib/error.js');\nconst { Help } = require('./lib/help.js');\nconst { Option } = require('./lib/option.js');\n\nexports.program = new Command();\n\nexports.createCommand = (name) => new Command(name);\nexports.createOption = (flags, description) => new Option(flags, description);\nexports.createArgument = (name, description) => new Argument(name, description);\n\n/**\n * Expose classes\n */\n\nexports.Command = Command;\nexports.Option = Option;\nexports.Argument = Argument;\nexports.Help = Help;\n\nexports.CommanderError = CommanderError;\nexports.InvalidArgumentError = InvalidArgumentError;\nexports.InvalidOptionArgumentError = InvalidArgumentError; // Deprecated\n", "{\n \"name\": \"dotenv\",\n \"version\": \"17.3.1\",\n \"description\": \"Loads environment variables from .env file\",\n \"main\": \"lib/main.js\",\n \"types\": \"lib/main.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./lib/main.d.ts\",\n \"require\": \"./lib/main.js\",\n \"default\": \"./lib/main.js\"\n },\n \"./config\": \"./config.js\",\n \"./config.js\": \"./config.js\",\n \"./lib/env-options\": \"./lib/env-options.js\",\n \"./lib/env-options.js\": \"./lib/env-options.js\",\n \"./lib/cli-options\": \"./lib/cli-options.js\",\n \"./lib/cli-options.js\": \"./lib/cli-options.js\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dts-check\": \"tsc --project tests/types/tsconfig.json\",\n \"lint\": \"standard\",\n \"pretest\": \"npm run lint && npm run dts-check\",\n \"test\": \"tap run tests/**/*.js --allow-empty-coverage --disable-coverage --timeout=60000\",\n \"test:coverage\": \"tap run tests/**/*.js --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov\",\n \"prerelease\": \"npm test\",\n \"release\": \"standard-version\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/motdotla/dotenv.git\"\n },\n \"homepage\": \"https://github.com/motdotla/dotenv#readme\",\n \"funding\": \"https://dotenvx.com\",\n \"keywords\": [\n \"dotenv\",\n \"env\",\n \".env\",\n \"environment\",\n \"variables\",\n \"config\",\n \"settings\"\n ],\n \"readmeFilename\": \"README.md\",\n \"license\": \"BSD-2-Clause\",\n \"devDependencies\": {\n \"@types/node\": \"^18.11.3\",\n \"decache\": \"^4.6.2\",\n \"sinon\": \"^14.0.1\",\n \"standard\": \"^17.0.0\",\n \"standard-version\": \"^9.5.0\",\n \"tap\": \"^19.2.0\",\n \"typescript\": \"^4.8.4\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"browser\": {\n \"fs\": false\n }\n}\n", "const fs = require('fs')\nconst path = require('path')\nconst os = require('os')\nconst crypto = require('crypto')\nconst packageJson = require('../package.json')\n\nconst version = packageJson.version\n\n// Array of tips to display randomly\nconst TIPS = [\n '\uD83D\uDD10 encrypt with Dotenvx: https://dotenvx.com',\n '\uD83D\uDD10 prevent committing .env to code: https://dotenvx.com/precommit',\n '\uD83D\uDD10 prevent building .env in docker: https://dotenvx.com/prebuild',\n '\uD83E\uDD16 agentic secret storage: https://dotenvx.com/as2',\n '\u26A1\uFE0F secrets for agents: https://dotenvx.com/as2',\n '\uD83D\uDEE1\uFE0F auth for agents: https://vestauth.com',\n '\uD83D\uDEE0\uFE0F run anywhere with `dotenvx run -- yourcommand`',\n '\u2699\uFE0F specify custom .env file path with { path: \\'/custom/path/.env\\' }',\n '\u2699\uFE0F enable debug logging with { debug: true }',\n '\u2699\uFE0F override existing env vars with { override: true }',\n '\u2699\uFE0F suppress all logs with { quiet: true }',\n '\u2699\uFE0F write to custom object with { processEnv: myObject }',\n '\u2699\uFE0F load multiple .env files with { path: [\\'.env.local\\', \\'.env\\'] }'\n]\n\n// Get a random tip from the tips array\nfunction _getRandomTip () {\n return TIPS[Math.floor(Math.random() * TIPS.length)]\n}\n\nfunction parseBoolean (value) {\n if (typeof value === 'string') {\n return !['false', '0', 'no', 'off', ''].includes(value.toLowerCase())\n }\n return Boolean(value)\n}\n\nfunction supportsAnsi () {\n return process.stdout.isTTY // && process.env.TERM !== 'dumb'\n}\n\nfunction dim (text) {\n return supportsAnsi() ? `\\x1b[2m${text}\\x1b[0m` : text\n}\n\nconst LINE = /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg\n\n// Parse src into an Object\nfunction parse (src) {\n const obj = {}\n\n // Convert buffer to string\n let lines = src.toString()\n\n // Convert line breaks to same format\n lines = lines.replace(/\\r\\n?/mg, '\\n')\n\n let match\n while ((match = LINE.exec(lines)) != null) {\n const key = match[1]\n\n // Default undefined or null to empty string\n let value = (match[2] || '')\n\n // Remove whitespace\n value = value.trim()\n\n // Check if double quoted\n const maybeQuote = value[0]\n\n // Remove surrounding quotes\n value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/mg, '$2')\n\n // Expand newlines if double quoted\n if (maybeQuote === '\"') {\n value = value.replace(/\\\\n/g, '\\n')\n value = value.replace(/\\\\r/g, '\\r')\n }\n\n // Add to object\n obj[key] = value\n }\n\n return obj\n}\n\nfunction _parseVault (options) {\n options = options || {}\n\n const vaultPath = _vaultPath(options)\n options.path = vaultPath // parse .env.vault\n const result = DotenvModule.configDotenv(options)\n if (!result.parsed) {\n const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`)\n err.code = 'MISSING_DATA'\n throw err\n }\n\n // handle scenario for comma separated keys - for use with key rotation\n // example: DOTENV_KEY=\"dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=prod,dotenv://:key_7890@dotenvx.com/vault/.env.vault?environment=prod\"\n const keys = _dotenvKey(options).split(',')\n const length = keys.length\n\n let decrypted\n for (let i = 0; i < length; i++) {\n try {\n // Get full key\n const key = keys[i].trim()\n\n // Get instructions for decrypt\n const attrs = _instructions(result, key)\n\n // Decrypt\n decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key)\n\n break\n } catch (error) {\n // last key\n if (i + 1 >= length) {\n throw error\n }\n // try next key\n }\n }\n\n // Parse decrypted .env string\n return DotenvModule.parse(decrypted)\n}\n\nfunction _warn (message) {\n console.error(`[dotenv@${version}][WARN] ${message}`)\n}\n\nfunction _debug (message) {\n console.log(`[dotenv@${version}][DEBUG] ${message}`)\n}\n\nfunction _log (message) {\n console.log(`[dotenv@${version}] ${message}`)\n}\n\nfunction _dotenvKey (options) {\n // prioritize developer directly setting options.DOTENV_KEY\n if (options && options.DOTENV_KEY && options.DOTENV_KEY.length > 0) {\n return options.DOTENV_KEY\n }\n\n // secondary infra already contains a DOTENV_KEY environment variable\n if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) {\n return process.env.DOTENV_KEY\n }\n\n // fallback to empty string\n return ''\n}\n\nfunction _instructions (result, dotenvKey) {\n // Parse DOTENV_KEY. Format is a URI\n let uri\n try {\n uri = new URL(dotenvKey)\n } catch (error) {\n if (error.code === 'ERR_INVALID_URL') {\n const err = new Error('INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n throw error\n }\n\n // Get decrypt key\n const key = uri.password\n if (!key) {\n const err = new Error('INVALID_DOTENV_KEY: Missing key part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get environment\n const environment = uri.searchParams.get('environment')\n if (!environment) {\n const err = new Error('INVALID_DOTENV_KEY: Missing environment part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get ciphertext payload\n const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`\n const ciphertext = result.parsed[environmentKey] // DOTENV_VAULT_PRODUCTION\n if (!ciphertext) {\n const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`)\n err.code = 'NOT_FOUND_DOTENV_ENVIRONMENT'\n throw err\n }\n\n return { ciphertext, key }\n}\n\nfunction _vaultPath (options) {\n let possibleVaultPath = null\n\n if (options && options.path && options.path.length > 0) {\n if (Array.isArray(options.path)) {\n for (const filepath of options.path) {\n if (fs.existsSync(filepath)) {\n possibleVaultPath = filepath.endsWith('.vault') ? filepath : `${filepath}.vault`\n }\n }\n } else {\n possibleVaultPath = options.path.endsWith('.vault') ? options.path : `${options.path}.vault`\n }\n } else {\n possibleVaultPath = path.resolve(process.cwd(), '.env.vault')\n }\n\n if (fs.existsSync(possibleVaultPath)) {\n return possibleVaultPath\n }\n\n return null\n}\n\nfunction _resolveHome (envPath) {\n return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath\n}\n\nfunction _configVault (options) {\n const debug = parseBoolean(process.env.DOTENV_CONFIG_DEBUG || (options && options.debug))\n const quiet = parseBoolean(process.env.DOTENV_CONFIG_QUIET || (options && options.quiet))\n\n if (debug || !quiet) {\n _log('Loading env from encrypted .env.vault')\n }\n\n const parsed = DotenvModule._parseVault(options)\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsed, options)\n\n return { parsed }\n}\n\nfunction configDotenv (options) {\n const dotenvPath = path.resolve(process.cwd(), '.env')\n let encoding = 'utf8'\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n let debug = parseBoolean(processEnv.DOTENV_CONFIG_DEBUG || (options && options.debug))\n let quiet = parseBoolean(processEnv.DOTENV_CONFIG_QUIET || (options && options.quiet))\n\n if (options && options.encoding) {\n encoding = options.encoding\n } else {\n if (debug) {\n _debug('No encoding is specified. UTF-8 is used by default')\n }\n }\n\n let optionPaths = [dotenvPath] // default, look for .env\n if (options && options.path) {\n if (!Array.isArray(options.path)) {\n optionPaths = [_resolveHome(options.path)]\n } else {\n optionPaths = [] // reset default\n for (const filepath of options.path) {\n optionPaths.push(_resolveHome(filepath))\n }\n }\n }\n\n // Build the parsed data in a temporary object (because we need to return it). Once we have the final\n // parsed data, we will combine it with process.env (or options.processEnv if provided).\n let lastError\n const parsedAll = {}\n for (const path of optionPaths) {\n try {\n // Specifying an encoding returns a string instead of a buffer\n const parsed = DotenvModule.parse(fs.readFileSync(path, { encoding }))\n\n DotenvModule.populate(parsedAll, parsed, options)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${path} ${e.message}`)\n }\n lastError = e\n }\n }\n\n const populated = DotenvModule.populate(processEnv, parsedAll, options)\n\n // handle user settings DOTENV_CONFIG_ options inside .env file(s)\n debug = parseBoolean(processEnv.DOTENV_CONFIG_DEBUG || debug)\n quiet = parseBoolean(processEnv.DOTENV_CONFIG_QUIET || quiet)\n\n if (debug || !quiet) {\n const keysCount = Object.keys(populated).length\n const shortPaths = []\n for (const filePath of optionPaths) {\n try {\n const relative = path.relative(process.cwd(), filePath)\n shortPaths.push(relative)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${filePath} ${e.message}`)\n }\n lastError = e\n }\n }\n\n _log(`injecting env (${keysCount}) from ${shortPaths.join(',')} ${dim(`-- tip: ${_getRandomTip()}`)}`)\n }\n\n if (lastError) {\n return { parsed: parsedAll, error: lastError }\n } else {\n return { parsed: parsedAll }\n }\n}\n\n// Populates process.env from .env file\nfunction config (options) {\n // fallback to original dotenv if DOTENV_KEY is not set\n if (_dotenvKey(options).length === 0) {\n return DotenvModule.configDotenv(options)\n }\n\n const vaultPath = _vaultPath(options)\n\n // dotenvKey exists but .env.vault file does not exist\n if (!vaultPath) {\n _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`)\n\n return DotenvModule.configDotenv(options)\n }\n\n return DotenvModule._configVault(options)\n}\n\nfunction decrypt (encrypted, keyStr) {\n const key = Buffer.from(keyStr.slice(-64), 'hex')\n let ciphertext = Buffer.from(encrypted, 'base64')\n\n const nonce = ciphertext.subarray(0, 12)\n const authTag = ciphertext.subarray(-16)\n ciphertext = ciphertext.subarray(12, -16)\n\n try {\n const aesgcm = crypto.createDecipheriv('aes-256-gcm', key, nonce)\n aesgcm.setAuthTag(authTag)\n return `${aesgcm.update(ciphertext)}${aesgcm.final()}`\n } catch (error) {\n const isRange = error instanceof RangeError\n const invalidKeyLength = error.message === 'Invalid key length'\n const decryptionFailed = error.message === 'Unsupported state or unable to authenticate data'\n\n if (isRange || invalidKeyLength) {\n const err = new Error('INVALID_DOTENV_KEY: It must be 64 characters long (or more)')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n } else if (decryptionFailed) {\n const err = new Error('DECRYPTION_FAILED: Please check your DOTENV_KEY')\n err.code = 'DECRYPTION_FAILED'\n throw err\n } else {\n throw error\n }\n }\n}\n\n// Populate process.env with parsed values\nfunction populate (processEnv, parsed, options = {}) {\n const debug = Boolean(options && options.debug)\n const override = Boolean(options && options.override)\n const populated = {}\n\n if (typeof parsed !== 'object') {\n const err = new Error('OBJECT_REQUIRED: Please check the processEnv argument being passed to populate')\n err.code = 'OBJECT_REQUIRED'\n throw err\n }\n\n // Set process.env\n for (const key of Object.keys(parsed)) {\n if (Object.prototype.hasOwnProperty.call(processEnv, key)) {\n if (override === true) {\n processEnv[key] = parsed[key]\n populated[key] = parsed[key]\n }\n\n if (debug) {\n if (override === true) {\n _debug(`\"${key}\" is already defined and WAS overwritten`)\n } else {\n _debug(`\"${key}\" is already defined and was NOT overwritten`)\n }\n }\n } else {\n processEnv[key] = parsed[key]\n populated[key] = parsed[key]\n }\n }\n\n return populated\n}\n\nconst DotenvModule = {\n configDotenv,\n _configVault,\n _parseVault,\n config,\n decrypt,\n parse,\n populate\n}\n\nmodule.exports.configDotenv = DotenvModule.configDotenv\nmodule.exports._configVault = DotenvModule._configVault\nmodule.exports._parseVault = DotenvModule._parseVault\nmodule.exports.config = DotenvModule.config\nmodule.exports.decrypt = DotenvModule.decrypt\nmodule.exports.parse = DotenvModule.parse\nmodule.exports.populate = DotenvModule.populate\n\nmodule.exports = DotenvModule\n", "{\n \"name\": \"@raclettejs/core\",\n \"version\": \"0.1.25\",\n \"description\": \"racletteJS core package\",\n \"repository\": \"https://gitlab.com/raclettejs/core\",\n \"author\": \"Pacifico Digital Explorations GmbH <info@raclettejs.com>\",\n \"license\": \"AGPL-3.0-only\",\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"node build.mjs || true\",\n \"dev\": \"node watch.mjs\",\n \"watch\": \"node watch.mjs\",\n \"format:check\": \"prettier --check .\",\n \"format:fix\": \"prettier --write .\",\n \"lint\": \"eslint\",\n \"lint:grouped\": \"FILTER_RULE=$RULE eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --format ./dev/eslint/groupByRuleFormatter.cjs\",\n \"lint:fix\": \"eslint --fix\",\n \"prepare\": \"husky\",\n \"prepublishOnly\": \"yarn run build && yarn run sync\",\n \"publish:patch\": \"yarn version --patch && yarn publish\",\n \"sync\": \"node ./scripts/sync-exports.js\"\n },\n \"bin\": {\n \"raclette\": \"./bin/cli.js\"\n },\n \"main\": \"index.js\",\n \"types\": \"./types/index.ts\",\n \"files\": [\n \"services\",\n \"bin\",\n \"dist\",\n \"types\",\n \"scripts\",\n \"index.js\",\n \"README.md\",\n \"yarn.lock\",\n \"src/types.ts\",\n \"LICENSE.md\",\n \"CONTRIBUTING.md\",\n \"raclette.default.config.yaml\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./types/index.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./backend\": {\n \"types\": \"./services/backend/src/index.ts\",\n \"import\": \"./services/backend/src/index.ts\"\n },\n \"./frontend\": {\n \"types\": \"./services/frontend/src/core/index.ts\",\n \"import\": \"./services/frontend/src/core/index.ts\"\n },\n \"./orchestrator\": {\n \"types\": \"./services/frontend/src/orchestrator/index.ts\",\n \"import\": \"./services/frontend/src/orchestrator/index.ts\"\n }\n },\n \"config\": {},\n \"dependencies\": {\n \"@inquirer/prompts\": \"8.3.2\",\n \"@types/mustache\": \"4.2.6\",\n \"chalk\": \"5.6.2\",\n \"chokidar\": \"5.0.0\",\n \"cli-highlight\": \"2.1.11\",\n \"commander\": \"14.0.3\",\n \"dotenv\": \"17.3.1\",\n \"esbuild\": \"0.27.4\",\n \"fs-extra\": \"11.3.4\",\n \"globby\": \"16.1.1\",\n \"js-yaml\": \"4.1.1\",\n \"mustache\": \"4.2.0\",\n \"ramda\": \"0.32.0\",\n \"tsc-alias\": \"1.8.16\"\n },\n \"devDependencies\": {\n \"@emnapi/core\": \"1.9.2\",\n \"@emnapi/runtime\": \"1.9.2\",\n \"@eslint/js\": \"9.35.0\",\n \"@raclettejs/types\": \"workspace:^\",\n \"@types/fs-extra\": \"11.0.4\",\n \"@types/js-yaml\": \"4.0.9\",\n \"@types/node\": \"25.5.0\",\n \"@types/ramda\": \"0.31.1\",\n \"eslint\": \"9.35.0\",\n \"eslint-config-prettier\": \"9.1.2\",\n \"eslint-flat-config-utils\": \"3.0.2\",\n \"eslint-plugin-import\": \"2.32.0\",\n \"eslint-plugin-prefer-arrow-functions\": \"3.9.1\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-vue\": \"9.33.0\",\n \"globals\": \"17.4.0\",\n \"husky\": \"9.1.7\",\n \"prettier\": \"3.8.1\",\n \"typescript\": \"5.9.3\",\n \"typescript-eslint\": \"8.57.1\",\n \"vue-eslint-parser\": \"9.4.3\"\n }\n}\n", "import {on, once} from 'node:events';\nimport {PassThrough as PassThroughStream, getDefaultHighWaterMark} from 'node:stream';\nimport {finished} from 'node:stream/promises';\n\nexport default function mergeStreams(streams) {\n\tif (!Array.isArray(streams)) {\n\t\tthrow new TypeError(`Expected an array, got \\`${typeof streams}\\`.`);\n\t}\n\n\tfor (const stream of streams) {\n\t\tvalidateStream(stream);\n\t}\n\n\tconst objectMode = streams.some(({readableObjectMode}) => readableObjectMode);\n\tconst highWaterMark = getHighWaterMark(streams, objectMode);\n\tconst passThroughStream = new MergedStream({\n\t\tobjectMode,\n\t\twritableHighWaterMark: highWaterMark,\n\t\treadableHighWaterMark: highWaterMark,\n\t});\n\n\tfor (const stream of streams) {\n\t\tpassThroughStream.add(stream);\n\t}\n\n\treturn passThroughStream;\n}\n\nconst getHighWaterMark = (streams, objectMode) => {\n\tif (streams.length === 0) {\n\t\treturn getDefaultHighWaterMark(objectMode);\n\t}\n\n\tconst highWaterMarks = streams\n\t\t.filter(({readableObjectMode}) => readableObjectMode === objectMode)\n\t\t.map(({readableHighWaterMark}) => readableHighWaterMark);\n\treturn Math.max(...highWaterMarks);\n};\n\nclass MergedStream extends PassThroughStream {\n\t#streams = new Set([]);\n\t#ended = new Set([]);\n\t#aborted = new Set([]);\n\t#onFinished;\n\t#unpipeEvent = Symbol('unpipe');\n\t#streamPromises = new WeakMap();\n\n\tadd(stream) {\n\t\tvalidateStream(stream);\n\n\t\tif (this.#streams.has(stream)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#streams.add(stream);\n\n\t\tthis.#onFinished ??= onMergedStreamFinished(this, this.#streams, this.#unpipeEvent);\n\t\tconst streamPromise = endWhenStreamsDone({\n\t\t\tpassThroughStream: this,\n\t\t\tstream,\n\t\t\tstreams: this.#streams,\n\t\t\tended: this.#ended,\n\t\t\taborted: this.#aborted,\n\t\t\tonFinished: this.#onFinished,\n\t\t\tunpipeEvent: this.#unpipeEvent,\n\t\t});\n\t\tthis.#streamPromises.set(stream, streamPromise);\n\n\t\tstream.pipe(this, {end: false});\n\t}\n\n\tasync remove(stream) {\n\t\tvalidateStream(stream);\n\n\t\tif (!this.#streams.has(stream)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst streamPromise = this.#streamPromises.get(stream);\n\t\tif (streamPromise === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.#streamPromises.delete(stream);\n\n\t\tstream.unpipe(this);\n\t\tawait streamPromise;\n\t\treturn true;\n\t}\n}\n\nconst onMergedStreamFinished = async (passThroughStream, streams, unpipeEvent) => {\n\tupdateMaxListeners(passThroughStream, PASSTHROUGH_LISTENERS_COUNT);\n\tconst controller = new AbortController();\n\n\ttry {\n\t\tawait Promise.race([\n\t\t\tonMergedStreamEnd(passThroughStream, controller),\n\t\t\tonInputStreamsUnpipe(passThroughStream, streams, unpipeEvent, controller),\n\t\t]);\n\t} finally {\n\t\tcontroller.abort();\n\t\tupdateMaxListeners(passThroughStream, -PASSTHROUGH_LISTENERS_COUNT);\n\t}\n};\n\nconst onMergedStreamEnd = async (passThroughStream, {signal}) => {\n\ttry {\n\t\tawait finished(passThroughStream, {signal, cleanup: true});\n\t} catch (error) {\n\t\terrorOrAbortStream(passThroughStream, error);\n\t\tthrow error;\n\t}\n};\n\nconst onInputStreamsUnpipe = async (passThroughStream, streams, unpipeEvent, {signal}) => {\n\tfor await (const [unpipedStream] of on(passThroughStream, 'unpipe', {signal})) {\n\t\tif (streams.has(unpipedStream)) {\n\t\t\tunpipedStream.emit(unpipeEvent);\n\t\t}\n\t}\n};\n\nconst validateStream = stream => {\n\tif (typeof stream?.pipe !== 'function') {\n\t\tthrow new TypeError(`Expected a readable stream, got: \\`${typeof stream}\\`.`);\n\t}\n};\n\nconst endWhenStreamsDone = async ({passThroughStream, stream, streams, ended, aborted, onFinished, unpipeEvent}) => {\n\tupdateMaxListeners(passThroughStream, PASSTHROUGH_LISTENERS_PER_STREAM);\n\tconst controller = new AbortController();\n\n\ttry {\n\t\tawait Promise.race([\n\t\t\tafterMergedStreamFinished(onFinished, stream, controller),\n\t\t\tonInputStreamEnd({\n\t\t\t\tpassThroughStream,\n\t\t\t\tstream,\n\t\t\t\tstreams,\n\t\t\t\tended,\n\t\t\t\taborted,\n\t\t\t\tcontroller,\n\t\t\t}),\n\t\t\tonInputStreamUnpipe({\n\t\t\t\tstream,\n\t\t\t\tstreams,\n\t\t\t\tended,\n\t\t\t\taborted,\n\t\t\t\tunpipeEvent,\n\t\t\t\tcontroller,\n\t\t\t}),\n\t\t]);\n\t} finally {\n\t\tcontroller.abort();\n\t\tupdateMaxListeners(passThroughStream, -PASSTHROUGH_LISTENERS_PER_STREAM);\n\t}\n\n\tif (streams.size > 0 && streams.size === ended.size + aborted.size) {\n\t\tif (ended.size === 0 && aborted.size > 0) {\n\t\t\tabortStream(passThroughStream);\n\t\t} else {\n\t\t\tendStream(passThroughStream);\n\t\t}\n\t}\n};\n\nconst afterMergedStreamFinished = async (onFinished, stream, {signal}) => {\n\ttry {\n\t\tawait onFinished;\n\t\tif (!signal.aborted) {\n\t\t\tabortStream(stream);\n\t\t}\n\t} catch (error) {\n\t\tif (!signal.aborted) {\n\t\t\terrorOrAbortStream(stream, error);\n\t\t}\n\t}\n};\n\nconst onInputStreamEnd = async ({passThroughStream, stream, streams, ended, aborted, controller: {signal}}) => {\n\ttry {\n\t\tawait finished(stream, {\n\t\t\tsignal,\n\t\t\tcleanup: true,\n\t\t\treadable: true,\n\t\t\twritable: false,\n\t\t});\n\t\tif (streams.has(stream)) {\n\t\t\tended.add(stream);\n\t\t}\n\t} catch (error) {\n\t\tif (signal.aborted || !streams.has(stream)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (isAbortError(error)) {\n\t\t\taborted.add(stream);\n\t\t} else {\n\t\t\terrorStream(passThroughStream, error);\n\t\t}\n\t}\n};\n\nconst onInputStreamUnpipe = async ({stream, streams, ended, aborted, unpipeEvent, controller: {signal}}) => {\n\tawait once(stream, unpipeEvent, {signal});\n\n\tif (!stream.readable) {\n\t\treturn once(signal, 'abort', {signal});\n\t}\n\n\tstreams.delete(stream);\n\tended.delete(stream);\n\taborted.delete(stream);\n};\n\nconst endStream = stream => {\n\tif (stream.writable) {\n\t\tstream.end();\n\t}\n};\n\nconst errorOrAbortStream = (stream, error) => {\n\tif (isAbortError(error)) {\n\t\tabortStream(stream);\n\t} else {\n\t\terrorStream(stream, error);\n\t}\n};\n\n// This is the error thrown by `finished()` on `stream.destroy()`\nconst isAbortError = error => error?.code === 'ERR_STREAM_PREMATURE_CLOSE';\n\nconst abortStream = stream => {\n\tif (stream.readable || stream.writable) {\n\t\tstream.destroy();\n\t}\n};\n\n// `stream.destroy(error)` crashes the process with `uncaughtException` if no `error` event listener exists on `stream`.\n// We take care of error handling on user behalf, so we do not want this to happen.\nconst errorStream = (stream, error) => {\n\tif (!stream.destroyed) {\n\t\tstream.once('error', noop);\n\t\tstream.destroy(error);\n\t}\n};\n\nconst noop = () => {};\n\nconst updateMaxListeners = (passThroughStream, increment) => {\n\tconst maxListeners = passThroughStream.getMaxListeners();\n\tif (maxListeners !== 0 && maxListeners !== Number.POSITIVE_INFINITY) {\n\t\tpassThroughStream.setMaxListeners(maxListeners + increment);\n\t}\n};\n\n// Number of times `passThroughStream.on()` is called regardless of streams:\n// - once due to `finished(passThroughStream)`\n// - once due to `on(passThroughStream)`\nconst PASSTHROUGH_LISTENERS_COUNT = 2;\n\n// Number of times `passThroughStream.on()` is called per stream:\n// - once due to `stream.pipe(passThroughStream)`\nconst PASSTHROUGH_LISTENERS_PER_STREAM = 1;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.splitWhen = exports.flatten = void 0;\nfunction flatten(items) {\n return items.reduce((collection, item) => [].concat(collection, item), []);\n}\nexports.flatten = flatten;\nfunction splitWhen(items, predicate) {\n const result = [[]];\n let groupIndex = 0;\n for (const item of items) {\n if (predicate(item)) {\n groupIndex++;\n result[groupIndex] = [];\n }\n else {\n result[groupIndex].push(item);\n }\n }\n return result;\n}\nexports.splitWhen = splitWhen;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isEnoentCodeError = void 0;\nfunction isEnoentCodeError(error) {\n return error.code === 'ENOENT';\n}\nexports.isEnoentCodeError = isEnoentCodeError;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createDirentFromStats = void 0;\nclass DirentFromStats {\n constructor(name, stats) {\n this.name = name;\n this.isBlockDevice = stats.isBlockDevice.bind(stats);\n this.isCharacterDevice = stats.isCharacterDevice.bind(stats);\n this.isDirectory = stats.isDirectory.bind(stats);\n this.isFIFO = stats.isFIFO.bind(stats);\n this.isFile = stats.isFile.bind(stats);\n this.isSocket = stats.isSocket.bind(stats);\n this.isSymbolicLink = stats.isSymbolicLink.bind(stats);\n }\n}\nfunction createDirentFromStats(name, stats) {\n return new DirentFromStats(name, stats);\n}\nexports.createDirentFromStats = createDirentFromStats;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.convertPosixPathToPattern = exports.convertWindowsPathToPattern = exports.convertPathToPattern = exports.escapePosixPath = exports.escapeWindowsPath = exports.escape = exports.removeLeadingDotSegment = exports.makeAbsolute = exports.unixify = void 0;\nconst os = require(\"os\");\nconst path = require(\"path\");\nconst IS_WINDOWS_PLATFORM = os.platform() === 'win32';\nconst LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\\\\n/**\n * All non-escaped special characters.\n * Posix: ()*?[]{|}, !+@ before (, ! at the beginning, \\\\ before non-special characters.\n * Windows: (){}[], !+@ before (, ! at the beginning.\n */\nconst POSIX_UNESCAPED_GLOB_SYMBOLS_RE = /(\\\\?)([()*?[\\]{|}]|^!|[!+@](?=\\()|\\\\(?![!()*+?@[\\]{|}]))/g;\nconst WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE = /(\\\\?)([()[\\]{}]|^!|[!+@](?=\\())/g;\n/**\n * The device path (\\\\.\\ or \\\\?\\).\n * https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats#dos-device-paths\n */\nconst DOS_DEVICE_PATH_RE = /^\\\\\\\\([.?])/;\n/**\n * All backslashes except those escaping special characters.\n * Windows: !()+@{}\n * https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions\n */\nconst WINDOWS_BACKSLASHES_RE = /\\\\(?![!()+@[\\]{}])/g;\n/**\n * Designed to work only with simple paths: `dir\\\\file`.\n */\nfunction unixify(filepath) {\n return filepath.replace(/\\\\/g, '/');\n}\nexports.unixify = unixify;\nfunction makeAbsolute(cwd, filepath) {\n return path.resolve(cwd, filepath);\n}\nexports.makeAbsolute = makeAbsolute;\nfunction removeLeadingDotSegment(entry) {\n // We do not use `startsWith` because this is 10x slower than current implementation for some cases.\n // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with\n if (entry.charAt(0) === '.') {\n const secondCharactery = entry.charAt(1);\n if (secondCharactery === '/' || secondCharactery === '\\\\') {\n return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT);\n }\n }\n return entry;\n}\nexports.removeLeadingDotSegment = removeLeadingDotSegment;\nexports.escape = IS_WINDOWS_PLATFORM ? escapeWindowsPath : escapePosixPath;\nfunction escapeWindowsPath(pattern) {\n return pattern.replace(WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE, '\\\\$2');\n}\nexports.escapeWindowsPath = escapeWindowsPath;\nfunction escapePosixPath(pattern) {\n return pattern.replace(POSIX_UNESCAPED_GLOB_SYMBOLS_RE, '\\\\$2');\n}\nexports.escapePosixPath = escapePosixPath;\nexports.convertPathToPattern = IS_WINDOWS_PLATFORM ? convertWindowsPathToPattern : convertPosixPathToPattern;\nfunction convertWindowsPathToPattern(filepath) {\n return escapeWindowsPath(filepath)\n .replace(DOS_DEVICE_PATH_RE, '//$1')\n .replace(WINDOWS_BACKSLASHES_RE, '/');\n}\nexports.convertWindowsPathToPattern = convertWindowsPathToPattern;\nfunction convertPosixPathToPattern(filepath) {\n return escapePosixPath(filepath);\n}\nexports.convertPosixPathToPattern = convertPosixPathToPattern;\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", "'use strict';\n\nconst path = require('path');\nconst WIN_SLASH = '\\\\\\\\/';\nconst WIN_NO_SLASH = `[^${WIN_SLASH}]`;\n\nconst DEFAULT_MAX_EXTGLOB_RECURSION = 0;\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 __proto__: null,\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 DEFAULT_MAX_EXTGLOB_RECURSION,\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 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\nconst splitTopLevel = input => {\n const parts = [];\n let bracket = 0;\n let paren = 0;\n let quote = 0;\n let value = '';\n let escaped = false;\n\n for (const ch of input) {\n if (escaped === true) {\n value += ch;\n escaped = false;\n continue;\n }\n\n if (ch === '\\\\') {\n value += ch;\n escaped = true;\n continue;\n }\n\n if (ch === '\"') {\n quote = quote === 1 ? 0 : 1;\n value += ch;\n continue;\n }\n\n if (quote === 0) {\n if (ch === '[') {\n bracket++;\n } else if (ch === ']' && bracket > 0) {\n bracket--;\n } else if (bracket === 0) {\n if (ch === '(') {\n paren++;\n } else if (ch === ')' && paren > 0) {\n paren--;\n } else if (ch === '|' && paren === 0) {\n parts.push(value);\n value = '';\n continue;\n }\n }\n }\n\n value += ch;\n }\n\n parts.push(value);\n return parts;\n};\n\nconst isPlainBranch = branch => {\n let escaped = false;\n\n for (const ch of branch) {\n if (escaped === true) {\n escaped = false;\n continue;\n }\n\n if (ch === '\\\\') {\n escaped = true;\n continue;\n }\n\n if (/[?*+@!()[\\]{}]/.test(ch)) {\n return false;\n }\n }\n\n return true;\n};\n\nconst normalizeSimpleBranch = branch => {\n let value = branch.trim();\n let changed = true;\n\n while (changed === true) {\n changed = false;\n\n if (/^@\\([^\\\\()[\\]{}|]+\\)$/.test(value)) {\n value = value.slice(2, -1);\n changed = true;\n }\n }\n\n if (!isPlainBranch(value)) {\n return;\n }\n\n return value.replace(/\\\\(.)/g, '$1');\n};\n\nconst hasRepeatedCharPrefixOverlap = branches => {\n const values = branches.map(normalizeSimpleBranch).filter(Boolean);\n\n for (let i = 0; i < values.length; i++) {\n for (let j = i + 1; j < values.length; j++) {\n const a = values[i];\n const b = values[j];\n const char = a[0];\n\n if (!char || a !== char.repeat(a.length) || b !== char.repeat(b.length)) {\n continue;\n }\n\n if (a === b || a.startsWith(b) || b.startsWith(a)) {\n return true;\n }\n }\n }\n\n return false;\n};\n\nconst parseRepeatedExtglob = (pattern, requireEnd = true) => {\n if ((pattern[0] !== '+' && pattern[0] !== '*') || pattern[1] !== '(') {\n return;\n }\n\n let bracket = 0;\n let paren = 0;\n let quote = 0;\n let escaped = false;\n\n for (let i = 1; i < pattern.length; i++) {\n const ch = pattern[i];\n\n if (escaped === true) {\n escaped = false;\n continue;\n }\n\n if (ch === '\\\\') {\n escaped = true;\n continue;\n }\n\n if (ch === '\"') {\n quote = quote === 1 ? 0 : 1;\n continue;\n }\n\n if (quote === 1) {\n continue;\n }\n\n if (ch === '[') {\n bracket++;\n continue;\n }\n\n if (ch === ']' && bracket > 0) {\n bracket--;\n continue;\n }\n\n if (bracket > 0) {\n continue;\n }\n\n if (ch === '(') {\n paren++;\n continue;\n }\n\n if (ch === ')') {\n paren--;\n\n if (paren === 0) {\n if (requireEnd === true && i !== pattern.length - 1) {\n return;\n }\n\n return {\n type: pattern[0],\n body: pattern.slice(2, i),\n end: i\n };\n }\n }\n }\n};\n\nconst getStarExtglobSequenceOutput = pattern => {\n let index = 0;\n const chars = [];\n\n while (index < pattern.length) {\n const match = parseRepeatedExtglob(pattern.slice(index), false);\n\n if (!match || match.type !== '*') {\n return;\n }\n\n const branches = splitTopLevel(match.body).map(branch => branch.trim());\n if (branches.length !== 1) {\n return;\n }\n\n const branch = normalizeSimpleBranch(branches[0]);\n if (!branch || branch.length !== 1) {\n return;\n }\n\n chars.push(branch);\n index += match.end + 1;\n }\n\n if (chars.length < 1) {\n return;\n }\n\n const source = chars.length === 1\n ? utils.escapeRegex(chars[0])\n : `[${chars.map(ch => utils.escapeRegex(ch)).join('')}]`;\n\n return `${source}*`;\n};\n\nconst repeatedExtglobRecursion = pattern => {\n let depth = 0;\n let value = pattern.trim();\n let match = parseRepeatedExtglob(value);\n\n while (match) {\n depth++;\n value = match.body.trim();\n match = parseRepeatedExtglob(value);\n }\n\n return depth;\n};\n\nconst analyzeRepeatedExtglob = (body, options) => {\n if (options.maxExtglobRecursion === false) {\n return { risky: false };\n }\n\n const max =\n typeof options.maxExtglobRecursion === 'number'\n ? options.maxExtglobRecursion\n : constants.DEFAULT_MAX_EXTGLOB_RECURSION;\n\n const branches = splitTopLevel(body).map(branch => branch.trim());\n\n if (branches.length > 1) {\n if (\n branches.some(branch => branch === '') ||\n branches.some(branch => /^[*?]+$/.test(branch)) ||\n hasRepeatedCharPrefixOverlap(branches)\n ) {\n return { risky: true };\n }\n }\n\n for (const branch of branches) {\n const safeOutput = getStarExtglobSequenceOutput(branch);\n if (safeOutput) {\n return { risky: true, safeOutput };\n }\n\n if (repeatedExtglobRecursion(branch) > max) {\n return { risky: true };\n }\n }\n\n return { risky: false };\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 token.startIndex = state.index;\n token.tokensIndex = tokens.length;\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 const literal = input.slice(token.startIndex, state.index + 1);\n const body = input.slice(token.startIndex + 2, state.index);\n const analysis = analyzeRepeatedExtglob(body, opts);\n\n if ((token.type === 'plus' || token.type === 'star') && analysis.risky) {\n const safeOutput = analysis.safeOutput\n ? (token.output ? '' : ONE_CHAR) + (opts.capture ? `(${analysis.safeOutput})` : analysis.safeOutput)\n : undefined;\n const open = tokens[token.tokensIndex];\n\n open.type = 'text';\n open.value = literal;\n open.output = safeOutput || utils.escapeRegex(literal);\n\n for (let i = token.tokensIndex + 1; i < tokens.length; i++) {\n tokens[i].value = '';\n tokens[i].output = '';\n delete tokens[i].suffix;\n }\n\n state.output = token.output + open.output;\n state.backtrack = true;\n\n push({ type: 'paren', extglob: true, value, output: '' });\n decrement('parens');\n return;\n }\n\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 util = require('util');\nconst braces = require('braces');\nconst picomatch = require('picomatch');\nconst utils = require('picomatch/lib/utils');\n\nconst isEmptyString = v => v === '' || v === './';\nconst hasBraces = v => {\n const index = v.indexOf('{');\n return index > -1 && v.indexOf('}', index) > -1;\n};\n\n/**\n * Returns an array of strings that match one or more glob patterns.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm(list, patterns[, options]);\n *\n * console.log(mm(['a.js', 'a.txt'], ['*.js']));\n * //=> [ 'a.js' ]\n * ```\n * @param {String|Array<string>} `list` List of strings to match.\n * @param {String|Array<string>} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options)\n * @return {Array} Returns an array of matches\n * @summary false\n * @api public\n */\n\nconst micromatch = (list, patterns, options) => {\n patterns = [].concat(patterns);\n list = [].concat(list);\n\n let omit = new Set();\n let keep = new Set();\n let items = new Set();\n let negatives = 0;\n\n let onResult = state => {\n items.add(state.output);\n if (options && options.onResult) {\n options.onResult(state);\n }\n };\n\n for (let i = 0; i < patterns.length; i++) {\n let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true);\n let negated = isMatch.state.negated || isMatch.state.negatedExtglob;\n if (negated) negatives++;\n\n for (let item of list) {\n let matched = isMatch(item, true);\n\n let match = negated ? !matched.isMatch : matched.isMatch;\n if (!match) continue;\n\n if (negated) {\n omit.add(matched.output);\n } else {\n omit.delete(matched.output);\n keep.add(matched.output);\n }\n }\n }\n\n let result = negatives === patterns.length ? [...items] : [...keep];\n let matches = result.filter(item => !omit.has(item));\n\n if (options && matches.length === 0) {\n if (options.failglob === true) {\n throw new Error(`No matches found for \"${patterns.join(', ')}\"`);\n }\n\n if (options.nonull === true || options.nullglob === true) {\n return options.unescape ? patterns.map(p => p.replace(/\\\\/g, '')) : patterns;\n }\n }\n\n return matches;\n};\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.match = micromatch;\n\n/**\n * Returns a matcher function from the given glob `pattern` and `options`.\n * The returned function takes a string to match as its only argument and returns\n * true if the string is a match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matcher(pattern[, options]);\n *\n * const isMatch = mm.matcher('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @param {String} `pattern` Glob pattern\n * @param {Object} `options`\n * @return {Function} Returns a matcher function.\n * @api public\n */\n\nmicromatch.matcher = (pattern, options) => picomatch(pattern, options);\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.isMatch(string, patterns[, options]);\n *\n * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(mm.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String} `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\nmicromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.any = micromatch.isMatch;\n\n/**\n * Returns a list of strings that _**do not match any**_ of the given `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.not(list, patterns[, options]);\n *\n * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a'));\n * //=> ['b.b', 'c.c']\n * ```\n * @param {Array} `list` Array of strings to match.\n * @param {String|Array} `patterns` One or more glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array} Returns an array of strings that **do not match** the given patterns.\n * @api public\n */\n\nmicromatch.not = (list, patterns, options = {}) => {\n patterns = [].concat(patterns).map(String);\n let result = new Set();\n let items = [];\n\n let onResult = state => {\n if (options.onResult) options.onResult(state);\n items.push(state.output);\n };\n\n let matches = new Set(micromatch(list, patterns, { ...options, onResult }));\n\n for (let item of items) {\n if (!matches.has(item)) {\n result.add(item);\n }\n }\n return [...result];\n};\n\n/**\n * Returns true if the given `string` contains the given pattern. Similar\n * to [.isMatch](#isMatch) but the pattern can match any part of the string.\n *\n * ```js\n * var mm = require('micromatch');\n * // mm.contains(string, pattern[, options]);\n *\n * console.log(mm.contains('aa/bb/cc', '*b'));\n * //=> true\n * console.log(mm.contains('aa/bb/cc', '*d'));\n * //=> false\n * ```\n * @param {String} `str` The string to match.\n * @param {String|Array} `patterns` Glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any of the patterns matches any part of `str`.\n * @api public\n */\n\nmicromatch.contains = (str, pattern, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n if (Array.isArray(pattern)) {\n return pattern.some(p => micromatch.contains(str, p, options));\n }\n\n if (typeof pattern === 'string') {\n if (isEmptyString(str) || isEmptyString(pattern)) {\n return false;\n }\n\n if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) {\n return true;\n }\n }\n\n return micromatch.isMatch(str, pattern, { ...options, contains: true });\n};\n\n/**\n * Filter the keys of the given object with the given `glob` pattern\n * and `options`. Does not attempt to match nested keys. If you need this feature,\n * use [glob-object][] instead.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matchKeys(object, patterns[, options]);\n *\n * const obj = { aa: 'a', ab: 'b', ac: 'c' };\n * console.log(mm.matchKeys(obj, '*b'));\n * //=> { ab: 'b' }\n * ```\n * @param {Object} `object` The object with keys to filter.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Object} Returns an object with only keys that match the given patterns.\n * @api public\n */\n\nmicromatch.matchKeys = (obj, patterns, options) => {\n if (!utils.isObject(obj)) {\n throw new TypeError('Expected the first argument to be an object');\n }\n let keys = micromatch(Object.keys(obj), patterns, options);\n let res = {};\n for (let key of keys) res[key] = obj[key];\n return res;\n};\n\n/**\n * Returns true if some of the strings in the given `list` match any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.some(list, patterns[, options]);\n *\n * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // true\n * console.log(mm.some(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any `patterns` matches any of the strings in `list`\n * @api public\n */\n\nmicromatch.some = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (items.some(item => isMatch(item))) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Returns true if every string in the given `list` matches\n * any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.every(list, patterns[, options]);\n *\n * console.log(mm.every('foo.js', ['foo.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // false\n * console.log(mm.every(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if all `patterns` matches all of the strings in `list`\n * @api public\n */\n\nmicromatch.every = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (!items.every(item => isMatch(item))) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Returns true if **all** of the given `patterns` match\n * the specified string.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.all(string, patterns[, options]);\n *\n * console.log(mm.all('foo.js', ['foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', '!foo.js']));\n * // false\n *\n * console.log(mm.all('foo.js', ['*.js', 'foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js']));\n * // true\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) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.all = (str, patterns, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n return [].concat(patterns).every(p => picomatch(p, options)(str));\n};\n\n/**\n * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.capture(pattern, string[, options]);\n *\n * console.log(mm.capture('test/*.js', 'test/foo.js'));\n * //=> ['foo']\n * console.log(mm.capture('test/*.js', 'foo/bar.css'));\n * //=> null\n * ```\n * @param {String} `glob` Glob pattern to use for matching.\n * @param {String} `input` String to match\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array|null} Returns an array of captures if the input matches the glob pattern, otherwise `null`.\n * @api public\n */\n\nmicromatch.capture = (glob, input, options) => {\n let posix = utils.isWindows(options);\n let regex = picomatch.makeRe(String(glob), { ...options, capture: true });\n let match = regex.exec(posix ? utils.toPosixSlashes(input) : input);\n\n if (match) {\n return match.slice(1).map(v => v === void 0 ? '' : v);\n }\n};\n\n/**\n * Create a regular expression from the given glob `pattern`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.makeRe(pattern[, options]);\n *\n * console.log(mm.makeRe('*.js'));\n * //=> /^(?:(\\.[\\\\\\/])?(?!\\.)(?=.)[^\\/]*?\\.js)$/\n * ```\n * @param {String} `pattern` A glob pattern to convert to regex.\n * @param {Object} `options`\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\nmicromatch.makeRe = (...args) => picomatch.makeRe(...args);\n\n/**\n * Scan a glob pattern to separate the pattern into segments. Used\n * by the [split](#split) method.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm.scan(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\nmicromatch.scan = (...args) => picomatch.scan(...args);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm.parse(pattern[, options]);\n * ```\n * @param {String} `glob`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as regex source string.\n * @api public\n */\n\nmicromatch.parse = (patterns, options) => {\n let res = [];\n for (let pattern of [].concat(patterns || [])) {\n for (let str of braces(String(pattern), options)) {\n res.push(picomatch.parse(str, options));\n }\n }\n return res;\n};\n\n/**\n * Process the given brace `pattern`.\n *\n * ```js\n * const { braces } = require('micromatch');\n * console.log(braces('foo/{a,b,c}/bar'));\n * //=> [ 'foo/(a|b|c)/bar' ]\n *\n * console.log(braces('foo/{a,b,c}/bar', { expand: true }));\n * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ]\n * ```\n * @param {String} `pattern` String with brace pattern to process.\n * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options.\n * @return {Array}\n * @api public\n */\n\nmicromatch.braces = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n if ((options && options.nobrace === true) || !hasBraces(pattern)) {\n return [pattern];\n }\n return braces(pattern, options);\n};\n\n/**\n * Expand braces\n */\n\nmicromatch.braceExpand = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n return micromatch.braces(pattern, { ...options, expand: true });\n};\n\n/**\n * Expose micromatch\n */\n\n// exposed for tests\nmicromatch.hasBraces = hasBraces;\nmodule.exports = micromatch;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isAbsolute = exports.partitionAbsoluteAndRelative = exports.removeDuplicateSlashes = exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.isPatternRelatedToParentDirectory = exports.getPatternsOutsideCurrentDirectory = exports.getPatternsInsideCurrentDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0;\nconst path = require(\"path\");\nconst globParent = require(\"glob-parent\");\nconst micromatch = require(\"micromatch\");\nconst GLOBSTAR = '**';\nconst ESCAPE_SYMBOL = '\\\\';\nconst COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/;\nconst REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\\[[^[]*]/;\nconst REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\\([^(]*\\|[^|]*\\)/;\nconst GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\\([^(]*\\)/;\nconst BRACE_EXPANSION_SEPARATORS_RE = /,|\\.\\./;\n/**\n * Matches a sequence of two or more consecutive slashes, excluding the first two slashes at the beginning of the string.\n * The latter is due to the presence of the device path at the beginning of the UNC path.\n */\nconst DOUBLE_SLASH_RE = /(?!^)\\/{2,}/g;\nfunction isStaticPattern(pattern, options = {}) {\n return !isDynamicPattern(pattern, options);\n}\nexports.isStaticPattern = isStaticPattern;\nfunction isDynamicPattern(pattern, options = {}) {\n /**\n * A special case with an empty string is necessary for matching patterns that start with a forward slash.\n * An empty string cannot be a dynamic pattern.\n * For example, the pattern `/lib/*` will be spread into parts: '', 'lib', '*'.\n */\n if (pattern === '') {\n return false;\n }\n /**\n * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check\n * filepath directly (without read directory).\n */\n if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) {\n return true;\n }\n if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) {\n return true;\n }\n if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) {\n return true;\n }\n if (options.braceExpansion !== false && hasBraceExpansion(pattern)) {\n return true;\n }\n return false;\n}\nexports.isDynamicPattern = isDynamicPattern;\nfunction hasBraceExpansion(pattern) {\n const openingBraceIndex = pattern.indexOf('{');\n if (openingBraceIndex === -1) {\n return false;\n }\n const closingBraceIndex = pattern.indexOf('}', openingBraceIndex + 1);\n if (closingBraceIndex === -1) {\n return false;\n }\n const braceContent = pattern.slice(openingBraceIndex, closingBraceIndex);\n return BRACE_EXPANSION_SEPARATORS_RE.test(braceContent);\n}\nfunction convertToPositivePattern(pattern) {\n return isNegativePattern(pattern) ? pattern.slice(1) : pattern;\n}\nexports.convertToPositivePattern = convertToPositivePattern;\nfunction convertToNegativePattern(pattern) {\n return '!' + pattern;\n}\nexports.convertToNegativePattern = convertToNegativePattern;\nfunction isNegativePattern(pattern) {\n return pattern.startsWith('!') && pattern[1] !== '(';\n}\nexports.isNegativePattern = isNegativePattern;\nfunction isPositivePattern(pattern) {\n return !isNegativePattern(pattern);\n}\nexports.isPositivePattern = isPositivePattern;\nfunction getNegativePatterns(patterns) {\n return patterns.filter(isNegativePattern);\n}\nexports.getNegativePatterns = getNegativePatterns;\nfunction getPositivePatterns(patterns) {\n return patterns.filter(isPositivePattern);\n}\nexports.getPositivePatterns = getPositivePatterns;\n/**\n * Returns patterns that can be applied inside the current directory.\n *\n * @example\n * // ['./*', '*', 'a/*']\n * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])\n */\nfunction getPatternsInsideCurrentDirectory(patterns) {\n return patterns.filter((pattern) => !isPatternRelatedToParentDirectory(pattern));\n}\nexports.getPatternsInsideCurrentDirectory = getPatternsInsideCurrentDirectory;\n/**\n * Returns patterns to be expanded relative to (outside) the current directory.\n *\n * @example\n * // ['../*', './../*']\n * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])\n */\nfunction getPatternsOutsideCurrentDirectory(patterns) {\n return patterns.filter(isPatternRelatedToParentDirectory);\n}\nexports.getPatternsOutsideCurrentDirectory = getPatternsOutsideCurrentDirectory;\nfunction isPatternRelatedToParentDirectory(pattern) {\n return pattern.startsWith('..') || pattern.startsWith('./..');\n}\nexports.isPatternRelatedToParentDirectory = isPatternRelatedToParentDirectory;\nfunction getBaseDirectory(pattern) {\n return globParent(pattern, { flipBackslashes: false });\n}\nexports.getBaseDirectory = getBaseDirectory;\nfunction hasGlobStar(pattern) {\n return pattern.includes(GLOBSTAR);\n}\nexports.hasGlobStar = hasGlobStar;\nfunction endsWithSlashGlobStar(pattern) {\n return pattern.endsWith('/' + GLOBSTAR);\n}\nexports.endsWithSlashGlobStar = endsWithSlashGlobStar;\nfunction isAffectDepthOfReadingPattern(pattern) {\n const basename = path.basename(pattern);\n return endsWithSlashGlobStar(pattern) || isStaticPattern(basename);\n}\nexports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern;\nfunction expandPatternsWithBraceExpansion(patterns) {\n return patterns.reduce((collection, pattern) => {\n return collection.concat(expandBraceExpansion(pattern));\n }, []);\n}\nexports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion;\nfunction expandBraceExpansion(pattern) {\n const patterns = micromatch.braces(pattern, { expand: true, nodupes: true, keepEscaping: true });\n /**\n * Sort the patterns by length so that the same depth patterns are processed side by side.\n * `a/{b,}/{c,}/*` \u2013 `['a///*', 'a/b//*', 'a//c/*', 'a/b/c/*']`\n */\n patterns.sort((a, b) => a.length - b.length);\n /**\n * Micromatch can return an empty string in the case of patterns like `{a,}`.\n */\n return patterns.filter((pattern) => pattern !== '');\n}\nexports.expandBraceExpansion = expandBraceExpansion;\nfunction getPatternParts(pattern, options) {\n let { parts } = micromatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true }));\n /**\n * The scan method returns an empty array in some cases.\n * See micromatch/picomatch#58 for more details.\n */\n if (parts.length === 0) {\n parts = [pattern];\n }\n /**\n * The scan method does not return an empty part for the pattern with a forward slash.\n * This is another part of micromatch/picomatch#58.\n */\n if (parts[0].startsWith('/')) {\n parts[0] = parts[0].slice(1);\n parts.unshift('');\n }\n return parts;\n}\nexports.getPatternParts = getPatternParts;\nfunction makeRe(pattern, options) {\n return micromatch.makeRe(pattern, options);\n}\nexports.makeRe = makeRe;\nfunction convertPatternsToRe(patterns, options) {\n return patterns.map((pattern) => makeRe(pattern, options));\n}\nexports.convertPatternsToRe = convertPatternsToRe;\nfunction matchAny(entry, patternsRe) {\n return patternsRe.some((patternRe) => patternRe.test(entry));\n}\nexports.matchAny = matchAny;\n/**\n * This package only works with forward slashes as a path separator.\n * Because of this, we cannot use the standard `path.normalize` method, because on Windows platform it will use of backslashes.\n */\nfunction removeDuplicateSlashes(pattern) {\n return pattern.replace(DOUBLE_SLASH_RE, '/');\n}\nexports.removeDuplicateSlashes = removeDuplicateSlashes;\nfunction partitionAbsoluteAndRelative(patterns) {\n const absolute = [];\n const relative = [];\n for (const pattern of patterns) {\n if (isAbsolute(pattern)) {\n absolute.push(pattern);\n }\n else {\n relative.push(pattern);\n }\n }\n return [absolute, relative];\n}\nexports.partitionAbsoluteAndRelative = partitionAbsoluteAndRelative;\nfunction isAbsolute(pattern) {\n return path.isAbsolute(pattern);\n}\nexports.isAbsolute = isAbsolute;\n", "'use strict'\n/*\n * merge2\n * https://github.com/teambition/merge2\n *\n * Copyright (c) 2014-2020 Teambition\n * Licensed under the MIT license.\n */\nconst Stream = require('stream')\nconst PassThrough = Stream.PassThrough\nconst slice = Array.prototype.slice\n\nmodule.exports = merge2\n\nfunction merge2 () {\n const streamsQueue = []\n const args = slice.call(arguments)\n let merging = false\n let options = args[args.length - 1]\n\n if (options && !Array.isArray(options) && options.pipe == null) {\n args.pop()\n } else {\n options = {}\n }\n\n const doEnd = options.end !== false\n const doPipeError = options.pipeError === true\n if (options.objectMode == null) {\n options.objectMode = true\n }\n if (options.highWaterMark == null) {\n options.highWaterMark = 64 * 1024\n }\n const mergedStream = PassThrough(options)\n\n function addStream () {\n for (let i = 0, len = arguments.length; i < len; i++) {\n streamsQueue.push(pauseStreams(arguments[i], options))\n }\n mergeStream()\n return this\n }\n\n function mergeStream () {\n if (merging) {\n return\n }\n merging = true\n\n let streams = streamsQueue.shift()\n if (!streams) {\n process.nextTick(endStream)\n return\n }\n if (!Array.isArray(streams)) {\n streams = [streams]\n }\n\n let pipesCount = streams.length + 1\n\n function next () {\n if (--pipesCount > 0) {\n return\n }\n merging = false\n mergeStream()\n }\n\n function pipe (stream) {\n function onend () {\n stream.removeListener('merge2UnpipeEnd', onend)\n stream.removeListener('end', onend)\n if (doPipeError) {\n stream.removeListener('error', onerror)\n }\n next()\n }\n function onerror (err) {\n mergedStream.emit('error', err)\n }\n // skip ended stream\n if (stream._readableState.endEmitted) {\n return next()\n }\n\n stream.on('merge2UnpipeEnd', onend)\n stream.on('end', onend)\n\n if (doPipeError) {\n stream.on('error', onerror)\n }\n\n stream.pipe(mergedStream, { end: false })\n // compatible for old stream\n stream.resume()\n }\n\n for (let i = 0; i < streams.length; i++) {\n pipe(streams[i])\n }\n\n next()\n }\n\n function endStream () {\n merging = false\n // emit 'queueDrain' when all streams merged.\n mergedStream.emit('queueDrain')\n if (doEnd) {\n mergedStream.end()\n }\n }\n\n mergedStream.setMaxListeners(0)\n mergedStream.add = addStream\n mergedStream.on('unpipe', function (stream) {\n stream.emit('merge2UnpipeEnd')\n })\n\n if (args.length) {\n addStream.apply(null, args)\n }\n return mergedStream\n}\n\n// check and pause streams for pipe.\nfunction pauseStreams (streams, options) {\n if (!Array.isArray(streams)) {\n // Backwards-compat with old-style streams\n if (!streams._readableState && streams.pipe) {\n streams = streams.pipe(PassThrough(options))\n }\n if (!streams._readableState || !streams.pause || !streams.pipe) {\n throw new Error('Only readable stream can be merged.')\n }\n streams.pause()\n } else {\n for (let i = 0, len = streams.length; i < len; i++) {\n streams[i] = pauseStreams(streams[i], options)\n }\n }\n return streams\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.merge = void 0;\nconst merge2 = require(\"merge2\");\nfunction merge(streams) {\n const mergedStream = merge2(streams);\n streams.forEach((stream) => {\n stream.once('error', (error) => mergedStream.emit('error', error));\n });\n mergedStream.once('close', () => propagateCloseEventToSources(streams));\n mergedStream.once('end', () => propagateCloseEventToSources(streams));\n return mergedStream;\n}\nexports.merge = merge;\nfunction propagateCloseEventToSources(streams) {\n streams.forEach((stream) => stream.emit('close'));\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isEmpty = exports.isString = void 0;\nfunction isString(input) {\n return typeof input === 'string';\n}\nexports.isString = isString;\nfunction isEmpty(input) {\n return input === '';\n}\nexports.isEmpty = isEmpty;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.string = exports.stream = exports.pattern = exports.path = exports.fs = exports.errno = exports.array = void 0;\nconst array = require(\"./array\");\nexports.array = array;\nconst errno = require(\"./errno\");\nexports.errno = errno;\nconst fs = require(\"./fs\");\nexports.fs = fs;\nconst path = require(\"./path\");\nexports.path = path;\nconst pattern = require(\"./pattern\");\nexports.pattern = pattern;\nconst stream = require(\"./stream\");\nexports.stream = stream;\nconst string = require(\"./string\");\nexports.string = string;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.convertPatternGroupToTask = exports.convertPatternGroupsToTasks = exports.groupPatternsByBaseDirectory = exports.getNegativePatternsAsPositive = exports.getPositivePatterns = exports.convertPatternsToTasks = exports.generate = void 0;\nconst utils = require(\"../utils\");\nfunction generate(input, settings) {\n const patterns = processPatterns(input, settings);\n const ignore = processPatterns(settings.ignore, settings);\n const positivePatterns = getPositivePatterns(patterns);\n const negativePatterns = getNegativePatternsAsPositive(patterns, ignore);\n const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings));\n const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings));\n const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false);\n const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true);\n return staticTasks.concat(dynamicTasks);\n}\nexports.generate = generate;\nfunction processPatterns(input, settings) {\n let patterns = input;\n /**\n * The original pattern like `{,*,**,a/*}` can lead to problems checking the depth when matching entry\n * and some problems with the micromatch package (see fast-glob issues: #365, #394).\n *\n * To solve this problem, we expand all patterns containing brace expansion. This can lead to a slight slowdown\n * in matching in the case of a large set of patterns after expansion.\n */\n if (settings.braceExpansion) {\n patterns = utils.pattern.expandPatternsWithBraceExpansion(patterns);\n }\n /**\n * If the `baseNameMatch` option is enabled, we must add globstar to patterns, so that they can be used\n * at any nesting level.\n *\n * We do this here, because otherwise we have to complicate the filtering logic. For example, we need to change\n * the pattern in the filter before creating a regular expression. There is no need to change the patterns\n * in the application. Only on the input.\n */\n if (settings.baseNameMatch) {\n patterns = patterns.map((pattern) => pattern.includes('/') ? pattern : `**/${pattern}`);\n }\n /**\n * This method also removes duplicate slashes that may have been in the pattern or formed as a result of expansion.\n */\n return patterns.map((pattern) => utils.pattern.removeDuplicateSlashes(pattern));\n}\n/**\n * Returns tasks grouped by basic pattern directories.\n *\n * Patterns that can be found inside (`./`) and outside (`../`) the current directory are handled separately.\n * This is necessary because directory traversal starts at the base directory and goes deeper.\n */\nfunction convertPatternsToTasks(positive, negative, dynamic) {\n const tasks = [];\n const patternsOutsideCurrentDirectory = utils.pattern.getPatternsOutsideCurrentDirectory(positive);\n const patternsInsideCurrentDirectory = utils.pattern.getPatternsInsideCurrentDirectory(positive);\n const outsideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsOutsideCurrentDirectory);\n const insideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsInsideCurrentDirectory);\n tasks.push(...convertPatternGroupsToTasks(outsideCurrentDirectoryGroup, negative, dynamic));\n /*\n * For the sake of reducing future accesses to the file system, we merge all tasks within the current directory\n * into a global task, if at least one pattern refers to the root (`.`). In this case, the global task covers the rest.\n */\n if ('.' in insideCurrentDirectoryGroup) {\n tasks.push(convertPatternGroupToTask('.', patternsInsideCurrentDirectory, negative, dynamic));\n }\n else {\n tasks.push(...convertPatternGroupsToTasks(insideCurrentDirectoryGroup, negative, dynamic));\n }\n return tasks;\n}\nexports.convertPatternsToTasks = convertPatternsToTasks;\nfunction getPositivePatterns(patterns) {\n return utils.pattern.getPositivePatterns(patterns);\n}\nexports.getPositivePatterns = getPositivePatterns;\nfunction getNegativePatternsAsPositive(patterns, ignore) {\n const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore);\n const positive = negative.map(utils.pattern.convertToPositivePattern);\n return positive;\n}\nexports.getNegativePatternsAsPositive = getNegativePatternsAsPositive;\nfunction groupPatternsByBaseDirectory(patterns) {\n const group = {};\n return patterns.reduce((collection, pattern) => {\n const base = utils.pattern.getBaseDirectory(pattern);\n if (base in collection) {\n collection[base].push(pattern);\n }\n else {\n collection[base] = [pattern];\n }\n return collection;\n }, group);\n}\nexports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory;\nfunction convertPatternGroupsToTasks(positive, negative, dynamic) {\n return Object.keys(positive).map((base) => {\n return convertPatternGroupToTask(base, positive[base], negative, dynamic);\n });\n}\nexports.convertPatternGroupsToTasks = convertPatternGroupsToTasks;\nfunction convertPatternGroupToTask(base, positive, negative, dynamic) {\n return {\n dynamic,\n positive,\n negative,\n base,\n patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern))\n };\n}\nexports.convertPatternGroupToTask = convertPatternGroupToTask;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.read = void 0;\nfunction read(path, settings, callback) {\n settings.fs.lstat(path, (lstatError, lstat) => {\n if (lstatError !== null) {\n callFailureCallback(callback, lstatError);\n return;\n }\n if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {\n callSuccessCallback(callback, lstat);\n return;\n }\n settings.fs.stat(path, (statError, stat) => {\n if (statError !== null) {\n if (settings.throwErrorOnBrokenSymbolicLink) {\n callFailureCallback(callback, statError);\n return;\n }\n callSuccessCallback(callback, lstat);\n return;\n }\n if (settings.markSymbolicLink) {\n stat.isSymbolicLink = () => true;\n }\n callSuccessCallback(callback, stat);\n });\n });\n}\nexports.read = read;\nfunction callFailureCallback(callback, error) {\n callback(error);\n}\nfunction callSuccessCallback(callback, result) {\n callback(null, result);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.read = void 0;\nfunction read(path, settings) {\n const lstat = settings.fs.lstatSync(path);\n if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {\n return lstat;\n }\n try {\n const stat = settings.fs.statSync(path);\n if (settings.markSymbolicLink) {\n stat.isSymbolicLink = () => true;\n }\n return stat;\n }\n catch (error) {\n if (!settings.throwErrorOnBrokenSymbolicLink) {\n return lstat;\n }\n throw error;\n }\n}\nexports.read = read;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;\nconst fs = require(\"fs\");\nexports.FILE_SYSTEM_ADAPTER = {\n lstat: fs.lstat,\n stat: fs.stat,\n lstatSync: fs.lstatSync,\n statSync: fs.statSync\n};\nfunction createFileSystemAdapter(fsMethods) {\n if (fsMethods === undefined) {\n return exports.FILE_SYSTEM_ADAPTER;\n }\n return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);\n}\nexports.createFileSystemAdapter = createFileSystemAdapter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fs = require(\"./adapters/fs\");\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true);\n this.fs = fs.createFileSystemAdapter(this._options.fs);\n this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false);\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);\n }\n _getValue(option, value) {\n return option !== null && option !== void 0 ? option : value;\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.statSync = exports.stat = exports.Settings = void 0;\nconst async = require(\"./providers/async\");\nconst sync = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nexports.Settings = settings_1.default;\nfunction stat(path, optionsOrSettingsOrCallback, callback) {\n if (typeof optionsOrSettingsOrCallback === 'function') {\n async.read(path, getSettings(), optionsOrSettingsOrCallback);\n return;\n }\n async.read(path, getSettings(optionsOrSettingsOrCallback), callback);\n}\nexports.stat = stat;\nfunction statSync(path, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n return sync.read(path, settings);\n}\nexports.statSync = statSync;\nfunction getSettings(settingsOrOptions = {}) {\n if (settingsOrOptions instanceof settings_1.default) {\n return settingsOrOptions;\n }\n return new settings_1.default(settingsOrOptions);\n}\n", "/*! queue-microtask. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\nlet promise\n\nmodule.exports = typeof queueMicrotask === 'function'\n ? queueMicrotask.bind(typeof window !== 'undefined' ? window : global)\n // reuse resolved promise, and allocate it lazily\n : cb => (promise || (promise = Promise.resolve()))\n .then(cb)\n .catch(err => setTimeout(() => { throw err }, 0))\n", "/*! run-parallel. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\nmodule.exports = runParallel\n\nconst queueMicrotask = require('queue-microtask')\n\nfunction runParallel (tasks, cb) {\n let results, pending, keys\n let isSync = true\n\n if (Array.isArray(tasks)) {\n results = []\n pending = tasks.length\n } else {\n keys = Object.keys(tasks)\n results = {}\n pending = keys.length\n }\n\n function done (err) {\n function end () {\n if (cb) cb(err, results)\n cb = null\n }\n if (isSync) queueMicrotask(end)\n else end()\n }\n\n function each (i, err, result) {\n results[i] = result\n if (--pending === 0 || err) {\n done(err)\n }\n }\n\n if (!pending) {\n // empty\n done(null)\n } else if (keys) {\n // object\n keys.forEach(function (key) {\n tasks[key](function (err, result) { each(key, err, result) })\n })\n } else {\n // array\n tasks.forEach(function (task, i) {\n task(function (err, result) { each(i, err, result) })\n })\n }\n\n isSync = false\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = void 0;\nconst NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.');\nif (NODE_PROCESS_VERSION_PARTS[0] === undefined || NODE_PROCESS_VERSION_PARTS[1] === undefined) {\n throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);\n}\nconst MAJOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[0], 10);\nconst MINOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[1], 10);\nconst SUPPORTED_MAJOR_VERSION = 10;\nconst SUPPORTED_MINOR_VERSION = 10;\nconst IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION;\nconst IS_MATCHED_BY_MAJOR_AND_MINOR = MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION;\n/**\n * IS `true` for Node.js 10.10 and greater.\n */\nexports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createDirentFromStats = void 0;\nclass DirentFromStats {\n constructor(name, stats) {\n this.name = name;\n this.isBlockDevice = stats.isBlockDevice.bind(stats);\n this.isCharacterDevice = stats.isCharacterDevice.bind(stats);\n this.isDirectory = stats.isDirectory.bind(stats);\n this.isFIFO = stats.isFIFO.bind(stats);\n this.isFile = stats.isFile.bind(stats);\n this.isSocket = stats.isSocket.bind(stats);\n this.isSymbolicLink = stats.isSymbolicLink.bind(stats);\n }\n}\nfunction createDirentFromStats(name, stats) {\n return new DirentFromStats(name, stats);\n}\nexports.createDirentFromStats = createDirentFromStats;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fs = void 0;\nconst fs = require(\"./fs\");\nexports.fs = fs;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.joinPathSegments = void 0;\nfunction joinPathSegments(a, b, separator) {\n /**\n * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).\n */\n if (a.endsWith(separator)) {\n return a + b;\n }\n return a + separator + b;\n}\nexports.joinPathSegments = joinPathSegments;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readdir = exports.readdirWithFileTypes = exports.read = void 0;\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst rpl = require(\"run-parallel\");\nconst constants_1 = require(\"../constants\");\nconst utils = require(\"../utils\");\nconst common = require(\"./common\");\nfunction read(directory, settings, callback) {\n if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {\n readdirWithFileTypes(directory, settings, callback);\n return;\n }\n readdir(directory, settings, callback);\n}\nexports.read = read;\nfunction readdirWithFileTypes(directory, settings, callback) {\n settings.fs.readdir(directory, { withFileTypes: true }, (readdirError, dirents) => {\n if (readdirError !== null) {\n callFailureCallback(callback, readdirError);\n return;\n }\n const entries = dirents.map((dirent) => ({\n dirent,\n name: dirent.name,\n path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)\n }));\n if (!settings.followSymbolicLinks) {\n callSuccessCallback(callback, entries);\n return;\n }\n const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings));\n rpl(tasks, (rplError, rplEntries) => {\n if (rplError !== null) {\n callFailureCallback(callback, rplError);\n return;\n }\n callSuccessCallback(callback, rplEntries);\n });\n });\n}\nexports.readdirWithFileTypes = readdirWithFileTypes;\nfunction makeRplTaskEntry(entry, settings) {\n return (done) => {\n if (!entry.dirent.isSymbolicLink()) {\n done(null, entry);\n return;\n }\n settings.fs.stat(entry.path, (statError, stats) => {\n if (statError !== null) {\n if (settings.throwErrorOnBrokenSymbolicLink) {\n done(statError);\n return;\n }\n done(null, entry);\n return;\n }\n entry.dirent = utils.fs.createDirentFromStats(entry.name, stats);\n done(null, entry);\n });\n };\n}\nfunction readdir(directory, settings, callback) {\n settings.fs.readdir(directory, (readdirError, names) => {\n if (readdirError !== null) {\n callFailureCallback(callback, readdirError);\n return;\n }\n const tasks = names.map((name) => {\n const path = common.joinPathSegments(directory, name, settings.pathSegmentSeparator);\n return (done) => {\n fsStat.stat(path, settings.fsStatSettings, (error, stats) => {\n if (error !== null) {\n done(error);\n return;\n }\n const entry = {\n name,\n path,\n dirent: utils.fs.createDirentFromStats(name, stats)\n };\n if (settings.stats) {\n entry.stats = stats;\n }\n done(null, entry);\n });\n };\n });\n rpl(tasks, (rplError, entries) => {\n if (rplError !== null) {\n callFailureCallback(callback, rplError);\n return;\n }\n callSuccessCallback(callback, entries);\n });\n });\n}\nexports.readdir = readdir;\nfunction callFailureCallback(callback, error) {\n callback(error);\n}\nfunction callSuccessCallback(callback, result) {\n callback(null, result);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readdir = exports.readdirWithFileTypes = exports.read = void 0;\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst constants_1 = require(\"../constants\");\nconst utils = require(\"../utils\");\nconst common = require(\"./common\");\nfunction read(directory, settings) {\n if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {\n return readdirWithFileTypes(directory, settings);\n }\n return readdir(directory, settings);\n}\nexports.read = read;\nfunction readdirWithFileTypes(directory, settings) {\n const dirents = settings.fs.readdirSync(directory, { withFileTypes: true });\n return dirents.map((dirent) => {\n const entry = {\n dirent,\n name: dirent.name,\n path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)\n };\n if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) {\n try {\n const stats = settings.fs.statSync(entry.path);\n entry.dirent = utils.fs.createDirentFromStats(entry.name, stats);\n }\n catch (error) {\n if (settings.throwErrorOnBrokenSymbolicLink) {\n throw error;\n }\n }\n }\n return entry;\n });\n}\nexports.readdirWithFileTypes = readdirWithFileTypes;\nfunction readdir(directory, settings) {\n const names = settings.fs.readdirSync(directory);\n return names.map((name) => {\n const entryPath = common.joinPathSegments(directory, name, settings.pathSegmentSeparator);\n const stats = fsStat.statSync(entryPath, settings.fsStatSettings);\n const entry = {\n name,\n path: entryPath,\n dirent: utils.fs.createDirentFromStats(name, stats)\n };\n if (settings.stats) {\n entry.stats = stats;\n }\n return entry;\n });\n}\nexports.readdir = readdir;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;\nconst fs = require(\"fs\");\nexports.FILE_SYSTEM_ADAPTER = {\n lstat: fs.lstat,\n stat: fs.stat,\n lstatSync: fs.lstatSync,\n statSync: fs.statSync,\n readdir: fs.readdir,\n readdirSync: fs.readdirSync\n};\nfunction createFileSystemAdapter(fsMethods) {\n if (fsMethods === undefined) {\n return exports.FILE_SYSTEM_ADAPTER;\n }\n return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);\n}\nexports.createFileSystemAdapter = createFileSystemAdapter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst fs = require(\"./adapters/fs\");\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false);\n this.fs = fs.createFileSystemAdapter(this._options.fs);\n this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep);\n this.stats = this._getValue(this._options.stats, false);\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);\n this.fsStatSettings = new fsStat.Settings({\n followSymbolicLink: this.followSymbolicLinks,\n fs: this.fs,\n throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink\n });\n }\n _getValue(option, value) {\n return option !== null && option !== void 0 ? option : value;\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Settings = exports.scandirSync = exports.scandir = void 0;\nconst async = require(\"./providers/async\");\nconst sync = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nexports.Settings = settings_1.default;\nfunction scandir(path, optionsOrSettingsOrCallback, callback) {\n if (typeof optionsOrSettingsOrCallback === 'function') {\n async.read(path, getSettings(), optionsOrSettingsOrCallback);\n return;\n }\n async.read(path, getSettings(optionsOrSettingsOrCallback), callback);\n}\nexports.scandir = scandir;\nfunction scandirSync(path, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n return sync.read(path, settings);\n}\nexports.scandirSync = scandirSync;\nfunction getSettings(settingsOrOptions = {}) {\n if (settingsOrOptions instanceof settings_1.default) {\n return settingsOrOptions;\n }\n return new settings_1.default(settingsOrOptions);\n}\n", "'use strict'\n\nfunction reusify (Constructor) {\n var head = new Constructor()\n var tail = head\n\n function get () {\n var current = head\n\n if (current.next) {\n head = current.next\n } else {\n head = new Constructor()\n tail = head\n }\n\n current.next = null\n\n return current\n }\n\n function release (obj) {\n tail.next = obj\n tail = obj\n }\n\n return {\n get: get,\n release: release\n }\n}\n\nmodule.exports = reusify\n", "'use strict'\n\n/* eslint-disable no-var */\n\nvar reusify = require('reusify')\n\nfunction fastqueue (context, worker, _concurrency) {\n if (typeof context === 'function') {\n _concurrency = worker\n worker = context\n context = null\n }\n\n if (!(_concurrency >= 1)) {\n throw new Error('fastqueue concurrency must be equal to or greater than 1')\n }\n\n var cache = reusify(Task)\n var queueHead = null\n var queueTail = null\n var _running = 0\n var errorHandler = null\n\n var self = {\n push: push,\n drain: noop,\n saturated: noop,\n pause: pause,\n paused: false,\n\n get concurrency () {\n return _concurrency\n },\n set concurrency (value) {\n if (!(value >= 1)) {\n throw new Error('fastqueue concurrency must be equal to or greater than 1')\n }\n _concurrency = value\n\n if (self.paused) return\n for (; queueHead && _running < _concurrency;) {\n _running++\n release()\n }\n },\n\n running: running,\n resume: resume,\n idle: idle,\n length: length,\n getQueue: getQueue,\n unshift: unshift,\n empty: noop,\n kill: kill,\n killAndDrain: killAndDrain,\n error: error,\n abort: abort\n }\n\n return self\n\n function running () {\n return _running\n }\n\n function pause () {\n self.paused = true\n }\n\n function length () {\n var current = queueHead\n var counter = 0\n\n while (current) {\n current = current.next\n counter++\n }\n\n return counter\n }\n\n function getQueue () {\n var current = queueHead\n var tasks = []\n\n while (current) {\n tasks.push(current.value)\n current = current.next\n }\n\n return tasks\n }\n\n function resume () {\n if (!self.paused) return\n self.paused = false\n if (queueHead === null) {\n _running++\n release()\n return\n }\n for (; queueHead && _running < _concurrency;) {\n _running++\n release()\n }\n }\n\n function idle () {\n return _running === 0 && self.length() === 0\n }\n\n function push (value, done) {\n var current = cache.get()\n\n current.context = context\n current.release = release\n current.value = value\n current.callback = done || noop\n current.errorHandler = errorHandler\n\n if (_running >= _concurrency || self.paused) {\n if (queueTail) {\n queueTail.next = current\n queueTail = current\n } else {\n queueHead = current\n queueTail = current\n self.saturated()\n }\n } else {\n _running++\n worker.call(context, current.value, current.worked)\n }\n }\n\n function unshift (value, done) {\n var current = cache.get()\n\n current.context = context\n current.release = release\n current.value = value\n current.callback = done || noop\n current.errorHandler = errorHandler\n\n if (_running >= _concurrency || self.paused) {\n if (queueHead) {\n current.next = queueHead\n queueHead = current\n } else {\n queueHead = current\n queueTail = current\n self.saturated()\n }\n } else {\n _running++\n worker.call(context, current.value, current.worked)\n }\n }\n\n function release (holder) {\n if (holder) {\n cache.release(holder)\n }\n var next = queueHead\n if (next && _running <= _concurrency) {\n if (!self.paused) {\n if (queueTail === queueHead) {\n queueTail = null\n }\n queueHead = next.next\n next.next = null\n worker.call(context, next.value, next.worked)\n if (queueTail === null) {\n self.empty()\n }\n } else {\n _running--\n }\n } else if (--_running === 0) {\n self.drain()\n }\n }\n\n function kill () {\n queueHead = null\n queueTail = null\n self.drain = noop\n }\n\n function killAndDrain () {\n queueHead = null\n queueTail = null\n self.drain()\n self.drain = noop\n }\n\n function abort () {\n var current = queueHead\n queueHead = null\n queueTail = null\n\n while (current) {\n var next = current.next\n var callback = current.callback\n var errorHandler = current.errorHandler\n var val = current.value\n var context = current.context\n\n // Reset the task state\n current.value = null\n current.callback = noop\n current.errorHandler = null\n\n // Call error handler if present\n if (errorHandler) {\n errorHandler(new Error('abort'), val)\n }\n\n // Call callback with error\n callback.call(context, new Error('abort'))\n\n // Release the task back to the pool\n current.release(current)\n\n current = next\n }\n\n self.drain = noop\n }\n\n function error (handler) {\n errorHandler = handler\n }\n}\n\nfunction noop () {}\n\nfunction Task () {\n this.value = null\n this.callback = noop\n this.next = null\n this.release = noop\n this.context = null\n this.errorHandler = null\n\n var self = this\n\n this.worked = function worked (err, result) {\n var callback = self.callback\n var errorHandler = self.errorHandler\n var val = self.value\n self.value = null\n self.callback = noop\n if (self.errorHandler) {\n errorHandler(err, val)\n }\n callback.call(self.context, err, result)\n self.release(self)\n }\n}\n\nfunction queueAsPromised (context, worker, _concurrency) {\n if (typeof context === 'function') {\n _concurrency = worker\n worker = context\n context = null\n }\n\n function asyncWrapper (arg, cb) {\n worker.call(this, arg)\n .then(function (res) {\n cb(null, res)\n }, cb)\n }\n\n var queue = fastqueue(context, asyncWrapper, _concurrency)\n\n var pushCb = queue.push\n var unshiftCb = queue.unshift\n\n queue.push = push\n queue.unshift = unshift\n queue.drained = drained\n\n return queue\n\n function push (value) {\n var p = new Promise(function (resolve, reject) {\n pushCb(value, function (err, result) {\n if (err) {\n reject(err)\n return\n }\n resolve(result)\n })\n })\n\n // Let's fork the promise chain to\n // make the error bubble up to the user but\n // not lead to a unhandledRejection\n p.catch(noop)\n\n return p\n }\n\n function unshift (value) {\n var p = new Promise(function (resolve, reject) {\n unshiftCb(value, function (err, result) {\n if (err) {\n reject(err)\n return\n }\n resolve(result)\n })\n })\n\n // Let's fork the promise chain to\n // make the error bubble up to the user but\n // not lead to a unhandledRejection\n p.catch(noop)\n\n return p\n }\n\n function drained () {\n var p = new Promise(function (resolve) {\n process.nextTick(function () {\n if (queue.idle()) {\n resolve()\n } else {\n var previousDrain = queue.drain\n queue.drain = function () {\n if (typeof previousDrain === 'function') previousDrain()\n resolve()\n queue.drain = previousDrain\n }\n }\n })\n })\n\n return p\n }\n}\n\nmodule.exports = fastqueue\nmodule.exports.promise = queueAsPromised\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.joinPathSegments = exports.replacePathSegmentSeparator = exports.isAppliedFilter = exports.isFatalError = void 0;\nfunction isFatalError(settings, error) {\n if (settings.errorFilter === null) {\n return true;\n }\n return !settings.errorFilter(error);\n}\nexports.isFatalError = isFatalError;\nfunction isAppliedFilter(filter, value) {\n return filter === null || filter(value);\n}\nexports.isAppliedFilter = isAppliedFilter;\nfunction replacePathSegmentSeparator(filepath, separator) {\n return filepath.split(/[/\\\\]/).join(separator);\n}\nexports.replacePathSegmentSeparator = replacePathSegmentSeparator;\nfunction joinPathSegments(a, b, separator) {\n if (a === '') {\n return b;\n }\n /**\n * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).\n */\n if (a.endsWith(separator)) {\n return a + b;\n }\n return a + separator + b;\n}\nexports.joinPathSegments = joinPathSegments;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst common = require(\"./common\");\nclass Reader {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator);\n }\n}\nexports.default = Reader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"events\");\nconst fsScandir = require(\"@nodelib/fs.scandir\");\nconst fastq = require(\"fastq\");\nconst common = require(\"./common\");\nconst reader_1 = require(\"./reader\");\nclass AsyncReader extends reader_1.default {\n constructor(_root, _settings) {\n super(_root, _settings);\n this._settings = _settings;\n this._scandir = fsScandir.scandir;\n this._emitter = new events_1.EventEmitter();\n this._queue = fastq(this._worker.bind(this), this._settings.concurrency);\n this._isFatalError = false;\n this._isDestroyed = false;\n this._queue.drain = () => {\n if (!this._isFatalError) {\n this._emitter.emit('end');\n }\n };\n }\n read() {\n this._isFatalError = false;\n this._isDestroyed = false;\n setImmediate(() => {\n this._pushToQueue(this._root, this._settings.basePath);\n });\n return this._emitter;\n }\n get isDestroyed() {\n return this._isDestroyed;\n }\n destroy() {\n if (this._isDestroyed) {\n throw new Error('The reader is already destroyed');\n }\n this._isDestroyed = true;\n this._queue.killAndDrain();\n }\n onEntry(callback) {\n this._emitter.on('entry', callback);\n }\n onError(callback) {\n this._emitter.once('error', callback);\n }\n onEnd(callback) {\n this._emitter.once('end', callback);\n }\n _pushToQueue(directory, base) {\n const queueItem = { directory, base };\n this._queue.push(queueItem, (error) => {\n if (error !== null) {\n this._handleError(error);\n }\n });\n }\n _worker(item, done) {\n this._scandir(item.directory, this._settings.fsScandirSettings, (error, entries) => {\n if (error !== null) {\n done(error, undefined);\n return;\n }\n for (const entry of entries) {\n this._handleEntry(entry, item.base);\n }\n done(null, undefined);\n });\n }\n _handleError(error) {\n if (this._isDestroyed || !common.isFatalError(this._settings, error)) {\n return;\n }\n this._isFatalError = true;\n this._isDestroyed = true;\n this._emitter.emit('error', error);\n }\n _handleEntry(entry, base) {\n if (this._isDestroyed || this._isFatalError) {\n return;\n }\n const fullpath = entry.path;\n if (base !== undefined) {\n entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);\n }\n if (common.isAppliedFilter(this._settings.entryFilter, entry)) {\n this._emitEntry(entry);\n }\n if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) {\n this._pushToQueue(fullpath, base === undefined ? undefined : entry.path);\n }\n }\n _emitEntry(entry) {\n this._emitter.emit('entry', entry);\n }\n}\nexports.default = AsyncReader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst async_1 = require(\"../readers/async\");\nclass AsyncProvider {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._reader = new async_1.default(this._root, this._settings);\n this._storage = [];\n }\n read(callback) {\n this._reader.onError((error) => {\n callFailureCallback(callback, error);\n });\n this._reader.onEntry((entry) => {\n this._storage.push(entry);\n });\n this._reader.onEnd(() => {\n callSuccessCallback(callback, this._storage);\n });\n this._reader.read();\n }\n}\nexports.default = AsyncProvider;\nfunction callFailureCallback(callback, error) {\n callback(error);\n}\nfunction callSuccessCallback(callback, entries) {\n callback(null, entries);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\nconst async_1 = require(\"../readers/async\");\nclass StreamProvider {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._reader = new async_1.default(this._root, this._settings);\n this._stream = new stream_1.Readable({\n objectMode: true,\n read: () => { },\n destroy: () => {\n if (!this._reader.isDestroyed) {\n this._reader.destroy();\n }\n }\n });\n }\n read() {\n this._reader.onError((error) => {\n this._stream.emit('error', error);\n });\n this._reader.onEntry((entry) => {\n this._stream.push(entry);\n });\n this._reader.onEnd(() => {\n this._stream.push(null);\n });\n this._reader.read();\n return this._stream;\n }\n}\nexports.default = StreamProvider;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fsScandir = require(\"@nodelib/fs.scandir\");\nconst common = require(\"./common\");\nconst reader_1 = require(\"./reader\");\nclass SyncReader extends reader_1.default {\n constructor() {\n super(...arguments);\n this._scandir = fsScandir.scandirSync;\n this._storage = [];\n this._queue = new Set();\n }\n read() {\n this._pushToQueue(this._root, this._settings.basePath);\n this._handleQueue();\n return this._storage;\n }\n _pushToQueue(directory, base) {\n this._queue.add({ directory, base });\n }\n _handleQueue() {\n for (const item of this._queue.values()) {\n this._handleDirectory(item.directory, item.base);\n }\n }\n _handleDirectory(directory, base) {\n try {\n const entries = this._scandir(directory, this._settings.fsScandirSettings);\n for (const entry of entries) {\n this._handleEntry(entry, base);\n }\n }\n catch (error) {\n this._handleError(error);\n }\n }\n _handleError(error) {\n if (!common.isFatalError(this._settings, error)) {\n return;\n }\n throw error;\n }\n _handleEntry(entry, base) {\n const fullpath = entry.path;\n if (base !== undefined) {\n entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);\n }\n if (common.isAppliedFilter(this._settings.entryFilter, entry)) {\n this._pushToStorage(entry);\n }\n if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) {\n this._pushToQueue(fullpath, base === undefined ? undefined : entry.path);\n }\n }\n _pushToStorage(entry) {\n this._storage.push(entry);\n }\n}\nexports.default = SyncReader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst sync_1 = require(\"../readers/sync\");\nclass SyncProvider {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._reader = new sync_1.default(this._root, this._settings);\n }\n read() {\n return this._reader.read();\n }\n}\nexports.default = SyncProvider;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst fsScandir = require(\"@nodelib/fs.scandir\");\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.basePath = this._getValue(this._options.basePath, undefined);\n this.concurrency = this._getValue(this._options.concurrency, Number.POSITIVE_INFINITY);\n this.deepFilter = this._getValue(this._options.deepFilter, null);\n this.entryFilter = this._getValue(this._options.entryFilter, null);\n this.errorFilter = this._getValue(this._options.errorFilter, null);\n this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep);\n this.fsScandirSettings = new fsScandir.Settings({\n followSymbolicLinks: this._options.followSymbolicLinks,\n fs: this._options.fs,\n pathSegmentSeparator: this._options.pathSegmentSeparator,\n stats: this._options.stats,\n throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink\n });\n }\n _getValue(option, value) {\n return option !== null && option !== void 0 ? option : value;\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Settings = exports.walkStream = exports.walkSync = exports.walk = void 0;\nconst async_1 = require(\"./providers/async\");\nconst stream_1 = require(\"./providers/stream\");\nconst sync_1 = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nexports.Settings = settings_1.default;\nfunction walk(directory, optionsOrSettingsOrCallback, callback) {\n if (typeof optionsOrSettingsOrCallback === 'function') {\n new async_1.default(directory, getSettings()).read(optionsOrSettingsOrCallback);\n return;\n }\n new async_1.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback);\n}\nexports.walk = walk;\nfunction walkSync(directory, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n const provider = new sync_1.default(directory, settings);\n return provider.read();\n}\nexports.walkSync = walkSync;\nfunction walkStream(directory, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n const provider = new stream_1.default(directory, settings);\n return provider.read();\n}\nexports.walkStream = walkStream;\nfunction getSettings(settingsOrOptions = {}) {\n if (settingsOrOptions instanceof settings_1.default) {\n return settingsOrOptions;\n }\n return new settings_1.default(settingsOrOptions);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst utils = require(\"../utils\");\nclass Reader {\n constructor(_settings) {\n this._settings = _settings;\n this._fsStatSettings = new fsStat.Settings({\n followSymbolicLink: this._settings.followSymbolicLinks,\n fs: this._settings.fs,\n throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks\n });\n }\n _getFullEntryPath(filepath) {\n return path.resolve(this._settings.cwd, filepath);\n }\n _makeEntry(stats, pattern) {\n const entry = {\n name: pattern,\n path: pattern,\n dirent: utils.fs.createDirentFromStats(pattern, stats)\n };\n if (this._settings.stats) {\n entry.stats = stats;\n }\n return entry;\n }\n _isFatalError(error) {\n return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors;\n }\n}\nexports.default = Reader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst fsWalk = require(\"@nodelib/fs.walk\");\nconst reader_1 = require(\"./reader\");\nclass ReaderStream extends reader_1.default {\n constructor() {\n super(...arguments);\n this._walkStream = fsWalk.walkStream;\n this._stat = fsStat.stat;\n }\n dynamic(root, options) {\n return this._walkStream(root, options);\n }\n static(patterns, options) {\n const filepaths = patterns.map(this._getFullEntryPath, this);\n const stream = new stream_1.PassThrough({ objectMode: true });\n stream._write = (index, _enc, done) => {\n return this._getEntry(filepaths[index], patterns[index], options)\n .then((entry) => {\n if (entry !== null && options.entryFilter(entry)) {\n stream.push(entry);\n }\n if (index === filepaths.length - 1) {\n stream.end();\n }\n done();\n })\n .catch(done);\n };\n for (let i = 0; i < filepaths.length; i++) {\n stream.write(i);\n }\n return stream;\n }\n _getEntry(filepath, pattern, options) {\n return this._getStat(filepath)\n .then((stats) => this._makeEntry(stats, pattern))\n .catch((error) => {\n if (options.errorFilter(error)) {\n return null;\n }\n throw error;\n });\n }\n _getStat(filepath) {\n return new Promise((resolve, reject) => {\n this._stat(filepath, this._fsStatSettings, (error, stats) => {\n return error === null ? resolve(stats) : reject(error);\n });\n });\n }\n}\nexports.default = ReaderStream;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fsWalk = require(\"@nodelib/fs.walk\");\nconst reader_1 = require(\"./reader\");\nconst stream_1 = require(\"./stream\");\nclass ReaderAsync extends reader_1.default {\n constructor() {\n super(...arguments);\n this._walkAsync = fsWalk.walk;\n this._readerStream = new stream_1.default(this._settings);\n }\n dynamic(root, options) {\n return new Promise((resolve, reject) => {\n this._walkAsync(root, options, (error, entries) => {\n if (error === null) {\n resolve(entries);\n }\n else {\n reject(error);\n }\n });\n });\n }\n async static(patterns, options) {\n const entries = [];\n const stream = this._readerStream.static(patterns, options);\n // After #235, replace it with an asynchronous iterator.\n return new Promise((resolve, reject) => {\n stream.once('error', reject);\n stream.on('data', (entry) => entries.push(entry));\n stream.once('end', () => resolve(entries));\n });\n }\n}\nexports.default = ReaderAsync;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nclass Matcher {\n constructor(_patterns, _settings, _micromatchOptions) {\n this._patterns = _patterns;\n this._settings = _settings;\n this._micromatchOptions = _micromatchOptions;\n this._storage = [];\n this._fillStorage();\n }\n _fillStorage() {\n for (const pattern of this._patterns) {\n const segments = this._getPatternSegments(pattern);\n const sections = this._splitSegmentsIntoSections(segments);\n this._storage.push({\n complete: sections.length <= 1,\n pattern,\n segments,\n sections\n });\n }\n }\n _getPatternSegments(pattern) {\n const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions);\n return parts.map((part) => {\n const dynamic = utils.pattern.isDynamicPattern(part, this._settings);\n if (!dynamic) {\n return {\n dynamic: false,\n pattern: part\n };\n }\n return {\n dynamic: true,\n pattern: part,\n patternRe: utils.pattern.makeRe(part, this._micromatchOptions)\n };\n });\n }\n _splitSegmentsIntoSections(segments) {\n return utils.array.splitWhen(segments, (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern));\n }\n}\nexports.default = Matcher;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst matcher_1 = require(\"./matcher\");\nclass PartialMatcher extends matcher_1.default {\n match(filepath) {\n const parts = filepath.split('/');\n const levels = parts.length;\n const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels);\n for (const pattern of patterns) {\n const section = pattern.sections[0];\n /**\n * In this case, the pattern has a globstar and we must read all directories unconditionally,\n * but only if the level has reached the end of the first group.\n *\n * fixtures/{a,b}/**\n * ^ true/false ^ always true\n */\n if (!pattern.complete && levels > section.length) {\n return true;\n }\n const match = parts.every((part, index) => {\n const segment = pattern.segments[index];\n if (segment.dynamic && segment.patternRe.test(part)) {\n return true;\n }\n if (!segment.dynamic && segment.pattern === part) {\n return true;\n }\n return false;\n });\n if (match) {\n return true;\n }\n }\n return false;\n }\n}\nexports.default = PartialMatcher;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nconst partial_1 = require(\"../matchers/partial\");\nclass DeepFilter {\n constructor(_settings, _micromatchOptions) {\n this._settings = _settings;\n this._micromatchOptions = _micromatchOptions;\n }\n getFilter(basePath, positive, negative) {\n const matcher = this._getMatcher(positive);\n const negativeRe = this._getNegativePatternsRe(negative);\n return (entry) => this._filter(basePath, entry, matcher, negativeRe);\n }\n _getMatcher(patterns) {\n return new partial_1.default(patterns, this._settings, this._micromatchOptions);\n }\n _getNegativePatternsRe(patterns) {\n const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern);\n return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions);\n }\n _filter(basePath, entry, matcher, negativeRe) {\n if (this._isSkippedByDeep(basePath, entry.path)) {\n return false;\n }\n if (this._isSkippedSymbolicLink(entry)) {\n return false;\n }\n const filepath = utils.path.removeLeadingDotSegment(entry.path);\n if (this._isSkippedByPositivePatterns(filepath, matcher)) {\n return false;\n }\n return this._isSkippedByNegativePatterns(filepath, negativeRe);\n }\n _isSkippedByDeep(basePath, entryPath) {\n /**\n * Avoid unnecessary depth calculations when it doesn't matter.\n */\n if (this._settings.deep === Infinity) {\n return false;\n }\n return this._getEntryLevel(basePath, entryPath) >= this._settings.deep;\n }\n _getEntryLevel(basePath, entryPath) {\n const entryPathDepth = entryPath.split('/').length;\n if (basePath === '') {\n return entryPathDepth;\n }\n const basePathDepth = basePath.split('/').length;\n return entryPathDepth - basePathDepth;\n }\n _isSkippedSymbolicLink(entry) {\n return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink();\n }\n _isSkippedByPositivePatterns(entryPath, matcher) {\n return !this._settings.baseNameMatch && !matcher.match(entryPath);\n }\n _isSkippedByNegativePatterns(entryPath, patternsRe) {\n return !utils.pattern.matchAny(entryPath, patternsRe);\n }\n}\nexports.default = DeepFilter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nclass EntryFilter {\n constructor(_settings, _micromatchOptions) {\n this._settings = _settings;\n this._micromatchOptions = _micromatchOptions;\n this.index = new Map();\n }\n getFilter(positive, negative) {\n const [absoluteNegative, relativeNegative] = utils.pattern.partitionAbsoluteAndRelative(negative);\n const patterns = {\n positive: {\n all: utils.pattern.convertPatternsToRe(positive, this._micromatchOptions)\n },\n negative: {\n absolute: utils.pattern.convertPatternsToRe(absoluteNegative, Object.assign(Object.assign({}, this._micromatchOptions), { dot: true })),\n relative: utils.pattern.convertPatternsToRe(relativeNegative, Object.assign(Object.assign({}, this._micromatchOptions), { dot: true }))\n }\n };\n return (entry) => this._filter(entry, patterns);\n }\n _filter(entry, patterns) {\n const filepath = utils.path.removeLeadingDotSegment(entry.path);\n if (this._settings.unique && this._isDuplicateEntry(filepath)) {\n return false;\n }\n if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) {\n return false;\n }\n const isMatched = this._isMatchToPatternsSet(filepath, patterns, entry.dirent.isDirectory());\n if (this._settings.unique && isMatched) {\n this._createIndexRecord(filepath);\n }\n return isMatched;\n }\n _isDuplicateEntry(filepath) {\n return this.index.has(filepath);\n }\n _createIndexRecord(filepath) {\n this.index.set(filepath, undefined);\n }\n _onlyFileFilter(entry) {\n return this._settings.onlyFiles && !entry.dirent.isFile();\n }\n _onlyDirectoryFilter(entry) {\n return this._settings.onlyDirectories && !entry.dirent.isDirectory();\n }\n _isMatchToPatternsSet(filepath, patterns, isDirectory) {\n const isMatched = this._isMatchToPatterns(filepath, patterns.positive.all, isDirectory);\n if (!isMatched) {\n return false;\n }\n const isMatchedByRelativeNegative = this._isMatchToPatterns(filepath, patterns.negative.relative, isDirectory);\n if (isMatchedByRelativeNegative) {\n return false;\n }\n const isMatchedByAbsoluteNegative = this._isMatchToAbsoluteNegative(filepath, patterns.negative.absolute, isDirectory);\n if (isMatchedByAbsoluteNegative) {\n return false;\n }\n return true;\n }\n _isMatchToAbsoluteNegative(filepath, patternsRe, isDirectory) {\n if (patternsRe.length === 0) {\n return false;\n }\n const fullpath = utils.path.makeAbsolute(this._settings.cwd, filepath);\n return this._isMatchToPatterns(fullpath, patternsRe, isDirectory);\n }\n _isMatchToPatterns(filepath, patternsRe, isDirectory) {\n if (patternsRe.length === 0) {\n return false;\n }\n // Trying to match files and directories by patterns.\n const isMatched = utils.pattern.matchAny(filepath, patternsRe);\n // A pattern with a trailling slash can be used for directory matching.\n // To apply such pattern, we need to add a tralling slash to the path.\n if (!isMatched && isDirectory) {\n return utils.pattern.matchAny(filepath + '/', patternsRe);\n }\n return isMatched;\n }\n}\nexports.default = EntryFilter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nclass ErrorFilter {\n constructor(_settings) {\n this._settings = _settings;\n }\n getFilter() {\n return (error) => this._isNonFatalError(error);\n }\n _isNonFatalError(error) {\n return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors;\n }\n}\nexports.default = ErrorFilter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nclass EntryTransformer {\n constructor(_settings) {\n this._settings = _settings;\n }\n getTransformer() {\n return (entry) => this._transform(entry);\n }\n _transform(entry) {\n let filepath = entry.path;\n if (this._settings.absolute) {\n filepath = utils.path.makeAbsolute(this._settings.cwd, filepath);\n filepath = utils.path.unixify(filepath);\n }\n if (this._settings.markDirectories && entry.dirent.isDirectory()) {\n filepath += '/';\n }\n if (!this._settings.objectMode) {\n return filepath;\n }\n return Object.assign(Object.assign({}, entry), { path: filepath });\n }\n}\nexports.default = EntryTransformer;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst deep_1 = require(\"./filters/deep\");\nconst entry_1 = require(\"./filters/entry\");\nconst error_1 = require(\"./filters/error\");\nconst entry_2 = require(\"./transformers/entry\");\nclass Provider {\n constructor(_settings) {\n this._settings = _settings;\n this.errorFilter = new error_1.default(this._settings);\n this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions());\n this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions());\n this.entryTransformer = new entry_2.default(this._settings);\n }\n _getRootDirectory(task) {\n return path.resolve(this._settings.cwd, task.base);\n }\n _getReaderOptions(task) {\n const basePath = task.base === '.' ? '' : task.base;\n return {\n basePath,\n pathSegmentSeparator: '/',\n concurrency: this._settings.concurrency,\n deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative),\n entryFilter: this.entryFilter.getFilter(task.positive, task.negative),\n errorFilter: this.errorFilter.getFilter(),\n followSymbolicLinks: this._settings.followSymbolicLinks,\n fs: this._settings.fs,\n stats: this._settings.stats,\n throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink,\n transform: this.entryTransformer.getTransformer()\n };\n }\n _getMicromatchOptions() {\n return {\n dot: this._settings.dot,\n matchBase: this._settings.baseNameMatch,\n nobrace: !this._settings.braceExpansion,\n nocase: !this._settings.caseSensitiveMatch,\n noext: !this._settings.extglob,\n noglobstar: !this._settings.globstar,\n posix: true,\n strictSlashes: false\n };\n }\n}\nexports.default = Provider;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst async_1 = require(\"../readers/async\");\nconst provider_1 = require(\"./provider\");\nclass ProviderAsync extends provider_1.default {\n constructor() {\n super(...arguments);\n this._reader = new async_1.default(this._settings);\n }\n async read(task) {\n const root = this._getRootDirectory(task);\n const options = this._getReaderOptions(task);\n const entries = await this.api(root, task, options);\n return entries.map((entry) => options.transform(entry));\n }\n api(root, task, options) {\n if (task.dynamic) {\n return this._reader.dynamic(root, options);\n }\n return this._reader.static(task.patterns, options);\n }\n}\nexports.default = ProviderAsync;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\nconst stream_2 = require(\"../readers/stream\");\nconst provider_1 = require(\"./provider\");\nclass ProviderStream extends provider_1.default {\n constructor() {\n super(...arguments);\n this._reader = new stream_2.default(this._settings);\n }\n read(task) {\n const root = this._getRootDirectory(task);\n const options = this._getReaderOptions(task);\n const source = this.api(root, task, options);\n const destination = new stream_1.Readable({ objectMode: true, read: () => { } });\n source\n .once('error', (error) => destination.emit('error', error))\n .on('data', (entry) => destination.emit('data', options.transform(entry)))\n .once('end', () => destination.emit('end'));\n destination\n .once('close', () => source.destroy());\n return destination;\n }\n api(root, task, options) {\n if (task.dynamic) {\n return this._reader.dynamic(root, options);\n }\n return this._reader.static(task.patterns, options);\n }\n}\nexports.default = ProviderStream;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst fsWalk = require(\"@nodelib/fs.walk\");\nconst reader_1 = require(\"./reader\");\nclass ReaderSync extends reader_1.default {\n constructor() {\n super(...arguments);\n this._walkSync = fsWalk.walkSync;\n this._statSync = fsStat.statSync;\n }\n dynamic(root, options) {\n return this._walkSync(root, options);\n }\n static(patterns, options) {\n const entries = [];\n for (const pattern of patterns) {\n const filepath = this._getFullEntryPath(pattern);\n const entry = this._getEntry(filepath, pattern, options);\n if (entry === null || !options.entryFilter(entry)) {\n continue;\n }\n entries.push(entry);\n }\n return entries;\n }\n _getEntry(filepath, pattern, options) {\n try {\n const stats = this._getStat(filepath);\n return this._makeEntry(stats, pattern);\n }\n catch (error) {\n if (options.errorFilter(error)) {\n return null;\n }\n throw error;\n }\n }\n _getStat(filepath) {\n return this._statSync(filepath, this._fsStatSettings);\n }\n}\nexports.default = ReaderSync;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst sync_1 = require(\"../readers/sync\");\nconst provider_1 = require(\"./provider\");\nclass ProviderSync extends provider_1.default {\n constructor() {\n super(...arguments);\n this._reader = new sync_1.default(this._settings);\n }\n read(task) {\n const root = this._getRootDirectory(task);\n const options = this._getReaderOptions(task);\n const entries = this.api(root, task, options);\n return entries.map(options.transform);\n }\n api(root, task, options) {\n if (task.dynamic) {\n return this._reader.dynamic(root, options);\n }\n return this._reader.static(task.patterns, options);\n }\n}\nexports.default = ProviderSync;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0;\nconst fs = require(\"fs\");\nconst os = require(\"os\");\n/**\n * The `os.cpus` method can return zero. We expect the number of cores to be greater than zero.\n * https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107\n */\nconst CPU_COUNT = Math.max(os.cpus().length, 1);\nexports.DEFAULT_FILE_SYSTEM_ADAPTER = {\n lstat: fs.lstat,\n lstatSync: fs.lstatSync,\n stat: fs.stat,\n statSync: fs.statSync,\n readdir: fs.readdir,\n readdirSync: fs.readdirSync\n};\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.absolute = this._getValue(this._options.absolute, false);\n this.baseNameMatch = this._getValue(this._options.baseNameMatch, false);\n this.braceExpansion = this._getValue(this._options.braceExpansion, true);\n this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true);\n this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT);\n this.cwd = this._getValue(this._options.cwd, process.cwd());\n this.deep = this._getValue(this._options.deep, Infinity);\n this.dot = this._getValue(this._options.dot, false);\n this.extglob = this._getValue(this._options.extglob, true);\n this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true);\n this.fs = this._getFileSystemMethods(this._options.fs);\n this.globstar = this._getValue(this._options.globstar, true);\n this.ignore = this._getValue(this._options.ignore, []);\n this.markDirectories = this._getValue(this._options.markDirectories, false);\n this.objectMode = this._getValue(this._options.objectMode, false);\n this.onlyDirectories = this._getValue(this._options.onlyDirectories, false);\n this.onlyFiles = this._getValue(this._options.onlyFiles, true);\n this.stats = this._getValue(this._options.stats, false);\n this.suppressErrors = this._getValue(this._options.suppressErrors, false);\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false);\n this.unique = this._getValue(this._options.unique, true);\n if (this.onlyDirectories) {\n this.onlyFiles = false;\n }\n if (this.stats) {\n this.objectMode = true;\n }\n // Remove the cast to the array in the next major (#404).\n this.ignore = [].concat(this.ignore);\n }\n _getValue(option, value) {\n return option === undefined ? value : option;\n }\n _getFileSystemMethods(methods = {}) {\n return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods);\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nconst taskManager = require(\"./managers/tasks\");\nconst async_1 = require(\"./providers/async\");\nconst stream_1 = require(\"./providers/stream\");\nconst sync_1 = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nconst utils = require(\"./utils\");\nasync function FastGlob(source, options) {\n assertPatternsInput(source);\n const works = getWorks(source, async_1.default, options);\n const result = await Promise.all(works);\n return utils.array.flatten(result);\n}\n// https://github.com/typescript-eslint/typescript-eslint/issues/60\n// eslint-disable-next-line no-redeclare\n(function (FastGlob) {\n FastGlob.glob = FastGlob;\n FastGlob.globSync = sync;\n FastGlob.globStream = stream;\n FastGlob.async = FastGlob;\n function sync(source, options) {\n assertPatternsInput(source);\n const works = getWorks(source, sync_1.default, options);\n return utils.array.flatten(works);\n }\n FastGlob.sync = sync;\n function stream(source, options) {\n assertPatternsInput(source);\n const works = getWorks(source, stream_1.default, options);\n /**\n * The stream returned by the provider cannot work with an asynchronous iterator.\n * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams.\n * This affects performance (+25%). I don't see best solution right now.\n */\n return utils.stream.merge(works);\n }\n FastGlob.stream = stream;\n function generateTasks(source, options) {\n assertPatternsInput(source);\n const patterns = [].concat(source);\n const settings = new settings_1.default(options);\n return taskManager.generate(patterns, settings);\n }\n FastGlob.generateTasks = generateTasks;\n function isDynamicPattern(source, options) {\n assertPatternsInput(source);\n const settings = new settings_1.default(options);\n return utils.pattern.isDynamicPattern(source, settings);\n }\n FastGlob.isDynamicPattern = isDynamicPattern;\n function escapePath(source) {\n assertPatternsInput(source);\n return utils.path.escape(source);\n }\n FastGlob.escapePath = escapePath;\n function convertPathToPattern(source) {\n assertPatternsInput(source);\n return utils.path.convertPathToPattern(source);\n }\n FastGlob.convertPathToPattern = convertPathToPattern;\n let posix;\n (function (posix) {\n function escapePath(source) {\n assertPatternsInput(source);\n return utils.path.escapePosixPath(source);\n }\n posix.escapePath = escapePath;\n function convertPathToPattern(source) {\n assertPatternsInput(source);\n return utils.path.convertPosixPathToPattern(source);\n }\n posix.convertPathToPattern = convertPathToPattern;\n })(posix = FastGlob.posix || (FastGlob.posix = {}));\n let win32;\n (function (win32) {\n function escapePath(source) {\n assertPatternsInput(source);\n return utils.path.escapeWindowsPath(source);\n }\n win32.escapePath = escapePath;\n function convertPathToPattern(source) {\n assertPatternsInput(source);\n return utils.path.convertWindowsPathToPattern(source);\n }\n win32.convertPathToPattern = convertPathToPattern;\n })(win32 = FastGlob.win32 || (FastGlob.win32 = {}));\n})(FastGlob || (FastGlob = {}));\nfunction getWorks(source, _Provider, options) {\n const patterns = [].concat(source);\n const settings = new settings_1.default(options);\n const tasks = taskManager.generate(patterns, settings);\n const provider = new _Provider(settings);\n return tasks.map(provider.read, provider);\n}\nfunction assertPatternsInput(input) {\n const source = [].concat(input);\n const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item));\n if (!isValidSource) {\n throw new TypeError('Patterns must be a string (non empty) or an array of strings');\n }\n}\nmodule.exports = FastGlob;\n", "export async function delay({seconds, milliseconds} = {}) {\n\tlet duration;\n\tif (typeof seconds === 'number') {\n\t\tduration = seconds * 1000;\n\t} else if (typeof milliseconds === 'number') {\n\t\tduration = milliseconds;\n\t} else {\n\t\tthrow new TypeError('Expected an object with either `seconds` or `milliseconds`.');\n\t}\n\n\treturn new Promise(resolve => {\n\t\tsetTimeout(resolve, duration);\n\t});\n}\n", "import {promisify} from 'node:util';\nimport {execFile as execFileCallback, execFileSync as execFileSyncOriginal} from 'node:child_process';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nconst execFileOriginal = promisify(execFileCallback);\n\nexport function toPath(urlOrPath) {\n\treturn urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;\n}\n\nexport function rootDirectory(pathInput) {\n\treturn path.parse(toPath(pathInput)).root;\n}\n\nexport function traversePathUp(startPath) {\n\treturn {\n\t\t* [Symbol.iterator]() {\n\t\t\tlet currentPath = path.resolve(toPath(startPath));\n\t\t\tlet previousPath;\n\n\t\t\twhile (previousPath !== currentPath) {\n\t\t\t\tyield currentPath;\n\t\t\t\tpreviousPath = currentPath;\n\t\t\t\tcurrentPath = path.resolve(currentPath, '..');\n\t\t\t}\n\t\t},\n\t};\n}\n\nconst TEN_MEGABYTES_IN_BYTES = 10 * 1024 * 1024;\n\nexport async function execFile(file, arguments_, options = {}) {\n\treturn execFileOriginal(file, arguments_, {\n\t\tmaxBuffer: TEN_MEGABYTES_IN_BYTES,\n\t\t...options,\n\t});\n}\n\nexport function execFileSync(file, arguments_ = [], options = {}) {\n\treturn execFileSyncOriginal(file, arguments_, {\n\t\tmaxBuffer: TEN_MEGABYTES_IN_BYTES,\n\t\tencoding: 'utf8',\n\t\tstdio: 'pipe',\n\t\t...options,\n\t});\n}\n\nexport * from './default.js';\n", "// A simple implementation of make-array\nfunction makeArray (subject) {\n return Array.isArray(subject)\n ? subject\n : [subject]\n}\n\nconst UNDEFINED = undefined\nconst EMPTY = ''\nconst SPACE = ' '\nconst ESCAPE = '\\\\'\nconst REGEX_TEST_BLANK_LINE = /^\\s+$/\nconst REGEX_INVALID_TRAILING_BACKSLASH = /(?:[^\\\\]|^)\\\\$/\nconst REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\\\!/\nconst REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\\\#/\nconst REGEX_SPLITALL_CRLF = /\\r?\\n/g\n\n// Invalid:\n// - /foo,\n// - ./foo,\n// - ../foo,\n// - .\n// - ..\n// Valid:\n// - .foo\nconst REGEX_TEST_INVALID_PATH = /^\\.{0,2}\\/|^\\.{1,2}$/\n\nconst REGEX_TEST_TRAILING_SLASH = /\\/$/\n\nconst SLASH = '/'\n\n// Do not use ternary expression here, since \"istanbul ignore next\" is buggy\nlet TMP_KEY_IGNORE = 'node-ignore'\n/* istanbul ignore else */\nif (typeof Symbol !== 'undefined') {\n TMP_KEY_IGNORE = Symbol.for('node-ignore')\n}\nconst KEY_IGNORE = TMP_KEY_IGNORE\n\nconst define = (object, key, value) => {\n Object.defineProperty(object, key, {value})\n return value\n}\n\nconst REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g\n\nconst RETURN_FALSE = () => false\n\n// Sanitize the range of a regular expression\n// The cases are complicated, see test cases for details\nconst sanitizeRange = range => range.replace(\n REGEX_REGEXP_RANGE,\n (match, from, to) => from.charCodeAt(0) <= to.charCodeAt(0)\n ? match\n // Invalid range (out of order) which is ok for gitignore rules but\n // fatal for JavaScript regular expression, so eliminate it.\n : EMPTY\n)\n\n// See fixtures #59\nconst cleanRangeBackSlash = slashes => {\n const {length} = slashes\n return slashes.slice(0, length - length % 2)\n}\n\n// > If the pattern ends with a slash,\n// > it is removed for the purpose of the following description,\n// > but it would only find a match with a directory.\n// > In other words, foo/ will match a directory foo and paths underneath it,\n// > but will not match a regular file or a symbolic link foo\n// > (this is consistent with the way how pathspec works in general in Git).\n// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`'\n// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call\n// you could use option `mark: true` with `glob`\n\n// '`foo/`' should not continue with the '`..`'\nconst REPLACERS = [\n\n [\n // Remove BOM\n // TODO:\n // Other similar zero-width characters?\n /^\\uFEFF/,\n () => EMPTY\n ],\n\n // > Trailing spaces are ignored unless they are quoted with backslash (\"\\\")\n [\n // (a\\ ) -> (a )\n // (a ) -> (a)\n // (a ) -> (a)\n // (a \\ ) -> (a )\n /((?:\\\\\\\\)*?)(\\\\?\\s+)$/,\n (_, m1, m2) => m1 + (\n m2.indexOf('\\\\') === 0\n ? SPACE\n : EMPTY\n )\n ],\n\n // Replace (\\ ) with ' '\n // (\\ ) -> ' '\n // (\\\\ ) -> '\\\\ '\n // (\\\\\\ ) -> '\\\\ '\n [\n /(\\\\+?)\\s/g,\n (_, m1) => {\n const {length} = m1\n return m1.slice(0, length - length % 2) + SPACE\n }\n ],\n\n // Escape metacharacters\n // which is written down by users but means special for regular expressions.\n\n // > There are 12 characters with special meanings:\n // > - the backslash \\,\n // > - the caret ^,\n // > - the dollar sign $,\n // > - the period or dot .,\n // > - the vertical bar or pipe symbol |,\n // > - the question mark ?,\n // > - the asterisk or star *,\n // > - the plus sign +,\n // > - the opening parenthesis (,\n // > - the closing parenthesis ),\n // > - and the opening square bracket [,\n // > - the opening curly brace {,\n // > These special characters are often called \"metacharacters\".\n [\n /[\\\\$.|*+(){^]/g,\n match => `\\\\${match}`\n ],\n\n [\n // > a question mark (?) matches a single character\n /(?!\\\\)\\?/g,\n () => '[^/]'\n ],\n\n // leading slash\n [\n\n // > A leading slash matches the beginning of the pathname.\n // > For example, \"/*.c\" matches \"cat-file.c\" but not \"mozilla-sha1/sha1.c\".\n // A leading slash matches the beginning of the pathname\n /^\\//,\n () => '^'\n ],\n\n // replace special metacharacter slash after the leading slash\n [\n /\\//g,\n () => '\\\\/'\n ],\n\n [\n // > A leading \"**\" followed by a slash means match in all directories.\n // > For example, \"**/foo\" matches file or directory \"foo\" anywhere,\n // > the same as pattern \"foo\".\n // > \"**/foo/bar\" matches file or directory \"bar\" anywhere that is directly\n // > under directory \"foo\".\n // Notice that the '*'s have been replaced as '\\\\*'\n /^\\^*\\\\\\*\\\\\\*\\\\\\//,\n\n // '**/foo' <-> 'foo'\n () => '^(?:.*\\\\/)?'\n ],\n\n // starting\n [\n // there will be no leading '/'\n // (which has been replaced by section \"leading slash\")\n // If starts with '**', adding a '^' to the regular expression also works\n /^(?=[^^])/,\n function startingReplacer () {\n // If has a slash `/` at the beginning or middle\n return !/\\/(?!$)/.test(this)\n // > Prior to 2.22.1\n // > If the pattern does not contain a slash /,\n // > Git treats it as a shell glob pattern\n // Actually, if there is only a trailing slash,\n // git also treats it as a shell glob pattern\n\n // After 2.22.1 (compatible but clearer)\n // > If there is a separator at the beginning or middle (or both)\n // > of the pattern, then the pattern is relative to the directory\n // > level of the particular .gitignore file itself.\n // > Otherwise the pattern may also match at any level below\n // > the .gitignore level.\n ? '(?:^|\\\\/)'\n\n // > Otherwise, Git treats the pattern as a shell glob suitable for\n // > consumption by fnmatch(3)\n : '^'\n }\n ],\n\n // two globstars\n [\n // Use lookahead assertions so that we could match more than one `'/**'`\n /\\\\\\/\\\\\\*\\\\\\*(?=\\\\\\/|$)/g,\n\n // Zero, one or several directories\n // should not use '*', or it will be replaced by the next replacer\n\n // Check if it is not the last `'/**'`\n (_, index, str) => index + 6 < str.length\n\n // case: /**/\n // > A slash followed by two consecutive asterisks then a slash matches\n // > zero or more directories.\n // > For example, \"a/**/b\" matches \"a/b\", \"a/x/b\", \"a/x/y/b\" and so on.\n // '/**/'\n ? '(?:\\\\/[^\\\\/]+)*'\n\n // case: /**\n // > A trailing `\"/**\"` matches everything inside.\n\n // #21: everything inside but it should not include the current folder\n : '\\\\/.+'\n ],\n\n // normal intermediate wildcards\n [\n // Never replace escaped '*'\n // ignore rule '\\*' will match the path '*'\n\n // 'abc.*/' -> go\n // 'abc.*' -> skip this rule,\n // coz trailing single wildcard will be handed by [trailing wildcard]\n /(^|[^\\\\]+)(\\\\\\*)+(?=.+)/g,\n\n // '*.js' matches '.js'\n // '*.js' doesn't match 'abc'\n (_, p1, p2) => {\n // 1.\n // > An asterisk \"*\" matches anything except a slash.\n // 2.\n // > Other consecutive asterisks are considered regular asterisks\n // > and will match according to the previous rules.\n const unescaped = p2.replace(/\\\\\\*/g, '[^\\\\/]*')\n return p1 + unescaped\n }\n ],\n\n [\n // unescape, revert step 3 except for back slash\n // For example, if a user escape a '\\\\*',\n // after step 3, the result will be '\\\\\\\\\\\\*'\n /\\\\\\\\\\\\(?=[$.|*+(){^])/g,\n () => ESCAPE\n ],\n\n [\n // '\\\\\\\\' -> '\\\\'\n /\\\\\\\\/g,\n () => ESCAPE\n ],\n\n [\n // > The range notation, e.g. [a-zA-Z],\n // > can be used to match one of the characters in a range.\n\n // `\\` is escaped by step 3\n /(\\\\)?\\[([^\\]/]*?)(\\\\*)($|\\])/g,\n (match, leadEscape, range, endEscape, close) => leadEscape === ESCAPE\n // '\\\\[bar]' -> '\\\\\\\\[bar\\\\]'\n ? `\\\\[${range}${cleanRangeBackSlash(endEscape)}${close}`\n : close === ']'\n ? endEscape.length % 2 === 0\n // A normal case, and it is a range notation\n // '[bar]'\n // '[bar\\\\\\\\]'\n ? `[${sanitizeRange(range)}${endEscape}]`\n // Invalid range notaton\n // '[bar\\\\]' -> '[bar\\\\\\\\]'\n : '[]'\n : '[]'\n ],\n\n // ending\n [\n // 'js' will not match 'js.'\n // 'ab' will not match 'abc'\n /(?:[^*])$/,\n\n // WTF!\n // https://git-scm.com/docs/gitignore\n // changes in [2.22.1](https://git-scm.com/docs/gitignore/2.22.1)\n // which re-fixes #24, #38\n\n // > If there is a separator at the end of the pattern then the pattern\n // > will only match directories, otherwise the pattern can match both\n // > files and directories.\n\n // 'js*' will not match 'a.js'\n // 'js/' will not match 'a.js'\n // 'js' will match 'a.js' and 'a.js/'\n match => /\\/$/.test(match)\n // foo/ will not match 'foo'\n ? `${match}$`\n // foo matches 'foo' and 'foo/'\n : `${match}(?=$|\\\\/$)`\n ]\n]\n\nconst REGEX_REPLACE_TRAILING_WILDCARD = /(^|\\\\\\/)?\\\\\\*$/\nconst MODE_IGNORE = 'regex'\nconst MODE_CHECK_IGNORE = 'checkRegex'\nconst UNDERSCORE = '_'\n\nconst TRAILING_WILD_CARD_REPLACERS = {\n [MODE_IGNORE] (_, p1) {\n const prefix = p1\n // '\\^':\n // '/*' does not match EMPTY\n // '/*' does not match everything\n\n // '\\\\\\/':\n // 'abc/*' does not match 'abc/'\n ? `${p1}[^/]+`\n\n // 'a*' matches 'a'\n // 'a*' matches 'aa'\n : '[^/]*'\n\n return `${prefix}(?=$|\\\\/$)`\n },\n\n [MODE_CHECK_IGNORE] (_, p1) {\n // When doing `git check-ignore`\n const prefix = p1\n // '\\\\\\/':\n // 'abc/*' DOES match 'abc/' !\n ? `${p1}[^/]*`\n\n // 'a*' matches 'a'\n // 'a*' matches 'aa'\n : '[^/]*'\n\n return `${prefix}(?=$|\\\\/$)`\n }\n}\n\n// @param {pattern}\nconst makeRegexPrefix = pattern => REPLACERS.reduce(\n (prev, [matcher, replacer]) =>\n prev.replace(matcher, replacer.bind(pattern)),\n pattern\n)\n\nconst isString = subject => typeof subject === 'string'\n\n// > A blank line matches no files, so it can serve as a separator for readability.\nconst checkPattern = pattern => pattern\n && isString(pattern)\n && !REGEX_TEST_BLANK_LINE.test(pattern)\n && !REGEX_INVALID_TRAILING_BACKSLASH.test(pattern)\n\n // > A line starting with # serves as a comment.\n && pattern.indexOf('#') !== 0\n\nconst splitPattern = pattern => pattern\n.split(REGEX_SPLITALL_CRLF)\n.filter(Boolean)\n\nclass IgnoreRule {\n constructor (\n pattern,\n mark,\n body,\n ignoreCase,\n negative,\n prefix\n ) {\n this.pattern = pattern\n this.mark = mark\n this.negative = negative\n\n define(this, 'body', body)\n define(this, 'ignoreCase', ignoreCase)\n define(this, 'regexPrefix', prefix)\n }\n\n get regex () {\n const key = UNDERSCORE + MODE_IGNORE\n\n if (this[key]) {\n return this[key]\n }\n\n return this._make(MODE_IGNORE, key)\n }\n\n get checkRegex () {\n const key = UNDERSCORE + MODE_CHECK_IGNORE\n\n if (this[key]) {\n return this[key]\n }\n\n return this._make(MODE_CHECK_IGNORE, key)\n }\n\n _make (mode, key) {\n const str = this.regexPrefix.replace(\n REGEX_REPLACE_TRAILING_WILDCARD,\n\n // It does not need to bind pattern\n TRAILING_WILD_CARD_REPLACERS[mode]\n )\n\n const regex = this.ignoreCase\n ? new RegExp(str, 'i')\n : new RegExp(str)\n\n return define(this, key, regex)\n }\n}\n\nconst createRule = ({\n pattern,\n mark\n}, ignoreCase) => {\n let negative = false\n let body = pattern\n\n // > An optional prefix \"!\" which negates the pattern;\n if (body.indexOf('!') === 0) {\n negative = true\n body = body.substr(1)\n }\n\n body = body\n // > Put a backslash (\"\\\") in front of the first \"!\" for patterns that\n // > begin with a literal \"!\", for example, `\"\\!important!.txt\"`.\n .replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!')\n // > Put a backslash (\"\\\") in front of the first hash for patterns that\n // > begin with a hash.\n .replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#')\n\n const regexPrefix = makeRegexPrefix(body)\n\n return new IgnoreRule(\n pattern,\n mark,\n body,\n ignoreCase,\n negative,\n regexPrefix\n )\n}\n\nclass RuleManager {\n constructor (ignoreCase) {\n this._ignoreCase = ignoreCase\n this._rules = []\n }\n\n _add (pattern) {\n // #32\n if (pattern && pattern[KEY_IGNORE]) {\n this._rules = this._rules.concat(pattern._rules._rules)\n this._added = true\n return\n }\n\n if (isString(pattern)) {\n pattern = {\n pattern\n }\n }\n\n if (checkPattern(pattern.pattern)) {\n const rule = createRule(pattern, this._ignoreCase)\n this._added = true\n this._rules.push(rule)\n }\n }\n\n // @param {Array<string> | string | Ignore} pattern\n add (pattern) {\n this._added = false\n\n makeArray(\n isString(pattern)\n ? splitPattern(pattern)\n : pattern\n ).forEach(this._add, this)\n\n return this._added\n }\n\n // Test one single path without recursively checking parent directories\n //\n // - checkUnignored `boolean` whether should check if the path is unignored,\n // setting `checkUnignored` to `false` could reduce additional\n // path matching.\n // - check `string` either `MODE_IGNORE` or `MODE_CHECK_IGNORE`\n\n // @returns {TestResult} true if a file is ignored\n test (path, checkUnignored, mode) {\n let ignored = false\n let unignored = false\n let matchedRule\n\n this._rules.forEach(rule => {\n const {negative} = rule\n\n // | ignored : unignored\n // -------- | ---------------------------------------\n // negative | 0:0 | 0:1 | 1:0 | 1:1\n // -------- | ------- | ------- | ------- | --------\n // 0 | TEST | TEST | SKIP | X\n // 1 | TESTIF | SKIP | TEST | X\n\n // - SKIP: always skip\n // - TEST: always test\n // - TESTIF: only test if checkUnignored\n // - X: that never happen\n if (\n unignored === negative && ignored !== unignored\n || negative && !ignored && !unignored && !checkUnignored\n ) {\n return\n }\n\n const matched = rule[mode].test(path)\n\n if (!matched) {\n return\n }\n\n ignored = !negative\n unignored = negative\n\n matchedRule = negative\n ? UNDEFINED\n : rule\n })\n\n const ret = {\n ignored,\n unignored\n }\n\n if (matchedRule) {\n ret.rule = matchedRule\n }\n\n return ret\n }\n}\n\nconst throwError = (message, Ctor) => {\n throw new Ctor(message)\n}\n\nconst checkPath = (path, originalPath, doThrow) => {\n if (!isString(path)) {\n return doThrow(\n `path must be a string, but got \\`${originalPath}\\``,\n TypeError\n )\n }\n\n // We don't know if we should ignore EMPTY, so throw\n if (!path) {\n return doThrow(`path must not be empty`, TypeError)\n }\n\n // Check if it is a relative path\n if (checkPath.isNotRelative(path)) {\n const r = '`path.relative()`d'\n return doThrow(\n `path should be a ${r} string, but got \"${originalPath}\"`,\n RangeError\n )\n }\n\n return true\n}\n\nconst isNotRelative = path => REGEX_TEST_INVALID_PATH.test(path)\n\ncheckPath.isNotRelative = isNotRelative\n\n// On windows, the following function will be replaced\n/* istanbul ignore next */\ncheckPath.convert = p => p\n\n\nclass Ignore {\n constructor ({\n ignorecase = true,\n ignoreCase = ignorecase,\n allowRelativePaths = false\n } = {}) {\n define(this, KEY_IGNORE, true)\n\n this._rules = new RuleManager(ignoreCase)\n this._strictPathCheck = !allowRelativePaths\n this._initCache()\n }\n\n _initCache () {\n // A cache for the result of `.ignores()`\n this._ignoreCache = Object.create(null)\n\n // A cache for the result of `.test()`\n this._testCache = Object.create(null)\n }\n\n add (pattern) {\n if (this._rules.add(pattern)) {\n // Some rules have just added to the ignore,\n // making the behavior changed,\n // so we need to re-initialize the result cache\n this._initCache()\n }\n\n return this\n }\n\n // legacy\n addPattern (pattern) {\n return this.add(pattern)\n }\n\n // @returns {TestResult}\n _test (originalPath, cache, checkUnignored, slices) {\n const path = originalPath\n // Supports nullable path\n && checkPath.convert(originalPath)\n\n checkPath(\n path,\n originalPath,\n this._strictPathCheck\n ? throwError\n : RETURN_FALSE\n )\n\n return this._t(path, cache, checkUnignored, slices)\n }\n\n checkIgnore (path) {\n // If the path doest not end with a slash, `.ignores()` is much equivalent\n // to `git check-ignore`\n if (!REGEX_TEST_TRAILING_SLASH.test(path)) {\n return this.test(path)\n }\n\n const slices = path.split(SLASH).filter(Boolean)\n slices.pop()\n\n if (slices.length) {\n const parent = this._t(\n slices.join(SLASH) + SLASH,\n this._testCache,\n true,\n slices\n )\n\n if (parent.ignored) {\n return parent\n }\n }\n\n return this._rules.test(path, false, MODE_CHECK_IGNORE)\n }\n\n _t (\n // The path to be tested\n path,\n\n // The cache for the result of a certain checking\n cache,\n\n // Whether should check if the path is unignored\n checkUnignored,\n\n // The path slices\n slices\n ) {\n if (path in cache) {\n return cache[path]\n }\n\n if (!slices) {\n // path/to/a.js\n // ['path', 'to', 'a.js']\n slices = path.split(SLASH).filter(Boolean)\n }\n\n slices.pop()\n\n // If the path has no parent directory, just test it\n if (!slices.length) {\n return cache[path] = this._rules.test(path, checkUnignored, MODE_IGNORE)\n }\n\n const parent = this._t(\n slices.join(SLASH) + SLASH,\n cache,\n checkUnignored,\n slices\n )\n\n // If the path contains a parent directory, check the parent first\n return cache[path] = parent.ignored\n // > It is not possible to re-include a file if a parent directory of\n // > that file is excluded.\n ? parent\n : this._rules.test(path, checkUnignored, MODE_IGNORE)\n }\n\n ignores (path) {\n return this._test(path, this._ignoreCache, false).ignored\n }\n\n createFilter () {\n return path => !this.ignores(path)\n }\n\n filter (paths) {\n return makeArray(paths).filter(this.createFilter())\n }\n\n // @returns {TestResult}\n test (path) {\n return this._test(path, this._testCache, true)\n }\n}\n\nconst factory = options => new Ignore(options)\n\nconst isPathValid = path =>\n checkPath(path && checkPath.convert(path), path, RETURN_FALSE)\n\n/* istanbul ignore next */\nconst setupWindows = () => {\n /* eslint no-control-regex: \"off\" */\n const makePosix = str => /^\\\\\\\\\\?\\\\/.test(str)\n || /[\"<>|\\u0000-\\u001F]+/u.test(str)\n ? str\n : str.replace(/\\\\/g, '/')\n\n checkPath.convert = makePosix\n\n // 'C:\\\\foo' <- 'C:\\\\foo' has been converted to 'C:/'\n // 'd:\\\\foo'\n const REGEX_TEST_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\\//i\n checkPath.isNotRelative = path =>\n REGEX_TEST_WINDOWS_PATH_ABSOLUTE.test(path)\n || isNotRelative(path)\n}\n\n\n// Windows\n// --------------------------------------------------------------\n/* istanbul ignore next */\nif (\n // Detect `process` so that it can run in browsers.\n typeof process !== 'undefined'\n && process.platform === 'win32'\n) {\n setupWindows()\n}\n\n// COMMONJS_EXPORTS ////////////////////////////////////////////////////////////\n\nmodule.exports = factory\n\n// Although it is an anti-pattern,\n// it is still widely misused by a lot of libraries in github\n// Ref: https://github.com/search?q=ignore.default%28%29&type=code\nfactory.default = factory\n\nmodule.exports.isPathValid = isPathValid\n\n// For testing purposes\ndefine(module.exports, Symbol.for('setupWindows'), setupWindows)\n", "import path from 'node:path';\n\nexport default function isPathInside(childPath, parentPath) {\n\tconst relation = path.relative(parentPath, childPath);\n\n\treturn Boolean(\n\t\trelation &&\n\t\trelation !== '..' &&\n\t\t!relation.startsWith(`..${path.sep}`) &&\n\t\trelation !== path.resolve(childPath)\n\t);\n}\n", "export default function slash(path) {\n\tconst isExtendedLengthPath = path.startsWith('\\\\\\\\?\\\\');\n\n\tif (isExtendedLengthPath) {\n\t\treturn path;\n\t}\n\n\treturn path.replace(/\\\\/g, '/');\n}\n", "import fs from 'node:fs';\nimport path from 'node:path';\nimport {promisify} from 'node:util';\nimport fastGlob from 'fast-glob';\nimport isPathInside from 'is-path-inside';\n\nexport const isNegativePattern = pattern => pattern[0] === '!';\n\n/**\nNormalize a root-anchored pattern to be relative.\n\nOn Unix, patterns starting with `/` are interpreted as absolute paths from the filesystem root. This causes inconsistent behavior across platforms since Windows uses different path roots (like `C:\\`).\n\nThis function strips leading `/` only for root-anchored glob patterns (e.g., `/**`, `/*.txt`, `/foo`), not for real absolute filesystem paths (e.g., `/Users/foo/bar`, `/home/user/project`).\n\nThe heuristic: if the pattern has multiple path segments and the first segment contains no glob characters, it's treated as a real absolute path and left unchanged.\n\n@param {string} pattern - The pattern to normalize.\n*/\nexport const normalizeAbsolutePatternToRelative = pattern => {\n\tif (!pattern.startsWith('/')) {\n\t\treturn pattern;\n\t}\n\n\tconst inner = pattern.slice(1);\n\tconst firstSlashIndex = inner.indexOf('/');\n\tconst firstSegment = firstSlashIndex > 0 ? inner.slice(0, firstSlashIndex) : inner;\n\n\t// Preserve real absolute paths (multi-segment, non-glob first component like /Users/foo/bar)\n\tif (firstSlashIndex > 0 && !fastGlob.isDynamicPattern(firstSegment)) {\n\t\treturn pattern;\n\t}\n\n\t// Strip leading / from root-anchored globs (/**, /*.txt, /foo, /{src,dist}/**)\n\treturn inner;\n};\n\nconst absolutePrefixesMatch = (positivePrefix, negativePrefix) => negativePrefix === positivePrefix;\n\n/**\nGet the leading static prefix from an absolute pattern.\n\n@param {string} pattern - The pattern to inspect.\n@returns {string|undefined} Static absolute prefix, for example `/tmp/project`.\n*/\nexport const getStaticAbsolutePathPrefix = pattern => {\n\tif (!path.isAbsolute(pattern)) {\n\t\treturn undefined;\n\t}\n\n\tconst staticSegments = [];\n\tfor (const segment of pattern.split('/')) {\n\t\tif (!segment) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (fastGlob.isDynamicPattern(segment)) {\n\t\t\tbreak;\n\t\t}\n\n\t\tstaticSegments.push(segment);\n\t}\n\n\treturn staticSegments.length === 0 ? undefined : `/${staticSegments.join('/')}`;\n};\n\n/**\nNormalize a negative pattern while preserving true absolute paths when needed.\n\n@param {string} pattern - A negative pattern without the leading `!`.\n@param {string[]} [positiveAbsolutePathPrefixes] - Static prefixes from previous positive absolute patterns.\n@param {boolean} [hasRelativePositivePattern] - Whether a relative positive pattern has been seen before this negation.\n@returns {string} Normalized pattern.\n*/\nexport const normalizeNegativePattern = (pattern, positiveAbsolutePathPrefixes = [], hasRelativePositivePattern = false) => {\n\t// Non-absolute patterns pass through unchanged.\n\tif (!pattern.startsWith('/')) {\n\t\treturn pattern;\n\t}\n\n\tconst normalizedPattern = normalizeAbsolutePatternToRelative(pattern);\n\n\t// Dynamic root-anchored patterns (e.g. `/{src,dist}/**`) are always normalized to relative.\n\tif (normalizedPattern !== pattern) {\n\t\treturn normalizedPattern;\n\t}\n\n\t// In mixed relative/absolute pattern sets, keep root-anchored literals cwd-relative.\n\tif (hasRelativePositivePattern) {\n\t\treturn pattern.slice(1);\n\t}\n\n\t// Literal absolute patterns are treated as cwd-relative unless they clearly target\n\t// the same absolute filesystem area as a positive absolute pattern seen so far.\n\tconst negativeAbsolutePathPrefix = getStaticAbsolutePathPrefix(pattern);\n\tconst preserveAsAbsolutePattern = negativeAbsolutePathPrefix !== undefined\n\t\t&& positiveAbsolutePathPrefixes.some(positiveAbsolutePathPrefix => absolutePrefixesMatch(positiveAbsolutePathPrefix, negativeAbsolutePathPrefix));\n\n\treturn preserveAsAbsolutePattern ? pattern : pattern.slice(1);\n};\n\nexport const bindFsMethod = (object, methodName) => {\n\tconst method = object?.[methodName];\n\treturn typeof method === 'function' ? method.bind(object) : undefined;\n};\n\n// Only used as a fallback for legacy fs implementations\nexport const promisifyFsMethod = (object, methodName) => {\n\tconst method = object?.[methodName];\n\tif (typeof method !== 'function') {\n\t\treturn undefined;\n\t}\n\n\treturn promisify(method.bind(object));\n};\n\nexport const normalizeDirectoryPatternForFastGlob = pattern => {\n\tif (!pattern.endsWith('/')) {\n\t\treturn pattern;\n\t}\n\n\tconst trimmedPattern = pattern.replace(/\\/+$/u, '');\n\tif (!trimmedPattern) {\n\t\treturn '/**';\n\t}\n\n\t// Special case for '**/' to avoid producing '**/**/**'\n\tif (trimmedPattern === '**') {\n\t\treturn '**/**';\n\t}\n\n\tconst hasLeadingSlash = trimmedPattern.startsWith('/');\n\tconst patternBody = hasLeadingSlash ? trimmedPattern.slice(1) : trimmedPattern;\n\tconst hasInnerSlash = patternBody.includes('/');\n\tconst needsRecursivePrefix = !hasLeadingSlash && !hasInnerSlash && !trimmedPattern.startsWith('**/');\n\tconst recursivePrefix = needsRecursivePrefix ? '**/' : '';\n\n\treturn `${recursivePrefix}${trimmedPattern}/**`;\n};\n\n/**\nExtract the parent directory prefix from a pattern (e.g., '../' or '../../').\n\nNote: Patterns should have trailing slash after '..' (e.g., '../foo' not '..foo'). The directoryToGlob function ensures this in the normal pipeline.\n\n@param {string} pattern - The pattern to analyze.\n@returns {string} The parent directory prefix, or empty string if none.\n*/\nexport const getParentDirectoryPrefix = pattern => {\n\tconst normalizedPattern = isNegativePattern(pattern) ? pattern.slice(1) : pattern;\n\tconst match = normalizedPattern.match(/^(\\.\\.\\/)+/);\n\treturn match ? match[0] : '';\n};\n\n/**\nAdjust ignore patterns to match the relative base of the main patterns.\n\nWhen patterns reference parent directories, ignore patterns starting with globstars need to be adjusted to match from the same base directory. This ensures intuitive behavior where ignore patterns work correctly with parent directory patterns.\n\nThis is analogous to how node-glob normalizes path prefixes (see node-glob issue #309) and how Rust ignore crate strips path prefixes before matching.\n\n@param {string[]} patterns - The main glob patterns.\n@param {string[]} ignorePatterns - The ignore patterns to adjust.\n@returns {string[]} Adjusted ignore patterns.\n*/\nexport const adjustIgnorePatternsForParentDirectories = (patterns, ignorePatterns) => {\n\t// Early exit for empty arrays\n\tif (patterns.length === 0 || ignorePatterns.length === 0) {\n\t\treturn ignorePatterns;\n\t}\n\n\t// Get parent directory prefixes for all patterns (empty string if no prefix)\n\tconst parentPrefixes = patterns.map(pattern => getParentDirectoryPrefix(pattern));\n\n\t// Check if all patterns have the same parent prefix\n\tconst firstPrefix = parentPrefixes[0];\n\tif (!firstPrefix) {\n\t\treturn ignorePatterns; // No parent directories in any pattern\n\t}\n\n\tconst allSamePrefix = parentPrefixes.every(prefix => prefix === firstPrefix);\n\tif (!allSamePrefix) {\n\t\treturn ignorePatterns; // Mixed bases - don't adjust\n\t}\n\n\t// Adjust ignore patterns that start with **/\n\treturn ignorePatterns.map(pattern => {\n\t\t// Only adjust patterns starting with **/ that don't already have a parent reference\n\t\tif (pattern.startsWith('**/') && !pattern.startsWith('../')) {\n\t\t\treturn firstPrefix + pattern;\n\t\t}\n\n\t\treturn pattern;\n\t});\n};\n\n/**\nFind the git root directory by searching upward for a .git directory.\n\n@param {string} cwd - The directory to start searching from.\n@param {Object} [fsImplementation] - Optional fs implementation.\n@returns {string|undefined} The git root directory path, or undefined if not found.\n*/\nconst getAsyncStatMethod = fsImplementation =>\n\tbindFsMethod(fsImplementation?.promises, 'stat')\n\t?? bindFsMethod(fs.promises, 'stat');\n\nconst getStatSyncMethod = fsImplementation => {\n\tif (fsImplementation) {\n\t\treturn bindFsMethod(fsImplementation, 'statSync');\n\t}\n\n\treturn bindFsMethod(fs, 'statSync');\n};\n\nconst pathHasGitDirectory = stats => Boolean(stats?.isDirectory?.() || stats?.isFile?.());\n\nconst buildPathChain = (startPath, rootPath) => {\n\tconst chain = [];\n\tlet currentPath = startPath;\n\n\tchain.push(currentPath);\n\n\twhile (currentPath !== rootPath) {\n\t\tconst parentPath = path.dirname(currentPath);\n\t\tif (parentPath === currentPath) {\n\t\t\tbreak;\n\t\t}\n\n\t\tcurrentPath = parentPath;\n\t\tchain.push(currentPath);\n\t}\n\n\treturn chain;\n};\n\nconst findGitRootInChain = async (paths, statMethod) => {\n\tfor (const directory of paths) {\n\t\tconst gitPath = path.join(directory, '.git');\n\n\t\ttry {\n\t\t\tconst stats = await statMethod(gitPath); // eslint-disable-line no-await-in-loop\n\t\t\tif (pathHasGitDirectory(stats)) {\n\t\t\t\treturn directory;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore errors and continue searching\n\t\t}\n\t}\n\n\treturn undefined;\n};\n\nconst findGitRootSyncUncached = (cwd, fsImplementation) => {\n\tconst statSyncMethod = getStatSyncMethod(fsImplementation);\n\tif (!statSyncMethod) {\n\t\treturn undefined;\n\t}\n\n\tconst currentPath = path.resolve(cwd);\n\tconst {root} = path.parse(currentPath);\n\tconst chain = buildPathChain(currentPath, root);\n\n\tfor (const directory of chain) {\n\t\tconst gitPath = path.join(directory, '.git');\n\t\ttry {\n\t\t\tconst stats = statSyncMethod(gitPath);\n\t\t\tif (pathHasGitDirectory(stats)) {\n\t\t\t\treturn directory;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore errors and continue searching\n\t\t}\n\t}\n\n\treturn undefined;\n};\n\nexport const findGitRootSync = (cwd, fsImplementation) => {\n\tif (typeof cwd !== 'string') {\n\t\tthrow new TypeError('cwd must be a string');\n\t}\n\n\treturn findGitRootSyncUncached(cwd, fsImplementation);\n};\n\nconst findGitRootAsyncUncached = async (cwd, fsImplementation) => {\n\tconst statMethod = getAsyncStatMethod(fsImplementation);\n\tif (!statMethod) {\n\t\treturn findGitRootSync(cwd, fsImplementation);\n\t}\n\n\tconst currentPath = path.resolve(cwd);\n\tconst {root} = path.parse(currentPath);\n\tconst chain = buildPathChain(currentPath, root);\n\n\treturn findGitRootInChain(chain, statMethod);\n};\n\nexport const findGitRoot = async (cwd, fsImplementation) => {\n\tif (typeof cwd !== 'string') {\n\t\tthrow new TypeError('cwd must be a string');\n\t}\n\n\treturn findGitRootAsyncUncached(cwd, fsImplementation);\n};\n\n/**\nGet paths to all .gitignore files from git root to cwd (inclusive).\n\n@param {string} gitRoot - The git root directory.\n@param {string} cwd - The current working directory.\n@returns {string[]} Array of .gitignore file paths to search for.\n*/\nconst isWithinGitRoot = (gitRoot, cwd) => {\n\tconst resolvedGitRoot = path.resolve(gitRoot);\n\tconst resolvedCwd = path.resolve(cwd);\n\treturn resolvedCwd === resolvedGitRoot || isPathInside(resolvedCwd, resolvedGitRoot);\n};\n\nexport const getParentGitignorePaths = (gitRoot, cwd) => {\n\tif (gitRoot && typeof gitRoot !== 'string') {\n\t\tthrow new TypeError('gitRoot must be a string or undefined');\n\t}\n\n\tif (typeof cwd !== 'string') {\n\t\tthrow new TypeError('cwd must be a string');\n\t}\n\n\t// If no gitRoot provided, return empty array\n\tif (!gitRoot) {\n\t\treturn [];\n\t}\n\n\tif (!isWithinGitRoot(gitRoot, cwd)) {\n\t\treturn [];\n\t}\n\n\tconst chain = buildPathChain(path.resolve(cwd), path.resolve(gitRoot));\n\n\treturn [...chain]\n\t\t.reverse()\n\t\t.map(directory => path.join(directory, '.gitignore'));\n};\n\n/**\nConvert ignore patterns to fast-glob compatible format.\nReturns empty array if patterns should be handled by predicate only.\n\n@param {string[]} patterns - Ignore patterns from .gitignore files\n@param {boolean} usingGitRoot - Whether patterns are relative to git root\n@param {Function} normalizeDirectoryPatternForFastGlob - Function to normalize directory patterns\n@returns {string[]} Patterns safe to pass to fast-glob, or empty array\n*/\nexport const convertPatternsForFastGlob = (patterns, usingGitRoot, normalizeDirectoryPatternForFastGlob) => {\n\t// Determine which patterns are safe to pass to fast-glob\n\t// If there are negation patterns, we can't pass file patterns to fast-glob\n\t// because fast-glob doesn't understand negations and would filter out files\n\t// that should be re-included by negation patterns.\n\t// If we're using git root, patterns are relative to git root not cwd,\n\t// so we can't pass them to fast-glob which expects cwd-relative patterns.\n\t// We only pass patterns to fast-glob if there are NO negations AND we're not using git root.\n\n\tif (usingGitRoot) {\n\t\treturn []; // Patterns are relative to git root, not cwd\n\t}\n\n\tconst result = [];\n\tlet hasNegations = false;\n\n\t// Single pass to check for negations and collect positive patterns\n\tfor (const pattern of patterns) {\n\t\tif (isNegativePattern(pattern)) {\n\t\t\thasNegations = true;\n\t\t\tbreak; // Early exit on first negation\n\t\t}\n\n\t\tresult.push(normalizeDirectoryPatternForFastGlob(pattern));\n\t}\n\n\treturn hasNegations ? [] : result;\n};\n", "import process from 'node:process';\nimport fs from 'node:fs';\nimport fsPromises from 'node:fs/promises';\nimport path from 'node:path';\nimport fastGlob from 'fast-glob';\nimport gitIgnore from 'ignore';\nimport isPathInside from 'is-path-inside';\nimport slash from 'slash';\nimport {toPath} from 'unicorn-magic/node';\nimport {\n\tisNegativePattern,\n\tbindFsMethod,\n\tpromisifyFsMethod,\n\tfindGitRoot,\n\tfindGitRootSync,\n\tgetParentGitignorePaths,\n} from './utilities.js';\n\nconst defaultIgnoredDirectories = [\n\t'**/node_modules',\n\t'**/flow-typed',\n\t'**/coverage',\n\t'**/.git',\n];\nconst ignoreFilesGlobOptions = {\n\tabsolute: true,\n\tdot: true,\n};\n\nexport const GITIGNORE_FILES_PATTERN = '**/.gitignore';\n\nconst getReadFileMethod = fsImplementation =>\n\tbindFsMethod(fsImplementation?.promises, 'readFile')\n\t?? bindFsMethod(fsPromises, 'readFile')\n\t?? promisifyFsMethod(fsImplementation, 'readFile');\n\nconst getReadFileSyncMethod = fsImplementation =>\n\tbindFsMethod(fsImplementation, 'readFileSync')\n\t?? bindFsMethod(fs, 'readFileSync');\n\nconst shouldSkipIgnoreFileError = (error, suppressErrors) => {\n\tif (!error) {\n\t\treturn Boolean(suppressErrors);\n\t}\n\n\tif (error.code === 'ENOENT' || error.code === 'ENOTDIR') {\n\t\treturn true;\n\t}\n\n\treturn Boolean(suppressErrors);\n};\n\nconst createIgnoreFileReadError = (filePath, error) => {\n\tif (error instanceof Error) {\n\t\terror.message = `Failed to read ignore file at ${filePath}: ${error.message}`;\n\t\treturn error;\n\t}\n\n\treturn new Error(`Failed to read ignore file at ${filePath}: ${String(error)}`);\n};\n\nconst processIgnoreFileCore = (filePath, readMethod, suppressErrors) => {\n\ttry {\n\t\tconst content = readMethod(filePath, 'utf8');\n\t\treturn {filePath, content};\n\t} catch (error) {\n\t\tif (shouldSkipIgnoreFileError(error, suppressErrors)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tthrow createIgnoreFileReadError(filePath, error);\n\t}\n};\n\nconst readIgnoreFilesSafely = async (paths, readFileMethod, suppressErrors) => {\n\tconst fileResults = await Promise.all(paths.map(async filePath => {\n\t\ttry {\n\t\t\tconst content = await readFileMethod(filePath, 'utf8');\n\t\t\treturn {filePath, content};\n\t\t} catch (error) {\n\t\t\tif (shouldSkipIgnoreFileError(error, suppressErrors)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tthrow createIgnoreFileReadError(filePath, error);\n\t\t}\n\t}));\n\n\treturn fileResults.filter(Boolean);\n};\n\nconst readIgnoreFilesSafelySync = (paths, readFileSyncMethod, suppressErrors) => paths\n\t.map(filePath => processIgnoreFileCore(filePath, readFileSyncMethod, suppressErrors))\n\t.filter(Boolean);\n\nconst dedupePaths = paths => {\n\tconst seen = new Set();\n\treturn paths.filter(filePath => {\n\t\tif (seen.has(filePath)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tseen.add(filePath);\n\t\treturn true;\n\t});\n};\n\nconst globIgnoreFiles = (globFunction, patterns, normalizedOptions) => globFunction(patterns, {\n\t...normalizedOptions,\n\t...ignoreFilesGlobOptions, // Must be last to ensure absolute/dot flags stick\n});\n\nconst getParentIgnorePaths = (gitRoot, normalizedOptions) => gitRoot\n\t? getParentGitignorePaths(gitRoot, normalizedOptions.cwd)\n\t: [];\n\nconst combineIgnoreFilePaths = (gitRoot, normalizedOptions, childPaths) => dedupePaths([\n\t...getParentIgnorePaths(gitRoot, normalizedOptions),\n\t...childPaths,\n]);\n\nconst buildIgnoreResult = (files, normalizedOptions, gitRoot) => {\n\tconst baseDir = gitRoot || normalizedOptions.cwd;\n\tconst patterns = getPatternsFromIgnoreFiles(files, baseDir);\n\n\treturn {\n\t\tpatterns,\n\t\tpredicate: createIgnorePredicate(patterns, normalizedOptions.cwd, baseDir),\n\t\tusingGitRoot: Boolean(gitRoot && gitRoot !== normalizedOptions.cwd),\n\t};\n};\n\n// Apply base path to gitignore patterns based on .gitignore spec 2.22.1\n// https://git-scm.com/docs/gitignore#_pattern_format\n// See also https://github.com/sindresorhus/globby/issues/146\nconst applyBaseToPattern = (pattern, base) => {\n\tif (!base) {\n\t\treturn pattern;\n\t}\n\n\tconst isNegative = isNegativePattern(pattern);\n\tconst cleanPattern = isNegative ? pattern.slice(1) : pattern;\n\n\t// Check if pattern has non-trailing slashes\n\tconst slashIndex = cleanPattern.indexOf('/');\n\tconst hasNonTrailingSlash = slashIndex !== -1 && slashIndex !== cleanPattern.length - 1;\n\n\tlet result;\n\tif (!hasNonTrailingSlash) {\n\t\t// \"If there is no separator at the beginning or middle of the pattern,\n\t\t// then the pattern may also match at any level below the .gitignore level.\"\n\t\t// So patterns like '*.log' or 'temp' or 'build/' (trailing slash) match recursively.\n\t\tresult = path.posix.join(base, '**', cleanPattern);\n\t} else if (cleanPattern.startsWith('/')) {\n\t\t// \"If there is a separator at the beginning [...] of the pattern,\n\t\t// then the pattern is relative to the directory level of the particular .gitignore file itself.\"\n\t\t// Leading slash anchors the pattern to the .gitignore's directory.\n\t\tresult = path.posix.join(base, cleanPattern.slice(1));\n\t} else {\n\t\t// \"If there is a separator [...] middle [...] of the pattern,\n\t\t// then the pattern is relative to the directory level of the particular .gitignore file itself.\"\n\t\t// Patterns like 'src/foo' are relative to the .gitignore's directory.\n\t\tresult = path.posix.join(base, cleanPattern);\n\t}\n\n\treturn isNegative ? '!' + result : result;\n};\n\nconst parseIgnoreFile = (file, cwd) => {\n\tconst base = slash(path.relative(cwd, path.dirname(file.filePath)));\n\n\treturn file.content\n\t\t.split(/\\r?\\n/)\n\t\t.filter(line => line && !line.startsWith('#'))\n\t\t.map(pattern => applyBaseToPattern(pattern, base));\n};\n\nconst toRelativePath = (fileOrDirectory, cwd) => {\n\tif (path.isAbsolute(fileOrDirectory)) {\n\t\t// When paths are equal, path.relative returns empty string which is valid\n\t\t// isPathInside returns false for equal paths, so check this case first\n\t\tconst relativePath = path.relative(cwd, fileOrDirectory);\n\t\tif (relativePath && !isPathInside(fileOrDirectory, cwd)) {\n\t\t\t// Path is outside cwd - it cannot be ignored by patterns in cwd\n\t\t\t// Return undefined to indicate this path is outside scope\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn relativePath;\n\t}\n\n\t// Normalize relative paths:\n\t// - Git treats './foo' as 'foo' when checking against patterns\n\t// - Patterns starting with './' in .gitignore are invalid and don't match anything\n\t// - The ignore library expects normalized paths without './' prefix\n\tif (fileOrDirectory.startsWith('./')) {\n\t\treturn fileOrDirectory.slice(2);\n\t}\n\n\t// Paths with ../ point outside cwd and cannot match patterns from this directory\n\t// Return undefined to indicate this path is outside scope\n\tif (fileOrDirectory.startsWith('../')) {\n\t\treturn undefined;\n\t}\n\n\treturn fileOrDirectory;\n};\n\nconst createIgnorePredicate = (patterns, cwd, baseDir) => {\n\tconst ignores = gitIgnore().add(patterns);\n\t// Normalize to handle path separator and . / .. components consistently\n\tconst resolvedCwd = path.normalize(path.resolve(cwd));\n\tconst resolvedBaseDir = path.normalize(path.resolve(baseDir));\n\n\treturn fileOrDirectory => {\n\t\tfileOrDirectory = toPath(fileOrDirectory);\n\n\t\t// Never ignore the cwd itself - use normalized comparison\n\t\tconst normalizedPath = path.normalize(path.resolve(fileOrDirectory));\n\t\tif (normalizedPath === resolvedCwd) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Convert to relative path from baseDir (use normalized baseDir)\n\t\tconst relativePath = toRelativePath(fileOrDirectory, resolvedBaseDir);\n\n\t\t// If path is outside baseDir (undefined), it can't be ignored by patterns\n\t\tif (relativePath === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn relativePath ? ignores.ignores(slash(relativePath)) : false;\n\t};\n};\n\nconst normalizeOptions = (options = {}) => {\n\tconst ignoreOption = options.ignore\n\t\t? (Array.isArray(options.ignore) ? options.ignore : [options.ignore])\n\t\t: [];\n\n\tconst cwd = toPath(options.cwd) ?? process.cwd();\n\n\t// Adjust deep option for fast-glob: fast-glob's deep counts differently than expected\n\t// User's deep: 0 = root only -> fast-glob needs: 1\n\t// User's deep: 1 = root + 1 level -> fast-glob needs: 2\n\tconst deep = typeof options.deep === 'number' ? Math.max(0, options.deep) + 1 : Number.POSITIVE_INFINITY;\n\n\t// Only pass through specific fast-glob options that make sense for finding ignore files\n\treturn {\n\t\tcwd,\n\t\tsuppressErrors: options.suppressErrors ?? false,\n\t\tdeep,\n\t\tignore: [...ignoreOption, ...defaultIgnoredDirectories],\n\t\tfollowSymbolicLinks: options.followSymbolicLinks ?? true,\n\t\tconcurrency: options.concurrency,\n\t\tthrowErrorOnBrokenSymbolicLink: options.throwErrorOnBrokenSymbolicLink ?? false,\n\t\tfs: options.fs,\n\t};\n};\n\nconst collectIgnoreFileArtifactsAsync = async (patterns, options, includeParentIgnoreFiles) => {\n\tconst normalizedOptions = normalizeOptions(options);\n\tconst childPaths = await globIgnoreFiles(fastGlob, patterns, normalizedOptions);\n\tconst gitRoot = includeParentIgnoreFiles\n\t\t? await findGitRoot(normalizedOptions.cwd, normalizedOptions.fs)\n\t\t: undefined;\n\tconst allPaths = combineIgnoreFilePaths(gitRoot, normalizedOptions, childPaths);\n\tconst readFileMethod = getReadFileMethod(normalizedOptions.fs);\n\tconst files = await readIgnoreFilesSafely(allPaths, readFileMethod, normalizedOptions.suppressErrors);\n\n\treturn {files, normalizedOptions, gitRoot};\n};\n\nconst collectIgnoreFileArtifactsSync = (patterns, options, includeParentIgnoreFiles) => {\n\tconst normalizedOptions = normalizeOptions(options);\n\tconst childPaths = globIgnoreFiles(fastGlob.sync, patterns, normalizedOptions);\n\tconst gitRoot = includeParentIgnoreFiles\n\t\t? findGitRootSync(normalizedOptions.cwd, normalizedOptions.fs)\n\t\t: undefined;\n\tconst allPaths = combineIgnoreFilePaths(gitRoot, normalizedOptions, childPaths);\n\tconst readFileSyncMethod = getReadFileSyncMethod(normalizedOptions.fs);\n\tconst files = readIgnoreFilesSafelySync(allPaths, readFileSyncMethod, normalizedOptions.suppressErrors);\n\n\treturn {files, normalizedOptions, gitRoot};\n};\n\nexport const isIgnoredByIgnoreFiles = async (patterns, options) => {\n\tconst {files, normalizedOptions, gitRoot} = await collectIgnoreFileArtifactsAsync(patterns, options, false);\n\treturn buildIgnoreResult(files, normalizedOptions, gitRoot).predicate;\n};\n\nexport const isIgnoredByIgnoreFilesSync = (patterns, options) => {\n\tconst {files, normalizedOptions, gitRoot} = collectIgnoreFileArtifactsSync(patterns, options, false);\n\treturn buildIgnoreResult(files, normalizedOptions, gitRoot).predicate;\n};\n\nconst getPatternsFromIgnoreFiles = (files, baseDir) => files.flatMap(file => parseIgnoreFile(file, baseDir));\n\n/**\nRead ignore files and return both patterns and predicate.\nThis avoids reading the same files twice (once for patterns, once for filtering).\n\n@param {string[]} patterns - Patterns to find ignore files\n@param {Object} options - Options object\n@param {boolean} [includeParentIgnoreFiles=false] - Whether to search for parent .gitignore files\n@returns {Promise<{patterns: string[], predicate: Function, usingGitRoot: boolean}>}\n*/\nexport const getIgnorePatternsAndPredicate = async (patterns, options, includeParentIgnoreFiles = false) => {\n\tconst {files, normalizedOptions, gitRoot} = await collectIgnoreFileArtifactsAsync(\n\t\tpatterns,\n\t\toptions,\n\t\tincludeParentIgnoreFiles,\n\t);\n\n\treturn buildIgnoreResult(files, normalizedOptions, gitRoot);\n};\n\n/**\nRead ignore files and return both patterns and predicate (sync version).\n\n@param {string[]} patterns - Patterns to find ignore files\n@param {Object} options - Options object\n@param {boolean} [includeParentIgnoreFiles=false] - Whether to search for parent .gitignore files\n@returns {{patterns: string[], predicate: Function, usingGitRoot: boolean}}\n*/\nexport const getIgnorePatternsAndPredicateSync = (patterns, options, includeParentIgnoreFiles = false) => {\n\tconst {files, normalizedOptions, gitRoot} = collectIgnoreFileArtifactsSync(\n\t\tpatterns,\n\t\toptions,\n\t\tincludeParentIgnoreFiles,\n\t);\n\n\treturn buildIgnoreResult(files, normalizedOptions, gitRoot);\n};\n\nexport const isGitIgnored = options => isIgnoredByIgnoreFiles(GITIGNORE_FILES_PATTERN, options);\nexport const isGitIgnoredSync = options => isIgnoredByIgnoreFilesSync(GITIGNORE_FILES_PATTERN, options);\n", "import process from 'node:process';\nimport fs from 'node:fs';\nimport nodePath from 'node:path';\nimport {Readable} from 'node:stream';\nimport mergeStreams from '@sindresorhus/merge-streams';\nimport fastGlob from 'fast-glob';\nimport {toPath} from 'unicorn-magic/node';\nimport {\n\tGITIGNORE_FILES_PATTERN,\n\tgetIgnorePatternsAndPredicate,\n\tgetIgnorePatternsAndPredicateSync,\n} from './ignore.js';\nimport {\n\tbindFsMethod,\n\tpromisifyFsMethod,\n\tisNegativePattern,\n\tgetStaticAbsolutePathPrefix,\n\tnormalizeNegativePattern,\n\tnormalizeDirectoryPatternForFastGlob,\n\tadjustIgnorePatternsForParentDirectories,\n\tconvertPatternsForFastGlob,\n} from './utilities.js';\n\nconst assertPatternsInput = patterns => {\n\tif (patterns.some(pattern => typeof pattern !== 'string')) {\n\t\tthrow new TypeError('Patterns must be a string or an array of strings');\n\t}\n};\n\nconst getStatMethod = fsImplementation =>\n\tbindFsMethod(fsImplementation?.promises, 'stat')\n\t?? bindFsMethod(fs.promises, 'stat')\n\t?? promisifyFsMethod(fsImplementation, 'stat');\n\nconst getStatSyncMethod = fsImplementation =>\n\tbindFsMethod(fsImplementation, 'statSync')\n\t?? bindFsMethod(fs, 'statSync');\n\nconst isDirectory = async (path, fsImplementation) => {\n\ttry {\n\t\tconst stats = await getStatMethod(fsImplementation)(path);\n\t\treturn stats.isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nconst isDirectorySync = (path, fsImplementation) => {\n\ttry {\n\t\tconst stats = getStatSyncMethod(fsImplementation)(path);\n\t\treturn stats.isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nconst normalizePathForDirectoryGlob = (filePath, cwd) => {\n\tconst path = isNegativePattern(filePath) ? filePath.slice(1) : filePath;\n\treturn nodePath.isAbsolute(path) ? path : nodePath.join(cwd, path);\n};\n\nconst shouldExpandGlobstarDirectory = pattern => {\n\tconst match = pattern?.match(/\\*\\*\\/([^/]+)$/);\n\tif (!match) {\n\t\treturn false;\n\t}\n\n\tconst dirname = match[1];\n\tconst hasWildcards = /[*?[\\]{}]/.test(dirname);\n\tconst hasExtension = nodePath.extname(dirname) && !dirname.startsWith('.');\n\n\treturn !hasWildcards && !hasExtension;\n};\n\nconst getDirectoryGlob = ({directoryPath, files, extensions}) => {\n\tconst extensionGlob = extensions?.length > 0 ? `.${extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]}` : '';\n\treturn files\n\t\t? files.map(file => nodePath.posix.join(directoryPath, `**/${nodePath.extname(file) ? file : `${file}${extensionGlob}`}`))\n\t\t: [nodePath.posix.join(directoryPath, `**${extensionGlob ? `/*${extensionGlob}` : ''}`)];\n};\n\nconst directoryToGlob = async (directoryPaths, {\n\tcwd = process.cwd(),\n\tfiles,\n\textensions,\n\tfs: fsImplementation,\n} = {}) => {\n\tconst globs = await Promise.all(directoryPaths.map(async directoryPath => {\n\t\t// Check pattern without negative prefix\n\t\tconst checkPattern = isNegativePattern(directoryPath) ? directoryPath.slice(1) : directoryPath;\n\n\t\t// Expand globstar directory patterns like **/dirname to **/dirname/**\n\t\tif (shouldExpandGlobstarDirectory(checkPattern)) {\n\t\t\treturn getDirectoryGlob({directoryPath, files, extensions});\n\t\t}\n\n\t\t// Original logic for checking actual directories\n\t\tconst pathToCheck = normalizePathForDirectoryGlob(directoryPath, cwd);\n\t\treturn (await isDirectory(pathToCheck, fsImplementation)) ? getDirectoryGlob({directoryPath, files, extensions}) : directoryPath;\n\t}));\n\n\treturn globs.flat();\n};\n\nconst directoryToGlobSync = (directoryPaths, {\n\tcwd = process.cwd(),\n\tfiles,\n\textensions,\n\tfs: fsImplementation,\n} = {}) => directoryPaths.flatMap(directoryPath => {\n\t// Check pattern without negative prefix\n\tconst checkPattern = isNegativePattern(directoryPath) ? directoryPath.slice(1) : directoryPath;\n\n\t// Expand globstar directory patterns like **/dirname to **/dirname/**\n\tif (shouldExpandGlobstarDirectory(checkPattern)) {\n\t\treturn getDirectoryGlob({directoryPath, files, extensions});\n\t}\n\n\t// Original logic for checking actual directories\n\tconst pathToCheck = normalizePathForDirectoryGlob(directoryPath, cwd);\n\treturn isDirectorySync(pathToCheck, fsImplementation) ? getDirectoryGlob({directoryPath, files, extensions}) : directoryPath;\n});\n\nconst toPatternsArray = patterns => {\n\tpatterns = [...new Set([patterns].flat())];\n\tassertPatternsInput(patterns);\n\treturn patterns;\n};\n\nconst checkCwdOption = (cwd, fsImplementation = fs) => {\n\tif (!cwd || !fsImplementation.statSync) {\n\t\treturn;\n\t}\n\n\tlet stats;\n\ttry {\n\t\tstats = fsImplementation.statSync(cwd);\n\t} catch {\n\t\t// If stat fails (e.g., path doesn't exist), let fast-glob handle it\n\t\treturn;\n\t}\n\n\tif (!stats.isDirectory()) {\n\t\tthrow new Error(`The \\`cwd\\` option must be a path to a directory, got: ${cwd}`);\n\t}\n};\n\nconst normalizeOptions = (options = {}) => {\n\t// Normalize ignore to an array (fast-glob accepts string but we need array internally)\n\tconst ignore = options.ignore\n\t\t? (Array.isArray(options.ignore) ? options.ignore : [options.ignore])\n\t\t: [];\n\n\toptions = {\n\t\t...options,\n\t\tignore,\n\t\texpandDirectories: options.expandDirectories ?? true,\n\t\tcwd: toPath(options.cwd),\n\t};\n\n\tcheckCwdOption(options.cwd, options.fs);\n\n\treturn options;\n};\n\nconst normalizeArguments = function_ => async (patterns, options) => function_(toPatternsArray(patterns), normalizeOptions(options));\nconst normalizeArgumentsSync = function_ => (patterns, options) => function_(toPatternsArray(patterns), normalizeOptions(options));\n\nconst getIgnoreFilesPatterns = options => {\n\tconst {ignoreFiles, gitignore} = options;\n\n\tconst patterns = ignoreFiles ? toPatternsArray(ignoreFiles) : [];\n\tif (gitignore) {\n\t\tpatterns.push(GITIGNORE_FILES_PATTERN);\n\t}\n\n\treturn patterns;\n};\n\n/**\nApply gitignore patterns to options and return filter predicate.\n\nWhen negation patterns are present (e.g., '!important.log'), we cannot pass positive patterns to fast-glob because it would filter out files before our predicate can re-include them. In this case, we rely entirely on the predicate for filtering, which handles negations correctly.\n\nWhen there are no negations, we optimize by passing patterns to fast-glob's ignore option to skip directories during traversal (performance optimization).\n\nAll patterns (including negated) are always used in the filter predicate to ensure correct Git-compatible behavior.\n\n@returns {Promise<{options: Object, filter: Function}>}\n*/\nconst applyIgnoreFilesAndGetFilter = async options => {\n\tconst ignoreFilesPatterns = getIgnoreFilesPatterns(options);\n\n\tif (ignoreFilesPatterns.length === 0) {\n\t\treturn {\n\t\t\toptions,\n\t\t\tfilter: createFilterFunction(false, options.cwd),\n\t\t};\n\t}\n\n\t// Read ignore files once and get both patterns and predicate\n\t// Enable parent .gitignore search when using gitignore option\n\tconst includeParentIgnoreFiles = options.gitignore === true;\n\tconst {patterns, predicate, usingGitRoot} = await getIgnorePatternsAndPredicate(ignoreFilesPatterns, options, includeParentIgnoreFiles);\n\n\t// Convert patterns to fast-glob format (may return empty array if predicate should handle everything)\n\tconst patternsForFastGlob = convertPatternsForFastGlob(patterns, usingGitRoot, normalizeDirectoryPatternForFastGlob);\n\n\tconst modifiedOptions = {\n\t\t...options,\n\t\tignore: [...options.ignore, ...patternsForFastGlob],\n\t};\n\n\treturn {\n\t\toptions: modifiedOptions,\n\t\tfilter: createFilterFunction(predicate, options.cwd),\n\t};\n};\n\n/**\nApply gitignore patterns to options and return filter predicate (sync version).\n\n@returns {{options: Object, filter: Function}}\n*/\nconst applyIgnoreFilesAndGetFilterSync = options => {\n\tconst ignoreFilesPatterns = getIgnoreFilesPatterns(options);\n\n\tif (ignoreFilesPatterns.length === 0) {\n\t\treturn {\n\t\t\toptions,\n\t\t\tfilter: createFilterFunction(false, options.cwd),\n\t\t};\n\t}\n\n\t// Read ignore files once and get both patterns and predicate\n\t// Enable parent .gitignore search when using gitignore option\n\tconst includeParentIgnoreFiles = options.gitignore === true;\n\tconst {patterns, predicate, usingGitRoot} = getIgnorePatternsAndPredicateSync(ignoreFilesPatterns, options, includeParentIgnoreFiles);\n\n\t// Convert patterns to fast-glob format (may return empty array if predicate should handle everything)\n\tconst patternsForFastGlob = convertPatternsForFastGlob(patterns, usingGitRoot, normalizeDirectoryPatternForFastGlob);\n\n\tconst modifiedOptions = {\n\t\t...options,\n\t\tignore: [...options.ignore, ...patternsForFastGlob],\n\t};\n\n\treturn {\n\t\toptions: modifiedOptions,\n\t\tfilter: createFilterFunction(predicate, options.cwd),\n\t};\n};\n\nconst createFilterFunction = (isIgnored, cwd) => {\n\tconst seen = new Set();\n\tconst basePath = cwd || process.cwd();\n\tconst pathCache = new Map(); // Cache for resolved paths\n\n\treturn fastGlobResult => {\n\t\tconst pathKey = nodePath.normalize(fastGlobResult.path ?? fastGlobResult);\n\n\t\t// Check seen set first (fast path)\n\t\tif (seen.has(pathKey)) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Only compute absolute path and check predicate if needed\n\t\tif (isIgnored) {\n\t\t\tlet absolutePath = pathCache.get(pathKey);\n\t\t\tif (absolutePath === undefined) {\n\t\t\t\tabsolutePath = nodePath.isAbsolute(pathKey) ? pathKey : nodePath.resolve(basePath, pathKey);\n\t\t\t\tpathCache.set(pathKey, absolutePath);\n\n\t\t\t\t// Only clear path cache if it gets too large\n\t\t\t\t// Never clear 'seen' as it's needed for deduplication\n\t\t\t\tif (pathCache.size > 10_000) {\n\t\t\t\t\tpathCache.clear();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isIgnored(absolutePath)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tseen.add(pathKey);\n\t\treturn true;\n\t};\n};\n\nconst unionFastGlobResults = (results, filter) => results.flat().filter(fastGlobResult => filter(fastGlobResult));\n\nconst convertNegativePatterns = (patterns, options) => {\n\t// If all patterns are negative and expandNegationOnlyPatterns is enabled (default),\n\t// prepend a positive catch-all pattern to make negation-only patterns work intuitively\n\t// (e.g., '!*.json' matches all files except JSON)\n\tif (patterns.length > 0 && patterns.every(pattern => isNegativePattern(pattern))) {\n\t\tif (options.expandNegationOnlyPatterns === false) {\n\t\t\treturn [];\n\t\t}\n\n\t\tpatterns = ['**/*', ...patterns];\n\t}\n\n\tconst positiveAbsolutePathPrefixes = [];\n\tlet hasRelativePositivePattern = false;\n\tconst normalizedPatterns = [];\n\n\tfor (const pattern of patterns) {\n\t\tif (isNegativePattern(pattern)) {\n\t\t\tnormalizedPatterns.push(`!${normalizeNegativePattern(pattern.slice(1), positiveAbsolutePathPrefixes, hasRelativePositivePattern)}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tnormalizedPatterns.push(pattern);\n\n\t\tconst staticAbsolutePathPrefix = getStaticAbsolutePathPrefix(pattern);\n\t\tif (staticAbsolutePathPrefix === undefined) {\n\t\t\thasRelativePositivePattern = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tpositiveAbsolutePathPrefixes.push(staticAbsolutePathPrefix);\n\t}\n\n\tpatterns = normalizedPatterns;\n\n\tconst tasks = [];\n\n\twhile (patterns.length > 0) {\n\t\tconst index = patterns.findIndex(pattern => isNegativePattern(pattern));\n\n\t\tif (index === -1) {\n\t\t\ttasks.push({patterns, options});\n\t\t\tbreak;\n\t\t}\n\n\t\tconst ignorePattern = patterns[index].slice(1);\n\n\t\tfor (const task of tasks) {\n\t\t\ttask.options.ignore.push(ignorePattern);\n\t\t}\n\n\t\tif (index !== 0) {\n\t\t\ttasks.push({\n\t\t\t\tpatterns: patterns.slice(0, index),\n\t\t\t\toptions: {\n\t\t\t\t\t...options,\n\t\t\t\t\tignore: [\n\t\t\t\t\t\t...options.ignore,\n\t\t\t\t\t\tignorePattern,\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tpatterns = patterns.slice(index + 1);\n\t}\n\n\treturn tasks;\n};\n\nconst applyParentDirectoryIgnoreAdjustments = tasks => tasks.map(task => ({\n\tpatterns: task.patterns,\n\toptions: {\n\t\t...task.options,\n\t\tignore: adjustIgnorePatternsForParentDirectories(task.patterns, task.options.ignore),\n\t},\n}));\n\nconst normalizeExpandDirectoriesOption = (options, cwd) => ({\n\t...(cwd ? {cwd} : {}),\n\t...(Array.isArray(options) ? {files: options} : options),\n});\n\nconst generateTasks = async (patterns, options) => {\n\tconst globTasks = convertNegativePatterns(patterns, options);\n\n\tconst {cwd, expandDirectories, fs: fsImplementation} = options;\n\n\tif (!expandDirectories) {\n\t\treturn applyParentDirectoryIgnoreAdjustments(globTasks);\n\t}\n\n\tconst directoryToGlobOptions = {\n\t\t...normalizeExpandDirectoriesOption(expandDirectories, cwd),\n\t\tfs: fsImplementation,\n\t};\n\n\treturn Promise.all(globTasks.map(async task => {\n\t\tlet {patterns, options} = task;\n\n\t\t[\n\t\t\tpatterns,\n\t\t\toptions.ignore,\n\t\t] = await Promise.all([\n\t\t\tdirectoryToGlob(patterns, directoryToGlobOptions),\n\t\t\tdirectoryToGlob(options.ignore, {cwd, fs: fsImplementation}),\n\t\t]);\n\n\t\t// Adjust ignore patterns for parent directory references\n\t\toptions.ignore = adjustIgnorePatternsForParentDirectories(patterns, options.ignore);\n\n\t\treturn {patterns, options};\n\t}));\n};\n\nconst generateTasksSync = (patterns, options) => {\n\tconst globTasks = convertNegativePatterns(patterns, options);\n\tconst {cwd, expandDirectories, fs: fsImplementation} = options;\n\n\tif (!expandDirectories) {\n\t\treturn applyParentDirectoryIgnoreAdjustments(globTasks);\n\t}\n\n\tconst directoryToGlobSyncOptions = {\n\t\t...normalizeExpandDirectoriesOption(expandDirectories, cwd),\n\t\tfs: fsImplementation,\n\t};\n\n\treturn globTasks.map(task => {\n\t\tlet {patterns, options} = task;\n\t\tpatterns = directoryToGlobSync(patterns, directoryToGlobSyncOptions);\n\t\toptions.ignore = directoryToGlobSync(options.ignore, {cwd, fs: fsImplementation});\n\n\t\t// Adjust ignore patterns for parent directory references\n\t\toptions.ignore = adjustIgnorePatternsForParentDirectories(patterns, options.ignore);\n\n\t\treturn {patterns, options};\n\t});\n};\n\nexport const globby = normalizeArguments(async (patterns, options) => {\n\t// Apply ignore files and get filter (reads .gitignore files once)\n\tconst {options: modifiedOptions, filter} = await applyIgnoreFilesAndGetFilter(options);\n\n\t// Generate tasks with modified options (includes gitignore patterns in ignore option)\n\tconst tasks = await generateTasks(patterns, modifiedOptions);\n\n\tconst results = await Promise.all(tasks.map(task => fastGlob(task.patterns, task.options)));\n\treturn unionFastGlobResults(results, filter);\n});\n\nexport const globbySync = normalizeArgumentsSync((patterns, options) => {\n\t// Apply ignore files and get filter (reads .gitignore files once)\n\tconst {options: modifiedOptions, filter} = applyIgnoreFilesAndGetFilterSync(options);\n\n\t// Generate tasks with modified options (includes gitignore patterns in ignore option)\n\tconst tasks = generateTasksSync(patterns, modifiedOptions);\n\n\tconst results = tasks.map(task => fastGlob.sync(task.patterns, task.options));\n\treturn unionFastGlobResults(results, filter);\n});\n\nexport const globbyStream = normalizeArgumentsSync((patterns, options) => {\n\t// Apply ignore files and get filter (reads .gitignore files once)\n\tconst {options: modifiedOptions, filter} = applyIgnoreFilesAndGetFilterSync(options);\n\n\t// Generate tasks with modified options (includes gitignore patterns in ignore option)\n\tconst tasks = generateTasksSync(patterns, modifiedOptions);\n\n\tconst streams = tasks.map(task => fastGlob.stream(task.patterns, task.options));\n\n\tif (streams.length === 0) {\n\t\treturn Readable.from([]);\n\t}\n\n\tconst stream = mergeStreams(streams).filter(fastGlobResult => filter(fastGlobResult));\n\n\t// Returning a web stream will require revisiting once Readable.toWeb integration is viable.\n\t// return Readable.toWeb(stream);\n\n\treturn stream;\n});\n\nexport const isDynamicPattern = normalizeArgumentsSync((patterns, options) => patterns.some(pattern => fastGlob.isDynamicPattern(pattern, options)));\n\nexport const generateGlobTasks = normalizeArguments(generateTasks);\nexport const generateGlobTasksSync = normalizeArgumentsSync(generateTasksSync);\n\nexport {\n\tisGitIgnored,\n\tisGitIgnoredSync,\n\tisIgnoredByIgnoreFiles,\n\tisIgnoredByIgnoreFilesSync,\n} from './ignore.js';\n\nexport const {convertPathToPattern} = fastGlob;\n", "/**\n * Raclette Configuration with ESLint properties\n */\nexport type RacletteAppMode = \"workbench\" | \"product-view\" | string\nexport type RacletteConfig = {\n name: string\n root: string\n services: {\n frontend?: ServiceFrontendConfig\n backend?: ServiceBackendConfig\n mongodb?: {\n enabled: boolean\n port: number\n name?: string\n volume?: string\n databaseName?: string\n volumes?: VolumeDefinition[] // Add custom volumes property\n }\n cache?: {\n enabled: boolean\n port: number\n name?: string\n volume?: string\n db?: number\n volumes?: VolumeDefinition[] // Add custom volumes property\n \n }\n workbench?: {\n enabled: boolean\n debugPort?: number\n withLogs?: boolean\n frontendPort: number\n backendPort: number\n }\n [key: string]: any\n }\n plugins: Array<string | [string, any]>\n modules: Array<string | [string, any]>\n env: {\n development?: EnvironmentVariables\n production?: EnvironmentVariables\n [key: string]: EnvironmentVariables | undefined\n }\n global: {\n requireAuthentication: boolean\n appMode?: RacletteAppMode\n }\n frontend: {\n additonalPluginPaths?: string[]\n framework: \"vue\" | \"react\"\n pleaseLetUsAdvertiseOurselfs?: boolean\n advertiseYourself?: string\n preventNotifications?: boolean\n i18n?: {\n locales?: string[]\n priorities?: Record<string, number>\n }\n vue?: {\n plugins: string[]\n }\n react?: {\n plugins: string[]\n }\n custom?: {\n [key: string]: any\n }\n }\n backend: {\n additonalPluginPaths?: string[]\n sockets?: SocketConfig\n custom?: {\n [key: string]: any\n }\n cache?: CacheConfig\n }\n workbench?: WorkbenchConfig\n typescript?: {\n compilerOptions?: {\n // Allow for any compiler option to be overridden\n [key: string]: any\n }\n }\n eslint?: {\n rules?: Record<string, any>\n plugins?: string[]\n extends?: string[]\n ignores?: string[]\n // Whether to use recommended rules\n useRecommended?: boolean\n // For environment-specific configurations\n env?: Record<string, any>\n }\n // Multi-App Workspace feature - configurable source directories\n sourceDirectories?: Array<{\n name: string\n path: string // Supports env variables like process.env.SOME_PATH || \"../fallback\"\n priority: number\n servicePathMap?: {\n [service: string]: string\n }\n folderMappings?: {\n [targetPath: string]: string\n }\n }>\n // Generic package merging configuration\n packageMerging?: {\n frontend?: PackageSourceConfig[]\n backend?: PackageSourceConfig[]\n [service: string]: PackageSourceConfig[] | undefined\n }\n // Configurable lock file paths\n lockFiles?: {\n frontend?: string\n backend?: string\n [service: string]: string | undefined\n }\n}\n\nexport type WorkbenchConfig = {\n frontend: {\n i18n?: {\n locales?: string[]\n }\n }\n}\n\nexport type ServiceFrontendConfig = {\n enabled: boolean\n port: number\n name?: string\n nodeModulesVolume?: string\n installPackages?: string[]\n volumes?: VolumeDefinition[] // Add custom volumes property\n}\n\nexport type ServiceBackendConfig = {\n enabled: boolean\n port: number\n name?: string\n nodeModulesVolume?: string\n enableDebug?: boolean\n installPackages?: string[]\n volumes?: VolumeDefinition[] // Add custom volumes property\n}\n\nexport type EnvironmentVariables = {\n RACLETTE_CORE_ABSOLUTE_PATH?: string\n RACLETTE_DEBUG_MODE?: boolean\n RACLETTE_SOCKET_URL?: string\n RACLETTE_SERVER_BASE_URL?: string\n RACLETTE_INERHIT_NPMRC?: boolean\n RACLETTE_DISABLE_PLUGIN_LOGS?: boolean\n // overrides for service config\n RACLETTE_SERVER_CONTAINERNAME?: string\n RACLETTE_SERVER_PORT?: number\n RACLETTE_SERVER_TOKEN_SECRET?: string\n RACLETTE_CLIENT_CONTAINERNAME?: string\n RACLETTE_CLIENT_PORT?: number\n RACLETTE_MONGODB_HOST?: string\n RACLETTE_MONGODB_CONTAINERNAME?: string\n RACLETTE_MONGODB_PORT?: number\n RACLETTE_MONGODB_VOLUME?: string\n RACLETTE_MONGODB_CONFIG_VOLUME?: string\n RACLETTE_CACHE_URL?: string\n RACLETTE_CACHE_CONTAINERNAME?: string\n RACLETTE_CACHE_PORT?: number\n RACLETTE_CACHE_VOLUME?: string\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // Allow additional vars\n}\n\n/**\n * Volume Definition for Docker Compose\n */\nexport type VolumeDefinition = {\n // Source can be a named volume, host path, or volume specification\n source: string\n // Target is the path inside the container\n target: string\n // Optional volume type (bind, volume, tmpfs)\n type?: \"bind\" | \"volume\" | \"tmpfs\"\n // Optional read-only flag\n readonly?: boolean\n // Skip this volume if source path doesn't exist\n mustExist?: boolean\n // Optional volume driver-specific options\n volumeOptions?: {\n // Populate on service creation when volume doesn't exist\n nocopy?: boolean\n // Any other driver-specific options\n [key: string]: any\n }\n // Optional bind-specific options\n bindOptions?: {\n // Propagation mode for bind mounts\n propagation?:\n | \"private\"\n | \"rprivate\"\n | \"shared\"\n | \"rshared\"\n | \"slave\"\n | \"rslave\"\n // Create host path if it doesn't exist\n createHostPath?: boolean\n // Any other bind-specific options\n [key: string]: any\n }\n // Optional tmpfs-specific options\n tmpfsOptions?: {\n // Size of the tmpfs mount in bytes\n size?: number\n // File mode of the tmpfs in octal\n mode?: number\n }\n}\n/**\n * Cache Configuration\n */\nexport type CacheConfig = {\n persistence?: \"none\" | \"rdb\" | \"aof\" | \"rdb+aof\"\n RDB_OPTIONS?: string\n}\n/**\n * Socket Configuration\n */\nexport type SocketConfig = {\n /** Configure what data is automatically sent when a frontend joins */\n autoSend: {\n /** Send compositions data on join */\n compositions: boolean\n /** Send interaction links data on join */\n interactionLinks: boolean\n /** Send project configuration on join */\n projectConfig: boolean\n /** Additional custom data types to send (must be in the DB and registered via stream) */\n additionalDatatypes?: {\n [key: string]: boolean | undefined\n }\n customData?: {\n /** Key is the property name in the response, value is the static data */\n [key: string]: any\n }\n }\n\n /** Socket security configuration */\n security: {\n /** Whether authentication is required for socket connections */\n requireAuth: boolean\n /** Token validation method */\n tokenValidation: \"jwt\"\n /** Custom validation handler path */\n customValidator?: string\n }\n\n /** Advanced socket options */\n options: {\n /** Socket.io adapter configuration */\n adapter: \"memory\" | \"cache\" | \"mongodb\"\n /** Connection timeout in milliseconds */\n connectionTimeout: number\n /** Ping interval in milliseconds */\n pingInterval: number\n /** Ping timeout in milliseconds */\n pingTimeout: number\n }\n}\n\n/**\n * Raclette Module Definition\n */\nexport type RacletteModule = {\n name: string\n services?: Record<string, any>\n extendConfig?: (config: RacletteConfig, options: any) => RacletteConfig\n backendExtensions?: {\n plugins?: string[]\n routes?: string[]\n }\n frontendExtensions?: {\n components?: string[]\n plugins?: string[]\n }\n hooks?: Record<string, (...args: any[]) => Promise<void>>\n}\n\nexport type PluginMetadata = {\n name: string\n author: string\n version: string\n description?: string\n repository?: string\n license?: string\n hooks?: {\n beforeMount?: (app: any) => Promise<void>\n mounted?: (app: any) => Promise<void>\n beforeUnmount?: (app: any) => Promise<void>\n }\n pluginKey?: string\n dependencies?: string[]\n options?: Record<string, any>\n frontendDir?: string // default: \"./frontend\"\n backendDir?: string // default: \"./backend\"\n}\n\nexport type PackageSourceConfig = {\n // Path to the packages.json file (supports env variables)\n file: string\n // Key within the file to extract (e.g., \"frontend\", \"workbench.frontend\")\n key: string\n}\n\n// Type definitions for better type safety\nexport const Services = [\"frontend\", \"backend\"] as const\nexport type ServicesType = typeof Services\nexport type FrontendServerTarget = ServicesType[number]\nexport type Service = FrontendServerTarget\n\nexport const Workbenches = [\"workbench.frontend\", \"workbench.backend\"] as const\nexport type WorkbenchesType = typeof Workbenches\nexport type WorkbenchTarget = WorkbenchesType[number]\n\nexport const PackageTargets = [ ...Services, ...Workbenches] as const;\nexport type PackageTargetsType = typeof PackageTargets;\nexport type PackageTarget = PackageTargetsType[number];\n\nexport const Environments = [\"development\", \"production\"] as const\nexport type EnvironmentsType = typeof Services\nexport type Environment = EnvironmentsType[number]\n", "const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n", "import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n", "// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n", "import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` \u2192 `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n", "import commander from './index.js';\n\n// wrapper to provide named exports for ESM.\nexport const {\n program,\n createCommand,\n createArgument,\n createOption,\n CommanderError,\n InvalidArgumentError,\n InvalidOptionArgumentError, // deprecated old name\n Command,\n Argument,\n Option,\n Help,\n} = commander;\n", "export default function _isPlaceholder(a) {\n return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;\n}", "import _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n}", "import _curry1 from \"./_curry1.js\";\nimport _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2 : _curry1(function (_b) {\n return fn(a, _b);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b);\n }) : fn(a, b);\n }\n };\n}", "import _curry1 from \"./_curry1.js\";\nimport _curry2 from \"./_curry2.js\";\nimport _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal three-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry3(fn) {\n return function f3(a, b, c) {\n switch (arguments.length) {\n case 0:\n return f3;\n case 1:\n return _isPlaceholder(a) ? f3 : _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n });\n case 2:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f3 : _isPlaceholder(a) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _curry1(function (_c) {\n return fn(a, b, _c);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function (_a, _b) {\n return fn(_a, _b, c);\n }) : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b, c);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b, c);\n }) : _isPlaceholder(c) ? _curry1(function (_c) {\n return fn(a, b, _c);\n }) : fn(a, b, c);\n }\n };\n}", "export default function _has(prop, obj) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}", "export default function _isObject(x) {\n return Object.prototype.toString.call(x) === '[object Object]';\n}", "import _curry3 from \"./internal/_curry3.js\";\nimport _has from \"./internal/_has.js\";\n\n/**\n * Creates a new object with the own properties of the two provided objects. If\n * a key exists in both objects, the provided function is applied to the key\n * and the values associated with the key in each object, with the result being\n * used as the value associated with the key in the returned object.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category Object\n * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}\n * @param {Function} fn\n * @param {Object} l\n * @param {Object} r\n * @return {Object}\n * @see R.mergeDeepWithKey, R.mergeWith\n * @example\n *\n * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r\n * R.mergeWithKey(concatValues,\n * { a: true, thing: 'foo', values: [10, 20] },\n * { b: true, thing: 'bar', values: [15, 35] });\n * //=> { a: true, b: true, thing: 'bar', values: [10, 20, 15, 35] }\n * @symb R.mergeWithKey(f, { x: 1, y: 2 }, { y: 5, z: 3 }) = { x: 1, y: f('y', 2, 5), z: 3 }\n */\nvar mergeWithKey = /*#__PURE__*/_curry3(function mergeWithKey(fn, l, r) {\n var result = {};\n var k;\n l = l || {};\n r = r || {};\n for (k in l) {\n if (_has(k, l)) {\n result[k] = _has(k, r) ? fn(k, l[k], r[k]) : l[k];\n }\n }\n for (k in r) {\n if (_has(k, r) && !_has(k, result)) {\n result[k] = r[k];\n }\n }\n return result;\n});\nexport default mergeWithKey;", "import _curry3 from \"./internal/_curry3.js\";\nimport _isObject from \"./internal/_isObject.js\";\nimport mergeWithKey from \"./mergeWithKey.js\";\n\n/**\n * Creates a new object with the own properties of the two provided objects.\n * If a key exists in both objects:\n * - and both associated values are also objects then the values will be\n * recursively merged.\n * - otherwise the provided function is applied to the key and associated values\n * using the resulting value as the new value associated with the key.\n * If a key only exists in one object, the value will be associated with the key\n * of the resulting object.\n *\n * @func\n * @memberOf R\n * @since v0.24.0\n * @category Object\n * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}\n * @param {Function} fn\n * @param {Object} lObj\n * @param {Object} rObj\n * @return {Object}\n * @see R.mergeWithKey, R.mergeDeepWith\n * @example\n *\n * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r\n * R.mergeDeepWithKey(concatValues,\n * { a: true, c: { thing: 'foo', values: [10, 20] }},\n * { b: true, c: { thing: 'bar', values: [15, 35] }});\n * //=> { a: true, b: true, c: { thing: 'bar', values: [10, 20, 15, 35] }}\n */\nvar mergeDeepWithKey = /*#__PURE__*/_curry3(function mergeDeepWithKey(fn, lObj, rObj) {\n return mergeWithKey(function (k, lVal, rVal) {\n if (_isObject(lVal) && _isObject(rVal)) {\n return mergeDeepWithKey(fn, lVal, rVal);\n } else {\n return fn(k, lVal, rVal);\n }\n }, lObj, rObj);\n});\nexport default mergeDeepWithKey;", "import _curry2 from \"./internal/_curry2.js\";\nimport mergeDeepWithKey from \"./mergeDeepWithKey.js\";\n\n/**\n * Creates a new object with the own properties of the first object merged with\n * the own properties of the second object. If a key exists in both objects:\n * - and both values are objects, the two values will be recursively merged\n * - otherwise the value from the second object will be used.\n *\n * @func\n * @memberOf R\n * @since v0.24.0\n * @category Object\n * @sig {a} -> {a} -> {a}\n * @param {Object} lObj\n * @param {Object} rObj\n * @return {Object}\n * @see R.mergeDeepLeft, R.mergeDeepWith, R.mergeDeepWithKey\n * @example\n *\n * R.mergeDeepRight({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }},\n * { age: 40, contact: { email: 'baa@example.com' }});\n * //=> { name: 'fred', age: 40, contact: { email: 'baa@example.com' }}\n */\nvar mergeDeepRight = /*#__PURE__*/_curry2(function mergeDeepRight(lObj, rObj) {\n return mergeDeepWithKey(function (k, lVal, rVal) {\n return rVal;\n }, lObj, rObj);\n});\nexport default mergeDeepRight;", "#!/usr/bin/env node\nimport type { RacletteConfig } from \"types\"\nimport { PackageTargets, Services } from \"./types\"\nimport type { BuildOptions } from \"src/raclette-builder\"\nimport type { DeployGuideOptions } from \"./deploy-guide-generator\"\nimport chalk from \"chalk\"\nimport { Command } from \"commander\"\nimport { mergeDeepRight } from \"ramda\"\nimport fs from \"fs-extra\"\nimport path from \"path\"\nimport yaml from \"js-yaml\"\nimport * as cfg from \"./config\"\nimport { pkg, template } from \"./builder\"\nimport { setupDevEnvironment, stopComposeServices } from \"./dev-environment\"\nimport { generateFullDockerCompose } from \"./docker-generator\"\nimport { trackServiceFiles, rebuildChangedServices } from \"./docker-tracker\"\nimport { addPackageToProject, updatePackageJsons } from \"./package-manager\"\nimport { getContainerName, updateDependencies } from \"./package-updater\"\n\nimport {\n checkDockerInstallation,\n executeDockerComposeCommand,\n executeDockerCommand,\n isContainerRunning,\n} from \"./docker-utils\"\nimport { handleLogCommand } from \"./log-handler\"\nimport { runProductionBuild } from \"src/raclette-builder\"\nimport {\n generateDeployGuide,\n generateDeployGuideContent,\n} from \"./deploy-guide-generator\"\nimport { logger } from \"src/logger\"\n\nconst cwd = process.cwd()\nif (!process.env.RACLETTE_APP_PATH) process.env.RACLETTE_APP_PATH = cwd\n\nconst env = await cfg.env() // only do this once\nconst envLog = Object.keys(env).length && chalk.blue(`\uD83D\uDCC4 Loaded ${Object.keys(env).length} environment variables from ${cwd}/.env`)\nenv[\"RACLETTE_APP_PATH\"] = process.env.RACLETTE_APP_PATH\n\n// if anything goes wrong here, it is a hard fail\nconst mainConfig = cfg.merge( await cfg.load(), await cfg.load( \"raclette.config.*\", env) ) \nconst root = env[\"RACLETTE_ROOT\"] || mainConfig.root || \".raclette\", raclettePath = path.join(cwd, root)\nconst dockerComposePath = path.join(raclettePath, \"docker-compose.yml\")\nmainConfig.root = root\n\nconst program = new Command()\nconst preHook = ( _cmd, _action) => { if(envLog) logger.raclette(envLog); fs.ensureDirSync(raclettePath) }\n\nprogram.version(\"0.1.0\")\n\n// Dev command\nprogram\n .command(\"dev\")\n .description(\"Start development environment\")\n .option(\"-q, --quiet\", \"Run Docker Compose in detached mode without following logs\")\n .option(\"-v, --verbose\", \"Get more information about what is happening\")\n .option(\"--filter <service>\", \"Filter logs to specific services (comma-separated)\",\n \"frontend,backend\")\n .option(\"--force-rebuild, --rebuild\", \"Force rebuild of Docker images regardless of file changes\")\n .option(\"-p, --project-name <projectName>\", \"Applies a specific project name\")\n .option(\"-f, --config-file <configFile>\", \"Additionally add a raclette.config file to merge on top of the default\")\n .option(\"-r, --root <root>\", \"Raclette tools root directory\",\n \".raclette\")\n .option(\"--no-cache\", \"Force rebuild Docker images without using cache\")\n .hook(\"preAction\", preHook)\n .action(async (options) => {\n logger.setVerbose(options.verbose)\n logger.raclette(\"Starting raclette development environment...\")\n try {\n checkDockerInstallation() // best do it early\n const config:RacletteConfig = cfg.merge(\n mainConfig,\n options.configFile ? await cfg.load(options.configFile) : {} as RacletteConfig )\n\n fs.writeFile( path.join(raclettePath,'raclette.config.yaml'), yaml.dump(config)) // save the merged config when we merge\n\n if (options.projectName) {\n logger.raclette(\"Setting project name to \" + options.projectName)\n config.name = options.projectName\n }\n\n cfg.generateServiceConfigs(config, raclettePath)\n\n // Start dev environment\n await setupDevEnvironment(raclettePath, env, config, {\n workingDir: cwd, \n dockerComposePath,\n quiet: options.quiet,\n verbose: options.verbose,\n logFilter: options.filter ? options.filter.split(\",\") : Services,\n forceRebuild: options.forceRebuild || options.rebuild,\n noCache: options.noCache,\n })\n } catch (error: any) {\n logger.error(\"Error starting development environment: \" + error?.message)\n process.exit(1)\n }\n })\n\n// Log command\nprogram\n .command(\"log [services...]\")\n .description(\n \"Follow logs for specified services (or all services if none specified)\",\n )\n .option(\"-f, --follow\", \"Follow log output (default: true)\", true)\n .option(\"--no-follow\", \"Don't follow log output\")\n .option(\n \"--tail <lines>\",\n \"Number of lines to show from the end of the logs\",\n \"100\",\n )\n .option(\"-v, --verbose\", \"Verbose output\")\n .hook(\"preAction\", preHook)\n .action(async (services, options) => {\n try {\n logger.setVerbose(options.verbose)\n\n logger.raclette(\"Attaching to service logs...\")\n\n if (!(await fs.pathExists(dockerComposePath))) {\n logger.error(\n \"No docker-compose.yml found. Services may not be running.\",\n )\n logger.instruction(\n \"Try running 'raclette dev' first to start the services.\",\n )\n process.exit(1)\n }\n\n await handleLogCommand(services, options, mainConfig, dockerComposePath)\n } catch (error: any) {\n logger.error(\"Error following logs: \" + error.message)\n process.exit(1)\n }\n })\n\n// Down command\nprogram\n .command(\"down\")\n .description(\"Stop Docker Compose services\")\n .option(\"--keep-shared\", \"Don't stop shared services like DB and Cache\")\n .option(\"-p, --project-name <projectName>\", \"Applies a specific project name\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .hook(\"preAction\", preHook)\n .action(async (options) => {\n try {\n logger.setVerbose(options.verbose)\n\n console.log(chalk.blue(\"\uD83E\uDDC0 Stopping Raclette Docker services...\"))\n\n const workingDir = cwd\n\n if (options.projectName) {\n logger.raclette(\"Setting project name to \" + options.projectName)\n mainConfig.name = options.projectName\n }\n\n // Define paths for regular and full docker-compose files\n \n const fullDockerComposePath = path.join(\n raclettePath,\n \"docker-compose.full.yml\",\n )\n\n if (!(await fs.pathExists(dockerComposePath))) {\n console.error(\n chalk.yellow(\n \"\u26A0\uFE0F No docker-compose.yml found. Services may not be running.\",\n ),\n )\n return\n }\n\n // If --keep-shared flag is provided, use the regular docker-compose file\n if (options.keepShared) {\n logger.debug(\n \"\u2139\uFE0F Using standard docker-compose file (keeping shared services)\",\n )\n await stopComposeServices(dockerComposePath, mainConfig)\n } else {\n // Otherwise, generate and use a full docker-compose file that includes all services\n logger.debug(\n \"\u2139Generating full docker-compose file including shared services\",\n )\n await generateFullDockerCompose(\n mainConfig,\n workingDir,\n fullDockerComposePath,\n \"development\",\n )\n\n // Use this file to stop all services\n await stopComposeServices(fullDockerComposePath, mainConfig)\n\n // Cleanup the full compose file after we're done\n await fs.remove(fullDockerComposePath)\n }\n\n logger.success(\"Docker services stopped successfully\")\n } catch (error: any) {\n logger.error(\"Error stopping Docker services: \" + error.message)\n process.exit(1)\n }\n })\n\n// Restart command\nprogram\n .command(\"restart [services...]\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .description(\"Restart specified Docker Compose services (frontend, backend, etc.)\")\n .hook(\"preAction\", preHook)\n .action(async (services, options) => {\n try {\n logger.setVerbose(options.verbose)\n logger.raclette(\"Restarting Raclette services...\")\n\n if (services.length === 0) {\n logger.warn(\"No services specified. Please specify which services to restart.\")\n logger.instruction(\"Usage: raclette restart <service1> <service2> ...\")\n logger.instruction(\"Common services: frontend, backend, mongodb, cache\")\n return\n }\n\n const projectName = mainConfig?.name ?? path.basename(cwd)\n\n if (!(await fs.pathExists(dockerComposePath))) {\n logger.warn(\"No docker-compose.yml found. Services may not be running with raclette.\")\n return\n }\n\n // Process each service\n for (const service of services) {\n try {\n // Determine actual container name based on config or convention\n const containerName = await getContainerName(\n service,\n mainConfig,\n dockerComposePath,\n )\n\n // Check if the service is running\n if (!isContainerRunning(containerName)) {\n logger.warn(`Service '${service}' (container: ${containerName}) doesn't appear to be running.`)\n logger.instruction(\" If you're sure it's running, it might have a different container name than expected.\")\n logger.instruction(\" To restart by container name directly, use: docker restart <container_name>\")\n continue\n }\n\n // Try to restart using docker-compose first\n if (await fs.pathExists(dockerComposePath)) {\n logger.progress(`Restarting service: ${service}...`)\n\n executeDockerComposeCommand(\n [\"-p\", projectName, \"-f\", dockerComposePath, \"restart\", service],\n { stdio: \"inherit\" },\n )\n } else {\n // Fall back to direct container restart\n logger.progress(` Restarting container: ${containerName}...`)\n\n executeDockerCommand([\"restart\", containerName], {\n stdio: \"inherit\",\n })\n }\n\n logger.success(`Service '${service}' restarted successfully`)\n } catch (error: any) {\n logger.error(\n `Error restarting service '${service}': ${error.message}`,\n )\n // Continue with other services instead of failing completely\n }\n }\n } catch (error: any) {\n logger.error(\"Error restarting services: \" + error.message)\n process.exit(1)\n }\n })\n\n// Update Dependencies within container\nprogram\n .command(\"update [target]\")\n .description(\"Update dependencies for frontend, backend, or both by running dependency check script\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .hook(\"preAction\", preHook)\n .action(async (target = \"both\", options) => {\n try {\n logger.setVerbose(options.verbose)\n\n if (![\"frontend\", \"backend\", \"both\"].includes(target)) {\n logger.error(\"Target must be one of: frontend, backend, both\")\n process.exit(1)\n }\n\n await updatePackageJsons(target, mainConfig)\n\n // Use the extracted updateDependencies function\n const success = await updateDependencies(\n target as PackageTarget,\n mainConfig,\n raclettePath,\n )\n\n // Exit with appropriate code if the update failed\n if (!success) {\n logger.warn(\"\u26A0\uFE0F Dependencies update completed with errors\")\n process.exit(1)\n }\n } catch (error: any) {\n logger.error(\"Error updating dependencies: \" + error.message)\n process.exit(1)\n }\n })\n\nprogram\n .command(\"build\")\n .description(\"Build application with different modes\")\n .option(\n \"--mode <mode>\",\n \"Build mode: artifacts (local deployment), images (CI/CD), package (offline)\",\n \"artifacts\",\n )\n .option(\"--image-tag <tag>\", \"Image tag for registry (e.g., v1.0.0)\")\n .option(\n \"--image-prefix <prefix>\",\n \"Image name prefix (default: project name)\",\n )\n .option(\"--generate-latest\", \"Also tag images as :latest\")\n .option(\"--output-dir <dir>\", \"Output directory\")\n .option(\"--skip-workbench\", \"Skip workbench build\")\n .option(\"--no-cache\", \"Build without cache\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"--buildx\", \"Use Docker buildx for multi-architecture builds\")\n .option(\n \"--platforms <platforms>\",\n \"Target platforms for buildx\",\n \"linux/amd64,linux/arm64\",\n )\n .option(\"--build-only\", \"Legacy: same as --mode artifacts\")\n .option(\"--build-images\", \"Legacy: same as --mode images\")\n .option(\"--package-images\", \"Legacy: same as --mode package\")\n .option(\"-p, --project-name <projectName>\", \"Applies a specific project name\")\n .option(\n \"-f, --config-file <configFile>\",\n \"Additionally add a raclette.config file to merge on top of the default\",\n )\n .hook(\"preAction\", preHook)\n .action(async (options) => {\n try {\n logger.setVerbose(options.verbose)\n\n logger.raclette(\"Building raclette application...\")\n\n const workingDir = cwd\n const config:RacletteConfig = mergeDeepRight( mainConfig, options.configFile ? await cfg.load(options.configFile) : {} )\n fs.writeFileSync( path.join(raclettePath,'raclette.config.yaml'),yaml.dump(config)) // save the merged config when we merge\n\n // generate service configs\n cfg.generateServiceConfigs(config, raclettePath)\n\n if (options.projectName) {\n logger.raclette(\"Setting project name to \" + options.projectName)\n config.name = options.projectName\n }\n\n // Convert CLI options to BuildOptions\n const buildOptions: BuildOptions = {\n outputDir: options.outputDir,\n skipWorkbench: options.skipWorkbench,\n verbose: options.verbose,\n noCache: options.noCache,\n mode: options.mode,\n imageTag: options.imageTag,\n imagePrefix: options.imagePrefix,\n generateLatest: options.generateLatest,\n // Legacy compatibility\n buildOnly: options.buildOnly,\n buildImages: options.buildImages,\n packageImages: options.packageImages,\n buildx: options.buildx,\n platforms: options.platforms,\n }\n\n const buildRes = await runProductionBuild(\n config,\n workingDir,\n buildOptions,\n )\n\n logger.success(\"Build complete!\")\n\n // Mode-specific completion messages\n switch (buildRes.mode) {\n case \"artifacts\":\n logger.success(`Build files are in ${buildRes.buildDir}!`)\n logger.raw(chalk.green(`\uD83D\uDE80 Ready for deployment with deploy.sh`))\n break\n case \"images\":\n logger.success(`Docker images built and tagged`)\n logger.raw(chalk.green(`\uD83D\uDE80 Ready for registry push`))\n break\n case \"package\":\n logger.success(`Build files are in ${buildRes.buildDir}!`)\n if (buildRes.deploymentPackage) {\n logger.raw(\n chalk.green(\n `\uD83D\uDE80 Deployment package ready: ${buildRes.deploymentPackage}`,\n ),\n )\n }\n break\n }\n\n process.exit(0)\n } catch (error: any) {\n logger.error(\"Error building application: \" + error?.message)\n process.exit(1)\n }\n })\n\n\n// Package management command\nprogram\n .command(\"add-package <target> <package...>\")\n .description(`Add a package to the project (target: ${PackageTargets.join(\", \")})`)\n .option(\"--dev\", \"Add as a development dependency\")\n .option(\"--no-update\",\"Skip updating dependencies after adding packages\", true)\n .option(\"-v, --verbose\", \"Verbose output\")\n .hook(\"preAction\", preHook)\n .action(async (target: string, packages: string[], options: any) => {\n logger.setVerbose(options.verbose)\n try {\n if (!PackageTargets.includes(target)) {\n logger.error( `Target must be one of: ${PackageTargets.join(\", \")}}`)\n process.exit(1)\n }\n\n logger.raclette(`Adding package(s) to ${target}...`)\n\n for (const pkg of packages) {\n await addPackageToProject(target, pkg, options.dev)\n }\n\n logger.info(\n \"Now updating auto-generated package.json file(s) in .raclette folder...\",\n )\n\n // update auto-generated package.json\n await updatePackageJsons(target, mainConfig)\n\n // Update dependencies in running containers using the extracted function\n await updateDependencies(target, mainConfig, raclettePath)\n } catch (error: any) {\n logger.error(\"Error adding package: \" + error.message)\n process.exit(1)\n }\n })\n\n// Rebuild command\nprogram\n .command(\"rebuild [services...]\")\n .description(\"Rebuild Docker images for specified services or all services\")\n .option(\"--no-cache\", \"Force rebuild Docker images without using cache\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .hook(\"preAction\", preHook)\n .action(async (services, options) => {\n try {\n logger.setVerbose(options.verbose)\n logger.raclette(\"Rebuilding Raclette Docker images...\")\n\n // If no services specified, check for changes and rebuild those\n if (services.length === 0) {\n logger.debug(\"\uD83D\uDD0D Detecting services with changes...\")\n const changedServices = await trackServiceFiles(mainConfig, raclettePath)\n\n if (changedServices.length === 0) {\n logger.warn(\n \"No service file changes detected. Use service names to force rebuild.\",\n )\n return\n }\n\n services = changedServices\n }\n\n // Validate services\n const validServices = services.filter(\n (service: string) =>\n service === \"frontend\" ||\n service === \"backend\" ||\n service === \"workbench\",\n )\n\n if (validServices.length === 0) {\n logger.error(\"No valid services specified for rebuild\")\n logger.warn(\"Valid services are: frontend, backend, workbench\")\n\n process.exit(1)\n }\n\n // Rebuild specified services\n await rebuildChangedServices(mainConfig, raclettePath, validServices, { noCache: options.noCache })\n\n logger.success(\n `Rebuild complete for services: ${validServices.join(\", \")}`,\n )\n } catch (error: any) {\n logger.error(\"Error rebuilding Docker images: \" + error.message)\n process.exit(1)\n }\n })\n\nprogram\n .command(\"deploy-guide\")\n .description(\n \"Generate deployment guide and files for registry-based deployment\",\n )\n .option(\n \"--image-prefix <prefix>\",\n \"Image name prefix (default: project name)\",\n )\n .option(\"--image-tag <tag>\", \"Image tag (default: latest)\")\n .option(\n \"--registry <url>\",\n \"Registry URL prefix (e.g., registry.gitlab.com/group/)\",\n )\n .option(\"--output-dir <dir>\", \"Output directory (default: current directory)\")\n .option(\"--generate-files\", \"Generate separate files for local testing\")\n .option(\"--return-only\", \"Output to stdout only (no file generation)\")\n .option(\"-v, --verbose\", \"Verbose output\")\n .hook(\"preAction\", preHook)\n .action(async (options) => {\n // Generate embedded guide (default)\n // raclette deploy-guide --image-prefix pacifico/openstack-billingdashboard --registry registry.gitlab.com/myorg/\n\n // Generate files for local testing\n // raclette deploy-guide --generate-files --image-prefix pacifico/openstack-billingdashboard --image-tag v0.0.1\n\n try {\n logger.setVerbose(options.verbose)\n\n logger.raclette(\"Generating raclette deployment guide...\")\n\n if (options.returnOnly) {\n // Generate and output to stdout only\n const deployGuideOptions: DeployGuideOptions = {\n imagePrefix: options.imagePrefix,\n imageTag: options.imageTag,\n registry: options.registry,\n outputDir: undefined, // No file output\n generateFiles: false,\n returnOnly: true,\n }\n\n const content = await generateDeployGuideContent(\n mainConfig,\n deployGuideOptions,\n )\n console.log(content)\n process.exit(0)\n }\n\n const deployGuideOptions: DeployGuideOptions = {\n imagePrefix: options.imagePrefix,\n imageTag: options.imageTag,\n registry: options.registry,\n outputDir: options.outputDir,\n generateFiles: options.generateFiles,\n }\n\n const result = await generateDeployGuide(mainConfig, deployGuideOptions)\n\n logger.success(\"Deployment guide generated!\")\n\n if (result.mode === \"files\") {\n logger.raw(chalk.cyan(`\uD83D\uDCC1 Files created in: ${result.outputPath}`))\n logger.raw(chalk.yellow(\"\uD83D\uDCA1 Use these files for local testing\"))\n logger.raw(\n chalk.yellow(\"\uD83D\uDCA1 Copy DEPLOY.md content to your project README\"),\n )\n } else {\n logger.raw(chalk.cyan(`\uD83D\uDCC4 Guide created: ${result.deployGuideFile}`))\n logger.raw(\n chalk.yellow(\"\uD83D\uDCA1 Copy the user section to your project README\"),\n )\n }\n\n process.exit(0)\n } catch (error: any) {\n logger.error(\"Error generating deployment guide: \" + error.message)\n process.exit(1)\n }\n })\n\n\nprogram.command(\"config\")\n .description(\"(Re)Configure Raclette Application\")\n .option(\"-c, --config <config>\", \"configuration file\", \"raclette.config.yaml\")\n .hook(\"preAction\", preHook)\n .action(async (options) => {\n \n console.log(chalk.bold.green(\"YO!\")+chalk.bold.red(\":\"))\n \n })\nprogram.parse(process.argv)\n", "\n/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */\nfunction isNothing(subject) {\n return (typeof subject === 'undefined') || (subject === null);\n}\n\n\nfunction isObject(subject) {\n return (typeof subject === 'object') && (subject !== null);\n}\n\n\nfunction toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;\n else if (isNothing(sequence)) return [];\n\n return [ sequence ];\n}\n\n\nfunction extend(target, source) {\n var index, length, key, sourceKeys;\n\n if (source) {\n sourceKeys = Object.keys(source);\n\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\n\nfunction repeat(string, count) {\n var result = '', cycle;\n\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n\n return result;\n}\n\n\nfunction isNegativeZero(number) {\n return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);\n}\n\n\nvar isNothing_1 = isNothing;\nvar isObject_1 = isObject;\nvar toArray_1 = toArray;\nvar repeat_1 = repeat;\nvar isNegativeZero_1 = isNegativeZero;\nvar extend_1 = extend;\n\nvar common = {\n\tisNothing: isNothing_1,\n\tisObject: isObject_1,\n\ttoArray: toArray_1,\n\trepeat: repeat_1,\n\tisNegativeZero: isNegativeZero_1,\n\textend: extend_1\n};\n\n// YAML error class. http://stackoverflow.com/questions/8458984\n\n\nfunction formatError(exception, compact) {\n var where = '', message = exception.reason || '(unknown reason)';\n\n if (!exception.mark) return message;\n\n if (exception.mark.name) {\n where += 'in \"' + exception.mark.name + '\" ';\n }\n\n where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';\n\n if (!compact && exception.mark.snippet) {\n where += '\\n\\n' + exception.mark.snippet;\n }\n\n return message + ' ' + where;\n}\n\n\nfunction YAMLException$1(reason, mark) {\n // Super constructor\n Error.call(this);\n\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = formatError(this, false);\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = (new Error()).stack || '';\n }\n}\n\n\n// Inherit from Error\nYAMLException$1.prototype = Object.create(Error.prototype);\nYAMLException$1.prototype.constructor = YAMLException$1;\n\n\nYAMLException$1.prototype.toString = function toString(compact) {\n return this.name + ': ' + formatError(this, compact);\n};\n\n\nvar exception = YAMLException$1;\n\n// get snippet for a single line, respecting maxLength\nfunction getLine(buffer, lineStart, lineEnd, position, maxLineLength) {\n var head = '';\n var tail = '';\n var maxHalfLength = Math.floor(maxLineLength / 2) - 1;\n\n if (position - lineStart > maxHalfLength) {\n head = ' ... ';\n lineStart = position - maxHalfLength + head.length;\n }\n\n if (lineEnd - position > maxHalfLength) {\n tail = ' ...';\n lineEnd = position + maxHalfLength - tail.length;\n }\n\n return {\n str: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, '\u2192') + tail,\n pos: position - lineStart + head.length // relative position\n };\n}\n\n\nfunction padStart(string, max) {\n return common.repeat(' ', max - string.length) + string;\n}\n\n\nfunction makeSnippet(mark, options) {\n options = Object.create(options || null);\n\n if (!mark.buffer) return null;\n\n if (!options.maxLength) options.maxLength = 79;\n if (typeof options.indent !== 'number') options.indent = 1;\n if (typeof options.linesBefore !== 'number') options.linesBefore = 3;\n if (typeof options.linesAfter !== 'number') options.linesAfter = 2;\n\n var re = /\\r?\\n|\\r|\\0/g;\n var lineStarts = [ 0 ];\n var lineEnds = [];\n var match;\n var foundLineNo = -1;\n\n while ((match = re.exec(mark.buffer))) {\n lineEnds.push(match.index);\n lineStarts.push(match.index + match[0].length);\n\n if (mark.position <= match.index && foundLineNo < 0) {\n foundLineNo = lineStarts.length - 2;\n }\n }\n\n if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;\n\n var result = '', i, line;\n var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;\n var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);\n\n for (i = 1; i <= options.linesBefore; i++) {\n if (foundLineNo - i < 0) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo - i],\n lineEnds[foundLineNo - i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),\n maxLineLength\n );\n result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n' + result;\n }\n\n line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);\n result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\\n';\n\n for (i = 1; i <= options.linesAfter; i++) {\n if (foundLineNo + i >= lineEnds.length) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo + i],\n lineEnds[foundLineNo + i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),\n maxLineLength\n );\n result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n }\n\n return result.replace(/\\n$/, '');\n}\n\n\nvar snippet = makeSnippet;\n\nvar TYPE_CONSTRUCTOR_OPTIONS = [\n 'kind',\n 'multi',\n 'resolve',\n 'construct',\n 'instanceOf',\n 'predicate',\n 'represent',\n 'representName',\n 'defaultStyle',\n 'styleAliases'\n];\n\nvar YAML_NODE_KINDS = [\n 'scalar',\n 'sequence',\n 'mapping'\n];\n\nfunction compileStyleAliases(map) {\n var result = {};\n\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n\n return result;\n}\n\nfunction Type$1(tag, options) {\n options = options || {};\n\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new exception('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.options = options; // keep original options in case user wants to extend this type later\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () { return true; };\n this.construct = options['construct'] || function (data) { return data; };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.representName = options['representName'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.multi = options['multi'] || false;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new exception('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n}\n\nvar type = Type$1;\n\n/*eslint-disable max-len*/\n\n\n\n\n\nfunction compileList(schema, name) {\n var result = [];\n\n schema[name].forEach(function (currentType) {\n var newIndex = result.length;\n\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag &&\n previousType.kind === currentType.kind &&\n previousType.multi === currentType.multi) {\n\n newIndex = previousIndex;\n }\n });\n\n result[newIndex] = currentType;\n });\n\n return result;\n}\n\n\nfunction compileMap(/* lists... */) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {},\n multi: {\n scalar: [],\n sequence: [],\n mapping: [],\n fallback: []\n }\n }, index, length;\n\n function collectType(type) {\n if (type.multi) {\n result.multi[type.kind].push(type);\n result.multi['fallback'].push(type);\n } else {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n }\n\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n}\n\n\nfunction Schema$1(definition) {\n return this.extend(definition);\n}\n\n\nSchema$1.prototype.extend = function extend(definition) {\n var implicit = [];\n var explicit = [];\n\n if (definition instanceof type) {\n // Schema.extend(type)\n explicit.push(definition);\n\n } else if (Array.isArray(definition)) {\n // Schema.extend([ type1, type2, ... ])\n explicit = explicit.concat(definition);\n\n } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {\n // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })\n if (definition.implicit) implicit = implicit.concat(definition.implicit);\n if (definition.explicit) explicit = explicit.concat(definition.explicit);\n\n } else {\n throw new exception('Schema.extend argument should be a Type, [ Type ], ' +\n 'or a schema definition ({ implicit: [...], explicit: [...] })');\n }\n\n implicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n\n if (type$1.loadKind && type$1.loadKind !== 'scalar') {\n throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n\n if (type$1.multi) {\n throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');\n }\n });\n\n explicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n });\n\n var result = Object.create(Schema$1.prototype);\n\n result.implicit = (this.implicit || []).concat(implicit);\n result.explicit = (this.explicit || []).concat(explicit);\n\n result.compiledImplicit = compileList(result, 'implicit');\n result.compiledExplicit = compileList(result, 'explicit');\n result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit);\n\n return result;\n};\n\n\nvar schema = Schema$1;\n\nvar str = new type('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function (data) { return data !== null ? data : ''; }\n});\n\nvar seq = new type('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function (data) { return data !== null ? data : []; }\n});\n\nvar map = new type('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function (data) { return data !== null ? data : {}; }\n});\n\nvar failsafe = new schema({\n explicit: [\n str,\n seq,\n map\n ]\n});\n\nfunction resolveYamlNull(data) {\n if (data === null) return true;\n\n var max = data.length;\n\n return (max === 1 && data === '~') ||\n (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));\n}\n\nfunction constructYamlNull() {\n return null;\n}\n\nfunction isNull(object) {\n return object === null;\n}\n\nvar _null = new type('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function () { return '~'; },\n lowercase: function () { return 'null'; },\n uppercase: function () { return 'NULL'; },\n camelcase: function () { return 'Null'; },\n empty: function () { return ''; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction resolveYamlBoolean(data) {\n if (data === null) return false;\n\n var max = data.length;\n\n return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||\n (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));\n}\n\nfunction constructYamlBoolean(data) {\n return data === 'true' ||\n data === 'True' ||\n data === 'TRUE';\n}\n\nfunction isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n}\n\nvar bool = new type('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function (object) { return object ? 'true' : 'false'; },\n uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },\n camelcase: function (object) { return object ? 'True' : 'False'; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction isHexCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||\n ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||\n ((0x61/* a */ <= c) && (c <= 0x66/* f */));\n}\n\nfunction isOctCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));\n}\n\nfunction isDecCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));\n}\n\nfunction resolveYamlInteger(data) {\n if (data === null) return false;\n\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n\n if (!max) return false;\n\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'x') {\n // base 16\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'o') {\n // base 8\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n }\n\n // base 10 (except 0)\n\n // value should not start with `_`;\n if (ch === '_') return false;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n return true;\n}\n\nfunction constructYamlInteger(data) {\n var value = data, sign = 1, ch;\n\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n\n ch = value[0];\n\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n\n if (value === '0') return 0;\n\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);\n if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);\n }\n\n return sign * parseInt(value, 10);\n}\n\nfunction isInteger(object) {\n return (Object.prototype.toString.call(object)) === '[object Number]' &&\n (object % 1 === 0 && !common.isNegativeZero(object));\n}\n\nvar int = new type('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },\n octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); },\n decimal: function (obj) { return obj.toString(10); },\n /* eslint-disable max-len */\n hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [ 2, 'bin' ],\n octal: [ 8, 'oct' ],\n decimal: [ 10, 'dec' ],\n hexadecimal: [ 16, 'hex' ]\n }\n});\n\nvar YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n\nfunction resolveYamlFloat(data) {\n if (data === null) return false;\n\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n\n return true;\n}\n\nfunction constructYamlFloat(data) {\n var value, sign;\n\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n\n if (value === '.inf') {\n return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\n } else if (value === '.nan') {\n return NaN;\n }\n return sign * parseFloat(value, 10);\n}\n\n\nvar SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n\nfunction representYamlFloat(object, style) {\n var res;\n\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase': return '.nan';\n case 'uppercase': return '.NAN';\n case 'camelcase': return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '.inf';\n case 'uppercase': return '.INF';\n case 'camelcase': return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '-.inf';\n case 'uppercase': return '-.INF';\n case 'camelcase': return '-.Inf';\n }\n } else if (common.isNegativeZero(object)) {\n return '-0.0';\n }\n\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n}\n\nfunction isFloat(object) {\n return (Object.prototype.toString.call(object) === '[object Number]') &&\n (object % 1 !== 0 || common.isNegativeZero(object));\n}\n\nvar float = new type('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n});\n\nvar json = failsafe.extend({\n implicit: [\n _null,\n bool,\n int,\n float\n ]\n});\n\nvar core = json;\n\nvar YAML_DATE_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9])' + // [2] month\n '-([0-9][0-9])$'); // [3] day\n\nvar YAML_TIMESTAMP_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9]?)' + // [2] month\n '-([0-9][0-9]?)' + // [3] day\n '(?:[Tt]|[ \\\\t]+)' + // ...\n '([0-9][0-9]?)' + // [4] hour\n ':([0-9][0-9])' + // [5] minute\n ':([0-9][0-9])' + // [6] second\n '(?:\\\\.([0-9]*))?' + // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\nfunction resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n}\n\nfunction constructYamlTimestamp(data) {\n var match, year, month, day, hour, minute, second, fraction = 0,\n delta = null, tz_hour, tz_minute, date;\n\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +(match[1]);\n month = +(match[2]) - 1; // JS month starts with 0\n day = +(match[3]);\n\n if (!match[4]) { // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +(match[4]);\n minute = +(match[5]);\n second = +(match[6]);\n\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) { // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +(match[10]);\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\n if (delta) date.setTime(date.getTime() - delta);\n\n return date;\n}\n\nfunction representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n}\n\nvar timestamp = new type('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n});\n\nfunction resolveYamlMerge(data) {\n return data === '<<' || data === null;\n}\n\nvar merge = new type('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n});\n\n/*eslint-disable no-bitwise*/\n\n\n\n\n\n// [ 64, 65, 66 ] -> [ padding, CR, LF ]\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n\n\nfunction resolveYamlBinary(data) {\n if (data === null) return false;\n\n var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return (bitlen % 8) === 0;\n}\n\nfunction constructYamlBinary(data) {\n var idx, tailbits,\n input = data.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n }\n\n bits = (bits << 6) | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = (max % 4) * 6;\n\n if (tailbits === 0) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push((bits >> 10) & 0xFF);\n result.push((bits >> 2) & 0xFF);\n } else if (tailbits === 12) {\n result.push((bits >> 4) & 0xFF);\n }\n\n return new Uint8Array(result);\n}\n\nfunction representYamlBinary(object /*, style*/) {\n var result = '', bits = 0, idx, tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 3 === 0) && idx) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n }\n\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n\n if (tail === 0) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[(bits >> 10) & 0x3F];\n result += map[(bits >> 4) & 0x3F];\n result += map[(bits << 2) & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[(bits >> 2) & 0x3F];\n result += map[(bits << 4) & 0x3F];\n result += map[64];\n result += map[64];\n }\n\n return result;\n}\n\nfunction isBinary(obj) {\n return Object.prototype.toString.call(obj) === '[object Uint8Array]';\n}\n\nvar binary = new type('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n});\n\nvar _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\nvar _toString$2 = Object.prototype.toString;\n\nfunction resolveYamlOmap(data) {\n if (data === null) return true;\n\n var objectKeys = [], index, length, pair, pairKey, pairHasKey,\n object = data;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n\n if (_toString$2.call(pair) !== '[object Object]') return false;\n\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;\n else return false;\n }\n }\n\n if (!pairHasKey) return false;\n\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);\n else return false;\n }\n\n return true;\n}\n\nfunction constructYamlOmap(data) {\n return data !== null ? data : [];\n}\n\nvar omap = new type('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n});\n\nvar _toString$1 = Object.prototype.toString;\n\nfunction resolveYamlPairs(data) {\n if (data === null) return true;\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n if (_toString$1.call(pair) !== '[object Object]') return false;\n\n keys = Object.keys(pair);\n\n if (keys.length !== 1) return false;\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return true;\n}\n\nfunction constructYamlPairs(data) {\n if (data === null) return [];\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n keys = Object.keys(pair);\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return result;\n}\n\nvar pairs = new type('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n});\n\nvar _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n\nfunction resolveYamlSet(data) {\n if (data === null) return true;\n\n var key, object = data;\n\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n\n return true;\n}\n\nfunction constructYamlSet(data) {\n return data !== null ? data : {};\n}\n\nvar set = new type('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n});\n\nvar _default = core.extend({\n implicit: [\n timestamp,\n merge\n ],\n explicit: [\n binary,\n omap,\n pairs,\n set\n ]\n});\n\n/*eslint-disable max-len,no-use-before-define*/\n\n\n\n\n\n\n\nvar _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n\nvar CONTEXT_FLOW_IN = 1;\nvar CONTEXT_FLOW_OUT = 2;\nvar CONTEXT_BLOCK_IN = 3;\nvar CONTEXT_BLOCK_OUT = 4;\n\n\nvar CHOMPING_CLIP = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP = 3;\n\n\nvar PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\nvar PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\nvar PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\nvar PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction is_EOL(c) {\n return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);\n}\n\nfunction is_WHITE_SPACE(c) {\n return (c === 0x09/* Tab */) || (c === 0x20/* Space */);\n}\n\nfunction is_WS_OR_EOL(c) {\n return (c === 0x09/* Tab */) ||\n (c === 0x20/* Space */) ||\n (c === 0x0A/* LF */) ||\n (c === 0x0D/* CR */);\n}\n\nfunction is_FLOW_INDICATOR(c) {\n return c === 0x2C/* , */ ||\n c === 0x5B/* [ */ ||\n c === 0x5D/* ] */ ||\n c === 0x7B/* { */ ||\n c === 0x7D/* } */;\n}\n\nfunction fromHexCode(c) {\n var lc;\n\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n\n if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {\n return lc - 0x61 + 10;\n }\n\n return -1;\n}\n\nfunction escapedHexLen(c) {\n if (c === 0x78/* x */) { return 2; }\n if (c === 0x75/* u */) { return 4; }\n if (c === 0x55/* U */) { return 8; }\n return 0;\n}\n\nfunction fromDecimalCode(c) {\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n return -1;\n}\n\nfunction simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return (c === 0x30/* 0 */) ? '\\x00' :\n (c === 0x61/* a */) ? '\\x07' :\n (c === 0x62/* b */) ? '\\x08' :\n (c === 0x74/* t */) ? '\\x09' :\n (c === 0x09/* Tab */) ? '\\x09' :\n (c === 0x6E/* n */) ? '\\x0A' :\n (c === 0x76/* v */) ? '\\x0B' :\n (c === 0x66/* f */) ? '\\x0C' :\n (c === 0x72/* r */) ? '\\x0D' :\n (c === 0x65/* e */) ? '\\x1B' :\n (c === 0x20/* Space */) ? ' ' :\n (c === 0x22/* \" */) ? '\\x22' :\n (c === 0x2F/* / */) ? '/' :\n (c === 0x5C/* \\ */) ? '\\x5C' :\n (c === 0x4E/* N */) ? '\\x85' :\n (c === 0x5F/* _ */) ? '\\xA0' :\n (c === 0x4C/* L */) ? '\\u2028' :\n (c === 0x50/* P */) ? '\\u2029' : '';\n}\n\nfunction charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode(\n ((c - 0x010000) >> 10) + 0xD800,\n ((c - 0x010000) & 0x03FF) + 0xDC00\n );\n}\n\n// set a property of a literal object, while protecting against prototype pollution,\n// see https://github.com/nodeca/js-yaml/issues/164 for more details\nfunction setProperty(object, key, value) {\n // used for this specific key only because Object.defineProperty is slow\n if (key === '__proto__') {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: value\n });\n } else {\n object[key] = value;\n }\n}\n\nvar simpleEscapeCheck = new Array(256); // integer, for fast access\nvar simpleEscapeMap = new Array(256);\nfor (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n}\n\n\nfunction State$1(input, options) {\n this.input = input;\n\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || _default;\n this.onWarning = options['onWarning'] || null;\n // (Hidden) Remove? makes the loader to expect YAML 1.1 documents\n // if such documents have no explicit %YAML directive\n this.legacy = options['legacy'] || false;\n\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n\n // position of first leading tab in the current line,\n // used to make sure there are no tabs in the indentation\n this.firstTabInLine = -1;\n\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n\n}\n\n\nfunction generateError(state, message) {\n var mark = {\n name: state.filename,\n buffer: state.input.slice(0, -1), // omit trailing \\0\n position: state.position,\n line: state.line,\n column: state.position - state.lineStart\n };\n\n mark.snippet = snippet(mark);\n\n return new exception(message, mark);\n}\n\nfunction throwError(state, message) {\n throw generateError(state, message);\n}\n\nfunction throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n}\n\n\nvar directiveHandlers = {\n\n YAML: function handleYamlDirective(state, name, args) {\n\n var match, major, minor;\n\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n\n state.version = args[0];\n state.checkLineBreaks = (minor < 2);\n\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n\n TAG: function handleTagDirective(state, name, args) {\n\n var handle, prefix;\n\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n\n handle = args[0];\n prefix = args[1];\n\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n\n try {\n prefix = decodeURIComponent(prefix);\n } catch (err) {\n throwError(state, 'tag prefix is malformed: ' + prefix);\n }\n\n state.tagMap[handle] = prefix;\n }\n};\n\n\nfunction captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n\n if (start < end) {\n _result = state.input.slice(start, end);\n\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 ||\n (0x20 <= _character && _character <= 0x10FFFF))) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n\n state.result += _result;\n }\n}\n\nfunction mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n\n if (!common.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n\n sourceKeys = Object.keys(source);\n\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n\n if (!_hasOwnProperty$1.call(destination, key)) {\n setProperty(destination, key, source[key]);\n overridableKeys[key] = true;\n }\n }\n}\n\nfunction storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,\n startLine, startLineStart, startPos) {\n\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n\n\n keyNode = String(keyNode);\n\n if (_result === null) {\n _result = {};\n }\n\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json &&\n !_hasOwnProperty$1.call(overridableKeys, keyNode) &&\n _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.lineStart = startLineStart || state.lineStart;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n\n setProperty(_result, keyNode, valueNode);\n delete overridableKeys[keyNode];\n }\n\n return _result;\n}\n\nfunction readLineBreak(state) {\n var ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x0A/* LF */) {\n state.position++;\n } else if (ch === 0x0D/* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n\n state.line += 1;\n state.lineStart = state.position;\n state.firstTabInLine = -1;\n}\n\nfunction skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {\n state.firstTabInLine = state.position;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (allowComments && ch === 0x23/* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);\n }\n\n if (is_EOL(ch)) {\n readLineBreak(state);\n\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n\n while (ch === 0x20/* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n\n return lineBreaks;\n}\n\nfunction testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n ch === state.input.charCodeAt(_position + 1) &&\n ch === state.input.charCodeAt(_position + 2)) {\n\n _position += 3;\n\n ch = state.input.charCodeAt(_position);\n\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common.repeat('\\n', count - 1);\n }\n}\n\n\nfunction readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (is_WS_OR_EOL(ch) ||\n is_FLOW_INDICATOR(ch) ||\n ch === 0x23/* # */ ||\n ch === 0x26/* & */ ||\n ch === 0x2A/* * */ ||\n ch === 0x21/* ! */ ||\n ch === 0x7C/* | */ ||\n ch === 0x3E/* > */ ||\n ch === 0x27/* ' */ ||\n ch === 0x22/* \" */ ||\n ch === 0x25/* % */ ||\n ch === 0x40/* @ */ ||\n ch === 0x60/* ` */) {\n return false;\n }\n\n if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n\n while (ch !== 0) {\n if (ch === 0x3A/* : */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n\n } else if (ch === 0x23/* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n\n } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||\n withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, captureEnd, false);\n\n if (state.result) {\n return true;\n }\n\n state.kind = _kind;\n state.result = _result;\n return false;\n}\n\nfunction readSingleQuotedScalar(state, nodeIndent) {\n var ch,\n captureStart, captureEnd;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x27/* ' */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27/* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x27/* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n}\n\nfunction readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart,\n captureEnd,\n hexLength,\n hexResult,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x22/* \" */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22/* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n\n } else if (ch === 0x5C/* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n\n state.result += charFromCodepoint(hexResult);\n\n state.position++;\n\n } else {\n throwError(state, 'unknown escape sequence');\n }\n\n captureStart = captureEnd = state.position;\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n}\n\nfunction readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _lineStart,\n _pos,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = Object.create(null),\n keyNode,\n keyTag,\n valueNode,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x5B/* [ */) {\n terminator = 0x5D;/* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B/* { */) {\n terminator = 0x7D;/* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n } else if (ch === 0x2C/* , */) {\n // \"flow collection entries can never be completely empty\", as per YAML 1.2, section 7.4\n throwError(state, \"expected the node content, but found ','\");\n }\n\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n\n if (ch === 0x3F/* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n\n _line = state.line; // Save the current line.\n _lineStart = state.lineStart;\n _pos = state.position;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));\n } else {\n _result.push(keyNode);\n }\n\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x2C/* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a flow collection');\n}\n\nfunction readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x7C/* | */) {\n folding = false;\n } else if (ch === 0x3E/* > */) {\n folding = true;\n } else {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n\n } else {\n break;\n }\n }\n\n if (is_WHITE_SPACE(ch)) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (is_WHITE_SPACE(ch));\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (!is_EOL(ch) && (ch !== 0));\n }\n }\n\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n\n ch = state.input.charCodeAt(state.position);\n\n while ((!detectedIndent || state.lineIndent < textIndent) &&\n (ch === 0x20/* Space */)) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) { // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) { // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n\n while (!is_EOL(ch) && (ch !== 0)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, state.position, false);\n }\n\n return true;\n}\n\nfunction readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n if (ch !== 0x2D/* - */) {\n break;\n }\n\n following = state.input.charCodeAt(state.position + 1);\n\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n\n detected = true;\n state.position++;\n\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n}\n\nfunction readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _keyLine,\n _keyLineStart,\n _keyPos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = Object.create(null),\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (!atExplicitKey && state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {\n\n if (ch === 0x3F/* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n\n if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n // Neither implicit nor explicit notation.\n // Reading is done. Go to the epilogue.\n break;\n }\n\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x3A/* : */) {\n ch = state.input.charCodeAt(++state.position);\n\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (atExplicitKey) {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n }\n\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n\n return detected;\n}\n\nfunction readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x21/* ! */) return false;\n\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x3C/* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n\n } else if (ch === 0x21/* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n\n } else {\n tagHandle = '!';\n }\n\n _position = state.position;\n\n if (isVerbatim) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && ch !== 0x3E/* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n\n if (ch === 0x21/* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n tagName = state.input.slice(_position, state.position);\n\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n\n try {\n tagName = decodeURIComponent(tagName);\n } catch (err) {\n throwError(state, 'tag name is malformed: ' + tagName);\n }\n\n if (isVerbatim) {\n state.tag = tagName;\n\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n\n return true;\n}\n\nfunction readAnchorProperty(state) {\n var _position,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x26/* & */) return false;\n\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n\n state.anchor = state.input.slice(_position, state.position);\n return true;\n}\n\nfunction readAlias(state) {\n var _position, alias,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x2A/* * */) return false;\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n\n alias = state.input.slice(_position, state.position);\n\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n}\n\nfunction composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent\n atNewLine = false,\n hasContent = false,\n typeIndex,\n typeQuantity,\n typeList,\n type,\n flowIndent,\n blockIndent;\n\n if (state.listener !== null) {\n state.listener('open', state);\n }\n\n state.tag = null;\n state.anchor = null;\n state.kind = null;\n state.result = null;\n\n allowBlockStyles = allowBlockScalars = allowBlockCollections =\n CONTEXT_BLOCK_OUT === nodeContext ||\n CONTEXT_BLOCK_IN === nodeContext;\n\n if (allowToSeek) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n\n blockIndent = state.position - state.lineStart;\n\n if (indentStatus === 1) {\n if (allowBlockCollections &&\n (readBlockSequence(state, blockIndent) ||\n readBlockMapping(state, blockIndent, flowIndent)) ||\n readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||\n readSingleQuotedScalar(state, flowIndent) ||\n readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n\n } else if (readAlias(state)) {\n hasContent = true;\n\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n\n if (state.tag === null) {\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n\n } else if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"!<?> [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for !<?> tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n\n if (type.resolve(state.result)) { // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (state.tag !== '!') {\n if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n } else {\n // looking for multi type\n type = null;\n typeList = state.typeMap.multi[state.kind || 'fallback'];\n\n for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {\n if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {\n type = typeList[typeIndex];\n break;\n }\n }\n }\n\n if (!type) {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n\n if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result, state.tag);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n }\n\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n}\n\nfunction readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = Object.create(null);\n state.anchorMap = Object.create(null);\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if (state.lineIndent > 0 || ch !== 0x25/* % */) {\n break;\n }\n\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && !is_EOL(ch));\n break;\n }\n\n if (is_EOL(ch)) break;\n\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n\n if (ch !== 0) readLineBreak(state);\n\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n\n skipSeparationSpace(state, true, -1);\n\n if (state.lineIndent === 0 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n\n if (state.checkLineBreaks &&\n PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n\n state.documents.push(state.result);\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n\n if (state.input.charCodeAt(state.position) === 0x2E/* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n\n if (state.position < (state.length - 1)) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n}\n\n\nfunction loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n\n if (input.length !== 0) {\n\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&\n input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n\n var state = new State$1(input, options);\n\n var nullpos = input.indexOf('\\0');\n\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n\n while (state.input.charCodeAt(state.position) === 0x20/* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n\n while (state.position < (state.length - 1)) {\n readDocument(state);\n }\n\n return state.documents;\n}\n\n\nfunction loadAll$1(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n\n var documents = loadDocuments(input, options);\n\n if (typeof iterator !== 'function') {\n return documents;\n }\n\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n}\n\n\nfunction load$1(input, options) {\n var documents = loadDocuments(input, options);\n\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new exception('expected a single document in the stream, but found more');\n}\n\n\nvar loadAll_1 = loadAll$1;\nvar load_1 = load$1;\n\nvar loader = {\n\tloadAll: loadAll_1,\n\tload: load_1\n};\n\n/*eslint-disable no-use-before-define*/\n\n\n\n\n\nvar _toString = Object.prototype.toString;\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar CHAR_BOM = 0xFEFF;\nvar CHAR_TAB = 0x09; /* Tab */\nvar CHAR_LINE_FEED = 0x0A; /* LF */\nvar CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\nvar CHAR_SPACE = 0x20; /* Space */\nvar CHAR_EXCLAMATION = 0x21; /* ! */\nvar CHAR_DOUBLE_QUOTE = 0x22; /* \" */\nvar CHAR_SHARP = 0x23; /* # */\nvar CHAR_PERCENT = 0x25; /* % */\nvar CHAR_AMPERSAND = 0x26; /* & */\nvar CHAR_SINGLE_QUOTE = 0x27; /* ' */\nvar CHAR_ASTERISK = 0x2A; /* * */\nvar CHAR_COMMA = 0x2C; /* , */\nvar CHAR_MINUS = 0x2D; /* - */\nvar CHAR_COLON = 0x3A; /* : */\nvar CHAR_EQUALS = 0x3D; /* = */\nvar CHAR_GREATER_THAN = 0x3E; /* > */\nvar CHAR_QUESTION = 0x3F; /* ? */\nvar CHAR_COMMERCIAL_AT = 0x40; /* @ */\nvar CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\nvar CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\nvar CHAR_GRAVE_ACCENT = 0x60; /* ` */\nvar CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\nvar CHAR_VERTICAL_LINE = 0x7C; /* | */\nvar CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\nvar ESCAPE_SEQUENCES = {};\n\nESCAPE_SEQUENCES[0x00] = '\\\\0';\nESCAPE_SEQUENCES[0x07] = '\\\\a';\nESCAPE_SEQUENCES[0x08] = '\\\\b';\nESCAPE_SEQUENCES[0x09] = '\\\\t';\nESCAPE_SEQUENCES[0x0A] = '\\\\n';\nESCAPE_SEQUENCES[0x0B] = '\\\\v';\nESCAPE_SEQUENCES[0x0C] = '\\\\f';\nESCAPE_SEQUENCES[0x0D] = '\\\\r';\nESCAPE_SEQUENCES[0x1B] = '\\\\e';\nESCAPE_SEQUENCES[0x22] = '\\\\\"';\nESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\nESCAPE_SEQUENCES[0x85] = '\\\\N';\nESCAPE_SEQUENCES[0xA0] = '\\\\_';\nESCAPE_SEQUENCES[0x2028] = '\\\\L';\nESCAPE_SEQUENCES[0x2029] = '\\\\P';\n\nvar DEPRECATED_BOOLEANS_SYNTAX = [\n 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',\n 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'\n];\n\nvar DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;\n\nfunction compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n\n if (map === null) return {};\n\n result = {};\n keys = Object.keys(map);\n\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n\n result[tag] = style;\n }\n\n return result;\n}\n\nfunction encodeHex(character) {\n var string, handle, length;\n\n string = character.toString(16).toUpperCase();\n\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new exception('code point within a string may not be greater than 0xFFFFFFFF');\n }\n\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n}\n\n\nvar QUOTING_TYPE_SINGLE = 1,\n QUOTING_TYPE_DOUBLE = 2;\n\nfunction State(options) {\n this.schema = options['schema'] || _default;\n this.indent = Math.max(1, (options['indent'] || 2));\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.quotingType = options['quotingType'] === '\"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;\n this.forceQuotes = options['forceQuotes'] || false;\n this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n\n this.tag = null;\n this.result = '';\n\n this.duplicates = [];\n this.usedDuplicates = null;\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n\n if (line.length && line !== '\\n') result += ind;\n\n result += line;\n }\n\n return result;\n}\n\nfunction generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n}\n\nfunction testImplicitResolving(state, str) {\n var index, length, type;\n\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n\n if (type.resolve(str)) {\n return true;\n }\n }\n\n return false;\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn\u2019t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable(c) {\n return (0x00020 <= c && c <= 0x00007E)\n || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)\n || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)\n || (0x10000 <= c && c <= 0x10FFFF);\n}\n\n// [34] ns-char ::= nb-char - s-white\n// [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n// [26] b-char ::= b-line-feed | b-carriage-return\n// Including s-white (for some reason, examples doesn't match specs in this aspect)\n// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark\nfunction isNsCharOrWhitespace(c) {\n return isPrintable(c)\n && c !== CHAR_BOM\n // - b-char\n && c !== CHAR_CARRIAGE_RETURN\n && c !== CHAR_LINE_FEED;\n}\n\n// [127] ns-plain-safe(c) ::= c = flow-out \u21D2 ns-plain-safe-out\n// c = flow-in \u21D2 ns-plain-safe-in\n// c = block-key \u21D2 ns-plain-safe-out\n// c = flow-key \u21D2 ns-plain-safe-in\n// [128] ns-plain-safe-out ::= ns-char\n// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator\n// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - \u201C:\u201D - \u201C#\u201D )\n// | ( /* An ns-char preceding */ \u201C#\u201D )\n// | ( \u201C:\u201D /* Followed by an ns-plain-safe(c) */ )\nfunction isPlainSafe(c, prev, inblock) {\n var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);\n var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);\n return (\n // ns-plain-safe\n inblock ? // c = flow-in\n cIsNsCharOrWhitespace\n : cIsNsCharOrWhitespace\n // - c-flow-indicator\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n )\n // ns-plain-char\n && c !== CHAR_SHARP // false on '#'\n && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '\n || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'\n || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n // No support of ( ( \u201C?\u201D | \u201C:\u201D | \u201C-\u201D ) /* Followed by an ns-plain-safe(c)) */ ) part\n return isPrintable(c) && c !== CHAR_BOM\n && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // \u201C-\u201D | \u201C?\u201D | \u201C:\u201D | \u201C,\u201D | \u201C[\u201D | \u201C]\u201D | \u201C{\u201D | \u201C}\u201D\n && c !== CHAR_MINUS\n && c !== CHAR_QUESTION\n && c !== CHAR_COLON\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n // | \u201C#\u201D | \u201C&\u201D | \u201C*\u201D | \u201C!\u201D | \u201C|\u201D | \u201C=\u201D | \u201C>\u201D | \u201C'\u201D | \u201C\"\u201D\n && c !== CHAR_SHARP\n && c !== CHAR_AMPERSAND\n && c !== CHAR_ASTERISK\n && c !== CHAR_EXCLAMATION\n && c !== CHAR_VERTICAL_LINE\n && c !== CHAR_EQUALS\n && c !== CHAR_GREATER_THAN\n && c !== CHAR_SINGLE_QUOTE\n && c !== CHAR_DOUBLE_QUOTE\n // | \u201C%\u201D | \u201C@\u201D | \u201C`\u201D)\n && c !== CHAR_PERCENT\n && c !== CHAR_COMMERCIAL_AT\n && c !== CHAR_GRAVE_ACCENT;\n}\n\n// Simplified test for values allowed as the last character in plain style.\nfunction isPlainSafeLast(c) {\n // just not whitespace or colon, it will be checked to be plain character later\n return !isWhitespace(c) && c !== CHAR_COLON;\n}\n\n// Same as 'string'.codePointAt(pos), but works in older browsers.\nfunction codePointAt(string, pos) {\n var first = string.charCodeAt(pos), second;\n if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {\n second = string.charCodeAt(pos + 1);\n if (second >= 0xDC00 && second <= 0xDFFF) {\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n return first;\n}\n\n// Determines whether block indentation indicator is required.\nfunction needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n}\n\nvar STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n// STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,\n testAmbiguousType, quotingType, forceQuotes, inblock) {\n\n var i;\n var char = 0;\n var prevChar = null;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(codePointAt(string, 0))\n && isPlainSafeLast(codePointAt(string, string.length - 1));\n\n if (singleLineOnly || forceQuotes) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' ');\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' '));\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n if (plain && !forceQuotes && !testAmbiguousType(string)) {\n return STYLE_PLAIN;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n if (!forceQuotes) {\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n}\n\n// Note: line breaking/folding is implemented for only the folded style.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n// since the dumper adds its own newline. This always works:\n// \u2022 No ending newline => unaffected; already using strip \"-\" chomping.\n// \u2022 Ending newline => removed then restored.\n// Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction writeScalar(state, string, level, iskey, inblock) {\n state.dump = (function () {\n if (string.length === 0) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? '\"\"' : \"''\";\n }\n if (!state.noCompatMode) {\n if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? ('\"' + string + '\"') : (\"'\" + string + \"'\");\n }\n }\n\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth \u2264 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1\n ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || (state.flowLevel > -1 && level >= state.flowLevel);\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,\n testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {\n\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new exception('impossible error: invalid scalar style');\n }\n }());\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : (clip ? '' : '-');\n\n return indentIndicator + chomp + '\\n';\n}\n\n// (See the note for writeScalar.)\nfunction dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines\u2014\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = (function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }());\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while ((match = lineRe.exec(string))) {\n var prefix = match[1], line = match[2];\n moreIndented = (line[0] === ' ');\n result += prefix\n + (!prevMoreIndented && !moreIndented && line !== ''\n ? '\\n' : '')\n + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n\n return result;\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0, end, curr = 0, next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while ((match = breakRe.exec(line))) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = (curr > start) ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n\n return result.slice(1); // drop extra \\n joiner\n}\n\n// Escapes a double-quoted string.\nfunction escapeString(string) {\n var result = '';\n var char = 0;\n var escapeSeq;\n\n for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n escapeSeq = ESCAPE_SEQUENCES[char];\n\n if (!escapeSeq && isPrintable(char)) {\n result += string[i];\n if (char >= 0x10000) result += string[i + 1];\n } else {\n result += escapeSeq || encodeHex(char);\n }\n }\n\n return result;\n}\n\nfunction writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level, value, false, false) ||\n (typeof value === 'undefined' &&\n writeNode(state, level, null, false, false))) {\n\n if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n}\n\nfunction writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level + 1, value, true, true, false, true) ||\n (typeof value === 'undefined' &&\n writeNode(state, level + 1, null, true, true, false, true))) {\n\n if (!compact || _result !== '') {\n _result += generateNextLine(state, level);\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n}\n\nfunction writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n\n pairBuffer = '';\n if (_result !== '') pairBuffer += ', ';\n\n if (state.condenseFlow) pairBuffer += '\"';\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n}\n\nfunction writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new exception('sortKeys must be a boolean or a function');\n }\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n\n if (!compact || _result !== '') {\n pairBuffer += generateNextLine(state, level);\n }\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = (state.tag !== null && state.tag !== '?') ||\n (state.dump && state.dump.length > 1024);\n\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n\n pairBuffer += state.dump;\n\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n}\n\nfunction detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n\n if ((type.instanceOf || type.predicate) &&\n (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&\n (!type.predicate || type.predicate(object))) {\n\n if (explicit) {\n if (type.multi && type.representName) {\n state.tag = type.representName(object);\n } else {\n state.tag = type.tag;\n }\n } else {\n state.tag = '?';\n }\n\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new exception('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n\n state.dump = _result;\n }\n\n return true;\n }\n }\n\n return false;\n}\n\n// Serializes `object` and writes it to global `result`.\n// Returns true on success, or false on invalid object.\n//\nfunction writeNode(state, level, object, block, compact, iskey, isblockseq) {\n state.tag = null;\n state.dump = object;\n\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n\n var type = _toString.call(state.dump);\n var inblock = block;\n var tagStr;\n\n if (block) {\n block = (state.flowLevel < 0 || state.flowLevel > level);\n }\n\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n\n if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {\n compact = false;\n }\n\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && (Object.keys(state.dump).length !== 0)) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n if (block && (state.dump.length !== 0)) {\n if (state.noArrayIndent && !isblockseq && level > 0) {\n writeBlockSequence(state, level - 1, state.dump, compact);\n } else {\n writeBlockSequence(state, level, state.dump, compact);\n }\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey, inblock);\n }\n } else if (type === '[object Undefined]') {\n return false;\n } else {\n if (state.skipInvalid) return false;\n throw new exception('unacceptable kind of an object to dump ' + type);\n }\n\n if (state.tag !== null && state.tag !== '?') {\n // Need to encode all characters except those allowed by the spec:\n //\n // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */\n // [36] ns-hex-digit ::= ns-dec-digit\n // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */\n // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */\n // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | \u201C-\u201D\n // [39] ns-uri-char ::= \u201C%\u201D ns-hex-digit ns-hex-digit | ns-word-char | \u201C#\u201D\n // | \u201C;\u201D | \u201C/\u201D | \u201C?\u201D | \u201C:\u201D | \u201C@\u201D | \u201C&\u201D | \u201C=\u201D | \u201C+\u201D | \u201C$\u201D | \u201C,\u201D\n // | \u201C_\u201D | \u201C.\u201D | \u201C!\u201D | \u201C~\u201D | \u201C*\u201D | \u201C'\u201D | \u201C(\u201D | \u201C)\u201D | \u201C[\u201D | \u201C]\u201D\n //\n // Also need to encode '!' because it has special meaning (end of tag prefix).\n //\n tagStr = encodeURI(\n state.tag[0] === '!' ? state.tag.slice(1) : state.tag\n ).replace(/!/g, '%21');\n\n if (state.tag[0] === '!') {\n tagStr = '!' + tagStr;\n } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {\n tagStr = '!!' + tagStr.slice(18);\n } else {\n tagStr = '!<' + tagStr + '>';\n }\n\n state.dump = tagStr + ' ' + state.dump;\n }\n }\n\n return true;\n}\n\nfunction getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n\n inspectNode(object, objects, duplicatesIndexes);\n\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n}\n\nfunction inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList,\n index,\n length;\n\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n}\n\nfunction dump$1(input, options) {\n options = options || {};\n\n var state = new State(options);\n\n if (!state.noRefs) getDuplicateReferences(input, state);\n\n var value = input;\n\n if (state.replacer) {\n value = state.replacer.call({ '': value }, '', value);\n }\n\n if (writeNode(state, 0, value, true, true)) return state.dump + '\\n';\n\n return '';\n}\n\nvar dump_1 = dump$1;\n\nvar dumper = {\n\tdump: dump_1\n};\n\nfunction renamed(from, to) {\n return function () {\n throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +\n 'Use yaml.' + to + ' instead, which is now safe by default.');\n };\n}\n\n\nvar Type = type;\nvar Schema = schema;\nvar FAILSAFE_SCHEMA = failsafe;\nvar JSON_SCHEMA = json;\nvar CORE_SCHEMA = core;\nvar DEFAULT_SCHEMA = _default;\nvar load = loader.load;\nvar loadAll = loader.loadAll;\nvar dump = dumper.dump;\nvar YAMLException = exception;\n\n// Re-export all types in case user wants to create custom schema\nvar types = {\n binary: binary,\n float: float,\n map: map,\n null: _null,\n pairs: pairs,\n set: set,\n timestamp: timestamp,\n bool: bool,\n int: int,\n merge: merge,\n omap: omap,\n seq: seq,\n str: str\n};\n\n// Removed functions from JS-YAML 3.0.x\nvar safeLoad = renamed('safeLoad', 'load');\nvar safeLoadAll = renamed('safeLoadAll', 'loadAll');\nvar safeDump = renamed('safeDump', 'dump');\n\nvar jsYaml = {\n\tType: Type,\n\tSchema: Schema,\n\tFAILSAFE_SCHEMA: FAILSAFE_SCHEMA,\n\tJSON_SCHEMA: JSON_SCHEMA,\n\tCORE_SCHEMA: CORE_SCHEMA,\n\tDEFAULT_SCHEMA: DEFAULT_SCHEMA,\n\tload: load,\n\tloadAll: loadAll,\n\tdump: dump,\n\tYAMLException: YAMLException,\n\ttypes: types,\n\tsafeLoad: safeLoad,\n\tsafeLoadAll: safeLoadAll,\n\tsafeDump: safeDump\n};\n\nexport { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, jsYaml as default, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types };\n", "import fs from \"fs-extra\"\nimport path from \"path\"\nimport { extname, resolve, join } from \"path\"\nimport yaml from \"js-yaml\"\nimport { config as dotenv } from \"dotenv\"\nimport { mergeDeepRight } from \"ramda\"\nimport chokidar from \"chokidar\"\nimport { pathToFileURL } from \"url\"\n\nimport { RacletteConfig } from \"./types\"\nimport { Services } from \"./types\"\nimport { findExtension } from \"./file-system\"\nimport { pkg } from \"./builder\"\nimport { logger } from \"src/logger\"\n\nconst configExtensions = [ \"js\", \"mjs\", \"ts\", \"yaml\", \"yml\"];\n\nexport const env = async () : Promise<Record<string, string>> => {\n function parseEnvironmentValues (obj: any): any {\n if (typeof obj === \"string\") {\n // Parse boolean strings\n if (obj === \"true\") return true\n if (obj === \"false\") return false\n\n // Parse number strings (but only if they look like numbers)\n if (/^\\d+$/.test(obj)) {\n const num = Number(obj)\n if (!isNaN(num)) return num\n }\n\n // Parse float numbers\n if (/^\\d+\\.\\d+$/.test(obj)) {\n const num = Number(obj)\n if (!isNaN(num)) return num\n }\n\n return obj\n }\n\n if (Array.isArray(obj)) return obj.map((item) => parseEnvironmentValues(item))\n\n if (obj && typeof obj === \"object\") {\n const parsed: any = {}\n for (const [key, value] of Object.entries(obj))\n parsed[key] = parseEnvironmentValues(value)\n return parsed\n }\n return obj\n }\n const env = dotenv({ path: join(process.cwd(), \".env\") } ).parsed\n return parseEnvironmentValues(env)\n}\n\nconst dflt = path.join(path.dirname(pkg()), \"raclette.default.config.yaml\")\n\nexport const load = async ( src: string = dflt, env: Record<string, any> = {}) : Promise<RacletteConfig> => {\n const environment = process.env?.environment || \"development\"\n const envenv = { env: { [environment]: env } }\n const path = resolve(src)\n let cfg: RacletteConfig\n try {\n switch(extname(src)) {\n case \".*\": // search the first file with supported extension\n const base = src.slice(0,-1)\n cfg = await load(base + configExtensions.find( ext => fs.existsSync((base + ext)))); break;\n case \".yaml\": case \".yml\":\n cfg = yaml.load(fs.readFileSync(path, \"utf8\"), { filename: src } ) as RacletteConfig; break;\n case \".ts\": case \".mjs\": case \".js\":\n cfg = (await import(`${pathToFileURL(path).href}?t=${Date.now()}`)).default; break;\n default:\n // TODO: some search for different extensions\n throw new TypeError(`config.load() does not support ${src} file extension.`)\n }\n } catch(err:any) { throw new Error(`Failed to load config ${path}: ${err?.message}`) }\n\n return mergeDeepRight(cfg, envenv)\n}\n\nexport const parse = ( src = \"null\") : any => {\n // supports only yaml syntax, and doesn't force specific structure\n try { return yaml.load(src) }\n catch (err:any) { throw new Error(`Failed to parse config: ${err?.message}`) }\n}\n\n// merge listed configs left to right\nexport const merge = ( ...cfgs:RacletteConfig[] ): RacletteConfig => {\n let cfg = cfgs[0]\n for(const c of cfgs.slice(1)) cfg = mergeDeepRight(cfg, c)\n return cfg\n}\n\n// inside the service containers, only generated .js configs are used\nexport const generateServiceConfigs = async (\n config: RacletteConfig,\n racletteDir: string,\n ): Promise<void> => {\n logger.debug(\"Generating service configuration files...\")\n \n // Extract common/global attributes\n const globalConfig = {\n name: config.name,\n env: config.env,\n modules: config.modules,\n plugins: config.plugins,\n global: config.global,\n }\n for(const service of Services) {\n const dir = path.join(racletteDir, service)\n fs.ensureDirSync(dir)\n const cfg = { ...globalConfig, service: service, ...(config[service as keyof RacletteConfig]) }\n const CFG = `// Generated Raclette ${service} Configuration\n// This file is auto-generated, do not edit directly\n\nexport const racletteConfig = ${JSON.stringify(cfg, null, 2)};\n \nexport default racletteConfig;\n`\n fs.writeFileSync(path.join(dir, 'raclette.config.js'), CFG);\n } \n}\n\n// all other watchers are defined in vfs.ts\nexport const watchConfigFile = (\n appDir:string,\n env: Record<string,string>\n): (() => void) => {\n const configPath = findExtension(path.join(appDir, \"raclette.config\"))\n logger.progress(`\uD83D\uDD0D Watching for changes in original config: ${configPath}`)\n const watcher = chokidar.watch(configPath, {\n ignored: /(^|[/\\\\])\\../, // ignore dotfiles\n persistent: true\n })\n\n watcher.on(\"change\", async (changedPath) => {\n logger.progress(`\uD83D\uDCDD Original config file changed: ${changedPath}`)\n try {\n await load(configPath,env)\n // since no config merge happens here, no need to save resulting config\n } catch (error: any) {\n logger.error(\"Error reloading configuration: \" + error.message)\n }\n })\n\n // Return a function to stop watching\n return () => watcher.close()\n}\n", "import fs from \"fs-extra\"\nimport path from \"path\"\nimport { logger } from \"src/logger\"\n\n\n// finds the first file that matches any of the given extensions or throws\nexport const findExtension = ( base: string, exts: string[] = [\"js\", \"yaml\", \"yml\"] ): string => {\n for(const ext of exts) {\n const path = base + \".\" + ext\n if(fs.existsSync(path)) return path\n }\n throw new Error( `Could not find any of ${base + \"{\" + exts.join(\",\") + \"}\" }` )\n }\n\n // Ensure .raclette directory exists\n export const ensureRacletteDir = async (base: string = process.cwd()) => {\n const raclettePath = path.join(base, \".raclette\")\n await fs.ensureDir(raclettePath)\n return raclettePath\n }\n\n\n\nexport const findCorePackagePath = (base: string = process.cwd()): string => {\n\n const coreModule = require(\"../package.json\").name\n\n const possiblePaths = ( base.includes(\"node_modules\") ?\n [ [ base.match(/(.*node_modules)/)?.[1] || \"\", coreModule ],\n [ base, \"node_modules\", coreModule ],\n [ base, \"../../..\", coreModule ]\n ] :\n [ [ base, \"node_modules\", coreModule ],\n [ base, \"../..\", \"raclette\" ],\n [ base, \"../..\", coreModule ],\n [ base, \"../..\", \"core\" ],\n [ base, \"..\", \"raclette\" ],\n [ base, \"..\", coreModule ],\n [ base, \"..\", \"core\" ]\n ] ).map( p => path.resolve(...p, \"package.json\"))\n\n const pkgPath = possiblePaths.find( p => fs.readJsonSync(p, { throws: false } )?.name === coreModule )\n\n if(pkgPath) return pkgPath.slice(0,-\"package.json\".length)\n\n const msg = \"Could not determine core package path to set up VFS. Canceling...\"\n logger.error(msg)\n throw new Error( msg)\n}\n\nexport const findFiles = async (\n directory: string,\n patterns: string[],\n): Promise<string[]> => {\n const { globby } = await import(\"globby\")\n return globby(patterns, {\n cwd: directory,\n absolute: true,\n ignore: [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\"],\n })\n}\n\n/**\n * Utility function to copy a file if it exists\n */\nexport const copyFileIfExists = async (\n sourcePath: string,\n targetPath: string,\n): Promise<boolean> => {\n if (await fs.pathExists(sourcePath)) {\n await fs.ensureDir(path.dirname(targetPath))\n await fs.copy(sourcePath, targetPath)\n logger.debug(`\u2705 Copied ${path.basename(sourcePath)} to ${targetPath}`)\n return true\n } else {\n logger.warn(\n chalk.yellow(\n `[VFS]: Specified source file not found for merging process: ${sourcePath}`,\n ),\n )\n return false\n }\n}\n", "// logger.ts\nimport chalk from \"chalk\"\n\nexport type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\"\nexport type LogType =\n | \"success\"\n | \"error\"\n | \"warning\"\n | \"info\"\n | \"instruction\"\n | \"progress\"\n | \"debug\"\n | \"raclette\"\n\nclass Logger {\n private level: LogLevel = \"info\"\n private verbose = false\n\n setLevel(level: LogLevel) {\n this.level = level\n }\n\n setVerbose(verbose: boolean) {\n this.verbose = verbose\n }\n\n private shouldLog(level: LogLevel): boolean {\n const levels: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n }\n\n if (level === \"debug\" && this.verbose) return true\n return levels[level] <= levels[this.level]\n }\n\n private getTypeStyle(type: LogType): (text: string) => string {\n switch (type) {\n case \"success\":\n return chalk.green\n case \"error\":\n return chalk.red\n case \"warning\":\n return chalk.yellow\n case \"info\":\n return chalk.blue\n case \"instruction\":\n return chalk.cyan\n case \"progress\":\n return chalk.reset\n case \"debug\":\n return chalk.gray\n case \"raclette\":\n return chalk.rgb(221, 139, 64)\n default:\n return (text: string) => text\n }\n }\n\n private getTypeIcon(type: LogType): string {\n switch (type) {\n case \"success\":\n return \"\u2705\"\n case \"error\":\n return \"\u274C\"\n case \"warning\":\n return \"\u26A0\uFE0F\"\n case \"info\":\n return \"\u2139\uFE0F \"\n case \"instruction\":\n return \"\uD83D\uDCA1\"\n case \"progress\":\n return \"\uD83D\uDD04\"\n case \"debug\":\n return \"\"\n case \"raclette\":\n return \"\uD83E\uDDC0\"\n default:\n return \"\"\n }\n }\n\n private log(level: LogLevel, message: string, type?: LogType) {\n if (!this.shouldLog(level)) return\n\n const styleFunction = type ? this.getTypeStyle(type) : chalk.reset\n const icon = type ? this.getTypeIcon(type) : \"\"\n const prefix = icon ? `${icon} ` : \"\"\n\n console.log(styleFunction(`${prefix}${message}`))\n }\n\n private logError(message: string, error?: any) {\n if (!this.shouldLog(\"error\")) return\n\n const styleFunction = this.getTypeStyle(\"error\")\n const icon = this.getTypeIcon(\"error\")\n const prefix = icon ? `${icon} ` : \"\"\n\n if (error) {\n console.error(styleFunction(`${prefix}${message}`), error)\n } else {\n console.error(styleFunction(`${prefix}${message}`))\n }\n }\n\n // Main logging methods\n error(message: string, error?: any) {\n this.logError(message, error)\n }\n\n warn(message: string) {\n this.log(\"warn\", message, \"warning\")\n }\n\n info(message: string) {\n this.log(\"info\", message, \"info\")\n }\n\n debug(message: string) {\n this.log(\"debug\", message, \"debug\")\n }\n\n // Typed convenience methods\n success(message: string) {\n this.log(\"info\", message, \"success\")\n }\n\n instruction(message: string) {\n this.log(\"info\", message, \"instruction\")\n }\n\n progress(message: string) {\n this.log(\"info\", message, \"progress\")\n }\n\n raclette(message: string) {\n this.log(\"info\", message, \"raclette\")\n }\n\n // Raw methods (no styling)\n raw(message: string, level: LogLevel = \"info\") {\n if (this.shouldLog(level)) {\n console.log(message)\n }\n }\n}\n\n// Global logger instance\nexport const logger = new Logger()\n", "import fs from \"fs-extra\"\nimport path from \"path\"\nimport mustache from \"mustache\"\nimport { fileURLToPath } from \"url\"\n\nclass BuildError extends Error { \n constructor( message: string, error: any = undefined) \n { super( message + (error ? \": \" + (error as Error).message : \"\")); this.name = 'BuildError' }\n}\n\nconst formatters = {\n yaml: {\n entry: (ee) => Object.entries(ee).map( e => e[0] + \": \" + JSON.stringify(e[1]))\n },\n js: {\n\n }\n}\n\nexport const applyTemplate = (\n templateFileName: string,\n environment: { [key: string]: any },\n destinationDirectory: string | null = null // if a destination is given, also write result there\n):string => {\n //\n const src = template(templateFileName)\n try {\n const res = mustache.render( fs.readFileSync(src, \"utf-8\"), { ...environment, ...formatters[\"yaml\"] })\n if(destinationDirectory) fs.writeFileSync( path.resolve(destinationDirectory, templateFileName), res, \"utf8\")\n return res\n }\n catch (error) { throw new BuildError( `Could not process \"${src}\"`, error) }\n}\n\n\nexport const pkg = ():string => path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"../package.json\")\n//export const pkg = ():string => findPackageJSON(new URL(import.meta.resolve(\".\")))\nexport const core = ():string => path.resolve(path.dirname(pkg()))\nexport const template = (name:string):string => path.resolve(path.dirname(pkg()), \"templates\", name)\n", "/*!\n * mustache.js - Logic-less {{mustache}} templates with JavaScript\n * http://github.com/janl/mustache.js\n */\n\nvar objectToString = Object.prototype.toString;\nvar isArray = Array.isArray || function isArrayPolyfill (object) {\n return objectToString.call(object) === '[object Array]';\n};\n\nfunction isFunction (object) {\n return typeof object === 'function';\n}\n\n/**\n * More correct typeof string handling array\n * which normally returns typeof 'object'\n */\nfunction typeStr (obj) {\n return isArray(obj) ? 'array' : typeof obj;\n}\n\nfunction escapeRegExp (string) {\n return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&');\n}\n\n/**\n * Null safe way of checking whether or not an object,\n * including its prototype, has a given property\n */\nfunction hasProperty (obj, propName) {\n return obj != null && typeof obj === 'object' && (propName in obj);\n}\n\n/**\n * Safe way of detecting whether or not the given thing is a primitive and\n * whether it has the given property\n */\nfunction primitiveHasOwnProperty (primitive, propName) {\n return (\n primitive != null\n && typeof primitive !== 'object'\n && primitive.hasOwnProperty\n && primitive.hasOwnProperty(propName)\n );\n}\n\n// Workaround for https://issues.apache.org/jira/browse/COUCHDB-577\n// See https://github.com/janl/mustache.js/issues/189\nvar regExpTest = RegExp.prototype.test;\nfunction testRegExp (re, string) {\n return regExpTest.call(re, string);\n}\n\nvar nonSpaceRe = /\\S/;\nfunction isWhitespace (string) {\n return !testRegExp(nonSpaceRe, string);\n}\n\nvar entityMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/',\n '`': '`',\n '=': '='\n};\n\nfunction escapeHtml (string) {\n return String(string).replace(/[&<>\"'`=\\/]/g, function fromEntityMap (s) {\n return entityMap[s];\n });\n}\n\nvar whiteRe = /\\s*/;\nvar spaceRe = /\\s+/;\nvar equalsRe = /\\s*=/;\nvar curlyRe = /\\s*\\}/;\nvar tagRe = /#|\\^|\\/|>|\\{|&|=|!/;\n\n/**\n * Breaks up the given `template` string into a tree of tokens. If the `tags`\n * argument is given here it must be an array with two string values: the\n * opening and closing tags used in the template (e.g. [ \"<%\", \"%>\" ]). Of\n * course, the default is to use mustaches (i.e. mustache.tags).\n *\n * A token is an array with at least 4 elements. The first element is the\n * mustache symbol that was used inside the tag, e.g. \"#\" or \"&\". If the tag\n * did not contain a symbol (i.e. {{myValue}}) this element is \"name\". For\n * all text that appears outside a symbol this element is \"text\".\n *\n * The second element of a token is its \"value\". For mustache tags this is\n * whatever else was inside the tag besides the opening symbol. For text tokens\n * this is the text itself.\n *\n * The third and fourth elements of the token are the start and end indices,\n * respectively, of the token in the original template.\n *\n * Tokens that are the root node of a subtree contain two more elements: 1) an\n * array of tokens in the subtree and 2) the index in the original template at\n * which the closing tag for that section begins.\n *\n * Tokens for partials also contain two more elements: 1) a string value of\n * indendation prior to that tag and 2) the index of that tag on that line -\n * eg a value of 2 indicates the partial is the third tag on this line.\n */\nfunction parseTemplate (template, tags) {\n if (!template)\n return [];\n var lineHasNonSpace = false;\n var sections = []; // Stack to hold section tokens\n var tokens = []; // Buffer to hold the tokens\n var spaces = []; // Indices of whitespace tokens on the current line\n var hasTag = false; // Is there a {{tag}} on the current line?\n var nonSpace = false; // Is there a non-space char on the current line?\n var indentation = ''; // Tracks indentation for tags that use it\n var tagIndex = 0; // Stores a count of number of tags encountered on a line\n\n // Strips all whitespace tokens array for the current line\n // if there was a {{#tag}} on it and otherwise only space.\n function stripSpace () {\n if (hasTag && !nonSpace) {\n while (spaces.length)\n delete tokens[spaces.pop()];\n } else {\n spaces = [];\n }\n\n hasTag = false;\n nonSpace = false;\n }\n\n var openingTagRe, closingTagRe, closingCurlyRe;\n function compileTags (tagsToCompile) {\n if (typeof tagsToCompile === 'string')\n tagsToCompile = tagsToCompile.split(spaceRe, 2);\n\n if (!isArray(tagsToCompile) || tagsToCompile.length !== 2)\n throw new Error('Invalid tags: ' + tagsToCompile);\n\n openingTagRe = new RegExp(escapeRegExp(tagsToCompile[0]) + '\\\\s*');\n closingTagRe = new RegExp('\\\\s*' + escapeRegExp(tagsToCompile[1]));\n closingCurlyRe = new RegExp('\\\\s*' + escapeRegExp('}' + tagsToCompile[1]));\n }\n\n compileTags(tags || mustache.tags);\n\n var scanner = new Scanner(template);\n\n var start, type, value, chr, token, openSection;\n while (!scanner.eos()) {\n start = scanner.pos;\n\n // Match any text between tags.\n value = scanner.scanUntil(openingTagRe);\n\n if (value) {\n for (var i = 0, valueLength = value.length; i < valueLength; ++i) {\n chr = value.charAt(i);\n\n if (isWhitespace(chr)) {\n spaces.push(tokens.length);\n indentation += chr;\n } else {\n nonSpace = true;\n lineHasNonSpace = true;\n indentation += ' ';\n }\n\n tokens.push([ 'text', chr, start, start + 1 ]);\n start += 1;\n\n // Check for whitespace on the current line.\n if (chr === '\\n') {\n stripSpace();\n indentation = '';\n tagIndex = 0;\n lineHasNonSpace = false;\n }\n }\n }\n\n // Match the opening tag.\n if (!scanner.scan(openingTagRe))\n break;\n\n hasTag = true;\n\n // Get the tag type.\n type = scanner.scan(tagRe) || 'name';\n scanner.scan(whiteRe);\n\n // Get the tag value.\n if (type === '=') {\n value = scanner.scanUntil(equalsRe);\n scanner.scan(equalsRe);\n scanner.scanUntil(closingTagRe);\n } else if (type === '{') {\n value = scanner.scanUntil(closingCurlyRe);\n scanner.scan(curlyRe);\n scanner.scanUntil(closingTagRe);\n type = '&';\n } else {\n value = scanner.scanUntil(closingTagRe);\n }\n\n // Match the closing tag.\n if (!scanner.scan(closingTagRe))\n throw new Error('Unclosed tag at ' + scanner.pos);\n\n if (type == '>') {\n token = [ type, value, start, scanner.pos, indentation, tagIndex, lineHasNonSpace ];\n } else {\n token = [ type, value, start, scanner.pos ];\n }\n tagIndex++;\n tokens.push(token);\n\n if (type === '#' || type === '^') {\n sections.push(token);\n } else if (type === '/') {\n // Check section nesting.\n openSection = sections.pop();\n\n if (!openSection)\n throw new Error('Unopened section \"' + value + '\" at ' + start);\n\n if (openSection[1] !== value)\n throw new Error('Unclosed section \"' + openSection[1] + '\" at ' + start);\n } else if (type === 'name' || type === '{' || type === '&') {\n nonSpace = true;\n } else if (type === '=') {\n // Set the tags for the next time around.\n compileTags(value);\n }\n }\n\n stripSpace();\n\n // Make sure there are no open sections when we're done.\n openSection = sections.pop();\n\n if (openSection)\n throw new Error('Unclosed section \"' + openSection[1] + '\" at ' + scanner.pos);\n\n return nestTokens(squashTokens(tokens));\n}\n\n/**\n * Combines the values of consecutive text tokens in the given `tokens` array\n * to a single token.\n */\nfunction squashTokens (tokens) {\n var squashedTokens = [];\n\n var token, lastToken;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n if (token) {\n if (token[0] === 'text' && lastToken && lastToken[0] === 'text') {\n lastToken[1] += token[1];\n lastToken[3] = token[3];\n } else {\n squashedTokens.push(token);\n lastToken = token;\n }\n }\n }\n\n return squashedTokens;\n}\n\n/**\n * Forms the given array of `tokens` into a nested tree structure where\n * tokens that represent a section have two additional items: 1) an array of\n * all tokens that appear in that section and 2) the index in the original\n * template that represents the end of that section.\n */\nfunction nestTokens (tokens) {\n var nestedTokens = [];\n var collector = nestedTokens;\n var sections = [];\n\n var token, section;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n switch (token[0]) {\n case '#':\n case '^':\n collector.push(token);\n sections.push(token);\n collector = token[4] = [];\n break;\n case '/':\n section = sections.pop();\n section[5] = token[2];\n collector = sections.length > 0 ? sections[sections.length - 1][4] : nestedTokens;\n break;\n default:\n collector.push(token);\n }\n }\n\n return nestedTokens;\n}\n\n/**\n * A simple string scanner that is used by the template parser to find\n * tokens in template strings.\n */\nfunction Scanner (string) {\n this.string = string;\n this.tail = string;\n this.pos = 0;\n}\n\n/**\n * Returns `true` if the tail is empty (end of string).\n */\nScanner.prototype.eos = function eos () {\n return this.tail === '';\n};\n\n/**\n * Tries to match the given regular expression at the current position.\n * Returns the matched text if it can match, the empty string otherwise.\n */\nScanner.prototype.scan = function scan (re) {\n var match = this.tail.match(re);\n\n if (!match || match.index !== 0)\n return '';\n\n var string = match[0];\n\n this.tail = this.tail.substring(string.length);\n this.pos += string.length;\n\n return string;\n};\n\n/**\n * Skips all text until the given regular expression can be matched. Returns\n * the skipped string, which is the entire tail if no match can be made.\n */\nScanner.prototype.scanUntil = function scanUntil (re) {\n var index = this.tail.search(re), match;\n\n switch (index) {\n case -1:\n match = this.tail;\n this.tail = '';\n break;\n case 0:\n match = '';\n break;\n default:\n match = this.tail.substring(0, index);\n this.tail = this.tail.substring(index);\n }\n\n this.pos += match.length;\n\n return match;\n};\n\n/**\n * Represents a rendering context by wrapping a view object and\n * maintaining a reference to the parent context.\n */\nfunction Context (view, parentContext) {\n this.view = view;\n this.cache = { '.': this.view };\n this.parent = parentContext;\n}\n\n/**\n * Creates a new context using the given view with this context\n * as the parent.\n */\nContext.prototype.push = function push (view) {\n return new Context(view, this);\n};\n\n/**\n * Returns the value of the given name in this context, traversing\n * up the context hierarchy if the value is absent in this context's view.\n */\nContext.prototype.lookup = function lookup (name) {\n var cache = this.cache;\n\n var value;\n if (cache.hasOwnProperty(name)) {\n value = cache[name];\n } else {\n var context = this, intermediateValue, names, index, lookupHit = false;\n\n while (context) {\n if (name.indexOf('.') > 0) {\n intermediateValue = context.view;\n names = name.split('.');\n index = 0;\n\n /**\n * Using the dot notion path in `name`, we descend through the\n * nested objects.\n *\n * To be certain that the lookup has been successful, we have to\n * check if the last object in the path actually has the property\n * we are looking for. We store the result in `lookupHit`.\n *\n * This is specially necessary for when the value has been set to\n * `undefined` and we want to avoid looking up parent contexts.\n *\n * In the case where dot notation is used, we consider the lookup\n * to be successful even if the last \"object\" in the path is\n * not actually an object but a primitive (e.g., a string, or an\n * integer), because it is sometimes useful to access a property\n * of an autoboxed primitive, such as the length of a string.\n **/\n while (intermediateValue != null && index < names.length) {\n if (index === names.length - 1)\n lookupHit = (\n hasProperty(intermediateValue, names[index])\n || primitiveHasOwnProperty(intermediateValue, names[index])\n );\n\n intermediateValue = intermediateValue[names[index++]];\n }\n } else {\n intermediateValue = context.view[name];\n\n /**\n * Only checking against `hasProperty`, which always returns `false` if\n * `context.view` is not an object. Deliberately omitting the check\n * against `primitiveHasOwnProperty` if dot notation is not used.\n *\n * Consider this example:\n * ```\n * Mustache.render(\"The length of a football field is {{#length}}{{length}}{{/length}}.\", {length: \"100 yards\"})\n * ```\n *\n * If we were to check also against `primitiveHasOwnProperty`, as we do\n * in the dot notation case, then render call would return:\n *\n * \"The length of a football field is 9.\"\n *\n * rather than the expected:\n *\n * \"The length of a football field is 100 yards.\"\n **/\n lookupHit = hasProperty(context.view, name);\n }\n\n if (lookupHit) {\n value = intermediateValue;\n break;\n }\n\n context = context.parent;\n }\n\n cache[name] = value;\n }\n\n if (isFunction(value))\n value = value.call(this.view);\n\n return value;\n};\n\n/**\n * A Writer knows how to take a stream of tokens and render them to a\n * string, given a context. It also maintains a cache of templates to\n * avoid the need to parse the same template twice.\n */\nfunction Writer () {\n this.templateCache = {\n _cache: {},\n set: function set (key, value) {\n this._cache[key] = value;\n },\n get: function get (key) {\n return this._cache[key];\n },\n clear: function clear () {\n this._cache = {};\n }\n };\n}\n\n/**\n * Clears all cached templates in this writer.\n */\nWriter.prototype.clearCache = function clearCache () {\n if (typeof this.templateCache !== 'undefined') {\n this.templateCache.clear();\n }\n};\n\n/**\n * Parses and caches the given `template` according to the given `tags` or\n * `mustache.tags` if `tags` is omitted, and returns the array of tokens\n * that is generated from the parse.\n */\nWriter.prototype.parse = function parse (template, tags) {\n var cache = this.templateCache;\n var cacheKey = template + ':' + (tags || mustache.tags).join(':');\n var isCacheEnabled = typeof cache !== 'undefined';\n var tokens = isCacheEnabled ? cache.get(cacheKey) : undefined;\n\n if (tokens == undefined) {\n tokens = parseTemplate(template, tags);\n isCacheEnabled && cache.set(cacheKey, tokens);\n }\n return tokens;\n};\n\n/**\n * High-level method that is used to render the given `template` with\n * the given `view`.\n *\n * The optional `partials` argument may be an object that contains the\n * names and templates of partials that are used in the template. It may\n * also be a function that is used to load partial templates on the fly\n * that takes a single argument: the name of the partial.\n *\n * If the optional `config` argument is given here, then it should be an\n * object with a `tags` attribute or an `escape` attribute or both.\n * If an array is passed, then it will be interpreted the same way as\n * a `tags` attribute on a `config` object.\n *\n * The `tags` attribute of a `config` object must be an array with two\n * string values: the opening and closing tags used in the template (e.g.\n * [ \"<%\", \"%>\" ]). The default is to mustache.tags.\n *\n * The `escape` attribute of a `config` object must be a function which\n * accepts a string as input and outputs a safely escaped string.\n * If an `escape` function is not provided, then an HTML-safe string\n * escaping function is used as the default.\n */\nWriter.prototype.render = function render (template, view, partials, config) {\n var tags = this.getConfigTags(config);\n var tokens = this.parse(template, tags);\n var context = (view instanceof Context) ? view : new Context(view, undefined);\n return this.renderTokens(tokens, context, partials, template, config);\n};\n\n/**\n * Low-level method that renders the given array of `tokens` using\n * the given `context` and `partials`.\n *\n * Note: The `originalTemplate` is only ever used to extract the portion\n * of the original template that was contained in a higher-order section.\n * If the template doesn't use higher-order sections, this argument may\n * be omitted.\n */\nWriter.prototype.renderTokens = function renderTokens (tokens, context, partials, originalTemplate, config) {\n var buffer = '';\n\n var token, symbol, value;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n value = undefined;\n token = tokens[i];\n symbol = token[0];\n\n if (symbol === '#') value = this.renderSection(token, context, partials, originalTemplate, config);\n else if (symbol === '^') value = this.renderInverted(token, context, partials, originalTemplate, config);\n else if (symbol === '>') value = this.renderPartial(token, context, partials, config);\n else if (symbol === '&') value = this.unescapedValue(token, context);\n else if (symbol === 'name') value = this.escapedValue(token, context, config);\n else if (symbol === 'text') value = this.rawValue(token);\n\n if (value !== undefined)\n buffer += value;\n }\n\n return buffer;\n};\n\nWriter.prototype.renderSection = function renderSection (token, context, partials, originalTemplate, config) {\n var self = this;\n var buffer = '';\n var value = context.lookup(token[1]);\n\n // This function is used to render an arbitrary template\n // in the current context by higher-order sections.\n function subRender (template) {\n return self.render(template, context, partials, config);\n }\n\n if (!value) return;\n\n if (isArray(value)) {\n for (var j = 0, valueLength = value.length; j < valueLength; ++j) {\n buffer += this.renderTokens(token[4], context.push(value[j]), partials, originalTemplate, config);\n }\n } else if (typeof value === 'object' || typeof value === 'string' || typeof value === 'number') {\n buffer += this.renderTokens(token[4], context.push(value), partials, originalTemplate, config);\n } else if (isFunction(value)) {\n if (typeof originalTemplate !== 'string')\n throw new Error('Cannot use higher-order sections without the original template');\n\n // Extract the portion of the original template that the section contains.\n value = value.call(context.view, originalTemplate.slice(token[3], token[5]), subRender);\n\n if (value != null)\n buffer += value;\n } else {\n buffer += this.renderTokens(token[4], context, partials, originalTemplate, config);\n }\n return buffer;\n};\n\nWriter.prototype.renderInverted = function renderInverted (token, context, partials, originalTemplate, config) {\n var value = context.lookup(token[1]);\n\n // Use JavaScript's definition of falsy. Include empty arrays.\n // See https://github.com/janl/mustache.js/issues/186\n if (!value || (isArray(value) && value.length === 0))\n return this.renderTokens(token[4], context, partials, originalTemplate, config);\n};\n\nWriter.prototype.indentPartial = function indentPartial (partial, indentation, lineHasNonSpace) {\n var filteredIndentation = indentation.replace(/[^ \\t]/g, '');\n var partialByNl = partial.split('\\n');\n for (var i = 0; i < partialByNl.length; i++) {\n if (partialByNl[i].length && (i > 0 || !lineHasNonSpace)) {\n partialByNl[i] = filteredIndentation + partialByNl[i];\n }\n }\n return partialByNl.join('\\n');\n};\n\nWriter.prototype.renderPartial = function renderPartial (token, context, partials, config) {\n if (!partials) return;\n var tags = this.getConfigTags(config);\n\n var value = isFunction(partials) ? partials(token[1]) : partials[token[1]];\n if (value != null) {\n var lineHasNonSpace = token[6];\n var tagIndex = token[5];\n var indentation = token[4];\n var indentedValue = value;\n if (tagIndex == 0 && indentation) {\n indentedValue = this.indentPartial(value, indentation, lineHasNonSpace);\n }\n var tokens = this.parse(indentedValue, tags);\n return this.renderTokens(tokens, context, partials, indentedValue, config);\n }\n};\n\nWriter.prototype.unescapedValue = function unescapedValue (token, context) {\n var value = context.lookup(token[1]);\n if (value != null)\n return value;\n};\n\nWriter.prototype.escapedValue = function escapedValue (token, context, config) {\n var escape = this.getConfigEscape(config) || mustache.escape;\n var value = context.lookup(token[1]);\n if (value != null)\n return (typeof value === 'number' && escape === mustache.escape) ? String(value) : escape(value);\n};\n\nWriter.prototype.rawValue = function rawValue (token) {\n return token[1];\n};\n\nWriter.prototype.getConfigTags = function getConfigTags (config) {\n if (isArray(config)) {\n return config;\n }\n else if (config && typeof config === 'object') {\n return config.tags;\n }\n else {\n return undefined;\n }\n};\n\nWriter.prototype.getConfigEscape = function getConfigEscape (config) {\n if (config && typeof config === 'object' && !isArray(config)) {\n return config.escape;\n }\n else {\n return undefined;\n }\n};\n\nvar mustache = {\n name: 'mustache.js',\n version: '4.2.0',\n tags: [ '{{', '}}' ],\n clearCache: undefined,\n escape: undefined,\n parse: undefined,\n render: undefined,\n Scanner: undefined,\n Context: undefined,\n Writer: undefined,\n /**\n * Allows a user to override the default caching strategy, by providing an\n * object with set, get and clear methods. This can also be used to disable\n * the cache by setting it to the literal `undefined`.\n */\n set templateCache (cache) {\n defaultWriter.templateCache = cache;\n },\n /**\n * Gets the default or overridden caching object from the default writer.\n */\n get templateCache () {\n return defaultWriter.templateCache;\n }\n};\n\n// All high-level mustache.* functions use this writer.\nvar defaultWriter = new Writer();\n\n/**\n * Clears all cached templates in the default writer.\n */\nmustache.clearCache = function clearCache () {\n return defaultWriter.clearCache();\n};\n\n/**\n * Parses and caches the given template in the default writer and returns the\n * array of tokens it contains. Doing this ahead of time avoids the need to\n * parse templates on the fly as they are rendered.\n */\nmustache.parse = function parse (template, tags) {\n return defaultWriter.parse(template, tags);\n};\n\n/**\n * Renders the `template` with the given `view`, `partials`, and `config`\n * using the default writer.\n */\nmustache.render = function render (template, view, partials, config) {\n if (typeof template !== 'string') {\n throw new TypeError('Invalid template! Template should be a \"string\" ' +\n 'but \"' + typeStr(template) + '\" was given as the first ' +\n 'argument for mustache#render(template, view, partials)');\n }\n\n return defaultWriter.render(template, view, partials, config);\n};\n\n// Export the escaping function so that the user may override it.\n// See https://github.com/janl/mustache.js/issues/244\nmustache.escape = escapeHtml;\n\n// Export these mainly for testing, but also for advanced usage.\nmustache.Scanner = Scanner;\nmustache.Context = Context;\nmustache.Writer = Writer;\n\nexport default mustache;\n", "import type { RacletteConfig } from \"./types\"\nimport type { ChildProcess } from \"child_process\"\nimport chalk from \"chalk\"\nimport { spawn } from \"child_process\"\nimport fs, { pathExists } from \"fs-extra\"\nimport path from \"path\"\nimport { watchOriginalConfigFile } from \"./config-loader\"\nimport { watchConfigFile, parse } from \"./config\"\nimport { applyTemplate, pkg } from \"./builder\"\nimport { generateDockerCompose } from \"./docker-generator\"\nimport { trackServiceFiles, rebuildChangedServices } from \"./docker-tracker\"\nimport { generateEslintConfig } from \"./eslint-generator\"\nimport { setupNodePackages, ensureLockFilesExist } from \"./package-manager\"\nimport { generateTsConfig } from \"./ts-generator\"\nimport { setupVirtualFileSystem } from \"./virtual-file-system\"\nimport * as vfs from \"./vfs\"\nimport {\n executeDockerComposeCommand,\n containerExists,\n ensureDockerNetwork,\n stopContainersByPrefix,\n} from \"./docker-utils\"\nimport { logger } from \"src/logger\"\nimport {\n createWorkbenchConfigFile,\n validateWorkbenchConfig,\n} from \"src/config-generator\"\n\ntype DevEnvironmentOptions = {\n dockerComposePath: string\n workingDir: string\n quiet?: boolean\n verbose?: boolean\n logFilter?: string[]\n forceRebuild?: boolean\n noCache?: boolean\n}\n\n// Define service types\ntype ServiceType = \"frontend\" | \"backend\" | \"mongodb\" | \"cache\"\n\n// Service configuration interface\ninterface ServiceConfig {\n name: string\n containerName: string\n port: number\n enabled: boolean\n isDatabaseService: boolean\n volumeName?: string\n}\n\n// Active processes map\nconst processes = new Map<string, ChildProcess>()\nconst yarnCommand = \"yarn\"\nconst useShellForYarn = process.platform === \"win32\"\n\n/**\n * Detect whether the project points to a missing local Yarn binary.\n * If so, we can fallback to globally available Yarn.\n */\nconst shouldIgnoreConfiguredYarnPath = async (\n projectRoot: string,\n): Promise<boolean> => {\n const yarnRcPath = path.join(projectRoot, \".yarnrc.yml\")\n\n if (!(await fs.pathExists(yarnRcPath))) {\n return false\n }\n\n const yarnRcContent = await fs.readFile(yarnRcPath, \"utf8\")\n const yarnPathMatch = yarnRcContent.match(/^\\s*yarnPath\\s*:\\s*(.+)\\s*$/m)\n if (!yarnPathMatch) {\n return false\n }\n\n const rawYarnPath = yarnPathMatch[1].trim()\n const normalizedYarnPath = rawYarnPath.replace(/^['\"]|['\"]$/g, \"\")\n if (!normalizedYarnPath) {\n return false\n }\n\n const absoluteYarnPath = path.resolve(projectRoot, normalizedYarnPath)\n if (await fs.pathExists(absoluteYarnPath)) {\n return false\n }\n\n logger.warn(\n `Configured yarnPath is missing (${absoluteYarnPath}). Falling back to global Yarn.`,\n )\n return true\n}\n\n/**\n * Set up and start the development environment\n */\nexport const setupDevEnvironment = async (\n appDir: string,\n env: Record<string, string>,\n config: RacletteConfig,\n options: DevEnvironmentOptions,\n): Promise<void> => {\n logger.raclette(\"Starting development environment...\")\n\n // TODO: allow for more vfs customization, for now only default\n const vfs_cfg = parse(applyTemplate(\"fs.yml\", { appDirName: path.basename(options.workingDir) }))\n\n const racletteDir = path.dirname(options.dockerComposePath)\n const projectName = config.name ?? path.basename(appDir)\n // 1. Watch the original config file (changes in .env require restart)\n const originalConfigWatcher = watchConfigFile(appDir, env)\n const originalWatcherProcess = {\n kill: () => {\n originalConfigWatcher()\n return true\n },\n } as unknown as ChildProcess\n\n processes.set(\"originalConfigWatcher\", originalWatcherProcess)\n\n // 2. Ensure yarn.lock files & generate package.json files\n await ensureLockFilesExist(config)\n await setupNodePackages(config)\n\n await vfs.init(config, vfs_cfg)\n //await setupVirtualFileSystem(config)\n \n //process.exit()\n\n // 4. Ensure the shared Docker network exists\n ensureDockerNetwork(\"raclette_shared\")\n\n // 5. Generate docker and docker-compose files\n //applyTemplate(path.basename(options.dockerComposePath), path.dirname(options.dockerComposePath),\n // {}\n //);\n\n await generateDockerCompose(\n config,\n options.workingDir,\n options.dockerComposePath,\n false, // No more direct mode\n \"development\",\n true,\n )\n\n // 6. Generate TypeScript config\n await generateTsConfig(config, racletteDir)\n\n // 7. Generate ESLint flat config\n await generateEslintConfig(config, racletteDir)\n\n // 8. Track service files and detect changes that require rebuilding\n const servicesToRebuild = await trackServiceFiles(\n config,\n racletteDir,\n options.forceRebuild ?? false,\n )\n\n // 9. Rebuild services if needed\n if (servicesToRebuild.length > 0) {\n await rebuildChangedServices(config, racletteDir, servicesToRebuild, {\n noCache: options.noCache,\n })\n }\n\n // 10. Create service configurations\n const serviceConfigs = createServiceConfigs(config)\n\n // 11. Check for existing services\n const existingServices = getExistingServices(serviceConfigs)\n\n if (existingServices.length > 0) {\n logger.info(`Found existing services: ${existingServices.join(\", \")}`)\n }\n\n // 12. Set up cleanup handler\n const cleanupHandler = createCleanupHandler(\n config,\n projectName,\n options.dockerComposePath,\n )\n\n // Register signal handlers\n ;[\"SIGINT\", \"SIGTERM\"].forEach((signal) => {\n process.removeAllListeners(signal)\n process.on(signal, () => cleanupHandler(signal))\n })\n\n // 13. Start services based on options\n if (options.quiet) {\n // Start Docker services without following logs\n await startDockerServices(\n config,\n projectName,\n options.dockerComposePath,\n serviceConfigs,\n existingServices,\n options.verbose ?? false,\n )\n\n // Show service information\n console.log(chalk.green(\"\\n\u2705 Development environment is ready!\"))\n\n if (serviceConfigs.frontend.enabled) {\n console.log(\n chalk.blue(\n `\uD83C\uDF0D Frontend running at: http://localhost:${serviceConfigs.frontend.port}`,\n ),\n )\n }\n\n if (serviceConfigs.backend.enabled) {\n console.log(\n chalk.blue(\n `\uD83D\uDE80 Server running at: http://localhost:${serviceConfigs.backend.port}`,\n ),\n )\n }\n\n console.log(\n chalk.yellow(\"\\n\u2139\uFE0F Services are running in detached mode (quiet)\"),\n )\n console.log(\n chalk.yellow('Use \"raclette down\" to stop the services when finished'),\n )\n } else {\n // Start Docker services and follow logs\n await startDockerServicesWithLogs(\n config,\n projectName,\n options.dockerComposePath,\n serviceConfigs,\n existingServices,\n options.logFilter,\n options.verbose ?? false,\n )\n }\n}\n\n/**\n * Create service configurations from the main config\n */\nconst createServiceConfigs = (\n config: RacletteConfig,\n): Record<ServiceType, ServiceConfig> => {\n const projectName = config.name ?? path.basename(process.cwd())\n\n return {\n frontend: {\n name: \"frontend\",\n containerName:\n config.services.frontend?.name ?? `${projectName}-frontend`,\n port: config.services.frontend?.port ?? 8081,\n enabled: config.services.frontend?.enabled ?? false,\n isDatabaseService: false,\n },\n backend: {\n name: \"backend\",\n containerName: config.services.backend?.name ?? `${projectName}-backend`,\n port: config.services.backend?.port ?? 8082,\n enabled: config.services.backend?.enabled ?? false,\n isDatabaseService: false,\n },\n mongodb: {\n name: \"mongodb\",\n containerName: config.services.mongodb?.name ?? `${projectName}-mongodb`,\n port: config.services.mongodb?.port ?? 27017,\n enabled: config.services.mongodb?.enabled ?? false,\n volumeName: config.services.mongodb?.volume ?? `${projectName}-mongodb`,\n isDatabaseService: true,\n },\n cache: {\n name: \"cache\",\n containerName: config.services.cache?.name ?? `${projectName}-cache`,\n port: config.services.cache?.port ?? 6379,\n enabled: config.services.cache?.enabled ?? false,\n volumeName: config.services.cache?.volume ?? `${projectName}-cache`,\n isDatabaseService: true,\n },\n }\n}\n\n/**\n * Get list of services that already exist\n */\nconst getExistingServices = (\n serviceConfigs: Record<ServiceType, ServiceConfig>,\n): ServiceType[] => {\n const existingServices: ServiceType[] = []\n\n Object.entries(serviceConfigs).forEach(([service, config]) => {\n if (config.enabled && containerExists(config.containerName)) {\n existingServices.push(service as ServiceType)\n }\n })\n\n return existingServices\n}\n\n/**\n * Create cleanup handler for proper shutdown\n */\nconst createCleanupHandler = (\n config: RacletteConfig,\n projectName: string,\n dockerComposePath: string,\n) => {\n return (signal: string) => {\n console.log(\"\\n\" + \"=\".repeat(80))\n console.log(\n chalk.bold.yellow(\n ` CLEANUP: Shutting down services after ${signal}...`,\n ),\n )\n console.log(\"=\".repeat(80) + \"\\n\")\n\n // Kill all active processes\n for (const [name, process] of processes.entries()) {\n if (process && !process.killed && typeof process.kill === \"function\") {\n console.log(chalk.yellow(`Stopping ${name} process...`))\n process.kill(\"SIGTERM\")\n }\n }\n\n // Run Docker Compose down to clean up containers\n try {\n stopWorkbench(config)\n\n executeDockerComposeCommand(\n [\"-p\", projectName, \"-f\", dockerComposePath, \"down\"],\n { stdio: \"inherit\" },\n )\n\n console.log(\"\\n\" + \"=\".repeat(80))\n console.log(\n chalk.bold.green(\n \" \u2705 CLEANUP COMPLETE: All services stopped successfully\",\n ),\n )\n console.log(\"=\".repeat(80))\n } catch (error) {\n console.error(chalk.red(\"Error stopping Docker services:\"), error)\n }\n\n // Exit process\n process.exit(0)\n }\n}\n\n/**\n * Start Docker services based on configurations\n */\nconst startDockerServices = async (\n config: RacletteConfig,\n projectName: string,\n dockerComposePath: string,\n serviceConfigs: Record<ServiceType, ServiceConfig>,\n existingServices: ServiceType[],\n verbose: boolean,\n): Promise<void> => {\n console.log(chalk.blue(\"\uD83D\uDC33 Starting Docker services...\"))\n\n // Ensure docker-compose file exists\n if (!(await fs.pathExists(dockerComposePath))) {\n const error = `Docker compose file not found: ${dockerComposePath}`\n logger.error(error)\n throw new Error(error)\n }\n\n // Determine which services to start\n const servicesToStart: string[] = []\n\n Object.entries(serviceConfigs).forEach(([serviceName, config]) => {\n const service = serviceName as ServiceType\n\n if (!config.enabled) {\n return // Skip disabled services\n }\n\n if (existingServices.includes(service)) {\n logger.info(`Skipping existing service: ${service}`)\n return // Skip existing services\n }\n\n servicesToStart.push(service)\n })\n\n if (servicesToStart.length === 0) {\n logger.warn(\n \"No Docker services to start! All services either exist or are not enabled.\",\n )\n return\n }\n\n logger.raw(\n chalk.blue(`\uD83D\uDE80 Starting following services: ${servicesToStart.join(\", \")}`),\n )\n\n // Execute Docker compose command\n try {\n executeDockerComposeCommand(\n [\n \"-p\",\n projectName,\n \"-f\",\n dockerComposePath,\n \"up\",\n \"-d\",\n ...servicesToStart,\n ],\n { stdio: \"inherit\" },\n )\n\n logger.success(`Docker services started: ${servicesToStart.join(\", \")}`)\n } catch (error: any) {\n logger.error(`Error starting Docker services: ${error.message}`)\n throw error\n }\n\n try {\n // TODO: once parallel workspaces builds function properly, remove this\nawait startWorkbench(config, verbose)\n } catch (error: any) {\n logger.error(`Error starting Workbench: ${error.message}`)\n }\n}\n\n/**\n * Start Docker services and follow logs\n */\nconst startDockerServicesWithLogs = async (\n config: RacletteConfig,\n projectName: string,\n dockerComposePath: string,\n serviceConfigs: Record<ServiceType, ServiceConfig>,\n existingServices: ServiceType[],\n logFilter: string[] = [\"frontend\", \"backend\"],\n verbose: boolean,\n): Promise<void> => {\n // First start the services\n await startDockerServices(\n config,\n projectName,\n dockerComposePath,\n serviceConfigs,\n existingServices,\n verbose,\n )\n\n // Only follow logs for services that are actually running\n const logsToFollow = logFilter.filter((service) => {\n // Skip services that already exist\n if (existingServices.includes(service as ServiceType)) {\n return false\n }\n\n // Skip services that aren't enabled\n const serviceConfig = serviceConfigs[service as ServiceType]\n return serviceConfig?.enabled\n })\n\n if (logsToFollow.length === 0) {\n logger.warn(\"No services to show logs for\")\n return\n }\n\n logger.raw(\n chalk.blue(\n `\uD83D\uDCCB Showing logs for: ${logsToFollow.join(\", \")} (press Ctrl+C to stop)...`,\n ),\n )\n\n // Use absolute path for docker-compose file\n const absoluteDockerComposePath = path.resolve(dockerComposePath)\n\n // Build log command args\n const logArgs = [\n \"-p\",\n projectName,\n \"-f\",\n absoluteDockerComposePath,\n \"logs\",\n \"--follow\",\n ...logsToFollow,\n ]\n\n try {\n logger.debug(`Running Docker Compose logs...`)\n\n // Start a single log process using spawn for real-time output\n const logProcess = spawn(\"docker\", [\"compose\", ...logArgs], {\n stdio: \"inherit\",\n shell: true,\n // Set working directory to ensure paths resolve correctly\n cwd: path.dirname(absoluteDockerComposePath),\n })\n\n // Store the process for later cleanup\n processes.set(\"dockerLogs\", logProcess)\n\n // Wait for log process to exit\n return new Promise((resolve) => {\n logProcess.on(\"close\", (code) => {\n if (!logProcess.killed) {\n console.log(\n chalk.yellow(`\\nLog process ended with code ${code ?? 0}`),\n )\n }\n resolve()\n })\n\n logProcess.on(\"error\", (error) => {\n logger.error(` Error with log process: ${error.message}`)\n resolve()\n })\n })\n } catch (error: any) {\n logger.error(`Error setting up log following: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Check if workbench package exists and return its path\n */\nexport const checkWorkbenchSetup = async (config: RacletteConfig) => {\n if (!config.services?.workbench?.enabled) {\n return\n }\n\n const workbenchPath = path.join(\n process.cwd(),\n \"node_modules\",\n \"@raclettejs\",\n \"workbench\",\n )\n\n // Check if workbench package exists\n if (!(await fs.pathExists(workbenchPath))) {\n logger.error(\n \"Workbench package not found. Install with: yarn add @raclettejs/workbench\",\n )\n throw new Error(\"Workbench package not found\")\n }\n\n // Check if package.json exists in workbench\n const workbenchPackageJson = path.join(workbenchPath, \"package.json\")\n if (!(await fs.pathExists(workbenchPackageJson))) {\n logger.error(\" Workbench package.json not found\")\n throw new Error(\"Workbench package.json not found\")\n }\n\n return workbenchPath\n}\n\nconst startWorkbench = async (\n config: RacletteConfig,\n verbose: boolean,\n): Promise<void> => {\n if (!config.services?.workbench?.enabled) {\n return\n }\n\n const workbenchPath = await checkWorkbenchSetup(config)\n if (!workbenchPath) return\n let resolvedWorkbenchPath = workbenchPath\n try {\n resolvedWorkbenchPath = await fs.realpath(workbenchPath)\n } catch {\n // Keep original path if resolution fails\n }\n\n let pluginPath: string | undefined = path.join(\n process.cwd(),\n \"workbenchPlugins\",\n )\n // check if we need to mount the workbenchPlugins dir from the app\n if (!(await pathExists(pluginPath))) {\n pluginPath = undefined\n }\n\n // Handle workbench configuration file creation\n let workbenchConfigPath: string | undefined\n if (config.workbench) {\n try {\n validateWorkbenchConfig(config.workbench)\n workbenchConfigPath = await createWorkbenchConfigFile(config.workbench)\n } catch (error: any) {\n console.error(chalk.red(\"Workbench configuration error:\"), error.message)\n throw error\n }\n }\n\n const envsFromParent = Object.fromEntries(\n Object.entries(config.env.development || {})\n .filter(([key]) => key.startsWith(\"RACLETTE_\"))\n .flatMap(([key, value]) => {\n const entries = [[key, value]] // Keep original\n\n // Convert RACLETTE_WORKBENCH_ to RACLETTE_ (strip WORKBENCH_)\n if (key.startsWith(\"RACLETTE_WORKBENCH_\")) {\n const convertedKey = key.replace(\"RACLETTE_WORKBENCH_\", \"RACLETTE_\")\n entries.push([convertedKey, value])\n }\n\n return entries\n }),\n )\n\n if (config.services?.workbench?.debugPort) {\n envsFromParent.ENABLE_DEBUG = true\n envsFromParent.RACLETTE_DEBUG_PORT = config.services.workbench.debugPort\n }\n\n // Set environment variables for the workbench\n const env = {\n ...process.env,\n NODE_ENV: \"development\",\n // Pass through main app's database connections\n MONGO_HOST: `mongodb://localhost:${config.services.mongodb?.port || 27017}/${config.services.mongodb?.databaseName || config.name}`,\n CACHE_URL: `raclette-cache://localhost:${config.services.cache?.port || 6379}${config.services.cache?.db ? `/${config.services.cache.db}` : \"\"}`,\n // Set workbench-specific ports if configured\n RACLETTE_CLIENT_PORT: String(\n config.services.workbench?.frontendPort || 8083,\n ),\n RACLETTE_SERVER_PORT: String(\n config.services.workbench?.backendPort || 8084,\n ),\n // Pass through any development environment variables\n ...envsFromParent,\n }\n const ignoreConfiguredYarnPath = await shouldIgnoreConfiguredYarnPath(\n process.cwd(),\n )\n if (ignoreConfiguredYarnPath) {\n env.YARN_IGNORE_PATH = \"1\"\n }\n\n return new Promise<void>((resolve, reject) => {\n const workbenchName = `${config.name}-workbench`\n logger.progress(\"Starting workbench as \" + workbenchName)\n\n // Build workbench args and filter out empty strings\n const workbenchArgs = [\n \"dev\",\n verbose ? \"-v\" : \"\",\n \"-p\",\n workbenchName,\n ...(workbenchConfigPath ? [\"-f\", workbenchConfigPath] : []),\n ].filter((arg) => arg !== \"\")\n // Use resolved path to avoid Yarn workspace resolution issues on symlinked node_modules entries.\n const args = [\"--cwd\", resolvedWorkbenchPath, ...workbenchArgs]\n\n const shouldPipe = config.services?.workbench?.withLogs || verbose\n // Start workbench with yarn command in workbench package context\n const workbenchProcess = spawn(yarnCommand, args, {\n cwd: process.cwd(),\n env,\n stdio: shouldPipe ? \"pipe\" : \"ignore\",\n shell: useShellForYarn,\n })\n\n processes.set(\"workbench\", workbenchProcess)\n\n if (shouldPipe) {\n // Handle workbench output only if we're piping\n workbenchProcess.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().trim().split(\"\\n\")\n lines.forEach((line) => {\n console.log(chalk.magenta(`[Workbench] ${line}`))\n })\n })\n\n workbenchProcess.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().trim().split(\"\\n\")\n lines.forEach((line) => {\n console.error(chalk.red(`[Workbench] ${line}`))\n })\n })\n\n // Detect successful startup only if we can see the output\n workbenchProcess.stdout?.on(\"data\", (data) => {\n const output = data.toString()\n if (output.includes(\"VITE v\")) {\n clearTimeout(startupTimer)\n resolve()\n }\n })\n }\n\n // Add a timeout as a fallback for startup resolution\n const startupTimer = setTimeout(\n () => {\n resolve() // Resolve after timeout regardless of mode\n },\n shouldPipe ? 1000 * 60 * 5 : 5000,\n ) // Shorter timeout when not piping\n\n workbenchProcess.on(\"close\", (code: number | null) => {\n clearTimeout(startupTimer)\n if (code !== 0 && code !== null) {\n console.error(chalk.red(`Workbench process exited with code ${code}`))\n reject(new Error(`Workbench process exited with code ${code}`))\n } else {\n resolve() // Resolve on successful close\n }\n })\n\n workbenchProcess.on(\"error\", (error: any) => {\n clearTimeout(startupTimer)\n console.error(chalk.red(\"Workbench process error:\"), error)\n reject(error)\n })\n\n // If not piping, resolve quickly after spawn\n if (!shouldPipe) {\n setTimeout(resolve, 1000) // Give it a second to start, then continue\n }\n })\n}\n\n/**\n * Stop workbench directly via yarn down in its node_modules directory\n */\nconst stopWorkbench = async (config: RacletteConfig): Promise<void> => {\n if (!config.services?.workbench?.enabled) {\n return\n }\n\n try {\n const workbenchPath = await checkWorkbenchSetup(config)\n if (!workbenchPath) return\n let resolvedWorkbenchPath = workbenchPath\n try {\n resolvedWorkbenchPath = await fs.realpath(workbenchPath)\n } catch {\n // Keep original path if resolution fails\n }\n const env = { ...process.env }\n const ignoreConfiguredYarnPath = await shouldIgnoreConfiguredYarnPath(\n process.cwd(),\n )\n if (ignoreConfiguredYarnPath) {\n env.YARN_IGNORE_PATH = \"1\"\n }\n\n spawn(\n yarnCommand,\n [\"--cwd\", resolvedWorkbenchPath, \"down\", \"-p\", `${config.name}-workbench`],\n {\n cwd: process.cwd(),\n env,\n stdio: \"pipe\",\n shell: useShellForYarn,\n },\n )\n } catch (error) {\n logger.debug(\"Workbench down command failed, forcing process termination\")\n // Fall back to killing the process\n const workbenchProcess = processes.get(\"workbench\")\n if (workbenchProcess && !workbenchProcess.killed) {\n workbenchProcess.kill(\"SIGTERM\")\n } else {\n // Check for containers that start with \"raclette-workbench\"\n // This will catch containers like \"raclette-workbench-frontend\" and \"raclette-workbench-backend\"\n const workbenchPrefix = `${config.name}-workbench`\n try {\n stopContainersByPrefix(workbenchPrefix)\n } catch (error: any) {\n logger.warn(`Could not stop workbench containers: ${error.message}`)\n }\n }\n }\n}\n\n/**\n * Stop all compose services\n */\nexport const stopComposeServices = (\n dockerComposePath: string,\n config: RacletteConfig,\n): void => {\n const projectName = config?.name ?? path.basename(process.cwd())\n\n logger.debug(`\uD83C\uDFF7\uFE0F Using project name: ${projectName}`)\n logger.raclette(\"Stopping all Docker services...\")\n\n try {\n stopWorkbench(config)\n\n executeDockerComposeCommand(\n [\"-p\", projectName, \"-f\", dockerComposePath, \"down\"],\n { stdio: \"inherit\" },\n )\n\n logger.success(\"All Docker services stopped successfully\")\n } catch (error) {\n logger.error(\"Error stopping Docker services:\", error)\n throw error\n }\n}\n", "import type { RacletteConfig, VolumeDefinition } from \"./types\"\nimport { Environments } from \"./types\"\nimport fs from \"fs-extra\"\nimport yaml from \"js-yaml\"\nimport path from \"path\"\nimport { containerExists } from \"./docker-utils\"\nimport { logger } from \"src/logger\"\n\n// a volume where the backend can create and access files that are then publicly served by the frontend\nconst publicSharedVolume = \"raclette-public-shared\"\n\n/**\n * Transforms paths for the Docker Compose generation\n * This function handles path adjustments and can be extended for future transformations\n */\nconst transformPath = (path: string | undefined): string | undefined => {\n if (!path) {\n return path\n }\n\n // Handle relative paths\n if (path.startsWith(\"./\")) {\n // For paths starting with ./, transform to account for .raclette directory\n return \"../\" + path.substring(2)\n } else if (path.startsWith(\"../\")) {\n // For paths starting with ../, add an extra level\n return \"../../\" + path.substring(3)\n }\n\n // Return unchanged for absolute paths or named volumes\n return path\n}\n\n/**\n * Resolve absolute paths for volumes to ensure Docker 28+ compatibility\n */\nconst resolveVolumePath = (volumePath: string, workingDir: string): string => {\n // If it's already absolute, return as-is\n if (path.isAbsolute(volumePath)) {\n return volumePath\n }\n\n // If it's a named volume (no path separators), return as-is\n if (!volumePath.includes(\"/\") && !volumePath.includes(\"\\\\\")) {\n return volumePath\n }\n\n // For relative paths, resolve them to absolute paths based on working directory\n if (volumePath.startsWith(\"./\") || volumePath.startsWith(\"../\")) {\n return path.resolve(workingDir, volumePath)\n }\n\n // Default case - treat as relative to working directory\n return path.resolve(workingDir, volumePath)\n}\n\n/**\n * Recursively transforms all paths in an object with enhanced Docker 28+ support\n * This is useful for complex configurations with nested path properties\n */\nconst transformPaths = (obj: any, workingDir: string): any => {\n if (!obj || typeof obj !== \"object\") {\n return obj\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map((item) => transformPaths(item, workingDir))\n }\n\n // Create a new object to avoid mutating the original\n const result: any = {}\n\n // Process each property\n for (const [key, value] of Object.entries(obj)) {\n // Transform string values that might be paths\n if (typeof value === \"string\" && (key === \"source\" || key === \"device\")) {\n // For volume sources, we want to resolve to absolute paths for Docker 28+ compatibility\n result[key] = resolveVolumePath(value, workingDir)\n }\n // Handle other path-like properties that might need transformation\n else if (\n typeof value === \"string\" &&\n (key === \"context\" ||\n key === \"dockerfile\" ||\n key.endsWith(\"Path\") ||\n key.endsWith(\"Dir\") ||\n key.includes(\"path\") ||\n key.includes(\"Path\"))\n ) {\n result[key] = transformPath(value)\n }\n // Recursively transform nested objects\n else if (value && typeof value === \"object\") {\n result[key] = transformPaths(value, workingDir)\n }\n // Keep other values as is\n else {\n result[key] = value\n }\n }\n\n return result\n}\n\n/**\n * Process volume definition into Docker Compose volume format with enhanced path handling\n */\nexport const processVolumeDefinition = (\n volume: VolumeDefinition,\n workingDir: string,\n): string | object | null => {\n // Transform the entire volume definition to handle any paths\n const transformedVolume = transformPaths(volume, workingDir)\n\n // Resolve the source path to absolute if it's a file/directory path\n if (transformedVolume.source && transformedVolume.source.includes(\"/\")) {\n transformedVolume.source = resolveVolumePath(\n transformedVolume.source,\n workingDir,\n )\n }\n\n // Check if volume should be conditionally mounted\n if (transformedVolume.mustExist) {\n if (!fs.existsSync(transformedVolume.source)) {\n logger.debug(\n `Skipping volume mount: ${transformedVolume.source} does not exist`,\n )\n return null // Return null to indicate this volume should be skipped\n }\n }\n\n // Simple format: just source:target\n if (\n !transformedVolume.type &&\n !transformedVolume.readonly &&\n !transformedVolume.volumeOptions &&\n !transformedVolume.bindOptions &&\n !transformedVolume.tmpfsOptions\n ) {\n return `${transformedVolume.source}:${transformedVolume.target}${transformedVolume.readonly ? \":ro\" : \"\"}`\n }\n\n // Complex format with additional options\n const result: any = {\n type: transformedVolume.type || \"volume\",\n source: transformedVolume.source,\n target: transformedVolume.target,\n }\n\n if (transformedVolume.readonly) {\n result.read_only = true\n }\n\n if (transformedVolume.volumeOptions) {\n result.volume = transformedVolume.volumeOptions\n }\n\n if (transformedVolume.bindOptions) {\n result.bind = transformedVolume.bindOptions\n }\n\n if (transformedVolume.tmpfsOptions) {\n result.tmpfs = transformedVolume.tmpfsOptions\n }\n\n return result\n}\n\n/**\n * Process a volume string (source:target format) to ensure consistent path resolution\n */\nconst processVolumeString = (\n volumeString: string,\n workingDir: string,\n): string => {\n // Skip named volumes (no path separators)\n if (!volumeString.includes(\"/\") || volumeString.startsWith(\"${\")) {\n return volumeString\n }\n\n // Parse the volume string\n const parts = volumeString.split(\":\")\n if (parts.length < 2) {\n return volumeString // Invalid format, return as-is\n }\n\n const source = parts[0]\n const target = parts[1]\n const options = parts.slice(2).join(\":\") // Handle any additional options like \":ro\"\n\n // Resolve the source path\n const resolvedSource = resolveVolumePath(source, workingDir)\n\n // Reconstruct the volume string\n return options\n ? `${resolvedSource}:${target}:${options}`\n : `${resolvedSource}:${target}`\n}\n\n/**\n * Process all volumes in a service to ensure consistent path resolution\n */\nexport const processAllVolumes = (\n volumes: (string | object)[],\n workingDir: string,\n): (string | object)[] => {\n return volumes\n .map((volume) => {\n if (typeof volume === \"string\") {\n return processVolumeString(volume, workingDir)\n }\n return volume // Object volumes are already processed\n })\n .map((e) => e)\n}\n\n/**\n * Generate docker-compose.yml file from raclette configuration\n * with awareness of existing containers\n */\nexport const generateDockerCompose = async (\n config: RacletteConfig,\n workingDir: string,\n outputPath: string,\n directMode = false,\n environment: \"development\" | \"production\" = \"development\",\n checkExistingContainers = true,\n skipSharedServices = true,\n): Promise<void> => {\n // Start with basic compose structure\n const compose: any = {\n services: {},\n volumes: {\n \"yarn-cache\": {\n driver: \"local\",\n },\n },\n networks: {\n // Define the shared network that will be used across projects\n raclette_shared: {\n external: true,\n name: \"raclette_shared\",\n },\n },\n }\n\n // Current environment variables\n const envVars = config.env[environment] || {}\n\n compose.volumes[publicSharedVolume] = null\n\n // Add global volumes if defined\n if (config.volumes) {\n Object.entries(config.volumes).forEach(([volumeName, volumeConfig]) => {\n if (volumeConfig === null) {\n compose.volumes[volumeName] = null\n } else {\n // Transform all paths in the volume configuration\n compose.volumes[volumeName] = transformPaths(volumeConfig, workingDir)\n }\n })\n }\n\n // Check for existing containers if requested\n let skipMongoDB = false\n let skipCache = false\n\n if (checkExistingContainers && skipSharedServices) {\n // Check if MongoDB container already exists\n if (config.services.mongodb?.enabled && config.services.mongodb.name) {\n const mongoContainerName = config.services.mongodb.name\n\n if (containerExists(mongoContainerName)) {\n logger.debug(\n `MongoDB container '${mongoContainerName}' already exists, will be skipped`,\n )\n skipMongoDB = true\n }\n }\n\n // Check if Cache container already exists\n if (config.services.cache?.enabled && config.services.cache.name) {\n const cacheContainerName = config.services.cache.name\n\n if (containerExists(cacheContainerName)) {\n logger.debug(\n `Cache container '${cacheContainerName}' already exists, will be skipped`,\n )\n skipCache = true\n }\n }\n }\n\n // Add MongoDB service if enabled and not skipped\n if (config.services.mongodb?.enabled && !skipMongoDB) {\n // Check if this is a custom-named container or a default one\n const isCustomMongoDB = !!config.services.mongodb.name\n\n // If custom name is specified, use it exactly (for sharing)\n // Otherwise, prefix with project name (for isolation)\n const mongoContainerName = isCustomMongoDB\n ? config.services.mongodb.name\n : `${config.name}-mongodb`\n\n // Similarly for volume, use custom name if specified\n // Otherwise, prefix with project name\n const mongoVolumeName = config.services.mongodb.volume\n ? config.services.mongodb.volume\n : `${config.name}-mongodb-data`\n const mongoConfigVolumeName = config.services.mongodb.volumeConfig\n ? config.services.mongodb.volumeConfig\n : `${config.name}-mongodb-config`\n\n compose.services.mongodb = {\n container_name: `\\${RACLETTE_MONGODB_CONTAINERNAME:-${mongoContainerName}}`,\n image: \"mongo:8.2\",\n restart: \"unless-stopped\",\n ports: [\n `127.0.0.1:\\${RACLETTE_MONGODB_PORT:-${config.services.mongodb.port}}:27017`,\n ],\n volumes: [\n `\\${RACLETTE_MONGODB_VOLUME:-${mongoVolumeName}}:/data/db`,\n `\\${RACLETTE_MONGODB_CONFIG_VOLUME:-${mongoConfigVolumeName}}:/data/config`,\n ],\n networks: [\"raclette_shared\"],\n healthcheck: {\n test: [\"CMD\", \"mongosh\", \"--eval\", \"db.adminCommand('ping')\"],\n interval: \"10s\",\n timeout: \"30s\",\n retries: 20,\n },\n }\n\n // Add custom volumes if defined for MongoDB\n if (\n config.services.mongodb.volumes &&\n config.services.mongodb.volumes.length > 0\n ) {\n // Process each volume and add to the service volumes array\n config.services.mongodb.volumes.forEach((volumeDef) => {\n const processedVolume = processVolumeDefinition(volumeDef, workingDir)\n if (processedVolume)\n compose.services.mongodb.volumes.push(processedVolume)\n })\n }\n\n // Only add volume if using a named volume (not a path)\n if (!mongoVolumeName.startsWith(\"/\") && !mongoVolumeName.startsWith(\"./\")) {\n compose.volumes[mongoVolumeName] = null\n }\n if (\n !mongoConfigVolumeName.startsWith(\"/\") &&\n !mongoConfigVolumeName.startsWith(\"./\")\n ) {\n compose.volumes[mongoConfigVolumeName] = null\n }\n }\n\n // Add Cache service if enabled and not skipped\n if (config.services.cache?.enabled && !skipCache) {\n // Check if this is a custom-named container or a default one\n const isCustomCache = !!config.services.cache.name\n\n // If custom name is specified, use it exactly (for sharing)\n // Otherwise, prefix with project name (for isolation)\n const cacheContainerName = isCustomCache\n ? config.services.cache.name\n : `${config.name}-cache`\n\n // Similarly for volume, use custom name if specified\n // Otherwise, prefix with project name\n const cacheVolumeName = config.services.cache.volume\n ? config.services.cache.volume\n : `${config.name}-cache-data`\n\n compose.services.cache = {\n container_name: `\\${RACLETTE_CACHE_CONTAINERNAME:-${cacheContainerName}}`,\n image: \"valkey/valkey:9.0-alpine\",\n ports: [\n `127.0.0.1:\\${RACLETTE_CACHE_PORT:-${config.services.cache.port}}:6379`,\n ],\n volumes: [`\\${RACLETTE_CACHE_VOLUME:-${cacheVolumeName}}:/data`],\n networks: [\"raclette_shared\"],\n healthcheck: {\n test: [\"CMD\", \"valkey-cli\", \"ping\"],\n interval: \"10s\",\n timeout: \"5s\",\n retries: 3,\n },\n }\n\n const RDB_OPTIONS =\n config?.backend?.cache?.RDB_OPTIONS ?? \"3600 1 300 100 60 10000\"\n const persistence = config?.backend?.cache?.persistence || \"none\"\n if (persistence === \"none\") {\n compose.services.cache.command = 'valkey-server --save \"\"'\n }\n if (persistence === \"aof\") {\n compose.services.cache.command = \"valkey-server --appendonly yes\"\n }\n if (persistence === \"rdb\") {\n compose.services.cache.command = \"valkey-server --save \" + RDB_OPTIONS\n }\n if (persistence === \"rdb+aof\") {\n compose.services.cache.command =\n \"valkey-server --appendonly yes --save \" + RDB_OPTIONS\n }\n // Add custom volumes if defined for Cache\n if (\n config.services.cache.volumes &&\n config.services.cache.volumes.length > 0\n ) {\n // Process each volume and add to the service volumes array\n config.services.cache.volumes.forEach((volumeDef) => {\n const processedVolume = processVolumeDefinition(volumeDef, workingDir)\n if (processedVolume)\n compose.services.cache.volumes.push(processedVolume)\n })\n }\n\n // Only add volume if using a named volume (not a path)\n if (!cacheVolumeName.startsWith(\"/\") && !cacheVolumeName.startsWith(\"./\")) {\n compose.volumes[cacheVolumeName] = null\n }\n }\n\n // Only add app services if not in direct mode\n if (!directMode) {\n const debugPort =\n process.env.RACLETTE_DEBUG_PORT ||\n (config.services?.backend?.enableDebug ? 9229 : undefined)\n\n // Add backend service if enabled\n if (config.services.backend?.enabled) {\n // Allow custom container name or use default\n const backendContainerName =\n config.services.backend.name ?? `${config.name}-backend`\n // Allow custom node_modules volume name or use default\n const backendNodeModulesVolume =\n config.services.backend.nodeModulesVolume ||\n `${config.name}-backend_node_modules`\n\n compose.services.backend = {\n container_name: `\\${RACLETTE_SERVER_CONTAINERNAME:-${backendContainerName}}`,\n build: {\n context: \".\",\n dockerfile: \"./backend.Dockerfile\",\n args: {\n NODE_ENV: environment,\n },\n },\n command: debugPort ? \"yarn run dev:inspect\" : \"yarn dev\",\n // user: `${process.getuid()}:${process.getgid()}`,\n // command: \"tail -f /dev/null &\", // use this command to start the containers without a default command, for in-container debugging stuff\n environment: [\n `NODE_ENV=\\${NODE_ENV:-${environment}}`,\n \"DISABLE_PLUGIN_LOGS=${RACLETTE_DISABLE_PLUGIN_LOGS:-false}\",\n \"SERVER_TOKEN_SECRET=${RACLETTE_SERVER_TOKEN_SECRET:-thisshouldbesetforproduction}\",\n \"RACLETTE_FRONTEND_URLS=${RACLETTE_FRONTEND_URLS:-}\",\n `MONGO_HOST=\\${RACLETTE_MONGODB_HOST:-mongodb://mongodb:\\${RACLETTE_MONGODB_PORT:-${config.services.mongodb?.port || 27017}}/\\${RACLETTE_MONGODB_DATABASE:-${config.services.mongodb?.databaseName || config.name}}}`,\n `CACHE_URL=\\${RACLETTE_CACHE_URL:-redis://cache:\\${RACLETTE_CACHE_PORT:-${config.services.cache?.port || 6379}}}${config.services.cache?.db ? `/${config.services.cache?.db}` : \"\"}`,\n ...Object.entries(envVars).map(([key, value]) => `${key}=${value}`),\n ],\n volumes: [\n \"yarn-cache:/usr/local/share/.cache/yarn\",\n `${backendNodeModulesVolume}:/app/node_modules`,\n // Use virtual directory for core files\n \"./.raclette/virtual/backend/src:/app/src\",\n // Keep plugins as a separate mount point\n \"./plugins:/app/src/appPlugins\",\n // Add configuration files as volumes (only in development mode)\n ...(environment === \"development\"\n ? [\n \"./.raclette/backend/raclette.config.js:/app/raclette.config.js\",\n // sync lock file\n `${getServiceLockFilePath(\"backend\", config)}:/app/yarn.lock`,\n ]\n : []),\n ],\n ports: [\n `\\${RACLETTE_SERVER_PORT:-${config.services.backend.port}}:3000`,\n ...(debugPort ? [`${debugPort || \"9229\"}:9229`] : []),\n ],\n networks: [\"raclette_shared\"],\n depends_on: {},\n healthcheck: {\n test: [\"CMD\", \"curl\", \"-f\", \"http://0.0.0.0:3000/health\"],\n interval: \"10s\",\n timeout: \"30s\",\n retries: 10,\n },\n }\n\n if (\n config.services.backend.volumes &&\n config.services.backend.volumes.length > 0\n ) {\n // Add custom volumes if defined for backend\n // Process each volume and add to the service volumes array\n config.services.backend.volumes.forEach((volumeDef) => {\n const processedVolume = processVolumeDefinition(volumeDef, workingDir)\n if (processedVolume)\n compose.services.backend.volumes.push(processedVolume)\n })\n }\n\n if (config.services.mongodb?.enabled && !skipMongoDB) {\n // Add dependencies only for services that are included\n compose.services.backend.depends_on.mongodb = {\n condition: \"service_started\",\n }\n }\n\n if (config.services.cache?.enabled && !skipCache) {\n compose.services.backend.depends_on.cache = {\n condition: \"service_healthy\",\n }\n }\n\n // If no dependencies, remove the empty depends_on object\n if (Object.keys(compose.services.backend.depends_on).length === 0) {\n delete compose.services.backend.depends_on\n }\n\n compose.volumes[backendNodeModulesVolume] = null\n }\n\n // Add frontend service if enabled\n if (config.services.frontend?.enabled) {\n // Allow custom container name or use default\n const frontendContainerName =\n config.services.frontend.name ?? `${config.name}-frontend`\n // Allow custom node_modules volume name or use default\n const frontendNodeModulesVolume =\n config.services.frontend.nodeModulesVolume ||\n `${config.name}-frontend_node_modules`\n const frontendInternalPort = 8081 // currently hardcoded in vite\n\n compose.services.frontend = {\n container_name: `\\${RACLETTE_CLIENT_CONTAINERNAME:-${frontendContainerName}}`,\n build: {\n context: \".\",\n dockerfile: \"./frontend.Dockerfile\",\n args: {\n NODE_ENV: `\\${NODE_ENV:-${environment}}`,\n },\n target: `\\${NODE_ENV:-${environment}}`,\n },\n command: \"yarn dev\",\n // command: \"tail -f /dev/null &\", // use this command to start the containers without a default command, for in-container debugging stuff\n depends_on: {},\n environment: [\n `NODE_ENV=\\${NODE_ENV:-${environment}}`,\n \"RACLETTE_DEBUG_MODE=${RACLETTE_DEBUG_MODE:-true}\",\n `RACLETTE_SERVER_BASE_URL=\\${RACLETTE_SERVER_BASE_URL:-http://localhost:\\${RACLETTE_SERVER_PORT:-${config.services.backend?.port || 8082}}}`,\n `RACLETTE_SOCKET_URL=\\${RACLETTE_SOCKET_URL:-http://localhost:\\${RACLETTE_SERVER_PORT:-${config.services.backend?.port || 8082}}}`,\n ...Object.entries(envVars).map(([key, value]) => `${key}=${value}`),\n ],\n volumes: [\n \"yarn-cache:/usr/local/share/.cache/yarn\",\n // Use virtual directory for core files\n \"./.raclette/virtual/frontend/src:/app/src\",\n // Mount shared types from backend\n \"./.raclette/virtual/backend/src/shared:/app/src/shared\",\n `${frontendNodeModulesVolume}:/app/node_modules`,\n // Keep plugins as separate mount points\n \"./plugins:/app/src/plugins\",\n \"./.raclette/virtual/backend/src/corePlugins:/app/src/corePlugins\",\n // Add configuration files as volumes (only in development mode)\n ...(environment === \"development\"\n ? [\n \"./.raclette/frontend/raclette.config.js:/app/raclette.config.js\",\n // sync lock file\n `${getServiceLockFilePath(\"frontend\", config)}:/app/yarn.lock`,\n ]\n : []),\n ],\n ports: [\n `\\${RACLETTE_CLIENT_PORT:-${config.services.frontend.port}}:8081`,\n ],\n networks: [\"raclette_shared\"],\n healthcheck: {\n test: [\"CMD\", \"curl\", \"-f\", `http://0.0.0.0:8081/`],\n interval: \"10s\",\n timeout: \"30s\",\n retries: 10,\n },\n }\n\n // add dev env specific docker code\n if (environment !== \"production\") {\n // frontend\n compose.services.frontend.volumes.push(\n \"./.raclette/dist/check-dependencies.sh:/app/check-dependencies.sh\",\n )\n compose.services.frontend.volumes.push(\n \"./.raclette/frontend/package.json:/app/package.json\",\n )\n compose.services.frontend.entrypoint = [\"/app/check-dependencies.sh\"]\n\n // backend\n compose.services.backend.volumes.push(\n \"./.raclette/dist/check-dependencies.sh:/app/check-dependencies.sh\",\n )\n compose.services.backend.entrypoint = [\"/app/check-dependencies.sh\"]\n compose.services.backend.volumes.push(\n \"./.raclette/backend/package.json:/app/package.json\",\n )\n }\n\n // Add custom volumes if defined for frontend\n if (\n config.services.frontend.volumes &&\n config.services.frontend.volumes.length > 0\n ) {\n // Process each volume and add to the service volumes array\n config.services.frontend.volumes.forEach((volumeDef) => {\n const processedVolume = processVolumeDefinition(volumeDef, workingDir)\n if (processedVolume)\n compose.services.frontend.volumes.push(processedVolume)\n })\n }\n\n // Add dependencies only if backend is included\n if (config.services.backend?.enabled) {\n compose.services.frontend.depends_on.backend = {\n condition: \"service_healthy\",\n }\n }\n\n // If no dependencies, remove the empty depends_on object\n if (Object.keys(compose.services.frontend.depends_on).length === 0) {\n delete compose.services.frontend.depends_on\n }\n\n compose.volumes[frontendNodeModulesVolume] = null\n }\n\n // CORE DEVELOPMENT - specific settings if the base path is set\n if (config.env?.development?.RACLETTE_CORE_ABSOLUTE_PATH) {\n const corePath = config.env?.development?.RACLETTE_CORE_ABSOLUTE_PATH\n const normalizedPath =\n corePath && !corePath.endsWith(\"/\") ? corePath + \"/\" : corePath\n\n // we mount everything to the core data where we expect auto-generation\n compose.services.backend?.volumes?.push(\n `${normalizedPath}services/backend/src/corePlugins:/app/src/corePlugins`,\n // `${normalizedPath}services/backend/src/shared/types/core:/app/src/shared/types/core`,\n // `${normalizedPath}services/backend/src/shared/schemas/core:/app/src/shared/schemas/core`,\n )\n compose.services.frontend?.volumes?.push(\n `${normalizedPath}services/backend/src/corePlugins:/app/src/corePlugins`,\n )\n }\n }\n\n // Process all volumes in all services to ensure consistent path resolution\n Object.values(compose.services).forEach((service: any) => {\n if (service.volumes) {\n service.volumes = processAllVolumes(service.volumes, workingDir)\n }\n })\n\n // Write the processed compose file\n await fs.writeFile(outputPath, yaml.dump(compose))\n\n // Also generate Dockerfiles\n await generateDockerfiles(config, path.dirname(outputPath), environment)\n}\n\n/**\n * Get the lock file path for a service from config or default\n */\nexport const getServiceLockFilePath = (\n service: \"frontend\" | \"backend\",\n config: RacletteConfig,\n): string => {\n // Check if custom path is configured\n const customPath = config.lockFiles?.[service]\n\n if (customPath) {\n return customPath\n }\n\n // Default path\n const defaultPath = `./${service}.yarn.lock`\n return defaultPath\n}\n\n/**\n * Generate a \"full\" docker-compose file that includes all services,\n * even those that already exist. This is useful for the 'down' command\n * to ensure all services can be properly stopped.\n */\nexport const generateFullDockerCompose = async (\n config: RacletteConfig,\n workingDir: string,\n outputPath: string,\n environment: \"development\" | \"production\" = \"development\",\n): Promise<void> => {\n // Generate a compose file with all services, never skipping existing ones\n await generateDockerCompose(\n config,\n workingDir,\n outputPath,\n false, // Never direct mode for full compose\n environment,\n false, // Don't check for existing containers\n false, // Don't skip shared services\n )\n}\n\n/**\n * Generate Dockerfiles for frontend and backend\n */\nexport const generateDockerfiles = async (\n config: RacletteConfig,\n outputDir: string,\n environment: \"development\" | \"build\" | \"production\",\n): Promise<void> => {\n // Server Dockerfile\n const backendDockerfilePath = path.join(outputDir, \"backend.Dockerfile\")\n const backendDockerfile = `FROM node:24.4-alpine3.21\nWORKDIR /app\n\n# add bash since alpine doesn't come with a shell\nRUN apk update && apk add bash curl ${(config.services.backend?.installPackages || []).join(\" \")}\n\nCOPY backend/package.json backend/yarn.lock ./\nCOPY backend/raclette.config.js ./\n\nARG NODE_ENV=${environment}\n\n# until we are published we can't install here due to the sensitive files\n#RUN if [ \"$NODE_ENV\" = \"development\" ]; \\\\\n# then yarn install; \\\\\n# else yarn install --production=true; \\\\\n# fi;\n\n# make sure our raclette packages are being resolved by adding a symlink to handle nodes module resolution\nRUN mkdir -p /app/node_modules/@raclettejs/core\nRUN ln -sf /app/src /app/node_modules/@raclettejs/core/backend\n\nCOPY ./dist/check-dependencies.sh /app/\nRUN chmod +x /app/check-dependencies.sh\n\n# copy everything else that is not ignored (see .dockerignore)\nCOPY ./virtual/backend ./\n\n# set default values\nENV PORT 3000\n\n# set port\nEXPOSE 3000\nEXPOSE 9229\n\n# default command\nCMD [\"yarn\", \"run\", \"${environment === \"production\" ? \"build\" : \"dev\"}\"]\n`\n\n await fs.writeFile(backendDockerfilePath, backendDockerfile)\n\n // Frontend Dockerfile\n const frontendDockerfilePath = path.join(outputDir, \"frontend.Dockerfile\")\n const frontendDockerfile = `FROM node:24-alpine3.21 AS build\nWORKDIR /app\n\nRUN apk update && apk add bash curl ${(config.services.frontend?.installPackages || []).join(\" \")}\n\n# Copy package files first for better caching\nCOPY frontend/package.json frontend/yarn.lock ./\nCOPY frontend/raclette.config.js ./\n\nARG NODE_ENV=${environment}\n\n# until we are published we can't install here due to the sensitive files\n# Install dependencies\n#RUN if [ \"$NODE_ENV\" = \"development\" ]; \\\\\n# then yarn install; \\\\\n# else yarn install --production=false; \\\\\n# fi\n\n# Copy source files - we'll handle development overrides through volumes\nCOPY ./virtual/frontend/ ./\n\nCOPY ./dist/check-dependencies.sh /app/\nRUN chmod +x /app/check-dependencies.sh\n\nRUN rm -rf ./src/shared\n\n# Now copy the actual shared folder - be explicit with the path\nCOPY virtual/backend/src/shared/ ./src/shared/\n\n# Ports\nENV PORT ${config.services.frontend?.port || 8081}\nEXPOSE ${config.services.frontend?.port || 8081}\n\n# Add development target\nFROM build AS development\nCMD [\"yarn\", \"run\", \"dev\"]\n\n# ----------------------------------------------------------------\n# 2. production stage\n# Here we will use a new docker image, which is only the web server\nFROM nginx:stable-alpine AS production\nWORKDIR /app\n\n# Copy nginx config as a template\nCOPY frontend/provision/nginx.conf /etc/nginx/conf.d/default.conf.template\n\nCOPY --from=build app/dist /usr/share/nginx/html\nCOPY frontend/provision/entrypoint.sh /docker-entrypoint.d/entrypoint.sh\n\n# Make sure the entrypoint is executable\nRUN chmod +x /docker-entrypoint.d/entrypoint.sh\n\nENV PORT 80\nEXPOSE 80\n\nCMD [\"nginx\", \"-g\", \"daemon off;\"]`\n\n await fs.writeFile(frontendDockerfilePath, frontendDockerfile)\n}\n", "import chalk from \"chalk\"\nimport { execSync } from \"child_process\"\nimport fs from \"fs-extra\"\nimport { logger } from \"src/logger\"\n\nexport interface DockerInfo {\n dockerPath: string\n composeCommand: string\n isModernCompose: boolean\n version: string\n isDocker28Plus: boolean\n}\n\nlet cachedDockerInfo: DockerInfo | null = null\n\n/**\n * Get comprehensive Docker information with caching\n */\nexport const getDockerInfo = (): DockerInfo => {\n // Return cached info if available\n if (cachedDockerInfo) {\n return cachedDockerInfo\n }\n\n const dockerPath = findDockerPath()\n const version = getDockerVersion(dockerPath)\n const composeCommand = dockerPath // Always use modern Docker compose\n const isModernCompose = true // Only support modern Docker compose\n const isDocker28Plus = checkIsDocker28Plus(version)\n\n cachedDockerInfo = {\n dockerPath,\n composeCommand,\n isModernCompose,\n version,\n isDocker28Plus,\n }\n\n return cachedDockerInfo\n}\n\n/**\n * Clear the Docker info cache (useful for testing or if Docker changes)\n */\nexport const clearDockerCache = (): void => {\n cachedDockerInfo = null\n}\n\n/**\n * Find Docker executable path\n */\nconst findDockerPath = (): string => {\n try {\n let dockerPath: string\n\n if (process.platform === \"win32\") {\n dockerPath = execSync(\"where docker\", {\n stdio: \"pipe\",\n encoding: \"utf8\",\n })\n .trim()\n .split(\"\\n\")[0]\n } else {\n dockerPath = execSync(\"which docker\", {\n stdio: \"pipe\",\n encoding: \"utf8\",\n }).trim()\n }\n\n // Verify Docker is actually executable\n try {\n execSync(`\"${dockerPath}\" --version`, { stdio: \"pipe\" })\n return dockerPath\n } catch (error) {\n throw new Error(`Docker found at ${dockerPath} but not executable`)\n }\n } catch (error) {\n // Check common installation paths as fallback\n const commonPaths = [\n \"/Applications/Docker.app/Contents/Resources/bin/docker\", // macOS Docker Desktop\n \"/usr/local/bin/docker\", // macOS typical location\n \"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\bin\\\\docker.exe\", // Windows Docker Desktop\n \"C:\\\\Program Files\\\\Docker\\\\Docker\\\\resources\\\\docker.exe\", // Windows Docker Desktop alternative\n \"/usr/bin/docker\", // Linux typical location\n \"/snap/docker/current/bin/docker\", // Linux snap\n ]\n\n for (const commonPath of commonPaths) {\n if (fs.existsSync(commonPath)) {\n try {\n execSync(`\"${commonPath}\" --version`, { stdio: \"pipe\" })\n logger.debug(chalk.yellow(`Found Docker at: ${commonPath}`))\n return commonPath\n } catch (error) {\n // Continue checking other paths\n }\n }\n }\n\n throw new Error(\"Docker not found in PATH or common installation locations\")\n }\n}\n\n/**\n * Get Docker version\n */\nconst getDockerVersion = (dockerPath: string): string => {\n try {\n const versionOutput = execSync(`\"${dockerPath}\" --version`, {\n stdio: \"pipe\",\n encoding: \"utf8\",\n })\n return versionOutput.trim()\n } catch (error) {\n console.warn(chalk.yellow(\"Could not determine Docker version\"))\n return \"unknown\"\n }\n}\n\n/**\n * Check if this is Docker 28+ (stricter path handling)\n */\nconst checkIsDocker28Plus = (version: string): boolean => {\n const versionMatch = version.match(/Docker version (\\d+)\\.(\\d+)/)\n if (!versionMatch) return false\n\n const majorVersion = parseInt(versionMatch[1])\n const minorVersion = parseInt(versionMatch[2])\n\n return majorVersion > 28 || (majorVersion === 28 && minorVersion >= 0)\n}\n\n/**\n * Verify Docker is installed and running\n */\nexport const checkDockerInstallation = (): DockerInfo => {\n logger.raw(chalk.blue(\"\uD83D\uDC33 Checking Docker installation...\"))\n\n try {\n const dockerInfo = getDockerInfo()\n\n logger.debug(`\u2705 Docker found at: ${dockerInfo.dockerPath}`)\n logger.debug(`Docker version: ${dockerInfo.version}`)\n\n // Verify modern Docker Compose is available\n try {\n execSync(`\"${dockerInfo.dockerPath}\" compose version`, { stdio: \"pipe\" })\n logger.debug(\"\u2705 Docker Compose (modern) is available\")\n } catch (error) {\n console.error(chalk.red(\"\\n\u274C Modern Docker Compose is not available\"))\n console.warn(\n chalk.yellow(\n \"\\n\uD83D\uDCCB Raclette requires Docker with integrated 'compose' command\",\n ),\n )\n console.warn(\n chalk.yellow(\n \"Please update to Docker version 20.10.13+ or Docker Desktop 4.1.0+\",\n ),\n )\n throw new Error(\"Modern Docker Compose is required\")\n }\n\n if (dockerInfo.isDocker28Plus) {\n logger.debug(\"\u26A0\uFE0F Detected Docker 28+, using enhanced path resolution\")\n }\n\n // Verify Docker daemon is running\n try {\n execSync(`\"${dockerInfo.dockerPath}\" info`, {\n stdio: \"pipe\",\n encoding: \"utf8\",\n })\n logger.success(\" Docker daemon is running\")\n } catch (error) {\n logger.error(\"Docker daemon is not running\")\n logger.warn(\n \"Please start Docker Desktop or the Docker daemon and try again.\",\n )\n\n // Platform-specific messages for starting Docker\n if (process.platform === \"darwin\") {\n console.log(\n chalk.yellow(\n \"\\n macOS: Start Docker Desktop from the Applications folder\",\n ),\n )\n } else if (process.platform === \"win32\") {\n console.log(\n chalk.yellow(\n \"\\n Windows: Start Docker Desktop from the Start menu\",\n ),\n )\n } else {\n console.log(\n chalk.yellow(\n '\\n Linux: Start Docker daemon with \"systemctl start docker\"',\n ),\n )\n }\n\n throw new Error(\"Docker daemon is not running\")\n }\n\n return dockerInfo\n } catch (error: any) {\n if (\n error.message.includes(\"Docker daemon is not running\") ||\n error.message.includes(\"Modern Docker Compose is required\")\n ) {\n throw error // Re-throw daemon and compose errors\n }\n\n logger.error(\"Docker installation issue: \" + error.message)\n\n // Provide detailed guidance for installation\n console.log(chalk.yellow(\"\\n\uD83D\uDCE5 Installation guide:\"))\n console.log(\n chalk.yellow(\" \u2022 Mac: https://docs.docker.com/desktop/install/mac/\"),\n )\n console.log(\n chalk.yellow(\n \" \u2022 Windows: https://docs.docker.com/desktop/install/windows/\",\n ),\n )\n console.log(\n chalk.yellow(\" \u2022 Linux: https://docs.docker.com/engine/install/\"),\n )\n\n throw new Error(\"Docker is not installed or not accessible\")\n }\n}\n\n/**\n * Execute a Docker command with proper path and error handling\n */\nexport const executeDockerCommand = (\n args: string[],\n options: {\n stdio?: \"inherit\" | \"pipe\"\n encoding?: BufferEncoding\n cwd?: string\n shell?: boolean\n } = {},\n): string => {\n const dockerInfo = getDockerInfo()\n const command = `\"${dockerInfo.dockerPath}\" ${args.join(\" \")}`\n\n try {\n const result = execSync(command, {\n ...options,\n stdio: options.stdio || \"pipe\",\n encoding:\n options.stdio === \"inherit\" ? undefined : options.encoding || \"utf8\",\n shell: true,\n })\n\n return typeof result === \"string\" ? result : \"\"\n } catch (error) {\n throw new Error(\n `Docker command failed: ${command}\\nError: ${error.message}`,\n )\n }\n}\n\n/**\n * Execute a Docker Compose command with proper path and error handling\n */\nexport const executeDockerComposeCommand = (\n args: string[],\n options: {\n stdio?: \"inherit\" | \"pipe\"\n encoding?: BufferEncoding\n cwd?: string\n shell?: boolean\n } = {},\n): string => {\n const dockerInfo = getDockerInfo()\n\n // Always use modern Docker compose syntax\n const command = `\"${dockerInfo.composeCommand}\" compose ${args.join(\" \")}`\n\n logger.debug(`Execute Docker Command: ${command}`)\n\n try {\n const result = execSync(command, {\n stdio: \"pipe\",\n encoding: \"utf8\",\n shell: true,\n ...options,\n })\n\n return typeof result === \"string\" ? result : \"\"\n } catch (error) {\n throw new Error(`Docker Compose command failed: ${command}\\nError: ${error.message}`)\n }\n}\n\n/**\n * Check if a container exists\n */\nexport const containerExists = (containerName: string): boolean => {\n try {\n const result = executeDockerCommand([\n \"ps\",\n \"-a\",\n \"--filter\",\n `name=^${containerName}$`,\n \"--format\",\n '\"{{.Names}}\"',\n ])\n\n return result\n .trim()\n .split(\"\\n\")\n .some((name) => name.trim() === containerName)\n } catch (error) {\n return false\n }\n}\n\n/**\n * Check if a container is running\n */\nexport const isContainerRunning = (containerName: string): boolean => {\n try {\n const result = executeDockerCommand([\n \"ps\",\n \"--filter\",\n `name=^${containerName}$`,\n \"--format\",\n '\"{{.Names}}\"',\n ])\n\n return result\n .trim()\n .split(\"\\n\")\n .some((name) => name.trim() === containerName)\n } catch (error) {\n return false\n }\n}\n\n/**\n * Create Docker network if it doesn't exist\n */\nexport const ensureDockerNetwork = (networkName: string): void => {\n logger.debug(`\uD83C\uDF10 Checking for Docker network '${networkName}'...`)\n\n try {\n // Cross-platform existence check (no shell pipes/grep).\n executeDockerCommand([\"network\", \"inspect\", networkName])\n logger.debug(`\u2705 Network '${networkName}' already exists`)\n return\n } catch (error) {\n // Network doesn't exist, create it.\n logger.debug(`\uD83C\uDF10 Creating Docker network '${networkName}'...`)\n try {\n executeDockerCommand([\"network\", \"create\", networkName], {\n stdio: \"inherit\",\n })\n logger.debug(`\u2705 Network '${networkName}' created`)\n } catch (networkError: any) {\n // Docker can race and return \"already exists\" if another process created it.\n if (networkError.message?.includes(\"already exists\")) {\n logger.debug(`\u2705 Network '${networkName}' already exists`)\n return\n }\n logger.error(`Failed to create network: ` + networkError.message)\n throw networkError\n }\n }\n}\n\n/**\n * Execute command inside a container\n */\nexport const executeInContainer = (\n containerName: string,\n command: string,\n options: {\n stdio?: \"inherit\" | \"pipe\"\n encoding?: BufferEncoding\n } = {},\n): string => {\n return executeDockerCommand(\n [\"exec\", containerName, \"sh\", \"-c\", `\"${command}\"`],\n options,\n )\n}\n\n/**\n * Find containers by name prefix\n */\nexport const findContainersByPrefix = (prefix: string): string[] => {\n try {\n const result = executeDockerCommand([\n \"ps\",\n \"-a\",\n \"--filter\",\n `name=^${prefix}`,\n \"--format\",\n '\"{{.Names}}\"',\n ])\n\n return result.trim()\n ? result\n .trim()\n .split(\"\\n\")\n .filter((name) => name.trim().length > 0)\n : []\n } catch (error) {\n return []\n }\n}\n\n/**\n * Stop and remove containers by name prefix\n */\nexport const stopContainersByPrefix = (prefix: string): void => {\n const containerNames = findContainersByPrefix(prefix)\n\n if (containerNames.length === 0) {\n logger.debug(`\u26A0\uFE0F No containers found with prefix '${prefix}'`)\n return\n }\n\n logger.debug(\n `\u26A0\uFE0F Found ${containerNames.length} container(s) with prefix '${prefix}':`,\n )\n containerNames.forEach((name) => {\n logger.debug(` - ${name}`)\n })\n\n try {\n // Stop all containers\n logger.debug(\"Stopping containers...\")\n executeDockerCommand([\"stop\", ...containerNames], {\n stdio: \"inherit\",\n })\n\n // Remove all containers\n logger.debug(\"Removing containers...\")\n executeDockerCommand([\"rm\", ...containerNames], {\n stdio: \"inherit\",\n })\n\n logger.success(\n `Successfully stopped and removed ${containerNames.length} container(s)`,\n )\n } catch (error: any) {\n logger.error(\n `Failed to stop containers with prefix '${prefix}': ${error.message}`,\n )\n throw error\n }\n}\n", "// docker-tracker.ts\nimport type { RacletteConfig } from \"./types\"\nimport { Services } from \"./types\"\nimport chalk from \"chalk\"\nimport fs from \"fs-extra\"\nimport path from \"path\"\nimport { executeDockerComposeCommand } from \"./docker-utils\"\nimport { logger } from \"src/logger\"\n\n/**\n * Interface representing a tracked service file\n */\ninterface TrackedServiceFile {\n type: \"dockerfile\" | \"package\" // The type of file being tracked\n service: string // Which service this belongs to (frontend, backend, etc)\n content: string // Content hash or actual content for comparison\n timestamp: number // When it was last updated\n}\n\n/**\n * Storage structure for tracked files\n */\ninterface TrackedFilesStorage {\n files: TrackedServiceFile[]\n version: string // Version of the tracking system\n}\n\n/**\n * Options for rebuilding services\n */\ninterface RebuildOptions {\n noCache?: boolean\n}\n\n/**\n * Tracks changes in service files and detects when rebuilds are necessary\n */\nexport const trackServiceFiles = async (\n config: RacletteConfig,\n racletteDir: string,\n forceRebuild?: boolean,\n): Promise<string[]> => {\n return Services.filter( e => forceRebuild || config.services[e]?.enabled )\n}\n\n/**\n * Rebuild services that have changed\n */\nexport const rebuildChangedServices = async (\n config: RacletteConfig,\n racletteDir: string,\n services: string[],\n options: RebuildOptions = {}\n): Promise<void> => {\n if (services.length === 0) return\n\n console.log(chalk.blue(`\uD83D\uDD04 Rebuilding services: ${services.join(\", \")}`))\n\n const dockerComposePath = path.join(racletteDir, \"docker-compose.yml\")\n const projectName = config.name ?? path.basename(process.cwd())\n const buildArgs = [\"-p\", projectName, \"-f\", dockerComposePath, \"build\"]\n if (options.noCache) buildArgs.push(\"--no-cache\")\n\n for (const service of services) {\n try {\n console.log(chalk.blue(`\uD83D\uDD04 Rebuilding ${service} service...`))\n executeDockerComposeCommand( [ ...buildArgs, service ], { stdio: \"inherit\" })\n logger.success(` Service ${service} rebuilt successfully`)\n } catch (error: any) {\n logger.error(`Error rebuilding service ${service}: ${error.message}`)\n // Always try to build all requested services, even if one fails\n }\n }\n}\n", "import type { RacletteConfig } from \"../types\"\nimport fs from \"fs-extra\"\nimport path from \"path\"\nimport { getCoreConfig, getCoreImports } from \"./configs/core\"\nimport { getReactConfig, getReactImports } from \"./configs/react\"\nimport {\n getTypeScriptConfig,\n getTypeScriptImports,\n} from \"./configs/typescript\"\nimport { getVueConfig, getVueImports } from \"./configs/vue\"\nimport { getAllDependencies } from \"./dependencies\"\nimport { generateInstallCommand } from \"./utils\"\nimport { logger } from \"src/logger\"\n\n/**\n * Generate an ESLint config file in the .raclette directory\n * This will be used as a base configuration that app projects can extend\n */\nexport const generateEslintConfig = async (\n config: RacletteConfig,\n outputDir: string,\n withReadme = true,\n): Promise<void> => {\n const eslintConfigPath = path.join(outputDir, \"eslint.config.mjs\")\n\n logger.debug(`Generating eslint.config.mjs in ${outputDir}`)\n\n // Default to true if not specified\n const useRecommended = config.eslint?.useRecommended !== false\n\n // Generate imports section\n const imports = generateImports(config, useRecommended)\n\n // Generate configuration sections\n const configSections = []\n\n // Add TypeScript base rules config instead of using tseslint.configs.recommended\n configSections.push(` // TS ESLint base rules\n {\n files: [\"**/*.{ts,tsx}\"],\n plugins: {\n '@typescript-eslint': tseslint.plugin\n },\n languageOptions: {\n parser: tseslint.parser\n },\n rules: {\n // Essential TypeScript syntax rules - equivalent to tseslint.configs.recommended\n \"@typescript-eslint/ban-ts-comment\": \"warn\",\n \"@typescript-eslint/no-explicit-any\": \"warn\",\n \"@typescript-eslint/no-var-requires\": \"error\",\n \"@typescript-eslint/no-empty-interface\": \"warn\",\n \"@typescript-eslint/no-inferrable-types\": \"warn\",\n \"@typescript-eslint/no-non-null-asserted-optional-chain\": \"error\",\n \"@typescript-eslint/no-non-null-assertion\": \"warn\",\n \"@typescript-eslint/no-unnecessary-type-constraint\": \"error\"\n }\n }`)\n\n // Add core ignores\n configSections.push(` // Ignore patterns\n {\n ignores: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/coverage/**\",\n \"**/*.d.ts\",\n \".raclette/**\",\n \".gitignore\"\n ]\n }`)\n\n // Add core JavaScript config\n configSections.push(getCoreConfig(useRecommended))\n\n // Add TypeScript config\n configSections.push(getTypeScriptConfig(useRecommended))\n\n // Add Vue config if needed\n if (config.frontend?.framework === \"vue\") {\n configSections.push(getVueConfig(useRecommended))\n }\n\n // Add React config if needed\n if (config.frontend?.framework === \"react\") {\n configSections.push(getReactConfig(useRecommended))\n }\n\n // Add user custom rules if any\n if (config.eslint?.rules && Object.keys(config.eslint.rules).length > 0) {\n const rulesStr = JSON.stringify(config.eslint.rules, null, 2).replace(\n /\"([^\"]+)\":/g,\n \"$1:\",\n ) // Convert \"key\": to key:\n\n configSections.push(` // User custom rules\n {\n rules: ${rulesStr}\n }`)\n }\n\n // Add user custom ignores if any\n if (config.eslint?.ignores && config.eslint.ignores.length > 0) {\n const ignoresStr = JSON.stringify(config.eslint.ignores).replace(\n /^\\[|\\]$/g,\n \"\",\n ) // Remove square brackets\n\n configSections.push(` // User custom ignores\n {\n ignores: [${ignoresStr}]\n }`)\n }\n\n // Add Prettier config (always include)\n configSections.push(` // Prettier config (must be last)\n {\n rules: {\n ...eslintConfigPrettier.rules\n }\n }`)\n\n // Generate the full config file\n const eslintConfigContent = `/*#############################################################\n \nGenerated ESLint Configuration for ${config.name || \"raclette\"}\nThis file is auto-generated and should not be edited directly\nExtend this config in your project's eslint.config.mjs\n\n#############################################################*/\n\n// Import required plugins and parsers\n${imports.join(\"\\n\")}\n\n// Exported configuration that can be extended\nexport const racletteEslintConfig = [\n${configSections.join(\",\\n\\n\")}\n]\n\n// Helper function for extending the config\nexport const withRaclette = (...userConfigs) => {\n // Simple array concatenation\n return [...racletteEslintConfig, ...userConfigs.flat()];\n}\n\n// Default export for direct usage\nexport default racletteEslintConfig\n`\n\n // Write the eslint.config.mjs file\n await fs.writeFile(eslintConfigPath, eslintConfigContent)\n\n // Generate a readme or guidance file explaining how to use the config\n if (withReadme) {\n await generateEslintReadme(outputDir, config)\n }\n\n logger.debug(`Generated eslint.config.mjs in ${outputDir}`)\n}\n\n/**\n * Generate the imports section of the ESLint config\n */\nconst generateImports = (\n config: RacletteConfig,\n useRecommended: boolean,\n): string[] => {\n const imports = []\n\n // Add core imports\n imports.push(...getCoreImports())\n\n // Add TypeScript imports\n imports.push(...getTypeScriptImports(useRecommended))\n\n // Add framework-specific imports\n if (config.frontend?.framework === \"vue\") {\n imports.push(...getVueImports())\n } else if (config.frontend?.framework === \"react\") {\n imports.push(...getReactImports())\n }\n\n return imports\n}\n\n/**\n * Generate a helpful README for using the ESLint config\n */\nconst generateEslintReadme = async (\n outputDir: string,\n config: RacletteConfig,\n): Promise<void> => {\n const readmePath = path.join(outputDir, \"ESLINT-README.md\")\n\n const allDeps = getAllDependencies(config)\n const installCommand = generateInstallCommand(allDeps)\n\n const readmeContent = `# racletteJS ESLint Configuration\n \nThis directory contains an auto-generated ESLint configuration for your racletteJS project.\n \n## Required Dependencies\n \nTo use this ESLint configuration, you need to install the following dependencies:\n \n\\`\\`\\`bash\n${installCommand}\n\\`\\`\\`\n \n## How to Use\n \nCreate an \\`eslint.config.mjs\\` file in your project root with:\n \n\\`\\`\\`js\n// eslint.config.mjs\nimport { withRaclette } from './.raclette/eslint.config.mjs'\n \nexport default withRaclette(\n // Your custom configs here\n {\n // Example: Override a rule\n rules: {\n 'no-console': 'off'\n }\n },\n // Add more config objects as needed\n)\n\\`\\`\\`\n \n## Features\n \n- Project-aware configuration that understands your racletteJS project structure\n- Framework-specific rules (Vue, React) automatically included based on your project\n- Seamless integration with your IDE\n- Clean, modern approach using ESLint's flat config system\n \n## Editor Integration\n \nFor Visual Studio Code users, make sure to add this to your \\`.vscode/settings.json\\`:\n \n\\`\\`\\`json\n{\n \"eslint.experimental.useFlatConfig\": true\n}\n\\`\\`\\`\n \nThis enables support for the flat config format in the ESLint extension.\n \n## Adding Custom Rules\n \nYou can customize the ESLint rules by:\n\n1. Adding rules in your \\`eslint.config.mjs\\` file:\n\n\\`\\`\\`js\nexport default withRaclette(\n {\n // Your custom rules\n rules: {\n 'indent': ['error', 4],\n 'quotes': ['error', 'single']\n }\n }\n)\n\\`\\`\\`\n\n2. Or by adding them to your \\`raclette.config.js\\` file:\n\n\\`\\`\\`js\nexport default {\n // ...other racletteJS config\n eslint: {\n useRecommended: true, // Set to false to disable recommended rules\n rules: {\n 'indent': ['error', 4],\n 'quotes': ['error', 'single']\n },\n ignores: [\n 'legacy/**'\n ]\n }\n}\n\\`\\`\\`\n`\n\n await fs.writeFile(readmePath, readmeContent)\n}\n", "/**\n * Core JavaScript ESLint configuration\n * Contains basic JavaScript rules that apply to all projects\n */\n\n/**\n * Get core dependencies\n */\nexport const getCoreDependencies = (useRecommended = false): string[] => {\n return [\n \"eslint\",\n \"@eslint/js\",\n \"globals\",\n \"eslint-config-prettier\",\n \"prettier\",\n \"eslint-plugin-prettier\",\n ...(useRecommended ? getCoreRecommendedDependencies() : []),\n ]\n}\n\n/**\n * Get core recommended dependencies\n */\nexport const getCoreRecommendedDependencies = (): string[] => {\n return [] // Currently none beyond base dependencies\n}\n\n/**\n * Get core import statements\n */\nexport const getCoreImports = (): string[] => {\n return [\n \"import globals from 'globals';\",\n \"import eslintConfigPrettier from 'eslint-config-prettier';\",\n ]\n}\n\nexport const getCoreConfig = (useRecommended = false): string => {\n const baseConfig = ` // JavaScript config\n {\n files: [\"**/*.{js,mjs,cjs}\"],\n languageOptions: {\n globals: {\n ...globals.browser,\n ...globals.node,\n test: \"readonly\",\n expect: \"readonly\",\n it: \"readonly\",\n cy: \"readonly\"\n },\n ecmaVersion: 2022,\n sourceType: 'module'\n },\n rules: {\n // Common recommended rules\n \"no-console\": \"warn\",\n \"prefer-const\": \"error\",\n \"no-unused-vars\": \"warn\",\n \"curly\": [\"error\", \"all\"],\n \"eqeqeq\": [\"error\", \"always\"],\n \"require-await\": \"error\",\n \"padding-line-between-statements\": [\n \"error\",\n // nextline after const\n { blankLine: \"always\", prev: \"const\", next: \"*\" },\n // nextline after let\n { blankLine: \"always\", prev: \"let\", next: \"*\" },\n // allow const after const\n { blankLine: \"any\", prev: \"const\", next: \"const\" },\n // allow let after const\n { blankLine: \"any\", prev: \"const\", next: \"let\" },\n // allow const after let\n { blankLine: \"any\", prev: \"let\", next: \"const\" },\n // allow let after let\n { blankLine: \"any\", prev: \"let\", next: \"let\" },\n // add blank line before return statements\n { blankLine: \"always\", prev: \"*\", next: \"return\" },\n // new line between method declarations\n { blankLine: \"always\", prev: \"const\", next: \"block-like\" }\n ]\n }\n }`\n\n // If useRecommended is true, include style configuration as well\n if (useRecommended) {\n return baseConfig + \",\\n\\n\" + getStyleRecommendedConfig()\n }\n\n return baseConfig\n}\n\n/**\n * Style-oriented rules for better code formatting\n * These are included when useRecommended is true\n */\nexport const getStyleRecommendedConfig = (): string => {\n return ` // Style recommended config\n {\n files: [\"**/*.{js,mjs,cjs,ts,tsx}\"],\n rules: {\n // Style and formatting rules\n \"semi\": [\"error\", \"never\"],\n \"quotes\": [\"error\", \"double\", { \"avoidEscape\": true }],\n \"comma-dangle\": [\"error\", \"always-multiline\"],\n \"no-multiple-empty-lines\": [\"error\", { \"max\": 1, \"maxEOF\": 0 }],\n \"object-curly-spacing\": [\"error\", \"always\"],\n \"array-bracket-spacing\": [\"error\", \"never\"],\n \"computed-property-spacing\": [\"error\", \"never\"],\n \"comma-spacing\": [\"error\", { \"before\": false, \"after\": true }],\n \"eol-last\": [\"error\", \"always\"],\n \"indent\": [\"error\", 2],\n \"linebreak-style\": [\"error\", \"unix\"],\n \"no-trailing-spaces\": \"error\",\n \"dot-notation\": [\"error\", { allowKeywords: true }],\n \"id-length\": [\n \"error\",\n { min: 3, exceptions: [\"i\", \"j\", \"a\", \"b\", \"fs\", \"id\"], properties: \"never\" },\n ],\n }\n }`\n}\n", "/**\n * React ESLint configuration\n * Contains React and React Hooks specific rules\n */\n\n/**\n * Get React dependencies\n */\nexport const getReactDependencies = (useRecommended = false): string[] => {\n return [\n \"eslint-plugin-react\",\n \"eslint-plugin-react-hooks\",\n ...(useRecommended ? getReactRecommendedDependencies() : []),\n ]\n}\n\n/**\n * Get React recommended dependencies\n */\nexport const getReactRecommendedDependencies = (): string[] => {\n return [] // Currently none beyond base React dependencies\n}\n\n/**\n * Get React import statements\n */\nexport const getReactImports = (): string[] => {\n return [\n \"import react from 'eslint-plugin-react';\",\n \"import reactHooks from 'eslint-plugin-react-hooks';\",\n ]\n}\n\nexport const getReactConfig = (useRecommended = false): string => {\n // For React, we currently don't have separate recommended rules\n // but we include the parameter for future expansion\n const baseConfig = ` // React config\n {\n files: [\"**/*.{jsx,tsx}\"],\n plugins: {\n react,\n 'react-hooks': reactHooks\n },\n rules: {\n // Essential React rules\n \"react/jsx-uses-react\": \"error\",\n \"react/jsx-uses-vars\": \"error\",\n \"react-hooks/rules-of-hooks\": \"error\",\n \"react-hooks/exhaustive-deps\": \"warn\",\n \n // Additional sensible React rules\n \"react/prop-types\": \"warn\",\n \"react/jsx-no-duplicate-props\": \"error\",\n \"react/jsx-no-undef\": \"error\",\n \"react/jsx-pascal-case\": \"error\",\n \"react/no-direct-mutation-state\": \"error\",\n \"react/no-unescaped-entities\": \"error\"\n }\n }`\n\n // If useRecommended is true, include the recommended React rules\n if (useRecommended) {\n return baseConfig + \",\\n\\n\" + getReactRecommendedConfig()\n }\n\n return baseConfig\n}\n\nexport const getReactRecommendedConfig = (): string => {\n // nothing here yet\n return \"\"\n}\n", "/**\n * Base TypeScript ESLint configuration\n * Contains essential TypeScript rules\n */\n\n/**\n * Get TypeScript base dependencies\n */\nexport const getTypeScriptDependencies = (useRecommended = false): string[] => {\n return [\n \"typescript-eslint\",\n ...(useRecommended ? getTypeScriptRecommendedDependencies() : []),\n ]\n}\n\n/**\n * Get TypeScript recommended dependencies\n */\nexport const getTypeScriptRecommendedDependencies = (): string[] => {\n return [\"eslint-plugin-import\", \"eslint-plugin-prefer-arrow-functions\"]\n}\n\n/**\n * Get TypeScript import statements\n */\nexport const getTypeScriptImports = (useRecommended: boolean): string[] => {\n const imports = [\n // Base imports\n \"import tseslint from 'typescript-eslint';\",\n ]\n\n // Add recommended imports if needed\n if (useRecommended) {\n imports.push(\"import importPlugin from 'eslint-plugin-import';\")\n imports.push(\n \"import preferArrow from 'eslint-plugin-prefer-arrow-functions';\",\n )\n }\n\n return imports\n}\n\nexport const getTypeScriptConfig = (useRecommended = false): string => {\n // Include import and prefer-arrow plugins if useRecommended is true\n const plugins = useRecommended\n ? `{\n '@typescript-eslint': tseslint.plugin,\n 'import': importPlugin,\n 'prefer-arrow': preferArrow\n }`\n : `{\n '@typescript-eslint': tseslint.plugin\n }`\n\n const baseConfig = ` // TypeScript config\n {\n files: [\"**/*.{ts,tsx}\"],\n plugins: ${plugins},\n languageOptions: {\n parser: tseslint.parser,\n parserOptions: {\n ecmaVersion: 2022,\n sourceType: 'module',\n project: './tsconfig.json'\n }\n },\n rules: {\n // Basic TypeScript rules\n 'no-unused-vars': 'off', // disable JS rule in favor of TS rule\n '@typescript-eslint/no-unused-vars': ['warn', { \n argsIgnorePattern: '^(_|error|config|options|args|props|params|fastify|req|request|res|reply)',\n varsIgnorePattern: '^(_|error|config|options|args|props|params)',\n caughtErrorsIgnorePattern: '^(_|error|config|options|args|props|params)'\n }]\n }\n }`\n\n // If useRecommended is true, include recommended configuration as well\n if (useRecommended) {\n return baseConfig + \",\\n\\n\" + getTypeScriptRecommendedConfig()\n }\n\n return baseConfig\n}\n\n/**\n * Recommended TypeScript ESLint configuration\n * Contains more opinionated rules for TypeScript\n */\nexport const getTypeScriptRecommendedConfig = (): string => {\n return ` // TypeScript recommended config\n {\n files: [\"**/*.{ts,tsx}\"],\n rules: {\n // More opinionated TypeScript rules\n '@typescript-eslint/no-explicit-any': 'warn',\n '@typescript-eslint/explicit-function-return-type': 'off',\n '@typescript-eslint/explicit-module-boundary-types': 'off',\n '@typescript-eslint/no-non-null-assertion': 'warn',\n '@typescript-eslint/no-inferrable-types': 'warn',\n '@typescript-eslint/naming-convention': [\n 'error',\n {\n selector: 'interface',\n format: ['PascalCase'],\n custom: {\n regex: '^I[A-Z]',\n match: false\n }\n },\n {\n selector: 'typeAlias',\n format: ['PascalCase']\n },\n {\n selector: 'enum',\n format: ['PascalCase']\n }\n ],\n '@typescript-eslint/consistent-type-imports': [\n 'error',\n {\n prefer: 'type-imports',\n disallowTypeAnnotations: false\n }\n ],\n '@typescript-eslint/consistent-type-definitions': ['warn', 'interface'],\n '@typescript-eslint/prefer-optional-chain': 'warn',\n '@typescript-eslint/prefer-nullish-coalescing': 'warn',\n '@typescript-eslint/prefer-ts-expect-error': 'warn',\n \n // Import organization\n 'import/order': ['error', {\n 'groups': [\n 'type',\n ['builtin', 'external'],\n ['internal', 'parent', 'sibling', 'index'],\n ],\n 'alphabetize': {\n 'order': 'asc',\n 'caseInsensitive': true,\n },\n 'pathGroups': [\n // Handle all type imports first, from both external and internal\n {\n 'pattern': 'type',\n 'group': 'type',\n 'position': 'before',\n },\n {\n 'pattern': '{type,types,Types}',\n 'group': 'type',\n 'position': 'before',\n },\n // Handle aliased paths as internal\n {\n 'pattern': '@/**',\n 'group': 'internal',\n }\n ],\n 'pathGroupsExcludedImportTypes': ['type'],\n }],\n \n // Arrow function preference\n 'prefer-arrow/prefer-arrow-functions': [\n 'error',\n {\n 'disallowPrototype': true,\n 'singleReturnOnly': false,\n 'classPropertiesAllowed': false,\n }\n ]\n }\n }`\n}\n", "/**\n * Vue ESLint base configuration\n * Contains essential Vue rules for basic linting\n */\n\n/**\n * Get Vue dependencies\n */\nexport const getVueDependencies = (useRecommended = false): string[] => {\n return [\n \"eslint-plugin-vue\",\n \"vue-eslint-parser\",\n ...(useRecommended ? getVueRecommendedDependencies() : []),\n ]\n}\n\n/**\n * Get Vue recommended dependencies\n */\nexport const getVueRecommendedDependencies = (): string[] => {\n return [] // Currently none beyond base Vue dependencies\n}\n\n/**\n * Get Vue import statements\n */\nexport const getVueImports = (): string[] => {\n return [\n \"import vue from 'eslint-plugin-vue';\",\n \"import vueEslintParser from 'vue-eslint-parser';\",\n ]\n}\n\nexport const getVueConfig = (useRecommended = false): string => {\n const baseConfig = ` // Vue config\n {\n files: [\"**/*.vue\"],\n // Manually add Vue plugin\n plugins: {\n vue\n },\n languageOptions: {\n parser: vueEslintParser,\n parserOptions: {\n ecmaVersion: 2022,\n sourceType: 'module',\n parser: tseslint.parser, \n extraFileExtensions: [\".vue\"]\n }\n },\n rules: {\n // Essential Vue rules (from ESLint plugin Vue)\n \"vue/multi-word-component-names\": \"off\",\n \"vue/no-mutating-props\": \"error\",\n \"vue/no-reserved-component-names\": \"error\",\n \"vue/no-use-v-if-with-v-for\": \"error\",\n \"vue/require-v-for-key\": \"error\",\n \"vue/valid-template-root\": \"error\",\n \"vue/valid-v-bind\": \"error\",\n \"vue/valid-v-cloak\": \"error\",\n \"vue/valid-v-else-if\": \"error\",\n \"vue/valid-v-else\": \"error\",\n \"vue/valid-v-for\": \"error\",\n \"vue/valid-v-html\": \"error\",\n \"vue/valid-v-if\": \"error\",\n \"vue/valid-v-model\": \"error\",\n \"vue/valid-v-on\": \"error\",\n \"vue/valid-v-once\": \"error\",\n \"vue/valid-v-pre\": \"error\",\n \"vue/valid-v-show\": \"error\",\n \"vue/valid-v-slot\": \"error\",\n \"vue/valid-v-text\": \"error\",\n }\n }`\n\n // If useRecommended is true, include the recommended Vue rules\n if (useRecommended) {\n return baseConfig + \",\\n\\n\" + getVueRecommendedConfig()\n }\n\n return baseConfig\n}\n\n/**\n * Vue ESLint recommended configuration\n * Contains more opinionated Vue rules for better code quality\n */\nexport const getVueRecommendedConfig = (): string => {\n return ` // Vue recommended config\n {\n files: [\"**/*.vue\"],\n rules: {\n // Recommended Vue rules\n \"vue/component-name-in-template-casing\": [\"error\", \"PascalCase\"],\n \"vue/match-component-file-name\": [\n \"error\",\n {\n extensions: [\"vue\"],\n shouldMatchCase: true\n }\n ],\n \"vue/match-component-import-name\": \"error\",\n \"vue/attribute-hyphenation\": \"error\",\n \"vue/component-definition-name-casing\": [\"error\", \"PascalCase\"],\n \"vue/html-closing-bracket-newline\": \"error\",\n \"vue/html-closing-bracket-spacing\": \"error\",\n \"vue/html-end-tags\": \"error\",\n \"vue/html-indent\": [\"error\", 2],\n \"vue/html-quotes\": \"error\",\n \"vue/html-self-closing\": [\"error\", {\n \"html\": {\n \"void\": \"any\",\n \"normal\": \"any\",\n \"component\": \"always\"\n }\n }],\n \"vue/max-attributes-per-line\": [\"error\", {\n \"singleline\": 3,\n \"multiline\": 1\n }],\n \"vue/no-multi-spaces\": \"error\",\n \"vue/no-spaces-around-equal-signs-in-attribute\": \"error\",\n \"vue/no-template-shadow\": \"error\",\n \"vue/one-component-per-file\": \"error\",\n \"vue/prop-name-casing\": [\"error\", \"camelCase\"],\n \"vue/require-default-prop\": \"error\",\n \"vue/require-prop-types\": \"error\",\n \"vue/v-bind-style\": \"error\",\n \"vue/v-on-style\": \"error\",\n \"vue/v-slot-style\": \"error\"\n }\n }`\n}\n", "/**\n * Dependencies Manager for ESLint Configuration\n *\n * This module manages the collection of dependencies from different ESLint rule sets.\n * It acts as an aggregator that can be extended with new rule sets without modifying\n * the core logic of the dependency collection system.\n */\n\nimport type { RacletteConfig } from \"../../types\"\nimport {\n getCoreDependencies,\n getCoreRecommendedDependencies,\n} from \"./configs/core\"\nimport {\n getTypeScriptDependencies,\n getTypeScriptRecommendedDependencies,\n} from \"./configs/typescript\"\nimport {\n getVueDependencies,\n getVueRecommendedDependencies,\n} from \"./configs/vue\"\nimport {\n getReactDependencies,\n getReactRecommendedDependencies,\n} from \"./configs/react\"\n\n/**\n * Get framework-specific dependencies based on the project configuration\n */\nexport const getFrameworkDependencies = (config: RacletteConfig): string[] => {\n const dependencies: string[] = []\n\n // Framework-specific dependencies\n if (config.frontend?.framework === \"vue\") {\n dependencies.push(...getVueDependencies())\n } else if (config.frontend?.framework === \"react\") {\n dependencies.push(...getReactDependencies())\n }\n\n return dependencies\n}\n\n/**\n * Get recommended dependencies based on the project configuration and useRecommended flag\n */\nexport const getRecommendedDependencies = (\n config: RacletteConfig,\n useRecommended: boolean,\n): string[] => {\n if (!useRecommended) {\n return []\n }\n\n const dependencies: string[] = []\n\n // Add core recommended dependencies\n dependencies.push(...getCoreRecommendedDependencies())\n\n // Add TypeScript recommended dependencies\n dependencies.push(...getTypeScriptRecommendedDependencies())\n\n // Add framework-specific recommended dependencies\n if (config.frontend?.framework === \"vue\") {\n dependencies.push(...getVueRecommendedDependencies())\n } else if (config.frontend?.framework === \"react\") {\n dependencies.push(...getReactRecommendedDependencies())\n }\n\n return dependencies\n}\n\n/**\n * Get all required dependencies for the project\n */\nexport const getAllDependencies = (config: RacletteConfig): string[] => {\n // Default to true if not specified\n const useRecommended = config.eslint?.useRecommended !== false\n\n // Collect all dependencies\n const dependencies = [\n // Core dependencies\n ...getCoreDependencies(),\n\n // TypeScript dependencies\n ...getTypeScriptDependencies(),\n ]\n\n // Add framework-specific dependencies\n if (config.frontend?.framework === \"vue\") {\n dependencies.push(...getVueDependencies())\n } else if (config.frontend?.framework === \"react\") {\n dependencies.push(...getReactDependencies())\n }\n\n // Add recommended dependencies if enabled\n if (useRecommended) {\n dependencies.push(\n ...getCoreRecommendedDependencies(),\n ...getTypeScriptRecommendedDependencies(),\n )\n\n // Add framework-specific recommended dependencies\n if (config.frontend?.framework === \"vue\") {\n dependencies.push(...getVueRecommendedDependencies())\n } else if (config.frontend?.framework === \"react\") {\n dependencies.push(...getReactRecommendedDependencies())\n }\n }\n\n // Remove duplicates by using a Set\n return [...new Set(dependencies)]\n}\n", "import { existsSync } from \"fs\"\nimport path from \"path\"\nimport { getVueDependencies } from \"./configs/vue\"\nimport { getReactDependencies } from \"./configs/react\"\n\n/**\n * Get framework-specific dependencies based on the project configuration\n */\nexport const getFrameworkDependencies = (config: any): string[] => {\n const framework = config.frontend?.framework\n\n if (framework === \"vue\") {\n return getVueDependencies()\n }\n\n if (framework === \"react\") {\n return getReactDependencies()\n }\n\n return []\n}\n\n/**\n * Generate the install command for the given dependencies\n */\nexport const generateInstallCommand = (dependencies: string[]): string => {\n // Sort dependencies for consistency\n const sortedDeps = [...dependencies].sort()\n\n // Check for package manager\n const hasYarn = existsSync(path.join(process.cwd(), \"yarn.lock\"))\n const hasPnpm = existsSync(path.join(process.cwd(), \"pnpm-lock.yaml\"))\n const hasBun = existsSync(path.join(process.cwd(), \"bun.lockb\"))\n\n let packageManager = \"npm\"\n let installCmd = \"install\"\n\n if (hasYarn) {\n packageManager = \"yarn\"\n installCmd = \"add\"\n } else if (hasPnpm) {\n packageManager = \"pnpm\"\n installCmd = \"add\"\n } else if (hasBun) {\n packageManager = \"bun\"\n installCmd = \"add\"\n }\n\n // Generate command\n return `${packageManager} ${installCmd} -D ${sortedDeps.join(\" \")}`\n}\n", "import type {\n RacletteConfig,\n PackageSourceConfig,\n PackageTarget,\n Service,\n WorkbenchTarget\n} from \"./types\"\nimport { Services, Workbenches } from \"./types\"\nimport chalk from \"chalk\"\nimport { execSync } from \"child_process\"\nimport fs from \"fs-extra\"\nimport path from \"path\"\nimport { pathToFileURL } from \"url\"\nimport { ensureRacletteDir, copyFileIfExists, findCorePackagePath,} from \"./file-system\"\nimport { mergeDeepRight } from \"ramda\"\nimport { logger } from \"./logger\"\n\n/**\n * Interface for the packages.json file structure\n */\ninterface ProjectPackages {\n frontend?: {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n backend?: {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n workbench?: {\n frontend?: {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n backend?: {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n }\n}\n\n/**\n * Load and merge packages from multiple sources for a specific service\n */\nconst loadMergedPackagesForService = async (\n service: Service,\n config: RacletteConfig,\n verbose = false,\n): Promise<{\n dependencies: Record<string, string>\n devDependencies: Record<string, string>\n}> => {\n if (verbose) {\n logger.progress(`Loading merged packages for ${service}...`)\n }\n\n // Get package sources from config or use default\n const packageSources = config.packageMerging?.[service] || [\n { file: \"./packages.json\", key: service },\n ]\n\n let mergedDependencies: Record<string, string> = {}\n let mergedDevDependencies: Record<string, string> = {}\n\n // Process each package source in order (later overrides earlier)\n for (const source of packageSources) {\n try {\n const packageData = await loadPackageSource(source)\n\n if (packageData.dependencies) {\n mergedDependencies = {\n ...mergedDependencies,\n ...packageData.dependencies,\n }\n const mergeCount = Object.keys(packageData.dependencies).length\n\n if (mergeCount > 0 && verbose) {\n logger.success(\n `Merged ${mergeCount} dependencies from ${source.file}:${source.key}`,\n )\n }\n }\n\n if (packageData.devDependencies) {\n mergedDevDependencies = {\n ...mergedDevDependencies,\n ...packageData.devDependencies,\n }\n const mergeCount = Object.keys(packageData.devDependencies).length\n if (mergeCount > 0 && verbose) {\n logger.success(\n `Merged ${mergeCount} devDependencies from ${source.file}:${source.key}`,\n )\n }\n }\n } catch (error: any) {\n logger.error(\n `Error loading package source ${source.file}:${source.key} - ${error.message}`,\n )\n logger.error(`Aborting package setup for ${service}`)\n throw error\n }\n }\n\n if (verbose) {\n logger.raw(\n chalk.blue(\n `\uD83D\uDCCA Final ${service} package count: ${Object.keys(mergedDependencies).length} deps, ${Object.keys(mergedDevDependencies).length} devDeps`,\n ),\n )\n }\n\n return {\n dependencies: mergedDependencies,\n devDependencies: mergedDevDependencies,\n }\n}\n\n/**\n * Load a specific package source and extract the specified keyldTime}s`))\n */\nconst loadPackageSource = async (\n source: PackageSourceConfig,\n): Promise<{\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n}> => {\n logger.progress(`Loading ${source.file}:${source.key}...`)\n\n // Check if file exists\n if (!(await fs.pathExists(source.file))) {\n // file does not yet exist, no worries\n logger.debug(\n `packages.json file does not yet exist, no packages will be added.`,\n )\n return Promise.resolve({ dependencies: {}, devDependencies: {} })\n }\n\n try {\n // Load the JSON file\n const packageFile = await fs.readJson(source.file)\n\n // Extract the specified key using dot notation (e.g., \"workbench.frontend\")\n const keyParts = source.key.split(\".\")\n let packageData = packageFile\n\n for (const part of keyParts) {\n if (\n packageData &&\n typeof packageData === \"object\" &&\n part in packageData\n ) {\n packageData = packageData[part]\n } else {\n logger.debug(\n `\u26A0\uFE0F Key '${source.key}' not found in ${source.file}, skipping`,\n )\n return {}\n }\n }\n\n // Validate structure\n if (!packageData || typeof packageData !== \"object\") {\n logger.warn(\n `Invalid package data at '${source.key}' in ${source.file}, skipping`,\n )\n return {}\n }\n\n return {\n dependencies: packageData.dependencies || {},\n devDependencies: packageData.devDependencies || {},\n }\n } catch (error: any) {\n throw new Error(`Failed to parse ${source.file}: ${error.message}`)\n }\n}\n\n/**\n * Get the lock file path for a service from config or default\n */\nconst getServiceLockFilePath = (\n service: \"frontend\" | \"backend\",\n config: RacletteConfig,\n): string => {\n // Check if custom path is configured\n const customPath = config.lockFiles?.[service]\n\n if (customPath) {\n logger.debug(`\uD83D\uDD12 Using custom lock file path for ${service}: ${customPath}`)\n return customPath\n }\n\n // Default path\n const defaultPath = path.join(process.cwd(), `${service}.yarn.lock`)\n logger.debug(`\uD83D\uDD12 Using default lock file path for ${service}: ${defaultPath}`)\n return defaultPath\n}\n\n/**\n * Updates package.json files for frontend and backend\n */\nexport const updatePackageJsons = async (\n target: PackageTarget,\n config: RacletteConfig,\n) => {\n const raclettePath = await ensureRacletteDir()\n\n // Load config if not provided\n if (!config) {\n try {\n config = await import(\n pathToFileURL(path.join(process.cwd(), \"raclette.config.js\")).href\n ).then((module) => module.default || module)\n } catch (error: any) {\n logger.warn(`Could not load raclette.config.js: ${error.message}`)\n // Continue with empty config\n config = { name: \"raclette-app\" } as RacletteConfig\n }\n }\n\n // Only update package.json for frontend/backend targets\n if (Services.includes(target as Service)) {\n await setupPackageJson(\n `services/${target}/package.json`,\n path.join(raclettePath, target),\n target as Service,\n config,\n false, // Don't show verbose logs during add-package\n )\n }\n\n // For workbench targets, we don't update package.json files\n if (Workbenches.includes(target as WorkbenchTarget)) {\n logger.instruction(\n `Workbench target ${target} - packages.json updated. You need to restart your workbench service manually.`)\n }\n}\n\n/**\n * Get plugin dependencies from app's package.json based on enabled plugins in config\n */\nexport const getPluginDependencies = async (\n config: RacletteConfig,\n): Promise<Record<string, string>> => {\n if (!config.plugins || config.plugins.length === 0) {\n return {}\n }\n\n // Read the app's package.json to get plugin versions\n const appPackagePath = path.join(process.cwd(), \"package.json\")\n\n if (!(await fs.pathExists(appPackagePath))) {\n logger.warn(\"No package.json found in app directory\")\n return {}\n }\n\n try {\n const appPackage = await fs.readJson(appPackagePath)\n const allDependencies = {\n ...(appPackage.dependencies || {}),\n ...(appPackage.devDependencies || {}),\n }\n\n // Extract the plugin module names\n const pluginModules = config.plugins.map((module) =>\n typeof module === \"string\" ? module : module[0],\n )\n\n // Create a map of plugin dependencies with their versions\n const pluginDependencies: Record<string, string> = {}\n\n for (const pluginName of pluginModules) {\n if (allDependencies[pluginName]) {\n pluginDependencies[pluginName] = allDependencies[pluginName]\n logger.debug(\n `Found plugin ${pluginName}@${allDependencies[pluginName]}`,\n )\n } else {\n logger.warn(\n `Plugin ${pluginName} is enabled in config but not found in package.json`,\n )\n }\n }\n\n return pluginDependencies\n } catch (error: any) {\n logger.warn(`Error reading app package.json: ${error.message}`)\n return {}\n }\n}\n\nconst setupPackageJson = async (\n sourcePath: string,\n targetDir: string,\n serviceType: \"frontend\" | \"backend\",\n config: RacletteConfig,\n verbose = false,\n) => {\n const corePackagePath = findCorePackagePath()\n\n if (verbose) {\n logger.progress(`Setting up package.json for ${serviceType}`)\n logger.debug(`Source: ${sourcePath}`)\n logger.debug(`Target dir: ${targetDir}`)\n }\n\n await fs.ensureDir(targetDir)\n\n // Path to original package.json in the core package\n const sourcePackagePath = path.join(corePackagePath, sourcePath)\n const sourceDir = path.dirname(sourcePackagePath)\n const targetPackagePath = path.join(targetDir, \"package.json\")\n\n if(!fs.pathExistsSync(sourcePackagePath)) return logger.warn(`Warning: Could not find package.json at ${sourcePackagePath}`)\n \n if (verbose) logger.debug(`Reading source package.json...`)\n try {\n const sourcePackage = await fs.readJson(sourcePackagePath)\n\n // Load merged packages using new generic system\n let mergedPackages = [ \"frontend\" ,\"backend\"].includes(serviceType) ? \n (await loadMergedPackagesForService(serviceType, config, verbose)) :\n { dependencies: {}, devDependencies: {} }\n\n // Get plugin dependencies\n const pluginDeps = await getPluginDependencies(config)\n\n // Merge everything together\n const finalDependencies = {\n ...sourcePackage.dependencies,\n ...mergedPackages.dependencies,\n ...pluginDeps,\n }\n\n const finalDevDependencies = {\n ...sourcePackage.devDependencies,\n ...mergedPackages.devDependencies,\n }\n\n const mergedPackage = mergeDeepRight(sourcePackage, {\n dependencies: finalDependencies,\n devDependencies: finalDevDependencies,\n })\n\n // Write merged package.json\n if (verbose) logger.debug(`Writing merged package.json...`)\n await fs.writeJson(targetPackagePath, mergedPackage, { spaces: 2 })\n\n if (verbose) logger.success(`Created package.json for ${serviceType}`)\n\n // Handle yarn.lock for build context (different from runtime mount)\n await copyCoreLockToBuildContext(\n sourceDir,\n targetDir,\n serviceType,\n config,\n )\n } catch (error: any) {\n logger.error(`Error setting up package.json for ${serviceType}: ${error.message}`)\n throw error\n }\n }\n\n/**\n * Set up node packages for services with configurable lock files\n */\nexport const setupNodePackages = async (\n config: RacletteConfig,\n): Promise<void> => {\n const racletteDir = path.join(process.cwd(), config.root)\n logger.progress(\"Setting up node packages for services...\")\n\n for(const service of Services) {\n if(!config.services[service]?.enabled) continue\n const targetDir = path.join(racletteDir, service)\n await setupPackageJson(\n `services/${service}/package.json`,\n targetDir, service as Service, config, true) // Show verbose logs during initial setup\n await copyFileIfExists(getServiceLockFilePath(service, config), path.join(targetDir, \"yarn.lock\"))\n }\n}\n\n/**\n * Load project packages from packages.json (backward compatibility)\n */\nexport const loadProjectPackages = async (): Promise<ProjectPackages> => {\n const packagesPath = path.join(process.cwd(), \"packages.json\")\n\n if (await fs.pathExists(packagesPath)) {\n try {\n return await fs.readJson(packagesPath)\n } catch (error: any) {\n logger.warn(`Error reading packages.json: ${error.message}`)\n }\n }\n\n // Return empty structure if file doesn't exist or has errors\n return {\n frontend: {\n dependencies: {},\n devDependencies: {},\n },\n backend: {\n dependencies: {},\n devDependencies: {},\n },\n workbench: {\n frontend: {\n dependencies: {},\n devDependencies: {},\n },\n backend: {\n dependencies: {},\n devDependencies: {},\n },\n },\n }\n}\n\n/**\n * Save project packages to packages.json\n */\nexport const saveProjectPackages = async (\n packages: ProjectPackages,\n): Promise<void> => {\n const packagesPath = path.join(process.cwd(), \"packages.json\")\n\n await fs.writeJson(packagesPath, packages, { spaces: 2 })\n}\n\n/**\n * Verify if a package exists and get its version\n */\nexport const verifyPackage = (packageName: string): string | null => {\n try {\n // Use yarn info to check if the package exists\n const info = execSync(`yarn info ${packageName} version --json`, {\n stdio: \"pipe\",\n encoding: \"utf8\",\n })\n\n if (!info) {\n throw new Error(\"No package found!\")\n }\n // Parse the JSON output to get the version\n const result = JSON.parse(info)\n\n return result.data\n } catch (error: any) {\n logger.error(\n `Package verification failed for ${packageName}: ${error.message}`,\n )\n\n return null\n }\n}\n\n/**\n * Add a package to the app's package.json using yarn add\n * Returns the actual installed version\n */\nexport const addPackageToAppPackageJson = async (\n packageName: string,\n specifiedVersion: string | undefined,\n isDev = false,\n): Promise<string> => {\n const appPackagePath = path.join(process.cwd(), \"package.json\")\n\n // Check if app package.json exists\n if (!(await fs.pathExists(appPackagePath))) {\n throw new Error(\"No package.json found in project root\")\n }\n\n // Check if yarn is available\n try {\n execSync(\"yarn --version\", { stdio: \"pipe\" })\n } catch {\n throw new Error(\"Yarn is not available in PATH\")\n }\n\n // Build the package specification\n let packageSpec = packageName\n if (specifiedVersion) {\n packageSpec = `${packageName}@${specifiedVersion}`\n }\n\n const devFlag = isDev ? \"--dev\" : \"\"\n const command = `yarn add ${packageSpec} ${devFlag}`.trim()\n\n logger.progress(`Running: ${command}`)\n\n try {\n execSync(command, {\n cwd: process.cwd(),\n stdio: \"pipe\", // Capture output to avoid cluttering logs\n encoding: \"utf8\",\n })\n\n // Read the package.json to get the actual installed version\n const appPackage = await fs.readJson(appPackagePath)\n const section = isDev ? \"devDependencies\" : \"dependencies\"\n const installedVersion = appPackage[section]?.[packageName]\n\n if (!installedVersion) {\n throw new Error(\n `Package ${packageName} was not found in ${section} after installation`,\n )\n }\n\n logger.success(\n `Added ${packageName}@${installedVersion} to app package.json ${section}`,\n )\n\n return installedVersion\n } catch (error: any) {\n throw new Error(\n `Failed to add ${packageName}${specifiedVersion ? `@${specifiedVersion}` : \"\"}: ${error.message}`,\n )\n }\n}\n\n/**\n * Parse package specification into name and version\n */\nconst parsePackageSpec = (\n packageSpec: string,\n): { name: string; version?: string } => {\n // Handle scoped packages like @raclettejs/core\n const scopedMatch = packageSpec.match(/^(@[^/]+\\/[^@]+)(?:@(.+))?$/)\n if (scopedMatch) {\n return {\n name: scopedMatch[1],\n version: scopedMatch[2],\n }\n }\n\n // Handle regular packages like lodash@4.0.0\n const regularMatch = packageSpec.match(/^([^@]+)(?:@(.+))?$/)\n if (regularMatch) {\n return {\n name: regularMatch[1],\n version: regularMatch[2],\n }\n }\n\n // Fallback - treat entire string as package name\n return { name: packageSpec }\n}\n\n/**\n * Add a package to the project's packages.json\n */\nexport const addPackageToProject = async (\n target: PackageTarget,\n packageSpec: string,\n isDev = false,\n): Promise<void> => {\n const { name: packageName, version: specifiedVersion } =\n parsePackageSpec(packageSpec)\n\n logger.raw(chalk.blue(`\uD83D\uDCE6 Adding package ${packageName} for ${target}...`))\n\n // Let yarn validate and install the package - this will fail if package/version is invalid\n const installedVersion = await addPackageToAppPackageJson(\n packageName,\n specifiedVersion,\n isDev,\n )\n\n // If we get here, yarn succeeded - now add to packages.json\n logger.success(`Package ${packageName}@${installedVersion} validated and installed`)\n\n // Load current packages.json\n const projectPackages = await loadProjectPackages()\n\n // build the path to the dependencies and access it\n const targetPath = [ ...target.split(\".\"), isDev ? \"devDependencies\" : \"dependencies\" ]\n let pp = projectPackages;\n for(const t of targetPath) {\n if(!pp[t]) pp[t] = {} \n pp = pp[t]\n }\n pp[packageName] = installedVersion;\n\n logger.success(`Added ${packageName}@${installedVersion} to ${targetPath.join(\".\")}`)\n if(targetPath.length == 3)\n logger.instruction(`Note: Workbench packages are stored in packages.json but package.json files are not updated`)\n\n // Save the updated packages.json\n await saveProjectPackages(projectPackages)\n logger.success(\"Updated packages.json in project root\")\n}\n\n/**\n * Ensure lock files exist in app directory with configurable paths\n */\nexport const ensureLockFilesExist = async (\n config: RacletteConfig,\n): Promise<void> => {\n const corePackagePath = findCorePackagePath()\n\n logger.debug(\"\uD83D\uDD12 Ensuring lock files exist for volume mounting...\")\n\n if (config.services.frontend?.enabled) {\n const frontendLockPath = getServiceLockFilePath(\"frontend\", config)\n\n if (!(await fs.pathExists(frontendLockPath))) {\n logger.debug(`\uD83D\uDD12 Creating initial lock file: ${frontendLockPath}`)\n // Try to copy from core package first\n const coreFrontendLockPath = path.join(\n corePackagePath,\n \"services\",\n \"frontend\",\n \"yarn.lock\",\n )\n if (await fs.pathExists(coreFrontendLockPath)) {\n logger.debug(\n \"\uD83D\uDD12 Using core package yarn.lock as starting point for frontend\",\n )\n await fs.copy(coreFrontendLockPath, frontendLockPath)\n } else {\n // Fallback to minimal lock file\n logger.debug(\n \"\uD83D\uDD12 No core frontend yarn.lock found, creating minimal lock file\",\n )\n await fs.writeFile(\n frontendLockPath,\n `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n# yarn lockfile v1\n\n`,\n )\n }\n logger.debug(`\uD83D\uDD12\u2705 Created ${path.basename(frontendLockPath)}`)\n } else {\n logger.debug(`\uD83D\uDD12 ${path.basename(frontendLockPath)} already exists`)\n }\n }\n\n if (config.services.backend?.enabled) {\n const backendLockPath = getServiceLockFilePath(\"backend\", config)\n\n if (!(await fs.pathExists(backendLockPath))) {\n logger.debug(`\uD83D\uDD12 Creating initial lock file: ${backendLockPath}`)\n\n // Try to copy from core package first\n const coreServerLockPath = path.join(\n corePackagePath,\n \"services\",\n \"backend\",\n \"yarn.lock\",\n )\n if (await fs.pathExists(coreServerLockPath)) {\n logger.debug(\n \"\uD83D\uDD12 Using core package yarn.lock as starting point for backend\",\n )\n await fs.copy(coreServerLockPath, backendLockPath)\n } else {\n // Fallback to minimal lock file\n logger.debug(\n \"\uD83D\uDD12 No core backend yarn.lock found, creating minimal lock file\",\n )\n await fs.writeFile(\n backendLockPath,\n `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n# yarn lockfile v1\n\n`,\n )\n }\n logger.debug(`\uD83D\uDD12\u2705 Created ${path.basename(backendLockPath)}`)\n } else {\n logger.debug(`\uD83D\uDD12 ${path.basename(backendLockPath)} already exists`)\n }\n }\n\n logger.success(\"Lock files ready for volume mounting\")\n}\n\n/**\n * Copy lock files from core package to build context (.raclette directory)\n * This is used during Docker build to have a base yarn.lock in the image\n */\nconst copyCoreLockToBuildContext = async (\n sourceDir: string,\n targetDir: string,\n serviceType: \"frontend\" | \"backend\" | \"workbench\",\n config: RacletteConfig,\n): Promise<void> => {\n const targetLockPath = path.join(targetDir, \"yarn.lock\")\n\n logger.debug(`\uD83D\uDD12 Setting up yarn.lock for ${serviceType} build context`)\n\n let serviceLockPath: string | undefined\n\n // Get configured lock file path for frontend/backend\n if (serviceType === \"frontend\" || serviceType === \"backend\") {\n serviceLockPath = getServiceLockFilePath(serviceType, config)\n }\n\n // Priority for build context lock file:\n // 1. Use configured service-specific lock file if it exists\n // 2. Use core package lock file as fallback\n // 3. Create minimal lock file\n\n if (serviceLockPath && (await fs.pathExists(serviceLockPath))) {\n logger.debug(\n `\uD83D\uDD12 Copying configured lock file to build context: ${serviceLockPath}`,\n )\n await fs.copy(serviceLockPath, targetLockPath)\n } else {\n // Check if core package has a yarn.lock to use as base\n const coreSourceLockPath = path.join(sourceDir, \"yarn.lock\")\n if (await fs.pathExists(coreSourceLockPath)) {\n logger.debug(`\uD83D\uDD12 Using core yarn.lock for ${serviceType} build context`)\n await fs.copy(coreSourceLockPath, targetLockPath)\n } else {\n logger.debug(\n `\uD83D\uDD12 Creating minimal yarn.lock for ${serviceType} build context`,\n )\n await fs.writeFile(\n targetLockPath,\n `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n# yarn lockfile v1\n\n`,\n )\n }\n }\n}\n", "import type { RacletteConfig } from \"./types\"\nimport fs from \"fs-extra\"\nimport path from \"path\"\nimport { logger } from \"src/logger\"\n\n/**\n * Generate a tsconfig.json file in the .raclette directory\n * This will be used as a base configuration that app projects can extend\n */\nexport const generateTsConfig = async (\n config: RacletteConfig,\n outputDir: string,\n): Promise<void> => {\n const tsConfigPath = path.join(outputDir, \"tsconfig.json\")\n\n // Base tsconfig template based on the existing one\n const tsConfig = {\n compilerOptions: {\n target: \"ES2020\",\n module: \"ESNext\",\n moduleResolution: \"node\",\n esModuleInterop: true,\n resolveJsonModule: true,\n outDir: \"dist\",\n declaration: true,\n emitDeclarationOnly: true,\n strict: true,\n paths: {\n \"@app\": [\"../services/frontend/src/app\"],\n \"@app/*\": [\"../services/frontend/src/app/*\"],\n \"@shared/app/*\": [\"../shared/*\"],\n \"@shared/*\": [\"./virtual/backend/src/shared/*\"],\n \"@raclettejs/core/backend\": [\n \"../node_modules/@raclettejs/core/services/backend/src\",\n ],\n \"@raclettejs/core/backend/*\": [\n \"../node_modules/@raclettejs/core/services/backend/src/*\",\n ],\n \"@raclettejs/workbench/app/*\": [\n \"../node_modules/@raclettejs/workbench/frontend/src/app/*\",\n ],\n \"@raclettejs/workbench/*\": [\"../node_modules/@raclettejs/workbench/*\"],\n \"@raclettejs/core/frontend\": [\n \"../node_modules/@raclettejs/core/services/frontend/src/core\",\n ],\n \"@raclettejs/core/frontend/*\": [\n \"../node_modules/@raclettejs/core/services/frontend/src/core/*\",\n ],\n \"@raclettejs/core/orchestrator\": [\n \"../node_modules/@raclettejs/core/services/frontend/src/orchestrator\",\n ],\n \"@raclettejs/core/orchestrator/*\": [\n \"../node_modules/@raclettejs/core/services/frontend/src/orchestrator/*\",\n ],\n \"@raclettejs/core/orchestrator/components\": [\n \"../node_modules/@raclettejs/core/services/frontend/src/orchestrator/components\",\n ],\n \"@raclettejs/core/orchestrator/components/*\": [\n \"../node_modules/@raclettejs/core/services/frontend/src/orchestrator/components/*\",\n ],\n \"@raclettejs/core/orchestrator/composables\": [\n \"../node_modules/@raclettejs/core/services/frontend/src/orchestrator/composables\",\n ],\n \"@raclettejs/core/orchestrator/composables/*\": [\n \"../node_modules/@raclettejs/core/services/frontend/src/orchestrator/composables/*\",\n ],\n \"@raclettejs/core\": [\"../node_modules/@raclettejs/core\"],\n },\n typeRoots: [\n \"./node_modules/@types\",\n \"./node_modules/@raclettejs/core/types\",\n ],\n },\n include: [\n \"./src/**/*\",\n \"types/**/*\",\n \"../**/*\",\n \"../node_modules/@raclettejs/core/*\",\n ],\n exclude: [\n \"../node_modules\",\n \"../dist\",\n \"./**\",\n \"../node_modules/@raclettejs/core/node_modules\",\n ],\n }\n\n // Allow for customizations based on project config\n if (config.typescript?.compilerOptions) {\n Object.assign(tsConfig.compilerOptions, config.typescript.compilerOptions)\n }\n\n if (config?.frontend?.framework === \"vue\") {\n generateVueTypes(outputDir)\n tsConfig.include.push(\"shims.vue.d.ts\")\n }\n\n // Write tsconfig.json file\n await fs.writeFile(tsConfigPath, JSON.stringify(tsConfig, null, 2))\n\n logger.debug(`Generated tsconfig.json in ${outputDir}`)\n}\n\nexport const generateVueTypes = async (raclettePath: string) => {\n const vueShims = `declare module \"*.vue\" {\n import { DefineComponent } from \"vue\"\n const component: DefineComponent<{}, {}, any>\n export default component\n}`\n\n await fs.writeFile(path.join(raclettePath, \"shims.vue.d.ts\"), vueShims)\n}\n", "/*\n The main purpose of the virtual file system is to enable hot-reload\n without cluttering the workspace.\n This is achieved by hard-linking all files node and vite need to watch\n into the virtual file system and then mounting it as volumes.\n In production these files become part of the image.\n*/\n\nimport chokidar from \"chokidar\"\nimport fs from \"fs-extra\"\nimport path from \"path\"\nimport type { RacletteConfig } from \"./types\"\nimport { core as coreDir } from \"./builder\"\nimport { logger } from \"src/logger\"\nimport { globby } from \"globby\"\n\nconst watchers: chokidar.FSWatcher[] = []\n\nexport const init = async (config: RacletteConfig, cfg) => {\n const app = process.cwd(), root = path.join(app, config.root)\n const ignore = [ `**/${config.root}/**`, ...cfg.patterns.ignore ]\n const sources = {\n \"\": app, \"/\": root,\n \".\": coreDir(), // \".\" as core-prefix prevents other names starting with \".\"\n undefined: \".\", null: \".\", // default values\n \"$\": process.env.RACLETTE_APP_PATH ?? app, // TODO: maybe make $ fully capable of environment variable lookup\n }\n\n if( (typeof cfg?.watcher.ignored) === 'string' ) cfg.watcher.ignored = new RegExp(cfg.watcher.ignored)\n\n const replacePatterns = (p:string[]) => p.reduce((a,e) => a.concat(cfg.patterns[e] ?? [e]) , [])\n\n const files:string[][] = []\n\n // we create hardlinks of all matches, so no watching and copying of files is needed\n const link = async (src:string, get:string[], dst:string[]) => {\n const linkPromises = []\n for(const f of get) for(const d of dst) {\n const from = path.join(src,f)\n const to = d.endsWith('/') ? path.join(d, f) : d // without trailing \"/\" in dst, it is a rename\n files.push([f,path.join(root,\"vfs\",f)])\n linkPromises.push(\n fs.ensureDir(path.dirname(to)).finally(() => fs.link(from,to)\n .catch( err => err.code !== 'EEXIST' && logger.error( `Unexpected error\" ${err.code} linking ${from} \u2192 ${to}`))))\n }\n return Promise.all(linkPromises)\n }\n\n const unlink = async (src:string, get:string[], dst:string[]) => {\n const unlinkPromises = []\n for(const f of get) for(const d of dst) {\n const tgt = d.endsWith('/') ? path.join(d, f) : d\n unlinkPromises.push(\n fs.unlink(path.join(tgt)))\n }\n return Promise.all(unlinkPromises)\n }\n\n // but we do watch the directories where we searched, so new files and deletions can be handled\n const watch = async (base:string, dst:string[]) => {\n const watcher = chokidar.watch( base, cfg.watcher ?? {} )\n\n watcher.on(\"add\", (relativePath) => link(base,[relativePath], dst))\n watcher.on(\"unlink\", (relativePath) => unlink(base,[relativePath], dst))\n watchers.push(watcher)\n }\n\n // initial creation of all directories and files\n const src = Promise.all( cfg.mappings.map( async e => {\n const configured_src = e.src ?? \".\"\n const src = path.join(sources[ configured_src[0] as keyof typeof sources ] ?? app, configured_src)\n const dst = (Array.isArray(e.dst) ? e.dst : [e.dst ?? '']).map(d => path.join(config.root,\"virtual/\",d))\n const get = replacePatterns(Array.isArray(e.get) ? e.get : [e.get ?? '**'])\n\n if( config?.services?.backend?.enableDebug && !src.startsWith(root) ) watch(src, dst)\n\n return globby(get,{cwd: src, ignore: ignore })\n .then(matches => link(src, matches, dst)).catch( err => err.errno != 17 && console.log( err))\n }))\n //fs.writeFileSync(path.join(root, `lst.tsv`), files.map(e => e.join(\"\\t\")).join(\"\\n\"),\"utf8\")\n return src\n}\n\n\n", "import type { RacletteConfig, WorkbenchConfig } from \"./types\"\nimport chalk from \"chalk\"\nimport fs from \"fs-extra\"\nimport path from \"path\"\nimport { logger } from \"src/logger\"\n\n/**\n * Safely write a file, ensuring the target doesn't exist as a directory first\n */\nconst safeWriteFile = async (\n filePath: string,\n content: string,\n): Promise<void> => {\n try {\n // Ensure the parent directory exists\n await fs.ensureDir(path.dirname(filePath))\n\n // Check if the target path exists\n if (await fs.pathExists(filePath)) {\n const stats = await fs.stat(filePath)\n if (stats.isDirectory()) {\n console.warn(\n chalk.yellow(`\u26A0\uFE0F Removing directory at ${filePath} to create file`),\n )\n await fs.remove(filePath)\n }\n }\n\n // Write the file\n await fs.writeFile(filePath, content)\n } catch (error: any) {\n logger.error(` Error writing file ${filePath}: ${error.message}`)\n throw error\n }\n}\n\nexport const generateServiceConfigs = async (\n config: RacletteConfig,\n racletteDir: string,\n): Promise<void> => {\n logger.debug(\"Generating service configuration files...\")\n\n // Create directories if they don't exist\n const backendDir = path.join(racletteDir, \"backend\")\n const frontendDir = path.join(racletteDir, \"frontend\")\n\n await fs.ensureDir(backendDir)\n await fs.ensureDir(frontendDir)\n\n // Extract common/global attributes\n const globalConfig = {\n name: config.name,\n env: config.env,\n modules: config.modules,\n plugins: config.plugins,\n global: config.global,\n }\n\n // Generate backend config as a ts file with all backend-specific properties\n const backendConfigObj = {\n ...globalConfig,\n service: \"backend\",\n // Include all properties from backend\n ...config.backend,\n }\n\n const backendConfig = `\n// Generated racletteJS Backend Configuration\n// This file is auto-generated, do not edit directly\n\nexport const racletteConfig = ${JSON.stringify(backendConfigObj, null, 2)};\n\nexport default racletteConfig;\n`\n\n await safeWriteFile(\n path.join(backendDir, \"raclette.config.js\"),\n backendConfig,\n )\n\n // Generate frontend config as a ts file with all frontend-specific properties\n const frontendConfigObj = {\n ...globalConfig,\n service: \"frontend\",\n // Dynamically include all frontend properties\n ...config.frontend,\n }\n\n const frontendConfig = `\n// Generated racletteJS Frontend Configuration\n// This file is auto-generated, do not edit directly\n\nexport const racletteConfig = ${JSON.stringify(frontendConfigObj, null, 2)};\n\nexport default racletteConfig;\n`\n\n await safeWriteFile(\n path.join(frontendDir, \"raclette.config.js\"),\n frontendConfig,\n )\n\n logger.success(\"Service configuration files generated\")\n}\n\n/**\n * Dynamically generate TypeScript definitions from an object structure\n */\nconst generateDynamicTypeDefinition = (\n obj: any,\n interfaceName: string,\n): string => {\n // Start with the interface declaration\n let typeDefinition = `\n// Generated racletteJS Configuration Types\n// This file is auto-generated, do not edit directly\n\nexport interface ${interfaceName} {\n`\n\n // Process each top-level property\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n // For nested objects, use the type generator\n typeDefinition += ` ${key}: ${generateTypeDefinitions(value)};\\n`\n } else if (Array.isArray(value)) {\n // For arrays, check if they're simple or complex\n if (\n value.length > 0 &&\n typeof value[0] === \"object\" &&\n value[0] !== null\n ) {\n typeDefinition += ` ${key}: Array<any>;\\n`\n } else if (value.length > 0) {\n typeDefinition += ` ${key}: Array<${typeof value[0]}>;\\n`\n } else {\n typeDefinition += ` ${key}: any[];\\n`\n }\n // For primitives, use their type\n } else if (typeof value === \"string\" && value.includes('\"')) {\n // For string literals like framework: \"vue\"\n typeDefinition += ` ${key}: \"${value}\";\\n`\n } else {\n typeDefinition += ` ${key}: ${typeof value};\\n`\n }\n }\n\n // Close the interface and add export\n typeDefinition += `}\n\nexport const racletteConfig: ${interfaceName};\nexport default racletteConfig;\n`\n\n return typeDefinition\n}\n\n/**\n * Generate TypeScript type definitions from an object\n */\nconst generateTypeDefinitions = (\n obj: any,\n indent = 0,\n isRoot = true,\n skipFirstLevel = false,\n): string => {\n if (!obj || typeof obj !== \"object\" || Array.isArray(obj)) {\n return \"any\"\n }\n\n const indentStr = \" \".repeat(indent)\n const entries = Object.entries(obj)\n\n if (entries.length === 0) {\n return \"Record<string, any>\"\n }\n\n if (skipFirstLevel) {\n return entries\n .map(([key, value]) => {\n if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value)\n ) {\n return `${key}: ${generateTypeDefinitions(value, indent + 2, false)}`\n } else if (Array.isArray(value)) {\n return `${key}: any[]`\n } else {\n return `${key}: ${typeof value}`\n }\n })\n .join(\";\\n\" + indentStr)\n }\n\n const typeDefinition = entries\n .map(([key, value]) => {\n if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value)\n ) {\n return `${indentStr} ${key}: ${generateTypeDefinitions(value, indent + 4, false)}`\n } else if (Array.isArray(value)) {\n return `${indentStr} ${key}: any[]`\n } else {\n return `${indentStr} ${key}: ${typeof value}`\n }\n })\n .join(\";\\n\")\n\n return `{\\n${typeDefinition};\\n${indentStr}}`\n}\n\n// TODO: we should use a validation lib/schema language here instead of that hardcoding\n// Validate workbench configuration against allowed keys\nexport const validateWorkbenchConfig = (\n config: any,\n): config is WorkbenchConfig => {\n if (!config || typeof config !== \"object\") {\n throw new Error(\"Workbench configuration must be an object\")\n }\n\n // Check if frontend exists and is an object\n if (!config.frontend || typeof config.frontend !== \"object\") {\n throw new Error('Workbench configuration must have a \"frontend\" object')\n }\n\n // Validate frontend.i18n if present\n if (config.frontend.i18n !== undefined) {\n if (typeof config.frontend.i18n !== \"object\") {\n throw new Error(\"frontend.i18n must be an object\")\n }\n\n if (config.frontend.i18n.locales !== undefined) {\n if (!Array.isArray(config.frontend.i18n.locales)) {\n throw new Error(\"frontend.i18n.locales must be an array\")\n }\n\n if (\n !config.frontend.i18n.locales.every(\n (locale: string) => typeof locale === \"string\",\n )\n ) {\n throw new Error(\"All locales must be strings\")\n }\n }\n }\n\n return true\n}\n\n// Create workbench configuration file\nexport const createWorkbenchConfigFile = async (\n workbenchConfig: WorkbenchConfig,\n projectPath: string = process.cwd(),\n): Promise<string> => {\n const racletteDir = path.join(projectPath, \".raclette\")\n const configFilePath = path.join(racletteDir, \"raclette.config.workbench.js\")\n\n // Ensure .raclette directory exists\n await fs.mkdir(racletteDir, { recursive: true })\n\n // Generate the config file content\n const configContent = `import { defineRacletteConfig } from \"@raclettejs/core\"\n\nexport default defineRacletteConfig(${JSON.stringify(workbenchConfig, null, 2)})\n`\n\n // Write the configuration file\n await fs.writeFile(configFilePath, configContent, \"utf8\")\n\n return configFilePath\n}\n", "import chalk from \"chalk\"\nimport fs from \"fs-extra\"\nimport path from \"path\"\nimport type { RacletteConfig } from \"./types\"\nimport { isContainerRunning, executeInContainer } from \"./docker-utils\"\n\n/**\n * Check if a service is running\n */\nexport const isServiceRunning = (containerName: string): boolean => {\n return isContainerRunning(containerName)\n}\n\n/**\n * Get actual container name for a service\n */\nexport const getContainerName = async (\n service: string,\n config: RacletteConfig,\n dockerComposePath: string,\n): Promise<string> => {\n const projectName = config?.name ?? path.basename(process.cwd())\n\n // Default container name based on project\n let containerName = `${projectName}-${service}`\n\n // Check if service has a custom name in config\n if (config?.services?.[service]?.name) {\n containerName = config.services[service].name\n }\n\n // Check if specific container environment variable exists in docker-compose\n try {\n const composeContent = await fs.readFile(dockerComposePath, \"utf8\")\n const envVarMatch = new RegExp(\n `\\\\$\\\\{RACLETTE_${service.toUpperCase()}_CONTAINERNAME:-([^}]+)\\\\}`,\n ).exec(composeContent)\n if (envVarMatch && envVarMatch[1]) {\n containerName = envVarMatch[1]\n }\n } catch (error) {\n // Ignore errors reading compose file\n console.warn(\n chalk.yellow(\n `Warning: Could not read docker-compose file to determine container name: ${error.message}`,\n ),\n )\n }\n\n return containerName\n}\n\n/**\n * Update dependencies for a service by running the check-dependencies.sh script\n */\nexport const updateServiceDependencies = async (\n service: string,\n config: RacletteConfig,\n dockerComposePath: string,\n): Promise<boolean> => {\n // Determine actual container name\n const containerName = await getContainerName(\n service,\n config,\n dockerComposePath,\n )\n\n // Check if the service is running\n if (!isServiceRunning(containerName)) {\n // no problem, then the package will get installed on startup\n return false\n }\n\n // Execute dependency check script inside the container\n try {\n console.log(chalk.blue(`\uD83D\uDCE6 Updating dependencies for ${service}...`))\n\n // Execute check-dependencies.sh directly inside the container\n executeInContainer(\n containerName,\n \"/app/check-dependencies.sh echo 'Dependency check completed'\",\n { stdio: \"inherit\" },\n )\n\n // Check the install result file to see if there was an error\n try {\n // Read the install result code that our script created\n const resultCode = executeInContainer(\n containerName,\n \"cat /app/node_modules/.install-result\",\n { stdio: \"pipe\" },\n ).trim()\n\n if (resultCode === \"0\") {\n console.log(\n chalk.green(`\u2705 Dependencies for ${service} updated successfully`),\n )\n return true\n } else {\n console.error(\n chalk.red(\n `\u274C Dependency installation for ${service} failed with code ${resultCode}`,\n ),\n )\n console.error(\n chalk.red(\n `Some packages might be incompatible with your Node.js version or have other issues.`,\n ),\n )\n console.error(\n chalk.yellow(`Check the logs above for specific error messages.`),\n )\n return false\n }\n } catch (resultError) {\n // If we can't read the result file, assume it succeeded\n // (This is a fallback for backward compatibility)\n console.log(\n chalk.green(`\u2705 Dependencies for ${service} updated (status unknown)`),\n )\n return true\n }\n } catch (error) {\n console.error(\n chalk.red(\n `\u274C Error updating dependencies for ${service}: ${error.message}`,\n ),\n )\n return false\n }\n}\n\n/**\n * Update dependencies for the specified target (frontend, backend, or both)\n */\nexport const updateDependencies = async (\n target: PackageTarget,\n config: RacletteConfig,\n racletteDir: string,\n): Promise<boolean> => {\n console.log(chalk.blue(`\uD83E\uDDC0 Updating package dependencies...`))\n\n const dockerComposePath = path.join(racletteDir, \"docker-compose.yml\")\n\n if (!(await fs.pathExists(dockerComposePath))) {\n console.error(\n chalk.yellow(\n \"\u26A0\uFE0F No docker-compose.yml found. Services may not be running with racletteJS.\",\n ),\n )\n return false\n }\n\n let updated = false\n let allSucceeded = true\n\n if (target === \"frontend\" || target === \"both\") {\n const frontendSuccess = await updateServiceDependencies(\n \"frontend\",\n config,\n dockerComposePath,\n )\n updated = frontendSuccess || updated\n allSucceeded = allSucceeded && frontendSuccess\n }\n\n if (target === \"backend\" || target === \"both\") {\n const backendSuccess = await updateServiceDependencies(\n \"backend\",\n config,\n dockerComposePath,\n )\n updated = backendSuccess || updated\n allSucceeded = allSucceeded && backendSuccess\n }\n\n if (updated && !allSucceeded) {\n console.log(\n chalk.yellow(\n \"\u26A0\uFE0F Some services encountered errors during dependency installation.\",\n ),\n )\n console.log(\n chalk.yellow(\n \"You may need to address compatibility issues in your package.json.\",\n ),\n )\n }\n\n return updated && allSucceeded\n}\n", "import chalk from \"chalk\"\nimport { spawn } from \"child_process\"\nimport fs from \"fs-extra\"\nimport path from \"path\"\nimport type { RacletteConfig } from \"./types\"\nimport { getContainerName } from \"./package-updater\"\nimport { isContainerRunning } from \"./docker-utils\"\nimport { logger } from \"./logger\"\nimport { checkWorkbenchSetup } from \"src/dev-environment\"\n\ninterface LogOptions {\n follow: boolean\n tail: string\n}\n\n/**\n * Main log handler - orchestrates the logging process\n */\nexport const handleLogCommand = async (\n services: string[],\n options: LogOptions,\n config: RacletteConfig,\n dockerComposePath: string,\n): Promise<void> => {\n // Check for workbench service and handle it specially\n if (services.includes(\"workbench\")) {\n await handleWorkbenchLogs(config, options)\n return\n }\n\n // Determine which services to show logs for\n let servicesToLog: string[] = []\n\n if (services.length === 0) {\n // No services specified, log all enabled services\n servicesToLog = getEnabledServices(config)\n console.log(\n chalk.blue(\n `\uD83D\uDCCB No services specified, showing logs for all enabled services: ${servicesToLog.join(\", \")}`,\n ),\n )\n } else {\n // Validate specified services\n const enabledServices = getEnabledServices(config)\n const invalidServices = services.filter(\n (service: string) => !enabledServices.includes(service),\n )\n\n if (invalidServices.length > 0) {\n console.error(\n chalk.red(\n `\u274C Invalid services specified: ${invalidServices.join(\", \")}`,\n ),\n )\n console.log(\n chalk.yellow(`Available services: ${enabledServices.join(\", \")}`),\n )\n throw new Error(\"Invalid services specified\")\n }\n\n servicesToLog = services\n console.log(chalk.blue(`\uD83D\uDCCB Showing logs for: ${servicesToLog.join(\", \")}`))\n }\n\n // Check if any of the services are actually running\n const runningServices = await checkRunningServices(\n servicesToLog,\n config,\n dockerComposePath,\n )\n\n if (runningServices.length === 0) {\n console.error(\n chalk.red(\"\u274C None of the specified services appear to be running.\"),\n )\n console.log(\n chalk.yellow(\n \"\uD83D\uDCA1 Try running 'raclette dev' first to start the services.\",\n ),\n )\n throw new Error(\"No running services found\")\n }\n\n if (runningServices.length < servicesToLog.length) {\n const notRunning = servicesToLog.filter((s) => !runningServices.includes(s))\n console.warn(\n chalk.yellow(\n `\u26A0\uFE0F Some services are not running: ${notRunning.join(\", \")}`,\n ),\n )\n console.log(\n chalk.blue(\n `\uD83D\uDCCB Showing logs for running services: ${runningServices.join(\", \")}`,\n ),\n )\n servicesToLog = runningServices\n }\n\n // Follow logs using docker-compose\n await followDockerLogs(config, dockerComposePath, servicesToLog, options)\n}\n\n/**\n * Get list of enabled services from config\n */\nfunction getEnabledServices(config: RacletteConfig): string[] {\n const enabled: string[] = []\n\n if (config.services?.frontend?.enabled) enabled.push(\"frontend\")\n if (config.services?.backend?.enabled) enabled.push(\"backend\")\n if (config.services?.mongodb?.enabled) enabled.push(\"mongodb\")\n if (config.services?.cache?.enabled) enabled.push(\"cache\")\n if (config.services?.workbench?.enabled) enabled.push(\"workbench\")\n if (config.services?.workbench?.enabled) enabled.push(\"workbench\")\n\n return enabled\n}\n\n/**\n * Check which services are actually running\n */\nasync function checkRunningServices(\n services: string[],\n config: RacletteConfig,\n dockerComposePath: string,\n): Promise<string[]> {\n const runningServices: string[] = []\n\n for (const service of services) {\n try {\n const containerName = await getContainerName(\n service,\n config,\n dockerComposePath,\n )\n if (isContainerRunning(containerName)) {\n runningServices.push(service)\n }\n } catch (error) {\n // If we can't determine the container name, skip this service\n console.warn(\n chalk.yellow(\n `\u26A0\uFE0F Could not check status of service '${service}': ${error.message}`,\n ),\n )\n }\n }\n\n return runningServices\n}\n\n/**\n * Follow Docker logs using docker-compose\n */\nasync function followDockerLogs(\n config: RacletteConfig,\n dockerComposePath: string,\n services: string[],\n options: LogOptions,\n): Promise<void> {\n const projectName = config?.name ?? path.basename(process.cwd())\n\n console.log(\n chalk.blue(\n `\uD83D\uDCCB Following logs for: ${services.join(\", \")} ${options.follow ? \"(press Ctrl+C to stop)\" : \"\"}`,\n ),\n )\n\n // Build docker-compose logs command\n const logArgs = [\"-p\", projectName, \"-f\", dockerComposePath, \"logs\"]\n\n if (options.follow) {\n logArgs.push(\"--follow\")\n }\n\n if (options.tail) {\n logArgs.push(\"--tail\", options.tail)\n }\n\n // Add service names\n logArgs.push(...services)\n\n try {\n // Start log process using spawn for real-time output\n const logProcess = spawn(\"docker\", [\"compose\", ...logArgs], {\n stdio: \"inherit\",\n shell: true,\n cwd: path.dirname(dockerComposePath),\n })\n\n // Handle process events\n logProcess.on(\"close\", (code) => {\n if (!logProcess.killed) {\n console.log(chalk.yellow(`\\nLog process ended with code ${code ?? 0}`))\n }\n })\n\n logProcess.on(\"error\", (error) => {\n console.error(chalk.red(`\u274C Error with log process: ${error.message}`))\n })\n\n // Handle Ctrl+C gracefully\n process.on(\"SIGINT\", () => {\n console.log(chalk.yellow(\"\\n\uD83D\uDED1 Stopping log following...\"))\n logProcess.kill(\"SIGTERM\")\n process.exit(0)\n })\n\n // Wait for the process to complete if not following\n if (!options.follow) {\n await new Promise<void>((resolve) => {\n logProcess.on(\"close\", () => resolve())\n })\n } else {\n // Keep the process alive for log following\n await new Promise<void>(() => {}) // Never resolves, keeps process alive\n }\n } catch (error) {\n console.error(chalk.red(`\u274C Error following logs: ${error.message}`))\n throw error\n }\n}\n\n/**\n * Handle workbench logs by calling yarn log on the workbench instance\n */\nasync function handleWorkbenchLogs(\n config: RacletteConfig,\n options: LogOptions,\n): Promise<void> {\n console.log(chalk.blue(\"\uD83D\uDD27 Handling workbench logs...\"))\n\n const workbenchPath = checkWorkbenchSetup(config)\n\n logger.debug(\"Calling yarn log frontend backend on workbench instance...\")\n\n try {\n // Build yarn log command for workbench\n const yarnArgs = [\"log\", \"frontend\", \"backend\"]\n\n if (!options.follow) {\n yarnArgs.push(\"--no-follow\")\n }\n\n if (options.tail) {\n yarnArgs.push(\"--tail\", options.tail)\n }\n\n // Start yarn log process\n const yarnProcess = spawn(\"yarn\", yarnArgs, {\n cwd: workbenchPath,\n stdio: \"inherit\",\n shell: true,\n env: {\n ...process.env,\n // Pass through any workbench-specific environment variables\n NODE_ENV: \"development\",\n },\n })\n\n // Handle process events\n yarnProcess.on(\"close\", (code) => {\n if (!yarnProcess.killed) {\n console.log(\n chalk.yellow(`\\nWorkbench log process ended with code ${code ?? 0}`),\n )\n }\n })\n\n yarnProcess.on(\"error\", (error) => {\n console.error(\n chalk.red(`\u274C Error with workbench log process: ${error.message}`),\n )\n console.log(\n chalk.yellow(\n \"\uD83D\uDCA1 Make sure the workbench package has the 'log' script in its package.json\",\n ),\n )\n })\n\n // Handle Ctrl+C gracefully\n process.on(\"SIGINT\", () => {\n console.log(chalk.yellow(\"\\n\uD83D\uDED1 Stopping workbench log following...\"))\n yarnProcess.kill(\"SIGTERM\")\n process.exit(0)\n })\n\n // Wait for the process\n if (!options.follow) {\n await new Promise<void>((resolve) => {\n yarnProcess.on(\"close\", () => resolve())\n })\n } else {\n // Keep the process alive for log following\n await new Promise<void>(() => {}) // Never resolves, keeps process alive\n }\n } catch (error) {\n console.error(\n chalk.red(`\u274C Error calling workbench logs: ${error.message}`),\n )\n throw error\n }\n}\n", "import type { RacletteConfig } from \"./types\"\nimport chalk from \"chalk\"\nimport { spawn } from \"child_process\"\nimport fs from \"fs-extra\"\nimport path from \"path\"\nimport { setupVirtualFileSystem } from \"./virtual-file-system\"\nimport { setupNodePackages, ensureLockFilesExist } from \"./package-manager\"\nimport { generateTsConfig } from \"./ts-generator\"\nimport { generateEslintConfig } from \"./eslint-generator\"\nimport { generateServiceConfigs } from \"./config-generator\"\nimport {\n executeDockerComposeCommand,\n ensureDockerNetwork,\n checkDockerInstallation,\n executeDockerCommand,\n} from \"./docker-utils\"\nimport { generateDockerfiles } from \"./docker-generator\"\nimport {\n createProductionArtifacts,\n generateGenerationCompose,\n generateBuildTimeCompose,\n packageImagesForDistribution,\n} from \"./build-helper\"\nimport { logger } from \"src/logger\"\nimport {\n createWorkbenchConfigFile,\n validateWorkbenchConfig,\n} from \"src/config-generator\"\n\nexport type BuildMode = \"artifacts\" | \"images\" | \"package\"\n\nexport type BuildOptions = {\n outputDir?: string\n skipWorkbench?: boolean\n verbose?: boolean\n noCache?: boolean\n\n // Build mode selection\n mode?: BuildMode\n\n // Image configuration (for images and package modes)\n imageTag?: string // e.g., \"v1.0.0\" or \"2024-01-15\"\n imagePrefix?: string // e.g., \"mycompany/myapp\"\n generateLatest?: boolean // Also tag as :latest\n\n // Multi-architecture support\n buildx?: boolean // Enable buildx for multi-arch\n platforms?: string // Target platforms (e.g., \"linux/amd64,linux/arm64\")\n\n // Legacy options (for backward compatibility)\n buildOnly?: boolean\n buildImages?: boolean\n packageImages?: boolean\n}\n\nexport type BuildResult = {\n mode: BuildMode\n buildDir: string\n images?: {\n names: string[]\n tags: string[]\n }\n artifacts: {\n composeFile?: string\n deployScript?: string\n readmeFile?: string\n envExampleFile?: string\n }\n deploymentPackage?: string\n}\n\nconst DEFAULT_GENERATION_MODE_TIMEOUT_SECONDS = 60\nconst MAX_GENERATION_MODE_TIMEOUT_SECONDS = 7200\n\n/**\n * How long to poll for the generation backend container to exit (one attempt per second).\n * Override with RACLETTE_GENERATION_MODE_TIMEOUT_SECONDS (integer seconds, 1\u20137200).\n */\nconst getGenerationModeTimeoutSeconds = (): number => {\n const raw = process.env.RACLETTE_GENERATION_MODE_TIMEOUT_SECONDS\n let resolved: number\n let detail: string\n\n if (raw === undefined || raw === \"\") {\n resolved = DEFAULT_GENERATION_MODE_TIMEOUT_SECONDS\n detail = \"default (env unset)\"\n } else {\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isFinite(parsed) || parsed < 1) {\n resolved = DEFAULT_GENERATION_MODE_TIMEOUT_SECONDS\n detail = `invalid env \"${raw}\", using default`\n } else {\n resolved = Math.min(parsed, MAX_GENERATION_MODE_TIMEOUT_SECONDS)\n detail =\n parsed > MAX_GENERATION_MODE_TIMEOUT_SECONDS\n ? `capped from ${parsed}s to max ${MAX_GENERATION_MODE_TIMEOUT_SECONDS}s`\n : `from env RACLETTE_GENERATION_MODE_TIMEOUT_SECONDS=${raw}`\n }\n }\n\n console.log(\n chalk.gray(\n ` \u23F1\uFE0F Generation mode wait: ${resolved}s (${detail})`,\n ),\n )\n return resolved\n}\n\n/**\n * Main production build orchestrator - refined approach\n */\nexport const runProductionBuild = async (\n config: RacletteConfig,\n workingDir: string,\n options: BuildOptions = {},\n): Promise<BuildResult> => {\n const startTime = Date.now()\n\n // Determine build mode from options\n const mode = determineBuildMode(options)\n console.log(chalk.blue(`\uD83E\uDDC0 Starting racletteJS ${mode} build...`))\n\n checkDockerInstallation()\n\n const racletteDir = path.join(process.cwd(), \".raclette\")\n const buildDir = path.resolve(\n options.outputDir || path.join(racletteDir, \".build\"),\n )\n\n await fs.ensureDir(buildDir)\n await fs.emptyDir(buildDir)\n\n try {\n // Always do basic setup and generation\n await setupBuildEnvironment(config, workingDir, racletteDir)\n await runGenerationMode(config, workingDir, racletteDir)\n\n let result: BuildResult = {\n mode,\n buildDir,\n artifacts: {},\n }\n\n switch (mode) {\n case \"artifacts\":\n result = await buildArtifactsMode(\n config,\n racletteDir,\n buildDir,\n options,\n )\n break\n\n case \"images\":\n result = await buildImagesMode(config, racletteDir, buildDir, options)\n break\n\n case \"package\":\n result = await buildPackageMode(config, racletteDir, buildDir, options)\n break\n }\n\n const buildTime = (Date.now() - startTime) / 1000\n logger.success(` ${mode} build completed in ${buildTime}s`)\n\n printBuildSummary(result, config)\n return result\n } catch (error: any) {\n logger.error(`${mode} build failed: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Determine build mode from options\n */\nconst determineBuildMode = (options: BuildOptions): BuildMode => {\n // Direct mode specification takes precedence\n if (options.mode) {\n return options.mode\n }\n\n // Legacy compatibility\n if (options.packageImages) return \"package\"\n if (options.buildImages) return \"images\"\n if (options.buildOnly) return \"artifacts\"\n\n // Default: artifacts (for backward compatibility and local development)\n return \"artifacts\"\n}\n\n/**\n * Mode 1: Artifacts - local deployment ready\n */\nconst buildArtifactsMode = async (\n config: RacletteConfig,\n racletteDir: string,\n buildDir: string,\n options: BuildOptions,\n): Promise<BuildResult> => {\n // Check if this is the legacy --build-only mode\n const isBuildOnly = options.buildOnly\n\n if (isBuildOnly) {\n console.log(chalk.blue(\"\uD83D\uDCC1 Building application files only...\"))\n\n // For build-only mode, output directly to buildDir (no \"app\" subdirectory)\n await buildMainApp(config, racletteDir, buildDir, options)\n\n const hasWorkbench = await buildWorkbenchIfEnabled(\n config,\n buildDir,\n options,\n )\n\n console.log(chalk.green(\"\u2705 Build files ready\"))\n\n return {\n mode: \"artifacts\",\n buildDir,\n artifacts: {},\n }\n } else {\n // Full artifacts mode with deployment setup\n console.log(chalk.blue(\"\uD83D\uDCC1 Building local deployment artifacts...\"))\n\n // For full artifacts mode, use \"app\" subdirectory structure\n const appBuildDir = path.join(buildDir, \"service\")\n await buildMainApp(config, racletteDir, appBuildDir, options)\n\n const hasWorkbench = await buildWorkbenchIfEnabled(\n config,\n buildDir,\n options,\n )\n\n // Create production artifacts (docker-compose, deploy.sh, etc.)\n const composeFile = await createProductionArtifacts(\n config,\n buildDir,\n hasWorkbench,\n )\n\n // Create local deployment README\n const readmeFile = await createLocalDeploymentReadme(\n config,\n buildDir,\n hasWorkbench,\n )\n\n console.log(chalk.green(\"\u2705 Local deployment artifacts ready\"))\n\n return {\n mode: \"artifacts\",\n buildDir,\n artifacts: {\n composeFile,\n deployScript: path.join(buildDir, \"deploy.sh\"),\n readmeFile,\n envExampleFile: path.join(buildDir, \".env.example\"),\n },\n }\n }\n}\n\n/**\n * Mode 2: Images - CI/CD optimized\n */\nconst buildImagesMode = async (\n config: RacletteConfig,\n racletteDir: string,\n buildDir: string,\n options: BuildOptions,\n): Promise<BuildResult> => {\n console.log(chalk.blue(\"\uD83D\uDC33 Building Docker images for CI/CD...\"))\n\n const appBuildDir = path.join(buildDir, \"service\")\n await buildMainApp(config, racletteDir, appBuildDir, options)\n\n const hasWorkbench = await buildWorkbenchIfEnabled(config, buildDir, options)\n\n // Create minimal production artifacts needed for Docker build\n await createProductionArtifacts(config, buildDir, hasWorkbench)\n\n // Build and tag images with registry-friendly names\n const imageResult = await buildDockerImagesForRegistry(\n config,\n buildDir,\n hasWorkbench,\n options,\n )\n\n console.log(chalk.green(\"\u2705 Docker images ready for registry push\"))\n\n return {\n mode: \"images\",\n buildDir,\n images: imageResult,\n artifacts: {},\n }\n}\n\n/**\n * Mode 3: Package - offline deployment (updated with new syntax)\n */\nconst buildPackageMode = async (\n config: RacletteConfig,\n racletteDir: string,\n buildDir: string,\n options: BuildOptions,\n): Promise<BuildResult> => {\n console.log(chalk.blue(\"\uD83D\uDCE6 Building offline deployment package...\"))\n\n // First build images\n const imageResult = await buildImagesMode(\n config,\n racletteDir,\n buildDir,\n options,\n )\n\n // Package for offline deployment\n const timestamp = getCurrentTimestamp()\n const packageResult = await packageImagesForDistribution(\n config,\n buildDir,\n imageResult.images!.names,\n timestamp,\n imageResult.images!.names.some((name) => name.includes(\"workbench\")),\n )\n\n console.log(chalk.green(\"\u2705 Offline deployment package ready\"))\n\n return {\n ...imageResult,\n mode: \"package\",\n deploymentPackage: packageResult.packagePath,\n }\n}\n\n/**\n * Build Docker images with multi-architecture support\n */\nconst buildDockerImagesForRegistry = async (\n config: RacletteConfig,\n buildDir: string,\n hasWorkbench: boolean,\n options: BuildOptions,\n): Promise<{ names: string[]; tags: string[] }> => {\n const imagePrefix = options.imagePrefix || config.name\n const imageTag = options.imageTag || getCurrentTimestamp()\n const platforms = options.platforms || \"linux/amd64,linux/arm64\"\n let useBuildx = options.buildx || false\n\n const imageNames: string[] = []\n const allTags: string[] = [imageTag]\n\n if (options.generateLatest && !allTags.includes(\"latest\")) {\n allTags.push(\"latest\")\n }\n\n // Check if buildx is actually available before proceeding\n if (useBuildx) {\n try {\n await setupBuildxBuilder()\n console.log(\n chalk.blue(`\uD83C\uDFD7\uFE0F Building multi-architecture images for: ${platforms}`),\n )\n } catch (error: any) {\n console.warn(\n chalk.yellow(\n \"\u26A0\uFE0F Buildx not available, falling back to single-architecture builds\",\n ),\n )\n console.warn(chalk.yellow(` ${error.message}`))\n useBuildx = false\n }\n }\n\n if (useBuildx) {\n // Build each service with buildx\n const services = [\"frontend\", \"backend\"]\n if (hasWorkbench) {\n services.push(\"workbench-frontend\", \"workbench-backend\")\n }\n\n for (const service of services) {\n const registryImageName = `${imagePrefix}/${service}`\n const dockerfilePath = path.join(buildDir, `Dockerfile.${service}`)\n\n // Check if Dockerfile exists\n if (!(await fs.pathExists(dockerfilePath))) {\n throw new Error(`Dockerfile not found: ${dockerfilePath}`)\n }\n\n // Build tags for this service\n const serviceTags = allTags.map((tag) => `${registryImageName}:${tag}`)\n imageNames.push(...serviceTags)\n\n // Build multi-architecture image\n await buildMultiArchImage({\n context: buildDir,\n dockerfile: dockerfilePath,\n tags: serviceTags,\n platforms,\n push: false, // For now, just build locally\n noCache: options.noCache,\n verbose: options.verbose,\n })\n\n console.log(chalk.gray(` \u2705 Built ${service} for ${platforms}`))\n serviceTags.forEach((tag) => {\n console.log(chalk.gray(` ${tag}`))\n })\n }\n } else {\n // Fallback to regular docker-compose build (single architecture)\n console.log(chalk.gray(\" \uD83D\uDD28 Building single-architecture images...\"))\n\n const composeFile = path.join(buildDir, \"docker-compose.yml\")\n const buildArgs = [\"-f\", composeFile, \"build\"]\n\n if (options.noCache) {\n buildArgs.push(\"--no-cache\")\n }\n\n executeDockerComposeCommand(buildArgs, {\n stdio: options.verbose ? \"inherit\" : \"pipe\",\n cwd: buildDir,\n })\n\n // Tag images normally (existing logic)\n const services = [\"frontend\", \"backend\"]\n if (hasWorkbench) {\n services.push(\"workbench-frontend\", \"workbench-backend\")\n }\n\n for (const service of services) {\n const originalName = `${path.basename(buildDir)}-${service}`.replace(\n /\\./,\n \"\",\n )\n const registryImageName = `${imagePrefix}/${service}`\n\n allTags.forEach((tag) => {\n const taggedImage = `${registryImageName}:${tag}`\n executeDockerCommand([\"tag\", originalName, taggedImage], {\n stdio: \"pipe\",\n })\n imageNames.push(taggedImage)\n })\n\n console.log(chalk.gray(` \u2705 Tagged ${service}`))\n }\n }\n\n console.log(chalk.green(\" \u2705 Docker images built and tagged\"))\n return { names: imageNames, tags: allTags }\n}\n\n/**\n * Setup buildx builder for multi-architecture builds (QEMU approach)\n */\nconst setupBuildxBuilder = async (): Promise<void> => {\n try {\n // Check if buildx is available\n executeDockerCommand([\"buildx\", \"version\"], { stdio: \"pipe\" })\n\n // Setup QEMU for cross-platform emulation (CI-friendly approach)\n console.log(\n chalk.gray(\" \uD83D\uDCE6 Setting up QEMU for cross-platform emulation...\"),\n )\n executeDockerCommand(\n [\n \"run\",\n \"--rm\",\n \"--privileged\",\n \"multiarch/qemu-user-static\",\n \"--reset\",\n \"-p\",\n \"yes\",\n ],\n { stdio: \"pipe\" },\n )\n\n // Create fresh buildx builder (simpler than docker-container driver)\n console.log(chalk.gray(\" \uD83D\uDCE6 Creating buildx builder...\"))\n executeDockerCommand([\"buildx\", \"create\", \"--name\", \"multiarch\", \"--use\"], {\n stdio: \"pipe\",\n })\n\n // Bootstrap the builder\n executeDockerCommand([\"buildx\", \"inspect\", \"--bootstrap\"], {\n stdio: \"pipe\",\n })\n\n console.log(chalk.gray(\" \u2705 Buildx builder ready with QEMU emulation\"))\n } catch (error: any) {\n console.warn(\n chalk.yellow(\n \" \u26A0\uFE0F Buildx setup failed, falling back to single-architecture builds\",\n ),\n )\n console.warn(chalk.yellow(` ${error.message}`))\n throw new Error(\n \"Buildx not available - use single-architecture builds instead\",\n )\n }\n}\n\n/**\n * Build multi-architecture image with buildx\n */\nconst buildMultiArchImage = async (options: {\n context: string\n dockerfile: string\n tags: string[]\n platforms: string\n push: boolean\n noCache?: boolean\n verbose?: boolean\n}): Promise<void> => {\n const args = [\n \"buildx\",\n \"build\",\n \"--platform\",\n options.platforms,\n \"--file\",\n options.dockerfile,\n ]\n\n // Add tags\n options.tags.forEach((tag) => {\n args.push(\"--tag\", tag)\n })\n\n // Handle output - multi-platform images can't be loaded locally\n const platformCount = options.platforms.split(\",\").length\n if (options.push) {\n args.push(\"--push\")\n } else if (platformCount === 1) {\n // Single platform can be loaded\n args.push(\"--load\")\n } else {\n // Multi-platform builds need to be stored somewhere\n // Use registry cache or just build without loading\n console.log(\n chalk.yellow(\" \u26A0\uFE0F Multi-platform images cannot be loaded locally\"),\n )\n console.log(\n chalk.yellow(\" \u2139\uFE0F Images built but not loaded to local Docker\"),\n )\n }\n\n if (options.noCache) {\n args.push(\"--no-cache\")\n }\n\n // Add context path (the directory to build from)\n args.push(options.context)\n\n try {\n executeDockerCommand(args, {\n stdio: options.verbose ? \"inherit\" : \"pipe\",\n cwd: options.context,\n })\n } catch (error) {\n throw new Error(`Failed to build multi-architecture image: ${error}`)\n }\n}\n\n/**\n * Create local deployment README with basic information\n */\nconst createLocalDeploymentReadme = async (\n config: RacletteConfig,\n buildDir: string,\n hasWorkbench: boolean,\n): Promise<string> => {\n const readmeFile = path.join(buildDir, \"README.md\")\n const frontendPort = config.services.frontend?.port || 8081\n const workbenchPort = config.services.workbench?.frontendPort || 8083\n\n const readme = `# ${config.name} - Local Deployment\n\nThis build contains everything needed to deploy ${config.name} locally using Docker.\n\n## Quick Start\n\n1. **Configure environment:**\n \\`\\`\\`bash\n cp .env.example .env\n nano .env # Edit SERVER_TOKEN_SECRET and other settings\n \\`\\`\\`\n\n2. **Deploy:**\n \\`\\`\\`bash\n chmod +x deploy.sh\n ./deploy.sh\n \\`\\`\\`\n\n## What happens during deployment:\n\n- \uD83D\uDC33 Docker images are built from the included artifacts\n- \uD83D\uDFE2 Services start: frontend, backend, database, cache${hasWorkbench ? \", workbench\" : \"\"}\n- \uD83E\uDDEA Health checks verify everything is running\n- \u2705 Application becomes available\n\n## Application URLs\n\nAfter deployment:\n- **Main Application:** http://localhost:${frontendPort}\n${hasWorkbench ? `- **Workbench:** http://localhost:${workbenchPort}` : \"\"}\n\n## Environment Configuration\n\n**Required settings in .env:**\n- \\`SERVER_TOKEN_SECRET\\` - Generate a secure random string (required)\n- \\`MONGO_DATABASE\\` - Database name (default: ${config.name})\n\n**Optional settings:**\n- \\`RACLETTE_DEBUG_MODE\\` - Enable debug logging (default: false)\n- \\`RACLETTE_MONGODB_HOST\\` - Custom MongoDB connection\n- \\`RACLETTE_CACHE_URL\\` - Custom cache connection\n\n## Management Commands\n\n- **View logs:** \\`docker compose logs -f\\`\n- **Stop services:** \\`docker compose down\\`\n- **Restart services:** \\`docker compose restart\\`\n- **Remove everything:** \\`docker compose down -v\\` (\u26A0\uFE0F removes data)\n\n## Customization\n\nEdit \\`docker-compose.yml\\` to:\n- Change port mappings\n- Add volume mounts for custom files\n- Modify environment variables\n- Add additional services\n\n## Troubleshooting\n\n- **Health check fails:** Backend may need more time to start, check logs\n- **502 errors:** Backend not responding, verify database connection\n- **Permission issues:** Ensure deploy.sh is executable (\\`chmod +x deploy.sh\\`)\n\nBuilt on: ${new Date().toISOString()}\nBuild type: Local deployment artifacts\n`\n\n await fs.writeFile(readmeFile, readme)\n console.log(chalk.gray(\" \u2705 Created local deployment README\"))\n\n return readmeFile\n}\n\n/**\n * Enhanced build summary with mode-specific information\n */\nconst printBuildSummary = (\n result: BuildResult,\n config: RacletteConfig,\n): void => {\n const frontendPort = config.services.frontend?.port || 8081\n const workbenchPort = config.services.workbench?.frontendPort || 8083\n const hasWorkbench =\n result.images?.names.some((name) => name.includes(\"workbench\")) || false\n\n console.log(\"\")\n console.log(chalk.blue(\"\uD83D\uDCE6 Build Summary:\"))\n console.log(` Mode: ${chalk.cyan(result.mode)}`)\n console.log(` Build Directory: ${chalk.cyan(result.buildDir)}`)\n\n if (result.mode === \"artifacts\") {\n console.log(\n ` Docker Compose: ${chalk.cyan(result.artifacts.composeFile || \"N/A\")}`,\n )\n console.log(\n ` Deploy Script: ${chalk.cyan(result.artifacts.deployScript || \"N/A\")}`,\n )\n console.log(\n ` README: ${chalk.cyan(result.artifacts.readmeFile || \"N/A\")}`,\n )\n }\n\n if (result.images && result.images.names.length > 0) {\n console.log(\n ` Docker Images: ${chalk.cyan(result.images.names.length)} built`,\n )\n result.images.names.forEach((img) => {\n console.log(` - ${chalk.gray(img)}`)\n })\n }\n\n if (result.deploymentPackage) {\n console.log(\n ` Deployment Package: ${chalk.cyan(result.deploymentPackage)}`,\n )\n }\n\n console.log(\"\")\n console.log(chalk.blue(\"\uD83D\uDE80 Next steps:\"))\n\n switch (result.mode) {\n case \"artifacts\":\n console.log(\n chalk.yellow(\" 1. Configure: cp .env.example .env && edit .env\"),\n )\n console.log(\n chalk.yellow(\" 2. Deploy: chmod +x deploy.sh && ./deploy.sh\"),\n )\n console.log(\n chalk.yellow(` \u2192 App will be at http://localhost:${frontendPort}`),\n )\n if (hasWorkbench) {\n console.log(\n chalk.yellow(` \u2192 Workbench at http://localhost:${workbenchPort}`),\n )\n }\n break\n\n case \"images\":\n console.log(chalk.yellow(\" Images ready for registry push:\"))\n result.images?.names.forEach((img) => {\n console.log(chalk.yellow(` docker push ${img}`))\n })\n console.log(\"\")\n console.log(chalk.gray(\" \uD83D\uDCA1 Example pipeline usage:\"))\n console.log(\n chalk.gray(\" docker push myregistry.com/myproject/frontend:v1.0.0\"),\n )\n console.log(\n chalk.gray(\" docker push myregistry.com/myproject/backend:v1.0.0\"),\n )\n break\n\n case \"package\":\n console.log(chalk.yellow(\" 1. Transfer package to target system\"))\n console.log(\n chalk.yellow(\" 2. Extract: tar -xzf deployment-package.tar.gz\"),\n )\n console.log(\n chalk.yellow(\" 3. Configure: cp .env.example .env && edit .env\"),\n )\n console.log(chalk.yellow(\" 4. Deploy: ./deploy.sh\"))\n break\n }\n}\n\n/**\n * Get current timestamp for image tagging\n */\nconst getCurrentTimestamp = (): string => {\n return new Date().toISOString().slice(0, 10).replace(/-/g, \"\")\n}\n\n/**\n * Setup build environment (reuse existing dev setup logic)\n */\nconst setupBuildEnvironment = async (\n config: RacletteConfig,\n workingDir: string,\n racletteDir: string,\n): Promise<void> => {\n console.log(chalk.blue(\"\uD83D\uDCC1 Setting up build environment...\"))\n\n // Ensure lock files exist and setup packages (reuse dev logic)\n await ensureLockFilesExist(config)\n await setupNodePackages(config)\n\n // Setup virtual file system (reuse dev logic)\n await setupVirtualFileSystem(config)\n\n // Generate configs (reuse dev logic)\n await generateTsConfig(config, racletteDir)\n await generateEslintConfig(config, racletteDir)\n await generateServiceConfigs(config, racletteDir)\n\n console.log(chalk.green(\"\u2705 Build environment ready\"))\n}\n\n/**\n * Run backend in generation mode to create frontend files\n */\nconst runGenerationMode = async (\n config: RacletteConfig,\n workingDir: string,\n racletteDir: string,\n): Promise<void> => {\n console.log(chalk.blue(\"\u26A1 Running generation mode...\"))\n\n const projectName = `${config.name}-build`\n const buildComposePath = path.join(racletteDir, \"docker-compose.generate.yml\")\n\n // making sure dockerfiles for backend are generated by regenerating all\n await generateDockerfiles(config, racletteDir, \"build\")\n\n // Create build-time docker-compose (backend + databases only)\n await generateGenerationCompose(config, workingDir, buildComposePath)\n\n // Ensure network exists\n ensureDockerNetwork(\"raclette_shared\")\n\n try {\n // Start services for generation\n console.log(chalk.gray(\" \uD83D\uDC33 Starting generation services...\"))\n executeDockerComposeCommand(\n [\"-p\", projectName, \"-f\", buildComposePath, \"up\", \"-d\"],\n { stdio: \"pipe\" },\n )\n\n // Wait for backend to complete generation and exit\n console.log(chalk.gray(\" \u23F3 Waiting for file generation to complete...\"))\n\n // Monitor the backend container until it exits\n let attempts = 0\n const maxAttempts = getGenerationModeTimeoutSeconds()\n\n while (attempts < maxAttempts) {\n try {\n const result = await executeDockerComposeCommand(\n [\"-p\", projectName, \"-f\", buildComposePath, \"ps\", \"-q\", \"backend\"],\n { stdio: \"pipe\" },\n )\n\n if (!result.trim()) {\n // Container has exited\n break\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000))\n attempts++\n } catch (error) {\n // Container likely exited\n break\n }\n }\n\n if (attempts >= maxAttempts) {\n throw new Error(\n `Generation mode timed out after ${maxAttempts}s (set RACLETTE_GENERATION_MODE_TIMEOUT_SECONDS to increase)`,\n )\n }\n\n console.log(chalk.green(\" \u2705 File generation completed\"))\n } finally {\n // Cleanup generation services\n try {\n executeDockerComposeCommand(\n [\"-p\", projectName, \"-f\", buildComposePath, \"down\"],\n { stdio: \"pipe\" },\n )\n } catch (error) {\n console.warn(\n chalk.yellow(\"Warning: Could not cleanup generation services\"),\n )\n }\n }\n}\n\n/**\n * Build main app components (frontend + backend) in parallel\n */\nconst buildMainApp = async (\n config: RacletteConfig,\n racletteDir: string,\n appBuildDir: string,\n options: BuildOptions,\n): Promise<void> => {\n console.log(chalk.blue(\"\uD83C\uDFA8 Building main application...\"))\n\n await fs.ensureDir(appBuildDir)\n await generateDockerfiles(config, racletteDir, \"build\")\n\n // Build both frontend and backend\n await buildFrontendAndBackend(config, racletteDir, appBuildDir, options)\n}\n\n/**\n * Build frontend and backend with proper Node.js structure\n */\nconst buildFrontendAndBackend = async (\n config: RacletteConfig,\n racletteDir: string,\n appBuildDir: string,\n options: BuildOptions,\n): Promise<void> => {\n console.log(chalk.gray(\" \uD83D\uDE80 Building frontend and backend...\"))\n\n const projectName = `${config.name}-app-build`\n const buildComposePath = path.join(\n racletteDir,\n \"docker-compose.app-build.yml\",\n )\n const tempBuildDir = path.join(racletteDir, \".temp-build\")\n\n // Create temporary build directory\n await fs.ensureDir(tempBuildDir)\n await fs.ensureDir(path.join(tempBuildDir, \"frontend\"))\n await fs.ensureDir(path.join(tempBuildDir, \"backend\"))\n\n try {\n // Generate build compose for both services\n await generateBuildTimeCompose(\n config,\n process.cwd(),\n buildComposePath,\n tempBuildDir,\n )\n\n // Build both services in parallel\n const composeArgs = [\"-p\", projectName, \"-f\", buildComposePath, \"up\"]\n\n // Add --build flag to ensure fresh builds\n if (options.noCache) {\n composeArgs.push(\"--build\", \"--force-recreate\")\n }\n\n console.log(chalk.gray(\" \uD83D\uDD28 Starting parallel build process...\"))\n executeDockerComposeCommand(composeArgs, {\n stdio: options.verbose ? \"inherit\" : \"pipe\",\n cwd: process.cwd(),\n })\n\n // Process and copy results to final locations\n if (config.services.frontend?.enabled) {\n const frontendBuildDir = path.join(appBuildDir, \"frontend\")\n await fs.ensureDir(frontendBuildDir)\n\n // Copy frontend build output (static files)\n const frontendTempDir = path.join(tempBuildDir, \"frontend\")\n if (await fs.pathExists(frontendTempDir)) {\n const files = await fs.readdir(frontendTempDir)\n if (files.length === 0) {\n throw new Error(\"Frontend build produced no output files\")\n }\n await fs.copy(frontendTempDir, frontendBuildDir)\n console.log(chalk.green(\" \u2705 Frontend build complete\"))\n } else {\n throw new Error(\n \"Frontend build did not produce expected output directory\",\n )\n }\n }\n\n if (config.services.backend?.enabled) {\n const backendBuildDir = path.join(appBuildDir, \"backend\")\n await fs.ensureDir(backendBuildDir)\n\n // Verify backend build output exists\n const backendTempDir = path.join(tempBuildDir, \"backend\")\n if (!(await fs.pathExists(backendTempDir))) {\n throw new Error(\n \"Backend build did not produce expected output directory\",\n )\n }\n\n // For backend, we need to create a proper Node.js application structure\n await createBackendNodeApplication(\n config,\n racletteDir,\n backendBuildDir,\n tempBuildDir,\n )\n console.log(chalk.green(\" \u2705 Backend build complete\"))\n }\n\n console.log(chalk.green(\" \u2705 Application build completed\"))\n } finally {\n // Cleanup build services\n try {\n executeDockerComposeCommand(\n [\"-p\", projectName, \"-f\", buildComposePath, \"down\"],\n { stdio: \"pipe\" },\n )\n } catch (error) {\n console.warn(chalk.yellow(\"Warning: Could not cleanup build services\"))\n }\n // Cleanup temporary files\n await fs.remove(tempBuildDir)\n await fs.remove(buildComposePath)\n }\n}\n\n/**\n * Create a proper Node.js application structure for the backend\n */\nconst createBackendNodeApplication = async (\n config: RacletteConfig,\n racletteDir: string,\n backendBuildDir: string,\n tempBuildDir: string,\n): Promise<void> => {\n console.log(chalk.gray(\" \uD83D\uDCE6 Creating backend Node.js application...\"))\n\n const backendTempDir = path.join(tempBuildDir, \"backend\")\n\n // Ensure the backend build directory exists\n await fs.ensureDir(backendBuildDir)\n\n // 1. Copy the entire backend build output (includes dist/, package.json, yarn.lock)\n if (await fs.pathExists(backendTempDir)) {\n await fs.copy(backendTempDir, backendBuildDir)\n console.log(chalk.gray(\" \u2705 Copied backend build artifacts\"))\n }\n\n // 2. Verify dist folder exists\n const distPath = path.join(backendBuildDir, \"dist\")\n if (!(await fs.pathExists(distPath))) {\n throw new Error(\"Backend build did not produce expected dist/ folder\")\n }\n\n // 3. Verify backend.js entry point exists\n const backendEntryPoint = path.join(distPath, \"src\", \"server.js\")\n if (!(await fs.pathExists(backendEntryPoint))) {\n throw new Error(\n \"Backend build did not produce expected dist/src/server.js entry point\",\n )\n }\n\n // 4. Process package.json for production\n const packageJsonPath = path.join(backendBuildDir, \"package.json\")\n if (await fs.pathExists(packageJsonPath)) {\n const packageJson = await fs.readJson(packageJsonPath)\n\n // Create production-ready package.json\n const productionPackageJson = {\n ...packageJson,\n scripts: {\n start: \"node dist/src/server.js\", // Point to our built backend\n ...packageJson.scripts,\n },\n // Remove devDependencies for production\n devDependencies: undefined,\n }\n\n await fs.writeJson(packageJsonPath, productionPackageJson, { spaces: 2 })\n console.log(chalk.gray(\" \u2705 Updated package.json for production\"))\n } else {\n throw new Error(\"Backend build did not include package.json\")\n }\n\n // 5. Verify yarn.lock exists for reproducible builds\n const yarnLockPath = path.join(backendBuildDir, \"yarn.lock\")\n if (!(await fs.pathExists(yarnLockPath))) {\n console.warn(chalk.yellow(\" \u26A0\uFE0F No yarn.lock found in backend build\"))\n }\n\n console.log(\n chalk.gray(\" \u2705 Backend Node.js application structure created\"),\n )\n console.log(chalk.gray(` \uD83D\uDCC1 Entry point: dist/src/server.js`))\n\n // 6. Verify the final application structure\n await verifyBackendStructure(backendBuildDir)\n}\n\n/**\n * Verify that the backend application is properly structured\n */\nconst verifyBackendStructure = async (\n backendBuildDir: string,\n): Promise<void> => {\n const requiredFiles = [\"package.json\", \"yarn.lock\", \"dist/src/server.js\"]\n\n const missingFiles = []\n\n for (const file of requiredFiles) {\n const filePath = path.join(backendBuildDir, file)\n if (!(await fs.pathExists(filePath))) {\n missingFiles.push(file)\n }\n }\n\n if (missingFiles.length > 0) {\n throw new Error(\n `Backend application is missing required files: ${missingFiles.join(\", \")}`,\n )\n }\n\n // Verify package.json has correct start script\n const packageJsonPath = path.join(backendBuildDir, \"package.json\")\n const packageJson = await fs.readJson(packageJsonPath)\n\n if (\n !packageJson.scripts?.start ||\n !packageJson.scripts.start.includes(\"dist/src/server.js\")\n ) {\n console.warn(\n chalk.yellow(\n ` \u26A0\uFE0F package.json start script may not point to dist/src/server.js`,\n ),\n )\n }\n\n console.log(chalk.gray(` \u2705 Backend structure verified successfully`))\n}\n\n/**\n * Build workbench if enabled\n */\nconst buildWorkbenchIfEnabled = async (\n config: RacletteConfig,\n buildDir: string,\n options: BuildOptions,\n): Promise<boolean> => {\n if (!config.services.workbench?.enabled || options.skipWorkbench) {\n return false\n }\n\n await buildWorkbench(config, buildDir, options)\n return true\n}\n\n/**\n * Build workbench by recursively calling raclette build\n */\nconst buildWorkbench = async (\n config: RacletteConfig,\n buildDir: string,\n options: BuildOptions,\n): Promise<void> => {\n console.log(chalk.blue(\"\uD83D\uDD27 Building workbench...\"))\n\n const workbenchPath = path.join(\n process.cwd(),\n \"node_modules\",\n \"@raclettejs\",\n \"workbench\",\n )\n\n if (!(await fs.pathExists(workbenchPath))) {\n logger.warn(\"Workbench package not found, skipping workbench build\")\n return\n }\n\n const workbenchBuildDir = path.join(buildDir, \"workbench\")\n\n // Handle workbench configuration file creation\n let workbenchConfigPath: string | undefined\n if (config.workbench) {\n try {\n validateWorkbenchConfig(config.workbench)\n workbenchConfigPath = await createWorkbenchConfigFile(config.workbench)\n } catch (error: any) {\n console.error(chalk.red(\"Workbench configuration error:\"), error.message)\n throw error\n }\n }\n\n try {\n // Set environment for workbench build\n const workbenchEnv = {\n ...process.env,\n // Pass through parent app's database connections\n MONGO_HOST: `mongodb://localhost:${config.services.mongodb?.port || 27017}/${config.services.mongodb?.databaseName || config.name}`,\n CACHE_URL: `redis://localhost:${config.services.redis?.port || 6379}`,\n ...config.env.development,\n }\n\n // Run raclette build in workbench directory\n const workbenchName = `${config.name}-workbench`\n console.log(\n chalk.gray(\" \uD83D\uDD27 Running workbench build process as \" + workbenchName),\n )\n await new Promise<void>((resolve, reject) => {\n // Build args array and filter out empty strings\n const args = [\n \"build\",\n \"--output-dir\",\n workbenchBuildDir,\n \"--build-only\",\n options.verbose ? \"-v\" : \"\",\n \"-p\",\n workbenchName,\n ...(workbenchConfigPath ? [\"-f\", workbenchConfigPath] : []),\n ].filter((arg) => arg !== \"\")\n\n const child = spawn(\"yarn\", args, {\n cwd: workbenchPath,\n stdio: options.verbose ? \"inherit\" : \"ignore\",\n env: workbenchEnv,\n })\n\n child.on(\"close\", (code) => {\n logger.raw(\n chalk.gray(` \uD83C\uDFC1 Workbench build process exited with code ${code}`),\n )\n if (code === 0) {\n resolve()\n } else {\n reject(new Error(`Workbench build failed with exit code ${code}`))\n }\n })\n\n child.on(\"error\", (error: any) => {\n logger.raw(\n chalk.red(` \u274C Workbench build process error: ${error.message}`),\n )\n reject(error)\n })\n })\n\n logger.raw(chalk.green(\" \u2705 Workbench build complete\"))\n } catch (error: any) {\n logger.error(\"Workbench build failed: \" + error.message)\n throw error\n }\n}\n", "import chalk from \"chalk\"\nimport chokidar from \"chokidar\"\nimport fs from \"fs-extra\"\nimport path from \"path\"\nimport type { RacletteConfig } from \"./types\"\nimport { logger } from \"src/logger\"\nimport { findCorePackagePath, findFiles } from \"./file-system\"\n\n\ntype VirtualFileSystem = {\n resolveFile(filePath: string): string\n watchFiles(): void\n close(): void\n}\n\nexport type SourceDirectory = {\n name: string\n path: string\n priority: number\n clear?: boolean\n servicePathMap?: {\n [service: string]: string\n }\n // New: Dynamic folder mappings - source path -> target path(s)\n folderMappings?: {\n [sourcePath: string]: string | string[]\n }\n}\n\ninterface WatchConfig {\n sourcePath: string\n sourceDir: SourceDirectory\n targetResolver: (relativePath: string) => string\n mappingKeyResolver: (relativePath: string) => string\n}\n\nconst EXCLUDED_FILES = [\".prettierrc\", \"eslint.config.js\"]\n// will be copied to .raclette/dist\nconst DIST_FILES = [\"bin/check-dependencies.sh\"]\n\n/**\n * Updated setupVirtualFileSystem with dynamic folder mappings\n */\nexport const setupVirtualFileSystem = async (\n config?: RacletteConfig,\n additionalSourceDirs?: SourceDirectory[],\n disableWatcher?: boolean,\n): Promise<VirtualFileSystem> => {\n const appRoot = process.cwd()\n const racletteDir = path.join(appRoot, \".raclette\")\n const virtualDir = path.join(racletteDir, \"virtual\")\n\n const racletteCoreRoot = findCorePackagePath()\n logger.debug(`\uD83D\uDCE6 Using core package at: ${racletteCoreRoot}`)\n\n // Create and set up dist folder\n await setupDistDirectory(racletteDir, racletteCoreRoot, DIST_FILES)\n\n logger.debug(\"[VFS] Cleaning virtual file system directory...\")\n if (await fs.pathExists(virtualDir))\n await fs.rm(virtualDir, { recursive: true })\n await fs.ensureDir(virtualDir)\n\n // Define source directories with both service mappings and folder mappings (lower number = higher priority)\n const sourceDirectories: SourceDirectory[] = [\n {\n // contains merged package.json, yarn.lock, raclette.config - HIGHEST PRIORITY\n name: \"generated-service-files\",\n path: racletteDir,\n servicePathMap: {\n backend: \".\",\n frontend: \".\",\n },\n priority: 1,\n },\n {\n name: \"app\",\n path: appRoot,\n servicePathMap: { backend: \"services\", frontend: \"services\" },\n folderMappings: {\n shared: \"backend/src/shared/app\",\n i18n: \"frontend/src/orchestrator/i18n/app\",\n },\n priority: 10,\n },\n {\n name: \"core-types\",\n path: racletteCoreRoot,\n servicePathMap: { backend: \"\", frontend: \"\" },\n folderMappings: {\n \"src/types.ts\": [\"backend/types/index.ts\", \"frontend/types/index.ts\"],\n },\n priority: 29,\n },\n {\n name: \"core\",\n path: racletteCoreRoot,\n servicePathMap: { backend: \"services\", frontend: \"services\" },\n priority: 30,\n },\n ...(config?.sourceDirectories || []),\n ...(additionalSourceDirs ?? []),\n ]\n\n const fileMapping = new Map<string, string>()\n const serviceCopyPaths = { backend: [\"/\"], frontend: [\"/\"] }\n\n const sortedDirs = [...sourceDirectories]\n .sort((a, b) => b.priority - a.priority)\n .map((sourceDir) => {\n // make sure we use absolute paths here\n const fullSourcePath = sourceDir.path.startsWith(\".\")\n ? path.join(process.cwd(), sourceDir.path)\n : sourceDir.path\n\n return {\n ...sourceDir,\n path: fullSourcePath,\n }\n })\n\n // Build initial file mapping\n await buildFileMapping(\n sortedDirs,\n fileMapping,\n virtualDir,\n serviceCopyPaths,\n EXCLUDED_FILES,\n racletteDir,\n )\n\n fs.writeFileSync(path.join(racletteDir, `mappings.tsv`),\n Array.from(fileMapping.entries().map(e => e.join(\"\\t\")) ).join(\"\\n\"),\"utf8\")\n\n fs.writeFileSync(path.join(racletteDir, `dirs.json`),\n JSON.stringify(sortedDirs,null, 2),\"utf8\")\n\n const watchers: chokidar.FSWatcher[] = []\n\n const resolveFile = (filePath: string): string => {\n const relativePath = path.relative(appRoot, filePath)\n return fileMapping.get(relativePath) || filePath\n }\n\n const watchFiles = (): void => {\n watchers.forEach((w) => w.close())\n watchers.length = 0\n\n const watchConfigs = generateWatchConfigs(\n sortedDirs,\n serviceCopyPaths,\n virtualDir,\n )\n\n watchConfigs.forEach((config) => {\n if (fs.existsSync(config.sourcePath)) {\n const watcher = setupWatcher(\n config,\n sortedDirs,\n fileMapping,\n EXCLUDED_FILES,\n )\n watchers.push(watcher)\n }\n })\n }\n\n const close = (): void => watchers.forEach((w) => w.close())\n\n if (!disableWatcher) watchFiles()\n return { resolveFile, watchFiles, close }\n}\n\n/**\n * Generate all watch configurations for both services and folder mappings\n * Updated to handle individual file mappings\n */\nconst generateWatchConfigs = (\n sourceDirectories: SourceDirectory[],\n serviceCopyPaths: Record<string, string[]>,\n virtualDir: string,\n): WatchConfig[] => {\n const configs: WatchConfig[] = []\n\n sourceDirectories.forEach((sourceDir) => {\n // Service watchers\n Object.entries(serviceCopyPaths).forEach(([service, subPaths]) => {\n subPaths.forEach((subPath) => {\n const servicePath = sourceDir.servicePathMap?.[service] || \"\"\n const sourcePath = path.join(\n sourceDir.path,\n servicePath,\n service,\n subPath,\n )\n\n configs.push({\n sourcePath,\n sourceDir,\n targetResolver: (relativePath) =>\n path.join(virtualDir, service, subPath, relativePath),\n mappingKeyResolver: (relativePath) =>\n path.join(service, subPath, relativePath),\n })\n })\n })\n\n // Folder mapping watchers (both folders and individual files)\n if (sourceDir.folderMappings) {\n Object.entries(sourceDir.folderMappings).forEach(\n ([sourcePath, targetPathEntry]) => {\n const fullSourcePath = path.join(sourceDir.path, sourcePath)\n\n // Check if this is a file or directory\n const isFile =\n fs.existsSync(fullSourcePath) &&\n fs.statSync(fullSourcePath).isFile()\n\n if (isFile) {\n // Individual file mapping - watch the file directly\n const targetPaths = Array.isArray(targetPathEntry)\n ? targetPathEntry\n : [targetPathEntry]\n\n // Create separate watch configs for each target path\n targetPaths.forEach((targetPath) => {\n configs.push({\n sourcePath: path.dirname(fullSourcePath), // Watch the directory containing the file\n sourceDir,\n targetResolver: (relativePath) => {\n // For file mappings, ignore the relativePath and use the target directly\n if (path.basename(fullSourcePath) === relativePath) {\n return path.join(virtualDir, targetPath)\n }\n return path.join(virtualDir, targetPath, relativePath)\n },\n mappingKeyResolver: (relativePath) => {\n // For file mappings, the mapping key is just the source path\n if (path.basename(fullSourcePath) === relativePath) {\n return sourcePath\n }\n return path.join(sourcePath, relativePath)\n },\n })\n })\n } else {\n // Directory mapping - watch the entire directory\n configs.push({\n sourcePath: fullSourcePath,\n sourceDir,\n targetResolver: (relativePath) =>\n path.join(virtualDir, sourcePath, relativePath),\n mappingKeyResolver: (relativePath) =>\n path.join(sourcePath, relativePath),\n })\n }\n },\n )\n }\n })\n\n return configs\n}\n\n/**\n * Generic watcher setup for any watch configuration\n */\nconst setupWatcher = (\n config: WatchConfig,\n sourceDirectories: SourceDirectory[],\n fileMapping: Map<string, string>,\n excludedFiles: string[],\n): chokidar.FSWatcher => {\n logger.debug(\n `[VFS] Setting up watcher for ${config.sourceDir.name}: ${config.sourcePath}`,\n )\n\n // Include package.json and yarn.lock in watch patterns for generated services\n const watchPatterns =\n config.sourceDir.name === \"generated-service-files\"\n ? [\n \"**/*.vue\",\n \"**/*.ts\",\n \"**/*.js\",\n \"**/*.css\",\n \"**/*.scss\",\n \"**/package.json\",\n \"**/yarn.lock\",\n \"**/*.json\",\n ]\n : [\"**/*.vue\", \"**/*.ts\", \"**/*.js\", \"**/*.css\", \"**/*.scss\"]\n\n const watcher = chokidar.watch(watchPatterns, {\n cwd: config.sourcePath,\n ignoreInitial: true,\n ignored: [ \"**/.git/**\", \"**/dist/**\"], // \"**/node_modules/**\",\n })\n const handleFileChange = async (relativePath: string, isRemoval = false) => {\n if (isExcludedFile(relativePath, excludedFiles)) return\n\n const mappingKey = config.mappingKeyResolver(relativePath)\n const targetPath = config.targetResolver(relativePath)\n\n await updateFileInVFS(\n sourceDirectories,\n fileMapping,\n mappingKey,\n targetPath,\n relativePath,\n isRemoval,\n )\n }\n\n watcher.on(\"add\", (relativePath) => handleFileChange(relativePath))\n watcher.on(\"change\", (relativePath) => handleFileChange(relativePath))\n watcher.on(\"unlink\", (relativePath) => handleFileChange(relativePath, true))\n\n return watcher\n}\n\n/**\n * Generic file update that works for both service files and folder mappings\n */\nconst updateFileInVFS = async (\n sourceDirectories: SourceDirectory[],\n fileMapping: Map<string, string>,\n mappingKey: string,\n targetPath: string,\n relativePath: string,\n isRemoval: boolean,\n): Promise<void> => {\n const sortedDirs = [...sourceDirectories].sort(\n (a, b) => a.priority - b.priority,\n )\n\n if (isRemoval) {\n // Find next highest priority source\n const nextSource = findFileInSources(sortedDirs, mappingKey, relativePath)\n\n if (nextSource) {\n await fs.ensureDir(path.dirname(targetPath))\n await fs.copy(nextSource.fullPath, targetPath)\n fileMapping.set(mappingKey, targetPath)\n logger.debug(\n `[VFS] Updated ${mappingKey} from ${nextSource.sourceDir.name}`,\n )\n } else {\n if (await fs.pathExists(targetPath)) await fs.remove(targetPath)\n fileMapping.delete(mappingKey)\n logger.debug(`[VFS] Removed ${mappingKey}`)\n }\n } else {\n // Find highest priority source\n const highestSource = findFileInSources(\n sortedDirs,\n mappingKey,\n relativePath,\n )\n\n if (highestSource) {\n await fs.ensureDir(path.dirname(targetPath))\n await fs.copy(highestSource.fullPath, targetPath)\n fileMapping.set(mappingKey, targetPath)\n logger.debug(\n `[VFS] Updated ${mappingKey} from ${highestSource.sourceDir.name}`,\n )\n }\n }\n}\n\n/**\n * Find a file across all source directories (services and folder mappings)\n * Now supports both folder mappings and individual file mappings\n */\nconst findFileInSources = (\n sortedDirs: SourceDirectory[],\n mappingKey: string,\n relativePath: string,\n) => {\n for (const sourceDir of sortedDirs) {\n // Check service paths\n const serviceCopyPaths = { backend: [\"/\"], frontend: [\"/\"] }\n for (const [service, subPaths] of Object.entries(serviceCopyPaths)) {\n for (const subPath of subPaths) {\n const serviceKey = path.join(service, subPath, relativePath)\n if (serviceKey === mappingKey) {\n const servicePath = sourceDir.servicePathMap?.[service] || \"\"\n const fullPath = path.join(\n sourceDir.path,\n servicePath,\n service,\n subPath,\n relativePath,\n )\n if (fs.existsSync(fullPath)) {\n return { sourceDir, fullPath }\n }\n }\n }\n }\n\n // Check folder mappings (both folders and individual files)\n if (sourceDir.folderMappings) {\n for (const [sourcePath, targetPathEntry] of Object.entries(\n sourceDir.folderMappings,\n )) {\n // Handle targetPath as either string or array of strings\n const targetPaths = Array.isArray(targetPathEntry)\n ? targetPathEntry\n : [targetPathEntry]\n\n for (const targetPath of targetPaths) {\n let folderKey: string\n let fullPath: string\n\n // Check if this is a direct file mapping (source path equals the mapping key)\n if (sourcePath === mappingKey) {\n // Direct file mapping: \"src/types.ts\" -> [\"backend/types/index.ts\", \"frontend/types/index.ts\"]\n fullPath = path.join(sourceDir.path, sourcePath)\n if (fs.existsSync(fullPath)) {\n return { sourceDir, fullPath }\n }\n } else {\n // Folder mapping: check if the mapping key starts with the source path\n folderKey = path.join(sourcePath, relativePath)\n if (folderKey === mappingKey) {\n // This is a file within a mapped folder\n fullPath = path.join(sourceDir.path, sourcePath, relativePath)\n if (fs.existsSync(fullPath)) {\n return { sourceDir, fullPath }\n }\n }\n }\n }\n }\n }\n }\n return null\n}\n\n/**\n * Generic file processing for both services and folder mappings\n */\nconst processFiles = async (\n sourceDir: SourceDirectory,\n sourcePath: string,\n targetPath: string,\n fileMapping: Map<string, string>,\n mappingKeyPrefix: string,\n excludedFiles: string[],\n): Promise<void> => {\n if (!fs.pathExistsSync(sourcePath)) return\n\n await fs.ensureDir(path.dirname(targetPath))\n\n // Special handling for generated service files - include package.json and yarn.lock\n const isGeneratedServices = sourceDir.name === \"generated-service-files\"\n\n await fs.copy(sourcePath, targetPath, {\n overwrite: true,\n filter: (src) => {\n const fileName = path.basename(src)\n\n // Always exclude specified files\n if (excludedFiles.includes(fileName)) return false\n\n // For generated services, include package.json and yarn.lock\n if (\n isGeneratedServices &&\n (fileName === \"package.json\" || fileName === \"yarn.lock\")\n ) {\n return true\n }\n\n // For non-generated services, exclude package.json and yarn.lock\n if (\n !isGeneratedServices &&\n (fileName === \"package.json\" || fileName === \"yarn.lock\")\n ) {\n return false\n }\n\n const relativePath = path.relative(sourcePath, src)\n return (\n !relativePath.startsWith(\"node_modules\") &&\n !relativePath.startsWith(\".git\") &&\n !relativePath.startsWith(\"dist\")\n )\n },\n })\n\n // Find files with appropriate patterns based on source type\n const filePatterns = isGeneratedServices\n ? [\n \"**/*.vue\",\n \"**/*.ts\",\n \"**/*.js\",\n \"**/*.json\",\n \"**/*.css\",\n \"**/*.scss\",\n \"**/package.json\",\n \"**/yarn.lock\",\n ]\n : [\"**/*.vue\", \"**/*.ts\", \"**/*.js\", \"**/*.json\", \"**/*.css\", \"**/*.scss\"]\n\n const files = await findFiles(sourcePath, filePatterns)\n\n for (const file of files) {\n const fileName = path.basename(file)\n\n // Always exclude specified files\n if (excludedFiles.includes(fileName)) continue\n\n // For generated services, include package.json and yarn.lock\n if (\n isGeneratedServices &&\n (fileName === \"package.json\" || fileName === \"yarn.lock\")\n ) {\n // Include these files\n } else if (\n !isGeneratedServices &&\n (fileName === \"package.json\" || fileName === \"yarn.lock\")\n ) {\n // For non-generated services, exclude package.json and yarn.lock\n continue\n }\n\n const relPath = path.relative(sourcePath, file)\n const mappingKey = path.join(mappingKeyPrefix, relPath)\n const virtualPath = path.join(targetPath, relPath)\n\n fileMapping.set(mappingKey, virtualPath)\n }\n\n logger.debug(\n `[VFS] Processed ${sourceDir.name}: ${sourcePath} -> ${targetPath}`,\n )\n}\n\n/**\n * Build the complete file mapping\n * Updated to handle individual file mappings\n */\nconst buildFileMapping = async (\n sourceDirectories: SourceDirectory[],\n fileMapping: Map<string, string>,\n virtualDir: string,\n serviceCopyPaths: Record<string, string[]>,\n excludedFiles: string[],\n racletteDir: string,\n): Promise<void> => {\n fileMapping.clear()\n\n for (const sourceDir of sourceDirectories) {\n if (!(await fs.pathExists(sourceDir.path))) {\n console.warn(\n chalk.yellow(`[VFS] Source directory not found: ${sourceDir.path}`),\n )\n continue\n }\n\n // Process service directories\n for (const [service, subPaths] of Object.entries(serviceCopyPaths)) {\n for (const subPath of subPaths) {\n const servicePath = sourceDir.servicePathMap?.[service] || \"\"\n if (!servicePath) {\n continue\n }\n const sourcePath = path.join(\n sourceDir.path,\n servicePath,\n service,\n subPath,\n )\n const targetPath = path.join(virtualDir, service, subPath)\n const mappingKeyPrefix = path.join(service, subPath)\n\n await processFiles(\n sourceDir,\n sourcePath,\n targetPath,\n fileMapping,\n mappingKeyPrefix,\n excludedFiles,\n )\n }\n }\n\n // Process folder mappings (both folders and individual files)\n if (sourceDir.folderMappings) {\n for (const [sourcePath, targetPathEntry] of Object.entries(\n sourceDir.folderMappings,\n )) {\n const fullSourcePath = path.join(sourceDir.path, sourcePath)\n\n // Handle targetPath as either string or array of strings\n const targetPaths = (\n Array.isArray(targetPathEntry) ? targetPathEntry : [targetPathEntry]\n ).map((targetPath) => path.join(virtualDir, targetPath))\n\n // Check if this is a file or directory\n const isFile =\n (await fs.pathExists(fullSourcePath)) &&\n (await fs.stat(fullSourcePath)).isFile()\n\n if (!isFile && sourceDir.clear) {\n for (const targetPath of targetPaths) {\n await fs.rm(targetPath, {\n recursive: true,\n force: true,\n })\n await fs.ensureDir(targetPath)\n }\n }\n\n if (isFile) {\n // Individual file mapping\n for (const targetPath of targetPaths) {\n // Ensure target directory exists and copy the file\n await fs.ensureDir(path.dirname(targetPath))\n await fs.copy(fullSourcePath, targetPath)\n\n // Add to file mapping using source path as key\n fileMapping.set(sourcePath, targetPath)\n\n logger.debug(\n `[VFS] Mapped individual file ${sourcePath} -> ${targetPath}`,\n )\n }\n } else {\n // Directory mapping\n for (const targetPath of targetPaths) {\n await processFiles(\n sourceDir,\n fullSourcePath,\n targetPath,\n fileMapping,\n targetPath,\n excludedFiles,\n )\n }\n }\n }\n }\n }\n\n logger.debug(\"[VFS] Built virtual file system\")\n}\n\nconst isExcludedFile = (filePath: string, excludedFiles: string[]): boolean =>\n excludedFiles.includes(path.basename(filePath))\n\nconst copyMergedPackageJson = async (\n service: string,\n virtualDir: string,\n subPath: string,\n racletteDir: string,\n): Promise<void> => {\n const mergedPackageJsonPath = path.join(racletteDir, service, \"package.json\")\n\n if (await fs.pathExists(mergedPackageJsonPath)) {\n const virtualPackageJsonPath = path.join(\n virtualDir,\n service,\n subPath,\n \"package.json\",\n )\n await fs.ensureDir(path.dirname(virtualPackageJsonPath))\n await fs.copy(mergedPackageJsonPath, virtualPackageJsonPath)\n logger.debug(\n `[VFS] Copied merged package.json to ${virtualPackageJsonPath}`,\n )\n }\n}\n\nconst setupDistDirectory = async (\n racletteDir: string,\n coreDir: string,\n filePaths: string[],\n): Promise<void> => {\n const distDir = path.join(racletteDir, \"dist\")\n await fs.ensureDir(distDir)\n\n for (const relativePath of filePaths) {\n const sourcePath = path.join(coreDir, relativePath)\n const fileName = path.basename(relativePath)\n const targetPath = path.join(distDir, fileName)\n\n if (await fs.pathExists(targetPath)) {\n await fs.remove(targetPath)\n }\n\n if (await fs.pathExists(sourcePath)) {\n await fs.ensureDir(path.dirname(targetPath))\n await fs.copy(sourcePath, targetPath, {\n overwrite: true,\n preserveTimestamps: false,\n })\n\n if (fileName.endsWith(\".sh\")) {\n await fs.chmod(targetPath, 0o755)\n }\n\n logger.debug(`[VFS] Copied ${fileName} to dist directory`)\n }\n }\n}\n\n", "import type { RacletteConfig } from \"./types\"\nimport chalk from \"chalk\"\nimport { execSync } from \"child_process\"\nimport fs from \"fs-extra\"\nimport path from \"path\"\nimport yaml from \"js-yaml\"\nimport { executeDockerCommand } from \"./docker-utils\"\nimport {\n getServiceLockFilePath,\n processAllVolumes,\n processVolumeDefinition,\n} from \"./docker-generator\"\n\ntype FileCopyOptions = {\n makeExecutable?: boolean\n required?: boolean\n logPrefix?: string\n}\n\n/**\n * Create production artifacts and docker-compose\n */\nexport const createProductionArtifacts = async (\n config: RacletteConfig,\n buildDir: string,\n hasWorkbench: boolean,\n): Promise<string> => {\n console.log(chalk.blue(\"\uD83D\uDCE6 Creating production artifacts...\"))\n\n // Create Dockerfiles\n await createProductionDockerfiles(buildDir, config, hasWorkbench)\n\n // Create main docker-compose\n const composeFile = path.join(buildDir, \"docker-compose.yml\")\n await createProductionCompose(config, buildDir, composeFile, hasWorkbench)\n\n // Create environment example\n await createEnvironmentExample(config, buildDir, hasWorkbench)\n\n // Create deployment script\n await createDeploymentScript(buildDir, hasWorkbench, config)\n\n console.log(chalk.green(\"\u2705 Production artifacts created\"))\n return composeFile\n}\n\n/**\n * Generic helper to copy files between directories\n */\nconst copyFiles = async (\n filePaths: string[],\n sourceDir: string,\n destDir: string,\n options?: FileCopyOptions,\n): Promise<void> => {\n const {\n makeExecutable = false,\n required = false,\n logPrefix = \"\",\n } = options || {}\n\n for (const filePath of filePaths) {\n const sourcePath = path.join(sourceDir, filePath)\n const filename = path.basename(filePath)\n const destPath = path.join(destDir, filename)\n\n // Ensure destination directory exists\n await fs.ensureDir(path.dirname(destPath))\n\n if (await fs.pathExists(sourcePath)) {\n await fs.copy(sourcePath, destPath)\n\n if (makeExecutable) {\n await fs.chmod(destPath, 0o755)\n }\n\n console.log(chalk.gray(`${logPrefix} \u2705 Copied ${filePath}`))\n } else {\n const message = `${filePath} not found in ${sourceDir}`\n\n if (required) {\n throw new Error(`Required file ${message}`)\n } else {\n console.log(\n chalk.gray(`${logPrefix} \u26A0\uFE0F Skipped ${filePath} (not found)`),\n )\n }\n }\n }\n}\n\n/**\n * Copy files from project root to build directory\n */\nconst copyProjectFilesToBuild = async (\n filePaths: string[],\n buildDir: string,\n options?: FileCopyOptions,\n): Promise<void> => {\n return copyFiles(filePaths, process.cwd(), buildDir, {\n ...options,\n logPrefix: options?.logPrefix || \" \",\n })\n}\n\n/**\n * Copy files from build directory to package directory\n */\nconst copyBuildFilesToPackage = async (\n filePaths: string[],\n buildDir: string,\n packageDir: string,\n options?: FileCopyOptions,\n): Promise<void> => {\n return copyFiles(filePaths, buildDir, packageDir, {\n ...options,\n logPrefix: options?.logPrefix || \" \",\n })\n}\n\n/**\n * Create production Dockerfiles with proper Node.js setup and configured ports\n */\nconst createProductionDockerfiles = async (\n buildDir: string,\n config: RacletteConfig,\n hasWorkbench: boolean,\n): Promise<void> => {\n const frontendPort = config.services.frontend?.port || 8081\n const workbenchFrontendPort = config.services.workbench?.frontendPort || 8083\n\n // Frontend Dockerfile - uses configured port\n const frontendDockerfile = `\nFROM nginx:alpine\nCOPY service/frontend /usr/share/nginx/html\nCOPY nginx.conf /etc/nginx/conf.d/default.conf\nCOPY entrypoint.sh entrypoint.sh\n\nRUN chmod +x /entrypoint.sh\nRUN apk add --no-cache gettext curl\nRUN chmod -R 755 /usr/share/nginx/html\nRUN find /usr/share/nginx/html -type f -exec chmod 644 {} +\n\nEXPOSE ${frontendPort}\nHEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \\\\\n CMD wget --no-verbose --tries=1 --spider http://localhost:${frontendPort}/ || exit 1\nENTRYPOINT [\"/entrypoint.sh\"]\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n`\n\n // Backend Dockerfile - proper Node.js application with dependencies\n const backendDockerfile = `\nFROM node:24.4-alpine\n\n# Set working directory\nWORKDIR /app\n\n# Install system dependencies that might be needed\nRUN apk add --no-cache tini curl ${(config.services.backend?.installPackages || []).join(\" \")}\n\n# Copy package files first for better caching\nCOPY service/backend/package*.json ./\nCOPY service/backend/yarn.lock* ./\n\n# Install only production dependencies\nRUN yarn install --production --frozen-lockfile --silent\n\n# Copy the built application (includes dist/ folder)\nCOPY service/backend/ ./\n\n# Create non-root user for security\nRUN addgroup -g 1001 -S nodejs && \\\\\n adduser -S fastify -u 1001 && \\\\\n chown -R fastify:nodejs /app\nUSER fastify\n\n# Expose port (Fastify should listen on 0.0.0.0 for containers)\nEXPOSE 3000\n\n# Health check - point to the correct endpoint\nHEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \\\\\n CMD node -e \"require('http').get('http://localhost:3000/health', (res) => process.exit(res.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))\"\n\n# Use tini to handle signals properly\nENTRYPOINT [\"/sbin/tini\", \"--\"]\n\n# Start the application - points to our built dist/src/server.js\nCMD [\"yarn\", \"start\"]\n`\n\n // Nginx config with proper proxy setup and configured port\n const nginxConfig = `\nserver {\n listen ${frontendPort};\n server_name localhost;\n root /usr/share/nginx/html;\n index index.html;\n \n # Security headers\n add_header X-Frame-Options \"SAMEORIGIN\" always;\n add_header X-Content-Type-Options \"nosniff\" always;\n add_header Referrer-Policy \"no-referrer-when-downgrade\" always;\n \n # Frontend static files\n location / {\n try_files $uri $uri/ /index.html;\n \n # Cache static assets\n location ~* \\\\.(js|css|png|jpg|jpeg|gif|ico|svg)$ {\n expires 1y;\n add_header Cache-Control \"public, immutable\";\n }\n }\n \n # API endpoints - proxy to backend on internal port 3000\n location /api/ {\n proxy_pass http://backend:3000/;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n \n # Timeout settings\n proxy_connect_timeout 60s;\n proxy_send_timeout 60s;\n proxy_read_timeout 60s;\n }\n \n # WebSocket connections\n location /socket.io/ {\n proxy_pass http://backend:3000/socket.io/;\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_set_header Authorization $http_authorization;\n }\n \n # Health check endpoint\n location /health {\n proxy_pass http://backend:3000/health;\n proxy_set_header Host $host;\n }\n}\n`\n\n await fs.writeFile(\n path.join(buildDir, \"Dockerfile.frontend\"),\n frontendDockerfile,\n )\n await fs.writeFile(\n path.join(buildDir, \"Dockerfile.backend\"),\n backendDockerfile,\n )\n await fs.writeFile(path.join(buildDir, \"nginx.conf\"), nginxConfig)\n\n // Copy project files needed for Docker build\n const projectFilesToCopy = [\n \"node_modules/@raclettejs/core/services/frontend/provision/entrypoint.sh\",\n ]\n await copyProjectFilesToBuild(projectFilesToCopy, buildDir, {\n makeExecutable: true,\n required: false,\n })\n\n // Workbench Dockerfiles if needed\n if (hasWorkbench) {\n const workbenchFrontendDockerfile = `\nFROM nginx:alpine\nCOPY workbench/frontend /usr/share/nginx/html\nCOPY nginx.workbench.conf /etc/nginx/conf.d/default.conf\nCOPY entrypoint.sh /entrypoint.sh\n\nRUN chmod +x /entrypoint.sh\nRUN apk add --no-cache gettext curl\nRUN chmod -R 755 /usr/share/nginx/html\nRUN find /usr/share/nginx/html -type f -exec chmod 644 {} +\n\nEXPOSE ${workbenchFrontendPort}\nHEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \\\\\n CMD wget --no-verbose --tries=1 --spider http://localhost:${workbenchFrontendPort}/ || exit 1\n\nENTRYPOINT [\"/entrypoint.sh\"]\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n`\n\n const workbenchBackendDockerfile = `\nFROM node:24.4-alpine\nWORKDIR /app\n\n# Install dependencies\nRUN apk add --no-cache tini curl\n\n# Copy package files\nCOPY workbench/backend/package*.json ./\nCOPY workbench/backend/yarn.lock* ./\n\n# Install production dependencies\nRUN yarn install --production --frozen-lockfile --silent\n\n# Copy application code (includes dist/ if built)\nCOPY workbench/backend/ ./\n\n# Create non-root user\nRUN addgroup -g 1001 -S nodejs && \\\\\n adduser -S workbench -u 1001 && \\\\\n chown -R workbench:nodejs /app\nUSER workbench\n\n# Expose port (Fastify should listen on 0.0.0.0 for containers)\nEXPOSE 3000\n\nHEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \\\\\n CMD node -e \"require('http').get('http://localhost:3000/health', (res) => process.exit(res.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))\"\n\nENTRYPOINT [\"/sbin/tini\", \"--\"]\nCMD [\"yarn\", \"start\"]\n`\n\n const workbenchNginxConfig = `\nserver {\n listen ${workbenchFrontendPort};\n root /usr/share/nginx/html;\n index index.html;\n \n location / {\n try_files $uri $uri/ /index.html;\n }\n \n location /api/ {\n proxy_pass http://workbench-backend:3000/;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n }\n \n location /socket.io/ {\n proxy_pass http://workbench-backend:3000/socket.io/;\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_set_header Authorization $http_authorization;\n }\n}\n`\n\n await fs.writeFile(\n path.join(buildDir, \"Dockerfile.workbench-frontend\"),\n workbenchFrontendDockerfile,\n )\n await fs.writeFile(\n path.join(buildDir, \"Dockerfile.workbench-backend\"),\n workbenchBackendDockerfile,\n )\n await fs.writeFile(\n path.join(buildDir, \"nginx.workbench.conf\"),\n workbenchNginxConfig,\n )\n }\n}\n\n/**\n * Create production docker-compose with configured ports\n */\nconst createProductionCompose = async (\n config: RacletteConfig,\n buildDir: string,\n outputPath: string,\n hasWorkbench: boolean,\n): Promise<void> => {\n const frontendPort = config.services.frontend?.port || 8081\n const workbenchFrontendPort = config.services.workbench?.frontendPort || 8083\n\n // Get production environment variables from config\n const prodEnvVars = config.env.production || {}\n\n const compose: any = {\n services: {\n frontend: {\n build: {\n context: \".\",\n dockerfile: \"Dockerfile.frontend\",\n },\n ports: [`\\${PORT:-${frontendPort}}:${frontendPort}`],\n depends_on: [\"backend\"],\n restart: \"unless-stopped\",\n networks: [\"app-network\"],\n environment: [\n \"NODE_ENV=production\",\n // Frontend environment variables with production defaults\n \"RACLETTE_DEBUG_MODE=${RACLETTE_DEBUG_MODE:-false}\",\n \"RACLETTE_SERVER_BASE_URL=${RACLETTE_SERVER_BASE_URL:-/api}\",\n \"RACLETTE_SOCKET_URL=${RACLETTE_SOCKET_URL:-}\",\n // Add custom production env vars from config\n ...Object.entries(prodEnvVars).map(\n ([key, value]) => `${key}=${value}`,\n ),\n ],\n },\n backend: {\n build: {\n context: \".\",\n dockerfile: \"Dockerfile.backend\",\n },\n // Backend not exposed externally - accessed via nginx proxy\n depends_on: [\"database\", \"cache\"],\n restart: \"unless-stopped\",\n networks: [\"app-network\"],\n environment: [\n \"NODE_ENV=production\",\n // Core backend environment variables\n \"DISABLE_PLUGIN_LOGS=${RACLETTE_DISABLE_PLUGIN_LOGS:-false}\",\n \"SERVER_TOKEN_SECRET=${SERVER_TOKEN_SECRET:-thisshouldbesetforproduction}\",\n // Database connections with fallbacks to service names\n `MONGO_HOST=\\${RACLETTE_MONGODB_HOST:-mongodb://database:27017/\\${MONGO_DATABASE:-${config.services.mongodb?.databaseName || config.name}}}`,\n `CACHE_URL=\\${RACLETTE_CACHE_URL:-valkey://cache:6379${config.services.cache?.db ? `/${config.services.cache?.db}` : \"\"}}`,\n // Add custom production env vars from config\n ...Object.entries(prodEnvVars).map(\n ([key, value]) => `${key}=${value}`,\n ),\n ],\n },\n database: {\n image: \"mongo:8.2\",\n restart: \"unless-stopped\",\n volumes: [\"mongodb_data:/data/db\", \"mongodb_config:/data/config\"],\n networks: [\"app-network\"],\n environment: [\n \"MONGO_INITDB_DATABASE=${MONGO_DATABASE:-\" +\n (config.services.mongodb?.databaseName || config.name) +\n \"}\",\n ],\n healthcheck: {\n test: [\"CMD\", \"mongosh\", \"--eval\", \"db.adminCommand('ping')\"],\n interval: \"10s\",\n timeout: \"30s\",\n retries: 20,\n },\n },\n cache: {\n image: \"valkey/valkey:9.0-alpine\",\n restart: \"unless-stopped\",\n volumes: [\"cache_data:/data\"],\n networks: [\"app-network\"],\n healthcheck: {\n test: [\"CMD\", \"valkey-cli\", \"ping\"],\n interval: \"10s\",\n timeout: \"5s\",\n retries: 3,\n },\n },\n },\n volumes: {\n mongodb_data: {},\n mongodb_config: {},\n cache_data: {},\n },\n networks: {\n \"app-network\": {\n driver: \"bridge\",\n },\n },\n }\n\n // Configure cache persistence based on config (simplified approach from docker-generator.ts)\n const cacheConfig = config.backend?.cache\n if (cacheConfig?.persistence) {\n const RDB_OPTIONS = cacheConfig.RDB_OPTIONS || \"3600 1 300 100 60 10000\"\n\n switch (cacheConfig.persistence) {\n case \"none\":\n compose.services.cache.command = 'valkey-server --save \"\"'\n break\n case \"aof\":\n compose.services.cache.command = \"valkey-server --appendonly yes\"\n break\n case \"rdb\":\n compose.services.cache.command = \"valkey-server --save \" + RDB_OPTIONS\n break\n case \"rdb+aof\":\n compose.services.cache.command =\n \"valkey-server --appendonly yes --save \" + RDB_OPTIONS\n break\n }\n }\n\n // Add workbench services if enabled\n if (hasWorkbench) {\n const workbenchProdEnvVars = config.env.production || {}\n\n compose.services[\"workbench-frontend\"] = {\n build: {\n context: \".\",\n dockerfile: \"Dockerfile.workbench-frontend\",\n },\n ports: [\n `\\${WORKBENCH_PORT:-${workbenchFrontendPort}}:${workbenchFrontendPort}`,\n ],\n depends_on: [\"workbench-backend\"],\n restart: \"unless-stopped\",\n networks: [\"app-network\"],\n environment: [\n \"NODE_ENV=production\",\n // Workbench frontend environment variables\n \"RACLETTE_DEBUG_MODE=${RACLETTE_DEBUG_MODE:-false}\",\n `RACLETTE_SERVER_BASE_URL=\\${RACLETTE_SERVER_BASE_URL:-http://localhost:${workbenchFrontendPort}/api}`,\n \"RACLETTE_SOCKET_URL=${RACLETTE_SOCKET_URL:-}\",\n // Add custom production env vars from config\n ...Object.entries(workbenchProdEnvVars).map(\n ([key, value]) => `${key}=${value}`,\n ),\n ],\n }\n\n compose.services[\"workbench-backend\"] = {\n build: {\n context: \".\",\n dockerfile: \"Dockerfile.workbench-backend\",\n },\n // Workbench backend also not exposed externally\n depends_on: [\"database\", \"cache\"],\n restart: \"unless-stopped\",\n networks: [\"app-network\"],\n environment: [\n \"NODE_ENV=production\",\n // Core backend environment variables\n \"DISABLE_PLUGIN_LOGS=${RACLETTE_DISABLE_PLUGIN_LOGS:-false}\",\n \"SERVER_TOKEN_SECRET=${SERVER_TOKEN_SECRET}\",\n // Database connections with fallbacks to service names\n `MONGO_HOST=\\${RACLETTE_MONGODB_HOST:-mongodb://database:27017/\\${MONGO_DATABASE:-${config.services.mongodb?.databaseName || config.name}}}`,\n `CACHE_URL=\\${RACLETTE_CACHE_URL:-valkey://cache:6379${config.services.cache?.db ? `/${config.services.cache?.db}` : \"\"}}`,\n // Add custom production env vars from config\n ...Object.entries(workbenchProdEnvVars).map(\n ([key, value]) => `${key}=${value}`,\n ),\n ],\n }\n }\n\n await fs.writeFile(outputPath, yaml.dump(compose))\n}\n\n/**\n * Create environment example file with production-ready API configuration\n */\nconst createEnvironmentExample = async (\n config: RacletteConfig,\n buildDir: string,\n hasWorkbench: boolean,\n): Promise<void> => {\n const envContent = generateEnvExampleContent(config, hasWorkbench)\n await fs.writeFile(path.join(buildDir, \".env.example\"), envContent)\n}\n\nexport const generateEnvExampleContent = (\n config: RacletteConfig,\n hasWorkbench: boolean,\n) => {\n const frontendPort = config.services.frontend?.port || 8081\n const workbenchFrontendPort = config.services.workbench?.frontendPort || 8083\n\n const envContent = `# Production Environment Variables\n# Copy this file to .env and fill in your values\n\n# Required - Generate a secure random string for this\nSERVER_TOKEN_SECRET=your-secret-key-here\n\n# Auto-generated docker variables, they should work for default configurations\nNODE_ENV=production\nMONGO_DATABASE=${config.services.mongodb?.databaseName || config.name}\n\n# Frontend API Configuration\n# In production, API calls should go through nginx proxy\nVITE_API_BASE_URL=/api\nREACT_APP_API_BASE_URL=/api\n\n# Application URLs (for reference)\n# Main App: http://localhost:${frontendPort}\n${hasWorkbench ? `# Workbench: http://localhost:${workbenchFrontendPort}` : \"\"}\n\n# Override database and cache connections (default values as set in docker-compose file)\n# RACLETTE_MONGODB_HOST=mongodb://database:27017/\\${MONGO_DATABASE}\n# RACLETTE_CACHE_URL=valkey://cache:6379\n\n# Frontend environment overrides (optional)\n# RACLETTE_DEBUG_MODE=true # uncomment, if you want to see all the frontend logs in the console\n\n# Backend environment overrides (optional)\n# RACLETTE_DISABLE_PLUGIN_LOGS=true\n\n# Add any custom environment variables from your config here:\n${Object.keys(config.env.production || {})\n .map((key) => `# ${key}=`)\n .join(\"\\n\")}\n\n# MongoDB specific overrides (uncomment if using external MongoDB)\n# RACLETTE_MONGODB_HOST=mongodb://your-external-mongodb:27017/your-database\n\n# Cache specific overrides (uncomment if using external Valkey/Redis)\n# RACLETTE_CACHE_URL=valkey://your-external-cache:6379\n`\n return envContent\n}\n\n/**\n * Create deployment script with updated port information\n */\nconst createDeploymentScript = async (\n buildDir: string,\n hasWorkbench: boolean,\n config: RacletteConfig,\n): Promise<void> => {\n const frontendPort = config.services.frontend?.port || 8081\n const workbenchFrontendPort = config.services.workbench?.frontendPort || 8083\n\n const deployScript = `#!/bin/bash\n# racletteJS Production Deployment Script\n\nset -e\n\necho \"\uD83D\uDE80 Deploying racletteJS application...\"\n\n# Check if .env file exists\nif [ ! -f .env ]; then\n echo \"\u274C .env file not found. Copy .env.example and configure it first.\"\n exit 1\nfi\n\n# Build and start services\necho \"\uD83D\uDC33 Building Docker images...\"\ndocker compose build --no-cache\n\necho \"\uD83D\uDFE2 Starting services...\"\ndocker compose up -d\n\necho \"\u23F3 Waiting for services to be healthy...\"\nsleep 30\n\n# Check health\necho \"\uD83D\uDD0D Checking service health...\"\ndocker compose ps\n\n# Test endpoints\necho \"\uD83E\uDDEA Testing application endpoints...\"\nif curl -f http://localhost:${frontendPort}/health > /dev/null 2>&1; then\n echo \"\u2705 Application health check passed\"\nelse\n echo \"\u26A0\uFE0F Application health check failed, but services are running\"\n echo \"\uD83D\uDCA1 Make sure your Fastify backend has a /health endpoint and listens on 0.0.0.0:3000\"\nfi\n\necho \"\u2705 Deployment complete!\"\necho \"\"\necho \"\uD83C\uDF0D Application URLs:\"\necho \" Main App: http://localhost:${frontendPort}\"\n${hasWorkbench ? `echo \" Workbench: http://localhost:${workbenchFrontendPort}\"` : \"\"}\necho \"\"\necho \"\uD83D\uDCCA Management commands:\"\necho \" View logs: docker compose logs -f\"\necho \" Stop: docker compose down\"\necho \" Restart: docker compose restart\"\necho \" Update images: ./load-images.sh && docker compose up -d\"\necho \"\"\necho \"\uD83D\uDEE0\uFE0F Backend info:\"\necho \" - Built with TypeScript and compiled to dist/src/server.js\"\necho \" - Runs on Node.js 24 Alpine with production dependencies only\"\necho \" - Should listen on 0.0.0.0:3000 for proper container networking\"\necho \" - Accessible via /api proxy on port ${frontendPort}\"\n`\n\n const deployPath = path.join(buildDir, \"deploy.sh\")\n await fs.writeFile(deployPath, deployScript)\n await fs.chmod(deployPath, 0o755)\n}\n\n/**\n * Generate build-time docker-compose (backend + databases only)\n */\nexport const generateGenerationCompose = async (\n config: RacletteConfig,\n workingDir: string,\n outputPath: string,\n): Promise<void> => {\n const compose: any = {\n services: {},\n volumes: {},\n networks: {\n raclette_shared: {\n external: true,\n name: \"raclette_shared\",\n },\n },\n }\n\n const projectName = `${config.name}-build`\n\n // Add MongoDB if enabled\n if (config.services.mongodb?.enabled) {\n const mongoVolume = `${projectName}-mongodb-data`\n compose.services.mongodb = {\n container_name: `${projectName}-mongodb`,\n image: \"mongo:8.2\",\n ports: [`127.0.0.1:${config.services.mongodb.port}:27017`],\n volumes: [`${mongoVolume}:/data/db`],\n networks: [\"raclette_shared\"],\n healthcheck: {\n test: [\"CMD\", \"mongosh\", \"--eval\", \"db.adminCommand('ping')\"],\n interval: \"10s\",\n timeout: \"30s\",\n retries: 20,\n },\n }\n compose.volumes[mongoVolume] = null\n }\n\n // Add Redis if enabled\n if (config.services.redis?.enabled) {\n const redisVolume = `${projectName}-redis-data`\n compose.services.redis = {\n container_name: `${projectName}-redis`,\n image: \"redis:7-alpine\",\n ports: [`127.0.0.1:${config.services.redis.port}:6379`],\n command: \"redis-server --appendonly yes\",\n volumes: [`${redisVolume}:/data`],\n networks: [\"raclette_shared\"],\n healthcheck: {\n test: [\"CMD\", \"redis-cli\", \"ping\"],\n interval: \"10s\",\n timeout: \"5s\",\n retries: 3,\n },\n }\n compose.volumes[redisVolume] = null\n }\n\n // Add backend for generation\n if (config.services.backend?.enabled) {\n const backendNodeModules = `${projectName}-backend_node_modules`\n\n compose.services.backend = {\n container_name: `${projectName}-backend`,\n build: {\n context: \".\",\n dockerfile: \"./backend.Dockerfile\",\n args: { NODE_ENV: \"development\" },\n },\n command: \"yarn generate\",\n environment: [\n \"NODE_ENV=development\",\n \"RACLETTE_BUILD_MODE=generate\", // Special mode to exit after generation\n `MONGO_HOST=mongodb://mongodb:${config.services.mongodb?.port || 27017}/${config.services.mongodb?.databaseName || config.name}`,\n \"SERVER_TOKEN_SECRET=${SERVER_TOKEN_SECRET:-thisshouldbesetforproduction}\",\n `CACHE_URL=redis://redis:${config.services.redis?.port || 6379}`,\n ...Object.entries(config.env.development || {}).map(\n ([key, value]) => `${key}=${value}`,\n ),\n ],\n volumes: [\n `${backendNodeModules}:/app/node_modules`,\n \"./.raclette/virtual/backend/src:/app/src\",\n \"./plugins:/app/src/appPlugins\",\n \"./.raclette/backend/raclette.config.js:/app/raclette.config.js\",\n \"./.raclette/backend/package.json:/app/package.json\",\n \"./.raclette/dist/check-dependencies.sh:/app/check-dependencies.sh\",\n `${getServiceLockFilePath(\"backend\", config)}:/app/yarn.lock`,\n ],\n networks: [\"raclette_shared\"],\n depends_on: {\n ...(config.services.mongodb?.enabled && {\n mongodb: { condition: \"service_started\" },\n }),\n ...(config.services.redis?.enabled && {\n redis: { condition: \"service_healthy\" },\n }),\n },\n entrypoint: [\"/app/check-dependencies.sh\"],\n }\n compose.volumes[backendNodeModules] = null\n }\n\n if (\n config.services.backend?.volumes &&\n config.services.backend.volumes.length > 0\n ) {\n // Add custom volumes if defined for backend\n // Process each volume and add to the service volumes array\n config.services.backend.volumes.forEach((volumeDef) => {\n const processedVolume = processVolumeDefinition(volumeDef, workingDir)\n\n if (processedVolume)\n compose.services.backend.volumes.push(processedVolume)\n })\n }\n\n Object.values(compose.services).forEach((service: any) => {\n if (service.volumes) {\n service.volumes = processAllVolumes(service.volumes, workingDir)\n }\n })\n\n await fs.writeFile(outputPath, yaml.dump(compose))\n}\n\n/**\n * Generate build-time docker-compose (frontend + backend for building)\n */\nexport const generateBuildTimeCompose = async (\n config: RacletteConfig,\n workingDir: string,\n outputPath: string,\n buildOutputDir: string,\n): Promise<void> => {\n const compose: any = {\n services: {},\n volumes: {},\n networks: {\n raclette_shared: {\n external: true,\n name: \"raclette_shared\",\n },\n },\n }\n\n const projectName = `${config.name}-build`\n\n // Add frontend build service\n if (config.services.frontend?.enabled) {\n const frontendNodeModulesVolume =\n config.services.frontend.nodeModulesVolume ||\n `${config.name}-frontend_node_modules`\n\n compose.services.frontend = {\n container_name: `${projectName}-frontend`,\n build: {\n context: \".\",\n dockerfile: \"./frontend.Dockerfile\",\n args: { NODE_ENV: \"production\" },\n target: \"build\",\n },\n command: [\n \"sh\",\n \"-c\",\n `yarn install --production=false && yarn build && cp -r /app/dist/* /build-output/`,\n ],\n environment: [\n ...Object.entries(config.env.production || {}).map(\n ([key, value]) => `${key}=${value}`,\n ),\n \"NODE_ENV=production\",\n ],\n volumes: [\n // Same mounts as dev environment\n \"./.raclette/virtual/frontend/src:/app/src\",\n \"./.raclette/virtual/backend/src/shared:/app/src/shared\",\n `${frontendNodeModulesVolume}:/app/node_modules`,\n \"./plugins:/app/src/plugins\",\n \"./.raclette/virtual/backend/src/corePlugins:/app/src/corePlugins\",\n \"./.raclette/virtual/frontend/types:/app/types\",\n \"./.raclette/frontend/raclette.config.js:/app/raclette.config.js\",\n \"./.raclette/frontend/package.json:/app/package.json\",\n `${getServiceLockFilePath(\"frontend\", config)}:/app/yarn.lock`,\n // Mount build output\n `${path.resolve(buildOutputDir, \"frontend\")}:/build-output`,\n ],\n networks: [\"raclette_shared\"],\n }\n compose.volumes[frontendNodeModulesVolume] = null\n\n try {\n if (\n config.services.frontend?.volumes &&\n config.services.frontend.volumes.length > 0\n ) {\n // Process each volume and add to the service volumes array\n config.services.frontend.volumes.forEach((volumeDef) => {\n const processedVolume = processVolumeDefinition(volumeDef, workingDir)\n if (processedVolume)\n compose.services.frontend.volumes.push(processedVolume)\n })\n }\n } catch (error) {\n console.error(\n chalk.red(\n \"Could not add custom volumes to backend docker-compose file. This might lead to missing data.\",\n ),\n )\n }\n }\n\n // Add backend build service\n if (config.services.backend?.enabled) {\n const backendNodeModulesVolume =\n config.services.backend.nodeModulesVolume ||\n `${config.name}-backend_node_modules`\n\n compose.services.backend = {\n container_name: `${projectName}-backend`,\n build: {\n context: \".\",\n dockerfile: \"./backend.Dockerfile\",\n args: { NODE_ENV: \"production\" },\n },\n command: [\n \"sh\",\n \"-c\",\n `yarn install --production=false && rm -rf ./dist && yarn build && cp -r /app/dist /build-output/ && cp /app/package.json /build-output/ && cp /app/yarn.lock /build-output/ || echo 'Backend build failed'`,\n ],\n environment: [\n ...Object.entries(config.env.production || {}).map(\n ([key, value]) => `${key}=${value}`,\n ),\n \"NODE_ENV=production\",\n ],\n volumes: [\n // Same mounts as dev environment\n `${backendNodeModulesVolume}:/app/node_modules`,\n \"./.raclette/virtual/backend/src:/app/src\",\n \"./.raclette/backend/raclette.config.js:/app/raclette.config.js\",\n \"./plugins:/app/src/appPlugins\",\n \"./.raclette/backend/package.json:/app/package.json\",\n `${getServiceLockFilePath(\"backend\", config)}:/app/yarn.lock`,\n \"./.raclette/virtual/backend/types:/app/types\",\n // Mount build output\n `${path.resolve(buildOutputDir, \"backend\")}:/build-output`,\n ],\n networks: [\"raclette_shared\"],\n }\n compose.volumes[backendNodeModulesVolume] = null\n\n try {\n if (\n config.services.backend?.volumes &&\n config.services.backend.volumes.length > 0\n ) {\n // Add custom volumes if defined for backend\n // Process each volume and add to the service volumes array\n config.services.backend.volumes.forEach((volumeDef) => {\n const processedVolume = processVolumeDefinition(volumeDef, workingDir)\n if(processedVolume)\n compose.services.backend.volumes.push(processedVolume)\n })\n }\n } catch (error) {\n console.error(\n chalk.red(\n \"Could not add custom volumes to backend docker-compose file. This might lead to missing data.\",\n ),\n )\n }\n }\n\n Object.values(compose.services).forEach((service: any) => {\n if (service.volumes) {\n service.volumes = processAllVolumes(service.volumes, workingDir)\n }\n })\n\n await fs.writeFile(outputPath, yaml.dump(compose))\n}\n\n/**\n * Create enhanced deployment scripts with image loading\n */\nexport const createEnhancedDeploymentScripts = async (\n packageDir: string,\n imageNames: string[],\n hasWorkbench: boolean,\n config: RacletteConfig,\n): Promise<void> => {\n const frontendPort = config.services.frontend?.port || 8081\n const workbenchFrontendPort = config.services.workbench?.frontendPort || 8083\n\n // Enhanced deploy script that loads images first\n const deployScript = `#!/bin/bash\n# racletteJS Production Deployment Script with Image Loading\n\nset -e\n\necho \"\uD83D\uDE80 Deploying racletteJS application from packaged images...\"\n\n# Check if running from package directory\nif [ ! -d \"images\" ]; then\n echo \"\u274C Images directory not found. Make sure you're running this from the extracted package directory.\"\n exit 1\nfi\n\n# Check if .env file exists\nif [ ! -f .env ]; then\n echo \"\u274C .env file not found. Copy .env.example and configure it first.\"\n echo \"\uD83D\uDCA1 Run: cp .env.example .env && nano .env\"\n exit 1\nfi\n\n# Load Docker images\necho \"\uD83D\uDCE5 Loading Docker images...\"\n./load-images.sh\n\n# Build and start services (images are already loaded)\necho \"\uD83D\uDFE2 Starting services...\"\ndocker compose up -d\n\necho \"\u23F3 Waiting for services to be healthy...\"\nsleep 30\n\n# Check health\necho \"\uD83D\uDD0D Checking service health...\"\ndocker compose ps\n\n# Test endpoints\necho \"\uD83E\uDDEA Testing application endpoints...\"\nif curl -f http://localhost:${frontendPort}/health > /dev/null 2>&1; then\n echo \"\u2705 Application health check passed\"\nelse\n echo \"\u26A0\uFE0F Application health check failed, but services are running\"\n echo \"\uD83D\uDCA1 Make sure your Fastify backend has a /health endpoint and listens on 0.0.0.0:3000\"\nfi\n\necho \"\u2705 Deployment complete!\"\necho \"\"\necho \"\uD83C\uDF0D Application URLs:\"\necho \" Main App: http://localhost:${frontendPort}\"\n${hasWorkbench ? `echo \" Workbench: http://localhost:${workbenchFrontendPort}\"` : \"\"}\necho \"\"\necho \"\uD83D\uDCCA Management commands:\"\necho \" View logs: docker compose logs -f\"\necho \" Stop: docker compose down\"\necho \" Restart: docker compose restart\"\necho \" Update images: ./load-images.sh && docker compose up -d\"\n`\n\n await fs.writeFile(path.join(packageDir, \"deploy.sh\"), deployScript)\n await fs.chmod(path.join(packageDir, \"deploy.sh\"), 0o755)\n}\n\n/**\n * Create script to load Docker images\n */\nexport const createImageLoadScript = async (\n packageDir: string,\n imageNames: string[],\n): Promise<void> => {\n const loadScript = `#!/bin/bash\n# Load Docker Images Script\n\nset -e\n\necho \"\uD83D\uDCE5 Loading Docker images...\"\n\nif [ ! -d \"images\" ]; then\n echo \"\u274C Images directory not found\"\n exit 1\nfi\n\ncd images\n\n# Load each image\n${imageNames\n .map((imageName) => {\n const fileName = imageName.replace(/[:/]/g, \"_\")\n return `echo \" \uD83D\uDCE6 Loading ${imageName}...\"\nif [ -f \"${fileName}.tar\" ]; then\n docker load -i \"${fileName}.tar\"\n echo \" \u2705 Loaded ${imageName}\"\nelse\n echo \" \u274C Image file ${fileName}.tar not found\"\n exit 1\nfi`\n })\n .join(\"\\n\\n\")}\n\ncd ..\n\necho \"\u2705 All images loaded successfully!\"\necho \"\"\necho \"\uD83D\uDC33 Available images:\"\ndocker images | grep -E \"${imageNames.map((img) => img.split(\":\")[0]).join(\"|\")}\" || echo \"No images found (this might be expected if tags changed)\"\n`\n\n await fs.writeFile(path.join(packageDir, \"load-images.sh\"), loadScript)\n await fs.chmod(path.join(packageDir, \"load-images.sh\"), 0o755)\n}\n\n/**\n * Create deployment README for offline packages\n */\nconst createDeploymentReadme = async (\n packageDir: string,\n config: RacletteConfig,\n imageNames: string[],\n hasWorkbench: boolean,\n): Promise<void> => {\n const frontendPort = config.services.frontend?.port || 8081\n const workbenchFrontendPort = config.services.workbench?.frontendPort || 8083\n\n const readme = `# ${config.name} - Deployment Package\n\nThis package contains everything needed to deploy your racletteJS application.\n\n## Contents\n\n- \\`images/\\` - Docker images as TAR files\n- \\`docker-compose.yml\\` - Production compose configuration\n- \\`.env.example\\` - Environment variables template\n- \\`deploy.sh\\` - Main deployment script\n- \\`load-images.sh\\` - Load Docker images script\n- \\`nginx.conf\\` - Nginx configuration\n${hasWorkbench ? \"- `nginx.workbench.conf` - Workbench nginx configuration\" : \"\"}\n\n## Quick Start\n\n1. **Extract the package:**\n \\`\\`\\`bash\n tar -xzf ${config.name}-deployment-*.tar.gz\n cd ${config.name}-deployment-*\n \\`\\`\\`\n\n2. **Configure environment:**\n \\`\\`\\`bash\n cp .env.example .env\n nano .env # Edit your configuration\n \\`\\`\\`\n\n3. **Deploy:**\n \\`\\`\\`bash\n chmod +x deploy.sh load-images.sh\n ./deploy.sh\n \\`\\`\\`\n\n## Manual Deployment\n\nIf you prefer manual control:\n\n1. **Load images:**\n \\`\\`\\`bash\n ./load-images.sh\n \\`\\`\\`\n\n2. **Start services:**\n \\`\\`\\`bash\n docker compose up -d\n \\`\\`\\`\n\n## Included Images\n\n${imageNames.map((img) => `- \\`${img}\\``).join(\"\\n\")}\n\n## Environment Variables\n\nCopy \\`.env.example\\` to \\`.env\\` and configure:\n\n- \\`SERVER_TOKEN_SECRET\\` - **Required** - Generate a secure random string\n- \\`MONGO_DATABASE\\` - Database name (default: ${config.services.mongodb?.databaseName || config.name})\n- \\`NODE_ENV=production\\` - **Required for production**\n\n## Application URLs\n\nAfter deployment:\n- Main Application: http://localhost:${frontendPort}\n${hasWorkbench ? `- Workbench: http://localhost:${workbenchFrontendPort}` : \"\"}\n\n## Management Commands\n\n- **View logs:** \\`docker compose logs -f\\`\n- **Stop services:** \\`docker compose down\\`\n- **Restart services:** \\`docker compose restart\\`\n- **Update:** Re-run \\`./load-images.sh && docker compose up -d\\`\n\n## Troubleshooting\n\n- **Health check fails:** Ensure your backend has a \\`/health\\` endpoint\n- **502 errors:** Check backend logs with \\`docker compose logs backend\\`\n- **Images not loading:** Verify Docker is running and you have sufficient disk space\n\n## System Requirements\n\n- Docker and Docker Compose\n- At least 2GB free disk space\n- Ports ${frontendPort}${hasWorkbench ? `, ${workbenchFrontendPort}` : \"\"} available\n\nGenerated on: ${new Date().toISOString()}\n`\n\n await fs.writeFile(path.join(packageDir, \"README.md\"), readme)\n}\n\n/**\n * Package images and deployment files for distribution\n */\nexport const packageImagesForDistribution = async (\n config: RacletteConfig,\n buildDir: string,\n imageNames: string[],\n timestamp: string,\n hasWorkbench: boolean,\n): Promise<{ packagePath: string; imageNames: string[] }> => {\n console.log(chalk.blue(\"\uD83D\uDCE6 Packaging images for distribution...\"))\n\n const packageDir = path.join(buildDir, \"..\", \"package\")\n const packageName = `${config.name}-deployment-${timestamp}`\n const packagePath = path.join(packageDir, `${packageName}.tar.gz`)\n\n await fs.ensureDir(packageDir)\n await fs.emptyDir(packageDir)\n\n const tempPackageDir = path.join(packageDir, packageName)\n await fs.ensureDir(tempPackageDir)\n\n try {\n // Step 1: Export Docker images\n console.log(chalk.gray(\" \uD83D\uDCBE Exporting Docker images...\"))\n const imagesDir = path.join(tempPackageDir, \"images\")\n await fs.ensureDir(imagesDir)\n\n for (const imageName of imageNames) {\n const imageFileName = `${imageName.replace(/[:/]/g, \"_\")}.tar`\n const imageFilePath = path.join(imagesDir, imageFileName)\n\n console.log(chalk.gray(` \uD83D\uDCE6 Exporting ${imageName}...`))\n executeDockerCommand([\"save\", \"-o\", imageFilePath, imageName], {\n stdio: \"pipe\",\n })\n\n // Verify the image was exported\n const stats = await fs.stat(imageFilePath)\n if (stats.size === 0) {\n throw new Error(`Failed to export image ${imageName}`)\n }\n\n console.log(\n chalk.gray(\n ` \u2705 Exported ${imageName} (${(stats.size / 1024 / 1024).toFixed(1)}MB)`,\n ),\n )\n }\n\n // Step 2: Copy deployment files\n console.log(chalk.gray(\" \uD83D\uDCC4 Copying deployment files...\"))\n const deploymentFiles = [\n \"docker-compose.yml\",\n \".env.example\",\n \"deploy.sh\",\n \"nginx.conf\",\n ]\n\n if (hasWorkbench) {\n deploymentFiles.push(\"nginx.workbench.conf\")\n }\n\n await copyBuildFilesToPackage(deploymentFiles, buildDir, tempPackageDir, {\n required: false,\n logPrefix: \" \",\n })\n\n // Step 3: Create enhanced deployment scripts\n await createEnhancedDeploymentScripts(\n tempPackageDir,\n imageNames,\n hasWorkbench,\n config,\n )\n\n // Step 4: Create image load script\n await createImageLoadScript(tempPackageDir, imageNames)\n\n // Step 5: Create README\n await createDeploymentReadme(\n tempPackageDir,\n config,\n imageNames,\n hasWorkbench,\n )\n\n // Step 6: Create the final package\n console.log(chalk.gray(\" \uD83D\uDDDC\uFE0F Creating deployment package...\"))\n await createTarGzPackage(tempPackageDir, packagePath)\n\n // Step 7: Cleanup temporary directory\n await fs.remove(tempPackageDir)\n\n console.log(\n chalk.green(` \u2705 Deployment package created: ${packageName}.tar.gz`),\n )\n return { packagePath, imageNames }\n } catch (error) {\n await fs.remove(tempPackageDir).catch(() => {})\n throw error\n }\n}\n\n/**\n * Create TAR.GZ package\n */\nexport const createTarGzPackage = async (\n sourceDir: string,\n outputPath: string,\n): Promise<void> => {\n const parentDir = path.dirname(sourceDir)\n const folderName = path.basename(sourceDir)\n\n // Use native tar command for better compression\n execSync(`tar -czf \"${outputPath}\" -C \"${parentDir}\" \"${folderName}\"`, {\n stdio: \"pipe\",\n })\n\n // Verify the package was created\n const stats = await fs.stat(outputPath)\n console.log(\n chalk.gray(\n ` \uD83D\uDCE6 Package size: ${(stats.size / 1024 / 1024).toFixed(1)}MB`,\n ),\n )\n}\n", "import type { RacletteConfig } from \"./types\"\nimport chalk from \"chalk\"\nimport fs from \"fs-extra\"\nimport path from \"path\"\nimport yaml from \"js-yaml\"\nimport {\n getVolumeOverrideExamples,\n type VolumeOverride,\n} from \"./volume-overrides\"\nimport { generateEnvExampleContent } from \"src/build-helper\"\n\nexport type DeployGuideOptions = {\n imagePrefix?: string\n imageTag?: string\n registry?: string\n outputDir?: string\n generateFiles?: boolean\n returnOnly?: boolean\n}\n\nexport type DeployGuideResult = {\n outputPath: string\n mode: \"embedded\" | \"files\"\n deployGuideFile: string\n additionalFiles?: string[]\n}\n\n/**\n * Generate registry deployment guide and files\n */\nexport const generateDeployGuide = async (\n config: RacletteConfig,\n options: DeployGuideOptions = {},\n): Promise<DeployGuideResult> => {\n console.log(chalk.blue(\"\uD83D\uDCCB Generating deployment guide...\"))\n\n const outputDir = path.resolve(options.outputDir || process.cwd())\n const imagePrefix = options.imagePrefix || config.name\n const imageTag = options.imageTag || \"latest\"\n const registry = options.registry || \"\"\n\n // Generate image names using same logic as build process\n const imageNames = generateImageNames(config, imagePrefix, imageTag, registry)\n\n if (options.generateFiles) {\n return await generateDeploymentFiles(\n config,\n imageNames,\n outputDir,\n registry,\n )\n } else {\n return await generateEmbeddedGuide(config, imageNames, outputDir, registry)\n }\n}\n\n/**\n * Generate deployment guide content for stdout output\n */\nexport const generateDeployGuideContent = async (\n config: RacletteConfig,\n options: DeployGuideOptions = {},\n): Promise<string> => {\n const imagePrefix = options.imagePrefix || config.name\n const imageTag = options.imageTag || \"latest\"\n const registry = options.registry || \"\"\n\n // Generate image names using same logic as build process\n const imageNames = generateImageNames(config, imagePrefix, imageTag, registry)\n\n // Generate the user deployment guide content (return-only mode)\n return await generateReturnOnlyGuideContent(\n config,\n imageNames,\n imageTag,\n registry,\n )\n}\n\n/**\n * Generate user deployment guide content for --return-only mode\n */\nconst generateReturnOnlyGuideContent = async (\n config: RacletteConfig,\n imageNames: { names: string[]; hasWorkbench: boolean },\n imageTag: string,\n registry: string,\n): Promise<string> => {\n const frontendPort = config.services.frontend?.port || 8081\n const workbenchPort = config.services.workbench?.frontendPort || 8083\n\n const composeContent = await generateComposeYamlString(\n config,\n imageNames,\n imageTag,\n registry,\n )\n const overrideContent = await generateOverrideYamlString()\n\n // Create .env section with proper formatting\n const envSection = createEnvSection(config.name, imageTag)\n\n return `# Deploy ${config.name} with Docker\n\nDeploy ${config.name} using pre-built Docker images.\n\n## Quick Start\n\n### 1. Create docker-compose.yml\n\n\\`\\`\\`yaml\n${composeContent}\n\\`\\`\\`\n\n### 2. Create .env file\n\n\\`\\`\\`bash\n${envSection}\n\\`\\`\\`\n\n### 3. Deploy\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\n## Application URLs\n\n- **Main Application:** http://localhost:${frontendPort}\n${imageNames.hasWorkbench ? `- **Workbench:** http://localhost:${workbenchPort}` : \"\"}\n\n## Customization\n\nCreate \\`docker-compose.override.yml\\` for customizations:\n\n\\`\\`\\`yaml\n${overrideContent}\n\\`\\`\\`\n\n*Note for developers: The volume examples above can be customized based on \nyour application's specific customization points. Update the paths and \ndescriptions as needed for your project.*\n\n## Management\n\n\\`\\`\\`bash\n# View logs\ndocker compose logs -f\n\n# Update to latest images\ndocker compose pull && docker compose up -d\n\n# Stop services\ndocker compose down\n\n# Remove all data (\u26A0\uFE0F destructive)\ndocker compose down -v\n\\`\\`\\`\n\n## System Requirements\n\n- Docker and Docker Compose\n- 2GB+ available RAM\n- Ports ${frontendPort}${imageNames.hasWorkbench ? `, ${workbenchPort}` : \"\"} available\n\n## Troubleshooting\n\n- **502 errors:** Check backend logs with \\`docker compose logs backend\\`\n- **Database connection:** Verify MongoDB is healthy with \\`docker compose ps\\`\n- **Image pull errors:** Check registry access and IMAGE_TAG value\n`\n}\n\n/**\n * Create properly formatted .env section\n */\nconst createEnvSection = (projectName: string, imageTag: string): string => {\n const sections = [\n \"# Required\",\n \"RACLETTE_SERVER_TOKEN_SECRET=your-secret-key-here\",\n \"RACLETTE_FRONTEND_URLS=https://yourdomain.com,https://workbench.yourdomain.com # required to prevent CORS issues\",\n \"\",\n \"# Database Name\",\n `RACLETTE_MONGO_DATABASE=${projectName}`,\n \"\",\n \"# Image Configuration\",\n `IMAGE_TAG=${imageTag}`,\n \"\",\n \"# Optional - Debug Mode\",\n \"# RACLETTE_DEBUG_MODE=true # Uncomment to see frontend logs in console\",\n ]\n\n return sections.join(\"\\n\")\n}\n\n/**\n * Generate user deployment guide content as string (for file mode)\n */\nconst generateUserDeploymentGuideContent = async (\n config: RacletteConfig,\n imageNames: { names: string[]; hasWorkbench: boolean },\n registry: string,\n): Promise<string> => {\n const frontendPort = config.services.frontend?.port || 8081\n const workbenchPort = config.services.workbench?.frontendPort || 8083\n\n const composeContent = await generateComposeYamlString(\n config,\n imageNames,\n \"latest\", // Use default for file mode\n registry,\n )\n const overrideContent = await generateOverrideYamlString()\n\n return `# Deploy ${config.name} with Docker\n\nDeploy ${config.name} using pre-built Docker images.\n\n## Quick Start\n\n### 1. Create docker-compose.yml\n\n\\`\\`\\`yaml\n${composeContent}\n\\`\\`\\`\n\n### 2. Create .env file\n\n\\`\\`\\`bash\n# Required\nSERVER_TOKEN_SECRET=your-secret-key-here\nNODE_ENV=production\n\n# Database Configuration\nMONGO_DATABASE=${config.name}\n\n# Image Configuration\nIMAGE_TAG=latest\n\n# Optional - Override image registry\n# DOCKER_REGISTRY=your-registry.com/\n\n# Optional - Debug Mode \n# RACLETTE_DEBUG_MODE=true # Uncomment to see frontend logs in console\n\n# Optional - External Services\n# RACLETTE_MONGODB_HOST=mongodb://your-mongodb:27017/your-database\n# RACLETTE_CACHE_URL=valkey://your-cache:6379\n\\`\\`\\`\n\n### 3. Deploy\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\n## Application URLs\n\n- **Main Application:** http://localhost:${frontendPort}\n${imageNames.hasWorkbench ? `- **Workbench:** http://localhost:${workbenchPort}` : \"\"}\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| \\`SERVER_TOKEN_SECRET\\` | **Required** - JWT signing secret | - |\n| \\`MONGO_DATABASE\\` | Database name | \\`${config.name}\\` |\n| \\`IMAGE_TAG\\` | Image version | \\`latest\\` |\n| \\`DOCKER_REGISTRY\\` | Registry URL prefix | \\`\\` (Docker Hub) |\n| \\`RACLETTE_DEBUG_MODE\\` | Enable frontend debug logging | \\`false\\` |\n\n## Customization\n\nCreate \\`docker-compose.override.yml\\` for customizations:\n\n\\`\\`\\`yaml\n${overrideContent}\n\\`\\`\\`\n\n*Note for developers: The volume examples above can be customized based on \nyour application's specific customization points. Update the paths and \ndescriptions as needed for your project.*\n\n## Registry Configuration\n\n*Note for developers: When copying this guide to your README, update the \nimage names in the docker-compose.yml above to match your actual registry location:*\n\n- **Docker Hub**: \\`myproject/frontend:latest\\`\n- **GitLab Registry**: \\`registry.gitlab.com/group/project/frontend:latest\\` \n- **GitHub Registry**: \\`ghcr.io/owner/repo/frontend:latest\\`\n- **Private Registry**: \\`your-registry.com/project/frontend:latest\\`\n\n## Management\n\n\\`\\`\\`bash\n# View logs\ndocker compose logs -f\n\n# Update to latest images\ndocker compose pull && docker compose up -d\n\n# Stop services\ndocker compose down\n\n# Remove all data (\u26A0\uFE0F destructive)\ndocker compose down -v\n\\`\\`\\`\n\n## System Requirements\n\n- Docker and Docker Compose\n- 2GB+ available RAM\n- Ports ${frontendPort}${imageNames.hasWorkbench ? `, ${workbenchPort}` : \"\"} available\n\n## Troubleshooting\n\n- **502 errors:** Check backend logs with \\`docker compose logs backend\\`\n- **Database connection:** Verify MongoDB is healthy with \\`docker compose ps\\`\n- **Image pull errors:** Check registry access and IMAGE_TAG value\n`\n}\n\n/**\n * Generate image names using same logic as build process\n */\nconst generateImageNames = (\n config: RacletteConfig,\n imagePrefix: string,\n imageTag: string,\n registry: string,\n): { names: string[]; hasWorkbench: boolean } => {\n const services = [\"frontend\", \"backend\"]\n const hasWorkbench = config.services.workbench?.enabled || false\n\n if (hasWorkbench) {\n services.push(\"workbench-frontend\", \"workbench-backend\")\n }\n\n const names = services.map((service) => {\n const imageName = `${imagePrefix}/${service}`\n const fullImageName = registry ? `${registry}${imageName}` : imageName\n return `${fullImageName}:${imageTag}`\n })\n\n return { names, hasWorkbench }\n}\n\n/**\n * Generate deployment files for local testing\n */\nconst generateDeploymentFiles = async (\n config: RacletteConfig,\n imageNames: { names: string[]; hasWorkbench: boolean },\n outputDir: string,\n registry: string,\n): Promise<DeployGuideResult> => {\n console.log(chalk.blue(\"\uD83D\uDCC1 Generating deployment files...\"))\n\n const deployGuideDir = path.join(outputDir, \"deploy-guide\")\n await fs.ensureDir(deployGuideDir)\n\n // Generate docker-compose.yml\n const composeFile = path.join(deployGuideDir, \"docker-compose.yml\")\n await generateRegistryCompose(\n config,\n imageNames,\n composeFile,\n \"latest\",\n registry,\n )\n\n // Generate docker-compose.override.yml.example\n const overrideFile = path.join(\n deployGuideDir,\n \"docker-compose.override.yml.example\",\n )\n await generateComposeOverride(config, overrideFile)\n\n // Generate .env.example\n const envFile = path.join(deployGuideDir, \".env.example\")\n await generateEnvExample(config, envFile, imageNames.hasWorkbench)\n\n // Generate local testing README\n const localReadmeFile = path.join(deployGuideDir, \"README.md\")\n await generateLocalTestingReadme(\n config,\n imageNames,\n localReadmeFile,\n registry,\n )\n\n // Generate deployment guide for users\n const deployGuideFile = path.join(deployGuideDir, \"DEPLOY.md\")\n await generateUserDeploymentGuide(\n config,\n imageNames,\n deployGuideFile,\n registry,\n )\n\n console.log(chalk.green(\"\u2705 Deployment files generated\"))\n console.log(chalk.gray(` \uD83D\uDCC1 Files created in: ${deployGuideDir}`))\n\n return {\n outputPath: deployGuideDir,\n mode: \"files\",\n deployGuideFile,\n additionalFiles: [composeFile, overrideFile, envFile, localReadmeFile],\n }\n}\n\n/**\n * Generate embedded deployment guide (single file)\n */\nconst generateEmbeddedGuide = async (\n config: RacletteConfig,\n imageNames: { names: string[]; hasWorkbench: boolean },\n outputDir: string,\n registry: string,\n): Promise<DeployGuideResult> => {\n console.log(chalk.blue(\"\uD83D\uDCCB Generating embedded deployment guide...\"))\n\n const deployGuideFile = path.join(outputDir, \"DEPLOY.md\")\n await generateDeveloperDeploymentGuide(\n config,\n imageNames,\n deployGuideFile,\n registry,\n )\n\n console.log(chalk.green(\"\u2705 Deployment guide generated\"))\n console.log(chalk.gray(` \uD83D\uDCC4 Guide: ${deployGuideFile}`))\n\n return {\n outputPath: outputDir,\n mode: \"embedded\",\n deployGuideFile,\n }\n}\n\n/**\n * Generate registry-based docker-compose.yml\n */\nconst generateRegistryCompose = async (\n config: RacletteConfig,\n imageNames: { names: string[]; hasWorkbench: boolean },\n outputPath: string,\n imageTag: string,\n registry: string,\n): Promise<void> => {\n const frontendPort = config.services.frontend?.port || 8081\n const workbenchPort = config.services.workbench?.frontendPort || 8083\n\n // Generate image template with resolved registry\n const getImageTemplate = (imageName: string) => {\n // Extract the base image name without tag and registry\n const parts = imageName.split(\":\")\n const imageWithoutTag = parts[0]\n const baseImageName = imageWithoutTag.replace(registry, \"\")\n\n // If registry is provided, resolve it directly, otherwise use variable\n if (registry) {\n return `${registry}${baseImageName}:\\${IMAGE_TAG:-${imageTag}}`\n } else {\n return `\\${DOCKER_REGISTRY:-}${baseImageName}:\\${IMAGE_TAG:-${imageTag}}`\n }\n }\n\n const compose: any = {\n name: config.name,\n services: {\n frontend: {\n image: getImageTemplate(imageNames.names[0]), // frontend image\n ports: [`\\${FRONTEND_PORT:-${frontendPort}}:${frontendPort}`],\n depends_on: [\"backend\"],\n restart: \"unless-stopped\",\n networks: [\"app-network\"],\n environment: [\n \"NODE_ENV=production\",\n \"RACLETTE_DEBUG_MODE=${RACLETTE_DEBUG_MODE:-false}\",\n \"RACLETTE_SERVER_BASE_URL=${RACLETTE_SERVER_BASE_URL:-/api}\",\n \"RACLETTE_SOCKET_URL=${RACLETTE_SOCKET_URL:-}\",\n ],\n healthcheck: {\n test: [\"CMD\", \"curl\", \"-f\", `http://0.0.0.0:${frontendPort}/`],\n interval: \"10s\",\n timeout: \"30s\",\n retries: 10,\n },\n },\n backend: {\n image: getImageTemplate(imageNames.names[1]), // backend image\n depends_on: [\"database\", \"cache\"],\n restart: \"unless-stopped\",\n networks: [\"app-network\"],\n environment: [\n \"NODE_ENV=production\",\n \"SERVER_TOKEN_SECRET=${SERVER_TOKEN_SECRET}\",\n `MONGO_HOST=\\${RACLETTE_MONGODB_HOST:-mongodb://database:27017/\\${MONGO_DATABASE:-${config.name}}}`,\n \"CACHE_URL=${RACLETTE_CACHE_URL:-valkey://cache:6379}\",\n ],\n healthcheck: {\n test: [\"CMD\", \"curl\", \"-f\", \"http://0.0.0.0:3000/health\"],\n interval: \"10s\",\n timeout: \"30s\",\n retries: 10,\n },\n },\n database: {\n image: \"mongo:8.2\",\n restart: \"unless-stopped\",\n volumes: [\"mongodb_data:/data/db\"],\n networks: [\"app-network\"],\n environment: [\n `MONGO_INITDB_DATABASE=\\${MONGO_DATABASE:-${config.name}}`,\n ],\n healthcheck: {\n test: [\"CMD\", \"mongosh\", \"--eval\", \"db.adminCommand('ping')\"],\n interval: \"10s\",\n timeout: \"30s\",\n retries: 20,\n },\n },\n cache: {\n image: \"valkey/valkey:9.0-alpine\",\n restart: \"unless-stopped\",\n volumes: [\"cache_data:/data\"],\n networks: [\"app-network\"],\n healthcheck: {\n test: [\"CMD\", \"valkey-cli\", \"ping\"],\n interval: \"10s\",\n timeout: \"5s\",\n retries: 3,\n },\n },\n },\n volumes: {\n mongodb_data: {},\n cache_data: {},\n },\n networks: {\n \"app-network\": {\n driver: \"bridge\",\n },\n },\n }\n\n // Add workbench services if enabled\n if (imageNames.hasWorkbench && imageNames.names.length >= 4) {\n compose.services[\"workbench-frontend\"] = {\n image: getImageTemplate(imageNames.names[2]), // workbench-frontend image\n ports: [`\\${WORKBENCH_FRONTEND_PORT:-${workbenchPort}}:${workbenchPort}`],\n depends_on: [\"workbench-backend\"],\n restart: \"unless-stopped\",\n networks: [\"app-network\"],\n environment: [\n \"NODE_ENV=production\",\n \"RACLETTE_DEBUG_MODE=${RACLETTE_DEBUG_MODE:-false}\",\n \"RACLETTE_SERVER_BASE_URL=${RACLETTE_SERVER_BASE_URL:-/api}\",\n \"RACLETTE_SOCKET_URL=${RACLETTE_SOCKET_URL:-}\",\n ],\n healthcheck: {\n test: [\"CMD\", \"curl\", \"-f\", `http://0.0.0.0:${workbenchPort}/`],\n interval: \"10s\",\n timeout: \"30s\",\n retries: 10,\n },\n }\n\n compose.services[\"workbench-backend\"] = {\n image: getImageTemplate(imageNames.names[3]), // workbench-backend image\n depends_on: [\"database\", \"cache\"],\n restart: \"unless-stopped\",\n networks: [\"app-network\"],\n environment: [\n \"NODE_ENV=production\",\n \"PORT=3000\",\n \"SERVER_TOKEN_SECRET=${SERVER_TOKEN_SECRET}\",\n `MONGO_HOST=\\${RACLETTE_MONGODB_HOST:-mongodb://database:27017/\\${MONGO_DATABASE:-${config.name}}}`,\n \"CACHE_URL=${RACLETTE_CACHE_URL:-valkey://cache:6379}\",\n ],\n healthcheck: {\n test: [\"CMD\", \"curl\", \"-f\", \"http://0.0.0.0:3000/health\"],\n interval: \"10s\",\n timeout: \"30s\",\n retries: 10,\n },\n }\n }\n\n await fs.writeFile(outputPath, yaml.dump(compose))\n}\n\n/**\n * Generate docker-compose.override.yml.example\n */\nconst generateComposeOverride = async (\n config: RacletteConfig,\n outputPath: string,\n): Promise<void> => {\n const volumeExamples = getVolumeOverrideExamples()\n const frontendVolumes = volumeExamples.filter(\n (v: VolumeOverride) => v.service === \"frontend\",\n )\n const backendVolumes = volumeExamples.filter(\n (v: VolumeOverride) => v.service === \"backend\",\n )\n\n const override = `# docker-compose.override.yml\n# Copy this file to docker-compose.override.yml and customize as needed\n# This file allows you to extend the main docker-compose.yml without modifying it\n\nservices:\n frontend:\n # Add custom volume mounts for branding and customization\n volumes:\n${frontendVolumes.map((v: VolumeOverride) => ` # ${v.description}\\n # - ${v.source}:${v.target}`).join(\"\\n\")}\n # Override environment variables\n environment:\n # - CUSTOM_BRAND_NAME=My Company\n \n backend:\n # Add custom volume mounts for configuration and files\n volumes:\n${backendVolumes.map((v: VolumeOverride) => ` # ${v.description}\\n # - ${v.source}:${v.target}`).join(\"\\n\")}\n # Override environment variables\n environment:\n # - CUSTOM_API_KEY=your-api-key-here\n \n # Add additional services\n # custom-service:\n # image: some/custom-image\n # networks:\n # - app-network\n\n# Add custom volumes\n# volumes:\n# custom_data:\n\n# Add custom networks if needed\n# networks:\n# custom-network:\n`\n\n await fs.writeFile(outputPath, override)\n}\n\n/**\n * Generate .env.example\n */\nconst generateEnvExample = async (\n config: RacletteConfig,\n outputPath: string,\n hasWorkbench: boolean,\n): Promise<void> => {\n const envContent = generateEnvExampleContent(config, hasWorkbench)\n\n await fs.writeFile(outputPath, envContent)\n}\n\n/**\n * Generate local testing README\n */\nconst generateLocalTestingReadme = async (\n config: RacletteConfig,\n imageNames: { names: string[]; hasWorkbench: boolean },\n outputPath: string,\n registry: string,\n): Promise<void> => {\n const frontendPort = config.services.frontend?.port || 8081\n const workbenchPort = config.services.workbench?.frontendPort || 8083\n\n const readme = `# ${config.name} - Local Registry Testing\n\nThis folder contains deployment files for testing registry-based deployment locally.\n\n## Generated Files\n\n- \\`docker-compose.yml\\` - Registry-based compose configuration\n- \\`docker-compose.override.yml.example\\` - Customization template\n- \\`.env.example\\` - Environment variables template\n- \\`DEPLOY.md\\` - User deployment guide (copy to your project README)\n\n## Local Testing Steps\n\n### 1. Configure Environment\n\\`\\`\\`bash\ncp .env.example .env\nvi .env # Set SERVER_TOKEN_SECRET and other variables\n\\`\\`\\`\n\n### 2. Test with Local Images\nAssuming you built the images locally, you can test without a registry:\n\n\\`\\`\\`bash\n# Start services using local images\ndocker compose up -d\n\\`\\`\\`\n\n### 3. Test with Registry Images\nTo test the full registry workflow:\n\n\\`\\`\\`bash\n# Push your images to registry first\n${imageNames.names.map((img) => `docker push ${img}`).join(\"\\n\")}\n\n# Pull and start services\ndocker compose pull\ndocker compose up -d\n\\`\\`\\`\n\n## Application Access\n\nAfter deployment:\n- **Main Application:** http://localhost:${frontendPort}\n${imageNames.hasWorkbench ? `- **Workbench:** http://localhost:${workbenchPort}` : \"\"}\n\n## Built Images\n\nThis configuration expects these images:\n${imageNames.names.map((img) => `- \\`${img}\\``).join(\"\\n\")}\n\n## Management Commands\n\n- **View logs:** \\`docker compose logs -f\\`\n- **Stop services:** \\`docker compose down\\`\n- **Update images:** \\`docker compose pull && docker compose up -d\\`\n\n## Next Steps\n\n1. **Test locally** with the steps above\n2. **Copy DEPLOY.md** content to your project README\n3. **Push images to registry** for production use\n4. **Share deployment instructions** with your users\n\n## Registry Examples\n\n*Note for developers: When copying this deployment guide to your project README, \nyou can adjust these registry examples based on where your images will be hosted.*\n\n### Docker Hub (default)\n\\`\\`\\`bash\n# Images: myproject/frontend:latest\n# No additional configuration needed\n\\`\\`\\`\n\n### GitLab Container Registry\n\\`\\`\\`bash\n# Images: registry.gitlab.com/group/project/frontend:latest \n# Update image names in docker-compose.yml to include registry prefix\n\\`\\`\\`\n\n### GitHub Container Registry\n\\`\\`\\`bash\n# Images: ghcr.io/owner/repo/frontend:latest\n# Update image names in docker-compose.yml to include registry prefix\n\\`\\`\\`\n\nGenerated on: ${new Date().toISOString()}\n`\n\n await fs.writeFile(outputPath, readme)\n}\n\n/**\n * Generate user deployment guide\n */\nconst generateUserDeploymentGuide = async (\n config: RacletteConfig,\n imageNames: { names: string[]; hasWorkbench: boolean },\n outputPath: string,\n registry: string,\n): Promise<void> => {\n const content = await generateUserDeploymentGuideContent(\n config,\n imageNames,\n registry,\n )\n await fs.writeFile(outputPath, content)\n}\n\n/**\n * Generate developer deployment guide (embedded mode)\n */\nconst generateDeveloperDeploymentGuide = async (\n config: RacletteConfig,\n imageNames: { names: string[]; hasWorkbench: boolean },\n outputPath: string,\n registry: string,\n): Promise<void> => {\n // Generate user guide content directly instead of using temp files\n const userGuide = await generateUserDeploymentGuideContent(\n config,\n imageNames,\n registry,\n )\n\n const developerGuide = `# ${config.name} - Registry Deployment Guide\n\n## For Developers\n\nThis file contains registry deployment instructions generated from your build configuration.\n\n**What to do with this:**\n1. Copy the \"User Deployment Section\" below to your project README\n2. Update the documentation as needed for your specific use case\n3. Users can then deploy your application using the provided instructions\n\n**Generated for images:**\n${imageNames.names.map((img) => `- \\`${img}\\``).join(\"\\n\")}\n\n**Registry:** ${registry || \"Docker Hub (default)\"}\n\n---\n\n## User Deployment Section\n\n*Copy everything below this line to your project README or documentation*\n\n${userGuide}\n`\n\n await fs.writeFile(outputPath, developerGuide)\n}\n\n/**\n * Generate compose YAML as string\n */\nconst generateComposeYamlString = async (\n config: RacletteConfig,\n imageNames: { names: string[]; hasWorkbench: boolean },\n imageTag: string,\n registry: string,\n): Promise<string> => {\n const tempFile = path.join(process.cwd(), \"temp-compose.yml\")\n await generateRegistryCompose(\n config,\n imageNames,\n tempFile,\n imageTag,\n registry,\n )\n const content = await fs.readFile(tempFile, \"utf8\")\n await fs.remove(tempFile)\n return content\n}\n\n/**\n * Generate override YAML as string\n */\nconst generateOverrideYamlString = async (): Promise<string> => {\n const volumeExamples = getVolumeOverrideExamples()\n const frontendVolumes = volumeExamples\n .filter((v) => v.service === \"frontend\")\n .slice(0, 3) // Show fewer examples\n const backendVolumes = volumeExamples\n .filter((v) => v.service === \"backend\")\n .slice(0, 3) // Show fewer examples\n\n return `services:\n frontend:\n volumes:\n${frontendVolumes.map((v: VolumeOverride) => ` # ${v.description}\\n # - ${v.source}:${v.target}`).join(\"\\n\")}\n environment:\n # - CUSTOM_BRAND_NAME=My Company\n \n backend:\n volumes:\n${backendVolumes.map((v: VolumeOverride) => ` # ${v.description}\\n # - ${v.source}:${v.target}`).join(\"\\n\")}\n environment:\n # - CUSTOM_API_KEY=your-key`\n}\n", "/**\n * Volume override examples for different orchestrators\n */\n\nexport type VolumeOverride = {\n description: string\n source: string\n target: string\n service: \"frontend\" | \"backend\"\n}\n\nexport const getVolumeOverrideExamples = () => {\n // TODO: This will be gathered from the theme in the future\n // For now, we return the one and only default\n return [\n {\n description: \"custom favicon\",\n source: \"./branding/favicon.png\",\n target: \"/usr/shared/nginx/html/favicon.png\",\n service: \"frontend\",\n },\n {\n description: \"custom logo in app\",\n source: \"./branding/custom-logo.png\",\n target: \"/usr/shared/nginx/html/logo.png\",\n service: \"frontend\",\n },\n {\n description: \"custom home icon (can be full logo or just an icon)\",\n source: \"./branding/custom-home-icon.png\",\n target: \"/usr/shared/nginx/html/home-icon.png\",\n service: \"frontend\",\n },\n {\n description: \"custom logo in login screen (not used, if not set)\",\n source: \"./branding/custom-login-logo.png\",\n target: \"/usr/shared/nginx/html/login-logo.png\",\n service: \"frontend\",\n },\n ] satisfies VolumeOverride[]\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["require_error", "__commonJSMin", "exports", "CommanderError", "exitCode", "code", "message", "InvalidArgumentError", "require_argument", "__commonJSMin", "exports", "InvalidArgumentError", "Argument", "name", "description", "value", "previous", "fn", "values", "arg", "humanReadableArgName", "nameOutput", "require_help", "__commonJSMin", "exports", "humanReadableArgName", "Help", "contextOptions", "cmd", "visibleCommands", "helpCommand", "a", "b", "getSortKey", "option", "visibleOptions", "helpOption", "removeShort", "removeLong", "globalOptions", "ancestorCmd", "argument", "args", "arg", "helper", "max", "command", "cmdName", "ancestorCmdNames", "extraInfo", "choice", "extraDescription", "heading", "items", "unsortedItems", "visibleItems", "getGroup", "result", "item", "group", "termWidth", "helpWidth", "callFormatItem", "term", "description", "output", "commandDescription", "argumentList", "options", "optionList", "globalOptionList", "sub", "commands", "commandList", "str", "stripColor", "word", "itemIndentStr", "paddedTerm", "spacerWidth", "remainingWidth", "formattedDescription", "width", "rawLines", "chunkPattern", "wrappedLines", "line", "chunks", "sumChunks", "sumWidth", "chunk", "visibleWidth", "nextChunk", "sgrPattern", "require_option", "__commonJSMin", "exports", "InvalidArgumentError", "Option", "flags", "description", "optionFlags", "splitOptionFlags", "value", "arg", "names", "impliedOptionValues", "newImplied", "name", "fn", "mandatory", "hide", "previous", "values", "camelcase", "heading", "DualOptions", "options", "option", "key", "optionKey", "preset", "negativeValue", "str", "word", "shortFlag", "longFlag", "shortFlagExp", "longFlagExp", "flagParts", "unsupportedFlag", "baseError", "require_suggestSimilar", "__commonJSMin", "exports", "editDistance", "a", "b", "d", "i", "j", "cost", "suggestSimilar", "word", "candidates", "searchingOptions", "candidate", "similar", "bestDistance", "minSimilarity", "distance", "length", "require_command", "__commonJSMin", "exports", "EventEmitter", "childProcess", "path", "fs", "process", "Argument", "humanReadableArgName", "CommanderError", "Help", "stripColor", "Option", "DualOptions", "suggestSimilar", "Command", "_Command", "name", "str", "write", "useColor", "sourceCommand", "result", "command", "nameAndArgs", "actionOptsOrExecDesc", "execOpts", "desc", "opts", "args", "cmd", "configuration", "displayHelp", "displaySuggestion", "description", "parseArg", "defaultValue", "argument", "names", "detail", "previousArgument", "enableOrNameAndArgs", "helpName", "helpArgs", "helpDescription", "helpCommand", "deprecatedDescription", "event", "listener", "allowedValues", "fn", "err", "exitCode", "code", "message", "expectedArgsCount", "actionArgs", "flags", "target", "value", "previous", "invalidArgumentMessage", "option", "matchingOption", "matchingFlag", "knownBy", "alreadyUsed", "existingCmd", "newCmd", "oname", "positiveLongFlag", "handleOptionValue", "val", "invalidValueMessage", "valueSource", "oldValue", "config", "regex", "def", "m", "combine", "allowUnknown", "allowExcess", "positional", "passThrough", "storeAsProperties", "key", "source", "argv", "parseOptions", "execArgv", "userArgs", "executableFile", "executableDir", "subcommandName", "executableDirMessage", "executableMissing", "subcommand", "launchWithNode", "sourceExt", "findFile", "baseDir", "baseName", "localBin", "foundExt", "ext", "resolvedScriptPath", "localFile", "legacyName", "proc", "incrementNodeInspectorPort", "signal", "exitCallback", "wrappedError", "commandName", "operands", "unknown", "subCommand", "promiseChain", "arg", "i", "myParseArg", "parsedValue", "processedArgs", "declaredArg", "index", "processed", "v", "promise", "hooks", "hookedCommand", "callback", "hookDetail", "hook", "parsed", "checkForUnknownOptions", "commandEvent", "anOption", "definedNonDefaultOptions", "optionKey", "conflictingAndDefined", "defined", "dest", "maybeOption", "negativeNumberArg", "opt", "short", "activeVariadicOption", "activeGroup", "len", "combinedOptions", "errorOptions", "dualHelper", "hasCustomOptionValue", "impliedKey", "conflictingOption", "findBestOptionFromValue", "optionValue", "negativeOption", "positiveOption", "getErrorMessage", "bestOption", "flag", "suggestion", "candidateFlags", "moreFlags", "receivedArgs", "expected", "s", "unknownName", "candidateNames", "versionOption", "argsDescription", "alias", "matchingCommand", "aliases", "heading", "filename", "contextOptions", "helper", "context", "text", "error", "baseWrite", "hasColors", "helpWidth", "deprecatedCallback", "outputContext", "eventContext", "helpInformation", "position", "helpEvent", "helpStr", "helpOption", "debugOption", "debugHost", "debugPort", "match", "require_package", "__commonJSMin", "exports", "Argument", "Command", "CommanderError", "InvalidArgumentError", "Help", "Option", "name", "flags", "description", "require_package", "__commonJSMin", "exports", "module", "require_main", "__commonJSMin", "exports", "module", "fs", "path", "os", "crypto", "packageJson", "version", "TIPS", "_getRandomTip", "parseBoolean", "value", "supportsAnsi", "dim", "text", "LINE", "parse", "src", "obj", "lines", "match", "key", "maybeQuote", "_parseVault", "options", "vaultPath", "_vaultPath", "result", "DotenvModule", "err", "keys", "_dotenvKey", "length", "decrypted", "i", "attrs", "_instructions", "error", "_warn", "message", "_debug", "_log", "dotenvKey", "uri", "environment", "environmentKey", "ciphertext", "possibleVaultPath", "filepath", "_resolveHome", "envPath", "_configVault", "debug", "quiet", "parsed", "processEnv", "configDotenv", "dotenvPath", "encoding", "optionPaths", "lastError", "parsedAll", "e", "populated", "keysCount", "shortPaths", "filePath", "relative", "config", "decrypt", "encrypted", "keyStr", "nonce", "authTag", "aesgcm", "isRange", "invalidKeyLength", "decryptionFailed", "populate", "override", "require_package", "__commonJSMin", "exports", "module", "on", "once", "PassThroughStream", "getDefaultHighWaterMark", "finished", "mergeStreams", "streams", "stream", "validateStream", "objectMode", "readableObjectMode", "highWaterMark", "getHighWaterMark", "passThroughStream", "MergedStream", "onMergedStreamFinished", "onMergedStreamEnd", "onInputStreamsUnpipe", "endWhenStreamsDone", "afterMergedStreamFinished", "onInputStreamEnd", "onInputStreamUnpipe", "endStream", "errorOrAbortStream", "isAbortError", "abortStream", "errorStream", "noop", "updateMaxListeners", "PASSTHROUGH_LISTENERS_COUNT", "PASSTHROUGH_LISTENERS_PER_STREAM", "init_package", "__esmMin", "highWaterMarks", "readableHighWaterMark", "#streams", "#ended", "#aborted", "#onFinished", "#unpipeEvent", "#streamPromises", "streamPromise", "unpipeEvent", "controller", "signal", "error", "unpipedStream", "ended", "aborted", "onFinished", "increment", "maxListeners", "require_array", "__commonJSMin", "exports", "flatten", "items", "collection", "item", "splitWhen", "predicate", "result", "groupIndex", "require_errno", "__commonJSMin", "exports", "isEnoentCodeError", "error", "require_fs", "__commonJSMin", "exports", "DirentFromStats", "name", "stats", "createDirentFromStats", "require_path", "__commonJSMin", "exports", "os", "path", "IS_WINDOWS_PLATFORM", "LEADING_DOT_SEGMENT_CHARACTERS_COUNT", "POSIX_UNESCAPED_GLOB_SYMBOLS_RE", "WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE", "DOS_DEVICE_PATH_RE", "WINDOWS_BACKSLASHES_RE", "unixify", "filepath", "makeAbsolute", "cwd", "removeLeadingDotSegment", "entry", "secondCharactery", "escapeWindowsPath", "escapePosixPath", "pattern", "convertWindowsPathToPattern", "convertPosixPathToPattern", "require_package", "__commonJSMin", "exports", "module", "str", "match", "require_package", "__commonJSMin", "exports", "module", "isExtglob", "chars", "strictCheck", "str", "index", "pipeIndex", "closeSquareIndex", "closeCurlyIndex", "closeParenIndex", "backSlashIndex", "open", "close", "n", "relaxedCheck", "options", "check", "require_package", "__commonJSMin", "exports", "module", "isGlob", "pathPosixDirname", "isWin32", "slash", "backslash", "enclosure", "globby", "escaped", "str", "opts", "options", "require_utils", "__commonJSMin", "exports", "num", "node", "type", "min", "max", "step", "limit", "block", "n", "nodes", "acc", "args", "result", "flat", "arr", "i", "ele", "require_stringify", "__commonJSMin", "exports", "module", "utils", "ast", "options", "stringify", "node", "parent", "invalidBlock", "invalidNode", "output", "child", "require_package", "__commonJSMin", "exports", "module", "num", "require_package", "__commonJSMin", "exports", "module", "isNumber", "toRegexRange", "min", "max", "options", "opts", "relax", "shorthand", "capture", "wrap", "cacheKey", "a", "b", "result", "isPadded", "hasPadding", "state", "positives", "negatives", "newMin", "splitToPatterns", "collatePatterns", "neg", "pos", "onlyNegative", "filterPatterns", "onlyPositive", "intersected", "splitToRanges", "nines", "zeros", "stop", "countNines", "stops", "countZeros", "compare", "rangeToPattern", "start", "zipped", "zip", "digits", "pattern", "count", "i", "startDigit", "stopDigit", "toCharacterClass", "tok", "ranges", "tokens", "prev", "obj", "toQuantifier", "padZeros", "arr", "comparison", "prefix", "intersection", "ele", "string", "contains", "key", "val", "len", "integer", "str", "value", "diff", "require_package", "__commonJSMin", "exports", "module", "util", "toRegexRange", "isObject", "val", "transform", "toNumber", "value", "isValidValue", "isNumber", "num", "zeros", "input", "index", "stringify", "start", "end", "options", "pad", "maxLength", "dash", "toMaxLen", "negative", "toSequence", "parts", "maxLen", "b", "prefix", "positives", "negatives", "result", "v", "toRange", "a", "isNumbers", "stop", "toRegex", "wrap", "rangeError", "args", "invalidRange", "invalidStep", "step", "fillNumbers", "descending", "startString", "endString", "stepString", "padded", "format", "push", "range", "fillLetters", "min", "max", "fill", "opts", "require_compile", "__commonJSMin", "exports", "module", "fill", "utils", "compile", "ast", "options", "walk", "node", "parent", "invalidBlock", "invalidNode", "invalid", "prefix", "output", "args", "range", "child", "require_expand", "__commonJSMin", "exports", "module", "fill", "stringify", "utils", "append", "queue", "stash", "enclose", "result", "ele", "item", "value", "expand", "ast", "options", "rangeLimit", "walk", "node", "parent", "p", "q", "args", "range", "block", "i", "child", "require_constants", "__commonJSMin", "exports", "module", "require_parse", "__commonJSMin", "exports", "module", "stringify", "MAX_LENGTH", "CHAR_BACKSLASH", "CHAR_BACKTICK", "CHAR_COMMA", "CHAR_DOT", "CHAR_LEFT_PARENTHESES", "CHAR_RIGHT_PARENTHESES", "CHAR_LEFT_CURLY_BRACE", "CHAR_RIGHT_CURLY_BRACE", "CHAR_LEFT_SQUARE_BRACKET", "CHAR_RIGHT_SQUARE_BRACKET", "CHAR_DOUBLE_QUOTE", "CHAR_SINGLE_QUOTE", "CHAR_NO_BREAK_SPACE", "CHAR_ZERO_WIDTH_NOBREAK_SPACE", "parse", "input", "options", "opts", "max", "ast", "stack", "block", "prev", "brackets", "length", "index", "depth", "value", "advance", "push", "node", "next", "open", "brace", "type", "siblings", "before", "parent", "require_package", "__commonJSMin", "exports", "module", "stringify", "compile", "expand", "parse", "braces", "input", "options", "output", "pattern", "result", "require_constants", "__commonJSMin", "exports", "module", "path", "WIN_SLASH", "WIN_NO_SLASH", "DEFAULT_MAX_EXTGLOB_RECURSION", "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", "require_utils", "__commonJSMin", "exports", "path", "win32", "REGEX_BACKSLASH", "REGEX_REMOVE_BACKSLASH", "REGEX_SPECIAL_CHARS", "REGEX_SPECIAL_CHARS_GLOBAL", "val", "str", "match", "segs", "options", "input", "char", "lastIdx", "idx", "state", "output", "prepend", "append", "require_scan", "__commonJSMin", "exports", "module", "utils", "CHAR_ASTERISK", "CHAR_AT", "CHAR_BACKWARD_SLASH", "CHAR_COMMA", "CHAR_DOT", "CHAR_EXCLAMATION_MARK", "CHAR_FORWARD_SLASH", "CHAR_LEFT_CURLY_BRACE", "CHAR_LEFT_PARENTHESES", "CHAR_LEFT_SQUARE_BRACKET", "CHAR_PLUS", "CHAR_QUESTION_MARK", "CHAR_RIGHT_CURLY_BRACE", "CHAR_RIGHT_PARENTHESES", "CHAR_RIGHT_SQUARE_BRACKET", "isPathSeparator", "code", "depth", "token", "scan", "input", "options", "opts", "length", "scanToEnd", "slashes", "tokens", "parts", "str", "index", "start", "lastIndex", "isBrace", "isBracket", "isGlob", "isExtglob", "isGlobstar", "braceEscaped", "backslashes", "negated", "negatedExtglob", "finished", "braces", "prev", "eos", "peek", "advance", "next", "base", "prefix", "glob", "state", "prevIndex", "idx", "n", "i", "value", "require_parse", "__commonJSMin", "exports", "module", "constants", "utils", "MAX_LENGTH", "POSIX_REGEX_SOURCE", "REGEX_NON_SPECIAL_CHARS", "REGEX_SPECIAL_CHARS_BACKREF", "REPLACEMENTS", "expandRange", "args", "options", "value", "v", "syntaxError", "type", "char", "splitTopLevel", "input", "parts", "bracket", "paren", "quote", "escaped", "ch", "isPlainBranch", "branch", "normalizeSimpleBranch", "changed", "hasRepeatedCharPrefixOverlap", "branches", "values", "i", "j", "a", "b", "parseRepeatedExtglob", "pattern", "requireEnd", "getStarExtglobSequenceOutput", "index", "chars", "match", "repeatedExtglobRecursion", "depth", "analyzeRepeatedExtglob", "body", "max", "safeOutput", "parse", "opts", "len", "bos", "tokens", "capture", "win32", "PLATFORM_CHARS", "EXTGLOB_CHARS", "DOT_LITERAL", "PLUS_LITERAL", "SLASH_LITERAL", "ONE_CHAR", "DOTS_SLASH", "NO_DOT", "NO_DOT_SLASH", "NO_DOTS_SLASH", "QMARK", "QMARK_NO_DOT", "STAR", "START_ANCHOR", "globstar", "nodot", "qmarkNoDot", "star", "state", "extglobs", "braces", "stack", "prev", "eos", "peek", "n", "advance", "remaining", "consume", "num", "append", "token", "negate", "count", "increment", "decrement", "push", "tok", "isBrace", "isExtglob", "extglobOpen", "output", "extglobClose", "literal", "analysis", "open", "rest", "extglobStar", "expression", "backslashes", "m", "esc", "first", "next", "slashes", "inner", "idx", "pre", "posix", "extglob", "prevValue", "brace", "arr", "range", "out", "toks", "t", "prior", "before", "isStart", "afterStar", "after", "end", "NO_DOTS", "slashDot", "create", "str", "source", "require_picomatch", "__commonJSMin", "exports", "module", "path", "scan", "parse", "utils", "constants", "isObject", "val", "picomatch", "glob", "options", "returnState", "fns", "input", "str", "isMatch", "state", "isState", "opts", "posix", "regex", "isIgnored", "ignoreOpts", "matcher", "returnObject", "match", "output", "result", "format", "patterns", "pattern", "p", "returnOutput", "prepend", "append", "source", "parsed", "err", "require_package", "__commonJSMin", "exports", "module", "require_package", "__commonJSMin", "exports", "module", "util", "braces", "picomatch", "utils", "isEmptyString", "v", "hasBraces", "index", "micromatch", "list", "patterns", "options", "omit", "keep", "items", "negatives", "onResult", "state", "i", "isMatch", "negated", "item", "matched", "matches", "p", "pattern", "str", "result", "obj", "keys", "res", "key", "glob", "input", "posix", "match", "args", "require_pattern", "__commonJSMin", "exports", "path", "globParent", "micromatch", "GLOBSTAR", "ESCAPE_SYMBOL", "COMMON_GLOB_SYMBOLS_RE", "REGEX_CHARACTER_CLASS_SYMBOLS_RE", "REGEX_GROUP_SYMBOLS_RE", "GLOB_EXTENSION_SYMBOLS_RE", "BRACE_EXPANSION_SEPARATORS_RE", "DOUBLE_SLASH_RE", "isStaticPattern", "pattern", "options", "isDynamicPattern", "hasBraceExpansion", "openingBraceIndex", "closingBraceIndex", "braceContent", "convertToPositivePattern", "isNegativePattern", "convertToNegativePattern", "isPositivePattern", "getNegativePatterns", "patterns", "getPositivePatterns", "getPatternsInsideCurrentDirectory", "isPatternRelatedToParentDirectory", "getPatternsOutsideCurrentDirectory", "getBaseDirectory", "hasGlobStar", "endsWithSlashGlobStar", "isAffectDepthOfReadingPattern", "basename", "expandPatternsWithBraceExpansion", "collection", "expandBraceExpansion", "a", "b", "getPatternParts", "parts", "makeRe", "convertPatternsToRe", "matchAny", "entry", "patternsRe", "patternRe", "removeDuplicateSlashes", "partitionAbsoluteAndRelative", "absolute", "relative", "isAbsolute", "require_package", "__commonJSMin", "exports", "module", "Stream", "PassThrough", "slice", "merge2", "streamsQueue", "args", "merging", "options", "doEnd", "doPipeError", "mergedStream", "addStream", "i", "len", "pauseStreams", "mergeStream", "streams", "endStream", "pipesCount", "next", "pipe", "stream", "onend", "onerror", "err", "require_stream", "__commonJSMin", "exports", "merge2", "merge", "streams", "mergedStream", "stream", "error", "propagateCloseEventToSources", "require_string", "__commonJSMin", "exports", "isString", "input", "isEmpty", "require_utils", "__commonJSMin", "exports", "array", "errno", "fs", "path", "pattern", "stream", "string", "require_tasks", "__commonJSMin", "exports", "utils", "generate", "input", "settings", "patterns", "processPatterns", "ignore", "positivePatterns", "getPositivePatterns", "negativePatterns", "getNegativePatternsAsPositive", "staticPatterns", "pattern", "dynamicPatterns", "staticTasks", "convertPatternsToTasks", "dynamicTasks", "positive", "negative", "dynamic", "tasks", "patternsOutsideCurrentDirectory", "patternsInsideCurrentDirectory", "outsideCurrentDirectoryGroup", "groupPatternsByBaseDirectory", "insideCurrentDirectoryGroup", "convertPatternGroupsToTasks", "convertPatternGroupToTask", "group", "collection", "base", "require_async", "__commonJSMin", "exports", "read", "path", "settings", "callback", "lstatError", "lstat", "callFailureCallback", "callSuccessCallback", "statError", "stat", "error", "result", "require_sync", "__commonJSMin", "exports", "read", "path", "settings", "lstat", "stat", "error", "require_fs", "__commonJSMin", "exports", "fs", "createFileSystemAdapter", "fsMethods", "require_settings", "__commonJSMin", "exports", "fs", "Settings", "_options", "option", "value", "require_out", "__commonJSMin", "exports", "async", "sync", "settings_1", "stat", "path", "optionsOrSettingsOrCallback", "callback", "getSettings", "statSync", "optionsOrSettings", "settings", "settingsOrOptions", "require_package", "__commonJSMin", "exports", "module", "promise", "cb", "err", "require_package", "__commonJSMin", "exports", "module", "runParallel", "queueMicrotask", "tasks", "cb", "results", "pending", "keys", "isSync", "done", "err", "end", "each", "i", "result", "key", "task", "require_constants", "__commonJSMin", "exports", "NODE_PROCESS_VERSION_PARTS", "MAJOR_VERSION", "MINOR_VERSION", "SUPPORTED_MAJOR_VERSION", "SUPPORTED_MINOR_VERSION", "IS_MATCHED_BY_MAJOR", "IS_MATCHED_BY_MAJOR_AND_MINOR", "require_fs", "__commonJSMin", "exports", "DirentFromStats", "name", "stats", "createDirentFromStats", "require_utils", "__commonJSMin", "exports", "fs", "require_common", "__commonJSMin", "exports", "joinPathSegments", "a", "b", "separator", "require_async", "__commonJSMin", "exports", "fsStat", "rpl", "constants_1", "utils", "common", "read", "directory", "settings", "callback", "readdirWithFileTypes", "readdir", "readdirError", "dirents", "callFailureCallback", "entries", "dirent", "callSuccessCallback", "tasks", "entry", "makeRplTaskEntry", "rplError", "rplEntries", "done", "statError", "stats", "names", "name", "path", "error", "result", "require_sync", "__commonJSMin", "exports", "fsStat", "constants_1", "utils", "common", "read", "directory", "settings", "readdirWithFileTypes", "readdir", "dirent", "entry", "stats", "error", "name", "entryPath", "require_fs", "__commonJSMin", "exports", "fs", "createFileSystemAdapter", "fsMethods", "require_settings", "__commonJSMin", "exports", "path", "fsStat", "fs", "Settings", "_options", "option", "value", "require_out", "__commonJSMin", "exports", "async", "sync", "settings_1", "scandir", "path", "optionsOrSettingsOrCallback", "callback", "getSettings", "scandirSync", "optionsOrSettings", "settings", "settingsOrOptions", "require_reusify", "__commonJSMin", "exports", "module", "reusify", "Constructor", "head", "tail", "get", "current", "release", "obj", "require_queue", "__commonJSMin", "exports", "module", "reusify", "fastqueue", "context", "worker", "_concurrency", "cache", "Task", "queueHead", "queueTail", "_running", "errorHandler", "self", "push", "noop", "pause", "value", "release", "running", "resume", "idle", "length", "getQueue", "unshift", "kill", "killAndDrain", "error", "abort", "current", "counter", "tasks", "done", "holder", "next", "callback", "val", "handler", "err", "result", "queueAsPromised", "asyncWrapper", "arg", "cb", "res", "queue", "pushCb", "unshiftCb", "drained", "resolve", "reject", "p", "previousDrain", "require_common", "__commonJSMin", "exports", "isFatalError", "settings", "error", "isAppliedFilter", "filter", "value", "replacePathSegmentSeparator", "filepath", "separator", "joinPathSegments", "a", "b", "require_reader", "__commonJSMin", "exports", "common", "Reader", "_root", "_settings", "require_async", "__commonJSMin", "exports", "events_1", "fsScandir", "fastq", "common", "reader_1", "AsyncReader", "_root", "_settings", "callback", "directory", "base", "queueItem", "error", "item", "done", "entries", "entry", "fullpath", "require_async", "__commonJSMin", "exports", "async_1", "AsyncProvider", "_root", "_settings", "callback", "error", "callFailureCallback", "entry", "callSuccessCallback", "entries", "require_stream", "__commonJSMin", "exports", "stream_1", "async_1", "StreamProvider", "_root", "_settings", "error", "entry", "require_sync", "__commonJSMin", "exports", "fsScandir", "common", "reader_1", "SyncReader", "directory", "base", "item", "entries", "entry", "error", "fullpath", "require_sync", "__commonJSMin", "exports", "sync_1", "SyncProvider", "_root", "_settings", "require_settings", "__commonJSMin", "exports", "path", "fsScandir", "Settings", "_options", "option", "value", "require_out", "__commonJSMin", "exports", "async_1", "stream_1", "sync_1", "settings_1", "walk", "directory", "optionsOrSettingsOrCallback", "callback", "getSettings", "walkSync", "optionsOrSettings", "settings", "walkStream", "settingsOrOptions", "require_reader", "__commonJSMin", "exports", "path", "fsStat", "utils", "Reader", "_settings", "filepath", "stats", "pattern", "entry", "error", "require_stream", "__commonJSMin", "exports", "stream_1", "fsStat", "fsWalk", "reader_1", "ReaderStream", "root", "options", "patterns", "filepaths", "stream", "index", "_enc", "done", "entry", "filepath", "pattern", "stats", "error", "resolve", "reject", "require_async", "__commonJSMin", "exports", "fsWalk", "reader_1", "stream_1", "ReaderAsync", "root", "options", "resolve", "reject", "error", "entries", "patterns", "stream", "entry", "require_matcher", "__commonJSMin", "exports", "utils", "Matcher", "_patterns", "_settings", "_micromatchOptions", "pattern", "segments", "sections", "part", "segment", "require_partial", "__commonJSMin", "exports", "matcher_1", "PartialMatcher", "filepath", "parts", "levels", "patterns", "info", "pattern", "section", "part", "index", "segment", "require_deep", "__commonJSMin", "exports", "utils", "partial_1", "DeepFilter", "_settings", "_micromatchOptions", "basePath", "positive", "negative", "matcher", "negativeRe", "entry", "patterns", "affectDepthOfReadingPatterns", "filepath", "entryPath", "entryPathDepth", "basePathDepth", "patternsRe", "require_entry", "__commonJSMin", "exports", "utils", "EntryFilter", "_settings", "_micromatchOptions", "positive", "negative", "absoluteNegative", "relativeNegative", "patterns", "entry", "filepath", "isMatched", "isDirectory", "patternsRe", "fullpath", "require_error", "__commonJSMin", "exports", "utils", "ErrorFilter", "_settings", "error", "require_entry", "__commonJSMin", "exports", "utils", "EntryTransformer", "_settings", "entry", "filepath", "require_provider", "__commonJSMin", "exports", "path", "deep_1", "entry_1", "error_1", "entry_2", "Provider", "_settings", "task", "basePath", "require_async", "__commonJSMin", "exports", "async_1", "provider_1", "ProviderAsync", "task", "root", "options", "entry", "require_stream", "__commonJSMin", "exports", "stream_1", "stream_2", "provider_1", "ProviderStream", "task", "root", "options", "source", "destination", "error", "entry", "require_sync", "__commonJSMin", "exports", "fsStat", "fsWalk", "reader_1", "ReaderSync", "root", "options", "patterns", "entries", "pattern", "filepath", "entry", "stats", "error", "require_sync", "__commonJSMin", "exports", "sync_1", "provider_1", "ProviderSync", "task", "root", "options", "require_settings", "__commonJSMin", "exports", "fs", "os", "CPU_COUNT", "Settings", "_options", "option", "value", "methods", "require_out", "__commonJSMin", "exports", "module", "taskManager", "async_1", "stream_1", "sync_1", "settings_1", "utils", "FastGlob", "source", "options", "assertPatternsInput", "works", "getWorks", "result", "sync", "stream", "generateTasks", "patterns", "settings", "isDynamicPattern", "escapePath", "convertPathToPattern", "posix", "win32", "_Provider", "tasks", "provider", "input", "item", "init_default", "__esmMin", "promisify", "execFileCallback", "execFileSyncOriginal", "fileURLToPath", "toPath", "urlOrPath", "execFileOriginal", "TEN_MEGABYTES_IN_BYTES", "init_node", "__esmMin", "init_default", "require_package", "__commonJSMin", "exports", "module", "makeArray", "subject", "UNDEFINED", "EMPTY", "SPACE", "ESCAPE", "REGEX_TEST_BLANK_LINE", "REGEX_INVALID_TRAILING_BACKSLASH", "REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION", "REGEX_REPLACE_LEADING_EXCAPED_HASH", "REGEX_SPLITALL_CRLF", "REGEX_TEST_INVALID_PATH", "REGEX_TEST_TRAILING_SLASH", "SLASH", "TMP_KEY_IGNORE", "KEY_IGNORE", "define", "object", "key", "value", "REGEX_REGEXP_RANGE", "RETURN_FALSE", "sanitizeRange", "range", "match", "from", "to", "cleanRangeBackSlash", "slashes", "length", "REPLACERS", "_", "m1", "m2", "index", "str", "p1", "p2", "unescaped", "leadEscape", "endEscape", "close", "REGEX_REPLACE_TRAILING_WILDCARD", "MODE_IGNORE", "MODE_CHECK_IGNORE", "UNDERSCORE", "TRAILING_WILD_CARD_REPLACERS", "makeRegexPrefix", "pattern", "prev", "matcher", "replacer", "isString", "checkPattern", "splitPattern", "IgnoreRule", "mark", "body", "ignoreCase", "negative", "prefix", "mode", "regex", "createRule", "regexPrefix", "RuleManager", "rule", "path", "checkUnignored", "ignored", "unignored", "matchedRule", "ret", "throwError", "message", "Ctor", "checkPath", "originalPath", "doThrow", "isNotRelative", "p", "Ignore", "ignorecase", "allowRelativePaths", "cache", "slices", "parent", "paths", "factory", "options", "isPathValid", "setupWindows", "makePosix", "REGEX_TEST_WINDOWS_PATH_ABSOLUTE", "path", "isPathInside", "childPath", "parentPath", "relation", "init_package", "__esmMin", "slash", "path", "init_package", "__esmMin", "fs", "path", "promisify", "import_fast_glob", "isNegativePattern", "normalizeAbsolutePatternToRelative", "absolutePrefixesMatch", "getStaticAbsolutePathPrefix", "normalizeNegativePattern", "bindFsMethod", "promisifyFsMethod", "normalizeDirectoryPatternForFastGlob", "getParentDirectoryPrefix", "adjustIgnorePatternsForParentDirectories", "getAsyncStatMethod", "getStatSyncMethod", "pathHasGitDirectory", "buildPathChain", "findGitRootInChain", "findGitRootSyncUncached", "findGitRootSync", "findGitRootAsyncUncached", "findGitRoot", "isWithinGitRoot", "getParentGitignorePaths", "convertPatternsForFastGlob", "init_utilities", "__esmMin", "init_package", "pattern", "inner", "firstSlashIndex", "firstSegment", "fastGlob", "positivePrefix", "negativePrefix", "staticSegments", "segment", "positiveAbsolutePathPrefixes", "hasRelativePositivePattern", "normalizedPattern", "negativeAbsolutePathPrefix", "positiveAbsolutePathPrefix", "object", "methodName", "method", "trimmedPattern", "hasLeadingSlash", "hasInnerSlash", "match", "patterns", "ignorePatterns", "parentPrefixes", "firstPrefix", "prefix", "fsImplementation", "stats", "startPath", "rootPath", "chain", "currentPath", "parentPath", "paths", "statMethod", "directory", "gitPath", "cwd", "statSyncMethod", "root", "gitRoot", "resolvedGitRoot", "resolvedCwd", "isPathInside", "usingGitRoot", "result", "hasNegations", "process", "fs", "fsPromises", "path", "import_fast_glob", "import_ignore", "defaultIgnoredDirectories", "ignoreFilesGlobOptions", "GITIGNORE_FILES_PATTERN", "getReadFileMethod", "getReadFileSyncMethod", "shouldSkipIgnoreFileError", "createIgnoreFileReadError", "processIgnoreFileCore", "readIgnoreFilesSafely", "readIgnoreFilesSafelySync", "dedupePaths", "globIgnoreFiles", "getParentIgnorePaths", "combineIgnoreFilePaths", "buildIgnoreResult", "applyBaseToPattern", "parseIgnoreFile", "toRelativePath", "createIgnorePredicate", "normalizeOptions", "collectIgnoreFileArtifactsAsync", "collectIgnoreFileArtifactsSync", "isIgnoredByIgnoreFiles", "isIgnoredByIgnoreFilesSync", "getPatternsFromIgnoreFiles", "getIgnorePatternsAndPredicate", "getIgnorePatternsAndPredicateSync", "isGitIgnored", "isGitIgnoredSync", "init_ignore", "__esmMin", "init_package", "init_node", "init_utilities", "fsImplementation", "bindFsMethod", "promisifyFsMethod", "error", "suppressErrors", "filePath", "readMethod", "content", "paths", "readFileMethod", "readFileSyncMethod", "seen", "globFunction", "patterns", "normalizedOptions", "gitRoot", "getParentGitignorePaths", "childPaths", "files", "baseDir", "pattern", "base", "isNegative", "isNegativePattern", "cleanPattern", "slashIndex", "hasNonTrailingSlash", "result", "file", "cwd", "slash", "line", "fileOrDirectory", "relativePath", "isPathInside", "ignores", "gitIgnore", "resolvedCwd", "resolvedBaseDir", "toPath", "options", "ignoreOption", "deep", "includeParentIgnoreFiles", "fastGlob", "findGitRoot", "allPaths", "findGitRootSync", "package_exports", "__export", "convertPathToPattern", "generateGlobTasks", "generateGlobTasksSync", "globby", "globbyStream", "globbySync", "isDynamicPattern", "isGitIgnored", "isGitIgnoredSync", "isIgnoredByIgnoreFiles", "isIgnoredByIgnoreFilesSync", "process", "fs", "nodePath", "Readable", "import_fast_glob", "assertPatternsInput", "getStatMethod", "getStatSyncMethod", "isDirectory", "isDirectorySync", "normalizePathForDirectoryGlob", "shouldExpandGlobstarDirectory", "getDirectoryGlob", "directoryToGlob", "directoryToGlobSync", "toPatternsArray", "checkCwdOption", "normalizeOptions", "normalizeArguments", "normalizeArgumentsSync", "getIgnoreFilesPatterns", "applyIgnoreFilesAndGetFilter", "applyIgnoreFilesAndGetFilterSync", "createFilterFunction", "unionFastGlobResults", "convertNegativePatterns", "applyParentDirectoryIgnoreAdjustments", "normalizeExpandDirectoriesOption", "generateTasks", "generateTasksSync", "init_package", "__esmMin", "init_node", "init_ignore", "init_utilities", "patterns", "pattern", "fsImplementation", "bindFsMethod", "promisifyFsMethod", "path", "filePath", "cwd", "isNegativePattern", "match", "dirname", "hasWildcards", "hasExtension", "directoryPath", "files", "extensions", "extensionGlob", "file", "directoryPaths", "checkPattern", "pathToCheck", "stats", "options", "ignore", "toPath", "function_", "ignoreFiles", "gitignore", "GITIGNORE_FILES_PATTERN", "ignoreFilesPatterns", "includeParentIgnoreFiles", "predicate", "usingGitRoot", "getIgnorePatternsAndPredicate", "patternsForFastGlob", "convertPatternsForFastGlob", "normalizeDirectoryPatternForFastGlob", "getIgnorePatternsAndPredicateSync", "isIgnored", "seen", "basePath", "pathCache", "fastGlobResult", "pathKey", "absolutePath", "results", "filter", "positiveAbsolutePathPrefixes", "hasRelativePositivePattern", "normalizedPatterns", "normalizeNegativePattern", "staticAbsolutePathPrefix", "getStaticAbsolutePathPrefix", "tasks", "index", "ignorePattern", "task", "adjustIgnorePatternsForParentDirectories", "globTasks", "expandDirectories", "directoryToGlobOptions", "directoryToGlobSyncOptions", "modifiedOptions", "fastGlob", "streams", "mergeStreams", "Services", "Workbenches", "PackageTargets", "wrapAnsi16", "offset", "code", "wrapAnsi256", "wrapAnsi16m", "red", "green", "blue", "styles", "modifierNames", "foregroundColorNames", "backgroundColorNames", "colorNames", "assembleStyles", "codes", "groupName", "group", "styleName", "style", "hex", "matches", "colorString", "character", "integer", "remainder", "value", "result", "ansiStyles", "ansi_styles_default", "process", "os", "tty", "hasFlag", "flag", "argv", "prefix", "position", "terminatorPosition", "env", "flagForceColor", "envForceColor", "translateLevel", "level", "_supportsColor", "haveStream", "streamIsTTY", "sniffFlags", "noFlagForceColor", "forceColor", "min", "osRelease", "key", "sign", "version", "createSupportsColor", "stream", "options", "supportsColor", "supports_color_default", "stringReplaceAll", "string", "substring", "replacer", "index", "substringLength", "endIndex", "returnValue", "stringEncaseCRLFWithFirstIndex", "prefix", "postfix", "gotCR", "stdoutColor", "stderrColor", "supports_color_default", "GENERATOR", "STYLER", "IS_EMPTY", "levelMapping", "styles", "applyOptions", "object", "options", "colorLevel", "chalkFactory", "options", "chalk", "strings", "applyOptions", "createChalk", "styleName", "style", "ansi_styles_default", "styles", "builder", "createBuilder", "createStyler", "STYLER", "IS_EMPTY", "getModelAnsi", "model", "level", "type", "arguments_", "usedModels", "styler", "levelMapping", "bgModel", "proto", "GENERATOR", "open", "close", "parent", "openAll", "closeAll", "self", "_styler", "_isEmpty", "applyStyle", "string", "stringReplaceAll", "lfIndex", "stringEncaseCRLFWithFirstIndex", "chalkStderr", "stderrColor", "source_default", "chalk", "import_index", "program", "createCommand", "createArgument", "createOption", "CommanderError", "InvalidArgumentError", "InvalidOptionArgumentError", "Command", "Argument", "Option", "Help", "commander", "_isPlaceholder", "a", "_curry1", "fn", "f1", "a", "_isPlaceholder", "_curry2", "fn", "f2", "a", "b", "_isPlaceholder", "_curry1", "_b", "_a", "_curry3", "fn", "f3", "a", "b", "c", "_isPlaceholder", "_curry2", "_b", "_c", "_a", "_curry1", "_has", "prop", "obj", "_isObject", "x", "mergeWithKey", "_curry3", "fn", "l", "r", "result", "k", "_has", "mergeWithKey_default", "mergeDeepWithKey", "_curry3", "fn", "lObj", "rObj", "mergeWithKey_default", "k", "lVal", "rVal", "_isObject", "mergeDeepWithKey_default", "mergeDeepRight", "_curry2", "lObj", "rObj", "mergeDeepWithKey_default", "k", "lVal", "rVal", "mergeDeepRight_default", "fs", "path", "isNothing", "subject", "isObject", "toArray", "sequence", "extend", "target", "source", "index", "length", "key", "sourceKeys", "repeat", "string", "count", "result", "cycle", "isNegativeZero", "number", "isNothing_1", "isObject_1", "toArray_1", "repeat_1", "isNegativeZero_1", "extend_1", "common", "formatError", "exception", "compact", "where", "message", "YAMLException$1", "reason", "mark", "getLine", "buffer", "lineStart", "lineEnd", "position", "maxLineLength", "head", "tail", "maxHalfLength", "padStart", "max", "makeSnippet", "options", "re", "lineStarts", "lineEnds", "match", "foundLineNo", "i", "line", "lineNoLength", "snippet", "TYPE_CONSTRUCTOR_OPTIONS", "YAML_NODE_KINDS", "compileStyleAliases", "map", "style", "alias", "Type$1", "tag", "name", "data", "type", "compileList", "schema", "currentType", "newIndex", "previousType", "previousIndex", "compileMap", "collectType", "Schema$1", "definition", "implicit", "explicit", "type$1", "str", "seq", "failsafe", "resolveYamlNull", "constructYamlNull", "isNull", "object", "_null", "resolveYamlBoolean", "constructYamlBoolean", "isBoolean", "bool", "isHexCode", "c", "isOctCode", "isDecCode", "resolveYamlInteger", "hasDigits", "ch", "constructYamlInteger", "value", "sign", "isInteger", "int", "obj", "YAML_FLOAT_PATTERN", "resolveYamlFloat", "constructYamlFloat", "SCIENTIFIC_WITHOUT_DOT", "representYamlFloat", "res", "isFloat", "float", "json", "core", "YAML_DATE_REGEXP", "YAML_TIMESTAMP_REGEXP", "resolveYamlTimestamp", "constructYamlTimestamp", "year", "month", "day", "hour", "minute", "second", "fraction", "delta", "tz_hour", "tz_minute", "date", "representYamlTimestamp", "timestamp", "resolveYamlMerge", "merge", "BASE64_MAP", "resolveYamlBinary", "code", "idx", "bitlen", "constructYamlBinary", "tailbits", "input", "bits", "representYamlBinary", "isBinary", "binary", "_hasOwnProperty$3", "_toString$2", "resolveYamlOmap", "objectKeys", "pair", "pairKey", "pairHasKey", "constructYamlOmap", "omap", "_toString$1", "resolveYamlPairs", "keys", "constructYamlPairs", "pairs", "_hasOwnProperty$2", "resolveYamlSet", "constructYamlSet", "set", "_default", "_hasOwnProperty$1", "CONTEXT_FLOW_IN", "CONTEXT_FLOW_OUT", "CONTEXT_BLOCK_IN", "CONTEXT_BLOCK_OUT", "CHOMPING_CLIP", "CHOMPING_STRIP", "CHOMPING_KEEP", "PATTERN_NON_PRINTABLE", "PATTERN_NON_ASCII_LINE_BREAKS", "PATTERN_FLOW_INDICATORS", "PATTERN_TAG_HANDLE", "PATTERN_TAG_URI", "_class", "is_EOL", "is_WHITE_SPACE", "is_WS_OR_EOL", "is_FLOW_INDICATOR", "fromHexCode", "lc", "escapedHexLen", "fromDecimalCode", "simpleEscapeSequence", "charFromCodepoint", "setProperty", "simpleEscapeCheck", "simpleEscapeMap", "State$1", "generateError", "state", "throwError", "throwWarning", "directiveHandlers", "args", "major", "minor", "handle", "prefix", "captureSegment", "start", "end", "checkJson", "_position", "_length", "_character", "_result", "mergeMappings", "destination", "overridableKeys", "quantity", "storeMappingPair", "keyTag", "keyNode", "valueNode", "startLine", "startLineStart", "startPos", "readLineBreak", "skipSeparationSpace", "allowComments", "checkIndent", "lineBreaks", "testDocumentSeparator", "writeFoldedLines", "readPlainScalar", "nodeIndent", "withinFlowCollection", "preceding", "following", "captureStart", "captureEnd", "hasPendingContent", "_line", "_lineStart", "_lineIndent", "_kind", "readSingleQuotedScalar", "readDoubleQuotedScalar", "hexLength", "hexResult", "tmp", "readFlowCollection", "readNext", "_pos", "_tag", "_anchor", "terminator", "isPair", "isExplicitPair", "isMapping", "composeNode", "readBlockScalar", "folding", "chomping", "didReadContent", "detectedIndent", "textIndent", "emptyLines", "atMoreIndented", "readBlockSequence", "detected", "readBlockMapping", "flowIndent", "allowCompact", "_keyLine", "_keyLineStart", "_keyPos", "atExplicitKey", "readTagProperty", "isVerbatim", "isNamed", "tagHandle", "tagName", "readAnchorProperty", "readAlias", "parentIndent", "nodeContext", "allowToSeek", "allowBlockStyles", "allowBlockScalars", "allowBlockCollections", "indentStatus", "atNewLine", "hasContent", "typeIndex", "typeQuantity", "typeList", "blockIndent", "readDocument", "documentStart", "directiveName", "directiveArgs", "hasDirectives", "loadDocuments", "nullpos", "loadAll$1", "iterator", "documents", "load$1", "loadAll_1", "load_1", "loader", "_toString", "_hasOwnProperty", "CHAR_BOM", "CHAR_TAB", "CHAR_LINE_FEED", "CHAR_CARRIAGE_RETURN", "CHAR_SPACE", "CHAR_EXCLAMATION", "CHAR_DOUBLE_QUOTE", "CHAR_SHARP", "CHAR_PERCENT", "CHAR_AMPERSAND", "CHAR_SINGLE_QUOTE", "CHAR_ASTERISK", "CHAR_COMMA", "CHAR_MINUS", "CHAR_COLON", "CHAR_EQUALS", "CHAR_GREATER_THAN", "CHAR_QUESTION", "CHAR_COMMERCIAL_AT", "CHAR_LEFT_SQUARE_BRACKET", "CHAR_RIGHT_SQUARE_BRACKET", "CHAR_GRAVE_ACCENT", "CHAR_LEFT_CURLY_BRACKET", "CHAR_VERTICAL_LINE", "CHAR_RIGHT_CURLY_BRACKET", "ESCAPE_SEQUENCES", "DEPRECATED_BOOLEANS_SYNTAX", "DEPRECATED_BASE60_SYNTAX", "compileStyleMap", "encodeHex", "character", "QUOTING_TYPE_SINGLE", "QUOTING_TYPE_DOUBLE", "State", "indentString", "spaces", "ind", "next", "generateNextLine", "level", "testImplicitResolving", "isWhitespace", "isPrintable", "isNsCharOrWhitespace", "isPlainSafe", "prev", "inblock", "cIsNsCharOrWhitespace", "cIsNsChar", "isPlainSafeFirst", "isPlainSafeLast", "codePointAt", "pos", "first", "needIndentIndicator", "leadingSpaceRe", "STYLE_PLAIN", "STYLE_SINGLE", "STYLE_LITERAL", "STYLE_FOLDED", "STYLE_DOUBLE", "chooseScalarStyle", "singleLineOnly", "indentPerLevel", "lineWidth", "testAmbiguousType", "quotingType", "forceQuotes", "char", "prevChar", "hasLineBreak", "hasFoldableLine", "shouldTrackWidth", "previousLineBreak", "plain", "writeScalar", "iskey", "indent", "testAmbiguity", "blockHeader", "dropEndingNewline", "foldString", "escapeString", "indentIndicator", "clip", "keep", "chomp", "width", "lineRe", "nextLF", "foldLine", "prevMoreIndented", "moreIndented", "breakRe", "curr", "escapeSeq", "writeFlowSequence", "writeNode", "writeBlockSequence", "writeFlowMapping", "objectKeyList", "objectKey", "objectValue", "pairBuffer", "writeBlockMapping", "explicitPair", "detectType", "block", "isblockseq", "tagStr", "objectOrArray", "duplicateIndex", "duplicate", "getDuplicateReferences", "objects", "duplicatesIndexes", "inspectNode", "dump$1", "dump_1", "dumper", "renamed", "from", "to", "Type", "Schema", "FAILSAFE_SCHEMA", "JSON_SCHEMA", "CORE_SCHEMA", "DEFAULT_SCHEMA", "load", "loadAll", "dump", "YAMLException", "types", "safeLoad", "safeLoadAll", "safeDump", "jsYaml", "fs", "path", "extname", "resolve", "join", "import_dotenv", "chokidar", "pathToFileURL", "fs", "path", "Logger", "level", "verbose", "levels", "type", "source_default", "text", "message", "styleFunction", "icon", "prefix", "error", "logger", "findExtension", "base", "exts", "ext", "path", "fs", "ensureRacletteDir", "raclettePath", "findCorePackagePath", "coreModule", "pkgPath", "p", "msg", "logger", "findFiles", "directory", "patterns", "globby", "copyFileIfExists", "sourcePath", "targetPath", "fs", "path", "objectToString", "isArray", "object", "isFunction", "typeStr", "obj", "escapeRegExp", "string", "hasProperty", "propName", "primitiveHasOwnProperty", "primitive", "regExpTest", "testRegExp", "re", "nonSpaceRe", "isWhitespace", "entityMap", "escapeHtml", "s", "whiteRe", "spaceRe", "equalsRe", "curlyRe", "tagRe", "parseTemplate", "template", "tags", "lineHasNonSpace", "sections", "tokens", "spaces", "hasTag", "nonSpace", "indentation", "tagIndex", "stripSpace", "openingTagRe", "closingTagRe", "closingCurlyRe", "compileTags", "tagsToCompile", "mustache", "scanner", "Scanner", "start", "type", "value", "chr", "token", "openSection", "i", "valueLength", "nestTokens", "squashTokens", "squashedTokens", "lastToken", "numTokens", "nestedTokens", "collector", "section", "match", "index", "Context", "view", "parentContext", "name", "cache", "context", "intermediateValue", "names", "lookupHit", "Writer", "key", "cacheKey", "isCacheEnabled", "partials", "config", "originalTemplate", "buffer", "symbol", "self", "subRender", "j", "partial", "filteredIndentation", "partialByNl", "indentedValue", "escape", "defaultWriter", "mustache_default", "fileURLToPath", "BuildError", "message", "error", "formatters", "ee", "e", "applyTemplate", "templateFileName", "environment", "destinationDirectory", "src", "template", "res", "mustache_default", "fs", "path", "pkg", "core", "name", "configExtensions", "env", "parseEnvironmentValues", "obj", "num", "item", "parsed", "key", "value", "dotenv", "join", "dflt", "path", "pkg", "load", "src", "envenv", "resolve", "cfg", "extname", "base", "ext", "fs", "jsYaml", "pathToFileURL", "err", "mergeDeepRight_default", "parse", "merge", "cfgs", "c", "generateServiceConfigs", "config", "racletteDir", "logger", "globalConfig", "service", "Services", "dir", "CFG", "watchConfigFile", "appDir", "configPath", "findExtension", "watcher", "chokidar", "changedPath", "error", "spawn", "fs", "pathExists", "path", "fs", "path", "execSync", "fs", "cachedDockerInfo", "getDockerInfo", "dockerPath", "findDockerPath", "version", "getDockerVersion", "composeCommand", "isModernCompose", "isDocker28Plus", "checkIsDocker28Plus", "findDockerPath", "dockerPath", "execSync", "commonPaths", "commonPath", "fs", "logger", "source_default", "getDockerVersion", "checkIsDocker28Plus", "version", "versionMatch", "majorVersion", "minorVersion", "checkDockerInstallation", "dockerInfo", "getDockerInfo", "error", "executeDockerCommand", "args", "options", "command", "result", "executeDockerComposeCommand", "containerExists", "containerName", "name", "isContainerRunning", "ensureDockerNetwork", "networkName", "networkError", "executeInContainer", "findContainersByPrefix", "prefix", "stopContainersByPrefix", "containerNames", "publicSharedVolume", "transformPath", "path", "resolveVolumePath", "volumePath", "workingDir", "transformPaths", "obj", "item", "result", "key", "value", "processVolumeDefinition", "volume", "transformedVolume", "fs", "logger", "processVolumeString", "volumeString", "parts", "source", "target", "options", "resolvedSource", "processAllVolumes", "volumes", "e", "generateDockerCompose", "config", "outputPath", "directMode", "environment", "checkExistingContainers", "skipSharedServices", "compose", "envVars", "volumeName", "volumeConfig", "skipMongoDB", "skipCache", "mongoContainerName", "containerExists", "cacheContainerName", "mongoVolumeName", "mongoConfigVolumeName", "volumeDef", "processedVolume", "cacheVolumeName", "RDB_OPTIONS", "persistence", "debugPort", "backendContainerName", "backendNodeModulesVolume", "getServiceLockFilePath", "frontendContainerName", "frontendNodeModulesVolume", "frontendInternalPort", "corePath", "normalizedPath", "service", "jsYaml", "generateDockerfiles", "customPath", "generateFullDockerCompose", "outputDir", "backendDockerfilePath", "backendDockerfile", "frontendDockerfilePath", "frontendDockerfile", "path", "trackServiceFiles", "config", "racletteDir", "forceRebuild", "Services", "e", "rebuildChangedServices", "services", "options", "source_default", "dockerComposePath", "path", "buildArgs", "service", "executeDockerComposeCommand", "logger", "error", "fs", "path", "getCoreDependencies", "useRecommended", "getCoreRecommendedDependencies", "getCoreImports", "getCoreConfig", "baseConfig", "getStyleRecommendedConfig", "getReactDependencies", "useRecommended", "getReactRecommendedDependencies", "getReactImports", "getReactConfig", "baseConfig", "getReactRecommendedConfig", "getTypeScriptDependencies", "useRecommended", "getTypeScriptRecommendedDependencies", "getTypeScriptImports", "imports", "getTypeScriptConfig", "baseConfig", "getTypeScriptRecommendedConfig", "getVueDependencies", "useRecommended", "getVueRecommendedDependencies", "getVueImports", "getVueConfig", "baseConfig", "getVueRecommendedConfig", "getAllDependencies", "config", "useRecommended", "dependencies", "getCoreDependencies", "getTypeScriptDependencies", "getVueDependencies", "getReactDependencies", "getCoreRecommendedDependencies", "getTypeScriptRecommendedDependencies", "getVueRecommendedDependencies", "getReactRecommendedDependencies", "existsSync", "path", "generateInstallCommand", "dependencies", "sortedDeps", "hasYarn", "existsSync", "path", "hasPnpm", "hasBun", "packageManager", "installCmd", "generateEslintConfig", "config", "outputDir", "withReadme", "eslintConfigPath", "path", "logger", "useRecommended", "imports", "generateImports", "configSections", "getCoreConfig", "getTypeScriptConfig", "getVueConfig", "getReactConfig", "rulesStr", "ignoresStr", "eslintConfigContent", "fs", "generateEslintReadme", "getCoreImports", "getTypeScriptImports", "getVueImports", "getReactImports", "readmePath", "allDeps", "getAllDependencies", "readmeContent", "generateInstallCommand", "execSync", "fs", "path", "pathToFileURL", "loadMergedPackagesForService", "service", "config", "verbose", "logger", "packageSources", "mergedDependencies", "mergedDevDependencies", "source", "packageData", "loadPackageSource", "mergeCount", "error", "source_default", "fs", "packageFile", "keyParts", "part", "getServiceLockFilePath", "customPath", "defaultPath", "path", "updatePackageJsons", "target", "raclettePath", "ensureRacletteDir", "pathToFileURL", "module", "Services", "setupPackageJson", "Workbenches", "getPluginDependencies", "appPackagePath", "appPackage", "allDependencies", "pluginModules", "pluginDependencies", "pluginName", "sourcePath", "targetDir", "serviceType", "corePackagePath", "findCorePackagePath", "sourcePackagePath", "sourceDir", "targetPackagePath", "sourcePackage", "mergedPackages", "pluginDeps", "finalDependencies", "finalDevDependencies", "mergedPackage", "mergeDeepRight_default", "copyCoreLockToBuildContext", "setupNodePackages", "racletteDir", "copyFileIfExists", "loadProjectPackages", "packagesPath", "saveProjectPackages", "packages", "addPackageToAppPackageJson", "packageName", "specifiedVersion", "isDev", "appPackagePath", "path", "fs", "execSync", "packageSpec", "command", "logger", "appPackage", "section", "installedVersion", "error", "parsePackageSpec", "scopedMatch", "regularMatch", "addPackageToProject", "target", "source_default", "projectPackages", "loadProjectPackages", "targetPath", "pp", "t", "saveProjectPackages", "ensureLockFilesExist", "config", "corePackagePath", "findCorePackagePath", "frontendLockPath", "getServiceLockFilePath", "coreFrontendLockPath", "backendLockPath", "coreServerLockPath", "copyCoreLockToBuildContext", "sourceDir", "targetDir", "serviceType", "targetLockPath", "serviceLockPath", "coreSourceLockPath", "fs", "path", "generateTsConfig", "config", "outputDir", "tsConfigPath", "path", "tsConfig", "generateVueTypes", "fs", "logger", "raclettePath", "chokidar", "fs", "path", "init_package", "watchers", "init", "config", "cfg", "app", "root", "path", "ignore", "sources", "core", "replacePatterns", "p", "a", "e", "files", "link", "src", "get", "dst", "linkPromises", "f", "d", "from", "to", "fs", "err", "logger", "unlink", "unlinkPromises", "tgt", "watch", "base", "watcher", "chokidar", "relativePath", "configured_src", "globby", "matches", "fs", "path", "safeWriteFile", "filePath", "content", "fs", "path", "source_default", "error", "logger", "generateServiceConfigs", "config", "racletteDir", "backendDir", "frontendDir", "globalConfig", "backendConfigObj", "backendConfig", "frontendConfigObj", "frontendConfig", "validateWorkbenchConfig", "config", "locale", "createWorkbenchConfigFile", "workbenchConfig", "projectPath", "racletteDir", "path", "configFilePath", "fs", "configContent", "processes", "yarnCommand", "useShellForYarn", "shouldIgnoreConfiguredYarnPath", "projectRoot", "yarnRcPath", "path", "fs", "yarnPathMatch", "normalizedYarnPath", "absoluteYarnPath", "logger", "setupDevEnvironment", "appDir", "env", "config", "options", "vfs_cfg", "parse", "applyTemplate", "racletteDir", "projectName", "originalConfigWatcher", "watchConfigFile", "originalWatcherProcess", "ensureLockFilesExist", "setupNodePackages", "init", "ensureDockerNetwork", "generateDockerCompose", "generateTsConfig", "generateEslintConfig", "servicesToRebuild", "trackServiceFiles", "rebuildChangedServices", "serviceConfigs", "createServiceConfigs", "existingServices", "getExistingServices", "cleanupHandler", "createCleanupHandler", "signal", "startDockerServices", "source_default", "startDockerServicesWithLogs", "service", "containerExists", "dockerComposePath", "name", "process", "stopWorkbench", "executeDockerComposeCommand", "error", "verbose", "servicesToStart", "serviceName", "startWorkbench", "logFilter", "logsToFollow", "absoluteDockerComposePath", "logArgs", "logProcess", "spawn", "resolve", "code", "checkWorkbenchSetup", "workbenchPath", "workbenchPackageJson", "resolvedWorkbenchPath", "pluginPath", "pathExists", "workbenchConfigPath", "validateWorkbenchConfig", "createWorkbenchConfigFile", "envsFromParent", "key", "value", "entries", "convertedKey", "reject", "workbenchName", "workbenchArgs", "arg", "args", "shouldPipe", "workbenchProcess", "data", "line", "startupTimer", "workbenchPrefix", "stopContainersByPrefix", "stopComposeServices", "fs", "path", "isServiceRunning", "containerName", "isContainerRunning", "getContainerName", "service", "config", "dockerComposePath", "path", "composeContent", "fs", "envVarMatch", "error", "source_default", "updateServiceDependencies", "executeInContainer", "resultCode", "updateDependencies", "target", "racletteDir", "updated", "allSucceeded", "frontendSuccess", "backendSuccess", "spawn", "path", "handleLogCommand", "services", "options", "config", "dockerComposePath", "handleWorkbenchLogs", "servicesToLog", "getEnabledServices", "source_default", "enabledServices", "invalidServices", "service", "runningServices", "checkRunningServices", "notRunning", "s", "followDockerLogs", "enabled", "containerName", "getContainerName", "isContainerRunning", "error", "projectName", "path", "logArgs", "logProcess", "spawn", "code", "resolve", "workbenchPath", "checkWorkbenchSetup", "logger", "yarnArgs", "yarnProcess", "spawn", "fs", "path", "chokidar", "fs", "path", "EXCLUDED_FILES", "DIST_FILES", "setupVirtualFileSystem", "config", "additionalSourceDirs", "disableWatcher", "appRoot", "racletteDir", "path", "virtualDir", "racletteCoreRoot", "findCorePackagePath", "logger", "setupDistDirectory", "fs", "sourceDirectories", "fileMapping", "serviceCopyPaths", "sortedDirs", "a", "b", "sourceDir", "fullSourcePath", "buildFileMapping", "e", "watchers", "resolveFile", "filePath", "relativePath", "watchFiles", "w", "generateWatchConfigs", "watcher", "setupWatcher", "close", "configs", "service", "subPaths", "subPath", "servicePath", "sourcePath", "targetPathEntry", "targetPath", "excludedFiles", "watchPatterns", "chokidar", "handleFileChange", "isRemoval", "isExcludedFile", "mappingKey", "updateFileInVFS", "nextSource", "findFileInSources", "highestSource", "fullPath", "targetPaths", "folderKey", "processFiles", "mappingKeyPrefix", "isGeneratedServices", "src", "fileName", "files", "findFiles", "file", "relPath", "virtualPath", "source_default", "isFile", "setupDistDirectory", "racletteDir", "coreDir", "filePaths", "distDir", "path", "fs", "relativePath", "sourcePath", "fileName", "targetPath", "logger", "execSync", "fs", "path", "createProductionArtifacts", "config", "buildDir", "hasWorkbench", "source_default", "createProductionDockerfiles", "composeFile", "path", "createProductionCompose", "createEnvironmentExample", "createDeploymentScript", "copyFiles", "filePaths", "sourceDir", "destDir", "options", "makeExecutable", "required", "logPrefix", "filePath", "sourcePath", "filename", "destPath", "fs", "message", "copyProjectFilesToBuild", "copyBuildFilesToPackage", "packageDir", "frontendPort", "workbenchFrontendPort", "frontendDockerfile", "backendDockerfile", "nginxConfig", "workbenchFrontendDockerfile", "workbenchBackendDockerfile", "workbenchNginxConfig", "outputPath", "prodEnvVars", "compose", "key", "value", "cacheConfig", "RDB_OPTIONS", "workbenchProdEnvVars", "jsYaml", "envContent", "generateEnvExampleContent", "deployScript", "deployPath", "generateGenerationCompose", "workingDir", "projectName", "mongoVolume", "redisVolume", "backendNodeModules", "getServiceLockFilePath", "volumeDef", "processedVolume", "processVolumeDefinition", "service", "processAllVolumes", "generateBuildTimeCompose", "buildOutputDir", "frontendNodeModulesVolume", "backendNodeModulesVolume", "createEnhancedDeploymentScripts", "imageNames", "createImageLoadScript", "loadScript", "imageName", "fileName", "img", "createDeploymentReadme", "readme", "packageImagesForDistribution", "timestamp", "packageName", "packagePath", "tempPackageDir", "imagesDir", "imageFileName", "imageFilePath", "executeDockerCommand", "stats", "deploymentFiles", "createTarGzPackage", "error", "parentDir", "folderName", "execSync", "DEFAULT_GENERATION_MODE_TIMEOUT_SECONDS", "MAX_GENERATION_MODE_TIMEOUT_SECONDS", "getGenerationModeTimeoutSeconds", "raw", "resolved", "detail", "parsed", "source_default", "runProductionBuild", "config", "workingDir", "options", "startTime", "mode", "determineBuildMode", "checkDockerInstallation", "racletteDir", "path", "buildDir", "fs", "setupBuildEnvironment", "runGenerationMode", "result", "buildArtifactsMode", "buildImagesMode", "buildPackageMode", "buildTime", "logger", "printBuildSummary", "error", "buildMainApp", "hasWorkbench", "buildWorkbenchIfEnabled", "appBuildDir", "composeFile", "createProductionArtifacts", "readmeFile", "createLocalDeploymentReadme", "imageResult", "buildDockerImagesForRegistry", "timestamp", "getCurrentTimestamp", "packageResult", "packageImagesForDistribution", "name", "imagePrefix", "imageTag", "platforms", "useBuildx", "imageNames", "allTags", "setupBuildxBuilder", "services", "service", "registryImageName", "dockerfilePath", "serviceTags", "tag", "buildMultiArchImage", "buildArgs", "executeDockerComposeCommand", "originalName", "taggedImage", "executeDockerCommand", "args", "platformCount", "frontendPort", "workbenchPort", "readme", "img", "ensureLockFilesExist", "setupNodePackages", "setupVirtualFileSystem", "generateTsConfig", "generateEslintConfig", "generateServiceConfigs", "projectName", "buildComposePath", "generateDockerfiles", "generateGenerationCompose", "ensureDockerNetwork", "attempts", "maxAttempts", "resolve", "buildFrontendAndBackend", "tempBuildDir", "generateBuildTimeCompose", "composeArgs", "frontendBuildDir", "frontendTempDir", "backendBuildDir", "backendTempDir", "createBackendNodeApplication", "distPath", "backendEntryPoint", "packageJsonPath", "packageJson", "productionPackageJson", "yarnLockPath", "verifyBackendStructure", "requiredFiles", "missingFiles", "file", "filePath", "buildWorkbench", "workbenchPath", "workbenchBuildDir", "workbenchConfigPath", "validateWorkbenchConfig", "createWorkbenchConfigFile", "workbenchEnv", "workbenchName", "reject", "arg", "child", "spawn", "code", "fs", "path", "getVolumeOverrideExamples", "generateDeployGuide", "config", "options", "source_default", "outputDir", "path", "imagePrefix", "imageTag", "registry", "imageNames", "generateImageNames", "generateDeploymentFiles", "generateEmbeddedGuide", "generateDeployGuideContent", "generateReturnOnlyGuideContent", "frontendPort", "workbenchPort", "composeContent", "generateComposeYamlString", "overrideContent", "generateOverrideYamlString", "envSection", "createEnvSection", "projectName", "generateUserDeploymentGuideContent", "services", "hasWorkbench", "service", "imageName", "deployGuideDir", "fs", "composeFile", "generateRegistryCompose", "overrideFile", "generateComposeOverride", "envFile", "generateEnvExample", "localReadmeFile", "generateLocalTestingReadme", "deployGuideFile", "generateUserDeploymentGuide", "generateDeveloperDeploymentGuide", "outputPath", "getImageTemplate", "baseImageName", "compose", "jsYaml", "volumeExamples", "getVolumeOverrideExamples", "frontendVolumes", "v", "backendVolumes", "override", "envContent", "generateEnvExampleContent", "readme", "img", "content", "userGuide", "developerGuide", "tempFile", "cwd", "env", "envLog", "source_default", "mainConfig", "merge", "load", "root", "raclettePath", "path", "dockerComposePath", "program", "Command", "preHook", "_cmd", "_action", "logger", "fs", "options", "checkDockerInstallation", "config", "jsYaml", "generateServiceConfigs", "setupDevEnvironment", "Services", "error", "services", "handleLogCommand", "workingDir", "fullDockerComposePath", "stopComposeServices", "generateFullDockerCompose", "projectName", "service", "containerName", "getContainerName", "isContainerRunning", "executeDockerComposeCommand", "executeDockerCommand", "target", "updatePackageJsons", "updateDependencies", "mergeDeepRight_default", "buildOptions", "buildRes", "runProductionBuild", "PackageTargets", "packages", "pkg", "addPackageToProject", "changedServices", "trackServiceFiles", "validServices", "rebuildChangedServices", "deployGuideOptions", "content", "generateDeployGuideContent", "result", "generateDeployGuide"]
|
|
7
|
-
}
|