@rushstack/package-extractor 0.2.1 → 0.2.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.
@@ -1,6 +1,26 @@
1
1
  import { IPackageJson } from '@rushstack/node-core-library';
2
2
  import { ITerminal } from '@rushstack/node-core-library';
3
3
 
4
+ /**
5
+ * The extractor-metadata.json file format.
6
+ *
7
+ * @public
8
+ */
9
+ export declare interface IExtractorMetadataJson {
10
+ /**
11
+ * The name of the main project the extraction was performed for.
12
+ */
13
+ mainProjectName: string;
14
+ /**
15
+ * A list of all projects that were extracted.
16
+ */
17
+ projects: IProjectInfoJson[];
18
+ /**
19
+ * A list of all links that are part of the extracted project.
20
+ */
21
+ links: ILinkInfo[];
22
+ }
23
+
4
24
  /**
5
25
  * Options that can be provided to the extractor.
6
26
  *
@@ -101,6 +121,42 @@ export declare interface IExtractorProjectConfiguration {
101
121
  dependenciesToExclude?: string[];
102
122
  }
103
123
 
124
+ /**
125
+ * Represents a symbolic link.
126
+ *
127
+ * @public
128
+ */
129
+ export declare interface ILinkInfo {
130
+ /**
131
+ * The type of link that was encountered.
132
+ */
133
+ kind: 'fileLink' | 'folderLink';
134
+ /**
135
+ * The path to the link, relative to the root of the extractor output folder.
136
+ */
137
+ linkPath: string;
138
+ /**
139
+ * The target that the link points to.
140
+ */
141
+ targetPath: string;
142
+ }
143
+
144
+ /**
145
+ * Part of the extractor-matadata.json file format. Represents an extracted project.
146
+ *
147
+ * @public
148
+ */
149
+ export declare interface IProjectInfoJson {
150
+ /**
151
+ * The name of the project as specified in its package.json file.
152
+ */
153
+ projectName: string;
154
+ /**
155
+ * This path is relative to the root of the extractor output folder
156
+ */
157
+ path: string;
158
+ }
159
+
104
160
  /**
105
161
  * Manages the business logic for the "rush deploy" command.
106
162
  *
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.34.7"
8
+ "packageVersion": "7.34.8"
9
9
  }
10
10
  ]
11
11
  }
@@ -13,19 +13,36 @@ declare module 'npm-packlist' {
13
13
  }
14
14
  /**
15
15
  * Part of the extractor-matadata.json file format. Represents an extracted project.
16
+ *
17
+ * @public
16
18
  */
17
- interface IProjectInfoJson {
19
+ export interface IProjectInfoJson {
18
20
  /**
19
- * This path is relative to the extractor target folder.
21
+ * The name of the project as specified in its package.json file.
22
+ */
23
+ projectName: string;
24
+ /**
25
+ * This path is relative to the root of the extractor output folder
20
26
  */
21
27
  path: string;
22
28
  }
23
29
  /**
24
30
  * The extractor-metadata.json file format.
31
+ *
32
+ * @public
25
33
  */
26
34
  export interface IExtractorMetadataJson {
35
+ /**
36
+ * The name of the main project the extraction was performed for.
37
+ */
27
38
  mainProjectName: string;
39
+ /**
40
+ * A list of all projects that were extracted.
41
+ */
28
42
  projects: IProjectInfoJson[];
43
+ /**
44
+ * A list of all links that are part of the extracted project.
45
+ */
29
46
  links: ILinkInfo[];
30
47
  }
31
48
  /**
@@ -170,5 +187,4 @@ export declare class PackageExtractor {
170
187
  private _writeExtractorMetadataAsync;
171
188
  private _makeBinLinksAsync;
172
189
  }
173
- export {};
174
190
  //# sourceMappingURL=PackageExtractor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PackageExtractor.d.ts","sourceRoot":"","sources":["../src/PackageExtractor.ts"],"names":[],"mappings":"AAQA,OAAO,EASL,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAmB,KAAK,SAAS,EAAiB,MAAM,mBAAmB,CAAC;AAKnF,OAAO,QAAQ,cAAc,CAAC;IAC5B,MAAa,MAAM;QACjB,SAAgB,MAAM,EAAE,MAAM,EAAE,CAAC;oBACd,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE;QAClC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,MAAM;QAC/D,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM;QAC5D,KAAK,IAAI,IAAI;KACrB;CACF;AAED;;GAEG;AACH,UAAU,gBAAgB;IACxB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAUD;;;;GAIG;AACH,MAAM,WAAW,8BAA8B;IAC7C;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,2BAA2B,CAAC,EAAE,MAAM,EAAE,CAAC;IACvC;;OAEG;IACH,+BAA+B,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3C;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,CAAC,WAAW,EAAE,YAAY,KAAK,YAAY,GAAG,SAAS,CAAC;IAE/E;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAE7C;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,qBAAqB,EAAE,8BAA8B,EAAE,CAAC;CACzD;AAED;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;IACU,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;YAyEtD,uBAAuB;IAgGrC;;OAEG;YACW,oBAAoB;IAyIlC,OAAO,CAAC,uBAAuB;IAwC/B;;;;;OAKG;IACH,OAAO,CAAC,4BAA4B;IAapC;;;;;OAKG;IACH,OAAO,CAAC,8BAA8B;IAYtC;;OAEG;YACW,mBAAmB;IAwIjC;;OAEG;YACW,oBAAoB;IAiDlC;;OAEG;YACW,4BAA4B;YA2C5B,kBAAkB;CAwCjC"}
1
+ {"version":3,"file":"PackageExtractor.d.ts","sourceRoot":"","sources":["../src/PackageExtractor.ts"],"names":[],"mappings":"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"}
@@ -522,9 +522,10 @@ class PackageExtractor {
522
522
  projects: [],
523
523
  links: []
524
524
  };
525
- for (const projectFolder of projectConfigurationsByPath.keys()) {
525
+ for (const { projectFolder, projectName } of projectConfigurationsByPath.values()) {
526
526
  if (state.foldersToCopy.has(projectFolder)) {
527
527
  extractorMetadataJson.projects.push({
528
+ projectName,
528
529
  path: this._remapPathForExtractorMetadata(projectFolder, options)
529
530
  });
530
531
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PackageExtractor.js","sourceRoot":"","sources":["../src/PackageExtractor.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport npmPacklist from 'npm-packlist';\nimport pnpmLinkBins from '@pnpm/link-bins';\nimport ignore, { Ignore } from 'ignore';\nimport {\n Async,\n AsyncQueue,\n Path,\n FileSystem,\n Import,\n Colors,\n JsonFile,\n AlreadyExistsBehavior,\n type IPackageJson,\n type ITerminal\n} from '@rushstack/node-core-library';\n\nimport { ArchiveManager } from './ArchiveManager';\nimport { SymlinkAnalyzer, type ILinkInfo, type PathNode } from './SymlinkAnalyzer';\nimport { matchesWithStar } from './Utils';\nimport { createLinksScriptFilename, scriptsFolderPath } from './PathConstants';\n\n// (@types/npm-packlist is missing this API)\ndeclare module 'npm-packlist' {\n export class Walker {\n public readonly result: string[];\n public constructor(opts: { path: string });\n public on(event: 'done', callback: (result: string[]) => void): Walker;\n public on(event: 'error', callback: (error: Error) => void): Walker;\n public start(): void;\n }\n}\n\n/**\n * Part of the extractor-matadata.json file format. Represents an extracted project.\n */\ninterface IProjectInfoJson {\n /**\n * This path is relative to the extractor target folder.\n */\n path: string;\n}\n\n/**\n * The extractor-metadata.json file format.\n */\nexport interface IExtractorMetadataJson {\n mainProjectName: string;\n projects: IProjectInfoJson[];\n links: ILinkInfo[];\n}\n\ninterface IExtractorState {\n foldersToCopy: Set<string>;\n projectConfigurationsByPath: Map<string, IExtractorProjectConfiguration>;\n projectConfigurationsByName: Map<string, IExtractorProjectConfiguration>;\n symlinkAnalyzer: SymlinkAnalyzer;\n archiver?: ArchiveManager;\n}\n\n/**\n * The extractor configuration for individual projects.\n *\n * @public\n */\nexport interface IExtractorProjectConfiguration {\n /**\n * The name of the project.\n */\n projectName: string;\n /**\n * The absolute path to the project.\n */\n projectFolder: string;\n /**\n * The names of additional projects to include when extracting this project.\n */\n additionalProjectsToInclude?: string[];\n /**\n * The names of additional dependencies to include when extracting this project.\n */\n additionalDependenciesToInclude?: string[];\n /**\n * The names of additional dependencies to exclude when extracting this project.\n */\n dependenciesToExclude?: string[];\n}\n\n/**\n * Options that can be provided to the extractor.\n *\n * @public\n */\nexport interface IExtractorOptions {\n /**\n * A terminal to log extraction progress.\n */\n terminal: ITerminal;\n\n /**\n * The main project to include in the extraction operation.\n */\n mainProjectName: string;\n\n /**\n * The source folder that copying originates from. Generally it is the repo root folder.\n */\n sourceRootFolder: string;\n\n /**\n * The target folder for the extraction.\n */\n targetRootFolder: string;\n\n /**\n * Whether to overwrite the target folder if it already exists.\n */\n overwriteExisting: boolean;\n\n /**\n * The desired path to be used when archiving the target folder. Supported file extensions: .zip.\n */\n createArchiveFilePath?: string;\n\n /**\n * Whether to skip copying files to the extraction target directory, and only create an extraction\n * archive. This is only supported when linkCreation is 'script' or 'none'.\n */\n createArchiveOnly?: boolean;\n\n /**\n * The pnpmfile configuration if using PNPM, otherwise undefined. The configuration will be used to\n * transform the package.json prior to extraction.\n */\n transformPackageJson?: (packageJson: IPackageJson) => IPackageJson | undefined;\n\n /**\n * If dependencies from the \"devDependencies\" package.json field should be included in the extraction.\n */\n includeDevDependencies?: boolean;\n\n /**\n * If files ignored by the .npmignore file should be included in the extraction.\n */\n includeNpmIgnoreFiles?: boolean;\n\n /**\n * The folder where the PNPM \"node_modules\" folder is located. This is used to resolve packages linked\n * to the PNPM virtual store.\n */\n pnpmInstallFolder?: string;\n\n /**\n * The link creation mode to use.\n * \"default\": Create the links while copying the files; this is the default behavior. Use this setting\n * if your file copy tool can handle links correctly.\n * \"script\": A Node.js script called create-links.js will be written to the target folder. Use this setting\n * to create links on the server machine, after the files have been uploaded.\n * \"none\": Do nothing; some other tool may create the links later, based on the extractor-metadata.json file.\n */\n linkCreation?: 'default' | 'script' | 'none';\n\n /**\n * An additional folder containing files which will be copied into the root of the extraction.\n */\n folderToCopy?: string;\n\n /**\n * Configurations for individual projects, keyed by the project path relative to the sourceRootFolder.\n */\n projectConfigurations: IExtractorProjectConfiguration[];\n}\n\n/**\n * Manages the business logic for the \"rush deploy\" command.\n *\n * @public\n */\nexport class PackageExtractor {\n /**\n * Extract a package using the provided options\n */\n public async extractAsync(options: IExtractorOptions): Promise<void> {\n const {\n terminal,\n projectConfigurations,\n sourceRootFolder,\n targetRootFolder,\n mainProjectName,\n overwriteExisting,\n createArchiveFilePath,\n createArchiveOnly\n } = options;\n\n if (createArchiveOnly) {\n if (options.linkCreation !== 'script' && options.linkCreation !== 'none') {\n throw new Error('createArchiveOnly is only supported when linkCreation is \"script\" or \"none\"');\n }\n if (!createArchiveFilePath) {\n throw new Error('createArchiveOnly is only supported when createArchiveFilePath is specified');\n }\n }\n\n let archiver: ArchiveManager | undefined;\n let archiveFilePath: string | undefined;\n if (createArchiveFilePath) {\n if (path.extname(createArchiveFilePath) !== '.zip') {\n throw new Error('Only archives with the .zip file extension are currently supported.');\n }\n\n archiveFilePath = path.resolve(targetRootFolder, createArchiveFilePath);\n archiver = new ArchiveManager();\n }\n\n await FileSystem.ensureFolderAsync(targetRootFolder);\n\n terminal.writeLine(Colors.cyan(`Extracting to target folder: ${targetRootFolder}`));\n terminal.writeLine(Colors.cyan(`Main project for extraction: ${mainProjectName}`));\n\n try {\n const existingExtraction: boolean =\n (await FileSystem.readFolderItemNamesAsync(targetRootFolder)).length > 0;\n if (existingExtraction) {\n if (!overwriteExisting) {\n throw new Error(\n 'The extraction target folder is not empty. Overwrite must be explicitly requested'\n );\n } else {\n terminal.writeLine('Deleting target folder contents...');\n terminal.writeLine('');\n await FileSystem.ensureEmptyFolderAsync(targetRootFolder);\n }\n }\n } catch (error: unknown) {\n if (!FileSystem.isFolderDoesNotExistError(error as Error)) {\n throw error;\n }\n }\n\n // Create a new state for each run\n const state: IExtractorState = {\n foldersToCopy: new Set(),\n projectConfigurationsByName: new Map(projectConfigurations.map((p) => [p.projectName, p])),\n projectConfigurationsByPath: new Map(projectConfigurations.map((p) => [p.projectFolder, p])),\n symlinkAnalyzer: new SymlinkAnalyzer({ requiredSourceParentPath: sourceRootFolder }),\n archiver\n };\n\n await this._performExtractionAsync(options, state);\n if (archiver && archiveFilePath) {\n terminal.writeLine(`Creating archive at \"${archiveFilePath}\"`);\n await archiver.createArchiveAsync(archiveFilePath);\n }\n }\n\n private async _performExtractionAsync(options: IExtractorOptions, state: IExtractorState): Promise<void> {\n const {\n terminal,\n mainProjectName,\n sourceRootFolder,\n targetRootFolder,\n folderToCopy: addditionalFolderToCopy,\n linkCreation\n } = options;\n const { projectConfigurationsByName, foldersToCopy, symlinkAnalyzer } = state;\n\n const mainProjectConfiguration: IExtractorProjectConfiguration | undefined =\n projectConfigurationsByName.get(mainProjectName);\n if (!mainProjectConfiguration) {\n throw new Error(`Main project \"${mainProjectName}\" was not found in the list of projects`);\n }\n\n // Calculate the set with additionalProjectsToInclude\n const includedProjectsSet: Set<IExtractorProjectConfiguration> = new Set([mainProjectConfiguration]);\n for (const { additionalProjectsToInclude } of includedProjectsSet) {\n if (additionalProjectsToInclude) {\n for (const additionalProjectNameToInclude of additionalProjectsToInclude) {\n const additionalProjectToInclude: IExtractorProjectConfiguration | undefined =\n projectConfigurationsByName.get(additionalProjectNameToInclude);\n if (!additionalProjectToInclude) {\n throw new Error(\n `Project \"${additionalProjectNameToInclude}\" was not found in the list of projects.`\n );\n }\n includedProjectsSet.add(additionalProjectToInclude);\n }\n }\n }\n\n for (const { projectName, projectFolder } of includedProjectsSet) {\n terminal.writeLine(Colors.cyan(`Analyzing project: ${projectName}`));\n await this._collectFoldersAsync(projectFolder, options, state);\n }\n\n if (!options.createArchiveOnly) {\n terminal.writeLine(`Copying folders to target folder \"${targetRootFolder}\"`);\n }\n await Async.forEachAsync(\n foldersToCopy,\n async (folderToCopy: string) => {\n await this._extractFolderAsync(folderToCopy, options, state);\n },\n {\n concurrency: 10\n }\n );\n\n switch (linkCreation) {\n case 'script': {\n const sourceFilePath: string = path.join(scriptsFolderPath, createLinksScriptFilename);\n if (!options.createArchiveOnly) {\n terminal.writeLine(`Creating ${createLinksScriptFilename}`);\n await FileSystem.copyFileAsync({\n sourcePath: sourceFilePath,\n destinationPath: path.join(targetRootFolder, createLinksScriptFilename),\n alreadyExistsBehavior: AlreadyExistsBehavior.Error\n });\n }\n await state.archiver?.addToArchiveAsync({\n filePath: sourceFilePath,\n archivePath: createLinksScriptFilename\n });\n break;\n }\n case 'default': {\n terminal.writeLine('Creating symlinks');\n const linksToCopy: ILinkInfo[] = symlinkAnalyzer.reportSymlinks();\n await Async.forEachAsync(linksToCopy, async (linkToCopy: ILinkInfo) => {\n await this._extractSymlinkAsync(linkToCopy, options, state);\n });\n await this._makeBinLinksAsync(options, state);\n break;\n }\n default: {\n break;\n }\n }\n\n terminal.writeLine('Creating extractor-metadata.json');\n await this._writeExtractorMetadataAsync(options, state);\n\n if (addditionalFolderToCopy) {\n const sourceFolderPath: string = path.resolve(sourceRootFolder, addditionalFolderToCopy);\n await FileSystem.copyFilesAsync({\n sourcePath: sourceFolderPath,\n destinationPath: targetRootFolder,\n alreadyExistsBehavior: AlreadyExistsBehavior.Error\n });\n }\n }\n\n /**\n * Recursively crawl the node_modules dependencies and collect the result in IExtractorState.foldersToCopy.\n */\n private async _collectFoldersAsync(\n packageJsonFolder: string,\n options: IExtractorOptions,\n state: IExtractorState\n ): Promise<void> {\n const { terminal, pnpmInstallFolder, transformPackageJson } = options;\n const { projectConfigurationsByPath } = state;\n\n const packageJsonFolderPathQueue: AsyncQueue<string> = new AsyncQueue([packageJsonFolder]);\n\n await Async.forEachAsync(\n packageJsonFolderPathQueue,\n async ([packageJsonFolderPath, callback]: [string, () => void]) => {\n const packageJsonRealFolderPath: string = await FileSystem.getRealPathAsync(packageJsonFolderPath);\n if (state.foldersToCopy.has(packageJsonRealFolderPath)) {\n // we've already seen this folder\n callback();\n return;\n }\n state.foldersToCopy.add(packageJsonRealFolderPath);\n\n const originalPackageJson: IPackageJson = await JsonFile.loadAsync(\n path.join(packageJsonRealFolderPath, 'package.json')\n );\n\n // Transform packageJson using the provided transformer, if requested\n const packageJson: IPackageJson = transformPackageJson?.(originalPackageJson) ?? originalPackageJson;\n\n // Union of keys from regular dependencies, peerDependencies, optionalDependencies\n // (and possibly devDependencies if includeDevDependencies=true)\n const dependencyNamesToProcess: Set<string> = new Set<string>();\n\n // Just the keys from optionalDependencies and peerDependencies\n const optionalDependencyNames: Set<string> = new Set<string>();\n\n for (const name of Object.keys(packageJson.dependencies || {})) {\n dependencyNamesToProcess.add(name);\n }\n for (const name of Object.keys(packageJson.peerDependencies || {})) {\n dependencyNamesToProcess.add(name);\n optionalDependencyNames.add(name); // consider peers optional, since they are so frequently broken\n }\n for (const name of Object.keys(packageJson.optionalDependencies || {})) {\n dependencyNamesToProcess.add(name);\n optionalDependencyNames.add(name);\n }\n\n // Check to see if this is a local project\n const projectConfiguration: IExtractorProjectConfiguration | undefined =\n projectConfigurationsByPath.get(packageJsonRealFolderPath);\n\n if (projectConfiguration) {\n if (options.includeDevDependencies) {\n for (const name of Object.keys(packageJson.devDependencies || {})) {\n dependencyNamesToProcess.add(name);\n }\n }\n\n this._applyDependencyFilters(\n terminal,\n dependencyNamesToProcess,\n projectConfiguration.additionalDependenciesToInclude,\n projectConfiguration.dependenciesToExclude\n );\n }\n\n for (const dependencyPackageName of dependencyNamesToProcess) {\n try {\n const dependencyPackageFolderPath: string = await Import.resolvePackageAsync({\n packageName: dependencyPackageName,\n baseFolderPath: packageJsonRealFolderPath,\n getRealPathAsync: async (filePath: string) => {\n try {\n return (await state.symlinkAnalyzer.analyzePathAsync(filePath)).nodePath;\n } catch (error: unknown) {\n if (FileSystem.isFileDoesNotExistError(error as Error)) {\n return filePath;\n }\n throw error;\n }\n }\n });\n packageJsonFolderPathQueue.push(dependencyPackageFolderPath);\n } catch (resolveErr) {\n if (optionalDependencyNames.has(dependencyPackageName)) {\n // Ignore missing optional dependency\n continue;\n }\n throw resolveErr;\n }\n }\n\n // Replicate the links to the virtual store. Note that if the package has not been hoisted by\n // PNPM, the package will not be resolvable from here.\n // Only apply this logic for packages that were actually installed under the common/temp folder.\n if (pnpmInstallFolder && Path.isUnder(packageJsonFolderPath, pnpmInstallFolder)) {\n try {\n // The PNPM virtual store links are created in this folder. We will resolve the current package\n // from that location and collect any additional links encountered along the way.\n // TODO: This can be configured via NPMRC. We should support that.\n const pnpmDotFolderPath: string = path.join(pnpmInstallFolder, 'node_modules', '.pnpm');\n\n // TODO: Investigate how package aliases are handled by PNPM in this case. For example:\n //\n // \"dependencies\": {\n // \"alias-name\": \"npm:real-name@^1.2.3\"\n // }\n const dependencyPackageFolderPath: string = await Import.resolvePackageAsync({\n packageName: packageJson.name,\n baseFolderPath: pnpmDotFolderPath,\n getRealPathAsync: async (filePath: string) => {\n try {\n return (await state.symlinkAnalyzer.analyzePathAsync(filePath)).nodePath;\n } catch (error: unknown) {\n if (FileSystem.isFileDoesNotExistError(error as Error)) {\n return filePath;\n }\n throw error;\n }\n }\n });\n packageJsonFolderPathQueue.push(dependencyPackageFolderPath);\n } catch (resolveErr) {\n // The virtual store link isn't guaranteed to exist, so ignore if it's missing\n // NOTE: If you encounter this warning a lot, please report it to the Rush maintainers.\n console.log('Ignoring missing PNPM virtual store link for ' + packageJsonFolderPath);\n }\n }\n\n callback();\n },\n {\n concurrency: 10\n }\n );\n }\n\n private _applyDependencyFilters(\n terminal: ITerminal,\n allDependencyNames: Set<string>,\n additionalDependenciesToInclude: string[] = [],\n dependenciesToExclude: string[] = []\n ): Set<string> {\n // Track packages that got added/removed for reporting purposes\n const extraIncludedPackageNames: string[] = [];\n const extraExcludedPackageNames: string[] = [];\n\n for (const patternWithStar of dependenciesToExclude) {\n for (const dependency of allDependencyNames) {\n if (matchesWithStar(patternWithStar, dependency)) {\n if (allDependencyNames.delete(dependency)) {\n extraExcludedPackageNames.push(dependency);\n }\n }\n }\n }\n\n for (const dependencyToInclude of additionalDependenciesToInclude) {\n if (!allDependencyNames.has(dependencyToInclude)) {\n allDependencyNames.add(dependencyToInclude);\n extraIncludedPackageNames.push(dependencyToInclude);\n }\n }\n\n if (extraIncludedPackageNames.length > 0) {\n extraIncludedPackageNames.sort();\n terminal.writeLine(`Extra dependencies included by settings: ${extraIncludedPackageNames.join(', ')}`);\n }\n\n if (extraExcludedPackageNames.length > 0) {\n extraExcludedPackageNames.sort();\n terminal.writeLine(`Extra dependencies excluded by settings: ${extraExcludedPackageNames.join(', ')}`);\n }\n\n return allDependencyNames;\n }\n\n /**\n * Maps a file path from IExtractorOptions.sourceRootFolder to IExtractorOptions.targetRootFolder\n *\n * Example input: \"C:\\\\MyRepo\\\\libraries\\\\my-lib\"\n * Example output: \"C:\\\\MyRepo\\\\common\\\\deploy\\\\libraries\\\\my-lib\"\n */\n private _remapPathForExtractorFolder(\n absolutePathInSourceFolder: string,\n options: IExtractorOptions\n ): string {\n const { sourceRootFolder, targetRootFolder } = options;\n const relativePath: string = path.relative(sourceRootFolder, absolutePathInSourceFolder);\n if (relativePath.startsWith('..')) {\n throw new Error(`Source path \"${absolutePathInSourceFolder}\" is not under \"${sourceRootFolder}\"`);\n }\n const absolutePathInTargetFolder: string = path.join(targetRootFolder, relativePath);\n return absolutePathInTargetFolder;\n }\n\n /**\n * Maps a file path from IExtractorOptions.sourceRootFolder to relative path\n *\n * Example input: \"C:\\\\MyRepo\\\\libraries\\\\my-lib\"\n * Example output: \"libraries/my-lib\"\n */\n private _remapPathForExtractorMetadata(\n absolutePathInSourceFolder: string,\n options: IExtractorOptions\n ): string {\n const { sourceRootFolder } = options;\n const relativePath: string = path.relative(sourceRootFolder, absolutePathInSourceFolder);\n if (relativePath.startsWith('..')) {\n throw new Error(`Source path \"${absolutePathInSourceFolder}\" is not under \"${sourceRootFolder}\"`);\n }\n return Path.convertToSlashes(relativePath);\n }\n\n /**\n * Copy one package folder to the extractor target folder.\n */\n private async _extractFolderAsync(\n sourceFolderPath: string,\n options: IExtractorOptions,\n state: IExtractorState\n ): Promise<void> {\n const { includeNpmIgnoreFiles, targetRootFolder } = options;\n const { projectConfigurationsByPath, archiver } = state;\n let useNpmIgnoreFilter: boolean = false;\n\n if (!includeNpmIgnoreFiles) {\n const sourceFolderRealPath: string = await FileSystem.getRealPathAsync(sourceFolderPath);\n const sourceProjectConfiguration: IExtractorProjectConfiguration | undefined =\n projectConfigurationsByPath.get(sourceFolderRealPath);\n if (sourceProjectConfiguration) {\n useNpmIgnoreFilter = true;\n }\n }\n\n const targetFolderPath: string = this._remapPathForExtractorFolder(sourceFolderPath, options);\n\n if (useNpmIgnoreFilter) {\n // Use npm-packlist to filter the files. Using the Walker class (instead of the default API) ensures\n // that \"bundledDependencies\" are not included.\n const walkerPromise: Promise<string[]> = new Promise<string[]>(\n (resolve: (result: string[]) => void, reject: (error: Error) => void) => {\n const walker: npmPacklist.Walker = new npmPacklist.Walker({\n path: sourceFolderPath\n });\n walker.on('done', resolve).on('error', reject).start();\n }\n );\n const npmPackFiles: string[] = await walkerPromise;\n\n const alreadyCopiedSourcePaths: Set<string> = new Set();\n\n await Async.forEachAsync(\n npmPackFiles,\n async (npmPackFile: string) => {\n // In issue https://github.com/microsoft/rushstack/issues/2121 we found that npm-packlist sometimes returns\n // duplicate file paths, for example:\n //\n // 'dist//index.js'\n // 'dist/index.js'\n //\n // We can detect the duplicates by comparing the path.resolve() result.\n const copySourcePath: string = path.resolve(sourceFolderPath, npmPackFile);\n if (alreadyCopiedSourcePaths.has(copySourcePath)) {\n return;\n }\n alreadyCopiedSourcePaths.add(copySourcePath);\n\n const copyDestinationPath: string = path.join(targetFolderPath, npmPackFile);\n const copySourcePathNode: PathNode = await state.symlinkAnalyzer.analyzePathAsync(copySourcePath);\n if (copySourcePathNode.kind !== 'link') {\n if (!options.createArchiveOnly) {\n await FileSystem.ensureFolderAsync(path.dirname(copyDestinationPath));\n // Use the fs.copyFile API instead of FileSystem.copyFileAsync() since copyFileAsync performs\n // a needless stat() call to determine if it's a file or folder, and we already know it's a file.\n await fs.promises.copyFile(copySourcePath, copyDestinationPath, fs.constants.COPYFILE_EXCL);\n }\n\n if (archiver) {\n const archivePath: string = path.relative(targetRootFolder, copyDestinationPath);\n await archiver.addToArchiveAsync({\n filePath: copySourcePath,\n archivePath,\n stats: copySourcePathNode.linkStats\n });\n }\n }\n },\n {\n concurrency: 10\n }\n );\n } else {\n // use a simplistic \"ignore\" ruleset to filter the files\n const ignoreFilter: Ignore = ignore();\n ignoreFilter.add([\n // The top-level node_modules folder is always excluded\n '/node_modules',\n // Also exclude well-known folders that can contribute a lot of unnecessary files\n '**/.git',\n '**/.svn',\n '**/.hg',\n '**/.DS_Store'\n ]);\n\n // Do a breadth-first search of the source folder, copying each file to the target folder\n const queue: AsyncQueue<string> = new AsyncQueue([sourceFolderPath]);\n await Async.forEachAsync(\n queue,\n async ([sourcePath, callback]: [string, () => void]) => {\n const relativeSourcePath: string = path.relative(sourceFolderPath, sourcePath);\n if (relativeSourcePath !== '' && ignoreFilter.ignores(relativeSourcePath)) {\n callback();\n return;\n }\n\n const sourcePathNode: PathNode = await state.symlinkAnalyzer.analyzePathAsync(sourcePath);\n if (sourcePathNode.kind === 'file') {\n const targetPath: string = path.join(targetFolderPath, relativeSourcePath);\n if (!options.createArchiveOnly) {\n // Manually call fs.copyFile to avoid unnecessary stat calls.\n await fs.promises.copyFile(sourcePath, targetPath, fs.constants.COPYFILE_EXCL);\n }\n\n // Add the file to the archive. Only need to add files since directories will be auto-created\n if (archiver) {\n const archivePath: string = path.relative(targetRootFolder, targetPath);\n await archiver.addToArchiveAsync({\n filePath: sourcePath,\n archivePath: archivePath,\n stats: sourcePathNode.linkStats\n });\n }\n } else if (sourcePathNode.kind === 'folder') {\n if (!options.createArchiveOnly) {\n const targetPath: string = path.join(targetFolderPath, relativeSourcePath);\n await FileSystem.ensureFolderAsync(targetPath);\n }\n const children: string[] = await FileSystem.readFolderItemNamesAsync(sourcePath);\n for (const child of children) {\n queue.push(path.join(sourcePath, child));\n }\n }\n\n callback();\n },\n {\n concurrency: 10\n }\n );\n }\n }\n\n /**\n * Create a symlink as described by the ILinkInfo object.\n */\n private async _extractSymlinkAsync(\n originalLinkInfo: ILinkInfo,\n options: IExtractorOptions,\n state: IExtractorState\n ): Promise<void> {\n const linkInfo: ILinkInfo = {\n kind: originalLinkInfo.kind,\n linkPath: this._remapPathForExtractorFolder(originalLinkInfo.linkPath, options),\n targetPath: this._remapPathForExtractorFolder(originalLinkInfo.targetPath, options)\n };\n\n const newLinkFolder: string = path.dirname(linkInfo.linkPath);\n await FileSystem.ensureFolderAsync(newLinkFolder);\n\n // Link to the relative path for symlinks\n const relativeTargetPath: string = path.relative(newLinkFolder, linkInfo.targetPath);\n\n // NOTE: This logic is based on NpmLinkManager._createSymlink()\n if (linkInfo.kind === 'fileLink') {\n // For files, we use a Windows \"hard link\", because creating a symbolic link requires\n // administrator permission. However hard links seem to cause build failures on Mac,\n // so for all other operating systems we use symbolic links for this case.\n if (process.platform === 'win32') {\n await FileSystem.createHardLinkAsync({\n linkTargetPath: relativeTargetPath,\n newLinkPath: linkInfo.linkPath\n });\n } else {\n await FileSystem.createSymbolicLinkFileAsync({\n linkTargetPath: relativeTargetPath,\n newLinkPath: linkInfo.linkPath\n });\n }\n } else {\n // Junctions are only supported on Windows. This will create a symbolic link on other platforms.\n await FileSystem.createSymbolicLinkJunctionAsync({\n linkTargetPath: relativeTargetPath,\n newLinkPath: linkInfo.linkPath\n });\n }\n\n // Since the created symlinks have the required relative paths, they can be added directly to\n // the archive.\n await state.archiver?.addToArchiveAsync({\n filePath: linkInfo.linkPath,\n archivePath: path.relative(options.targetRootFolder, linkInfo.linkPath)\n });\n }\n\n /**\n * Write the common/deploy/deploy-metadata.json file.\n */\n private async _writeExtractorMetadataAsync(\n options: IExtractorOptions,\n state: IExtractorState\n ): Promise<void> {\n const { mainProjectName, targetRootFolder } = options;\n const { projectConfigurationsByPath } = state;\n\n const extractorMetadataFileName: string = 'extractor-metadata.json';\n const extractorMetadataFilePath: string = path.join(targetRootFolder, extractorMetadataFileName);\n const extractorMetadataJson: IExtractorMetadataJson = {\n mainProjectName,\n projects: [],\n links: []\n };\n\n for (const projectFolder of projectConfigurationsByPath.keys()) {\n if (state.foldersToCopy.has(projectFolder)) {\n extractorMetadataJson.projects.push({\n path: this._remapPathForExtractorMetadata(projectFolder, options)\n });\n }\n }\n\n // Remap the links to be relative to target folder\n for (const absoluteLinkInfo of state.symlinkAnalyzer.reportSymlinks()) {\n const relativeInfo: ILinkInfo = {\n kind: absoluteLinkInfo.kind,\n linkPath: this._remapPathForExtractorMetadata(absoluteLinkInfo.linkPath, options),\n targetPath: this._remapPathForExtractorMetadata(absoluteLinkInfo.targetPath, options)\n };\n extractorMetadataJson.links.push(relativeInfo);\n }\n\n const extractorMetadataFileContent: string = JSON.stringify(extractorMetadataJson, undefined, 0);\n if (!options.createArchiveOnly) {\n await FileSystem.writeFileAsync(extractorMetadataFilePath, extractorMetadataFileContent);\n }\n await state.archiver?.addToArchiveAsync({\n fileData: extractorMetadataFileContent,\n archivePath: extractorMetadataFileName\n });\n }\n\n private async _makeBinLinksAsync(options: IExtractorOptions, state: IExtractorState): Promise<void> {\n const { terminal } = options;\n\n const extractedProjectFolders: string[] = Array.from(state.projectConfigurationsByPath.keys()).filter(\n (folderPath: string) => state.foldersToCopy.has(folderPath)\n );\n\n await Async.forEachAsync(\n extractedProjectFolders,\n async (projectFolder: string) => {\n const extractedProjectFolder: string = this._remapPathForExtractorFolder(projectFolder, options);\n const extractedProjectNodeModulesFolder: string = path.join(extractedProjectFolder, 'node_modules');\n const extractedProjectBinFolder: string = path.join(extractedProjectNodeModulesFolder, '.bin');\n\n const linkedBinPackageNames: string[] = await pnpmLinkBins(\n extractedProjectNodeModulesFolder,\n extractedProjectBinFolder,\n {\n warn: (msg: string) => terminal.writeLine(Colors.yellow(msg))\n }\n );\n\n if (linkedBinPackageNames.length && state.archiver) {\n const binFolderItems: string[] = await FileSystem.readFolderItemNamesAsync(\n extractedProjectBinFolder\n );\n for (const binFolderItem of binFolderItems) {\n const binFilePath: string = path.join(extractedProjectBinFolder, binFolderItem);\n await state.archiver.addToArchiveAsync({\n filePath: binFilePath,\n archivePath: path.relative(options.targetRootFolder, binFilePath)\n });\n }\n }\n },\n {\n concurrency: 10\n }\n );\n }\n}\n"]}
1
+ {"version":3,"file":"PackageExtractor.js","sourceRoot":"","sources":["../src/PackageExtractor.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport npmPacklist from 'npm-packlist';\nimport pnpmLinkBins from '@pnpm/link-bins';\nimport ignore, { Ignore } from 'ignore';\nimport {\n Async,\n AsyncQueue,\n Path,\n FileSystem,\n Import,\n Colors,\n JsonFile,\n AlreadyExistsBehavior,\n type IPackageJson,\n type ITerminal\n} from '@rushstack/node-core-library';\n\nimport { ArchiveManager } from './ArchiveManager';\nimport { SymlinkAnalyzer, type ILinkInfo, type PathNode } from './SymlinkAnalyzer';\nimport { matchesWithStar } from './Utils';\nimport { createLinksScriptFilename, scriptsFolderPath } from './PathConstants';\n\n// (@types/npm-packlist is missing this API)\ndeclare module 'npm-packlist' {\n export class Walker {\n public readonly result: string[];\n public constructor(opts: { path: string });\n public on(event: 'done', callback: (result: string[]) => void): Walker;\n public on(event: 'error', callback: (error: Error) => void): Walker;\n public start(): void;\n }\n}\n\n/**\n * Part of the extractor-matadata.json file format. Represents an extracted project.\n *\n * @public\n */\nexport interface IProjectInfoJson {\n /**\n * The name of the project as specified in its package.json file.\n */\n projectName: string;\n /**\n * This path is relative to the root of the extractor output folder\n */\n path: string;\n}\n\n/**\n * The extractor-metadata.json file format.\n *\n * @public\n */\nexport interface IExtractorMetadataJson {\n /**\n * The name of the main project the extraction was performed for.\n */\n mainProjectName: string;\n /**\n * A list of all projects that were extracted.\n */\n projects: IProjectInfoJson[];\n /**\n * A list of all links that are part of the extracted project.\n */\n links: ILinkInfo[];\n}\n\ninterface IExtractorState {\n foldersToCopy: Set<string>;\n projectConfigurationsByPath: Map<string, IExtractorProjectConfiguration>;\n projectConfigurationsByName: Map<string, IExtractorProjectConfiguration>;\n symlinkAnalyzer: SymlinkAnalyzer;\n archiver?: ArchiveManager;\n}\n\n/**\n * The extractor configuration for individual projects.\n *\n * @public\n */\nexport interface IExtractorProjectConfiguration {\n /**\n * The name of the project.\n */\n projectName: string;\n /**\n * The absolute path to the project.\n */\n projectFolder: string;\n /**\n * The names of additional projects to include when extracting this project.\n */\n additionalProjectsToInclude?: string[];\n /**\n * The names of additional dependencies to include when extracting this project.\n */\n additionalDependenciesToInclude?: string[];\n /**\n * The names of additional dependencies to exclude when extracting this project.\n */\n dependenciesToExclude?: string[];\n}\n\n/**\n * Options that can be provided to the extractor.\n *\n * @public\n */\nexport interface IExtractorOptions {\n /**\n * A terminal to log extraction progress.\n */\n terminal: ITerminal;\n\n /**\n * The main project to include in the extraction operation.\n */\n mainProjectName: string;\n\n /**\n * The source folder that copying originates from. Generally it is the repo root folder.\n */\n sourceRootFolder: string;\n\n /**\n * The target folder for the extraction.\n */\n targetRootFolder: string;\n\n /**\n * Whether to overwrite the target folder if it already exists.\n */\n overwriteExisting: boolean;\n\n /**\n * The desired path to be used when archiving the target folder. Supported file extensions: .zip.\n */\n createArchiveFilePath?: string;\n\n /**\n * Whether to skip copying files to the extraction target directory, and only create an extraction\n * archive. This is only supported when linkCreation is 'script' or 'none'.\n */\n createArchiveOnly?: boolean;\n\n /**\n * The pnpmfile configuration if using PNPM, otherwise undefined. The configuration will be used to\n * transform the package.json prior to extraction.\n */\n transformPackageJson?: (packageJson: IPackageJson) => IPackageJson | undefined;\n\n /**\n * If dependencies from the \"devDependencies\" package.json field should be included in the extraction.\n */\n includeDevDependencies?: boolean;\n\n /**\n * If files ignored by the .npmignore file should be included in the extraction.\n */\n includeNpmIgnoreFiles?: boolean;\n\n /**\n * The folder where the PNPM \"node_modules\" folder is located. This is used to resolve packages linked\n * to the PNPM virtual store.\n */\n pnpmInstallFolder?: string;\n\n /**\n * The link creation mode to use.\n * \"default\": Create the links while copying the files; this is the default behavior. Use this setting\n * if your file copy tool can handle links correctly.\n * \"script\": A Node.js script called create-links.js will be written to the target folder. Use this setting\n * to create links on the server machine, after the files have been uploaded.\n * \"none\": Do nothing; some other tool may create the links later, based on the extractor-metadata.json file.\n */\n linkCreation?: 'default' | 'script' | 'none';\n\n /**\n * An additional folder containing files which will be copied into the root of the extraction.\n */\n folderToCopy?: string;\n\n /**\n * Configurations for individual projects, keyed by the project path relative to the sourceRootFolder.\n */\n projectConfigurations: IExtractorProjectConfiguration[];\n}\n\n/**\n * Manages the business logic for the \"rush deploy\" command.\n *\n * @public\n */\nexport class PackageExtractor {\n /**\n * Extract a package using the provided options\n */\n public async extractAsync(options: IExtractorOptions): Promise<void> {\n const {\n terminal,\n projectConfigurations,\n sourceRootFolder,\n targetRootFolder,\n mainProjectName,\n overwriteExisting,\n createArchiveFilePath,\n createArchiveOnly\n } = options;\n\n if (createArchiveOnly) {\n if (options.linkCreation !== 'script' && options.linkCreation !== 'none') {\n throw new Error('createArchiveOnly is only supported when linkCreation is \"script\" or \"none\"');\n }\n if (!createArchiveFilePath) {\n throw new Error('createArchiveOnly is only supported when createArchiveFilePath is specified');\n }\n }\n\n let archiver: ArchiveManager | undefined;\n let archiveFilePath: string | undefined;\n if (createArchiveFilePath) {\n if (path.extname(createArchiveFilePath) !== '.zip') {\n throw new Error('Only archives with the .zip file extension are currently supported.');\n }\n\n archiveFilePath = path.resolve(targetRootFolder, createArchiveFilePath);\n archiver = new ArchiveManager();\n }\n\n await FileSystem.ensureFolderAsync(targetRootFolder);\n\n terminal.writeLine(Colors.cyan(`Extracting to target folder: ${targetRootFolder}`));\n terminal.writeLine(Colors.cyan(`Main project for extraction: ${mainProjectName}`));\n\n try {\n const existingExtraction: boolean =\n (await FileSystem.readFolderItemNamesAsync(targetRootFolder)).length > 0;\n if (existingExtraction) {\n if (!overwriteExisting) {\n throw new Error(\n 'The extraction target folder is not empty. Overwrite must be explicitly requested'\n );\n } else {\n terminal.writeLine('Deleting target folder contents...');\n terminal.writeLine('');\n await FileSystem.ensureEmptyFolderAsync(targetRootFolder);\n }\n }\n } catch (error: unknown) {\n if (!FileSystem.isFolderDoesNotExistError(error as Error)) {\n throw error;\n }\n }\n\n // Create a new state for each run\n const state: IExtractorState = {\n foldersToCopy: new Set(),\n projectConfigurationsByName: new Map(projectConfigurations.map((p) => [p.projectName, p])),\n projectConfigurationsByPath: new Map(projectConfigurations.map((p) => [p.projectFolder, p])),\n symlinkAnalyzer: new SymlinkAnalyzer({ requiredSourceParentPath: sourceRootFolder }),\n archiver\n };\n\n await this._performExtractionAsync(options, state);\n if (archiver && archiveFilePath) {\n terminal.writeLine(`Creating archive at \"${archiveFilePath}\"`);\n await archiver.createArchiveAsync(archiveFilePath);\n }\n }\n\n private async _performExtractionAsync(options: IExtractorOptions, state: IExtractorState): Promise<void> {\n const {\n terminal,\n mainProjectName,\n sourceRootFolder,\n targetRootFolder,\n folderToCopy: addditionalFolderToCopy,\n linkCreation\n } = options;\n const { projectConfigurationsByName, foldersToCopy, symlinkAnalyzer } = state;\n\n const mainProjectConfiguration: IExtractorProjectConfiguration | undefined =\n projectConfigurationsByName.get(mainProjectName);\n if (!mainProjectConfiguration) {\n throw new Error(`Main project \"${mainProjectName}\" was not found in the list of projects`);\n }\n\n // Calculate the set with additionalProjectsToInclude\n const includedProjectsSet: Set<IExtractorProjectConfiguration> = new Set([mainProjectConfiguration]);\n for (const { additionalProjectsToInclude } of includedProjectsSet) {\n if (additionalProjectsToInclude) {\n for (const additionalProjectNameToInclude of additionalProjectsToInclude) {\n const additionalProjectToInclude: IExtractorProjectConfiguration | undefined =\n projectConfigurationsByName.get(additionalProjectNameToInclude);\n if (!additionalProjectToInclude) {\n throw new Error(\n `Project \"${additionalProjectNameToInclude}\" was not found in the list of projects.`\n );\n }\n includedProjectsSet.add(additionalProjectToInclude);\n }\n }\n }\n\n for (const { projectName, projectFolder } of includedProjectsSet) {\n terminal.writeLine(Colors.cyan(`Analyzing project: ${projectName}`));\n await this._collectFoldersAsync(projectFolder, options, state);\n }\n\n if (!options.createArchiveOnly) {\n terminal.writeLine(`Copying folders to target folder \"${targetRootFolder}\"`);\n }\n await Async.forEachAsync(\n foldersToCopy,\n async (folderToCopy: string) => {\n await this._extractFolderAsync(folderToCopy, options, state);\n },\n {\n concurrency: 10\n }\n );\n\n switch (linkCreation) {\n case 'script': {\n const sourceFilePath: string = path.join(scriptsFolderPath, createLinksScriptFilename);\n if (!options.createArchiveOnly) {\n terminal.writeLine(`Creating ${createLinksScriptFilename}`);\n await FileSystem.copyFileAsync({\n sourcePath: sourceFilePath,\n destinationPath: path.join(targetRootFolder, createLinksScriptFilename),\n alreadyExistsBehavior: AlreadyExistsBehavior.Error\n });\n }\n await state.archiver?.addToArchiveAsync({\n filePath: sourceFilePath,\n archivePath: createLinksScriptFilename\n });\n break;\n }\n case 'default': {\n terminal.writeLine('Creating symlinks');\n const linksToCopy: ILinkInfo[] = symlinkAnalyzer.reportSymlinks();\n await Async.forEachAsync(linksToCopy, async (linkToCopy: ILinkInfo) => {\n await this._extractSymlinkAsync(linkToCopy, options, state);\n });\n await this._makeBinLinksAsync(options, state);\n break;\n }\n default: {\n break;\n }\n }\n\n terminal.writeLine('Creating extractor-metadata.json');\n await this._writeExtractorMetadataAsync(options, state);\n\n if (addditionalFolderToCopy) {\n const sourceFolderPath: string = path.resolve(sourceRootFolder, addditionalFolderToCopy);\n await FileSystem.copyFilesAsync({\n sourcePath: sourceFolderPath,\n destinationPath: targetRootFolder,\n alreadyExistsBehavior: AlreadyExistsBehavior.Error\n });\n }\n }\n\n /**\n * Recursively crawl the node_modules dependencies and collect the result in IExtractorState.foldersToCopy.\n */\n private async _collectFoldersAsync(\n packageJsonFolder: string,\n options: IExtractorOptions,\n state: IExtractorState\n ): Promise<void> {\n const { terminal, pnpmInstallFolder, transformPackageJson } = options;\n const { projectConfigurationsByPath } = state;\n\n const packageJsonFolderPathQueue: AsyncQueue<string> = new AsyncQueue([packageJsonFolder]);\n\n await Async.forEachAsync(\n packageJsonFolderPathQueue,\n async ([packageJsonFolderPath, callback]: [string, () => void]) => {\n const packageJsonRealFolderPath: string = await FileSystem.getRealPathAsync(packageJsonFolderPath);\n if (state.foldersToCopy.has(packageJsonRealFolderPath)) {\n // we've already seen this folder\n callback();\n return;\n }\n state.foldersToCopy.add(packageJsonRealFolderPath);\n\n const originalPackageJson: IPackageJson = await JsonFile.loadAsync(\n path.join(packageJsonRealFolderPath, 'package.json')\n );\n\n // Transform packageJson using the provided transformer, if requested\n const packageJson: IPackageJson = transformPackageJson?.(originalPackageJson) ?? originalPackageJson;\n\n // Union of keys from regular dependencies, peerDependencies, optionalDependencies\n // (and possibly devDependencies if includeDevDependencies=true)\n const dependencyNamesToProcess: Set<string> = new Set<string>();\n\n // Just the keys from optionalDependencies and peerDependencies\n const optionalDependencyNames: Set<string> = new Set<string>();\n\n for (const name of Object.keys(packageJson.dependencies || {})) {\n dependencyNamesToProcess.add(name);\n }\n for (const name of Object.keys(packageJson.peerDependencies || {})) {\n dependencyNamesToProcess.add(name);\n optionalDependencyNames.add(name); // consider peers optional, since they are so frequently broken\n }\n for (const name of Object.keys(packageJson.optionalDependencies || {})) {\n dependencyNamesToProcess.add(name);\n optionalDependencyNames.add(name);\n }\n\n // Check to see if this is a local project\n const projectConfiguration: IExtractorProjectConfiguration | undefined =\n projectConfigurationsByPath.get(packageJsonRealFolderPath);\n\n if (projectConfiguration) {\n if (options.includeDevDependencies) {\n for (const name of Object.keys(packageJson.devDependencies || {})) {\n dependencyNamesToProcess.add(name);\n }\n }\n\n this._applyDependencyFilters(\n terminal,\n dependencyNamesToProcess,\n projectConfiguration.additionalDependenciesToInclude,\n projectConfiguration.dependenciesToExclude\n );\n }\n\n for (const dependencyPackageName of dependencyNamesToProcess) {\n try {\n const dependencyPackageFolderPath: string = await Import.resolvePackageAsync({\n packageName: dependencyPackageName,\n baseFolderPath: packageJsonRealFolderPath,\n getRealPathAsync: async (filePath: string) => {\n try {\n return (await state.symlinkAnalyzer.analyzePathAsync(filePath)).nodePath;\n } catch (error: unknown) {\n if (FileSystem.isFileDoesNotExistError(error as Error)) {\n return filePath;\n }\n throw error;\n }\n }\n });\n packageJsonFolderPathQueue.push(dependencyPackageFolderPath);\n } catch (resolveErr) {\n if (optionalDependencyNames.has(dependencyPackageName)) {\n // Ignore missing optional dependency\n continue;\n }\n throw resolveErr;\n }\n }\n\n // Replicate the links to the virtual store. Note that if the package has not been hoisted by\n // PNPM, the package will not be resolvable from here.\n // Only apply this logic for packages that were actually installed under the common/temp folder.\n if (pnpmInstallFolder && Path.isUnder(packageJsonFolderPath, pnpmInstallFolder)) {\n try {\n // The PNPM virtual store links are created in this folder. We will resolve the current package\n // from that location and collect any additional links encountered along the way.\n // TODO: This can be configured via NPMRC. We should support that.\n const pnpmDotFolderPath: string = path.join(pnpmInstallFolder, 'node_modules', '.pnpm');\n\n // TODO: Investigate how package aliases are handled by PNPM in this case. For example:\n //\n // \"dependencies\": {\n // \"alias-name\": \"npm:real-name@^1.2.3\"\n // }\n const dependencyPackageFolderPath: string = await Import.resolvePackageAsync({\n packageName: packageJson.name,\n baseFolderPath: pnpmDotFolderPath,\n getRealPathAsync: async (filePath: string) => {\n try {\n return (await state.symlinkAnalyzer.analyzePathAsync(filePath)).nodePath;\n } catch (error: unknown) {\n if (FileSystem.isFileDoesNotExistError(error as Error)) {\n return filePath;\n }\n throw error;\n }\n }\n });\n packageJsonFolderPathQueue.push(dependencyPackageFolderPath);\n } catch (resolveErr) {\n // The virtual store link isn't guaranteed to exist, so ignore if it's missing\n // NOTE: If you encounter this warning a lot, please report it to the Rush maintainers.\n console.log('Ignoring missing PNPM virtual store link for ' + packageJsonFolderPath);\n }\n }\n\n callback();\n },\n {\n concurrency: 10\n }\n );\n }\n\n private _applyDependencyFilters(\n terminal: ITerminal,\n allDependencyNames: Set<string>,\n additionalDependenciesToInclude: string[] = [],\n dependenciesToExclude: string[] = []\n ): Set<string> {\n // Track packages that got added/removed for reporting purposes\n const extraIncludedPackageNames: string[] = [];\n const extraExcludedPackageNames: string[] = [];\n\n for (const patternWithStar of dependenciesToExclude) {\n for (const dependency of allDependencyNames) {\n if (matchesWithStar(patternWithStar, dependency)) {\n if (allDependencyNames.delete(dependency)) {\n extraExcludedPackageNames.push(dependency);\n }\n }\n }\n }\n\n for (const dependencyToInclude of additionalDependenciesToInclude) {\n if (!allDependencyNames.has(dependencyToInclude)) {\n allDependencyNames.add(dependencyToInclude);\n extraIncludedPackageNames.push(dependencyToInclude);\n }\n }\n\n if (extraIncludedPackageNames.length > 0) {\n extraIncludedPackageNames.sort();\n terminal.writeLine(`Extra dependencies included by settings: ${extraIncludedPackageNames.join(', ')}`);\n }\n\n if (extraExcludedPackageNames.length > 0) {\n extraExcludedPackageNames.sort();\n terminal.writeLine(`Extra dependencies excluded by settings: ${extraExcludedPackageNames.join(', ')}`);\n }\n\n return allDependencyNames;\n }\n\n /**\n * Maps a file path from IExtractorOptions.sourceRootFolder to IExtractorOptions.targetRootFolder\n *\n * Example input: \"C:\\\\MyRepo\\\\libraries\\\\my-lib\"\n * Example output: \"C:\\\\MyRepo\\\\common\\\\deploy\\\\libraries\\\\my-lib\"\n */\n private _remapPathForExtractorFolder(\n absolutePathInSourceFolder: string,\n options: IExtractorOptions\n ): string {\n const { sourceRootFolder, targetRootFolder } = options;\n const relativePath: string = path.relative(sourceRootFolder, absolutePathInSourceFolder);\n if (relativePath.startsWith('..')) {\n throw new Error(`Source path \"${absolutePathInSourceFolder}\" is not under \"${sourceRootFolder}\"`);\n }\n const absolutePathInTargetFolder: string = path.join(targetRootFolder, relativePath);\n return absolutePathInTargetFolder;\n }\n\n /**\n * Maps a file path from IExtractorOptions.sourceRootFolder to relative path\n *\n * Example input: \"C:\\\\MyRepo\\\\libraries\\\\my-lib\"\n * Example output: \"libraries/my-lib\"\n */\n private _remapPathForExtractorMetadata(\n absolutePathInSourceFolder: string,\n options: IExtractorOptions\n ): string {\n const { sourceRootFolder } = options;\n const relativePath: string = path.relative(sourceRootFolder, absolutePathInSourceFolder);\n if (relativePath.startsWith('..')) {\n throw new Error(`Source path \"${absolutePathInSourceFolder}\" is not under \"${sourceRootFolder}\"`);\n }\n return Path.convertToSlashes(relativePath);\n }\n\n /**\n * Copy one package folder to the extractor target folder.\n */\n private async _extractFolderAsync(\n sourceFolderPath: string,\n options: IExtractorOptions,\n state: IExtractorState\n ): Promise<void> {\n const { includeNpmIgnoreFiles, targetRootFolder } = options;\n const { projectConfigurationsByPath, archiver } = state;\n let useNpmIgnoreFilter: boolean = false;\n\n if (!includeNpmIgnoreFiles) {\n const sourceFolderRealPath: string = await FileSystem.getRealPathAsync(sourceFolderPath);\n const sourceProjectConfiguration: IExtractorProjectConfiguration | undefined =\n projectConfigurationsByPath.get(sourceFolderRealPath);\n if (sourceProjectConfiguration) {\n useNpmIgnoreFilter = true;\n }\n }\n\n const targetFolderPath: string = this._remapPathForExtractorFolder(sourceFolderPath, options);\n\n if (useNpmIgnoreFilter) {\n // Use npm-packlist to filter the files. Using the Walker class (instead of the default API) ensures\n // that \"bundledDependencies\" are not included.\n const walkerPromise: Promise<string[]> = new Promise<string[]>(\n (resolve: (result: string[]) => void, reject: (error: Error) => void) => {\n const walker: npmPacklist.Walker = new npmPacklist.Walker({\n path: sourceFolderPath\n });\n walker.on('done', resolve).on('error', reject).start();\n }\n );\n const npmPackFiles: string[] = await walkerPromise;\n\n const alreadyCopiedSourcePaths: Set<string> = new Set();\n\n await Async.forEachAsync(\n npmPackFiles,\n async (npmPackFile: string) => {\n // In issue https://github.com/microsoft/rushstack/issues/2121 we found that npm-packlist sometimes returns\n // duplicate file paths, for example:\n //\n // 'dist//index.js'\n // 'dist/index.js'\n //\n // We can detect the duplicates by comparing the path.resolve() result.\n const copySourcePath: string = path.resolve(sourceFolderPath, npmPackFile);\n if (alreadyCopiedSourcePaths.has(copySourcePath)) {\n return;\n }\n alreadyCopiedSourcePaths.add(copySourcePath);\n\n const copyDestinationPath: string = path.join(targetFolderPath, npmPackFile);\n const copySourcePathNode: PathNode = await state.symlinkAnalyzer.analyzePathAsync(copySourcePath);\n if (copySourcePathNode.kind !== 'link') {\n if (!options.createArchiveOnly) {\n await FileSystem.ensureFolderAsync(path.dirname(copyDestinationPath));\n // Use the fs.copyFile API instead of FileSystem.copyFileAsync() since copyFileAsync performs\n // a needless stat() call to determine if it's a file or folder, and we already know it's a file.\n await fs.promises.copyFile(copySourcePath, copyDestinationPath, fs.constants.COPYFILE_EXCL);\n }\n\n if (archiver) {\n const archivePath: string = path.relative(targetRootFolder, copyDestinationPath);\n await archiver.addToArchiveAsync({\n filePath: copySourcePath,\n archivePath,\n stats: copySourcePathNode.linkStats\n });\n }\n }\n },\n {\n concurrency: 10\n }\n );\n } else {\n // use a simplistic \"ignore\" ruleset to filter the files\n const ignoreFilter: Ignore = ignore();\n ignoreFilter.add([\n // The top-level node_modules folder is always excluded\n '/node_modules',\n // Also exclude well-known folders that can contribute a lot of unnecessary files\n '**/.git',\n '**/.svn',\n '**/.hg',\n '**/.DS_Store'\n ]);\n\n // Do a breadth-first search of the source folder, copying each file to the target folder\n const queue: AsyncQueue<string> = new AsyncQueue([sourceFolderPath]);\n await Async.forEachAsync(\n queue,\n async ([sourcePath, callback]: [string, () => void]) => {\n const relativeSourcePath: string = path.relative(sourceFolderPath, sourcePath);\n if (relativeSourcePath !== '' && ignoreFilter.ignores(relativeSourcePath)) {\n callback();\n return;\n }\n\n const sourcePathNode: PathNode = await state.symlinkAnalyzer.analyzePathAsync(sourcePath);\n if (sourcePathNode.kind === 'file') {\n const targetPath: string = path.join(targetFolderPath, relativeSourcePath);\n if (!options.createArchiveOnly) {\n // Manually call fs.copyFile to avoid unnecessary stat calls.\n await fs.promises.copyFile(sourcePath, targetPath, fs.constants.COPYFILE_EXCL);\n }\n\n // Add the file to the archive. Only need to add files since directories will be auto-created\n if (archiver) {\n const archivePath: string = path.relative(targetRootFolder, targetPath);\n await archiver.addToArchiveAsync({\n filePath: sourcePath,\n archivePath: archivePath,\n stats: sourcePathNode.linkStats\n });\n }\n } else if (sourcePathNode.kind === 'folder') {\n if (!options.createArchiveOnly) {\n const targetPath: string = path.join(targetFolderPath, relativeSourcePath);\n await FileSystem.ensureFolderAsync(targetPath);\n }\n const children: string[] = await FileSystem.readFolderItemNamesAsync(sourcePath);\n for (const child of children) {\n queue.push(path.join(sourcePath, child));\n }\n }\n\n callback();\n },\n {\n concurrency: 10\n }\n );\n }\n }\n\n /**\n * Create a symlink as described by the ILinkInfo object.\n */\n private async _extractSymlinkAsync(\n originalLinkInfo: ILinkInfo,\n options: IExtractorOptions,\n state: IExtractorState\n ): Promise<void> {\n const linkInfo: ILinkInfo = {\n kind: originalLinkInfo.kind,\n linkPath: this._remapPathForExtractorFolder(originalLinkInfo.linkPath, options),\n targetPath: this._remapPathForExtractorFolder(originalLinkInfo.targetPath, options)\n };\n\n const newLinkFolder: string = path.dirname(linkInfo.linkPath);\n await FileSystem.ensureFolderAsync(newLinkFolder);\n\n // Link to the relative path for symlinks\n const relativeTargetPath: string = path.relative(newLinkFolder, linkInfo.targetPath);\n\n // NOTE: This logic is based on NpmLinkManager._createSymlink()\n if (linkInfo.kind === 'fileLink') {\n // For files, we use a Windows \"hard link\", because creating a symbolic link requires\n // administrator permission. However hard links seem to cause build failures on Mac,\n // so for all other operating systems we use symbolic links for this case.\n if (process.platform === 'win32') {\n await FileSystem.createHardLinkAsync({\n linkTargetPath: relativeTargetPath,\n newLinkPath: linkInfo.linkPath\n });\n } else {\n await FileSystem.createSymbolicLinkFileAsync({\n linkTargetPath: relativeTargetPath,\n newLinkPath: linkInfo.linkPath\n });\n }\n } else {\n // Junctions are only supported on Windows. This will create a symbolic link on other platforms.\n await FileSystem.createSymbolicLinkJunctionAsync({\n linkTargetPath: relativeTargetPath,\n newLinkPath: linkInfo.linkPath\n });\n }\n\n // Since the created symlinks have the required relative paths, they can be added directly to\n // the archive.\n await state.archiver?.addToArchiveAsync({\n filePath: linkInfo.linkPath,\n archivePath: path.relative(options.targetRootFolder, linkInfo.linkPath)\n });\n }\n\n /**\n * Write the common/deploy/deploy-metadata.json file.\n */\n private async _writeExtractorMetadataAsync(\n options: IExtractorOptions,\n state: IExtractorState\n ): Promise<void> {\n const { mainProjectName, targetRootFolder } = options;\n const { projectConfigurationsByPath } = state;\n\n const extractorMetadataFileName: string = 'extractor-metadata.json';\n const extractorMetadataFilePath: string = path.join(targetRootFolder, extractorMetadataFileName);\n const extractorMetadataJson: IExtractorMetadataJson = {\n mainProjectName,\n projects: [],\n links: []\n };\n\n for (const { projectFolder, projectName } of projectConfigurationsByPath.values()) {\n if (state.foldersToCopy.has(projectFolder)) {\n extractorMetadataJson.projects.push({\n projectName,\n path: this._remapPathForExtractorMetadata(projectFolder, options)\n });\n }\n }\n\n // Remap the links to be relative to target folder\n for (const absoluteLinkInfo of state.symlinkAnalyzer.reportSymlinks()) {\n const relativeInfo: ILinkInfo = {\n kind: absoluteLinkInfo.kind,\n linkPath: this._remapPathForExtractorMetadata(absoluteLinkInfo.linkPath, options),\n targetPath: this._remapPathForExtractorMetadata(absoluteLinkInfo.targetPath, options)\n };\n extractorMetadataJson.links.push(relativeInfo);\n }\n\n const extractorMetadataFileContent: string = JSON.stringify(extractorMetadataJson, undefined, 0);\n if (!options.createArchiveOnly) {\n await FileSystem.writeFileAsync(extractorMetadataFilePath, extractorMetadataFileContent);\n }\n await state.archiver?.addToArchiveAsync({\n fileData: extractorMetadataFileContent,\n archivePath: extractorMetadataFileName\n });\n }\n\n private async _makeBinLinksAsync(options: IExtractorOptions, state: IExtractorState): Promise<void> {\n const { terminal } = options;\n\n const extractedProjectFolders: string[] = Array.from(state.projectConfigurationsByPath.keys()).filter(\n (folderPath: string) => state.foldersToCopy.has(folderPath)\n );\n\n await Async.forEachAsync(\n extractedProjectFolders,\n async (projectFolder: string) => {\n const extractedProjectFolder: string = this._remapPathForExtractorFolder(projectFolder, options);\n const extractedProjectNodeModulesFolder: string = path.join(extractedProjectFolder, 'node_modules');\n const extractedProjectBinFolder: string = path.join(extractedProjectNodeModulesFolder, '.bin');\n\n const linkedBinPackageNames: string[] = await pnpmLinkBins(\n extractedProjectNodeModulesFolder,\n extractedProjectBinFolder,\n {\n warn: (msg: string) => terminal.writeLine(Colors.yellow(msg))\n }\n );\n\n if (linkedBinPackageNames.length && state.archiver) {\n const binFolderItems: string[] = await FileSystem.readFolderItemNamesAsync(\n extractedProjectBinFolder\n );\n for (const binFolderItem of binFolderItems) {\n const binFilePath: string = path.join(extractedProjectBinFolder, binFolderItem);\n await state.archiver.addToArchiveAsync({\n filePath: binFilePath,\n archivePath: path.relative(options.targetRootFolder, binFilePath)\n });\n }\n }\n },\n {\n concurrency: 10\n }\n );\n }\n}\n"]}
@@ -28,12 +28,17 @@ export interface ILinkNode extends IPathNodeBase {
28
28
  }
29
29
  export declare type PathNode = IFileNode | IFolderNode | ILinkNode;
30
30
  /**
31
- * Represents a symbolic link reported by {@link SymlinkAnalyzer.reportSymlinks}.
31
+ * Represents a symbolic link.
32
+ *
33
+ * @public
32
34
  */
33
35
  export interface ILinkInfo {
36
+ /**
37
+ * The type of link that was encountered.
38
+ */
34
39
  kind: 'fileLink' | 'folderLink';
35
40
  /**
36
- * The path of the symbolic link.
41
+ * The path to the link, relative to the root of the extractor output folder.
37
42
  */
38
43
  linkPath: string;
39
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"SymlinkAnalyzer.d.ts","sourceRoot":"","sources":["../src/SymlinkAnalyzer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,eAAe,EAAQ,MAAM,8BAA8B,CAAC;AAIjF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,eAAe,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,aAAa;IAC9C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,aAAa;IAC9C,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,oBAAY,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,GAAG,YAAY,CAAC;IAEhC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAqB;IAG/D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsD;IAGnF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAwD;gBAEtE,OAAO,GAAE,uBAA4B;IAI3C,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,GAAE,OAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAyGnG;;OAEG;IACI,cAAc,IAAI,SAAS,EAAE;CAKrC"}
1
+ {"version":3,"file":"SymlinkAnalyzer.d.ts","sourceRoot":"","sources":["../src/SymlinkAnalyzer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,eAAe,EAAQ,MAAM,8BAA8B,CAAC;AAIjF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,eAAe,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,aAAa;IAC9C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,aAAa;IAC9C,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,oBAAY,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAE3D;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,IAAI,EAAE,UAAU,GAAG,YAAY,CAAC;IAEhC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAqB;IAG/D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsD;IAGnF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAwD;gBAEtE,OAAO,GAAE,uBAA4B;IAI3C,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,GAAE,OAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAyGnG;;OAEG;IACI,cAAc,IAAI,SAAS,EAAE;CAKrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SymlinkAnalyzer.js","sourceRoot":"","sources":["../src/SymlinkAnalyzer.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { FileSystem, FileSystemStats, Sort } from '@rushstack/node-core-library';\n\nimport * as path from 'path';\n\nexport interface IPathNodeBase {\n kind: 'file' | 'folder' | 'link';\n nodePath: string;\n linkStats: FileSystemStats;\n}\n\n/**\n * Represents a file object analyzed by {@link SymlinkAnalyzer}.\n */\nexport interface IFileNode extends IPathNodeBase {\n kind: 'file';\n}\n\n/**\n * Represents a folder object analyzed by {@link SymlinkAnalyzer}.\n */\nexport interface IFolderNode extends IPathNodeBase {\n kind: 'folder';\n}\n\n/**\n * Represents a symbolic link analyzed by {@link SymlinkAnalyzer}.\n */\nexport interface ILinkNode extends IPathNodeBase {\n kind: 'link';\n\n /**\n * The immediate target that the symlink resolves to.\n */\n linkTarget: string;\n}\n\nexport type PathNode = IFileNode | IFolderNode | ILinkNode;\n\n/**\n * Represents a symbolic link reported by {@link SymlinkAnalyzer.reportSymlinks}.\n */\nexport interface ILinkInfo {\n kind: 'fileLink' | 'folderLink';\n\n /**\n * The path of the symbolic link.\n */\n linkPath: string;\n\n /**\n * The target that the link points to.\n */\n targetPath: string;\n}\n\nexport interface ISymlinkAnalyzerOptions {\n requiredSourceParentPath?: string;\n}\n\nexport class SymlinkAnalyzer {\n private readonly _requiredSourceParentPath: string | undefined;\n\n // The directory tree discovered so far\n private readonly _nodesByPath: Map<string, PathNode> = new Map<string, PathNode>();\n\n // The symlinks that we encountered while building the directory tree\n private readonly _linkInfosByPath: Map<string, ILinkInfo> = new Map<string, ILinkInfo>();\n\n public constructor(options: ISymlinkAnalyzerOptions = {}) {\n this._requiredSourceParentPath = options.requiredSourceParentPath;\n }\n\n public async analyzePathAsync(inputPath: string, preserveLinks: boolean = false): Promise<PathNode> {\n // First, try to short-circuit the analysis if we've already analyzed this path\n const resolvedPath: string = path.resolve(inputPath);\n const existingNode: PathNode | undefined = this._nodesByPath.get(resolvedPath);\n if (existingNode) {\n return existingNode;\n }\n\n // Postfix a '/' to the end of the path. This will get trimmed off later, but it\n // ensures that the last path component is included in the loop below.\n let targetPath: string = `${resolvedPath}${path.sep}`;\n let targetPathIndex: number = -1;\n let currentNode: PathNode | undefined;\n\n while ((targetPathIndex = targetPath.indexOf(path.sep, targetPathIndex + 1)) >= 0) {\n if (targetPathIndex === 0) {\n // Edge case for a Unix path like \"/folder/file\" --> [ \"\", \"folder\", \"file\" ]\n continue;\n }\n\n const currentPath: string = targetPath.slice(0, targetPathIndex);\n currentNode = this._nodesByPath.get(currentPath);\n if (currentNode === undefined) {\n const linkStats: FileSystemStats = await FileSystem.getLinkStatisticsAsync(currentPath);\n if (linkStats.isSymbolicLink()) {\n // Link target paths can be relative or absolute, so we need to resolve them\n const linkTargetPath: string = await FileSystem.readLinkAsync(currentPath);\n const resolvedLinkTargetPath: string = path.resolve(path.dirname(currentPath), linkTargetPath);\n\n // Do a check to make sure that the link target path is not outside the source folder\n if (this._requiredSourceParentPath) {\n const relativeLinkTargetPath: string = path.relative(\n this._requiredSourceParentPath,\n resolvedLinkTargetPath\n );\n if (relativeLinkTargetPath.startsWith('..')) {\n throw new Error(\n `Symlink targets not under folder \"${this._requiredSourceParentPath}\": ` +\n `${currentPath} -> ${resolvedLinkTargetPath}`\n );\n }\n }\n\n currentNode = {\n kind: 'link',\n nodePath: currentPath,\n linkStats,\n linkTarget: resolvedLinkTargetPath\n };\n } else if (linkStats.isDirectory()) {\n currentNode = {\n kind: 'folder',\n nodePath: currentPath,\n linkStats\n };\n } else if (linkStats.isFile()) {\n currentNode = {\n kind: 'file',\n nodePath: currentPath,\n linkStats\n };\n } else {\n throw new Error('Unknown object type: ' + currentPath);\n }\n this._nodesByPath.set(currentPath, currentNode);\n }\n\n if (!preserveLinks) {\n while (currentNode?.kind === 'link') {\n const targetNode: PathNode = await this.analyzePathAsync(currentNode.linkTarget, true);\n\n // Have we created an ILinkInfo for this link yet?\n if (!this._linkInfosByPath.has(currentNode.nodePath)) {\n // Follow any symbolic links to determine whether the final target is a directory\n const targetStats: FileSystemStats = await FileSystem.getStatisticsAsync(targetNode.nodePath);\n const targetIsDirectory: boolean = targetStats.isDirectory();\n const linkInfo: ILinkInfo = {\n kind: targetIsDirectory ? 'folderLink' : 'fileLink',\n linkPath: currentNode.nodePath,\n targetPath: targetNode.nodePath\n };\n this._linkInfosByPath.set(currentNode.nodePath, linkInfo);\n }\n\n const nodeTargetPath: string = targetNode.nodePath;\n const remainingPath: string = targetPath.slice(targetPathIndex);\n targetPath = path.join(nodeTargetPath, remainingPath);\n targetPathIndex = nodeTargetPath.length;\n currentNode = targetNode;\n }\n }\n\n if (targetPath.length === targetPathIndex + 1) {\n // We've reached the end of the path\n break;\n }\n }\n\n if (!currentNode) {\n throw new Error('Unable to analyze path: ' + inputPath);\n }\n\n return currentNode;\n }\n\n /**\n * Returns a summary of all the symbolic links encountered by {@link SymlinkAnalyzer.analyzePathAsync}.\n */\n public reportSymlinks(): ILinkInfo[] {\n const list: ILinkInfo[] = [...this._linkInfosByPath.values()];\n Sort.sortBy(list, (x) => x.linkPath);\n return list;\n }\n}\n"]}
1
+ {"version":3,"file":"SymlinkAnalyzer.js","sourceRoot":"","sources":["../src/SymlinkAnalyzer.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { FileSystem, FileSystemStats, Sort } from '@rushstack/node-core-library';\n\nimport * as path from 'path';\n\nexport interface IPathNodeBase {\n kind: 'file' | 'folder' | 'link';\n nodePath: string;\n linkStats: FileSystemStats;\n}\n\n/**\n * Represents a file object analyzed by {@link SymlinkAnalyzer}.\n */\nexport interface IFileNode extends IPathNodeBase {\n kind: 'file';\n}\n\n/**\n * Represents a folder object analyzed by {@link SymlinkAnalyzer}.\n */\nexport interface IFolderNode extends IPathNodeBase {\n kind: 'folder';\n}\n\n/**\n * Represents a symbolic link analyzed by {@link SymlinkAnalyzer}.\n */\nexport interface ILinkNode extends IPathNodeBase {\n kind: 'link';\n\n /**\n * The immediate target that the symlink resolves to.\n */\n linkTarget: string;\n}\n\nexport type PathNode = IFileNode | IFolderNode | ILinkNode;\n\n/**\n * Represents a symbolic link.\n *\n * @public\n */\nexport interface ILinkInfo {\n /**\n * The type of link that was encountered.\n */\n kind: 'fileLink' | 'folderLink';\n\n /**\n * The path to the link, relative to the root of the extractor output folder.\n */\n linkPath: string;\n\n /**\n * The target that the link points to.\n */\n targetPath: string;\n}\n\nexport interface ISymlinkAnalyzerOptions {\n requiredSourceParentPath?: string;\n}\n\nexport class SymlinkAnalyzer {\n private readonly _requiredSourceParentPath: string | undefined;\n\n // The directory tree discovered so far\n private readonly _nodesByPath: Map<string, PathNode> = new Map<string, PathNode>();\n\n // The symlinks that we encountered while building the directory tree\n private readonly _linkInfosByPath: Map<string, ILinkInfo> = new Map<string, ILinkInfo>();\n\n public constructor(options: ISymlinkAnalyzerOptions = {}) {\n this._requiredSourceParentPath = options.requiredSourceParentPath;\n }\n\n public async analyzePathAsync(inputPath: string, preserveLinks: boolean = false): Promise<PathNode> {\n // First, try to short-circuit the analysis if we've already analyzed this path\n const resolvedPath: string = path.resolve(inputPath);\n const existingNode: PathNode | undefined = this._nodesByPath.get(resolvedPath);\n if (existingNode) {\n return existingNode;\n }\n\n // Postfix a '/' to the end of the path. This will get trimmed off later, but it\n // ensures that the last path component is included in the loop below.\n let targetPath: string = `${resolvedPath}${path.sep}`;\n let targetPathIndex: number = -1;\n let currentNode: PathNode | undefined;\n\n while ((targetPathIndex = targetPath.indexOf(path.sep, targetPathIndex + 1)) >= 0) {\n if (targetPathIndex === 0) {\n // Edge case for a Unix path like \"/folder/file\" --> [ \"\", \"folder\", \"file\" ]\n continue;\n }\n\n const currentPath: string = targetPath.slice(0, targetPathIndex);\n currentNode = this._nodesByPath.get(currentPath);\n if (currentNode === undefined) {\n const linkStats: FileSystemStats = await FileSystem.getLinkStatisticsAsync(currentPath);\n if (linkStats.isSymbolicLink()) {\n // Link target paths can be relative or absolute, so we need to resolve them\n const linkTargetPath: string = await FileSystem.readLinkAsync(currentPath);\n const resolvedLinkTargetPath: string = path.resolve(path.dirname(currentPath), linkTargetPath);\n\n // Do a check to make sure that the link target path is not outside the source folder\n if (this._requiredSourceParentPath) {\n const relativeLinkTargetPath: string = path.relative(\n this._requiredSourceParentPath,\n resolvedLinkTargetPath\n );\n if (relativeLinkTargetPath.startsWith('..')) {\n throw new Error(\n `Symlink targets not under folder \"${this._requiredSourceParentPath}\": ` +\n `${currentPath} -> ${resolvedLinkTargetPath}`\n );\n }\n }\n\n currentNode = {\n kind: 'link',\n nodePath: currentPath,\n linkStats,\n linkTarget: resolvedLinkTargetPath\n };\n } else if (linkStats.isDirectory()) {\n currentNode = {\n kind: 'folder',\n nodePath: currentPath,\n linkStats\n };\n } else if (linkStats.isFile()) {\n currentNode = {\n kind: 'file',\n nodePath: currentPath,\n linkStats\n };\n } else {\n throw new Error('Unknown object type: ' + currentPath);\n }\n this._nodesByPath.set(currentPath, currentNode);\n }\n\n if (!preserveLinks) {\n while (currentNode?.kind === 'link') {\n const targetNode: PathNode = await this.analyzePathAsync(currentNode.linkTarget, true);\n\n // Have we created an ILinkInfo for this link yet?\n if (!this._linkInfosByPath.has(currentNode.nodePath)) {\n // Follow any symbolic links to determine whether the final target is a directory\n const targetStats: FileSystemStats = await FileSystem.getStatisticsAsync(targetNode.nodePath);\n const targetIsDirectory: boolean = targetStats.isDirectory();\n const linkInfo: ILinkInfo = {\n kind: targetIsDirectory ? 'folderLink' : 'fileLink',\n linkPath: currentNode.nodePath,\n targetPath: targetNode.nodePath\n };\n this._linkInfosByPath.set(currentNode.nodePath, linkInfo);\n }\n\n const nodeTargetPath: string = targetNode.nodePath;\n const remainingPath: string = targetPath.slice(targetPathIndex);\n targetPath = path.join(nodeTargetPath, remainingPath);\n targetPathIndex = nodeTargetPath.length;\n currentNode = targetNode;\n }\n }\n\n if (targetPath.length === targetPathIndex + 1) {\n // We've reached the end of the path\n break;\n }\n }\n\n if (!currentNode) {\n throw new Error('Unable to analyze path: ' + inputPath);\n }\n\n return currentNode;\n }\n\n /**\n * Returns a summary of all the symbolic links encountered by {@link SymlinkAnalyzer.analyzePathAsync}.\n */\n public reportSymlinks(): ILinkInfo[] {\n const list: ILinkInfo[] = [...this._linkInfosByPath.values()];\n Sort.sortBy(list, (x) => x.linkPath);\n return list;\n }\n}\n"]}
package/lib/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
- export { PackageExtractor, type IExtractorOptions, type IExtractorProjectConfiguration } from './PackageExtractor';
1
+ export { PackageExtractor, type IExtractorOptions, type IExtractorProjectConfiguration, type IExtractorMetadataJson, type IProjectInfoJson } from './PackageExtractor';
2
+ export type { ILinkInfo } from './SymlinkAnalyzer';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,KAAK,8BAA8B,EACpC,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uDAI4B;AAH1B,oHAAA,gBAAgB,OAAA","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nexport {\n PackageExtractor,\n type IExtractorOptions,\n type IExtractorProjectConfiguration\n} from './PackageExtractor';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,uDAM4B;AAL1B,oHAAA,gBAAgB,OAAA","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nexport {\n PackageExtractor,\n type IExtractorOptions,\n type IExtractorProjectConfiguration,\n type IExtractorMetadataJson,\n type IProjectInfoJson\n} from './PackageExtractor';\n\nexport type { ILinkInfo } from './SymlinkAnalyzer';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rushstack/package-extractor",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "A library for bundling selected files and dependencies into a deployable package.",
5
5
  "main": "lib/index.js",
6
6
  "typings": "dist/package-extractor.d.ts",