@jujulego/jill 1.2.1 → 2.0.0-alpha.2

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.
Files changed (142) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +28 -0
  3. package/dist/commands/list.d.ts +23 -0
  4. package/dist/commands/list.d.ts.map +1 -0
  5. package/dist/commands/list.js +169 -0
  6. package/dist/commands/list.js.map +1 -0
  7. package/dist/filters/affected.filter.d.ts +11 -0
  8. package/dist/filters/affected.filter.d.ts.map +1 -0
  9. package/dist/filters/affected.filter.js +82 -0
  10. package/dist/filters/affected.filter.js.map +1 -0
  11. package/dist/filters/index.d.ts +4 -0
  12. package/dist/filters/index.d.ts.map +1 -0
  13. package/dist/filters/index.js +21 -0
  14. package/dist/filters/index.js.map +1 -0
  15. package/dist/filters/pipeline.d.ts +11 -0
  16. package/dist/filters/pipeline.d.ts.map +1 -0
  17. package/dist/filters/pipeline.js +34 -0
  18. package/dist/filters/pipeline.js.map +1 -0
  19. package/dist/filters/private.filter.d.ts +7 -0
  20. package/dist/filters/private.filter.d.ts.map +1 -0
  21. package/dist/filters/private.filter.js +20 -0
  22. package/dist/filters/private.filter.js.map +1 -0
  23. package/dist/filters/scripts.filter.d.ts +7 -0
  24. package/dist/filters/scripts.filter.d.ts.map +1 -0
  25. package/dist/filters/scripts.filter.js +21 -0
  26. package/dist/filters/scripts.filter.js.map +1 -0
  27. package/dist/git.d.ts +16 -0
  28. package/dist/git.d.ts.map +1 -0
  29. package/dist/git.js +94 -0
  30. package/dist/git.js.map +1 -0
  31. package/dist/index.d.ts +7 -4
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +19 -33
  34. package/dist/index.js.map +1 -1
  35. package/dist/main.d.ts.map +1 -1
  36. package/dist/main.js +26 -52
  37. package/dist/main.js.map +1 -1
  38. package/dist/middlewares/global-config.d.ts +5 -0
  39. package/dist/middlewares/global-config.d.ts.map +1 -0
  40. package/dist/middlewares/global-config.js +26 -0
  41. package/dist/middlewares/global-config.js.map +1 -0
  42. package/dist/middlewares/index.d.ts +3 -0
  43. package/dist/middlewares/index.d.ts.map +1 -0
  44. package/dist/middlewares/index.js +20 -0
  45. package/dist/middlewares/index.js.map +1 -0
  46. package/dist/middlewares/load-project.d.ts +6 -0
  47. package/dist/middlewares/load-project.d.ts.map +1 -0
  48. package/dist/middlewares/load-project.js +41 -0
  49. package/dist/middlewares/load-project.js.map +1 -0
  50. package/dist/middlewares/setup-ink.d.ts +1 -0
  51. package/dist/middlewares/setup-ink.d.ts.map +1 -0
  52. package/dist/middlewares/setup-ink.js +22 -0
  53. package/dist/middlewares/setup-ink.js.map +1 -0
  54. package/dist/project/index.d.ts +2 -0
  55. package/dist/project/index.d.ts.map +1 -0
  56. package/dist/project/index.js +19 -0
  57. package/dist/project/index.js.map +1 -0
  58. package/dist/project/project.d.ts +25 -0
  59. package/dist/project/project.d.ts.map +1 -0
  60. package/dist/project/project.js +190 -0
  61. package/dist/project/project.js.map +1 -0
  62. package/dist/project/workspace.d.ts +32 -0
  63. package/dist/project/workspace.d.ts.map +1 -0
  64. package/dist/project/workspace.js +159 -0
  65. package/dist/project/workspace.js.map +1 -0
  66. package/dist/services/index.d.ts +4 -0
  67. package/dist/services/index.d.ts.map +1 -0
  68. package/dist/services/index.js +21 -0
  69. package/dist/services/index.js.map +1 -0
  70. package/dist/services/inversify.config.d.ts +11 -0
  71. package/dist/services/inversify.config.d.ts.map +1 -0
  72. package/dist/services/inversify.config.js +34 -0
  73. package/dist/services/inversify.config.js.map +1 -0
  74. package/dist/services/logger.service.d.ts +6 -0
  75. package/dist/services/logger.service.d.ts.map +1 -0
  76. package/dist/services/logger.service.js +75 -0
  77. package/dist/services/logger.service.js.map +1 -0
  78. package/dist/services/spinner.service.d.ts +14 -0
  79. package/dist/services/spinner.service.d.ts.map +1 -0
  80. package/dist/services/spinner.service.js +55 -0
  81. package/dist/services/spinner.service.js.map +1 -0
  82. package/dist/services/task-manager.service.d.ts +1 -0
  83. package/dist/services/task-manager.service.d.ts.map +1 -0
  84. package/dist/services/task-manager.service.js +18 -0
  85. package/dist/services/task-manager.service.js.map +1 -0
  86. package/dist/types.d.ts +1 -0
  87. package/dist/types.d.ts.map +1 -0
  88. package/dist/types.js +7 -0
  89. package/dist/types.js.map +1 -0
  90. package/dist/ui/cli-list.d.ts +15 -0
  91. package/dist/ui/cli-list.d.ts.map +1 -0
  92. package/dist/ui/cli-list.js +66 -0
  93. package/dist/ui/cli-list.js.map +1 -0
  94. package/dist/ui/global-spinner.d.ts +2 -0
  95. package/dist/ui/global-spinner.d.ts.map +1 -0
  96. package/dist/ui/global-spinner.js +43 -0
  97. package/dist/ui/global-spinner.js.map +1 -0
  98. package/dist/ui/index.d.ts +5 -0
  99. package/dist/ui/index.d.ts.map +1 -0
  100. package/dist/ui/index.js +22 -0
  101. package/dist/ui/index.js.map +1 -0
  102. package/dist/ui/layout.d.ts +2 -0
  103. package/dist/ui/layout.d.ts.map +1 -0
  104. package/dist/ui/layout.js +20 -0
  105. package/dist/ui/layout.js.map +1 -0
  106. package/dist/ui/list.d.ts +6 -0
  107. package/dist/ui/list.d.ts.map +1 -0
  108. package/dist/ui/list.js +30 -0
  109. package/dist/ui/list.js.map +1 -0
  110. package/dist/ui/static-logs.d.ts +2 -0
  111. package/dist/ui/static-logs.d.ts.map +1 -0
  112. package/dist/ui/static-logs.js +56 -0
  113. package/dist/ui/static-logs.js.map +1 -0
  114. package/dist/utils.d.ts +13 -0
  115. package/dist/utils.d.ts.map +1 -0
  116. package/dist/utils.js +72 -0
  117. package/dist/utils.js.map +1 -0
  118. package/package.json +53 -40
  119. package/dist/commands/each.command.d.ts +0 -16
  120. package/dist/commands/each.command.d.ts.map +0 -1
  121. package/dist/commands/each.command.js +0 -203
  122. package/dist/commands/each.command.js.map +0 -1
  123. package/dist/commands/info.command.d.ts +0 -8
  124. package/dist/commands/info.command.d.ts.map +0 -1
  125. package/dist/commands/info.command.js +0 -178
  126. package/dist/commands/info.command.js.map +0 -1
  127. package/dist/commands/list.command.d.ts +0 -21
  128. package/dist/commands/list.command.d.ts.map +0 -1
  129. package/dist/commands/list.command.js +0 -251
  130. package/dist/commands/list.command.js.map +0 -1
  131. package/dist/commands/run.command.d.ts +0 -12
  132. package/dist/commands/run.command.d.ts.map +0 -1
  133. package/dist/commands/run.command.js +0 -111
  134. package/dist/commands/run.command.js.map +0 -1
  135. package/dist/core.plugin.d.ts +0 -2
  136. package/dist/core.plugin.d.ts.map +0 -1
  137. package/dist/core.plugin.js +0 -22
  138. package/dist/core.plugin.js.map +0 -1
  139. package/dist/task-logger.d.ts +0 -14
  140. package/dist/task-logger.d.ts.map +0 -1
  141. package/dist/task-logger.js +0 -76
  142. package/dist/task-logger.js.map +0 -1
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Julien Capellari
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,8 +1,36 @@
1
1
  # @jujulego/jill
2
2
  [![Version](https://img.shields.io/npm/v/@jujulego/jill)](https://www.npmjs.com/package/@jujulego/jill)
3
3
  ![Licence](https://img.shields.io/github/license/jujulego/jill)
4
+ ![Language](https://img.shields.io/github/languages/top/jujulego/jill)
4
5
  [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=jujulego_jill&metric=alert_status)](https://sonarcloud.io/dashboard?id=jujulego_jill)
5
6
  [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=jujulego_jill&metric=coverage)](https://sonarcloud.io/dashboard?id=jujulego_jill)
6
7
 
7
8
  ## Description
8
9
  Zero-config monorepo cli
10
+
11
+ Jill uses the `workspaces` attribute of your root package.json manifest to build your workspaces dependency tree.
12
+ That done it can offer you various utilities:
13
+ - `jill info` prints data about the current workspace, including name, version and local dependency tree
14
+ - `jill list` prints a list of all your workspaces, with many useful filters
15
+ - `jill run` build all workspace's local dependencies before run a given script
16
+ - `jill each` do the same as `run` but for a list of workspaces, optimizing builds. Supports the same filters as `list`.
17
+
18
+ It supports both `npm` and `yarn`.
19
+
20
+ ## Installation
21
+ Just install jill as a dev dependency:
22
+ ```shell
23
+ npm install --save-dev @jujulego/jill
24
+ ```
25
+
26
+ Or if you're using yarn
27
+ ```shell
28
+ yarn add --dev @jujulego/jill
29
+ ```
30
+
31
+ ## Configuration
32
+ Almost nothing ;)
33
+
34
+ To work, jill only needs the `workspaces` attribute (see [npm workspaces](https://docs.npmjs.com/cli/v8/using-npm/workspaces) or [yarn workspace](https://yarnpkg.com/features/workspaces)).
35
+
36
+ To build a workspaces, jill will try to run it's `build` script. If no `build` script is found, jill will just warn and continue.
@@ -0,0 +1,23 @@
1
+ /// <reference types="yargs" />
2
+ export declare type Attribute = 'name' | 'version' | 'root' | 'slug';
3
+ export declare type Data = Partial<Record<Attribute, string>>;
4
+ declare const _default: import("yargs").CommandModule<unknown, {
5
+ private: boolean | undefined;
6
+ } & {
7
+ "with-script": string[] | undefined;
8
+ } & {
9
+ affected: string | undefined;
10
+ } & {
11
+ "affected-rev-sort": string | undefined;
12
+ } & {
13
+ "affected-rev-fallback": string;
14
+ } & {
15
+ attrs: Attribute[];
16
+ } & {
17
+ headers: boolean | undefined;
18
+ } & {
19
+ long: boolean | undefined;
20
+ } & {
21
+ json: boolean | undefined;
22
+ }>;
23
+ export default _default;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["commands/list.tsx"],"names":[],"mappings":";AAaA,oBAAY,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAC7D,oBAAY,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;AA8BtD,wBAiIG","file":"list.d.ts","sourcesContent":["import chalk from 'chalk';\nimport path from 'node:path';\nimport ink from 'ink';\nimport slugify from 'slugify';\n\nimport { AffectedFilter, Pipeline, PrivateFilter, ScriptsFilter } from '../filters';\nimport { loadProject, setupInk } from '../middlewares';\nimport { Project, Workspace } from '../project';\nimport { container, CURRENT_PROJECT, INK_APP } from '../services';\nimport { Layout, List } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\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\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: Record<Attribute, Extractor<string | undefined>> = {\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 => slugify(wks.name)\n};\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\nexport default defineCommand({\n command: ['list', 'ls'],\n describe: 'List workspaces',\n builder: (yargs) => applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n ])\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\n // Affected filter\n .option('affected', {\n alias: 'a',\n type: 'string',\n coerce: (rev: string) => rev === '' ? 'master' : rev,\n group: 'Affected:',\n desc: 'Print only affected workspaces towards given git revision. If no revision is given, it will check towards master.\\n' +\n 'Replaces %name by workspace name.',\n })\n .option('affected-rev-sort', {\n type: 'string',\n group: 'Affected:',\n desc: 'Sort applied to git tag / git branch command',\n })\n .option('affected-rev-fallback', {\n type: 'string',\n default: 'master',\n group: 'Affected:',\n desc: 'Fallback revision, used if no revision matching the given format is found',\n })\n .option('attrs', {\n type: 'array',\n choices: ['name', 'version', 'root', 'slug'],\n default: [] as Attribute[],\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 async handler(args) {\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 project = container.get<Project>(CURRENT_PROJECT);\n const workspaces: Workspace[] = [];\n\n for await (const wks of pipeline.filter(project.workspaces())) {\n workspaces.push(wks);\n }\n\n // Build data\n let attrs = args.attrs;\n\n if (args.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 if (process.stdout.isTTY) { // Pretty print for ttys\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(JSON.stringify(data));\n }\n } else {\n const app = container.get<ink.Instance>(INK_APP);\n\n for (const d of data) {\n if (d.root) {\n d.root = path.relative(process.cwd(), d.root) ?? '.';\n }\n }\n\n app.rerender(\n <Layout>\n <List items={data} headers={args.headers ?? (attrs.length > 1)} />\n </Layout>\n );\n }\n }\n});\n"]}
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, // Command
6
+ "default", {
7
+ enumerable: true,
8
+ get: ()=>_default
9
+ });
10
+ const _jsxRuntime = require("react/jsx-runtime");
11
+ const _chalk = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
12
+ const _nodePath = /*#__PURE__*/ _interopRequireDefault(require("node:path"));
13
+ const _slugify = /*#__PURE__*/ _interopRequireDefault(require("slugify"));
14
+ const _filters = require("../filters");
15
+ const _middlewares = require("../middlewares");
16
+ const _services = require("../services");
17
+ const _ui = require("../ui");
18
+ const _utils = require("../utils");
19
+ function _interopRequireDefault(obj) {
20
+ return obj && obj.__esModule ? obj : {
21
+ default: obj
22
+ };
23
+ }
24
+ // Constants
25
+ const LONG_ATTRIBUTES = [
26
+ 'name',
27
+ 'version',
28
+ 'root'
29
+ ];
30
+ const JSON_ATTRIBUTES = [
31
+ 'name',
32
+ 'version',
33
+ 'slug',
34
+ 'root'
35
+ ];
36
+ const DEFAULT_ATTRIBUTES = [
37
+ 'name'
38
+ ];
39
+ const EXTRACTORS = {
40
+ name: (wks)=>wks.name,
41
+ version: (wks, json)=>wks.manifest.version || (json ? undefined : _chalk.default.grey('unset')),
42
+ root: (wks)=>wks.cwd,
43
+ slug: (wks)=>(0, _slugify.default)(wks.name)
44
+ };
45
+ // Utils
46
+ function buildExtractor(attrs) {
47
+ return (wks, json)=>{
48
+ const data = {};
49
+ for (const attr of attrs){
50
+ data[attr] = EXTRACTORS[attr](wks, json);
51
+ }
52
+ return data;
53
+ };
54
+ }
55
+ const _default = (0, _utils.defineCommand)({
56
+ command: [
57
+ 'list',
58
+ 'ls'
59
+ ],
60
+ describe: 'List workspaces',
61
+ builder: (yargs)=>(0, _utils.applyMiddlewares)(yargs, [
62
+ _middlewares.setupInk,
63
+ _middlewares.loadProject
64
+ ])// Filters
65
+ .option('private', {
66
+ type: 'boolean',
67
+ group: 'Filters:',
68
+ desc: 'Print only private workspaces'
69
+ }).option('with-script', {
70
+ type: 'array',
71
+ string: true,
72
+ group: 'Filters:',
73
+ desc: 'Print only workspaces having the given script'
74
+ })// Affected filter
75
+ .option('affected', {
76
+ alias: 'a',
77
+ type: 'string',
78
+ coerce: (rev)=>rev === '' ? 'master' : rev,
79
+ group: 'Affected:',
80
+ desc: 'Print only affected workspaces towards given git revision. If no revision is given, it will check towards master.\n' + 'Replaces %name by workspace name.'
81
+ }).option('affected-rev-sort', {
82
+ type: 'string',
83
+ group: 'Affected:',
84
+ desc: 'Sort applied to git tag / git branch command'
85
+ }).option('affected-rev-fallback', {
86
+ type: 'string',
87
+ default: 'master',
88
+ group: 'Affected:',
89
+ desc: 'Fallback revision, used if no revision matching the given format is found'
90
+ }).option('attrs', {
91
+ type: 'array',
92
+ choices: [
93
+ 'name',
94
+ 'version',
95
+ 'root',
96
+ 'slug'
97
+ ],
98
+ default: [],
99
+ group: 'Format:',
100
+ desc: 'Select printed attributes'
101
+ }).option('headers', {
102
+ type: 'boolean',
103
+ group: 'Format:',
104
+ desc: 'Prints columns headers'
105
+ }).option('long', {
106
+ alias: 'l',
107
+ type: 'boolean',
108
+ group: 'Format:',
109
+ desc: 'Prints name, version and root of all workspaces'
110
+ }).option('json', {
111
+ type: 'boolean',
112
+ group: 'Format:',
113
+ desc: 'Prints data as a JSON array'
114
+ }),
115
+ async handler (args) {
116
+ // Setup pipeline
117
+ const pipeline = new _filters.Pipeline();
118
+ if (args.private !== undefined) {
119
+ pipeline.add(new _filters.PrivateFilter(args.private));
120
+ }
121
+ if (args.withScript) {
122
+ pipeline.add(new _filters.ScriptsFilter(args.withScript));
123
+ }
124
+ if (args.affected !== undefined) {
125
+ pipeline.add(new _filters.AffectedFilter(args.affected, args.affectedRevFallback, args.affectedRevSort));
126
+ }
127
+ // Load workspaces
128
+ const project = _services.container.get(_services.CURRENT_PROJECT);
129
+ const workspaces = [];
130
+ for await (const wks of pipeline.filter(project.workspaces())){
131
+ workspaces.push(wks);
132
+ }
133
+ // Build data
134
+ let attrs = args.attrs;
135
+ if (args.attrs.length === 0) {
136
+ if (args.long) {
137
+ attrs = LONG_ATTRIBUTES;
138
+ } else if (args.json) {
139
+ attrs = JSON_ATTRIBUTES;
140
+ } else {
141
+ attrs = DEFAULT_ATTRIBUTES;
142
+ }
143
+ }
144
+ const data = workspaces.map((wks)=>buildExtractor(attrs)(wks, args.json || false));
145
+ // Print list
146
+ if (args.json) {
147
+ if (process.stdout.isTTY) {
148
+ console.log(JSON.stringify(data, null, 2));
149
+ } else {
150
+ console.log(JSON.stringify(data));
151
+ }
152
+ } else {
153
+ const app = _services.container.get(_services.INK_APP);
154
+ for (const d of data){
155
+ if (d.root) {
156
+ d.root = _nodePath.default.relative(process.cwd(), d.root) ?? '.';
157
+ }
158
+ }
159
+ app.rerender(/*#__PURE__*/ (0, _jsxRuntime.jsx)(_ui.Layout, {
160
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ui.List, {
161
+ items: data,
162
+ headers: args.headers ?? attrs.length > 1
163
+ })
164
+ }));
165
+ }
166
+ }
167
+ });
168
+
169
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["commands/list.js"],"sourcesContent":["import chalk from 'chalk';\nimport path from 'node:path';\nimport ink from 'ink';\nimport slugify from 'slugify';\n\nimport { AffectedFilter, Pipeline, PrivateFilter, ScriptsFilter } from '../filters';\nimport { loadProject, setupInk } from '../middlewares';\nimport { Project, Workspace } from '../project';\nimport { container, CURRENT_PROJECT, INK_APP } from '../services';\nimport { Layout, List } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\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\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: Record<Attribute, Extractor<string | undefined>> = {\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 => slugify(wks.name)\n};\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\nexport default defineCommand({\n command: ['list', 'ls'],\n describe: 'List workspaces',\n builder: (yargs) => applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n ])\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\n // Affected filter\n .option('affected', {\n alias: 'a',\n type: 'string',\n coerce: (rev: string) => rev === '' ? 'master' : rev,\n group: 'Affected:',\n desc: 'Print only affected workspaces towards given git revision. If no revision is given, it will check towards master.\\n' +\n 'Replaces %name by workspace name.',\n })\n .option('affected-rev-sort', {\n type: 'string',\n group: 'Affected:',\n desc: 'Sort applied to git tag / git branch command',\n })\n .option('affected-rev-fallback', {\n type: 'string',\n default: 'master',\n group: 'Affected:',\n desc: 'Fallback revision, used if no revision matching the given format is found',\n })\n .option('attrs', {\n type: 'array',\n choices: ['name', 'version', 'root', 'slug'],\n default: [] as Attribute[],\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 async handler(args) {\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 project = container.get<Project>(CURRENT_PROJECT);\n const workspaces: Workspace[] = [];\n\n for await (const wks of pipeline.filter(project.workspaces())) {\n workspaces.push(wks);\n }\n\n // Build data\n let attrs = args.attrs;\n\n if (args.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 if (process.stdout.isTTY) { // Pretty print for ttys\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(JSON.stringify(data));\n }\n } else {\n const app = container.get<ink.Instance>(INK_APP);\n\n for (const d of data) {\n if (d.root) {\n d.root = path.relative(process.cwd(), d.root) ?? '.';\n }\n }\n\n app.rerender(\n <Layout>\n <List items={data} headers={args.headers ?? (attrs.length > 1)} />\n </Layout>\n );\n }\n }\n});\n"],"names":["LONG_ATTRIBUTES","JSON_ATTRIBUTES","DEFAULT_ATTRIBUTES","EXTRACTORS","name","wks","version","json","manifest","undefined","chalk","grey","root","cwd","slug","slugify","buildExtractor","attrs","data","attr","defineCommand","command","describe","builder","yargs","applyMiddlewares","setupInk","loadProject","option","type","group","desc","string","alias","coerce","rev","default","choices","handler","args","pipeline","Pipeline","private","add","PrivateFilter","withScript","ScriptsFilter","affected","AffectedFilter","affectedRevFallback","affectedRevSort","project","container","get","CURRENT_PROJECT","workspaces","filter","push","length","long","map","process","stdout","isTTY","console","log","JSON","stringify","app","INK_APP","d","path","relative","rerender","Layout","List","items","headers"],"mappings":"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","file":"list.js"}
@@ -0,0 +1,11 @@
1
+ import { Workspace } from '../project';
2
+ import { PipelineFilter } from './pipeline';
3
+ export declare class AffectedFilter implements PipelineFilter {
4
+ readonly format: string;
5
+ readonly fallback: string;
6
+ readonly sort?: string | undefined;
7
+ private readonly _logger;
8
+ constructor(format: string, fallback: string, sort?: string | undefined);
9
+ private _formatRevision;
10
+ test(workspace: Workspace): Promise<boolean>;
11
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["filters/affected.filter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,qBAAa,cAAe,YAAW,cAAc;IAOjD,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,IAAI,CAAC;IANhB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAItB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,oBAAQ;YAIV,eAAe;IA0CvB,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;CAInD","file":"affected.filter.d.ts","sourcesContent":["import { Git } from '../git';\nimport { lazyInject, Logger } from '../services';\nimport { Workspace } from '../project';\n\nimport { PipelineFilter } from './pipeline';\n\n// Class\nexport class AffectedFilter implements PipelineFilter {\n // Properties\n @lazyInject(Logger)\n private readonly _logger: Logger;\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 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 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"]}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "AffectedFilter", {
6
+ enumerable: true,
7
+ get: ()=>AffectedFilter
8
+ });
9
+ const _git = require("../git");
10
+ const _services = require("../services");
11
+ var __decorate = (void 0) && (void 0).__decorate || function(decorators, target, key, desc) {
12
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
13
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
14
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
15
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
16
+ };
17
+ class AffectedFilter {
18
+ // Constructor
19
+ constructor(format, fallback, sort){
20
+ this.format = format;
21
+ this.fallback = fallback;
22
+ this.sort = sort;
23
+ }
24
+ // Methods
25
+ async _formatRevision(wks) {
26
+ const logger = this._logger.child({
27
+ label: wks.name
28
+ });
29
+ // Format revision
30
+ let result = this.format;
31
+ result = result.replace(/(?<!\\)((?:\\\\)*)%name/g, `$1${wks.name}`);
32
+ result = result.replace(/\\(.)/g, '$1');
33
+ // Ask git to complete it
34
+ const sortArgs = this.sort ? [
35
+ '--sort',
36
+ this.sort
37
+ ] : [];
38
+ // - search in branches
39
+ if (result.includes('*')) {
40
+ const branches = await _git.Git.listBranches([
41
+ ...sortArgs,
42
+ result
43
+ ], {
44
+ cwd: wks.cwd,
45
+ logger: logger
46
+ });
47
+ if (branches.length > 0) {
48
+ result = branches[branches.length - 1];
49
+ }
50
+ }
51
+ // - search in tags
52
+ if (result.includes('*')) {
53
+ const tags = await _git.Git.listTags([
54
+ ...sortArgs,
55
+ result
56
+ ], {
57
+ cwd: wks.cwd,
58
+ logger: logger
59
+ });
60
+ if (tags.length > 0) {
61
+ result = tags[tags.length - 1];
62
+ }
63
+ }
64
+ if (result !== this.format) {
65
+ logger.verbose(`Resolved ${this.format} into ${result}`);
66
+ }
67
+ if (result.includes('*')) {
68
+ logger.warn(`No revision found matching ${result}, using fallback ${this.fallback}`);
69
+ return this.fallback;
70
+ }
71
+ return result;
72
+ }
73
+ async test(workspace) {
74
+ const rev = await this._formatRevision(workspace);
75
+ return await workspace.isAffected(rev);
76
+ }
77
+ }
78
+ __decorate([
79
+ (0, _services.lazyInject)(_services.Logger)
80
+ ], AffectedFilter.prototype, "_logger", void 0);
81
+
82
+ //# sourceMappingURL=affected.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["filters/affected.filter.js"],"sourcesContent":["import { Git } from '../git';\nimport { lazyInject, Logger } from '../services';\nimport { Workspace } from '../project';\n\nimport { PipelineFilter } from './pipeline';\n\n// Class\nexport class AffectedFilter implements PipelineFilter {\n // Properties\n @lazyInject(Logger)\n private readonly _logger: Logger;\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 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 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"],"names":["AffectedFilter","constructor","format","fallback","sort","_formatRevision","wks","logger","_logger","child","label","name","result","replace","sortArgs","includes","branches","Git","listBranches","cwd","length","tags","listTags","verbose","warn","test","workspace","rev","isAffected","lazyInject","Logger"],"mappings":"AAAA;;;;+BAOaA;;aAAAA;;qBAPO;0BACe;;;;;;;AAM5B,MAAMA;IAKX,cAAc;IACdC,YACWC,QACAC,UACAC,KACT;sBAHSF;wBACAC;oBACAC;IACR;IAEH,UAAU;IACV,MAAcC,gBAAgBC,GAAc,EAAmB;QAC7D,MAAMC,SAAS,IAAI,CAACC,OAAO,CAACC,KAAK,CAAC;YAAEC,OAAOJ,IAAIK,IAAI;QAAC;QAEpD,kBAAkB;QAClB,IAAIC,SAAS,IAAI,CAACV,MAAM;QACxBU,SAASA,OAAOC,OAAO,CAAC,4BAA4B,CAAC,EAAE,EAAEP,IAAIK,IAAI,CAAC,CAAC;QACnEC,SAASA,OAAOC,OAAO,CAAC,UAAU;QAElC,yBAAyB;QACzB,MAAMC,WAAW,IAAI,CAACV,IAAI,GAAG;YAAC;YAAU,IAAI,CAACA,IAAI;SAAC,GAAG,EAAE;QAEvD,uBAAuB;QACvB,IAAIQ,OAAOG,QAAQ,CAAC,MAAM;YACxB,MAAMC,WAAW,MAAMC,QAAG,CAACC,YAAY,CAAC;mBAAIJ;gBAAUF;aAAO,EAAE;gBAAEO,KAAKb,IAAIa,GAAG;gBAAEZ,QAAQA;YAAO;YAE9F,IAAIS,SAASI,MAAM,GAAG,GAAG;gBACvBR,SAASI,QAAQ,CAACA,SAASI,MAAM,GAAG,EAAE;YACxC,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAIR,OAAOG,QAAQ,CAAC,MAAM;YACxB,MAAMM,OAAO,MAAMJ,QAAG,CAACK,QAAQ,CAAC;mBAAIR;gBAAUF;aAAO,EAAE;gBAAEO,KAAKb,IAAIa,GAAG;gBAAEZ,QAAQA;YAAO;YAEtF,IAAIc,KAAKD,MAAM,GAAG,GAAG;gBACnBR,SAASS,IAAI,CAACA,KAAKD,MAAM,GAAG,EAAE;YAChC,CAAC;QACH,CAAC;QAED,IAAIR,WAAW,IAAI,CAACV,MAAM,EAAE;YAC1BK,OAAOgB,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,CAACrB,MAAM,CAAC,MAAM,EAAEU,OAAO,CAAC;QACzD,CAAC;QAED,IAAIA,OAAOG,QAAQ,CAAC,MAAM;YACxBR,OAAOiB,IAAI,CAAC,CAAC,2BAA2B,EAAEZ,OAAO,iBAAiB,EAAE,IAAI,CAACT,QAAQ,CAAC,CAAC;YAEnF,OAAO,IAAI,CAACA,QAAQ;QACtB,CAAC;QAED,OAAOS;IACT;IAEA,MAAMa,KAAKC,SAAoB,EAAoB;QACjD,MAAMC,MAAM,MAAM,IAAI,CAACtB,eAAe,CAACqB;QACvC,OAAO,MAAMA,UAAUE,UAAU,CAACD;IACpC;AACF;;IAzDGE,IAAAA,oBAAU,EAACC,gBAAM;GAFP9B","file":"affected.filter.js"}
@@ -0,0 +1,4 @@
1
+ export * from './affected.filter';
2
+ export * from './pipeline';
3
+ export * from './private.filter';
4
+ export * from './scripts.filter';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["filters/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC","file":"index.d.ts","sourcesContent":["export * from './affected.filter';\nexport * from './pipeline';\nexport * from './private.filter';\nexport * from './scripts.filter';\n"]}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ _exportStar(require("./affected.filter"), exports);
6
+ _exportStar(require("./pipeline"), exports);
7
+ _exportStar(require("./private.filter"), exports);
8
+ _exportStar(require("./scripts.filter"), exports);
9
+ function _exportStar(from, to) {
10
+ Object.keys(from).forEach(function(k) {
11
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) Object.defineProperty(to, k, {
12
+ enumerable: true,
13
+ get: function() {
14
+ return from[k];
15
+ }
16
+ });
17
+ });
18
+ return from;
19
+ }
20
+
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["filters/index.js"],"sourcesContent":["export * from './affected.filter';\nexport * from './pipeline';\nexport * from './private.filter';\nexport * from './scripts.filter';\n"],"names":[],"mappings":"AAAA;;;;oBAAc;oBACA;oBACA;oBACA","file":"index.js"}
@@ -0,0 +1,11 @@
1
+ import { Workspace } from '../project';
2
+ import { Awaitable } from '../types';
3
+ export interface PipelineFilter {
4
+ test(workspace: Workspace): Awaitable<boolean>;
5
+ }
6
+ export declare class Pipeline {
7
+ private _filters;
8
+ add(filter: PipelineFilter): void;
9
+ private _test;
10
+ filter(workspaces: Iterable<Workspace> | AsyncIterable<Workspace>): AsyncGenerator<Workspace>;
11
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["filters/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,MAAM,WAAW,cAAc;IAE7B,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;CAChD;AAGD,qBAAa,QAAQ;IAEnB,OAAO,CAAC,QAAQ,CAAwB;IAGxC,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;YAInB,KAAK;IAYZ,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC;CAOrG","file":"pipeline.d.ts","sourcesContent":["import { Workspace } from '../project';\nimport { Awaitable } from '../types';\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"]}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "Pipeline", {
6
+ enumerable: true,
7
+ get: ()=>Pipeline
8
+ });
9
+ class Pipeline {
10
+ // Attributes
11
+ _filters = [];
12
+ // Methods
13
+ add(filter) {
14
+ this._filters.push(filter);
15
+ }
16
+ async _test(workspace) {
17
+ for (const filter of this._filters){
18
+ const res = await filter.test(workspace);
19
+ if (!res) {
20
+ return false;
21
+ }
22
+ }
23
+ return true;
24
+ }
25
+ async *filter(workspaces) {
26
+ for await (const wks of workspaces){
27
+ if (await this._test(wks)) {
28
+ yield wks;
29
+ }
30
+ }
31
+ }
32
+ }
33
+
34
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["filters/pipeline.js"],"sourcesContent":["import { Workspace } from '../project';\nimport { Awaitable } from '../types';\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"],"names":["Pipeline","_filters","add","filter","push","_test","workspace","res","test","workspaces","wks"],"mappings":"AAAA;;;;+BAUaA;;aAAAA;;AAAN,MAAMA;IACX,aAAa;IACLC,WAA6B,EAAE,CAAC;IAExC,UAAU;IACVC,IAAIC,MAAsB,EAAQ;QAChC,IAAI,CAACF,QAAQ,CAACG,IAAI,CAACD;IACrB;IAEA,MAAcE,MAAMC,SAAoB,EAAoB;QAC1D,KAAK,MAAMH,UAAU,IAAI,CAACF,QAAQ,CAAE;YAClC,MAAMM,MAAM,MAAMJ,OAAOK,IAAI,CAACF;YAE9B,IAAI,CAACC,KAAK;gBACR,OAAO,KAAK;YACd,CAAC;QACH;QAEA,OAAO,IAAI;IACb;IAEA,OAAOJ,OAAOM,UAA0D,EAA6B;QACnG,WAAW,MAAMC,OAAOD,WAAY;YAClC,IAAI,MAAM,IAAI,CAACJ,KAAK,CAACK,MAAM;gBACzB,MAAMA;YACR,CAAC;QACH;IACF;AACF","file":"pipeline.js"}
@@ -0,0 +1,7 @@
1
+ import { Workspace } from '../project';
2
+ import { PipelineFilter } from './pipeline';
3
+ export declare class PrivateFilter implements PipelineFilter {
4
+ readonly value: boolean;
5
+ constructor(value: boolean);
6
+ test(workspace: Workspace): boolean;
7
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["filters/private.filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,qBAAa,aAAc,YAAW,cAAc;IAEtC,QAAQ,CAAC,KAAK,EAAE,OAAO;gBAAd,KAAK,EAAE,OAAO;IAGnC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;CAGpC","file":"private.filter.d.ts","sourcesContent":["import { Workspace } from '../project';\n\nimport { PipelineFilter } from './pipeline';\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"]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "PrivateFilter", {
6
+ enumerable: true,
7
+ get: ()=>PrivateFilter
8
+ });
9
+ class PrivateFilter {
10
+ // Constructor
11
+ constructor(value){
12
+ this.value = value;
13
+ }
14
+ // Methods
15
+ test(workspace) {
16
+ return (workspace.manifest.private ?? false) === this.value;
17
+ }
18
+ }
19
+
20
+ //# sourceMappingURL=private.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["filters/private.filter.js"],"sourcesContent":["import { Workspace } from '../project';\n\nimport { PipelineFilter } from './pipeline';\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"],"names":["PrivateFilter","constructor","value","test","workspace","manifest","private"],"mappings":"AAAA;;;;+BAKaA;;aAAAA;;AAAN,MAAMA;IACX,cAAc;IACdC,YAAqBC,MAAgB;qBAAhBA;IAAiB;IAEtC,UAAU;IACVC,KAAKC,SAAoB,EAAW;QAClC,OAAO,AAACA,CAAAA,UAAUC,QAAQ,CAACC,OAAO,IAAI,KAAK,AAAD,MAAO,IAAI,CAACJ,KAAK;IAC7D;AACF","file":"private.filter.js"}
@@ -0,0 +1,7 @@
1
+ import { Workspace } from '../project';
2
+ import { PipelineFilter } from './pipeline';
3
+ export declare class ScriptsFilter implements PipelineFilter {
4
+ readonly scripts: string[];
5
+ constructor(scripts: string[]);
6
+ test(workspace: Workspace): boolean;
7
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["filters/scripts.filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,qBAAa,aAAc,YAAW,cAAc;IAEtC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE;gBAAjB,OAAO,EAAE,MAAM,EAAE;IAGtC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;CAIpC","file":"scripts.filter.d.ts","sourcesContent":["import { Workspace } from '../project';\n\nimport { PipelineFilter } from './pipeline';\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"]}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "ScriptsFilter", {
6
+ enumerable: true,
7
+ get: ()=>ScriptsFilter
8
+ });
9
+ class ScriptsFilter {
10
+ // Constructor
11
+ constructor(scripts){
12
+ this.scripts = scripts;
13
+ }
14
+ // Methods
15
+ test(workspace) {
16
+ const scripts = Object.keys(workspace.manifest.scripts || {});
17
+ return this.scripts.some((scr)=>scripts.includes(scr));
18
+ }
19
+ }
20
+
21
+ //# sourceMappingURL=scripts.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["filters/scripts.filter.js"],"sourcesContent":["import { Workspace } from '../project';\n\nimport { PipelineFilter } from './pipeline';\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"],"names":["ScriptsFilter","constructor","scripts","test","workspace","Object","keys","manifest","some","scr","includes"],"mappings":"AAAA;;;;+BAKaA;;aAAAA;;AAAN,MAAMA;IACX,cAAc;IACdC,YAAqBC,QAAmB;uBAAnBA;IAAoB;IAEzC,UAAU;IACVC,KAAKC,SAAoB,EAAW;QAClC,MAAMF,UAAUG,OAAOC,IAAI,CAACF,UAAUG,QAAQ,CAACL,OAAO,IAAI,CAAC;QAC3D,OAAO,IAAI,CAACA,OAAO,CAACM,IAAI,CAAC,CAACC,MAAQP,QAAQQ,QAAQ,CAACD;IACrD;AACF","file":"scripts.filter.js"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ import { SpawnTask, SpawnTaskOptions, TaskContext, TaskManager } from '@jujulego/tasks';
2
+ import { Logger } from './services';
3
+ export interface GitContext extends TaskContext {
4
+ command: string;
5
+ }
6
+ export declare class Git {
7
+ static readonly manager: TaskManager<GitContext>;
8
+ static readonly logger: Logger;
9
+ static command(cmd: string, args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext>;
10
+ static branch(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext>;
11
+ static diff(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext>;
12
+ static tag(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext>;
13
+ static isAffected(reference: string, args?: string[], opts?: SpawnTaskOptions): Promise<boolean>;
14
+ static listBranches(args?: string[], opts?: SpawnTaskOptions): Promise<string[]>;
15
+ static listTags(args?: string[], opts?: SpawnTaskOptions): Promise<string[]>;
16
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAExF,OAAO,EAAc,MAAM,EAAE,MAAM,YAAY,CAAC;AAIhD,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,qBAAa,GAAG;IAGd,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAGjD,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAG/B,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,SAAS,CAAC,UAAU,CAAC;IAalG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC;IAIhF,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC;IAI9E,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC;IAK7E,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;WAevF,YAAY,CAAC,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;WAW7E,QAAQ,CAAC,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAUvF","file":"git.d.ts","sourcesContent":["import { SpawnTask, SpawnTaskOptions, TaskContext, TaskManager } from '@jujulego/tasks';\n\nimport { lazyInject, Logger } from './services';\nimport { streamLines } from './utils';\n\n// Types\nexport interface GitContext extends TaskContext {\n command: string;\n}\n\n// Git commands\nexport class Git {\n // Services\n @lazyInject(TaskManager)\n static readonly manager: TaskManager<GitContext>;\n\n @lazyInject(Logger)\n static readonly logger: Logger;\n\n // commons\n static 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 }, opts);\n task.subscribe('stream', ({ data }) => opts.logger.debug(data.toString('utf-8')));\n\n this.manager.add(task);\n\n return task;\n }\n\n // commands\n static branch(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('branch', args, options);\n }\n\n static diff(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('diff', args, options);\n }\n\n static tag(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('tag', args, options);\n }\n\n // high level\n static isAffected(reference: string, args: string[] = [], opts?: SpawnTaskOptions): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const task = this.diff(['--quiet', reference, ...args], opts);\n\n task.subscribe('status.done', () => resolve(true));\n task.subscribe('status.failed', () => {\n if (task.exitCode) {\n resolve(false);\n } else {\n reject(new Error(`Task ${task.name} failed`));\n }\n });\n });\n }\n\n static 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 static 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"]}