@jujulego/jill 2.3.2 → 2.3.3
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/dist/489.mjs.map +1 -1
- package/dist/828.mjs +1 -1
- package/dist/828.mjs.map +1 -1
- package/dist/839.mjs +1 -1
- package/dist/839.mjs.map +1 -1
- package/dist/commons/spinner.service.d.ts +2 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +23 -23
package/dist/489.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"489.mjs","mappings":"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","sources":["webpack://@jujulego/jill/./src/commands/each.ts","webpack://@jujulego/jill/./src/commands/exec.ts","webpack://@jujulego/jill/./src/commands/group.ts","webpack://@jujulego/jill/./src/commands/list.tsx","webpack://@jujulego/jill/./src/commands/run.ts","webpack://@jujulego/jill/./src/commands/tree.tsx","webpack://@jujulego/jill/./src/core.plugin.ts"],"sourcesContent":["import { inject } from 'inversify';\nimport { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { SpinnerService } from '@/src/commons/spinner.service.ts';\nimport { AffectedFilter } from '@/src/filters/affected.filter.ts';\nimport { Pipeline } from '@/src/filters/pipeline.ts';\nimport { PrivateFilter } from '@/src/filters/private.filter.ts';\nimport { ScriptsFilter } from '@/src/filters/scripts.filter.ts';\nimport { LazyCurrentProject, LoadProject } from '@/src/middlewares/load-project.ts';\nimport { Command } from '@/src/modules/command.ts';\nimport { TaskCommand } from '@/src/modules/task-command.tsx';\nimport { type Project } from '@/src/project/project.ts';\nimport { type WorkspaceDepsMode } from '@/src/project/workspace.ts';\nimport { ExitException } from '@/src/utils/exit.ts';\n\n// Types\nexport interface IEachCommandArgs {\n script: string;\n 'build-script': string;\n 'deps-mode': WorkspaceDepsMode;\n\n // Filters\n private?: boolean;\n\n // Affected filter\n affected: string;\n 'affected-rev-fallback': string;\n 'affected-rev-sort'?: string;\n}\n\n// Command\n@Command({\n command: 'each <script>',\n describe: 'Run script on many workspaces',\n middlewares: [\n LoadProject\n ]\n})\nexport class EachCommand extends TaskCommand<IEachCommandArgs> {\n // Lazy injections\n @LazyCurrentProject()\n readonly project: Project;\n\n // Constructor\n constructor(\n @inject(SpinnerService)\n private readonly spinner: SpinnerService,\n ) {\n super();\n }\n\n // Methods\n builder(parser: Argv): Argv<IEachCommandArgs> {\n return this.addTaskOptions(parser)\n // Run options\n .positional('script', { type: 'string', demandOption: true })\n .option('build-script', {\n default: 'build',\n desc: 'Script to use to build dependencies'\n })\n .option('deps-mode', {\n alias: 'd',\n choice: ['all', 'prod', 'none'],\n default: 'all' as const,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n })\n\n // Filters\n .option('private', {\n type: 'boolean',\n group: 'Filters:',\n desc: 'Print only private workspaces',\n })\n .option('affected', {\n alias: 'a',\n type: 'string',\n coerce: (rev) => rev === '' ? 'master' : rev,\n group: 'Filters:',\n desc: 'Print only affected workspaces towards given git revision. If no revision is given, it will check towards master. Replaces %name by workspace name.',\n })\n .option('affected-rev-sort', {\n type: 'string',\n group: 'Filters:',\n desc: 'Sort applied to git tag / git branch command',\n })\n .option('affected-rev-fallback', {\n type: 'string',\n default: 'master',\n group: 'Filters:',\n desc: 'Fallback revision, used if no revision matching the given format is found',\n })\n\n // Config\n .strict(false)\n .parserConfiguration({\n 'unknown-options-as-args': true,\n });\n }\n\n async *prepare(args: ArgumentsCamelCase<IEachCommandArgs>) {\n try {\n this.spinner.spin('Loading workspaces ...');\n\n // Setup pipeline\n const pipeline = new Pipeline();\n pipeline.add(new ScriptsFilter([args.script]));\n\n if (args.private !== undefined) {\n pipeline.add(new PrivateFilter(args.private));\n }\n\n if (args.affected !== undefined) {\n pipeline.add(new AffectedFilter(\n args.affected,\n args.affectedRevFallback,\n args.affectedRevSort\n ));\n }\n\n // Extract arguments\n const rest = args._.map(arg => arg.toString());\n\n if (rest[0] === 'each') {\n rest.splice(0, 1);\n }\n\n // Create script tasks\n let empty = true;\n\n for await (const wks of pipeline.filter(this.project.workspaces())) {\n const task = await wks.run(args.script, rest, {\n buildScript: args.buildScript,\n buildDeps: args.depsMode,\n });\n\n if (task) {\n yield task;\n empty = false;\n }\n }\n\n if (empty) {\n this.spinner.failed('No matching workspace found !');\n throw new ExitException(1);\n }\n } finally {\n this.spinner.stop();\n }\n }\n}\n","import { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { Command } from '@/src/modules/command.ts';\nimport { TaskCommand } from '@/src/modules/task-command.tsx';\nimport { LoadProject } from '@/src/middlewares/load-project.ts';\nimport { LazyCurrentWorkspace, LoadWorkspace } from '@/src/middlewares/load-workspace.ts';\nimport { type Workspace, type WorkspaceDepsMode } from '@/src/project/workspace.ts';\n\n// Types\nexport interface IExecCommandArgs {\n command: string;\n 'build-script': string;\n 'deps-mode': WorkspaceDepsMode;\n}\n\n// Command\n@Command({\n command: 'exec <command>',\n aliases: ['$0'],\n describe: 'Run command inside workspace, after all its dependencies has been built.',\n middlewares: [\n LoadProject,\n LoadWorkspace\n ]\n})\nexport class ExecCommand extends TaskCommand<IExecCommandArgs> {\n // Lazy injections\n @LazyCurrentWorkspace()\n readonly workspace: Workspace;\n\n // Methods\n builder(parser: Argv) {\n return this.addTaskOptions(parser)\n .positional('command', { type: 'string', demandOption: true })\n .option('build-script', {\n default: 'build',\n desc: 'Script to use to build dependencies'\n })\n .option('deps-mode', {\n alias: 'd',\n choice: ['all', 'prod', 'none'],\n default: 'all' as const,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n })\n\n // Documentation\n .example('jill eslint', '')\n .example('jill eslint --env-info', 'Unknown arguments are passed down to command. Here it would run eslint --env-info')\n .example('jill eslint -- -v', 'You can use -- to stop argument parsing. Here it would run eslint -v')\n\n // Config\n .strict(false)\n .parserConfiguration({\n 'unknown-options-as-args': true,\n });\n }\n\n async *prepare(args: ArgumentsCamelCase<IExecCommandArgs>) {\n // Extract arguments\n const rest = args._.map(arg => arg.toString());\n\n if (rest[0] === 'exec') {\n rest.splice(0, 1);\n }\n\n // Run script in workspace\n const task = await this.workspace.exec(args.command, rest, {\n buildScript: args.buildScript,\n buildDeps: args.depsMode,\n });\n\n yield task;\n }\n}\n","import { inject } from 'inversify';\nimport { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { Command } from '@/src/modules/command.ts';\nimport { TaskCommand } from '@/src/modules/task-command.tsx';\nimport { LoadProject } from '@/src/middlewares/load-project.ts';\nimport { LazyCurrentWorkspace, LoadWorkspace } from '@/src/middlewares/load-workspace.ts';\nimport { type Workspace, type WorkspaceDepsMode } from '@/src/project/workspace.ts';\nimport { TaskExprService, type TaskTree } from '@/src/tasks/task-expr.service.ts';\n\n// Types\nexport interface IGroupCommandArgs {\n script: TaskTree;\n 'build-script': string;\n 'deps-mode': WorkspaceDepsMode;\n}\n\n// Command\n@Command({\n command: 'group <script..>',\n describe: 'Run many scripts inside a workspace (experimental)',\n middlewares: [\n LoadProject,\n LoadWorkspace\n ]\n})\nexport class GroupCommand extends TaskCommand<IGroupCommandArgs> {\n // Lazy injections\n @LazyCurrentWorkspace()\n readonly workspace: Workspace;\n\n // Constructor\n constructor(\n @inject(TaskExprService)\n private readonly taskExpr: TaskExprService,\n ) {\n super();\n }\n\n // Methods\n builder(parser: Argv): Argv<IGroupCommandArgs> {\n return this.addTaskOptions(parser)\n .positional('script', {\n demandOption: true,\n coerce: (expr: string[]) => {\n return this.taskExpr.parse(expr.join(' '));\n }\n })\n .option('build-script', {\n default: 'build',\n desc: 'Script to use to build dependencies'\n })\n .option('deps-mode', {\n alias: 'd',\n choice: ['all', 'prod', 'none'],\n default: 'all' as const,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n });\n }\n\n async *prepare(args: ArgumentsCamelCase<IGroupCommandArgs>) {\n // Run script in workspace\n const group = await this.taskExpr.buildTask(args.script.roots[0], this.workspace, {\n buildScript: args.buildScript,\n buildDeps: args.depsMode,\n });\n\n yield group;\n }\n}\n","import chalk from 'chalk';\nimport path from 'node:path';\nimport slugify from 'slugify';\nimport { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { AffectedFilter } from '@/src/filters/affected.filter.ts';\nimport { Pipeline } from '@/src/filters/pipeline.ts';\nimport { PrivateFilter } from '@/src/filters/private.filter.ts';\nimport { ScriptsFilter } from '@/src/filters/scripts.filter.ts';\nimport { LazyCurrentProject, LoadProject } from '@/src/middlewares/load-project.ts';\nimport { Command } from '@/src/modules/command.ts';\nimport { InkCommand } from '@/src/modules/ink-command.tsx';\nimport { type Project } from '@/src/project/project.ts';\nimport { type Workspace } from '@/src/project/workspace.ts';\nimport List from '@/src/ui/list.tsx';\nimport { fixDefaultExport } from '@/src/utils/import.ts';\nimport { printJson } from '@/src/utils/json.ts';\n\n// Types\nexport type Attribute = 'name' | 'version' | 'root' | 'slug';\nexport type Data = Partial<Record<Attribute, string>>;\n\ntype Extractor<T> = (wks: Workspace, json: boolean) => T;\n\nexport interface IListCommandArgs {\n // Filters\n private?: boolean;\n 'with-script'?: string[];\n\n // Affected filter\n affected: string;\n 'affected-rev-fallback': string;\n 'affected-rev-sort'?: string;\n\n // Format\n attrs: Attribute[];\n headers?: boolean;\n long?: boolean;\n json?: boolean;\n}\n\n// Constants\nconst LONG_ATTRIBUTES: Attribute[] = ['name', 'version', 'root'];\nconst JSON_ATTRIBUTES: Attribute[] = ['name', 'version', 'slug', 'root'];\nconst DEFAULT_ATTRIBUTES: Attribute[] = ['name'];\n\nconst EXTRACTORS = {\n name: wks => wks.name,\n version: (wks, json) => wks.manifest.version || (json ? undefined : chalk.grey('unset')),\n root: wks => wks.cwd,\n slug: wks => fixDefaultExport(slugify)(wks.name)\n} satisfies Record<Attribute, Extractor<string | undefined>>;\n\n// Utils\nfunction buildExtractor(attrs: Attribute[]): Extractor<Data> {\n return (wks, json: boolean) => {\n const data: Data = {};\n\n for (const attr of attrs) {\n data[attr] = EXTRACTORS[attr](wks, json);\n }\n\n return data;\n };\n}\n\n// Command\n@Command({\n command: 'list',\n aliases: ['ls'],\n describe: 'List workspace',\n middlewares: [\n LoadProject,\n ]\n})\nexport class ListCommand extends InkCommand<IListCommandArgs> {\n // Lazy injections\n @LazyCurrentProject()\n readonly project: Project;\n\n // Methods\n builder(parser: Argv): Argv<IListCommandArgs> {\n return parser\n // Filters\n .option('private', {\n type: 'boolean',\n group: 'Filters:',\n desc: 'Print only private workspaces',\n })\n .option('with-script', {\n type: 'array',\n string: true,\n group: 'Filters:',\n desc: 'Print only workspaces having the given script',\n })\n .option('affected', {\n alias: 'a',\n type: 'string',\n coerce: (rev) => rev === '' ? 'master' : rev,\n group: 'Filters:',\n desc: 'Print only affected workspaces towards given git revision. If no revision is given, it will check towards master. Replaces %name by workspace name.',\n })\n .option('affected-rev-sort', {\n type: 'string',\n group: 'Filters:',\n desc: 'Sort applied to git tag / git branch command',\n })\n .option('affected-rev-fallback', {\n type: 'string',\n default: 'master',\n group: 'Filters:',\n desc: 'Fallback revision, used if no revision matching the given format is found',\n })\n\n // Format\n .option('attrs', {\n type: 'array',\n choices: ['name', 'version', 'root', 'slug'] as const,\n default: [],\n group: 'Format:',\n desc: 'Select printed attributes'\n })\n .option('headers', {\n type: 'boolean',\n group: 'Format:',\n desc: 'Prints columns headers'\n })\n .option('long', {\n alias: 'l',\n type: 'boolean',\n group: 'Format:',\n desc: 'Prints name, version and root of all workspaces',\n })\n .option('json', {\n type: 'boolean',\n group: 'Format:',\n desc: 'Prints data as a JSON array',\n });\n }\n\n async *render(args: ArgumentsCamelCase<IListCommandArgs>) {\n // Setup pipeline\n const pipeline = new Pipeline();\n\n if (args.private !== undefined) {\n pipeline.add(new PrivateFilter(args.private));\n }\n\n if (args.withScript) {\n pipeline.add(new ScriptsFilter(args.withScript));\n }\n\n if (args.affected !== undefined) {\n pipeline.add(new AffectedFilter(\n args.affected,\n args.affectedRevFallback,\n args.affectedRevSort\n ));\n }\n\n // Load workspaces\n const workspaces: Workspace[] = [];\n\n for await (const wks of pipeline.filter(this.project.workspaces())) {\n workspaces.push(wks);\n }\n\n // Build data\n let attrs = args.attrs;\n\n if (attrs.length === 0) {\n if (args.long) {\n attrs = LONG_ATTRIBUTES;\n } else if (args.json) {\n attrs = JSON_ATTRIBUTES;\n } else {\n attrs = DEFAULT_ATTRIBUTES;\n }\n }\n\n const data = workspaces.map(wks => buildExtractor(attrs)(wks, args.json || false));\n\n // Print list\n if (args.json) {\n printJson(data);\n } else {\n for (const d of data) {\n if (d.root) {\n d.root = path.relative(process.cwd(), d.root) || '.';\n }\n }\n\n yield <List items={data} headers={args.headers ?? (attrs.length > 1)} />;\n }\n }\n}\n","import { inject } from 'inversify';\nimport { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { Logger } from '@/src/commons/logger.service.ts';\nimport { Command } from '@/src/modules/command.ts';\nimport { TaskCommand } from '@/src/modules/task-command.tsx';\nimport { LoadProject } from '@/src/middlewares/load-project.ts';\nimport { LazyCurrentWorkspace, LoadWorkspace } from '@/src/middlewares/load-workspace.ts';\nimport { type Workspace, type WorkspaceDepsMode } from '@/src/project/workspace.ts';\nimport { ExitException } from '@/src/utils/exit.ts';\n\n// Types\nexport interface IRunCommandArgs {\n script: string;\n 'build-script': string;\n 'deps-mode': WorkspaceDepsMode;\n}\n\n// Command\n@Command({\n command: 'run <script>',\n describe: 'Run script inside workspace',\n middlewares: [\n LoadProject,\n LoadWorkspace\n ]\n})\nexport class RunCommand extends TaskCommand<IRunCommandArgs> {\n // Lazy injections\n @LazyCurrentWorkspace()\n readonly workspace: Workspace;\n\n // Constructor\n constructor(\n @inject(Logger)\n private readonly logger: Logger,\n ) {\n super();\n }\n\n // Methods\n builder(parser: Argv) {\n return this.addTaskOptions(parser)\n .positional('script', { type: 'string', demandOption: true })\n .option('build-script', {\n default: 'build',\n desc: 'Script to use to build dependencies'\n })\n .option('deps-mode', {\n alias: 'd',\n choice: ['all', 'prod', 'none'],\n default: 'all' as const,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n })\n\n // Config\n .strict(false)\n .parserConfiguration({\n 'unknown-options-as-args': true,\n });\n }\n\n async *prepare(args: ArgumentsCamelCase<IRunCommandArgs>) {\n // Extract arguments\n const rest = args._.map(arg => arg.toString());\n\n if (rest[0] === 'run') {\n rest.splice(0, 1);\n }\n\n // Run script in workspace\n const task = await this.workspace.run(args.script, rest, {\n buildScript: args.buildScript,\n buildDeps: args.depsMode,\n });\n\n if (task) {\n yield task;\n } else {\n this.logger.error`Workspace ${this.workspace.name} have no ${args.script} script`;\n throw new ExitException(1);\n }\n }\n}\n","import { Command } from '@/src/modules/command.ts';\nimport { InkCommand } from '@/src/modules/ink-command.tsx';\nimport { LoadProject } from '@/src/middlewares/load-project.ts';\nimport { LazyCurrentWorkspace, LoadWorkspace } from '@/src/middlewares/load-workspace.ts';\nimport { type Workspace } from '@/src/project/workspace.ts';\nimport WorkspaceTree from '@/src/ui/workspace-tree.tsx';\n\n// Command\n@Command({\n command: 'tree',\n describe: 'Print workspace dependency tree',\n middlewares: [\n LoadProject,\n LoadWorkspace\n ]\n})\nexport class TreeCommand extends InkCommand {\n // Lazy injections\n @LazyCurrentWorkspace()\n readonly workspace: Workspace;\n\n // Methods\n *render() {\n yield <WorkspaceTree workspace={this.workspace} />;\n }\n}\n","import { EachCommand } from '@/src/commands/each.ts';\nimport { ExecCommand } from '@/src/commands/exec.ts';\nimport { GroupCommand } from '@/src/commands/group.ts';\nimport { ListCommand } from '@/src/commands/list.tsx';\nimport { RunCommand } from '@/src/commands/run.ts';\nimport { TreeCommand } from '@/src/commands/tree.tsx';\nimport { Plugin } from '@/src/modules/plugin.ts';\n\n// Plugin\n@Plugin({\n name: 'core',\n commands: [\n EachCommand,\n ExecCommand,\n GroupCommand,\n ListCommand,\n RunCommand,\n TreeCommand,\n ]\n})\nexport class CorePlugin {}\n"],"names":["EachCommand","TaskCommand","constructor","spinner","super","builder","parser","this","addTaskOptions","positional","type","demandOption","option","default","desc","alias","choice","group","coerce","rev","strict","parserConfiguration","async","args","spin","pipeline","Pipeline","add","ScriptsFilter","script","undefined","private","PrivateFilter","affected","AffectedFilter","affectedRevFallback","affectedRevSort","rest","_","map","arg","toString","splice","empty","wks","filter","project","workspaces","task","run","buildScript","buildDeps","depsMode","failed","ExitException","stop","LazyCurrentProject","Command","command","describe","middlewares","LoadProject","inject","SpinnerService","ExecCommand","example","workspace","exec","LazyCurrentWorkspace","aliases","LoadWorkspace","GroupCommand","taskExpr","expr","parse","join","buildTask","roots","TaskExprService","LONG_ATTRIBUTES","JSON_ATTRIBUTES","DEFAULT_ATTRIBUTES","EXTRACTORS","name","version","json","manifest","chalk","root","cwd","slug","fixDefaultExport","slugify","ListCommand","InkCommand","string","choices","withScript","push","attrs","length","long","data","attr","buildExtractor","printJson","d","path","process","List","items","headers","RunCommand","logger","error","Logger","TreeCommand","WorkspaceTree","CorePlugin","Plugin","commands"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"489.mjs","mappings":"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","sources":["webpack://@jujulego/jill/./src/commands/each.ts","webpack://@jujulego/jill/./src/commands/exec.ts","webpack://@jujulego/jill/./src/commands/group.ts","webpack://@jujulego/jill/./src/commands/list.tsx","webpack://@jujulego/jill/./src/commands/run.ts","webpack://@jujulego/jill/./src/commands/tree.tsx","webpack://@jujulego/jill/./src/core.plugin.ts"],"sourcesContent":["import { inject } from 'inversify';\nimport { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { SpinnerService } from '@/src/commons/spinner.service.ts';\nimport { AffectedFilter } from '@/src/filters/affected.filter.ts';\nimport { Pipeline } from '@/src/filters/pipeline.ts';\nimport { PrivateFilter } from '@/src/filters/private.filter.ts';\nimport { ScriptsFilter } from '@/src/filters/scripts.filter.ts';\nimport { LazyCurrentProject, LoadProject } from '@/src/middlewares/load-project.ts';\nimport { Command } from '@/src/modules/command.ts';\nimport { TaskCommand } from '@/src/modules/task-command.tsx';\nimport { type Project } from '@/src/project/project.ts';\nimport { type WorkspaceDepsMode } from '@/src/project/workspace.ts';\nimport { ExitException } from '@/src/utils/exit.ts';\n\n// Types\nexport interface IEachCommandArgs {\n script: string;\n 'build-script': string;\n 'deps-mode': WorkspaceDepsMode;\n\n // Filters\n private?: boolean;\n\n // Affected filter\n affected: string;\n 'affected-rev-fallback': string;\n 'affected-rev-sort'?: string;\n}\n\n// Command\n@Command({\n command: 'each <script>',\n describe: 'Run script on many workspaces',\n middlewares: [\n LoadProject\n ]\n})\nexport class EachCommand extends TaskCommand<IEachCommandArgs> {\n // Lazy injections\n @LazyCurrentProject()\n readonly project: Project;\n\n // Constructor\n constructor(\n @inject(SpinnerService)\n private readonly spinner: SpinnerService,\n ) {\n super();\n }\n\n // Methods\n builder(parser: Argv): Argv<IEachCommandArgs> {\n return this.addTaskOptions(parser)\n // Run options\n .positional('script', { type: 'string', demandOption: true })\n .option('build-script', {\n default: 'build',\n desc: 'Script to use to build dependencies'\n })\n .option('deps-mode', {\n alias: 'd',\n choice: ['all', 'prod', 'none'],\n default: 'all' as const,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n })\n\n // Filters\n .option('private', {\n type: 'boolean',\n group: 'Filters:',\n desc: 'Print only private workspaces',\n })\n .option('affected', {\n alias: 'a',\n type: 'string',\n coerce: (rev) => rev === '' ? 'master' : rev,\n group: 'Filters:',\n desc: 'Print only affected workspaces towards given git revision. If no revision is given, it will check towards master. Replaces %name by workspace name.',\n })\n .option('affected-rev-sort', {\n type: 'string',\n group: 'Filters:',\n desc: 'Sort applied to git tag / git branch command',\n })\n .option('affected-rev-fallback', {\n type: 'string',\n default: 'master',\n group: 'Filters:',\n desc: 'Fallback revision, used if no revision matching the given format is found',\n })\n\n // Config\n .strict(false)\n .parserConfiguration({\n 'unknown-options-as-args': true,\n });\n }\n\n async *prepare(args: ArgumentsCamelCase<IEachCommandArgs>) {\n try {\n this.spinner.spin('Loading workspaces ...');\n\n // Setup pipeline\n const pipeline = new Pipeline();\n pipeline.add(new ScriptsFilter([args.script]));\n\n if (args.private !== undefined) {\n pipeline.add(new PrivateFilter(args.private));\n }\n\n if (args.affected !== undefined) {\n pipeline.add(new AffectedFilter(\n args.affected,\n args.affectedRevFallback,\n args.affectedRevSort\n ));\n }\n\n // Extract arguments\n const rest = args._.map(arg => arg.toString());\n\n if (rest[0] === 'each') {\n rest.splice(0, 1);\n }\n\n // Create script tasks\n let empty = true;\n\n for await (const wks of pipeline.filter(this.project.workspaces())) {\n const task = await wks.run(args.script, rest, {\n buildScript: args.buildScript,\n buildDeps: args.depsMode,\n });\n\n if (task) {\n yield task;\n empty = false;\n }\n }\n\n if (empty) {\n this.spinner.failed('No matching workspace found !');\n throw new ExitException(1);\n }\n } finally {\n this.spinner.stop();\n }\n }\n}\n","import { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { Command } from '@/src/modules/command.ts';\nimport { TaskCommand } from '@/src/modules/task-command.tsx';\nimport { LoadProject } from '@/src/middlewares/load-project.ts';\nimport { LazyCurrentWorkspace, LoadWorkspace } from '@/src/middlewares/load-workspace.ts';\nimport { type Workspace, type WorkspaceDepsMode } from '@/src/project/workspace.ts';\n\n// Types\nexport interface IExecCommandArgs {\n command: string;\n 'build-script': string;\n 'deps-mode': WorkspaceDepsMode;\n}\n\n// Command\n@Command({\n command: 'exec <command>',\n aliases: ['$0'],\n describe: 'Run command inside workspace, after all its dependencies has been built.',\n middlewares: [\n LoadProject,\n LoadWorkspace\n ]\n})\nexport class ExecCommand extends TaskCommand<IExecCommandArgs> {\n // Lazy injections\n @LazyCurrentWorkspace()\n readonly workspace: Workspace;\n\n // Methods\n builder(parser: Argv) {\n return this.addTaskOptions(parser)\n .positional('command', { type: 'string', demandOption: true })\n .option('build-script', {\n default: 'build',\n desc: 'Script to use to build dependencies'\n })\n .option('deps-mode', {\n alias: 'd',\n choice: ['all', 'prod', 'none'],\n default: 'all' as const,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n })\n\n // Documentation\n .example('jill eslint', '')\n .example('jill eslint --env-info', 'Unknown arguments are passed down to command. Here it would run eslint --env-info')\n .example('jill eslint -- -v', 'You can use -- to stop argument parsing. Here it would run eslint -v')\n\n // Config\n .strict(false)\n .parserConfiguration({\n 'unknown-options-as-args': true,\n });\n }\n\n async *prepare(args: ArgumentsCamelCase<IExecCommandArgs>) {\n // Extract arguments\n const rest = args._.map(arg => arg.toString());\n\n if (rest[0] === 'exec') {\n rest.splice(0, 1);\n }\n\n // Run script in workspace\n const task = await this.workspace.exec(args.command, rest, {\n buildScript: args.buildScript,\n buildDeps: args.depsMode,\n });\n\n yield task;\n }\n}\n","import { inject } from 'inversify';\nimport { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { Command } from '@/src/modules/command.ts';\nimport { TaskCommand } from '@/src/modules/task-command.tsx';\nimport { LoadProject } from '@/src/middlewares/load-project.ts';\nimport { LazyCurrentWorkspace, LoadWorkspace } from '@/src/middlewares/load-workspace.ts';\nimport { type Workspace, type WorkspaceDepsMode } from '@/src/project/workspace.ts';\nimport { TaskExprService, type TaskTree } from '@/src/tasks/task-expr.service.ts';\n\n// Types\nexport interface IGroupCommandArgs {\n script: TaskTree;\n 'build-script': string;\n 'deps-mode': WorkspaceDepsMode;\n}\n\n// Command\n@Command({\n command: 'group <script..>',\n describe: 'Run many scripts inside a workspace (experimental)',\n middlewares: [\n LoadProject,\n LoadWorkspace\n ]\n})\nexport class GroupCommand extends TaskCommand<IGroupCommandArgs> {\n // Lazy injections\n @LazyCurrentWorkspace()\n readonly workspace: Workspace;\n\n // Constructor\n constructor(\n @inject(TaskExprService)\n private readonly taskExpr: TaskExprService,\n ) {\n super();\n }\n\n // Methods\n builder(parser: Argv): Argv<IGroupCommandArgs> {\n return this.addTaskOptions(parser)\n .positional('script', {\n demandOption: true,\n coerce: (expr: string[]) => {\n return this.taskExpr.parse(expr.join(' '));\n }\n })\n .option('build-script', {\n default: 'build',\n desc: 'Script to use to build dependencies'\n })\n .option('deps-mode', {\n alias: 'd',\n choice: ['all', 'prod', 'none'],\n default: 'all' as const,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n });\n }\n\n async *prepare(args: ArgumentsCamelCase<IGroupCommandArgs>) {\n // Run script in workspace\n const group = await this.taskExpr.buildTask(args.script.roots[0], this.workspace, {\n buildScript: args.buildScript,\n buildDeps: args.depsMode,\n });\n\n yield group;\n }\n}\n","import chalk from 'chalk';\nimport path from 'node:path';\nimport slugify from 'slugify';\nimport { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { AffectedFilter } from '@/src/filters/affected.filter.ts';\nimport { Pipeline } from '@/src/filters/pipeline.ts';\nimport { PrivateFilter } from '@/src/filters/private.filter.ts';\nimport { ScriptsFilter } from '@/src/filters/scripts.filter.ts';\nimport { LazyCurrentProject, LoadProject } from '@/src/middlewares/load-project.ts';\nimport { Command } from '@/src/modules/command.ts';\nimport { InkCommand } from '@/src/modules/ink-command.tsx';\nimport { type Project } from '@/src/project/project.ts';\nimport { type Workspace } from '@/src/project/workspace.ts';\nimport List from '@/src/ui/list.tsx';\nimport { fixDefaultExport } from '@/src/utils/import.ts';\nimport { printJson } from '@/src/utils/json.ts';\n\n// Types\nexport type Attribute = 'name' | 'version' | 'root' | 'slug';\nexport type Data = Partial<Record<Attribute, string>>;\n\ntype Extractor<T> = (wks: Workspace, json: boolean) => T;\n\nexport interface IListCommandArgs {\n // Filters\n private?: boolean;\n 'with-script'?: string[];\n\n // Affected filter\n affected: string;\n 'affected-rev-fallback': string;\n 'affected-rev-sort'?: string;\n\n // Format\n attrs: Attribute[];\n headers?: boolean;\n long?: boolean;\n json?: boolean;\n}\n\n// Constants\nconst LONG_ATTRIBUTES: Attribute[] = ['name', 'version', 'root'];\nconst JSON_ATTRIBUTES: Attribute[] = ['name', 'version', 'slug', 'root'];\nconst DEFAULT_ATTRIBUTES: Attribute[] = ['name'];\n\nconst EXTRACTORS = {\n name: wks => wks.name,\n version: (wks, json) => wks.manifest.version || (json ? undefined : chalk.grey('unset')),\n root: wks => wks.cwd,\n slug: wks => fixDefaultExport(slugify)(wks.name)\n} satisfies Record<Attribute, Extractor<string | undefined>>;\n\n// Utils\nfunction buildExtractor(attrs: Attribute[]): Extractor<Data> {\n return (wks, json: boolean) => {\n const data: Data = {};\n\n for (const attr of attrs) {\n data[attr] = EXTRACTORS[attr](wks, json);\n }\n\n return data;\n };\n}\n\n// Command\n@Command({\n command: 'list',\n aliases: ['ls'],\n describe: 'List workspace',\n middlewares: [\n LoadProject,\n ]\n})\nexport class ListCommand extends InkCommand<IListCommandArgs> {\n // Lazy injections\n @LazyCurrentProject()\n readonly project: Project;\n\n // Methods\n builder(parser: Argv): Argv<IListCommandArgs> {\n return parser\n // Filters\n .option('private', {\n type: 'boolean',\n group: 'Filters:',\n desc: 'Print only private workspaces',\n })\n .option('with-script', {\n type: 'array',\n string: true,\n group: 'Filters:',\n desc: 'Print only workspaces having the given script',\n })\n .option('affected', {\n alias: 'a',\n type: 'string',\n coerce: (rev) => rev === '' ? 'master' : rev,\n group: 'Filters:',\n desc: 'Print only affected workspaces towards given git revision. If no revision is given, it will check towards master. Replaces %name by workspace name.',\n })\n .option('affected-rev-sort', {\n type: 'string',\n group: 'Filters:',\n desc: 'Sort applied to git tag / git branch command',\n })\n .option('affected-rev-fallback', {\n type: 'string',\n default: 'master',\n group: 'Filters:',\n desc: 'Fallback revision, used if no revision matching the given format is found',\n })\n\n // Format\n .option('attrs', {\n type: 'array',\n choices: ['name', 'version', 'root', 'slug'] as const,\n default: [],\n group: 'Format:',\n desc: 'Select printed attributes'\n })\n .option('headers', {\n type: 'boolean',\n group: 'Format:',\n desc: 'Prints columns headers'\n })\n .option('long', {\n alias: 'l',\n type: 'boolean',\n group: 'Format:',\n desc: 'Prints name, version and root of all workspaces',\n })\n .option('json', {\n type: 'boolean',\n group: 'Format:',\n desc: 'Prints data as a JSON array',\n });\n }\n\n async *render(args: ArgumentsCamelCase<IListCommandArgs>) {\n // Setup pipeline\n const pipeline = new Pipeline();\n\n if (args.private !== undefined) {\n pipeline.add(new PrivateFilter(args.private));\n }\n\n if (args.withScript) {\n pipeline.add(new ScriptsFilter(args.withScript));\n }\n\n if (args.affected !== undefined) {\n pipeline.add(new AffectedFilter(\n args.affected,\n args.affectedRevFallback,\n args.affectedRevSort\n ));\n }\n\n // Load workspaces\n const workspaces: Workspace[] = [];\n\n for await (const wks of pipeline.filter(this.project.workspaces())) {\n workspaces.push(wks);\n }\n\n // Build data\n let attrs = args.attrs;\n\n if (attrs.length === 0) {\n if (args.long) {\n attrs = LONG_ATTRIBUTES;\n } else if (args.json) {\n attrs = JSON_ATTRIBUTES;\n } else {\n attrs = DEFAULT_ATTRIBUTES;\n }\n }\n\n const data = workspaces.map(wks => buildExtractor(attrs)(wks, args.json || false));\n\n // Print list\n if (args.json) {\n printJson(data);\n } else {\n for (const d of data) {\n if (d.root) {\n d.root = path.relative(process.cwd(), d.root) || '.';\n }\n }\n\n yield <List items={data} headers={args.headers ?? (attrs.length > 1)} />;\n }\n }\n}\n","import { inject } from 'inversify';\nimport { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { Logger } from '@/src/commons/logger.service.ts';\nimport { Command } from '@/src/modules/command.ts';\nimport { TaskCommand } from '@/src/modules/task-command.tsx';\nimport { LoadProject } from '@/src/middlewares/load-project.ts';\nimport { LazyCurrentWorkspace, LoadWorkspace } from '@/src/middlewares/load-workspace.ts';\nimport { type Workspace, type WorkspaceDepsMode } from '@/src/project/workspace.ts';\nimport { ExitException } from '@/src/utils/exit.ts';\n\n// Types\nexport interface IRunCommandArgs {\n script: string;\n 'build-script': string;\n 'deps-mode': WorkspaceDepsMode;\n}\n\n// Command\n@Command({\n command: 'run <script>',\n describe: 'Run script inside workspace',\n middlewares: [\n LoadProject,\n LoadWorkspace\n ]\n})\nexport class RunCommand extends TaskCommand<IRunCommandArgs> {\n // Lazy injections\n @LazyCurrentWorkspace()\n readonly workspace: Workspace;\n\n // Constructor\n constructor(\n @inject(Logger)\n private readonly logger: Logger,\n ) {\n super();\n }\n\n // Methods\n builder(parser: Argv) {\n return this.addTaskOptions(parser)\n .positional('script', { type: 'string', demandOption: true })\n .option('build-script', {\n default: 'build',\n desc: 'Script to use to build dependencies'\n })\n .option('deps-mode', {\n alias: 'd',\n choice: ['all', 'prod', 'none'],\n default: 'all' as const,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n })\n\n // Config\n .strict(false)\n .parserConfiguration({\n 'unknown-options-as-args': true,\n });\n }\n\n async *prepare(args: ArgumentsCamelCase<IRunCommandArgs>) {\n // Extract arguments\n const rest = args._.map(arg => arg.toString());\n\n if (rest[0] === 'run') {\n rest.splice(0, 1);\n }\n\n // Run script in workspace\n const task = await this.workspace.run(args.script, rest, {\n buildScript: args.buildScript,\n buildDeps: args.depsMode,\n });\n\n if (task) {\n yield task;\n } else {\n this.logger.error`Workspace ${this.workspace.name} have no ${args.script} script`;\n throw new ExitException(1);\n }\n }\n}\n","import { Command } from '@/src/modules/command.ts';\nimport { InkCommand } from '@/src/modules/ink-command.tsx';\nimport { LoadProject } from '@/src/middlewares/load-project.ts';\nimport { LazyCurrentWorkspace, LoadWorkspace } from '@/src/middlewares/load-workspace.ts';\nimport { type Workspace } from '@/src/project/workspace.ts';\nimport WorkspaceTree from '@/src/ui/workspace-tree.tsx';\n\n// Command\n@Command({\n command: 'tree',\n describe: 'Print workspace dependency tree',\n middlewares: [\n LoadProject,\n LoadWorkspace\n ]\n})\nexport class TreeCommand extends InkCommand {\n // Lazy injections\n @LazyCurrentWorkspace()\n readonly workspace: Workspace;\n\n // Methods\n *render() {\n yield <WorkspaceTree workspace={this.workspace} />;\n }\n}\n","import { EachCommand } from '@/src/commands/each.ts';\nimport { ExecCommand } from '@/src/commands/exec.ts';\nimport { GroupCommand } from '@/src/commands/group.ts';\nimport { ListCommand } from '@/src/commands/list.tsx';\nimport { RunCommand } from '@/src/commands/run.ts';\nimport { TreeCommand } from '@/src/commands/tree.tsx';\nimport { Plugin } from '@/src/modules/plugin.ts';\n\n// Plugin\n@Plugin({\n name: 'core',\n commands: [\n EachCommand,\n ExecCommand,\n GroupCommand,\n ListCommand,\n RunCommand,\n TreeCommand,\n ]\n})\nexport class CorePlugin {}\n"],"names":["EachCommand","TaskCommand","constructor","super","spinner","builder","parser","this","addTaskOptions","positional","type","demandOption","option","default","desc","alias","choice","group","coerce","rev","strict","parserConfiguration","async","args","spin","pipeline","Pipeline","add","ScriptsFilter","script","undefined","private","PrivateFilter","affected","AffectedFilter","affectedRevFallback","affectedRevSort","rest","_","map","arg","toString","splice","empty","wks","filter","project","workspaces","task","run","buildScript","buildDeps","depsMode","failed","ExitException","stop","LazyCurrentProject","Command","command","describe","middlewares","LoadProject","inject","SpinnerService","ExecCommand","example","workspace","exec","LazyCurrentWorkspace","aliases","LoadWorkspace","GroupCommand","taskExpr","expr","parse","join","buildTask","roots","TaskExprService","LONG_ATTRIBUTES","JSON_ATTRIBUTES","DEFAULT_ATTRIBUTES","EXTRACTORS","name","version","json","manifest","chalk","root","cwd","slug","fixDefaultExport","slugify","ListCommand","InkCommand","string","choices","withScript","push","attrs","length","long","data","attr","buildExtractor","printJson","d","path","process","List","items","headers","RunCommand","logger","error","Logger","TreeCommand","WorkspaceTree","CorePlugin","Plugin","commands"],"sourceRoot":""}
|
package/dist/828.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const id=828;export const ids=[828];export const modules={236:(e,t,r)=>{r.d(t,{F:()=>d});var s=r(2786),n=r(3410),o=r(6675),i=r(2429),a=r(5099),c=r(5960),l=r(9921);function h(e,t){return function(r,s){t(r,s,e)}}let d=class{constructor(e,t){this.manager=e,this.logger=t}command(e,t,r={}){const s={logger:this.logger,...r},o=new n.SpawnTask("git",[e,...t],{command:e,hidden:!0},s);return o.on("stream",(({data:e})=>s.logger.debug(e.toString("utf-8")))),this.manager.add(o),o}branch(e,t){return this.command("branch",e,t)}diff(e,t){return this.command("diff",e,t)}tag(e,t){return this.command("tag",e,t)}isAffected(e,t=[],r){return new Promise(((n,o)=>{const i=this.diff(["--quiet",e,"--",...t],r);(0,s.once$)(i,"status.done",(()=>n(!1))),(0,s.once$)(i,"status.failed",(()=>{i.exitCode?n(!0):o(new Error(`Task ${i.name} failed`))}))}))}async listBranches(e=[],t){const r=this.branch(["-l",...e],t),s=[];for await(const e of(0,c.F)(r,"stdout"))s.push(e.replace(/^[ *] /,""));return s}async listTags(e=[],t){const r=this.tag(["-l",...e],t),s=[];for await(const e of(0,c.F)(r,"stdout"))s.push(e);return s}};d=function(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}([(0,l.t)(),h(0,(0,o.inject)(a.N)),h(1,(0,o.inject)(i.Y))],d)},8652:(e,t,r)=>{r.d(t,{L:()=>a});var s=r(236),n=r(466),o=r(2429);function i(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}class a{constructor(e,t,r){this.format=e,this.fallback=t,this.sort=r}async _formatRevision(e){const t=this._logger.child({label:e.name});let r=this.format;r=r.replace(/(?<!\\)((?:\\\\)*)%name/g,`$1${e.name}`),r=r.replace(/\\(.)/g,"$1");const s=this.sort?["--sort",this.sort]:[];if(r.includes("*")){const n=await this._git.listBranches([...s,r],{cwd:e.cwd,logger:t});n.length>0&&(r=n[n.length-1])}if(r.includes("*")){const n=await this._git.listTags([...s,r],{cwd:e.cwd,logger:t});n.length>0&&(r=n[n.length-1])}return r!==this.format&&t.verbose`Resolved ${this.format} into ${r}`,r.includes("*")?(t.warn`No revision found matching ${r}, using fallback ${this.fallback}`,this.fallback):r}async test(e){const t=await this._formatRevision(e);return await e.isAffected(t)}}i([(0,n.yT)(o.Y)],a.prototype,"_logger",void 0),i([(0,n.yT)(s.F)],a.prototype,"_git",void 0)},2999:(e,t,r)=>{r.d(t,{B:()=>s});class s{add(e){this._filters.push(e)}async _test(e){for(const t of this._filters)if(!await t.test(e))return!1;return!0}async*filter(e){for await(const t of e)await this._test(t)&&(yield t)}constructor(){this._filters=[]}}},307:(e,t,r)=>{r.d(t,{N:()=>s});class s{constructor(e){this.value=e}test(e){return(e.manifest.private??!1)===this.value}}},4203:(e,t,r)=>{r.d(t,{f:()=>s});class s{constructor(e){this.scripts=e}test(e){const t=Object.keys(e.manifest.scripts||{});return this.scripts.some((e=>t.includes(e)))}}},8754:(e,t,r)=>{r.d(t,{_:()=>f,r:()=>p});var s=r(6675),n=r(6156),o=r(3565),i=r(9300),a=r(466),c=r(1632),l=r(7672),h=r(9808);function d(e,t){return function(r,s){t(r,s,e)}}let p=class{constructor(e,t,r){this.spinner=e,this.projects=t,this.context=r}builder(e){return e.option("project",{alias:"p",type:"string",description:"Project root directory"}).option("package-manager",{choices:["yarn","npm"],type:"string",description:"Force package manager"})}async handler(e){if(!this.context.project||e.project)try{this.spinner.spin("Loading project ..."),e.project=await this.projects.searchProjectRoot(e.project??process.cwd()),this.context.project=this.projects.getProject(e.project,{packageManager:e.packageManager})}finally{this.spinner.stop()}else e.project=this.context.project.root}};function f(){return(0,a.oV)(l.I,i.W)}p=function(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}([(0,c.d)(),d(0,(0,s.inject)(o.V)),d(1,(0,s.inject)(h.Z)),d(2,(0,s.inject)(n.O))],p),a.nC.bind(l.I).toDynamicValue((({container:e})=>{const t=e.get(n.O).project;if(!t)throw new Error("Cannot inject current project, it not yet defined");return t})).whenTargetNamed(i.W)},2419:(e,t,r)=>{r.d(t,{I:()=>g,S:()=>u});var s=r(6675),n=r(6156),o=r(3565),i=r(9300),a=r(466),c=r(1632),l=r(8410),h=r(6505),d=r(8754);function p(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}function f(e,t){return function(r,s){t(r,s,e)}}let u=class{constructor(e,t){this.spinner=e,this.context=t}builder(e){return e.option("workspace",{alias:"w",type:"string",desc:"Workspace to use"})}async handler(e){try{this.spinner.spin(`Loading "${e.workspace||"."}" workspace ...`);let t=this.context.workspace??null;if(t&&!e.workspace||(t=e.workspace?await this.project.workspace(e.workspace):process.cwd().startsWith(this.project.root)?await this.project.currentWorkspace():await this.project.mainWorkspace()),!t)throw this.spinner.failed(`Workspace "${e.workspace||"."}" not found`),new h.T(1,"Workspace not found");this.context.workspace=t}finally{this.spinner.stop()}}};function g(){return(0,a.oV)(l.j,i.W)}p([(0,d._)()],u.prototype,"project",void 0),u=p([(0,c.d)(),f(0,(0,s.inject)(o.V)),f(1,(0,s.inject)(n.O))],u),a.nC.bind(l.j).toDynamicValue((({container:e})=>{const t=e.get(n.O).workspace;if(!t)throw new Error("Cannot inject current workspace, it not yet defined");return t})).whenTargetNamed(i.W)},5756:(e,t,r)=>{r.d(t,{S:()=>i,p:()=>o});var s=r(6675),n=r(3617);class o extends s.ContainerModule{constructor(e,t){super(((...e)=>{for(const t of this.commands)(0,n.JH)(t)(...e)})),this.name=e,this.commands=t,this.id=(0,s.id)()}}function i(e){return t=>{const r=e.name??t.name,s=new o(r,e.commands);(0,n.IY)(t,s)}}},9808:(e,t,r)=>{r.d(t,{Z:()=>p});var s=r(6675),n=r(3977),o=r.n(n),i=r(9411),a=r.n(i),c=r(2429),l=r(9921),h=r(7672);const d=["package-lock.json","yarn.lock"];let p=class{constructor(e){this._cache=new Map,this._roots=new Map,this._logger=e.child({label:"projects"})}async isProjectRoot(e){const t=await o().readdir(e);return{hasManifest:t.includes("package.json"),hasLockFile:d.some((e=>t.includes(e)))}}async searchProjectRoot(e){const t=[];let r=!1,s=e=a().resolve(e),n=e,o=n;do{const e=this._roots.get(n);if(e){s=e,r=!0;break}const{hasManifest:i,hasLockFile:c}=await this.isProjectRoot(n);if(t.push(n),i&&(s=n,r=!0),c)break;o=n,n=a().dirname(n)}while(o!==n);for(const e of t)e.startsWith(s)&&this._roots.set(e,s);return r?this._logger.debug`Project root found at #cwd:${s}`:this._logger.debug`Project root not found, keeping #cwd:${s}`,s}getProject(e,t){let r=this._cache.get(e);return r||(r=new h.I(e,this._logger,t),this._cache.set(e,r)),r}};var f;p=function(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}([(0,l.t)(),(0,f=(0,s.inject)(c.Y),function(e,t){f(e,t,0)})],p)},7672:(e,t,r)=>{r.d(t,{I:()=>p});var s=r(467),n=r(6675),o=r(3977),i=r.n(o),a=r(9411),c=r.n(a),l=r(5588),h=r(865),d=r(8410);let p=class{constructor(e,t,r={}){this._root=e,this._logger=t,this._names=new Map,this._workspaces=new Map,this._isFullyLoaded=!1,this._lock=new s.Lock,r.packageManager&&(this._logger.debug`Forced use of ${r.packageManager} in #cwd:${this.root}`,this._packageManager=r.packageManager)}async _loadManifest(e){const t=c().resolve(this.root,e,"package.json"),r=c().relative(this.root,c().dirname(t)),s=this._logger.child({label:r?`project@${r}`:"project"});s.verbose("Loading package.json ...");const n=await i().readFile(t,"utf-8"),o=JSON.parse(n);return(0,l.default)(o,(e=>s.verbose(e))),o}async _loadWorkspace(e){return await this._lock.with((async()=>{let t=this._workspaces.get(e);if(!t){const r=await this._loadManifest(e);t=new d.j(e,r,this),this._workspaces.set(e,t),this._names.set(t.name,t)}return t}))}async packageManager(){if(!this._packageManager){const e=await i().readdir(this.root);e.includes("yarn.lock")?(this._logger.debug`Detected yarn in #cwd:${this.root}`,this._packageManager="yarn"):e.includes("package-lock.json")?(this._logger.debug`Detected npm in #cwd:${this.root}`,this._packageManager="npm"):(this._logger.debug`No package manager recognized in #cwd:${this.root}, defaults to npm`,this._packageManager="npm")}return this._packageManager}async mainWorkspace(){if(!this._mainWorkspace){const e=await this._loadManifest(".");this._mainWorkspace=new d.j(".",e,this),this._names.set(this._mainWorkspace.name,this._mainWorkspace)}return this._mainWorkspace}async currentWorkspace(e=process.cwd()){let t=null;e=c().resolve(e);for await(const r of this.workspaces())if(e.startsWith(r.cwd)&&(t=r,r.cwd!==this.root))return r;return t}async*workspaces(){const e=await this.mainWorkspace();if(yield e,this._isFullyLoaded)for(const t of this._names.values())t.name!==e.name&&(yield t);else{const{workspaces:t=[]}=e.manifest;for(const e of t)for(const t of await(0,h.default)(e,{cwd:this.root}))try{const e=c().resolve(this.root,t);(await i().stat(e)).isDirectory()&&(yield await this._loadWorkspace(t))}catch(e){if("ENOENT"===e.code)continue;throw e}this._isFullyLoaded=!0}}async workspace(e){if(!e){const e=c().relative(this.root,process.cwd());return this._loadWorkspace(e)}const t=this._names.get(e);if(t)return t;if(!this._isFullyLoaded){for await(const t of this.workspaces())if(t.name===e)return t;this._isFullyLoaded=!0}return null}get root(){return c().resolve(this._root)}};p=function(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}([(0,n.injectable)()],p)},8410:(e,t,r)=>{r.d(t,{j:()=>u});var s=r(6675),n=r(9411),o=r.n(n),i=r(3999),a=r(236),c=r(466),l=r(2429),h=r(4244),d=r(6839),p=r(5960);function f(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}let u=class{constructor(e,t,r){this._cwd=e,this.manifest=t,this.project=r,this._affectedCache=new Map,this._tasks=new Map;const s=c.nC.get(l.Y);this._logger=s.child({label:this.manifest.name})}_satisfies(e,t){return t.startsWith("file:")?o().resolve(e.cwd,t.substring(5))===this.cwd:(t.startsWith("workspace:")&&(t=t.substring(10)),!this.version||(0,i.satisfies)(this.version,t))}async _buildDependencies(e,t){const r=[];switch(t.buildDeps??"all"){case"all":r.unshift(this.devDependencies());case"prod":r.unshift(this.dependencies())}for await(const s of(0,p.$)(...r)){const r=await s.build(t);r&&e.dependsOn(r)}}async _isAffected(e){if(await this._git.isAffected(e,[this.cwd],{cwd:this.project.root,logger:this._logger}))return!0;const t=[];for await(const r of(0,p.$)(this.dependencies(),this.devDependencies()))t.push(r.isAffected(e));return(await Promise.all(t)).some((e=>e))}async isAffected(e){let t=this._affectedCache.get(e);return t||(t=this._isAffected(e),this._affectedCache.set(e,t)),await t}async*_loadDependencies(e,t){for(const[r,s]of Object.entries(e)){const e=await this.project.workspace(r);e&&(e._satisfies(this,s)?yield e:this._logger.verbose`Ignoring ${t} ${e.reference} as it does not match requirement ${s}`)}}async*dependencies(){if(this.manifest.dependencies)for await(const e of this._loadDependencies(this.manifest.dependencies,"dependency"))yield e}async*devDependencies(){if(this.manifest.devDependencies)for await(const e of this._loadDependencies(this.manifest.devDependencies,"devDependency"))yield e}async exec(e,t=[],r={}){const s=await this.project.packageManager(),n=new h.F(this,e,t,{...r,logger:this._logger.child({label:`${this.name}$${e}`}),superCommand:"yarn"===s?["yarn","exec"]:void 0});return await this._buildDependencies(n,r),n}async run(e,t=[],r={}){if(!this.getScript(e))return null;let s=this._tasks.get(e);return s||(s=new d.s(this,e,t,{...r,logger:this._logger.child({label:`${this.name}#${e}`})}),await s.prepare(),await this._buildDependencies(s,r),this._tasks.set(e,s)),s}async build(e={}){const t=await this.run(e?.buildScript??"build",[],e);return t||this._logger.warn("Will not be built (no build script)"),t}getScript(e){const{scripts:t={}}=this.manifest;return t[e]||null}toJSON(){return{name:this.name,version:this.version,cwd:this.cwd}}get name(){return this.manifest.name}get version(){return this.manifest.version}get reference(){return this.version?`${this.name}@${this.version}`:this.name}get cwd(){return o().resolve(this.project.root,this._cwd)}};f([(0,c.yT)(a.F)],u.prototype,"_git",void 0),u=f([(0,s.injectable)()],u)},3678:(e,t,r)=>{r.d(t,{P:()=>c});var s=r(3410),n=r(6675),o=r(2535),i=r(2429),a=r(9921);let c=class{static isTaskNode(e){return"script"in e}constructor(e){this._logger=e}_lexer(){return o.default.states({task:{lparen:"(",whitespace:/[ \t]+/,string:[{match:/[:a-zA-Z0-9]+/,push:"operator"},{match:/'(?:\\['\\]|[^\n'\\])+'/,push:"operator",value:e=>e.slice(1,-1).replace(/\\(['\\])/g,"$1")},{match:/"(?:\\["\\]|[^\n"\\])+"/,push:"operator",value:e=>e.slice(1,-1).replace(/\\(["\\])/g,"$1")}]},operator:{whitespace:/[ \t]+/,rparen:")",operator:{match:["->","//"],pop:1}}})}_nextNode(e,t=0){let r=null;for(const s of e){if("whitespace"===s.type)continue;if("rparen"===s.type)break;if("operator"===s.type){const t=s.value;if(r){if(c.isTaskNode(r)){r={operator:t,tasks:[r]};continue}r.operator!==t&&(r={operator:t,tasks:[r]});continue}throw new Error(e.formatError(s,"Unexpected operator"))}let n;if("string"===s.type)n={script:s.value};else{if("lparen"!==s.type)throw new Error(e.formatError(s,"Unexpected token"));{const r=this._nextNode(e,t+1);if(!r)throw new Error(e.formatError(s,"Empty group found"));n=r}}if(r){if(c.isTaskNode(r))throw new Error(e.formatError(s,"Unexpected token, expected an operator"));r.tasks.push(n)}else r=n}return r}parse(e){const t=this._lexer().reset(e),r={roots:[]};for(;;){const e=this._nextNode(t);if(!e)break;r.roots.push(e)}return r}async buildTask(e,t,r){if(c.isTaskNode(e)){const s=await t.run(e.script,[],r);if(!s)throw new Error(`Workspace ${t.name} have no ${e.script} script`);return s}{let n;n="//"===e.operator?new s.ParallelGroup("In parallel",{},{logger:this._logger}):new s.SequenceGroup("In sequence",{},{logger:this._logger});for(const s of e.tasks)n.add(await this.buildTask(s,t,r));return n}}};var l;c=function(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}([(0,a.t)(),(0,l=(0,n.inject)(i.Y),function(e,t){l(e,t,0)})],c)},6238:(e,t,r)=>{r.d(t,{Z:()=>a});var s=r(832),n=r(9149),o=r(810);const i=e=>({color:e?"blue":""});function a(e){const{workspace:t,dev:r=!1,level:c=""}=e,[l,h]=(0,o.useState)([]);return(0,o.useEffect)((()=>{(async()=>{const e=[];for await(const r of t.dependencies())e.push([r,null]);for await(const r of t.devDependencies())e.push([r,!0]);h(e)})()}),[t]),(0,s.jsxs)(n.Text,{children:[(0,s.jsx)(n.Text,{...i(r),children:t.name}),t.version&&(0,s.jsxs)(n.Text,{color:"grey",children:["@",t.version]}),l.length>0&&(0,s.jsx)(n.Newline,{}),l.map((([e,t],o)=>(0,s.jsxs)(n.Text,{children:[c,(0,s.jsxs)(n.Text,{...i(r),children:[o===l.length-1?"└":"├","─"," "]}),(0,s.jsx)(a,{workspace:e,dev:t??r,level:(0,s.jsxs)(s.Fragment,{children:[c,(0,s.jsxs)(n.Text,{...i(r),children:[o===l.length-1?" ":"│"," "]})]})}),o<l.length-1&&(0,s.jsx)(n.Newline,{})]},e.name)))]})}},5960:(e,t,r)=>{r.d(t,{$:()=>n,F:()=>o});var s=r(2786);async function*n(...e){for(const t of e)yield*t}async function*o(e,t){const r=(0,s.off$)();(0,s.once$)(e,"completed",r);let n="";try{for await(const o of(0,s.iterate$)(e,`stream.${t}`,{off:r})){const e=(n+o.data.toString("utf-8")).split(/\r?\n/);n=e.pop()??"";for(const t of e)yield t}}catch(e){if("Unsubscribed !"!==e.message)throw e;n&&(yield n)}}}};
|
|
1
|
+
export const id=828;export const ids=[828];export const modules={236:(e,t,r)=>{r.d(t,{F:()=>d});var s=r(2786),n=r(3410),o=r(6675),i=r(2429),a=r(5099),c=r(5960),l=r(9921);function h(e,t){return function(r,s){t(r,s,e)}}let d=class{constructor(e,t){this.manager=e,this.logger=t}command(e,t,r={}){const s={logger:this.logger,...r},o=new n.SpawnTask("git",[e,...t],{command:e,hidden:!0},s);return o.on("stream",(({data:e})=>s.logger.debug(e.toString("utf-8")))),this.manager.add(o),o}branch(e,t){return this.command("branch",e,t)}diff(e,t){return this.command("diff",e,t)}tag(e,t){return this.command("tag",e,t)}isAffected(e,t=[],r){return new Promise(((n,o)=>{const i=this.diff(["--quiet",e,"--",...t],r);(0,s.once$)(i,"status.done",(()=>n(!1))),(0,s.once$)(i,"status.failed",(()=>{i.exitCode?n(!0):o(new Error(`Task ${i.name} failed`))}))}))}async listBranches(e=[],t){const r=this.branch(["-l",...e],t),s=[];for await(const e of(0,c.F)(r,"stdout"))s.push(e.replace(/^[ *] /,""));return s}async listTags(e=[],t){const r=this.tag(["-l",...e],t),s=[];for await(const e of(0,c.F)(r,"stdout"))s.push(e);return s}};d=function(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}([(0,l.t)(),h(0,(0,o.inject)(a.N)),h(1,(0,o.inject)(i.Y))],d)},8652:(e,t,r)=>{r.d(t,{L:()=>a});var s=r(236),n=r(466),o=r(2429);function i(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}class a{constructor(e,t,r){this.format=e,this.fallback=t,this.sort=r}async _formatRevision(e){const t=this._logger.child({label:e.name});let r=this.format;r=r.replace(/(?<!\\)((?:\\\\)*)%name/g,`$1${e.name}`),r=r.replace(/\\(.)/g,"$1");const s=this.sort?["--sort",this.sort]:[];if(r.includes("*")){const n=await this._git.listBranches([...s,r],{cwd:e.cwd,logger:t});n.length>0&&(r=n[n.length-1])}if(r.includes("*")){const n=await this._git.listTags([...s,r],{cwd:e.cwd,logger:t});n.length>0&&(r=n[n.length-1])}return r!==this.format&&t.verbose`Resolved ${this.format} into ${r}`,r.includes("*")?(t.warn`No revision found matching ${r}, using fallback ${this.fallback}`,this.fallback):r}async test(e){const t=await this._formatRevision(e);return await e.isAffected(t)}}i([(0,n.yT)(o.Y)],a.prototype,"_logger",void 0),i([(0,n.yT)(s.F)],a.prototype,"_git",void 0)},2999:(e,t,r)=>{r.d(t,{B:()=>s});class s{add(e){this._filters.push(e)}async _test(e){for(const t of this._filters)if(!await t.test(e))return!1;return!0}async*filter(e){for await(const t of e)await this._test(t)&&(yield t)}constructor(){this._filters=[]}}},307:(e,t,r)=>{r.d(t,{N:()=>s});class s{constructor(e){this.value=e}test(e){return(e.manifest.private??!1)===this.value}}},4203:(e,t,r)=>{r.d(t,{f:()=>s});class s{constructor(e){this.scripts=e}test(e){const t=Object.keys(e.manifest.scripts||{});return this.scripts.some((e=>t.includes(e)))}}},8754:(e,t,r)=>{r.d(t,{_:()=>f,r:()=>p});var s=r(6675),n=r(6156),o=r(3565),i=r(9300),a=r(466),c=r(1632),l=r(7672),h=r(9808);function d(e,t){return function(r,s){t(r,s,e)}}let p=class{constructor(e,t,r){this.spinner=e,this.projects=t,this.context=r}builder(e){return e.option("project",{alias:"p",type:"string",description:"Project root directory"}).option("package-manager",{choices:["yarn","npm"],type:"string",description:"Force package manager"})}async handler(e){if(!this.context.project||e.project)try{this.spinner.spin("Loading project ..."),e.project=await this.projects.searchProjectRoot(e.project??process.cwd()),this.context.project=this.projects.getProject(e.project,{packageManager:e.packageManager})}finally{this.spinner.stop()}else e.project=this.context.project.root}};function f(){return(0,a.oV)(l.I,i.W)}p=function(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}([(0,c.d)(),d(0,(0,s.inject)(o.V)),d(1,(0,s.inject)(h.Z)),d(2,(0,s.inject)(n.O))],p),a.nC.bind(l.I).toDynamicValue((({container:e})=>{const t=e.get(n.O).project;if(!t)throw new Error("Cannot inject current project, it not yet defined");return t})).whenTargetNamed(i.W)},2419:(e,t,r)=>{r.d(t,{I:()=>g,S:()=>u});var s=r(6675),n=r(6156),o=r(3565),i=r(9300),a=r(466),c=r(1632),l=r(8410),h=r(6505),d=r(8754);function p(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}function f(e,t){return function(r,s){t(r,s,e)}}let u=class{constructor(e,t){this.spinner=e,this.context=t}builder(e){return e.option("workspace",{alias:"w",type:"string",desc:"Workspace to use"})}async handler(e){try{this.spinner.spin(`Loading "${e.workspace||"."}" workspace ...`);let t=this.context.workspace??null;if(t&&!e.workspace||(t=e.workspace?await this.project.workspace(e.workspace):process.cwd().startsWith(this.project.root)?await this.project.currentWorkspace():await this.project.mainWorkspace()),!t)throw this.spinner.failed(`Workspace "${e.workspace||"."}" not found`),new h.T(1,"Workspace not found");this.context.workspace=t}finally{this.spinner.stop()}}};function g(){return(0,a.oV)(l.j,i.W)}p([(0,d._)()],u.prototype,"project",void 0),u=p([(0,c.d)(),f(0,(0,s.inject)(o.V)),f(1,(0,s.inject)(n.O))],u),a.nC.bind(l.j).toDynamicValue((({container:e})=>{const t=e.get(n.O).workspace;if(!t)throw new Error("Cannot inject current workspace, it not yet defined");return t})).whenTargetNamed(i.W)},5756:(e,t,r)=>{r.d(t,{S:()=>i,p:()=>o});var s=r(6675),n=r(3617);class o extends s.ContainerModule{constructor(e,t){super(((...e)=>{for(const t of this.commands)(0,n.JH)(t)(...e)})),this.name=e,this.commands=t,this.id=(0,s.id)()}}function i(e){return t=>{const r=e.name??t.name,s=new o(r,e.commands);(0,n.IY)(t,s)}}},9808:(e,t,r)=>{r.d(t,{Z:()=>p});var s=r(6675),n=r(3977),o=r.n(n),i=r(9411),a=r.n(i),c=r(2429),l=r(9921),h=r(7672);const d=["package-lock.json","yarn.lock"];let p=class{constructor(e){this._cache=new Map,this._roots=new Map,this._logger=e.child({label:"projects"})}async isProjectRoot(e){const t=await o().readdir(e);return{hasManifest:t.includes("package.json"),hasLockFile:d.some((e=>t.includes(e)))}}async searchProjectRoot(e){const t=[];let r=!1,s=e=a().resolve(e),n=e,o=n;do{const e=this._roots.get(n);if(e){s=e,r=!0;break}const{hasManifest:i,hasLockFile:c}=await this.isProjectRoot(n);if(t.push(n),i&&(s=n,r=!0),c)break;o=n,n=a().dirname(n)}while(o!==n);for(const e of t)e.startsWith(s)&&this._roots.set(e,s);return r?this._logger.debug`Project root found at #cwd:${s}`:this._logger.debug`Project root not found, keeping #cwd:${s}`,s}getProject(e,t){let r=this._cache.get(e);return r||(r=new h.I(e,this._logger,t),this._cache.set(e,r)),r}};var f;p=function(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}([(0,l.t)(),(0,f=(0,s.inject)(c.Y),function(e,t){f(e,t,0)})],p)},7672:(e,t,r)=>{r.d(t,{I:()=>p});var s=r(467),n=r(6675),o=r(3977),i=r.n(o),a=r(9411),c=r.n(a),l=r(5588),h=r(865),d=r(8410);let p=class{constructor(e,t,r={}){this._root=e,this._logger=t,this._names=new Map,this._workspaces=new Map,this._isFullyLoaded=!1,this._lock=new s.Lock,r.packageManager&&(this._logger.debug`Forced use of ${r.packageManager} in #cwd:${this.root}`,this._packageManager=r.packageManager)}async _loadManifest(e){const t=c().resolve(this.root,e,"package.json"),r=c().relative(this.root,c().dirname(t)),s=this._logger.child({label:r?`project@${r}`:"project"});s.debug("Loading package.json ...");const n=await i().readFile(t,"utf-8"),o=JSON.parse(n);return(0,l.default)(o,(e=>s.verbose(e))),o}async _loadWorkspace(e){return await this._lock.with((async()=>{let t=this._workspaces.get(e);if(!t){const r=await this._loadManifest(e);t=new d.j(e,r,this),this._workspaces.set(e,t),this._names.set(t.name,t)}return t}))}async packageManager(){if(!this._packageManager){const e=await i().readdir(this.root);e.includes("yarn.lock")?(this._logger.debug`Detected yarn in #cwd:${this.root}`,this._packageManager="yarn"):e.includes("package-lock.json")?(this._logger.debug`Detected npm in #cwd:${this.root}`,this._packageManager="npm"):(this._logger.debug`No package manager recognized in #cwd:${this.root}, defaults to npm`,this._packageManager="npm")}return this._packageManager}async mainWorkspace(){if(!this._mainWorkspace){const e=await this._loadManifest(".");this._mainWorkspace=new d.j(".",e,this),this._names.set(this._mainWorkspace.name,this._mainWorkspace)}return this._mainWorkspace}async currentWorkspace(e=process.cwd()){let t=null;e=c().resolve(e);for await(const r of this.workspaces())if(e.startsWith(r.cwd)&&(t=r,r.cwd!==this.root))return r;return t}async*workspaces(){const e=await this.mainWorkspace();if(yield e,this._isFullyLoaded)for(const t of this._names.values())t.name!==e.name&&(yield t);else{const{workspaces:t=[]}=e.manifest;for(const e of t)for(const t of await(0,h.default)(e,{cwd:this.root}))try{const e=c().resolve(this.root,t);(await i().stat(e)).isDirectory()&&(yield await this._loadWorkspace(t))}catch(e){if("ENOENT"===e.code)continue;throw e}this._isFullyLoaded=!0}}async workspace(e){if(!e){const e=c().relative(this.root,process.cwd());return this._loadWorkspace(e)}const t=this._names.get(e);if(t)return t;if(!this._isFullyLoaded){for await(const t of this.workspaces())if(t.name===e)return t;this._isFullyLoaded=!0}return null}get root(){return c().resolve(this._root)}};p=function(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}([(0,n.injectable)()],p)},8410:(e,t,r)=>{r.d(t,{j:()=>u});var s=r(6675),n=r(9411),o=r.n(n),i=r(3999),a=r(236),c=r(466),l=r(2429),h=r(4244),d=r(6839),p=r(5960);function f(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}let u=class{constructor(e,t,r){this._cwd=e,this.manifest=t,this.project=r,this._affectedCache=new Map,this._tasks=new Map;const s=c.nC.get(l.Y);this._logger=s.child({label:this.manifest.name})}_satisfies(e,t){return t.startsWith("file:")?o().resolve(e.cwd,t.substring(5))===this.cwd:(t.startsWith("workspace:")&&(t=t.substring(10)),!this.version||(0,i.satisfies)(this.version,t))}async _buildDependencies(e,t){const r=[];switch(t.buildDeps??"all"){case"all":r.unshift(this.devDependencies());case"prod":r.unshift(this.dependencies())}for await(const s of(0,p.$)(...r)){const r=await s.build(t);r&&e.dependsOn(r)}}async _isAffected(e){if(await this._git.isAffected(e,[this.cwd],{cwd:this.project.root,logger:this._logger}))return!0;const t=[];for await(const r of(0,p.$)(this.dependencies(),this.devDependencies()))t.push(r.isAffected(e));return(await Promise.all(t)).some((e=>e))}async isAffected(e){let t=this._affectedCache.get(e);return t||(t=this._isAffected(e),this._affectedCache.set(e,t)),await t}async*_loadDependencies(e,t){for(const[r,s]of Object.entries(e)){const e=await this.project.workspace(r);e&&(e._satisfies(this,s)?yield e:this._logger.warn`Ignoring ${t} ${e.reference} as it does not match requirement ${s}`)}}async*dependencies(){if(this.manifest.dependencies)for await(const e of this._loadDependencies(this.manifest.dependencies,"dependency"))yield e}async*devDependencies(){if(this.manifest.devDependencies)for await(const e of this._loadDependencies(this.manifest.devDependencies,"devDependency"))yield e}async exec(e,t=[],r={}){const s=await this.project.packageManager(),n=new h.F(this,e,t,{...r,logger:this._logger.child({label:`${this.name}$${e}`}),superCommand:"yarn"===s?["yarn","exec"]:void 0});return await this._buildDependencies(n,r),n}async run(e,t=[],r={}){if(!this.getScript(e))return null;let s=this._tasks.get(e);return s||(s=new d.s(this,e,t,{...r,logger:this._logger.child({label:`${this.name}#${e}`})}),await s.prepare(),await this._buildDependencies(s,r),this._tasks.set(e,s)),s}async build(e={}){const t=await this.run(e?.buildScript??"build",[],e);return t||this._logger.warn("Will not be built (no build script)"),t}getScript(e){const{scripts:t={}}=this.manifest;return t[e]||null}toJSON(){return{name:this.name,version:this.version,cwd:this.cwd}}get name(){return this.manifest.name}get version(){return this.manifest.version}get reference(){return this.version?`${this.name}@${this.version}`:this.name}get cwd(){return o().resolve(this.project.root,this._cwd)}};f([(0,c.yT)(a.F)],u.prototype,"_git",void 0),u=f([(0,s.injectable)()],u)},3678:(e,t,r)=>{r.d(t,{P:()=>c});var s=r(3410),n=r(6675),o=r(2535),i=r(2429),a=r(9921);let c=class{static isTaskNode(e){return"script"in e}constructor(e){this._logger=e}_lexer(){return o.default.states({task:{lparen:"(",whitespace:/[ \t]+/,string:[{match:/[:a-zA-Z0-9]+/,push:"operator"},{match:/'(?:\\['\\]|[^\n'\\])+'/,push:"operator",value:e=>e.slice(1,-1).replace(/\\(['\\])/g,"$1")},{match:/"(?:\\["\\]|[^\n"\\])+"/,push:"operator",value:e=>e.slice(1,-1).replace(/\\(["\\])/g,"$1")}]},operator:{whitespace:/[ \t]+/,rparen:")",operator:{match:["->","//"],pop:1}}})}_nextNode(e,t=0){let r=null;for(const s of e){if("whitespace"===s.type)continue;if("rparen"===s.type)break;if("operator"===s.type){const t=s.value;if(r){if(c.isTaskNode(r)){r={operator:t,tasks:[r]};continue}r.operator!==t&&(r={operator:t,tasks:[r]});continue}throw new Error(e.formatError(s,"Unexpected operator"))}let n;if("string"===s.type)n={script:s.value};else{if("lparen"!==s.type)throw new Error(e.formatError(s,"Unexpected token"));{const r=this._nextNode(e,t+1);if(!r)throw new Error(e.formatError(s,"Empty group found"));n=r}}if(r){if(c.isTaskNode(r))throw new Error(e.formatError(s,"Unexpected token, expected an operator"));r.tasks.push(n)}else r=n}return r}parse(e){const t=this._lexer().reset(e),r={roots:[]};for(;;){const e=this._nextNode(t);if(!e)break;r.roots.push(e)}return r}async buildTask(e,t,r){if(c.isTaskNode(e)){const s=await t.run(e.script,[],r);if(!s)throw new Error(`Workspace ${t.name} have no ${e.script} script`);return s}{let n;n="//"===e.operator?new s.ParallelGroup("In parallel",{},{logger:this._logger}):new s.SequenceGroup("In sequence",{},{logger:this._logger});for(const s of e.tasks)n.add(await this.buildTask(s,t,r));return n}}};var l;c=function(e,t,r,s){var n,o=arguments.length,i=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(i=(o<3?n(i):o>3?n(t,r,i):n(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i}([(0,a.t)(),(0,l=(0,n.inject)(i.Y),function(e,t){l(e,t,0)})],c)},6238:(e,t,r)=>{r.d(t,{Z:()=>a});var s=r(832),n=r(9149),o=r(810);const i=e=>({color:e?"blue":""});function a(e){const{workspace:t,dev:r=!1,level:c=""}=e,[l,h]=(0,o.useState)([]);return(0,o.useEffect)((()=>{(async()=>{const e=[];for await(const r of t.dependencies())e.push([r,null]);for await(const r of t.devDependencies())e.push([r,!0]);h(e)})()}),[t]),(0,s.jsxs)(n.Text,{children:[(0,s.jsx)(n.Text,{...i(r),children:t.name}),t.version&&(0,s.jsxs)(n.Text,{color:"grey",children:["@",t.version]}),l.length>0&&(0,s.jsx)(n.Newline,{}),l.map((([e,t],o)=>(0,s.jsxs)(n.Text,{children:[c,(0,s.jsxs)(n.Text,{...i(r),children:[o===l.length-1?"└":"├","─"," "]}),(0,s.jsx)(a,{workspace:e,dev:t??r,level:(0,s.jsxs)(s.Fragment,{children:[c,(0,s.jsxs)(n.Text,{...i(r),children:[o===l.length-1?" ":"│"," "]})]})}),o<l.length-1&&(0,s.jsx)(n.Newline,{})]},e.name)))]})}},5960:(e,t,r)=>{r.d(t,{$:()=>n,F:()=>o});var s=r(2786);async function*n(...e){for(const t of e)yield*t}async function*o(e,t){const r=(0,s.off$)();(0,s.once$)(e,"completed",r);let n="";try{for await(const o of(0,s.iterate$)(e,`stream.${t}`,{off:r})){const e=(n+o.data.toString("utf-8")).split(/\r?\n/);n=e.pop()??"";for(const t of e)yield t}}catch(e){if("Unsubscribed !"!==e.message)throw e;n&&(yield n)}}}};
|
|
2
2
|
//# sourceMappingURL=828.mjs.map
|
package/dist/828.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"828.mjs","mappings":"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","sources":["webpack://@jujulego/jill/./src/commons/git.service.ts","webpack://@jujulego/jill/./src/filters/affected.filter.ts","webpack://@jujulego/jill/./src/filters/pipeline.ts","webpack://@jujulego/jill/./src/filters/private.filter.ts","webpack://@jujulego/jill/./src/filters/scripts.filter.ts","webpack://@jujulego/jill/./src/middlewares/load-project.ts","webpack://@jujulego/jill/./src/middlewares/load-workspace.ts","webpack://@jujulego/jill/./src/modules/plugin.ts","webpack://@jujulego/jill/./src/project/project.repository.ts","webpack://@jujulego/jill/./src/project/project.ts","webpack://@jujulego/jill/./src/project/workspace.ts","webpack://@jujulego/jill/./src/tasks/task-expr.service.ts","webpack://@jujulego/jill/./src/ui/workspace-tree.tsx","webpack://@jujulego/jill/./src/utils/streams.ts"],"sourcesContent":["import { once$ } from '@jujulego/event-tree';\nimport { SpawnTask, type SpawnTaskOptions, TaskContext, type TaskManager } from '@jujulego/tasks';\nimport { inject } from 'inversify';\n\nimport { Logger } from '@/src/commons/logger.service.ts';\nimport { TASK_MANAGER } from '@/src/tasks/task-manager.config.ts';\nimport { streamLines } from '@/src/utils/streams.ts';\nimport { Service } from '@/src/modules/service.ts';\nimport { TaskUIContext } from '@/src/types.ts';\n\n// Types\nexport interface GitContext extends TaskContext, TaskUIContext {\n command: string;\n}\n\n// Git commands\n@Service()\nexport class GitService {\n // Constructor\n constructor(\n @inject(TASK_MANAGER)\n private readonly manager: TaskManager,\n @inject(Logger)\n private readonly logger: Logger,\n ) {}\n\n // Methods\n /**\n * Runs a git command inside a SpawnTask\n *\n * @param cmd\n * @param args\n * @param options\n */\n command(cmd: string, args: string[], options: SpawnTaskOptions = {}): SpawnTask<GitContext> {\n const opts = { logger: this.logger, ...options };\n\n // Create task\n const task = new SpawnTask('git', [cmd, ...args], { command: cmd, hidden: true }, opts);\n task.on('stream', ({ data }) => opts.logger.debug(data.toString('utf-8')));\n\n this.manager.add(task);\n\n return task;\n }\n\n /**\n * Runs git branch\n *\n * @param args\n * @param options\n */\n branch(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('branch', args, options);\n }\n\n /**\n * Runs git diff\n *\n * @param args\n * @param options\n */\n diff(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('diff', args, options);\n }\n\n /**\n * Runs git tag\n *\n * @param args\n * @param options\n */\n tag(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('tag', args, options);\n }\n\n /**\n * Uses git diff to detect if given files have been affected since given reference\n *\n * @param reference\n * @param files\n * @param opts\n */\n isAffected(reference: string, files: string[] = [], opts?: SpawnTaskOptions): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const task = this.diff(['--quiet', reference, '--', ...files], opts);\n\n once$(task, 'status.done', () => resolve(false));\n once$(task, 'status.failed', () => {\n if (task.exitCode) {\n resolve(true);\n } else {\n reject(new Error(`Task ${task.name} failed`));\n }\n });\n });\n }\n\n /**\n * List git branches\n *\n * @param args\n * @param opts\n */\n async listBranches(args: string[] = [], opts?: SpawnTaskOptions): Promise<string[]> {\n const task = this.branch(['-l', ...args], opts);\n const result: string[] = [];\n\n for await (const line of streamLines(task, 'stdout')) {\n result.push(line.replace(/^[ *] /, ''));\n }\n\n return result;\n }\n\n /**\n * List git tags\n *\n * @param args\n * @param opts\n */\n async listTags(args: string[] = [], opts?: SpawnTaskOptions): Promise<string[]> {\n const task = this.tag(['-l', ...args], opts);\n const result: string[] = [];\n\n for await (const line of streamLines(task, 'stdout')) {\n result.push(line);\n }\n\n return result;\n }\n}\n","import { GitService } from '@/src/commons/git.service.ts';\nimport { type Workspace } from '@/src/project/workspace.ts';\nimport { lazyInject } from '@/src/inversify.config.ts';\nimport { Logger } from '@/src/commons/logger.service.ts';\n\nimport { type PipelineFilter } from './pipeline.ts';\n\n// Class\nexport class AffectedFilter implements PipelineFilter {\n // Properties\n @lazyInject(Logger)\n private readonly _logger: Logger;\n\n @lazyInject(GitService)\n private readonly _git: GitService;\n\n // Constructor\n constructor(\n readonly format: string,\n readonly fallback: string,\n readonly sort?: string,\n ) {}\n\n // Methods\n private async _formatRevision(wks: Workspace): Promise<string> {\n const logger = this._logger.child({ label: wks.name });\n\n // Format revision\n let result = this.format;\n result = result.replace(/(?<!\\\\)((?:\\\\\\\\)*)%name/g, `$1${wks.name}`);\n result = result.replace(/\\\\(.)/g, '$1');\n\n // Ask git to complete it\n const sortArgs = this.sort ? ['--sort', this.sort] : [];\n\n // - search in branches\n if (result.includes('*')) {\n const branches = await this._git.listBranches([...sortArgs, result], { cwd: wks.cwd, logger: logger });\n\n if (branches.length > 0) {\n result = branches[branches.length - 1];\n }\n }\n\n // - search in tags\n if (result.includes('*')) {\n const tags = await this._git.listTags([...sortArgs, result], { cwd: wks.cwd, logger: logger });\n\n if (tags.length > 0) {\n result = tags[tags.length - 1];\n }\n }\n\n if (result !== this.format) {\n logger.verbose`Resolved ${this.format} into ${result}`;\n }\n\n if (result.includes('*')) {\n logger.warn`No revision found matching ${result}, using fallback ${this.fallback}`;\n\n return this.fallback;\n }\n\n return result;\n }\n\n async test(workspace: Workspace): Promise<boolean> {\n const rev = await this._formatRevision(workspace);\n return await workspace.isAffected(rev);\n }\n}\n","import { type Workspace } from '@/src/project/workspace.ts';\nimport { type Awaitable } from '@/src/types.ts';\n\n// Interface\nexport interface PipelineFilter {\n // Methods\n test(workspace: Workspace): Awaitable<boolean>;\n}\n\n// Class\nexport class Pipeline {\n // Attributes\n private _filters: PipelineFilter[] = [];\n\n // Methods\n add(filter: PipelineFilter): void {\n this._filters.push(filter);\n }\n\n private async _test(workspace: Workspace): Promise<boolean> {\n for (const filter of this._filters) {\n const res = await filter.test(workspace);\n\n if (!res) {\n return false;\n }\n }\n\n return true;\n }\n\n async *filter(workspaces: Iterable<Workspace> | AsyncIterable<Workspace>): AsyncGenerator<Workspace> {\n for await (const wks of workspaces) {\n if (await this._test(wks)) {\n yield wks;\n }\n }\n }\n}\n","import { type Workspace } from '@/src/project/workspace.ts';\n\nimport { type PipelineFilter } from './pipeline.ts';\n\n// Filter\nexport class PrivateFilter implements PipelineFilter {\n // Constructor\n constructor(readonly value: boolean) {}\n\n // Methods\n test(workspace: Workspace): boolean {\n return (workspace.manifest.private ?? false) === this.value;\n }\n}\n","import { type Workspace } from '@/src/project/workspace.ts';\n\nimport { type PipelineFilter } from './pipeline.ts';\n\n// Filter\nexport class ScriptsFilter implements PipelineFilter {\n // Constructor\n constructor(readonly scripts: string[]) {}\n\n // Methods\n test(workspace: Workspace): boolean {\n const scripts = Object.keys(workspace.manifest.scripts || {});\n return this.scripts.some((scr) => scripts.includes(scr));\n }\n}\n","import { inject } from 'inversify';\nimport { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { ContextService } from '@/src/commons/context.service.ts';\nimport { SpinnerService } from '@/src/commons/spinner.service.ts';\nimport { CURRENT } from '@/src/constants.ts';\nimport { container, lazyInjectNamed } from '@/src/inversify.config.ts';\nimport { type IMiddleware, Middleware } from '@/src/modules/middleware.ts';\nimport { Project } from '@/src/project/project.ts';\nimport { ProjectRepository } from '@/src/project/project.repository.ts';\nimport { type PackageManager } from '@/src/project/types.ts';\n\n// Types\nexport interface ILoadProjectArgs {\n project?: string;\n 'package-manager'?: PackageManager;\n}\n\n// Middleware\n@Middleware()\nexport class LoadProject implements IMiddleware<ILoadProjectArgs> {\n // Constructor\n constructor(\n @inject(SpinnerService)\n private readonly spinner: SpinnerService,\n @inject(ProjectRepository)\n private readonly projects: ProjectRepository,\n @inject(ContextService)\n private readonly context: ContextService,\n ) {}\n\n // Methods\n builder(parser: Argv) {\n return parser\n .option('project', {\n alias: 'p',\n type: 'string',\n description: 'Project root directory'\n })\n .option('package-manager', {\n choices: ['yarn', 'npm'] as const,\n type: 'string',\n description: 'Force package manager'\n });\n }\n\n async handler(args: ArgumentsCamelCase<ILoadProjectArgs>): Promise<void> {\n if (!this.context.project || args.project) {\n try {\n this.spinner.spin('Loading project ...');\n\n args.project = await this.projects.searchProjectRoot(args.project ?? process.cwd());\n\n this.context.project = this.projects.getProject(args.project, {\n packageManager: args.packageManager\n });\n } finally {\n this.spinner.stop();\n }\n } else {\n args.project = this.context.project.root;\n }\n }\n}\n\n// Lazy injection\nexport function LazyCurrentProject() {\n return lazyInjectNamed(Project, CURRENT);\n}\n\ncontainer.bind(Project)\n .toDynamicValue(({ container }) => {\n const ctx = container.get(ContextService);\n const prj = ctx.project;\n\n if (!prj) {\n throw new Error('Cannot inject current project, it not yet defined');\n }\n\n return prj;\n })\n .whenTargetNamed(CURRENT);\n","import { inject } from 'inversify';\nimport { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { ContextService } from '@/src/commons/context.service.ts';\nimport { SpinnerService } from '@/src/commons/spinner.service.ts';\nimport { CURRENT } from '@/src/constants.ts';\nimport { container, lazyInjectNamed } from '@/src/inversify.config.ts';\nimport { type IMiddleware, Middleware } from '@/src/modules/middleware.ts';\nimport { type Project } from '@/src/project/project.ts';\nimport { Workspace } from '@/src/project/workspace.ts';\nimport { ExitException } from '@/src/utils/exit.ts';\n\nimport { ILoadProjectArgs, LazyCurrentProject } from './load-project.ts';\n\n// Types\nexport interface ILoadWorkspaceArgs extends ILoadProjectArgs {\n workspace?: string;\n}\n\n// Middleware\n@Middleware()\nexport class LoadWorkspace implements IMiddleware<ILoadWorkspaceArgs> {\n // Lazy injections\n @LazyCurrentProject()\n readonly project: Project;\n\n // Constructor\n constructor(\n @inject(SpinnerService)\n private readonly spinner: SpinnerService,\n @inject(ContextService)\n private readonly context: ContextService,\n ) {}\n\n // Methods\n builder(parser: Argv) {\n return parser\n .option('workspace', {\n alias: 'w',\n type: 'string',\n desc: 'Workspace to use'\n });\n }\n\n async handler(args: ArgumentsCamelCase<ILoadWorkspaceArgs>): Promise<void> {\n try {\n this.spinner.spin(`Loading \"${args.workspace || '.'}\" workspace ...`);\n\n let workspace = this.context.workspace ?? null;\n\n if (!workspace || args.workspace) {\n if (args.workspace) {\n workspace = await this.project.workspace(args.workspace);\n } else if (process.cwd().startsWith(this.project.root)) {\n workspace = await this.project.currentWorkspace();\n } else {\n workspace = await this.project.mainWorkspace();\n }\n }\n\n if (!workspace) {\n this.spinner.failed(`Workspace \"${args.workspace || '.'}\" not found`);\n throw new ExitException(1, 'Workspace not found');\n } else {\n this.context.workspace = workspace;\n }\n } finally {\n this.spinner.stop();\n }\n }\n}\n\n// Decorators\nexport function LazyCurrentWorkspace() {\n return lazyInjectNamed(Workspace, CURRENT);\n}\n\ncontainer.bind(Workspace)\n .toDynamicValue(({ container }) => {\n const ctx = container.get(ContextService);\n const wks = ctx.workspace;\n\n if (!wks) {\n throw new Error('Cannot inject current workspace, it not yet defined');\n }\n\n return wks;\n })\n .whenTargetNamed(CURRENT);\n","import { ContainerModule, id, type interfaces as int } from 'inversify';\n\nimport { type Class, type Type } from '@/src/types.ts';\n\nimport { type ICommand } from './command.ts';\nimport { getRegistry, setModule } from './module.ts';\n\n// Types\nexport interface IPluginOpts {\n readonly name?: string;\n readonly commands: Type<ICommand>[];\n}\n\nexport class PluginModule extends ContainerModule implements IPluginOpts {\n // Attributes\n readonly id = id();\n\n // Constructor\n constructor(\n readonly name: string,\n readonly commands: Type<ICommand>[],\n ) {\n super((...args: Parameters<int.ContainerModuleCallBack>) => {\n for (const command of this.commands) {\n const registry = getRegistry(command);\n registry(...args);\n }\n });\n }\n}\n\n// Decorator\nexport function Plugin(opts: IPluginOpts) {\n return (target: Class) => {\n const name = opts.name ?? target.name;\n const module = new PluginModule(name, opts.commands);\n\n setModule(target, module);\n };\n}\n","import { inject } from 'inversify';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { Logger } from '@/src/commons/logger.service.ts';\nimport { Service } from '@/src/modules/service.ts';\n\nimport { Project, type ProjectOptions } from './project.ts';\n\n// Constants\nconst MANIFEST = 'package.json';\nconst LOCK_FILES = ['package-lock.json', 'yarn.lock'];\n\n// Types\nexport interface IsProjectRoot {\n hasManifest: boolean;\n hasLockFile: boolean;\n}\n\n// Class\n@Service()\nexport class ProjectRepository {\n // Attributes\n private readonly _logger: Logger;\n private readonly _cache = new Map<string, Project>();\n private readonly _roots = new Map<string, string>();\n\n // Constructor\n constructor(@inject(Logger) logger: Logger) {\n this._logger = logger.child({ label: 'projects' });\n }\n\n // Methods\n async isProjectRoot(dir: string): Promise<IsProjectRoot> {\n const files = await fs.readdir(dir);\n\n return {\n hasManifest: files.includes(MANIFEST),\n hasLockFile: LOCK_FILES.some((lock) => files.includes(lock)),\n };\n }\n\n async searchProjectRoot(directory: string): Promise<string> {\n directory = path.resolve(directory);\n\n // Test all ancestors\n const steps: string[] = [];\n let foundManifest = false;\n let projectRoot = directory;\n let dir = directory;\n let prev = dir;\n\n do {\n // Check cache\n const root = this._roots.get(dir);\n\n if (root) {\n projectRoot = root;\n foundManifest = true;\n break;\n }\n\n // Look for files\n const { hasManifest, hasLockFile } = await this.isProjectRoot(dir);\n steps.push(dir);\n\n if (hasManifest) {\n projectRoot = dir;\n foundManifest = true;\n }\n\n if (hasLockFile) {\n break;\n }\n\n prev = dir;\n dir = path.dirname(dir);\n } while (prev !== dir);\n\n // Cache result\n for (const dir of steps) {\n if (dir.startsWith(projectRoot)) {\n this._roots.set(dir, projectRoot);\n }\n }\n\n // Log it\n if (foundManifest) {\n this._logger.debug`Project root found at #cwd:${projectRoot}`;\n } else {\n this._logger.debug`Project root not found, keeping #cwd:${projectRoot}`;\n }\n\n return projectRoot;\n }\n\n getProject(root: string, opts?: ProjectOptions): Project {\n let project = this._cache.get(root);\n\n if (!project) {\n project = new Project(root, this._logger, opts);\n this._cache.set(root, project);\n }\n\n return project;\n }\n}\n","import { Lock } from '@jujulego/utils';\nimport { injectable } from 'inversify';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport normalize, { type Package } from 'normalize-package-data';\nimport glob from 'tiny-glob';\n\nimport { type Logger } from '@/src/commons/logger.service.ts';\n\nimport { Workspace } from './workspace.ts';\nimport { type PackageManager } from './types.ts';\n\n// Types\nexport interface ProjectOptions {\n packageManager?: PackageManager | undefined;\n}\n\n// Class\n@injectable()\nexport class Project {\n // Attributes\n private _mainWorkspace?: Workspace;\n private readonly _names = new Map<string, Workspace>();\n private readonly _workspaces = new Map<string, Workspace>();\n\n private _packageManager?: PackageManager;\n private _isFullyLoaded = false;\n private _lock = new Lock();\n\n // Constructor\n constructor(\n private readonly _root: string,\n private readonly _logger: Logger,\n opts: ProjectOptions = {}\n ) {\n if (opts.packageManager) {\n this._logger.debug`Forced use of ${opts.packageManager} in #cwd:${this.root}`;\n this._packageManager = opts.packageManager;\n }\n }\n\n // Methods\n private async _loadManifest(dir: string): Promise<Package> {\n const file = path.resolve(this.root, dir, 'package.json');\n\n const relative = path.relative(this.root, path.dirname(file));\n const logger = this._logger.child({ label: relative ? `project@${relative}` : 'project' });\n\n logger.verbose('Loading package.json ...');\n\n const data = await fs.readFile(file, 'utf-8');\n const mnf = JSON.parse(data);\n normalize(mnf, (msg) => logger.verbose(msg));\n\n return mnf;\n }\n\n private async _loadWorkspace(dir: string): Promise<Workspace> {\n return await this._lock.with(async () => {\n let wks = this._workspaces.get(dir);\n\n if (!wks) {\n const manifest = await this._loadManifest(dir);\n wks = new Workspace(dir, manifest, this);\n\n this._workspaces.set(dir, wks);\n this._names.set(wks.name, wks);\n }\n\n return wks;\n });\n }\n\n async packageManager(): Promise<PackageManager> {\n if (!this._packageManager) {\n const files = await fs.readdir(this.root);\n\n if (files.includes('yarn.lock')) {\n this._logger.debug`Detected yarn in #cwd:${this.root}`;\n this._packageManager = 'yarn';\n } else if (files.includes('package-lock.json')) {\n this._logger.debug`Detected npm in #cwd:${this.root}`;\n this._packageManager = 'npm';\n } else {\n this._logger.debug`No package manager recognized in #cwd:${this.root}, defaults to npm`;\n this._packageManager = 'npm';\n }\n }\n\n return this._packageManager;\n }\n\n async mainWorkspace(): Promise<Workspace> {\n if (!this._mainWorkspace) {\n const manifest = await this._loadManifest('.');\n this._mainWorkspace = new Workspace('.', manifest, this);\n\n this._names.set(this._mainWorkspace.name, this._mainWorkspace);\n }\n\n return this._mainWorkspace;\n }\n\n async currentWorkspace(cwd = process.cwd()): Promise<Workspace | null> {\n let workspace: Workspace | null = null;\n cwd = path.resolve(cwd);\n\n for await (const wks of this.workspaces()) {\n if (cwd.startsWith(wks.cwd)) {\n workspace = wks;\n\n if (wks.cwd !== this.root) return wks;\n }\n }\n\n return workspace;\n }\n\n async* workspaces(): AsyncGenerator<Workspace, void> {\n const main = await this.mainWorkspace();\n yield main;\n\n if (this._isFullyLoaded) {\n for (const wks of this._names.values()) {\n if (wks.name !== main.name) yield wks;\n }\n } else {\n // Load child workspaces\n const { workspaces = [] } = main.manifest;\n\n for (const pattern of workspaces) {\n for (const dir of await glob(pattern, { cwd: this.root })) {\n try {\n // Check if dir is a directory exists\n const file = path.resolve(this.root, dir);\n const stat = await fs.stat(file);\n\n if (stat.isDirectory()) {\n yield await this._loadWorkspace(dir);\n }\n\n } catch (error) {\n if (error.code === 'ENOENT') {\n continue;\n }\n\n throw error;\n }\n }\n }\n\n this._isFullyLoaded = true;\n }\n }\n\n async workspace(name?: string): Promise<Workspace | null> {\n // With current directory\n if (!name) {\n const dir = path.relative(this.root, process.cwd());\n return this._loadWorkspace(dir);\n }\n\n // Try name index\n const wks = this._names.get(name);\n\n if (wks) {\n return wks;\n }\n\n // Load workspaces\n if (!this._isFullyLoaded) {\n for await (const ws of this.workspaces()) {\n if (ws.name === name) {\n return ws;\n }\n }\n\n this._isFullyLoaded = true;\n }\n\n return null;\n }\n\n // Properties\n get root(): string {\n return path.resolve(this._root);\n }\n}\n","import { type Task, type TaskOptions } from '@jujulego/tasks';\nimport { injectable } from 'inversify';\nimport path from 'node:path';\nimport { type Package } from 'normalize-package-data';\nimport { satisfies } from 'semver';\n\nimport { GitService } from '@/src/commons/git.service.ts';\nimport { container, lazyInject } from '@/src/inversify.config.ts';\nimport { Logger } from '@/src/commons/logger.service.ts';\nimport { CommandTask } from '@/src/tasks/command-task.ts';\nimport { ScriptTask } from '@/src/tasks/script-task.ts';\nimport { combine } from '@/src/utils/streams.ts';\n\nimport { type Project } from './project.ts';\n\n// Types\nexport type WorkspaceDepsMode = 'all' | 'prod' | 'none';\n\nexport interface WorkspaceRunOptions extends Omit<TaskOptions, 'logger'> {\n buildDeps?: WorkspaceDepsMode;\n buildScript?: string;\n}\n\n// Class\n@injectable()\nexport class Workspace {\n // Attributes\n private readonly _logger: Logger;\n private readonly _affectedCache = new Map<string, Promise<boolean>>();\n private readonly _tasks = new Map<string, ScriptTask>();\n\n @lazyInject(GitService)\n private readonly _git: GitService;\n\n // Constructor\n constructor(\n private readonly _cwd: string,\n readonly manifest: Package,\n readonly project: Project\n ) {\n const logger = container.get(Logger);\n this._logger = logger.child({ label: this.manifest.name });\n }\n\n // Methods\n private _satisfies(from: Workspace, range: string): boolean {\n if (range.startsWith('file:')) {\n return path.resolve(from.cwd, range.substring(5)) === this.cwd;\n }\n\n if (range.startsWith('workspace:')) {\n range = range.substring(10);\n }\n\n return !this.version || satisfies(this.version, range);\n }\n\n private async _buildDependencies(task: Task, opts: WorkspaceRunOptions) {\n // Generators\n const generators: AsyncGenerator<Workspace, void>[] = [];\n\n switch (opts.buildDeps ?? 'all') {\n case 'all':\n generators.unshift(this.devDependencies());\n\n // eslint-disable-next no-fallthrough\n case 'prod':\n generators.unshift(this.dependencies());\n }\n\n // Build deps\n for await (const dep of combine(...generators)) {\n const build = await dep.build(opts);\n\n if (build) {\n task.dependsOn(build);\n }\n }\n }\n\n private async _isAffected(reference: string): Promise<boolean> {\n const isAffected = await this._git.isAffected(reference, [this.cwd], {\n cwd: this.project.root,\n logger: this._logger,\n });\n\n if (isAffected) {\n return true;\n }\n\n // Test dependencies\n const proms: Promise<boolean>[] = [];\n\n for await (const dep of combine(this.dependencies(), this.devDependencies())) {\n proms.push(dep.isAffected(reference));\n }\n\n const results = await Promise.all(proms);\n return results.some(r => r);\n }\n\n async isAffected(reference: string): Promise<boolean> {\n let isAffected = this._affectedCache.get(reference);\n\n if (!isAffected) {\n isAffected = this._isAffected(reference);\n this._affectedCache.set(reference, isAffected);\n }\n\n return await isAffected;\n }\n\n private async* _loadDependencies(dependencies: Record<string, string>, kind: string): AsyncGenerator<Workspace, void> {\n for (const [dep, range] of Object.entries(dependencies)) {\n const ws = await this.project.workspace(dep);\n\n if (ws) {\n if (ws._satisfies(this, range)) {\n yield ws;\n } else {\n this._logger.verbose`Ignoring ${kind} ${ws.reference} as it does not match requirement ${range}`;\n }\n }\n }\n }\n\n async* dependencies(): AsyncGenerator<Workspace, void> {\n if (!this.manifest.dependencies) return;\n\n for await (const ws of this._loadDependencies(this.manifest.dependencies, 'dependency')) {\n yield ws;\n }\n }\n\n async* devDependencies(): AsyncGenerator<Workspace, void> {\n if (!this.manifest.devDependencies) return;\n\n for await (const ws of this._loadDependencies(this.manifest.devDependencies, 'devDependency')) {\n yield ws;\n }\n }\n\n async exec(command: string, args: string[] = [], opts: WorkspaceRunOptions = {}): Promise<CommandTask> {\n const pm = await this.project.packageManager();\n const task = new CommandTask(this, command, args, {\n ...opts,\n logger: this._logger.child({ label: `${this.name}$${command}` }),\n superCommand: pm === 'yarn' ? ['yarn', 'exec'] : undefined\n });\n\n await this._buildDependencies(task, opts);\n\n return task;\n }\n\n async run(script: string, args: string[] = [], opts: WorkspaceRunOptions = {}): Promise<ScriptTask | null> {\n // Script not found\n if (!this.getScript(script)) {\n return null;\n }\n\n // Create task if it doesn't exist yet\n let task = this._tasks.get(script);\n\n if (!task) {\n task = new ScriptTask(this, script, args, {\n ...opts,\n logger: this._logger.child({ label: `${this.name}#${script}` }),\n });\n\n await task.prepare();\n await this._buildDependencies(task, opts);\n\n this._tasks.set(script, task);\n }\n\n return task;\n }\n\n async build(opts: WorkspaceRunOptions = {}): Promise<ScriptTask | null> {\n const task = await this.run(opts?.buildScript ?? 'build', [], opts);\n\n if (!task) {\n this._logger.warn('Will not be built (no build script)');\n }\n\n return task;\n }\n\n getScript(script: string): string | null {\n const { scripts = {} } = this.manifest;\n return scripts[script] || null;\n }\n\n toJSON() {\n return {\n name: this.name,\n version: this.version,\n cwd: this.cwd,\n };\n }\n\n // Properties\n get name(): string {\n return this.manifest.name;\n }\n\n get version(): string {\n return this.manifest.version;\n }\n\n get reference(): string {\n return this.version ? `${this.name}@${this.version}` : this.name;\n }\n\n get cwd(): string {\n return path.resolve(this.project.root, this._cwd);\n }\n}\n","import { type GroupTask, ParallelGroup, SequenceGroup, type Task } from '@jujulego/tasks';\nimport { inject } from 'inversify';\nimport moo from 'moo';\n\nimport { Logger } from '@/src/commons/logger.service.ts';\nimport { Service } from '@/src/modules/service.ts';\nimport { type Workspace, type WorkspaceRunOptions } from '@/src/project/workspace.ts';\n\n// Interfaces\nexport interface TaskNode {\n script: string;\n}\n\nexport interface GroupNode {\n operator: string;\n tasks: (TaskNode | GroupNode)[];\n}\n\nexport interface TaskTree {\n roots: (TaskNode | GroupNode)[];\n}\n\n// Service\n@Service()\nexport class TaskExprService {\n // Statics\n static isTaskNode(node: TaskNode | GroupNode): node is TaskNode {\n return 'script' in node;\n }\n\n // Constructor\n constructor(\n @inject(Logger)\n private readonly _logger: Logger\n ) {}\n\n // Methods\n private _lexer(): moo.Lexer {\n return moo.states({\n task: {\n lparen: '(',\n whitespace: /[ \\t]+/,\n string: [\n // inline\n { match: /[:a-zA-Z0-9]+/, push: 'operator' },\n // single cotted\n {\n match: /'(?:\\\\['\\\\]|[^\\n'\\\\])+'/,\n push: 'operator',\n value: x => x.slice(1, -1).replace(/\\\\(['\\\\])/g, '$1')\n },\n // double cotted\n {\n match: /\"(?:\\\\[\"\\\\]|[^\\n\"\\\\])+\"/,\n push: 'operator',\n value: x => x.slice(1, -1).replace(/\\\\([\"\\\\])/g, '$1')\n }\n ],\n },\n operator: {\n whitespace: /[ \\t]+/,\n rparen: ')',\n operator: { match: ['->', '//'], pop: 1 },\n }\n });\n }\n\n private _nextNode(lexer: moo.Lexer, i = 0): TaskNode | GroupNode | null {\n let node: TaskNode | GroupNode | null = null;\n\n for (const token of lexer) {\n // Ignore whitespaces\n if (token.type === 'whitespace') {\n continue;\n }\n\n // rparen = end of group\n if (token.type === 'rparen') {\n break;\n }\n\n // Handle operator\n if (token.type === 'operator') {\n const operator = token.value;\n\n if (!node) {\n throw new Error(lexer.formatError(token, 'Unexpected operator'));\n } else if (TaskExprService.isTaskNode(node)) {\n node = { operator, tasks: [node] };\n\n continue;\n } else {\n if (node.operator !== operator) {\n node = { operator, tasks: [node] };\n }\n\n continue;\n }\n }\n\n // Build \"child\"\n let child: TaskNode | GroupNode;\n\n if (token.type === 'string') {\n child = { script: token.value };\n } else if (token.type === 'lparen') {\n const res = this._nextNode(lexer, i+1);\n\n if (!res) {\n throw new Error(lexer.formatError(token, 'Empty group found'));\n }\n\n child = res;\n } else {\n throw new Error(lexer.formatError(token, 'Unexpected token'));\n }\n\n if (!node) {\n node = child;\n } else if (TaskExprService.isTaskNode(node)) {\n throw new Error(lexer.formatError(token, 'Unexpected token, expected an operator'));\n } else {\n node.tasks.push(child);\n }\n }\n\n return node;\n }\n\n parse(expr: string): TaskTree {\n const lexer = this._lexer().reset(expr);\n\n const tree: TaskTree = {\n roots: [],\n };\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const node = this._nextNode(lexer);\n\n if (node) {\n tree.roots.push(node);\n } else {\n break;\n }\n }\n\n return tree;\n }\n\n async buildTask(node: TaskNode | GroupNode, workspace: Workspace, opts?: WorkspaceRunOptions): Promise<Task> {\n if (TaskExprService.isTaskNode(node)) {\n const task = await workspace.run(node.script, [], opts);\n\n if (!task) {\n throw new Error(`Workspace ${workspace.name} have no ${node.script} script`);\n }\n\n return task;\n } else {\n let group: GroupTask;\n\n if (node.operator === '//') {\n group = new ParallelGroup('In parallel', {}, {\n logger: this._logger,\n });\n } else {\n group = new SequenceGroup('In sequence', {}, {\n logger: this._logger,\n });\n }\n\n for (const child of node.tasks) {\n group.add(await this.buildTask(child, workspace, opts));\n }\n\n return group;\n }\n }\n}\n","import { Newline, Text, type TextProps } from 'ink';\nimport { type ReactElement, useEffect, useState } from 'react';\n\nimport { type Workspace } from '@/src/project/workspace.ts';\n\n// Types\nexport interface WorkspaceTreeProps {\n workspace: Workspace;\n dev?: boolean;\n level?: ReactElement;\n}\n\n// Utils\nconst style = (dev: boolean): TextProps => ({ color: dev ? 'blue' : '' });\n\n// Component\nexport default function WorkspaceTree(props: WorkspaceTreeProps) {\n const { workspace: wks, dev = false, level = '' } = props;\n\n // State\n const [deps, setDeps] = useState<[Workspace, boolean | null][]>([]);\n\n // Effects\n useEffect(() => void (async () => {\n const deps: [Workspace, boolean | null][] = [];\n\n for await (const dep of wks.dependencies()) {\n deps.push([dep, null]);\n }\n\n for await (const dep of wks.devDependencies()) {\n deps.push([dep, true]);\n }\n\n setDeps(deps);\n })(), [wks]);\n\n // Render\n return (\n <Text>\n <Text {...style(dev)}>{wks.name}</Text>\n {wks.version && <Text color=\"grey\">@{wks.version}</Text>}\n {(deps.length > 0) && <Newline/>}\n\n {deps.map(([dep, isDev], idx) => (\n <Text key={dep.name}>\n {level}<Text {...style(dev)}>{idx === deps.length - 1 ? '└' : '├'}─{' '}</Text>\n <WorkspaceTree\n workspace={dep}\n dev={isDev ?? dev}\n level={<>{level}<Text {...style(dev)}>{idx === deps.length - 1 ? ' ' : '│'}{' '}</Text></>}\n />\n {(idx < deps.length - 1) && <Newline/>}\n </Text>\n ))}\n </Text>\n );\n}\n","import { iterate$, off$, once$ } from '@jujulego/event-tree';\nimport { type SpawnTask, type SpawnTaskStream } from '@jujulego/tasks';\n\n// Utils\nexport async function* combine<T>(...generators: AsyncGenerator<T>[]): AsyncGenerator<T> {\n for (const gen of generators) {\n yield* gen;\n }\n}\n\nexport async function *streamLines(task: SpawnTask, stream: SpawnTaskStream): AsyncGenerator<string> {\n // Abort\n const off = off$();\n once$(task, 'completed', off);\n\n // Stream\n let current = '';\n\n try {\n for await (const chunk of iterate$(task, `stream.${stream}`, { off })) {\n const data = current + chunk.data.toString('utf-8');\n const lines = data.split(/\\r?\\n/);\n\n current = lines.pop() ?? '';\n\n for (const line of lines) {\n yield line;\n }\n }\n } catch (err) {\n if (err.message !== 'Unsubscribed !') {\n throw err;\n }\n\n if (current) {\n yield current;\n }\n }\n}\n"],"names":["GitService","constructor","manager","logger","command","cmd","args","options","opts","this","task","SpawnTask","hidden","on","data","debug","toString","add","branch","diff","tag","isAffected","reference","files","Promise","resolve","reject","once$","exitCode","Error","name","async","result","line","streamLines","push","replace","Service","inject","TASK_MANAGER","Logger","AffectedFilter","format","fallback","sort","wks","_logger","child","label","sortArgs","includes","branches","_git","listBranches","cwd","length","tags","listTags","verbose","warn","workspace","rev","_formatRevision","lazyInject","Pipeline","filter","_filters","test","workspaces","_test","PrivateFilter","value","manifest","private","ScriptsFilter","scripts","Object","keys","some","scr","LoadProject","spinner","projects","context","builder","parser","option","alias","type","description","choices","project","spin","searchProjectRoot","process","getProject","packageManager","stop","root","LazyCurrentProject","lazyInjectNamed","Project","CURRENT","Middleware","SpinnerService","ProjectRepository","ContextService","container","bind","toDynamicValue","prj","get","whenTargetNamed","LoadWorkspace","desc","startsWith","currentWorkspace","mainWorkspace","failed","ExitException","LazyCurrentWorkspace","Workspace","PluginModule","ContainerModule","commands","super","getRegistry","registry","id","Plugin","target","module","setModule","LOCK_FILES","_cache","Map","_roots","dir","fs","hasManifest","hasLockFile","lock","directory","steps","foundManifest","projectRoot","path","prev","isProjectRoot","set","_root","_names","_workspaces","_isFullyLoaded","_lock","Lock","_packageManager","file","relative","mnf","JSON","parse","normalize","msg","with","_loadManifest","_mainWorkspace","main","values","pattern","glob","isDirectory","_loadWorkspace","error","code","ws","injectable","_cwd","_affectedCache","_tasks","_satisfies","from","range","substring","version","satisfies","generators","buildDeps","unshift","devDependencies","dependencies","dep","combine","build","dependsOn","proms","all","r","_isAffected","kind","entries","_loadDependencies","pm","CommandTask","superCommand","undefined","_buildDependencies","script","getScript","ScriptTask","prepare","run","buildScript","toJSON","TaskExprService","static","node","_lexer","moo","lparen","whitespace","string","match","x","slice","operator","rparen","pop","_nextNode","lexer","i","token","isTaskNode","tasks","formatError","res","expr","reset","tree","roots","group","ParallelGroup","SequenceGroup","buildTask","style","dev","color","WorkspaceTree","props","level","deps","setDeps","useState","useEffect","Text","Newline","map","isDev","idx","gen","stream","off","off$","current","chunk","iterate$","lines","split","err","message"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"828.mjs","mappings":"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","sources":["webpack://@jujulego/jill/./src/commons/git.service.ts","webpack://@jujulego/jill/./src/filters/affected.filter.ts","webpack://@jujulego/jill/./src/filters/pipeline.ts","webpack://@jujulego/jill/./src/filters/private.filter.ts","webpack://@jujulego/jill/./src/filters/scripts.filter.ts","webpack://@jujulego/jill/./src/middlewares/load-project.ts","webpack://@jujulego/jill/./src/middlewares/load-workspace.ts","webpack://@jujulego/jill/./src/modules/plugin.ts","webpack://@jujulego/jill/./src/project/project.repository.ts","webpack://@jujulego/jill/./src/project/project.ts","webpack://@jujulego/jill/./src/project/workspace.ts","webpack://@jujulego/jill/./src/tasks/task-expr.service.ts","webpack://@jujulego/jill/./src/ui/workspace-tree.tsx","webpack://@jujulego/jill/./src/utils/streams.ts"],"sourcesContent":["import { once$ } from '@jujulego/event-tree';\nimport { SpawnTask, type SpawnTaskOptions, TaskContext, type TaskManager } from '@jujulego/tasks';\nimport { inject } from 'inversify';\n\nimport { Logger } from '@/src/commons/logger.service.ts';\nimport { TASK_MANAGER } from '@/src/tasks/task-manager.config.ts';\nimport { streamLines } from '@/src/utils/streams.ts';\nimport { Service } from '@/src/modules/service.ts';\nimport { TaskUIContext } from '@/src/types.ts';\n\n// Types\nexport interface GitContext extends TaskContext, TaskUIContext {\n command: string;\n}\n\n// Git commands\n@Service()\nexport class GitService {\n // Constructor\n constructor(\n @inject(TASK_MANAGER)\n private readonly manager: TaskManager,\n @inject(Logger)\n private readonly logger: Logger,\n ) {}\n\n // Methods\n /**\n * Runs a git command inside a SpawnTask\n *\n * @param cmd\n * @param args\n * @param options\n */\n command(cmd: string, args: string[], options: SpawnTaskOptions = {}): SpawnTask<GitContext> {\n const opts = { logger: this.logger, ...options };\n\n // Create task\n const task = new SpawnTask('git', [cmd, ...args], { command: cmd, hidden: true }, opts);\n task.on('stream', ({ data }) => opts.logger.debug(data.toString('utf-8')));\n\n this.manager.add(task);\n\n return task;\n }\n\n /**\n * Runs git branch\n *\n * @param args\n * @param options\n */\n branch(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('branch', args, options);\n }\n\n /**\n * Runs git diff\n *\n * @param args\n * @param options\n */\n diff(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('diff', args, options);\n }\n\n /**\n * Runs git tag\n *\n * @param args\n * @param options\n */\n tag(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('tag', args, options);\n }\n\n /**\n * Uses git diff to detect if given files have been affected since given reference\n *\n * @param reference\n * @param files\n * @param opts\n */\n isAffected(reference: string, files: string[] = [], opts?: SpawnTaskOptions): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const task = this.diff(['--quiet', reference, '--', ...files], opts);\n\n once$(task, 'status.done', () => resolve(false));\n once$(task, 'status.failed', () => {\n if (task.exitCode) {\n resolve(true);\n } else {\n reject(new Error(`Task ${task.name} failed`));\n }\n });\n });\n }\n\n /**\n * List git branches\n *\n * @param args\n * @param opts\n */\n async listBranches(args: string[] = [], opts?: SpawnTaskOptions): Promise<string[]> {\n const task = this.branch(['-l', ...args], opts);\n const result: string[] = [];\n\n for await (const line of streamLines(task, 'stdout')) {\n result.push(line.replace(/^[ *] /, ''));\n }\n\n return result;\n }\n\n /**\n * List git tags\n *\n * @param args\n * @param opts\n */\n async listTags(args: string[] = [], opts?: SpawnTaskOptions): Promise<string[]> {\n const task = this.tag(['-l', ...args], opts);\n const result: string[] = [];\n\n for await (const line of streamLines(task, 'stdout')) {\n result.push(line);\n }\n\n return result;\n }\n}\n","import { GitService } from '@/src/commons/git.service.ts';\nimport { type Workspace } from '@/src/project/workspace.ts';\nimport { lazyInject } from '@/src/inversify.config.ts';\nimport { Logger } from '@/src/commons/logger.service.ts';\n\nimport { type PipelineFilter } from './pipeline.ts';\n\n// Class\nexport class AffectedFilter implements PipelineFilter {\n // Properties\n @lazyInject(Logger)\n private readonly _logger: Logger;\n\n @lazyInject(GitService)\n private readonly _git: GitService;\n\n // Constructor\n constructor(\n readonly format: string,\n readonly fallback: string,\n readonly sort?: string,\n ) {}\n\n // Methods\n private async _formatRevision(wks: Workspace): Promise<string> {\n const logger = this._logger.child({ label: wks.name });\n\n // Format revision\n let result = this.format;\n result = result.replace(/(?<!\\\\)((?:\\\\\\\\)*)%name/g, `$1${wks.name}`);\n result = result.replace(/\\\\(.)/g, '$1');\n\n // Ask git to complete it\n const sortArgs = this.sort ? ['--sort', this.sort] : [];\n\n // - search in branches\n if (result.includes('*')) {\n const branches = await this._git.listBranches([...sortArgs, result], { cwd: wks.cwd, logger: logger });\n\n if (branches.length > 0) {\n result = branches[branches.length - 1];\n }\n }\n\n // - search in tags\n if (result.includes('*')) {\n const tags = await this._git.listTags([...sortArgs, result], { cwd: wks.cwd, logger: logger });\n\n if (tags.length > 0) {\n result = tags[tags.length - 1];\n }\n }\n\n if (result !== this.format) {\n logger.verbose`Resolved ${this.format} into ${result}`;\n }\n\n if (result.includes('*')) {\n logger.warn`No revision found matching ${result}, using fallback ${this.fallback}`;\n\n return this.fallback;\n }\n\n return result;\n }\n\n async test(workspace: Workspace): Promise<boolean> {\n const rev = await this._formatRevision(workspace);\n return await workspace.isAffected(rev);\n }\n}\n","import { type Workspace } from '@/src/project/workspace.ts';\nimport { type Awaitable } from '@/src/types.ts';\n\n// Interface\nexport interface PipelineFilter {\n // Methods\n test(workspace: Workspace): Awaitable<boolean>;\n}\n\n// Class\nexport class Pipeline {\n // Attributes\n private _filters: PipelineFilter[] = [];\n\n // Methods\n add(filter: PipelineFilter): void {\n this._filters.push(filter);\n }\n\n private async _test(workspace: Workspace): Promise<boolean> {\n for (const filter of this._filters) {\n const res = await filter.test(workspace);\n\n if (!res) {\n return false;\n }\n }\n\n return true;\n }\n\n async *filter(workspaces: Iterable<Workspace> | AsyncIterable<Workspace>): AsyncGenerator<Workspace> {\n for await (const wks of workspaces) {\n if (await this._test(wks)) {\n yield wks;\n }\n }\n }\n}\n","import { type Workspace } from '@/src/project/workspace.ts';\n\nimport { type PipelineFilter } from './pipeline.ts';\n\n// Filter\nexport class PrivateFilter implements PipelineFilter {\n // Constructor\n constructor(readonly value: boolean) {}\n\n // Methods\n test(workspace: Workspace): boolean {\n return (workspace.manifest.private ?? false) === this.value;\n }\n}\n","import { type Workspace } from '@/src/project/workspace.ts';\n\nimport { type PipelineFilter } from './pipeline.ts';\n\n// Filter\nexport class ScriptsFilter implements PipelineFilter {\n // Constructor\n constructor(readonly scripts: string[]) {}\n\n // Methods\n test(workspace: Workspace): boolean {\n const scripts = Object.keys(workspace.manifest.scripts || {});\n return this.scripts.some((scr) => scripts.includes(scr));\n }\n}\n","import { inject } from 'inversify';\nimport { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { ContextService } from '@/src/commons/context.service.ts';\nimport { SpinnerService } from '@/src/commons/spinner.service.ts';\nimport { CURRENT } from '@/src/constants.ts';\nimport { container, lazyInjectNamed } from '@/src/inversify.config.ts';\nimport { type IMiddleware, Middleware } from '@/src/modules/middleware.ts';\nimport { Project } from '@/src/project/project.ts';\nimport { ProjectRepository } from '@/src/project/project.repository.ts';\nimport { type PackageManager } from '@/src/project/types.ts';\n\n// Types\nexport interface ILoadProjectArgs {\n project?: string;\n 'package-manager'?: PackageManager;\n}\n\n// Middleware\n@Middleware()\nexport class LoadProject implements IMiddleware<ILoadProjectArgs> {\n // Constructor\n constructor(\n @inject(SpinnerService)\n private readonly spinner: SpinnerService,\n @inject(ProjectRepository)\n private readonly projects: ProjectRepository,\n @inject(ContextService)\n private readonly context: ContextService,\n ) {}\n\n // Methods\n builder(parser: Argv) {\n return parser\n .option('project', {\n alias: 'p',\n type: 'string',\n description: 'Project root directory'\n })\n .option('package-manager', {\n choices: ['yarn', 'npm'] as const,\n type: 'string',\n description: 'Force package manager'\n });\n }\n\n async handler(args: ArgumentsCamelCase<ILoadProjectArgs>): Promise<void> {\n if (!this.context.project || args.project) {\n try {\n this.spinner.spin('Loading project ...');\n\n args.project = await this.projects.searchProjectRoot(args.project ?? process.cwd());\n\n this.context.project = this.projects.getProject(args.project, {\n packageManager: args.packageManager\n });\n } finally {\n this.spinner.stop();\n }\n } else {\n args.project = this.context.project.root;\n }\n }\n}\n\n// Lazy injection\nexport function LazyCurrentProject() {\n return lazyInjectNamed(Project, CURRENT);\n}\n\ncontainer.bind(Project)\n .toDynamicValue(({ container }) => {\n const ctx = container.get(ContextService);\n const prj = ctx.project;\n\n if (!prj) {\n throw new Error('Cannot inject current project, it not yet defined');\n }\n\n return prj;\n })\n .whenTargetNamed(CURRENT);\n","import { inject } from 'inversify';\nimport { type ArgumentsCamelCase, type Argv } from 'yargs';\n\nimport { ContextService } from '@/src/commons/context.service.ts';\nimport { SpinnerService } from '@/src/commons/spinner.service.ts';\nimport { CURRENT } from '@/src/constants.ts';\nimport { container, lazyInjectNamed } from '@/src/inversify.config.ts';\nimport { type IMiddleware, Middleware } from '@/src/modules/middleware.ts';\nimport { type Project } from '@/src/project/project.ts';\nimport { Workspace } from '@/src/project/workspace.ts';\nimport { ExitException } from '@/src/utils/exit.ts';\n\nimport { ILoadProjectArgs, LazyCurrentProject } from './load-project.ts';\n\n// Types\nexport interface ILoadWorkspaceArgs extends ILoadProjectArgs {\n workspace?: string;\n}\n\n// Middleware\n@Middleware()\nexport class LoadWorkspace implements IMiddleware<ILoadWorkspaceArgs> {\n // Lazy injections\n @LazyCurrentProject()\n readonly project: Project;\n\n // Constructor\n constructor(\n @inject(SpinnerService)\n private readonly spinner: SpinnerService,\n @inject(ContextService)\n private readonly context: ContextService,\n ) {}\n\n // Methods\n builder(parser: Argv) {\n return parser\n .option('workspace', {\n alias: 'w',\n type: 'string',\n desc: 'Workspace to use'\n });\n }\n\n async handler(args: ArgumentsCamelCase<ILoadWorkspaceArgs>): Promise<void> {\n try {\n this.spinner.spin(`Loading \"${args.workspace || '.'}\" workspace ...`);\n\n let workspace = this.context.workspace ?? null;\n\n if (!workspace || args.workspace) {\n if (args.workspace) {\n workspace = await this.project.workspace(args.workspace);\n } else if (process.cwd().startsWith(this.project.root)) {\n workspace = await this.project.currentWorkspace();\n } else {\n workspace = await this.project.mainWorkspace();\n }\n }\n\n if (!workspace) {\n this.spinner.failed(`Workspace \"${args.workspace || '.'}\" not found`);\n throw new ExitException(1, 'Workspace not found');\n } else {\n this.context.workspace = workspace;\n }\n } finally {\n this.spinner.stop();\n }\n }\n}\n\n// Decorators\nexport function LazyCurrentWorkspace() {\n return lazyInjectNamed(Workspace, CURRENT);\n}\n\ncontainer.bind(Workspace)\n .toDynamicValue(({ container }) => {\n const ctx = container.get(ContextService);\n const wks = ctx.workspace;\n\n if (!wks) {\n throw new Error('Cannot inject current workspace, it not yet defined');\n }\n\n return wks;\n })\n .whenTargetNamed(CURRENT);\n","import { ContainerModule, id, type interfaces as int } from 'inversify';\n\nimport { type Class, type Type } from '@/src/types.ts';\n\nimport { type ICommand } from './command.ts';\nimport { getRegistry, setModule } from './module.ts';\n\n// Types\nexport interface IPluginOpts {\n readonly name?: string;\n readonly commands: Type<ICommand>[];\n}\n\nexport class PluginModule extends ContainerModule implements IPluginOpts {\n // Attributes\n readonly id = id();\n\n // Constructor\n constructor(\n readonly name: string,\n readonly commands: Type<ICommand>[],\n ) {\n super((...args: Parameters<int.ContainerModuleCallBack>) => {\n for (const command of this.commands) {\n const registry = getRegistry(command);\n registry(...args);\n }\n });\n }\n}\n\n// Decorator\nexport function Plugin(opts: IPluginOpts) {\n return (target: Class) => {\n const name = opts.name ?? target.name;\n const module = new PluginModule(name, opts.commands);\n\n setModule(target, module);\n };\n}\n","import { inject } from 'inversify';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { Logger } from '@/src/commons/logger.service.ts';\nimport { Service } from '@/src/modules/service.ts';\n\nimport { Project, type ProjectOptions } from './project.ts';\n\n// Constants\nconst MANIFEST = 'package.json';\nconst LOCK_FILES = ['package-lock.json', 'yarn.lock'];\n\n// Types\nexport interface IsProjectRoot {\n hasManifest: boolean;\n hasLockFile: boolean;\n}\n\n// Class\n@Service()\nexport class ProjectRepository {\n // Attributes\n private readonly _logger: Logger;\n private readonly _cache = new Map<string, Project>();\n private readonly _roots = new Map<string, string>();\n\n // Constructor\n constructor(@inject(Logger) logger: Logger) {\n this._logger = logger.child({ label: 'projects' });\n }\n\n // Methods\n async isProjectRoot(dir: string): Promise<IsProjectRoot> {\n const files = await fs.readdir(dir);\n\n return {\n hasManifest: files.includes(MANIFEST),\n hasLockFile: LOCK_FILES.some((lock) => files.includes(lock)),\n };\n }\n\n async searchProjectRoot(directory: string): Promise<string> {\n directory = path.resolve(directory);\n\n // Test all ancestors\n const steps: string[] = [];\n let foundManifest = false;\n let projectRoot = directory;\n let dir = directory;\n let prev = dir;\n\n do {\n // Check cache\n const root = this._roots.get(dir);\n\n if (root) {\n projectRoot = root;\n foundManifest = true;\n break;\n }\n\n // Look for files\n const { hasManifest, hasLockFile } = await this.isProjectRoot(dir);\n steps.push(dir);\n\n if (hasManifest) {\n projectRoot = dir;\n foundManifest = true;\n }\n\n if (hasLockFile) {\n break;\n }\n\n prev = dir;\n dir = path.dirname(dir);\n } while (prev !== dir);\n\n // Cache result\n for (const dir of steps) {\n if (dir.startsWith(projectRoot)) {\n this._roots.set(dir, projectRoot);\n }\n }\n\n // Log it\n if (foundManifest) {\n this._logger.debug`Project root found at #cwd:${projectRoot}`;\n } else {\n this._logger.debug`Project root not found, keeping #cwd:${projectRoot}`;\n }\n\n return projectRoot;\n }\n\n getProject(root: string, opts?: ProjectOptions): Project {\n let project = this._cache.get(root);\n\n if (!project) {\n project = new Project(root, this._logger, opts);\n this._cache.set(root, project);\n }\n\n return project;\n }\n}\n","import { Lock } from '@jujulego/utils';\nimport { injectable } from 'inversify';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport normalize, { type Package } from 'normalize-package-data';\nimport glob from 'tiny-glob';\n\nimport { type Logger } from '@/src/commons/logger.service.ts';\n\nimport { Workspace } from './workspace.ts';\nimport { type PackageManager } from './types.ts';\n\n// Types\nexport interface ProjectOptions {\n packageManager?: PackageManager | undefined;\n}\n\n// Class\n@injectable()\nexport class Project {\n // Attributes\n private _mainWorkspace?: Workspace;\n private readonly _names = new Map<string, Workspace>();\n private readonly _workspaces = new Map<string, Workspace>();\n\n private _packageManager?: PackageManager;\n private _isFullyLoaded = false;\n private _lock = new Lock();\n\n // Constructor\n constructor(\n private readonly _root: string,\n private readonly _logger: Logger,\n opts: ProjectOptions = {}\n ) {\n if (opts.packageManager) {\n this._logger.debug`Forced use of ${opts.packageManager} in #cwd:${this.root}`;\n this._packageManager = opts.packageManager;\n }\n }\n\n // Methods\n private async _loadManifest(dir: string): Promise<Package> {\n const file = path.resolve(this.root, dir, 'package.json');\n\n const relative = path.relative(this.root, path.dirname(file));\n const logger = this._logger.child({ label: relative ? `project@${relative}` : 'project' });\n\n logger.debug('Loading package.json ...');\n\n const data = await fs.readFile(file, 'utf-8');\n const mnf = JSON.parse(data);\n normalize(mnf, (msg) => logger.verbose(msg));\n\n return mnf;\n }\n\n private async _loadWorkspace(dir: string): Promise<Workspace> {\n return await this._lock.with(async () => {\n let wks = this._workspaces.get(dir);\n\n if (!wks) {\n const manifest = await this._loadManifest(dir);\n wks = new Workspace(dir, manifest, this);\n\n this._workspaces.set(dir, wks);\n this._names.set(wks.name, wks);\n }\n\n return wks;\n });\n }\n\n async packageManager(): Promise<PackageManager> {\n if (!this._packageManager) {\n const files = await fs.readdir(this.root);\n\n if (files.includes('yarn.lock')) {\n this._logger.debug`Detected yarn in #cwd:${this.root}`;\n this._packageManager = 'yarn';\n } else if (files.includes('package-lock.json')) {\n this._logger.debug`Detected npm in #cwd:${this.root}`;\n this._packageManager = 'npm';\n } else {\n this._logger.debug`No package manager recognized in #cwd:${this.root}, defaults to npm`;\n this._packageManager = 'npm';\n }\n }\n\n return this._packageManager;\n }\n\n async mainWorkspace(): Promise<Workspace> {\n if (!this._mainWorkspace) {\n const manifest = await this._loadManifest('.');\n this._mainWorkspace = new Workspace('.', manifest, this);\n\n this._names.set(this._mainWorkspace.name, this._mainWorkspace);\n }\n\n return this._mainWorkspace;\n }\n\n async currentWorkspace(cwd = process.cwd()): Promise<Workspace | null> {\n let workspace: Workspace | null = null;\n cwd = path.resolve(cwd);\n\n for await (const wks of this.workspaces()) {\n if (cwd.startsWith(wks.cwd)) {\n workspace = wks;\n\n if (wks.cwd !== this.root) return wks;\n }\n }\n\n return workspace;\n }\n\n async* workspaces(): AsyncGenerator<Workspace, void> {\n const main = await this.mainWorkspace();\n yield main;\n\n if (this._isFullyLoaded) {\n for (const wks of this._names.values()) {\n if (wks.name !== main.name) yield wks;\n }\n } else {\n // Load child workspaces\n const { workspaces = [] } = main.manifest;\n\n for (const pattern of workspaces) {\n for (const dir of await glob(pattern, { cwd: this.root })) {\n try {\n // Check if dir is a directory exists\n const file = path.resolve(this.root, dir);\n const stat = await fs.stat(file);\n\n if (stat.isDirectory()) {\n yield await this._loadWorkspace(dir);\n }\n\n } catch (error) {\n if (error.code === 'ENOENT') {\n continue;\n }\n\n throw error;\n }\n }\n }\n\n this._isFullyLoaded = true;\n }\n }\n\n async workspace(name?: string): Promise<Workspace | null> {\n // With current directory\n if (!name) {\n const dir = path.relative(this.root, process.cwd());\n return this._loadWorkspace(dir);\n }\n\n // Try name index\n const wks = this._names.get(name);\n\n if (wks) {\n return wks;\n }\n\n // Load workspaces\n if (!this._isFullyLoaded) {\n for await (const ws of this.workspaces()) {\n if (ws.name === name) {\n return ws;\n }\n }\n\n this._isFullyLoaded = true;\n }\n\n return null;\n }\n\n // Properties\n get root(): string {\n return path.resolve(this._root);\n }\n}\n","import { type Task, type TaskOptions } from '@jujulego/tasks';\nimport { injectable } from 'inversify';\nimport path from 'node:path';\nimport { type Package } from 'normalize-package-data';\nimport { satisfies } from 'semver';\n\nimport { GitService } from '@/src/commons/git.service.ts';\nimport { container, lazyInject } from '@/src/inversify.config.ts';\nimport { Logger } from '@/src/commons/logger.service.ts';\nimport { CommandTask } from '@/src/tasks/command-task.ts';\nimport { ScriptTask } from '@/src/tasks/script-task.ts';\nimport { combine } from '@/src/utils/streams.ts';\n\nimport { type Project } from './project.ts';\n\n// Types\nexport type WorkspaceDepsMode = 'all' | 'prod' | 'none';\n\nexport interface WorkspaceRunOptions extends Omit<TaskOptions, 'logger'> {\n buildDeps?: WorkspaceDepsMode;\n buildScript?: string;\n}\n\n// Class\n@injectable()\nexport class Workspace {\n // Attributes\n private readonly _logger: Logger;\n private readonly _affectedCache = new Map<string, Promise<boolean>>();\n private readonly _tasks = new Map<string, ScriptTask>();\n\n @lazyInject(GitService)\n private readonly _git: GitService;\n\n // Constructor\n constructor(\n private readonly _cwd: string,\n readonly manifest: Package,\n readonly project: Project\n ) {\n const logger = container.get(Logger);\n this._logger = logger.child({ label: this.manifest.name });\n }\n\n // Methods\n private _satisfies(from: Workspace, range: string): boolean {\n if (range.startsWith('file:')) {\n return path.resolve(from.cwd, range.substring(5)) === this.cwd;\n }\n\n if (range.startsWith('workspace:')) {\n range = range.substring(10);\n }\n\n return !this.version || satisfies(this.version, range);\n }\n\n private async _buildDependencies(task: Task, opts: WorkspaceRunOptions) {\n // Generators\n const generators: AsyncGenerator<Workspace, void>[] = [];\n\n switch (opts.buildDeps ?? 'all') {\n case 'all':\n generators.unshift(this.devDependencies());\n\n // eslint-disable-next no-fallthrough\n case 'prod':\n generators.unshift(this.dependencies());\n }\n\n // Build deps\n for await (const dep of combine(...generators)) {\n const build = await dep.build(opts);\n\n if (build) {\n task.dependsOn(build);\n }\n }\n }\n\n private async _isAffected(reference: string): Promise<boolean> {\n const isAffected = await this._git.isAffected(reference, [this.cwd], {\n cwd: this.project.root,\n logger: this._logger,\n });\n\n if (isAffected) {\n return true;\n }\n\n // Test dependencies\n const proms: Promise<boolean>[] = [];\n\n for await (const dep of combine(this.dependencies(), this.devDependencies())) {\n proms.push(dep.isAffected(reference));\n }\n\n const results = await Promise.all(proms);\n return results.some(r => r);\n }\n\n async isAffected(reference: string): Promise<boolean> {\n let isAffected = this._affectedCache.get(reference);\n\n if (!isAffected) {\n isAffected = this._isAffected(reference);\n this._affectedCache.set(reference, isAffected);\n }\n\n return await isAffected;\n }\n\n private async* _loadDependencies(dependencies: Record<string, string>, kind: string): AsyncGenerator<Workspace, void> {\n for (const [dep, range] of Object.entries(dependencies)) {\n const ws = await this.project.workspace(dep);\n\n if (ws) {\n if (ws._satisfies(this, range)) {\n yield ws;\n } else {\n this._logger.warn`Ignoring ${kind} ${ws.reference} as it does not match requirement ${range}`;\n }\n }\n }\n }\n\n async* dependencies(): AsyncGenerator<Workspace, void> {\n if (!this.manifest.dependencies) return;\n\n for await (const ws of this._loadDependencies(this.manifest.dependencies, 'dependency')) {\n yield ws;\n }\n }\n\n async* devDependencies(): AsyncGenerator<Workspace, void> {\n if (!this.manifest.devDependencies) return;\n\n for await (const ws of this._loadDependencies(this.manifest.devDependencies, 'devDependency')) {\n yield ws;\n }\n }\n\n async exec(command: string, args: string[] = [], opts: WorkspaceRunOptions = {}): Promise<CommandTask> {\n const pm = await this.project.packageManager();\n const task = new CommandTask(this, command, args, {\n ...opts,\n logger: this._logger.child({ label: `${this.name}$${command}` }),\n superCommand: pm === 'yarn' ? ['yarn', 'exec'] : undefined\n });\n\n await this._buildDependencies(task, opts);\n\n return task;\n }\n\n async run(script: string, args: string[] = [], opts: WorkspaceRunOptions = {}): Promise<ScriptTask | null> {\n // Script not found\n if (!this.getScript(script)) {\n return null;\n }\n\n // Create task if it doesn't exist yet\n let task = this._tasks.get(script);\n\n if (!task) {\n task = new ScriptTask(this, script, args, {\n ...opts,\n logger: this._logger.child({ label: `${this.name}#${script}` }),\n });\n\n await task.prepare();\n await this._buildDependencies(task, opts);\n\n this._tasks.set(script, task);\n }\n\n return task;\n }\n\n async build(opts: WorkspaceRunOptions = {}): Promise<ScriptTask | null> {\n const task = await this.run(opts?.buildScript ?? 'build', [], opts);\n\n if (!task) {\n this._logger.warn('Will not be built (no build script)');\n }\n\n return task;\n }\n\n getScript(script: string): string | null {\n const { scripts = {} } = this.manifest;\n return scripts[script] || null;\n }\n\n toJSON() {\n return {\n name: this.name,\n version: this.version,\n cwd: this.cwd,\n };\n }\n\n // Properties\n get name(): string {\n return this.manifest.name;\n }\n\n get version(): string {\n return this.manifest.version;\n }\n\n get reference(): string {\n return this.version ? `${this.name}@${this.version}` : this.name;\n }\n\n get cwd(): string {\n return path.resolve(this.project.root, this._cwd);\n }\n}\n","import { type GroupTask, ParallelGroup, SequenceGroup, type Task } from '@jujulego/tasks';\nimport { inject } from 'inversify';\nimport moo from 'moo';\n\nimport { Logger } from '@/src/commons/logger.service.ts';\nimport { Service } from '@/src/modules/service.ts';\nimport { type Workspace, type WorkspaceRunOptions } from '@/src/project/workspace.ts';\n\n// Interfaces\nexport interface TaskNode {\n script: string;\n}\n\nexport interface GroupNode {\n operator: string;\n tasks: (TaskNode | GroupNode)[];\n}\n\nexport interface TaskTree {\n roots: (TaskNode | GroupNode)[];\n}\n\n// Service\n@Service()\nexport class TaskExprService {\n // Statics\n static isTaskNode(node: TaskNode | GroupNode): node is TaskNode {\n return 'script' in node;\n }\n\n // Constructor\n constructor(\n @inject(Logger)\n private readonly _logger: Logger\n ) {}\n\n // Methods\n private _lexer(): moo.Lexer {\n return moo.states({\n task: {\n lparen: '(',\n whitespace: /[ \\t]+/,\n string: [\n // inline\n { match: /[:a-zA-Z0-9]+/, push: 'operator' },\n // single cotted\n {\n match: /'(?:\\\\['\\\\]|[^\\n'\\\\])+'/,\n push: 'operator',\n value: x => x.slice(1, -1).replace(/\\\\(['\\\\])/g, '$1')\n },\n // double cotted\n {\n match: /\"(?:\\\\[\"\\\\]|[^\\n\"\\\\])+\"/,\n push: 'operator',\n value: x => x.slice(1, -1).replace(/\\\\([\"\\\\])/g, '$1')\n }\n ],\n },\n operator: {\n whitespace: /[ \\t]+/,\n rparen: ')',\n operator: { match: ['->', '//'], pop: 1 },\n }\n });\n }\n\n private _nextNode(lexer: moo.Lexer, i = 0): TaskNode | GroupNode | null {\n let node: TaskNode | GroupNode | null = null;\n\n for (const token of lexer) {\n // Ignore whitespaces\n if (token.type === 'whitespace') {\n continue;\n }\n\n // rparen = end of group\n if (token.type === 'rparen') {\n break;\n }\n\n // Handle operator\n if (token.type === 'operator') {\n const operator = token.value;\n\n if (!node) {\n throw new Error(lexer.formatError(token, 'Unexpected operator'));\n } else if (TaskExprService.isTaskNode(node)) {\n node = { operator, tasks: [node] };\n\n continue;\n } else {\n if (node.operator !== operator) {\n node = { operator, tasks: [node] };\n }\n\n continue;\n }\n }\n\n // Build \"child\"\n let child: TaskNode | GroupNode;\n\n if (token.type === 'string') {\n child = { script: token.value };\n } else if (token.type === 'lparen') {\n const res = this._nextNode(lexer, i+1);\n\n if (!res) {\n throw new Error(lexer.formatError(token, 'Empty group found'));\n }\n\n child = res;\n } else {\n throw new Error(lexer.formatError(token, 'Unexpected token'));\n }\n\n if (!node) {\n node = child;\n } else if (TaskExprService.isTaskNode(node)) {\n throw new Error(lexer.formatError(token, 'Unexpected token, expected an operator'));\n } else {\n node.tasks.push(child);\n }\n }\n\n return node;\n }\n\n parse(expr: string): TaskTree {\n const lexer = this._lexer().reset(expr);\n\n const tree: TaskTree = {\n roots: [],\n };\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const node = this._nextNode(lexer);\n\n if (node) {\n tree.roots.push(node);\n } else {\n break;\n }\n }\n\n return tree;\n }\n\n async buildTask(node: TaskNode | GroupNode, workspace: Workspace, opts?: WorkspaceRunOptions): Promise<Task> {\n if (TaskExprService.isTaskNode(node)) {\n const task = await workspace.run(node.script, [], opts);\n\n if (!task) {\n throw new Error(`Workspace ${workspace.name} have no ${node.script} script`);\n }\n\n return task;\n } else {\n let group: GroupTask;\n\n if (node.operator === '//') {\n group = new ParallelGroup('In parallel', {}, {\n logger: this._logger,\n });\n } else {\n group = new SequenceGroup('In sequence', {}, {\n logger: this._logger,\n });\n }\n\n for (const child of node.tasks) {\n group.add(await this.buildTask(child, workspace, opts));\n }\n\n return group;\n }\n }\n}\n","import { Newline, Text, type TextProps } from 'ink';\nimport { type ReactElement, useEffect, useState } from 'react';\n\nimport { type Workspace } from '@/src/project/workspace.ts';\n\n// Types\nexport interface WorkspaceTreeProps {\n workspace: Workspace;\n dev?: boolean;\n level?: ReactElement;\n}\n\n// Utils\nconst style = (dev: boolean): TextProps => ({ color: dev ? 'blue' : '' });\n\n// Component\nexport default function WorkspaceTree(props: WorkspaceTreeProps) {\n const { workspace: wks, dev = false, level = '' } = props;\n\n // State\n const [deps, setDeps] = useState<[Workspace, boolean | null][]>([]);\n\n // Effects\n useEffect(() => void (async () => {\n const deps: [Workspace, boolean | null][] = [];\n\n for await (const dep of wks.dependencies()) {\n deps.push([dep, null]);\n }\n\n for await (const dep of wks.devDependencies()) {\n deps.push([dep, true]);\n }\n\n setDeps(deps);\n })(), [wks]);\n\n // Render\n return (\n <Text>\n <Text {...style(dev)}>{wks.name}</Text>\n {wks.version && <Text color=\"grey\">@{wks.version}</Text>}\n {(deps.length > 0) && <Newline/>}\n\n {deps.map(([dep, isDev], idx) => (\n <Text key={dep.name}>\n {level}<Text {...style(dev)}>{idx === deps.length - 1 ? '└' : '├'}─{' '}</Text>\n <WorkspaceTree\n workspace={dep}\n dev={isDev ?? dev}\n level={<>{level}<Text {...style(dev)}>{idx === deps.length - 1 ? ' ' : '│'}{' '}</Text></>}\n />\n {(idx < deps.length - 1) && <Newline/>}\n </Text>\n ))}\n </Text>\n );\n}\n","import { iterate$, off$, once$ } from '@jujulego/event-tree';\nimport { type SpawnTask, type SpawnTaskStream } from '@jujulego/tasks';\n\n// Utils\nexport async function* combine<T>(...generators: AsyncGenerator<T>[]): AsyncGenerator<T> {\n for (const gen of generators) {\n yield* gen;\n }\n}\n\nexport async function *streamLines(task: SpawnTask, stream: SpawnTaskStream): AsyncGenerator<string> {\n // Abort\n const off = off$();\n once$(task, 'completed', off);\n\n // Stream\n let current = '';\n\n try {\n for await (const chunk of iterate$(task, `stream.${stream}`, { off })) {\n const data = current + chunk.data.toString('utf-8');\n const lines = data.split(/\\r?\\n/);\n\n current = lines.pop() ?? '';\n\n for (const line of lines) {\n yield line;\n }\n }\n } catch (err) {\n if (err.message !== 'Unsubscribed !') {\n throw err;\n }\n\n if (current) {\n yield current;\n }\n }\n}\n"],"names":["GitService","constructor","manager","logger","command","cmd","args","options","opts","this","task","SpawnTask","hidden","on","data","debug","toString","add","branch","diff","tag","isAffected","reference","files","Promise","resolve","reject","once$","exitCode","Error","name","async","result","line","streamLines","push","replace","Service","inject","TASK_MANAGER","Logger","AffectedFilter","format","fallback","sort","wks","_logger","child","label","sortArgs","includes","branches","_git","listBranches","cwd","length","tags","listTags","verbose","warn","workspace","rev","_formatRevision","lazyInject","Pipeline","filter","_filters","test","workspaces","_test","PrivateFilter","value","manifest","private","ScriptsFilter","scripts","Object","keys","some","scr","LoadProject","spinner","projects","context","builder","parser","option","alias","type","description","choices","project","spin","searchProjectRoot","process","getProject","packageManager","stop","root","LazyCurrentProject","lazyInjectNamed","Project","CURRENT","Middleware","SpinnerService","ProjectRepository","ContextService","container","bind","toDynamicValue","prj","get","whenTargetNamed","LoadWorkspace","desc","startsWith","currentWorkspace","mainWorkspace","failed","ExitException","LazyCurrentWorkspace","Workspace","PluginModule","ContainerModule","super","commands","getRegistry","registry","id","Plugin","target","module","setModule","LOCK_FILES","_cache","Map","_roots","dir","fs","hasManifest","hasLockFile","lock","directory","steps","foundManifest","projectRoot","path","prev","isProjectRoot","set","_root","_names","_workspaces","_isFullyLoaded","_lock","Lock","_packageManager","file","relative","mnf","JSON","parse","normalize","msg","with","_loadManifest","_mainWorkspace","main","values","pattern","glob","isDirectory","_loadWorkspace","error","code","ws","injectable","_cwd","_affectedCache","_tasks","_satisfies","from","range","substring","version","satisfies","generators","buildDeps","unshift","devDependencies","dependencies","dep","combine","build","dependsOn","proms","all","r","_isAffected","kind","entries","_loadDependencies","pm","CommandTask","superCommand","undefined","_buildDependencies","script","getScript","ScriptTask","prepare","run","buildScript","toJSON","TaskExprService","static","node","_lexer","moo","lparen","whitespace","string","match","x","slice","operator","rparen","pop","_nextNode","lexer","i","token","isTaskNode","tasks","formatError","res","expr","reset","tree","roots","group","ParallelGroup","SequenceGroup","buildTask","style","dev","color","WorkspaceTree","props","level","deps","setDeps","useState","useEffect","Text","Newline","map","isDev","idx","gen","stream","off","off$","current","chunk","iterate$","lines","split","err","message"],"sourceRoot":""}
|