@ms-cloudpack/cli 0.66.2 → 0.66.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.
@@ -1 +1 @@
1
- {"version":3,"file":"createMockSession.d.ts","sourceRoot":"","sources":["../../src/__fixtures__/createMockSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAgBtD"}
1
+ {"version":3,"file":"createMockSession.d.ts","sourceRoot":"","sources":["../../src/__fixtures__/createMockSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAiBtD"}
@@ -13,6 +13,7 @@ export function createMockSession(id) {
13
13
  importMap: { imports: {} },
14
14
  linkedPaths: [],
15
15
  addLinkedPath: () => Promise.resolve({ resolveMap: {}, linkedPaths: [] }),
16
+ removeLinkedPath: () => Promise.resolve({ resolveMap: {}, linkedPaths: [] }),
16
17
  };
17
18
  }
18
19
  //# sourceMappingURL=createMockSession.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createMockSession.js","sourceRoot":"","sources":["../../src/__fixtures__/createMockSession.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,EAAW;IAC3C,OAAO;QACL,EAAE,EAAE,EAAE,IAAI,YAAY;QACtB,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;QACnE,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,EAAE;QACR,cAAc,EAAE,EAAE;QAClB,cAAc,EAAE,CAAC;QACjB,uBAAuB,EAAE,GAAG,EAAE,GAAE,CAAC;QACjC,sBAAsB,EAAE,GAAG,EAAE,GAAE,CAAC;QAChC,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1B,WAAW,EAAE,EAAE;QACf,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC","sourcesContent":["import type { Session } from '@ms-cloudpack/api-server';\n\nexport function createMockSession(id?: string): Session {\n return {\n id: id || 'session-id',\n config: { appPath: '/path/to/app', mode: 'library', generated: {} },\n projectName: 'app',\n resolveMap: {},\n sequence: 0,\n urls: {},\n targetVersions: {},\n sessionVersion: 1,\n incrementSessionVersion: () => {},\n incrementTargetVersion: () => {},\n importMap: { imports: {} },\n linkedPaths: [],\n addLinkedPath: () => Promise.resolve({ resolveMap: {}, linkedPaths: [] }),\n };\n}\n"]}
1
+ {"version":3,"file":"createMockSession.js","sourceRoot":"","sources":["../../src/__fixtures__/createMockSession.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,EAAW;IAC3C,OAAO;QACL,EAAE,EAAE,EAAE,IAAI,YAAY;QACtB,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;QACnE,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,EAAE;QACR,cAAc,EAAE,EAAE;QAClB,cAAc,EAAE,CAAC;QACjB,uBAAuB,EAAE,GAAG,EAAE,GAAE,CAAC;QACjC,sBAAsB,EAAE,GAAG,EAAE,GAAE,CAAC;QAChC,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1B,WAAW,EAAE,EAAE;QACf,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QACzE,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;KAC7E,CAAC;AACJ,CAAC","sourcesContent":["import type { Session } from '@ms-cloudpack/api-server';\n\nexport function createMockSession(id?: string): Session {\n return {\n id: id || 'session-id',\n config: { appPath: '/path/to/app', mode: 'library', generated: {} },\n projectName: 'app',\n resolveMap: {},\n sequence: 0,\n urls: {},\n targetVersions: {},\n sessionVersion: 1,\n incrementSessionVersion: () => {},\n incrementTargetVersion: () => {},\n importMap: { imports: {} },\n linkedPaths: [],\n addLinkedPath: () => Promise.resolve({ resolveMap: {}, linkedPaths: [] }),\n removeLinkedPath: () => Promise.resolve({ resolveMap: {}, linkedPaths: [] }),\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/commands/link/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAS1D;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,aAAa,CAAC,WAAW,CAuF9C,CAAC"}
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/commands/link/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAO1D;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,aAAa,CAAC,WAAW,CAkD9C,CAAC"}
@@ -1,5 +1,4 @@
1
- import { getActiveSessions } from './getActiveSessions.js';
2
- import { getSessionFromUser } from './getSessionFromUser.js';
1
+ import { getSessionToLink } from './getSessionToLink.js';
3
2
  import { createCloudpackClient } from '@ms-cloudpack/api-server';
4
3
  import { formatLinkSummary } from './formatLinkSummary.js';
5
4
  import { writeJson } from '@ms-cloudpack/json-utilities';
@@ -17,38 +16,8 @@ export const execute = async (params) => {
17
16
  console.debug('Ignored packages:', ignoredPackages?.join(', ') || 'none');
18
17
  console.debug('Apply host resolutions:', !ignoreResolutions);
19
18
  console.debug('Resolve strategy:', resolveStrategy);
20
- // Find the list of running sessions.
21
- const runningSessions = await getActiveSessions(reporter);
22
- if (runningSessions.length === 0) {
23
- await exit({
24
- exitCode: 1,
25
- message: 'No running sessions found. Please start a session using `cloudpack start` first.',
26
- });
27
- return;
28
- }
29
- console.debug(`Running sessions: ${runningSessions.map((session) => session.id).join(', ')}`);
30
- const runningSessionsMap = runningSessions.reduce((map, session) => {
31
- map.set(session.id, {
32
- title: session.projectName,
33
- description: session.config.appPath + ' ' + session.id,
34
- value: session,
35
- });
36
- return map;
37
- }, new Map());
38
- // Select a session to link packages.
39
- const session = await getSessionFromUser(runningSessionsMap);
40
- console.debug('Selected session:', session.id);
41
- const { urls } = session;
42
- const { apiServer } = urls;
43
- if (!apiServer) {
44
- // We should never get here, but just in case.
45
- await exit({
46
- exitCode: 1,
47
- message: 'The selected session does not have an API server URL.',
48
- });
49
- return;
50
- }
51
- const client = await createCloudpackClient({ url: apiServer });
19
+ const session = await getSessionToLink({ reporter, exit });
20
+ const client = await createCloudpackClient({ url: session.urls.apiServer, reporter });
52
21
  const includeMessage = includeAll ? ' including all internal paths' : '';
53
22
  const message = `Linking paths for ${session.projectName} at "${appPath}"${includeMessage}`;
54
23
  const task = reporter.addTask(message);
@@ -1 +1 @@
1
- {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/commands/link/execute.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandAction } from '../../types/CommandAction.js';\nimport type { LinkOptions } from './types/LinkOptions.js';\nimport { getActiveSessions } from './getActiveSessions.js';\nimport { getSessionFromUser } from './getSessionFromUser.js';\nimport type { Choice } from 'prompts';\nimport { createCloudpackClient } from '@ms-cloudpack/api-server';\nimport { formatLinkSummary } from './formatLinkSummary.js';\nimport { writeJson } from '@ms-cloudpack/json-utilities';\nimport path from 'path';\n\n/**\n * Defines the \"link\" verb entry point.\n */\nexport const execute: CommandAction<LinkOptions> = async (params) => {\n // Use the current directory as the default package path.\n const { options, cwd: appPath, reporter, initialize, exit } = params;\n\n const { ignore: ignoredPackages, all: includeAll, ignoreResolutions, resolveStrategy, logResolveMap } = options;\n await initialize({ appPath });\n\n console.debug('Linking packages...');\n console.debug('Include all:', !!includeAll);\n console.debug('Ignored packages:', ignoredPackages?.join(', ') || 'none');\n console.debug('Apply host resolutions:', !ignoreResolutions);\n console.debug('Resolve strategy:', resolveStrategy);\n\n // Find the list of running sessions.\n const runningSessions = await getActiveSessions(reporter);\n\n if (runningSessions.length === 0) {\n await exit({\n exitCode: 1,\n message: 'No running sessions found. Please start a session using `cloudpack start` first.',\n });\n return;\n }\n\n console.debug(`Running sessions: ${runningSessions.map((session) => session.id).join(', ')}`);\n\n const runningSessionsMap = runningSessions.reduce((map, session) => {\n map.set(session.id, {\n title: session.projectName,\n description: session.config.appPath + ' ' + session.id,\n value: session,\n });\n return map;\n }, new Map<string, Choice>());\n\n // Select a session to link packages.\n const session = await getSessionFromUser(runningSessionsMap);\n console.debug('Selected session:', session.id);\n\n const { urls } = session;\n const { apiServer } = urls;\n\n if (!apiServer) {\n // We should never get here, but just in case.\n await exit({\n exitCode: 1,\n message: 'The selected session does not have an API server URL.',\n });\n return;\n }\n\n const client = await createCloudpackClient({ url: apiServer });\n\n const includeMessage = includeAll ? ' including all internal paths' : '';\n const message = `Linking paths for ${session.projectName} at \"${appPath}\"${includeMessage}`;\n const task = reporter.addTask(message);\n // Relevant options should be passed to the api server.\n const data = {\n linkedPath: {\n path: appPath,\n ignoredPackages,\n includeAll,\n ignoreResolutions,\n resolveStrategy,\n },\n };\n\n // Send request to api server to link paths.\n const { resolveMap, linkedPaths } = await client.linkPath.query(data);\n await client.close();\n\n if (linkedPaths.find((p) => p.path === appPath) === undefined) {\n // Close down with an error.\n task.complete({ status: 'fail', message: `Failed to link paths.`, forceShow: true });\n await exit({ exitCode: 1, message: 'Failed to link paths.' });\n }\n\n if (logResolveMap) {\n // Write the linked resolve map to disk.\n await writeJson(path.join(appPath, 'resolve-map-linked.json'), resolveMap);\n }\n\n // Close down successfully.\n task.complete({ status: 'complete', message: `Linked paths`, forceShow: true });\n const linkSummary = formatLinkSummary({ session, resolveMap, linkedPaths, resolveStrategy });\n\n await exit({ exitCode: 0, message: linkSummary });\n};\n"]}
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/commands/link/execute.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandAction } from '../../types/CommandAction.js';\nimport type { LinkOptions } from './types/LinkOptions.js';\nimport { getSessionToLink } from './getSessionToLink.js';\nimport { createCloudpackClient } from '@ms-cloudpack/api-server';\nimport { formatLinkSummary } from './formatLinkSummary.js';\nimport { writeJson } from '@ms-cloudpack/json-utilities';\nimport path from 'path';\n\n/**\n * Defines the \"link\" verb entry point.\n */\nexport const execute: CommandAction<LinkOptions> = async (params) => {\n // Use the current directory as the default package path.\n const { options, cwd: appPath, reporter, initialize, exit } = params;\n\n const { ignore: ignoredPackages, all: includeAll, ignoreResolutions, resolveStrategy, logResolveMap } = options;\n await initialize({ appPath });\n\n console.debug('Linking packages...');\n console.debug('Include all:', !!includeAll);\n console.debug('Ignored packages:', ignoredPackages?.join(', ') || 'none');\n console.debug('Apply host resolutions:', !ignoreResolutions);\n console.debug('Resolve strategy:', resolveStrategy);\n\n const session = await getSessionToLink({ reporter, exit });\n const client = await createCloudpackClient({ url: session.urls.apiServer, reporter });\n\n const includeMessage = includeAll ? ' including all internal paths' : '';\n const message = `Linking paths for ${session.projectName} at \"${appPath}\"${includeMessage}`;\n const task = reporter.addTask(message);\n // Relevant options should be passed to the api server.\n const data = {\n linkedPath: {\n path: appPath,\n ignoredPackages,\n includeAll,\n ignoreResolutions,\n resolveStrategy,\n },\n };\n\n // Send request to api server to link paths.\n const { resolveMap, linkedPaths } = await client.linkPath.query(data);\n await client.close();\n\n if (linkedPaths.find((p) => p.path === appPath) === undefined) {\n // Close down with an error.\n task.complete({ status: 'fail', message: `Failed to link paths.`, forceShow: true });\n await exit({ exitCode: 1, message: 'Failed to link paths.' });\n }\n\n if (logResolveMap) {\n // Write the linked resolve map to disk.\n await writeJson(path.join(appPath, 'resolve-map-linked.json'), resolveMap);\n }\n\n // Close down successfully.\n task.complete({ status: 'complete', message: `Linked paths`, forceShow: true });\n const linkSummary = formatLinkSummary({ session, resolveMap, linkedPaths, resolveStrategy });\n\n await exit({ exitCode: 0, message: linkSummary });\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"formatLinkSummary.d.ts","sourceRoot":"","sources":["../../../src/commands/link/formatLinkSummary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAKL,KAAK,UAAU,EACf,KAAK,UAAU,EAEhB,MAAM,iCAAiC,CAAC;AAEzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;CAC1C,UAqBA"}
1
+ {"version":3,"file":"formatLinkSummary.d.ts","sourceRoot":"","sources":["../../../src/commands/link/formatLinkSummary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAKL,KAAK,UAAU,EACf,KAAK,UAAU,EAEhB,MAAM,iCAAiC,CAAC;AAEzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;CAC1C,UA4BA"}
@@ -3,18 +3,24 @@ import { diffResolveMaps, findResolveMapEntry, } from '@ms-cloudpack/package-uti
3
3
  export function formatLinkSummary(options) {
4
4
  const { session, linkedPaths, resolveMap, resolveStrategy } = options;
5
5
  const differences = diffResolveMaps({ before: session.resolveMap, after: resolveMap });
6
+ const linkedPathsMessage = linkedPaths.length
7
+ ? [
8
+ 'Linked paths:',
9
+ bulletedList(linkedPaths
10
+ .map((p) => p.path)
11
+ .sort()
12
+ .map((p) => cyan(p))),
13
+ ]
14
+ : ['No paths linked.'];
6
15
  const messages = [
7
16
  `Finished linking session: "${session.projectName}" (${session.id})`,
8
17
  '',
9
- `Linked paths:`,
10
- bulletedList(linkedPaths
11
- .map((p) => p.path)
12
- .sort()
13
- .map((p) => cyan(p))),
18
+ ...linkedPathsMessage,
14
19
  '',
15
20
  `Resolve map differences:`,
16
21
  bulletedList(formatDiff(differences)),
17
22
  ...duplicatedMessages({ session, differences, resolveStrategy }),
23
+ '',
18
24
  ];
19
25
  return messages.join('\n');
20
26
  }
@@ -60,9 +66,9 @@ function duplicatedMessages(options) {
60
66
  duplicated.join(', '),
61
67
  '',
62
68
  'This could lead to unexpected behavior. Please review the linked paths and resolve map to ensure correctness.',
63
- resolveStrategy == 'duplicate'
64
- ? 'Consider running link with `cloudpack link --resolve-strategy dedupe` to resolve these duplicates.'
65
- : '',
69
+ ...(resolveStrategy == 'duplicate'
70
+ ? ['Consider running link with `cloudpack link --resolve-strategy dedupe` to resolve these duplicates.']
71
+ : []),
66
72
  ]
67
73
  : [];
68
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"formatLinkSummary.js","sourceRoot":"","sources":["../../../src/commands/link/formatLinkSummary.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Session } from '@ms-cloudpack/api-server';\nimport { bulletedList, cyan } from '@ms-cloudpack/task-reporter';\nimport {\n diffResolveMaps,\n findResolveMapEntry,\n type DiffResolveMapsChanges,\n type DiffResolveMapsStats,\n type LinkedPath,\n type ResolveMap,\n type ResolveMapEntry,\n} from '@ms-cloudpack/package-utilities';\n\nexport function formatLinkSummary(options: {\n session: Session;\n resolveMap: ResolveMap;\n linkedPaths: LinkedPath[];\n resolveStrategy?: 'dedupe' | 'duplicate';\n}) {\n const { session, linkedPaths, resolveMap, resolveStrategy } = options;\n const differences = diffResolveMaps({ before: session.resolveMap, after: resolveMap });\n\n const messages = [\n `Finished linking session: \"${session.projectName}\" (${session.id})`,\n '',\n `Linked paths:`,\n bulletedList(\n linkedPaths\n .map((p) => p.path)\n .sort()\n .map((p) => cyan(p)),\n ),\n '',\n `Resolve map differences:`,\n bulletedList(formatDiff(differences)),\n ...duplicatedMessages({ session, differences, resolveStrategy }),\n ];\n\n return messages.join('\\n');\n}\n\nfunction formatDiff(diff: DiffResolveMapsStats) {\n const messages = [];\n const added = formatDiffChanges(diff.added);\n const removed = formatDiffChanges(diff.removed);\n\n if (!added.length && !removed.length) {\n messages.push('No differences found');\n }\n\n if (added.length) {\n messages.push('Added:', added);\n }\n\n if (removed.length) {\n messages.push('Removed:', removed);\n }\n\n return messages;\n}\n\nfunction formatDiffChanges(changes: DiffResolveMapsChanges) {\n const messages = [];\n if (changes.linked.length) {\n messages.push('Linked:', changes.linked.map(formatEntry).sort());\n }\n\n if (changes.internal.length) {\n messages.push('Internal:', changes.internal.map(formatEntry).sort());\n }\n\n if (changes.external.length) {\n messages.push('External:', changes.external.map(formatEntry).sort());\n }\n\n return messages;\n}\n\nfunction formatEntry(entry: ResolveMapEntry) {\n return `${entry.name}@${entry.version} (${entry.path})`;\n}\n\nfunction duplicatedMessages(options: {\n session: Session;\n differences: DiffResolveMapsStats;\n resolveStrategy?: 'dedupe' | 'duplicate';\n}) {\n const { session, differences, resolveStrategy } = options;\n const duplicated = findDuplicates({ session, differences });\n\n return duplicated.length\n ? [\n '',\n `Warning:`,\n 'The following packages were duplicated by linking:',\n duplicated.join(', '),\n '',\n 'This could lead to unexpected behavior. Please review the linked paths and resolve map to ensure correctness.',\n resolveStrategy == 'duplicate'\n ? 'Consider running link with `cloudpack link --resolve-strategy dedupe` to resolve these duplicates.'\n : '',\n ]\n : [];\n}\n\n/**\n * Find entries that were duplicated by linking.\n * This means that the package already existed in the resolve map,\n * and now there are more versions of the package than there were before.\n */\nfunction findDuplicates(options: { session: Session; differences: DiffResolveMapsStats }) {\n const { session, differences } = options;\n const duplicated = new Map<string, number>();\n\n for (const packageType of Object.values(differences.added)) {\n for (const change of packageType as ResolveMapEntry[]) {\n const { name } = change;\n const entry = findResolveMapEntry({ packageName: name, resolveMap: session.resolveMap });\n if (entry) {\n duplicated.set(name, (duplicated.get(name) || 0) + 1);\n }\n }\n }\n\n for (const packageType of Object.values(differences.removed)) {\n for (const change of packageType as ResolveMapEntry[]) {\n const { name } = change;\n if (duplicated.has(name)) {\n // We already checked for existence in the resolve map, so we know this will be a number.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n duplicated.set(name, duplicated.get(name)! - 1);\n }\n }\n }\n\n return Array.from(duplicated.entries())\n .filter(([, value]) => value > 0)\n .map(([key]) => key)\n .sort();\n}\n"]}
1
+ {"version":3,"file":"formatLinkSummary.js","sourceRoot":"","sources":["../../../src/commands/link/formatLinkSummary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EACL,eAAe,EACf,mBAAmB,GAMpB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,UAAU,iBAAiB,CAAC,OAKjC;IACC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IACtE,MAAM,WAAW,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IAEvF,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM;QAC3C,CAAC,CAAC;YACE,eAAe;YACf,YAAY,CACV,WAAW;iBACR,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,EAAE;iBACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CACvB;SACF;QACH,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAEzB,MAAM,QAAQ,GAAG;QACf,8BAA8B,OAAO,CAAC,WAAW,MAAM,OAAO,CAAC,EAAE,GAAG;QACpE,EAAE;QACF,GAAG,kBAAkB;QACrB,EAAE;QACF,0BAA0B;QAC1B,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACrC,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;QAChE,EAAE;KACH,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,UAAU,CAAC,IAA0B;IAC5C,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEhD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACrC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAA+B;IACxD,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,KAAsB;IACzC,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC;AAC1D,CAAC;AAED,SAAS,kBAAkB,CAAC,OAI3B;IACC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAC1D,MAAM,UAAU,GAAG,cAAc,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAE5D,OAAO,UAAU,CAAC,MAAM;QACtB,CAAC,CAAC;YACE,EAAE;YACF,UAAU;YACV,oDAAoD;YACpD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YACrB,EAAE;YACF,+GAA+G;YAC/G,GAAG,CAAC,eAAe,IAAI,WAAW;gBAChC,CAAC,CAAC,CAAC,oGAAoG,CAAC;gBACxG,CAAC,CAAC,EAAE,CAAC;SACR;QACH,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,OAAgE;IACtF,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE7C,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,KAAK,MAAM,MAAM,IAAI,WAAgC,EAAE,CAAC;YACtD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;YACxB,MAAM,KAAK,GAAG,mBAAmB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YACzF,IAAI,KAAK,EAAE,CAAC;gBACV,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,KAAK,MAAM,MAAM,IAAI,WAAgC,EAAE,CAAC;YACtD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;YACxB,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,yFAAyF;gBACzF,oEAAoE;gBACpE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAE,GAAG,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;SACnB,IAAI,EAAE,CAAC;AACZ,CAAC","sourcesContent":["import type { Session } from '@ms-cloudpack/api-server';\nimport { bulletedList, cyan } from '@ms-cloudpack/task-reporter';\nimport {\n diffResolveMaps,\n findResolveMapEntry,\n type DiffResolveMapsChanges,\n type DiffResolveMapsStats,\n type LinkedPath,\n type ResolveMap,\n type ResolveMapEntry,\n} from '@ms-cloudpack/package-utilities';\n\nexport function formatLinkSummary(options: {\n session: Session;\n resolveMap: ResolveMap;\n linkedPaths: LinkedPath[];\n resolveStrategy?: 'dedupe' | 'duplicate';\n}) {\n const { session, linkedPaths, resolveMap, resolveStrategy } = options;\n const differences = diffResolveMaps({ before: session.resolveMap, after: resolveMap });\n\n const linkedPathsMessage = linkedPaths.length\n ? [\n 'Linked paths:',\n bulletedList(\n linkedPaths\n .map((p) => p.path)\n .sort()\n .map((p) => cyan(p)),\n ),\n ]\n : ['No paths linked.'];\n\n const messages = [\n `Finished linking session: \"${session.projectName}\" (${session.id})`,\n '',\n ...linkedPathsMessage,\n '',\n `Resolve map differences:`,\n bulletedList(formatDiff(differences)),\n ...duplicatedMessages({ session, differences, resolveStrategy }),\n '',\n ];\n\n return messages.join('\\n');\n}\n\nfunction formatDiff(diff: DiffResolveMapsStats) {\n const messages = [];\n const added = formatDiffChanges(diff.added);\n const removed = formatDiffChanges(diff.removed);\n\n if (!added.length && !removed.length) {\n messages.push('No differences found');\n }\n\n if (added.length) {\n messages.push('Added:', added);\n }\n\n if (removed.length) {\n messages.push('Removed:', removed);\n }\n\n return messages;\n}\n\nfunction formatDiffChanges(changes: DiffResolveMapsChanges) {\n const messages = [];\n if (changes.linked.length) {\n messages.push('Linked:', changes.linked.map(formatEntry).sort());\n }\n\n if (changes.internal.length) {\n messages.push('Internal:', changes.internal.map(formatEntry).sort());\n }\n\n if (changes.external.length) {\n messages.push('External:', changes.external.map(formatEntry).sort());\n }\n\n return messages;\n}\n\nfunction formatEntry(entry: ResolveMapEntry) {\n return `${entry.name}@${entry.version} (${entry.path})`;\n}\n\nfunction duplicatedMessages(options: {\n session: Session;\n differences: DiffResolveMapsStats;\n resolveStrategy?: 'dedupe' | 'duplicate';\n}) {\n const { session, differences, resolveStrategy } = options;\n const duplicated = findDuplicates({ session, differences });\n\n return duplicated.length\n ? [\n '',\n `Warning:`,\n 'The following packages were duplicated by linking:',\n duplicated.join(', '),\n '',\n 'This could lead to unexpected behavior. Please review the linked paths and resolve map to ensure correctness.',\n ...(resolveStrategy == 'duplicate'\n ? ['Consider running link with `cloudpack link --resolve-strategy dedupe` to resolve these duplicates.']\n : []),\n ]\n : [];\n}\n\n/**\n * Find entries that were duplicated by linking.\n * This means that the package already existed in the resolve map,\n * and now there are more versions of the package than there were before.\n */\nfunction findDuplicates(options: { session: Session; differences: DiffResolveMapsStats }) {\n const { session, differences } = options;\n const duplicated = new Map<string, number>();\n\n for (const packageType of Object.values(differences.added)) {\n for (const change of packageType as ResolveMapEntry[]) {\n const { name } = change;\n const entry = findResolveMapEntry({ packageName: name, resolveMap: session.resolveMap });\n if (entry) {\n duplicated.set(name, (duplicated.get(name) || 0) + 1);\n }\n }\n }\n\n for (const packageType of Object.values(differences.removed)) {\n for (const change of packageType as ResolveMapEntry[]) {\n const { name } = change;\n if (duplicated.has(name)) {\n // We already checked for existence in the resolve map, so we know this will be a number.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n duplicated.set(name, duplicated.get(name)! - 1);\n }\n }\n }\n\n return Array.from(duplicated.entries())\n .filter(([, value]) => value > 0)\n .map(([key]) => key)\n .sort();\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import type { CommandActionParams } from '../../types/CommandAction.js';
2
+ import type { TaskReporter } from '@ms-cloudpack/task-reporter';
3
+ import type { Session } from '@ms-cloudpack/api-server';
4
+ type SessionWithRequiredApiServer = Session & {
5
+ urls: {
6
+ apiServer: string;
7
+ };
8
+ };
9
+ /**
10
+ * Get a single active session to link packages.
11
+ * The session must have an API server URL.
12
+ */
13
+ export declare function getSessionToLink(options: {
14
+ reporter: TaskReporter;
15
+ exit: CommandActionParams<object>['exit'];
16
+ }): Promise<SessionWithRequiredApiServer>;
17
+ export {};
18
+ //# sourceMappingURL=getSessionToLink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSessionToLink.d.ts","sourceRoot":"","sources":["../../../src/commands/link/getSessionToLink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,KAAK,4BAA4B,GAAG,OAAO,GAAG;IAAE,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE9E;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,QAAQ,EAAE,YAAY,CAAC;IACvB,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;CAC3C,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAuCxC"}
@@ -0,0 +1,38 @@
1
+ import { getActiveSessions } from './getActiveSessions.js';
2
+ import { getSessionFromUser } from './getSessionFromUser.js';
3
+ /**
4
+ * Get a single active session to link packages.
5
+ * The session must have an API server URL.
6
+ */
7
+ export async function getSessionToLink(options) {
8
+ const { reporter, exit } = options;
9
+ // Find the list of running sessions.
10
+ const runningSessions = await getActiveSessions(reporter);
11
+ if (runningSessions.length === 0) {
12
+ await exit({
13
+ exitCode: 1,
14
+ message: 'No running sessions found. Please start a session using `cloudpack start` first.',
15
+ });
16
+ }
17
+ console.debug(`Running sessions: ${runningSessions.map((session) => session.id).join(', ')}`);
18
+ const runningSessionsMap = new Map(runningSessions.map((session) => [
19
+ session.id,
20
+ {
21
+ title: session.projectName,
22
+ description: session.config.appPath + ' ' + session.id,
23
+ value: session,
24
+ },
25
+ ]));
26
+ // Select a session to link packages.
27
+ const session = await getSessionFromUser(runningSessionsMap);
28
+ console.debug('Selected session:', session.id);
29
+ if (!session.urls.apiServer) {
30
+ // We should never get here, but just in case.
31
+ await exit({
32
+ exitCode: 1,
33
+ message: 'The selected session does not have an API server URL.',
34
+ });
35
+ }
36
+ return session;
37
+ }
38
+ //# sourceMappingURL=getSessionToLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSessionToLink.js","sourceRoot":"","sources":["../../../src/commands/link/getSessionToLink.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAM7D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAGtC;IACC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEnC,qCAAqC;IACrC,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAE1D,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,CAAC;YACT,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,kFAAkF;SAC5F,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,qBAAqB,eAAe,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE9F,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAChC,eAAe,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/B,OAAO,CAAC,EAAE;QACV;YACE,KAAK,EAAE,OAAO,CAAC,WAAW;YAC1B,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC,EAAE;YACtD,KAAK,EAAE,OAAO;SACf;KACF,CAAC,CACH,CAAC;IAEF,qCAAqC;IACrC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;IAC7D,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAE/C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5B,8CAA8C;QAC9C,MAAM,IAAI,CAAC;YACT,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,uDAAuD;SACjE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAuC,CAAC;AACjD,CAAC","sourcesContent":["import type { CommandActionParams } from '../../types/CommandAction.js';\nimport { getActiveSessions } from './getActiveSessions.js';\nimport { getSessionFromUser } from './getSessionFromUser.js';\nimport type { TaskReporter } from '@ms-cloudpack/task-reporter';\nimport type { Session } from '@ms-cloudpack/api-server';\n\ntype SessionWithRequiredApiServer = Session & { urls: { apiServer: string } };\n\n/**\n * Get a single active session to link packages.\n * The session must have an API server URL.\n */\nexport async function getSessionToLink(options: {\n reporter: TaskReporter;\n exit: CommandActionParams<object>['exit'];\n}): Promise<SessionWithRequiredApiServer> {\n const { reporter, exit } = options;\n\n // Find the list of running sessions.\n const runningSessions = await getActiveSessions(reporter);\n\n if (runningSessions.length === 0) {\n await exit({\n exitCode: 1,\n message: 'No running sessions found. Please start a session using `cloudpack start` first.',\n });\n }\n\n console.debug(`Running sessions: ${runningSessions.map((session) => session.id).join(', ')}`);\n\n const runningSessionsMap = new Map(\n runningSessions.map((session) => [\n session.id,\n {\n title: session.projectName,\n description: session.config.appPath + ' ' + session.id,\n value: session,\n },\n ]),\n );\n\n // Select a session to link packages.\n const session = await getSessionFromUser(runningSessionsMap);\n console.debug('Selected session:', session.id);\n\n if (!session.urls.apiServer) {\n // We should never get here, but just in case.\n await exit({\n exitCode: 1,\n message: 'The selected session does not have an API server URL.',\n });\n }\n\n return session as SessionWithRequiredApiServer;\n}\n"]}
@@ -3,7 +3,7 @@ import { Option } from 'commander';
3
3
  export const init = (program) => {
4
4
  program.addSubCommand({
5
5
  name: 'link',
6
- description: 'Links the package or packages found within the current folder to an existing Cloudpack start session.',
6
+ description: 'Links the package or packages found within the current folder from an existing Cloudpack start session.',
7
7
  options: {
8
8
  ignore: new Option('--ignore [packages...]', 'Ignores the given packages when linking. This can be used to ignore packages that are part of the current repo but have issues being bundled.'),
9
9
  all: new Option('--all', 'If specified, will link all internal packages discovered within the linked repo graph.'),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/link/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAInC,+BAA+B;AAC/B,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,OAAO,EAAE,EAAE;IACnD,OAAO,CAAC,aAAa,CAAc;QACjC,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,uGAAuG;QACzG,OAAO,EAAE;YACP,MAAM,EAAE,IAAI,MAAM,CAChB,wBAAwB,EACxB,+IAA+I,CAChJ;YACD,GAAG,EAAE,IAAI,MAAM,CACb,OAAO,EACP,wFAAwF,CACzF;YACD,iBAAiB,EAAE,IAAI,MAAM,CAC3B,sBAAsB,EACtB,yFAAyF,CAC1F;YACD,eAAe,EAAE,IAAI,MAAM,CACzB,+BAA+B,EAC/B,gHAAgH,CACjH;iBACE,OAAO,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;iBAChC,OAAO,CAAC,QAAQ,CAAC;YACpB,aAAa,EAAE,IAAI,MAAM,CACvB,mBAAmB,EACnB,2EAA2E,CAC5E;SACF;QACD,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC;KAC1C,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { Option } from 'commander';\nimport type { CommandInitFunction } from '../../types/CommandInitFunction.js';\nimport type { LinkOptions } from './types/LinkOptions.js';\n\n/** Defines the \"link\" verb. */\nexport const init: CommandInitFunction = (program) => {\n program.addSubCommand<LinkOptions>({\n name: 'link',\n description:\n 'Links the package or packages found within the current folder to an existing Cloudpack start session.',\n options: {\n ignore: new Option(\n '--ignore [packages...]',\n 'Ignores the given packages when linking. This can be used to ignore packages that are part of the current repo but have issues being bundled.',\n ),\n all: new Option(\n '--all',\n 'If specified, will link all internal packages discovered within the linked repo graph.',\n ),\n ignoreResolutions: new Option(\n '--ignore-resolutions',\n 'If specified, ignores resolutions from the host repo definition to the linked packages.',\n ),\n resolveStrategy: new Option(\n '--resolve-strategy <strategy>',\n 'The strategy to use when resolving linked packages. Options are \"dedupe\" or \"duplicate\". Defaults to \"dedupe\".',\n )\n .choices(['dedupe', 'duplicate'])\n .default('dedupe'),\n logResolveMap: new Option(\n '--log-resolve-map',\n 'Logs the linked resolve map to \"resolve-map-linked.json\" for diagnostics.',\n ),\n },\n getExecutor: () => import('./execute.js'),\n });\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/link/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAInC,+BAA+B;AAC/B,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,OAAO,EAAE,EAAE;IACnD,OAAO,CAAC,aAAa,CAAc;QACjC,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,yGAAyG;QAC3G,OAAO,EAAE;YACP,MAAM,EAAE,IAAI,MAAM,CAChB,wBAAwB,EACxB,+IAA+I,CAChJ;YACD,GAAG,EAAE,IAAI,MAAM,CACb,OAAO,EACP,wFAAwF,CACzF;YACD,iBAAiB,EAAE,IAAI,MAAM,CAC3B,sBAAsB,EACtB,yFAAyF,CAC1F;YACD,eAAe,EAAE,IAAI,MAAM,CACzB,+BAA+B,EAC/B,gHAAgH,CACjH;iBACE,OAAO,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;iBAChC,OAAO,CAAC,QAAQ,CAAC;YACpB,aAAa,EAAE,IAAI,MAAM,CACvB,mBAAmB,EACnB,2EAA2E,CAC5E;SACF;QACD,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC;KAC1C,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { Option } from 'commander';\nimport type { CommandInitFunction } from '../../types/CommandInitFunction.js';\nimport type { LinkOptions } from './types/LinkOptions.js';\n\n/** Defines the \"link\" verb. */\nexport const init: CommandInitFunction = (program) => {\n program.addSubCommand<LinkOptions>({\n name: 'link',\n description:\n 'Links the package or packages found within the current folder from an existing Cloudpack start session.',\n options: {\n ignore: new Option(\n '--ignore [packages...]',\n 'Ignores the given packages when linking. This can be used to ignore packages that are part of the current repo but have issues being bundled.',\n ),\n all: new Option(\n '--all',\n 'If specified, will link all internal packages discovered within the linked repo graph.',\n ),\n ignoreResolutions: new Option(\n '--ignore-resolutions',\n 'If specified, ignores resolutions from the host repo definition to the linked packages.',\n ),\n resolveStrategy: new Option(\n '--resolve-strategy <strategy>',\n 'The strategy to use when resolving linked packages. Options are \"dedupe\" or \"duplicate\". Defaults to \"dedupe\".',\n )\n .choices(['dedupe', 'duplicate'])\n .default('dedupe'),\n logResolveMap: new Option(\n '--log-resolve-map',\n 'Logs the linked resolve map to \"resolve-map-linked.json\" for diagnostics.',\n ),\n },\n getExecutor: () => import('./execute.js'),\n });\n};\n"]}
@@ -0,0 +1,7 @@
1
+ import type { CommandAction } from '../../types/CommandAction.js';
2
+ import type { UnlinkOptions } from './types/UnlinkOptions.js';
3
+ /**
4
+ * Defines the "unlink" verb entry point.
5
+ */
6
+ export declare const execute: CommandAction<UnlinkOptions>;
7
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/commands/unlink/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAO9D;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,aAAa,CAAC,aAAa,CAwChD,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { getSessionToLink } from '../link/getSessionToLink.js';
2
+ import { createCloudpackClient } from '@ms-cloudpack/api-server';
3
+ import { formatLinkSummary } from '../link/formatLinkSummary.js';
4
+ import { writeJson } from '@ms-cloudpack/json-utilities';
5
+ import path from 'path';
6
+ /**
7
+ * Defines the "unlink" verb entry point.
8
+ */
9
+ export const execute = async (params) => {
10
+ // Use the current directory as the default package path.
11
+ const { options, cwd: appPath, reporter, initialize, exit } = params;
12
+ const { logResolveMap } = options;
13
+ await initialize({ appPath });
14
+ console.debug('Unlinking packages...');
15
+ const session = await getSessionToLink({ reporter, exit });
16
+ const client = await createCloudpackClient({ url: session.urls.apiServer, reporter });
17
+ const message = `Unlinking paths for ${session.projectName} at "${appPath}"`;
18
+ const task = reporter.addTask(message);
19
+ const data = {
20
+ linkedPath: {
21
+ path: appPath,
22
+ },
23
+ };
24
+ // Send request to api server to link paths.
25
+ const { resolveMap, linkedPaths } = await client.unlinkPath.query(data);
26
+ await client.close();
27
+ if (linkedPaths.some((p) => p.path === appPath)) {
28
+ // Close down with an error.
29
+ task.complete({ status: 'fail', message: `Failed to unlink paths.`, forceShow: true });
30
+ await exit({ exitCode: 1, message: 'Failed to unlink paths.' });
31
+ }
32
+ if (logResolveMap) {
33
+ // Write the unlinked resolve map to disk.
34
+ await writeJson(path.join(appPath, 'resolve-map-unlinked.json'), resolveMap);
35
+ }
36
+ // Close down successfully.
37
+ task.complete({ status: 'complete', message: `Unlinked paths`, forceShow: true });
38
+ const linkSummary = formatLinkSummary({ session, resolveMap, linkedPaths });
39
+ await exit({ exitCode: 0, message: linkSummary });
40
+ };
41
+ //# sourceMappingURL=execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/commands/unlink/execute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAiC,KAAK,EAAE,MAAM,EAAE,EAAE;IACpE,yDAAyD;IACzD,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAErE,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAE9B,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEvC,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEtF,MAAM,OAAO,GAAG,uBAAuB,OAAO,CAAC,WAAW,QAAQ,OAAO,GAAG,CAAC;IAC7E,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG;QACX,UAAU,EAAE;YACV,IAAI,EAAE,OAAO;SACd;KACF,CAAC;IAEF,4CAA4C;IAC5C,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAErB,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;QAChD,4BAA4B;QAC5B,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,yBAAyB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvF,MAAM,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,0CAA0C;QAC1C,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,2BAA2B,CAAC,EAAE,UAAU,CAAC,CAAC;IAC/E,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,MAAM,WAAW,GAAG,iBAAiB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;IAE5E,MAAM,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;AACpD,CAAC,CAAC","sourcesContent":["import type { CommandAction } from '../../types/CommandAction.js';\nimport type { UnlinkOptions } from './types/UnlinkOptions.js';\nimport { getSessionToLink } from '../link/getSessionToLink.js';\nimport { createCloudpackClient } from '@ms-cloudpack/api-server';\nimport { formatLinkSummary } from '../link/formatLinkSummary.js';\nimport { writeJson } from '@ms-cloudpack/json-utilities';\nimport path from 'path';\n\n/**\n * Defines the \"unlink\" verb entry point.\n */\nexport const execute: CommandAction<UnlinkOptions> = async (params) => {\n // Use the current directory as the default package path.\n const { options, cwd: appPath, reporter, initialize, exit } = params;\n\n const { logResolveMap } = options;\n await initialize({ appPath });\n\n console.debug('Unlinking packages...');\n\n const session = await getSessionToLink({ reporter, exit });\n const client = await createCloudpackClient({ url: session.urls.apiServer, reporter });\n\n const message = `Unlinking paths for ${session.projectName} at \"${appPath}\"`;\n const task = reporter.addTask(message);\n const data = {\n linkedPath: {\n path: appPath,\n },\n };\n\n // Send request to api server to link paths.\n const { resolveMap, linkedPaths } = await client.unlinkPath.query(data);\n await client.close();\n\n if (linkedPaths.some((p) => p.path === appPath)) {\n // Close down with an error.\n task.complete({ status: 'fail', message: `Failed to unlink paths.`, forceShow: true });\n await exit({ exitCode: 1, message: 'Failed to unlink paths.' });\n }\n\n if (logResolveMap) {\n // Write the unlinked resolve map to disk.\n await writeJson(path.join(appPath, 'resolve-map-unlinked.json'), resolveMap);\n }\n\n // Close down successfully.\n task.complete({ status: 'complete', message: `Unlinked paths`, forceShow: true });\n const linkSummary = formatLinkSummary({ session, resolveMap, linkedPaths });\n\n await exit({ exitCode: 0, message: linkSummary });\n};\n"]}
@@ -0,0 +1,4 @@
1
+ import type { CommandInitFunction } from '../../types/CommandInitFunction.js';
2
+ /** Defines the "unlink" verb. */
3
+ export declare const init: CommandInitFunction;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/unlink/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAG9E,iCAAiC;AACjC,eAAO,MAAM,IAAI,EAAE,mBAalB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Option } from 'commander';
2
+ /** Defines the "unlink" verb. */
3
+ export const init = (program) => {
4
+ program.addSubCommand({
5
+ name: 'unlink',
6
+ description: 'Unlinks the package or packages found within the current folder from an existing Cloudpack start session.',
7
+ options: {
8
+ logResolveMap: new Option('--log-resolve-map', 'Logs the unlinked resolve map to "resolve-map-unlinked.json" for diagnostics.'),
9
+ },
10
+ getExecutor: () => import('./execute.js'),
11
+ });
12
+ };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/unlink/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAInC,iCAAiC;AACjC,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,OAAO,EAAE,EAAE;IACnD,OAAO,CAAC,aAAa,CAAgB;QACnC,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,2GAA2G;QAC7G,OAAO,EAAE;YACP,aAAa,EAAE,IAAI,MAAM,CACvB,mBAAmB,EACnB,+EAA+E,CAChF;SACF;QACD,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC;KAC1C,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { Option } from 'commander';\nimport type { CommandInitFunction } from '../../types/CommandInitFunction.js';\nimport type { UnlinkOptions } from './types/UnlinkOptions.js';\n\n/** Defines the \"unlink\" verb. */\nexport const init: CommandInitFunction = (program) => {\n program.addSubCommand<UnlinkOptions>({\n name: 'unlink',\n description:\n 'Unlinks the package or packages found within the current folder from an existing Cloudpack start session.',\n options: {\n logResolveMap: new Option(\n '--log-resolve-map',\n 'Logs the unlinked resolve map to \"resolve-map-unlinked.json\" for diagnostics.',\n ),\n },\n getExecutor: () => import('./execute.js'),\n });\n};\n"]}
@@ -0,0 +1,5 @@
1
+ export interface UnlinkOptions {
2
+ /** Writes the unlinked resolve map to `resolve-map-unlinked.json`. */
3
+ logResolveMap?: boolean;
4
+ }
5
+ //# sourceMappingURL=UnlinkOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnlinkOptions.d.ts","sourceRoot":"","sources":["../../../../src/commands/unlink/types/UnlinkOptions.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,sEAAsE;IACtE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=UnlinkOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnlinkOptions.js","sourceRoot":"","sources":["../../../../src/commands/unlink/types/UnlinkOptions.ts"],"names":[],"mappings":"","sourcesContent":["export interface UnlinkOptions {\n /** Writes the unlinked resolve map to `resolve-map-unlinked.json`. */\n logResolveMap?: boolean;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ms-cloudpack/cli",
3
- "version": "0.66.2",
3
+ "version": "0.66.3",
4
4
  "description": "The Cloudpack command line interface - a tool for managing fast inner and outer looping in web apps.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -10,16 +10,16 @@
10
10
  "cloudpack": "./bin/cloudpack.js"
11
11
  },
12
12
  "dependencies": {
13
- "@ms-cloudpack/api-server": "^0.46.3",
14
- "@ms-cloudpack/app-server": "^0.10.0",
15
- "@ms-cloudpack/common-types": "^0.10.0",
16
- "@ms-cloudpack/config": "^0.23.0",
13
+ "@ms-cloudpack/api-server": "^0.46.4",
14
+ "@ms-cloudpack/app-server": "^0.10.1",
15
+ "@ms-cloudpack/common-types": "^0.11.0",
16
+ "@ms-cloudpack/config": "^0.23.1",
17
17
  "@ms-cloudpack/feature-flags": "^0.1.1",
18
18
  "@ms-cloudpack/json-utilities": "^0.1.4",
19
- "@ms-cloudpack/overlay": "^0.17.27",
20
- "@ms-cloudpack/package-utilities": "^7.8.1",
19
+ "@ms-cloudpack/overlay": "^0.17.28",
20
+ "@ms-cloudpack/package-utilities": "^7.8.2",
21
21
  "@ms-cloudpack/path-string-parsing": "^1.2.3",
22
- "@ms-cloudpack/path-utilities": "^2.7.22",
22
+ "@ms-cloudpack/path-utilities": "^2.7.23",
23
23
  "@ms-cloudpack/remote-cache": "^0.8.0",
24
24
  "@ms-cloudpack/task-reporter": "^0.14.1",
25
25
  "@ms-cloudpack/telemetry": "^0.6.0",
@@ -34,7 +34,7 @@
34
34
  "workspace-tools": "^0.36.4"
35
35
  },
36
36
  "devDependencies": {
37
- "@ms-cloudpack/common-types": "^0.10.0",
37
+ "@ms-cloudpack/common-types": "^0.11.0",
38
38
  "@ms-cloudpack/eslint-plugin-internal": "^0.0.1",
39
39
  "@ms-cloudpack/scripts": "^0.0.1",
40
40
  "@ms-cloudpack/test-utilities": "^0.5.0",