relay-compiler 0.0.0-main-4d287de9 → 0.0.0-main-9a79039d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +23 -0
- package/index.js +19 -3
- package/linux-x64/relay +0 -0
- package/macos-x64/relay +0 -0
- package/package.json +2 -26
- package/win-x64/relay.exe +0 -0
- package/bin/RelayCompilerBin.js.flow +0 -168
- package/bin/RelayCompilerMain.js.flow +0 -513
- package/bin/__fixtures__/plugin-module.js.flow +0 -17
- package/bin/relay-compiler +0 -19066
- package/codegen/CodegenDirectory.js.flow +0 -372
- package/codegen/CodegenRunner.js.flow +0 -424
- package/codegen/CodegenTypes.js.flow +0 -28
- package/codegen/CodegenWatcher.js.flow +0 -250
- package/codegen/NormalizationCodeGenerator.js.flow +0 -565
- package/codegen/ReaderCodeGenerator.js.flow +0 -510
- package/codegen/RelayCodeGenerator.js.flow +0 -85
- package/codegen/RelayFileWriter.js.flow +0 -365
- package/codegen/SourceControl.js.flow +0 -58
- package/codegen/compileRelayArtifacts.js.flow +0 -181
- package/codegen/createPrintRequireModuleDependency.js.flow +0 -19
- package/codegen/sortObjectByKey.js.flow +0 -25
- package/codegen/writeRelayGeneratedFile.js.flow +0 -235
- package/core/ASTCache.js.flow +0 -73
- package/core/ASTConvert.js.flow +0 -230
- package/core/CompilerContext.js.flow +0 -189
- package/core/CompilerError.js.flow +0 -255
- package/core/DotGraphQLParser.js.flow +0 -37
- package/core/GraphQLCompilerProfiler.js.flow +0 -341
- package/core/GraphQLDerivedFromMetadata.js.flow +0 -36
- package/core/GraphQLWatchmanClient.js.flow +0 -109
- package/core/IR.js.flow +0 -326
- package/core/IRPrinter.js.flow +0 -472
- package/core/IRTransformer.js.flow +0 -376
- package/core/IRValidator.js.flow +0 -259
- package/core/IRVisitor.js.flow +0 -150
- package/core/JSModuleParser.js.flow +0 -24
- package/core/RelayCompilerScope.js.flow +0 -199
- package/core/RelayFindGraphQLTags.js.flow +0 -118
- package/core/RelayGraphQLEnumsGenerator.js.flow +0 -55
- package/core/RelayIRTransforms.js.flow +0 -138
- package/core/RelayParser.js.flow +0 -1731
- package/core/RelaySourceModuleParser.js.flow +0 -133
- package/core/Schema.js.flow +0 -2035
- package/core/SchemaUtils.js.flow +0 -120
- package/core/filterContextForNode.js.flow +0 -49
- package/core/getFieldDefinition.js.flow +0 -156
- package/core/getIdentifierForArgumentValue.js.flow +0 -49
- package/core/getIdentifierForSelection.js.flow +0 -68
- package/core/getLiteralArgumentValues.js.flow +0 -32
- package/core/getNormalizationOperationName.js.flow +0 -19
- package/core/inferRootArgumentDefinitions.js.flow +0 -322
- package/index.js.flow +0 -198
- package/language/RelayLanguagePluginInterface.js.flow +0 -283
- package/language/javascript/FindGraphQLTags.js.flow +0 -136
- package/language/javascript/RelayFlowBabelFactories.js.flow +0 -176
- package/language/javascript/RelayFlowGenerator.js.flow +0 -1096
- package/language/javascript/RelayFlowTypeTransformers.js.flow +0 -181
- package/language/javascript/RelayLanguagePluginJavaScript.js.flow +0 -33
- package/language/javascript/formatGeneratedModule.js.flow +0 -65
- package/lib/bin/RelayCompilerBin.js +0 -143
- package/lib/bin/RelayCompilerMain.js +0 -486
- package/lib/bin/__fixtures__/plugin-module.js +0 -16
- package/lib/codegen/CodegenDirectory.js +0 -335
- package/lib/codegen/CodegenRunner.js +0 -433
- package/lib/codegen/CodegenTypes.js +0 -11
- package/lib/codegen/CodegenWatcher.js +0 -271
- package/lib/codegen/NormalizationCodeGenerator.js +0 -487
- package/lib/codegen/ReaderCodeGenerator.js +0 -473
- package/lib/codegen/RelayCodeGenerator.js +0 -75
- package/lib/codegen/RelayFileWriter.js +0 -270
- package/lib/codegen/SourceControl.js +0 -60
- package/lib/codegen/compileRelayArtifacts.js +0 -157
- package/lib/codegen/createPrintRequireModuleDependency.js +0 -19
- package/lib/codegen/sortObjectByKey.js +0 -41
- package/lib/codegen/writeRelayGeneratedFile.js +0 -206
- package/lib/core/ASTCache.js +0 -70
- package/lib/core/ASTConvert.js +0 -198
- package/lib/core/CompilerContext.js +0 -165
- package/lib/core/CompilerError.js +0 -252
- package/lib/core/DotGraphQLParser.js +0 -40
- package/lib/core/GraphQLCompilerProfiler.js +0 -299
- package/lib/core/GraphQLDerivedFromMetadata.js +0 -31
- package/lib/core/GraphQLWatchmanClient.js +0 -150
- package/lib/core/IR.js +0 -11
- package/lib/core/IRPrinter.js +0 -388
- package/lib/core/IRTransformer.js +0 -345
- package/lib/core/IRValidator.js +0 -226
- package/lib/core/IRVisitor.js +0 -45
- package/lib/core/JSModuleParser.js +0 -18
- package/lib/core/RelayCompilerScope.js +0 -183
- package/lib/core/RelayFindGraphQLTags.js +0 -79
- package/lib/core/RelayGraphQLEnumsGenerator.js +0 -50
- package/lib/core/RelayIRTransforms.js +0 -109
- package/lib/core/RelayParser.js +0 -1381
- package/lib/core/RelaySourceModuleParser.js +0 -104
- package/lib/core/Schema.js +0 -1877
- package/lib/core/SchemaUtils.js +0 -98
- package/lib/core/filterContextForNode.js +0 -50
- package/lib/core/getFieldDefinition.js +0 -145
- package/lib/core/getIdentifierForArgumentValue.js +0 -54
- package/lib/core/getIdentifierForSelection.js +0 -49
- package/lib/core/getLiteralArgumentValues.js +0 -26
- package/lib/core/getNormalizationOperationName.js +0 -17
- package/lib/core/inferRootArgumentDefinitions.js +0 -351
- package/lib/index.js +0 -178
- package/lib/language/RelayLanguagePluginInterface.js +0 -26
- package/lib/language/javascript/FindGraphQLTags.js +0 -126
- package/lib/language/javascript/RelayFlowBabelFactories.js +0 -160
- package/lib/language/javascript/RelayFlowGenerator.js +0 -856
- package/lib/language/javascript/RelayFlowTypeTransformers.js +0 -119
- package/lib/language/javascript/RelayLanguagePluginJavaScript.js +0 -30
- package/lib/language/javascript/formatGeneratedModule.js +0 -36
- package/lib/reporters/ConsoleReporter.js +0 -61
- package/lib/reporters/MultiReporter.js +0 -45
- package/lib/reporters/Reporter.js +0 -11
- package/lib/runner/Artifacts.js +0 -323
- package/lib/runner/BufferedFilesystem.js +0 -262
- package/lib/runner/GraphQLASTNodeGroup.js +0 -256
- package/lib/runner/GraphQLASTUtils.js +0 -23
- package/lib/runner/GraphQLNodeMap.js +0 -81
- package/lib/runner/Sources.js +0 -271
- package/lib/runner/StrictMap.js +0 -134
- package/lib/runner/compileArtifacts.js +0 -39
- package/lib/runner/extractAST.js +0 -77
- package/lib/runner/getChangedNodeNames.js +0 -82
- package/lib/runner/getSchemaInstance.js +0 -30
- package/lib/runner/types.js +0 -12
- package/lib/transforms/ApplyFragmentArgumentTransform.js +0 -393
- package/lib/transforms/ClientExtensionsTransform.js +0 -221
- package/lib/transforms/ConnectionTransform.js +0 -639
- package/lib/transforms/DeclarativeConnectionMutationTransform.js +0 -218
- package/lib/transforms/DeferStreamTransform.js +0 -246
- package/lib/transforms/DisallowIdAsAlias.js +0 -40
- package/lib/transforms/DisallowTypenameOnRoot.js +0 -53
- package/lib/transforms/FieldHandleTransform.js +0 -79
- package/lib/transforms/FilterCompilerDirectivesTransform.js +0 -29
- package/lib/transforms/FilterDirectivesTransform.js +0 -42
- package/lib/transforms/FlattenTransform.js +0 -306
- package/lib/transforms/GenerateIDFieldTransform.js +0 -135
- package/lib/transforms/GenerateTypeNameTransform.js +0 -149
- package/lib/transforms/InlineDataFragmentTransform.js +0 -100
- package/lib/transforms/InlineFragmentsTransform.js +0 -61
- package/lib/transforms/MaskTransform.js +0 -117
- package/lib/transforms/MatchTransform.js +0 -434
- package/lib/transforms/ReactFlightComponentTransform.js +0 -158
- package/lib/transforms/RefetchableFragmentTransform.js +0 -249
- package/lib/transforms/RelayDirectiveTransform.js +0 -83
- package/lib/transforms/RequiredFieldTransform.js +0 -369
- package/lib/transforms/SkipClientExtensionsTransform.js +0 -46
- package/lib/transforms/SkipHandleFieldTransform.js +0 -45
- package/lib/transforms/SkipRedundantNodesTransform.js +0 -261
- package/lib/transforms/SkipSplitOperationTransform.js +0 -32
- package/lib/transforms/SkipUnreachableNodeTransform.js +0 -158
- package/lib/transforms/SkipUnusedVariablesTransform.js +0 -75
- package/lib/transforms/SplitModuleImportTransform.js +0 -82
- package/lib/transforms/TestOperationTransform.js +0 -144
- package/lib/transforms/TransformUtils.js +0 -21
- package/lib/transforms/ValidateGlobalVariablesTransform.js +0 -92
- package/lib/transforms/ValidateRequiredArgumentsTransform.js +0 -114
- package/lib/transforms/ValidateServerOnlyDirectivesTransform.js +0 -108
- package/lib/transforms/ValidateUnusedVariablesTransform.js +0 -96
- package/lib/transforms/query-generators/FetchableQueryGenerator.js +0 -157
- package/lib/transforms/query-generators/NodeQueryGenerator.js +0 -166
- package/lib/transforms/query-generators/QueryQueryGenerator.js +0 -48
- package/lib/transforms/query-generators/ViewerQueryGenerator.js +0 -77
- package/lib/transforms/query-generators/index.js +0 -60
- package/lib/transforms/query-generators/utils.js +0 -92
- package/lib/util/CodeMarker.js +0 -80
- package/lib/util/DefaultHandleKey.js +0 -15
- package/lib/util/RelayCompilerCache.js +0 -97
- package/lib/util/Rollout.js +0 -40
- package/lib/util/TimeReporter.js +0 -83
- package/lib/util/areEqualArgValues.js +0 -135
- package/lib/util/argumentContainsVariables.js +0 -37
- package/lib/util/dedupeJSONStringify.js +0 -160
- package/lib/util/generateAbstractTypeRefinementKey.js +0 -24
- package/lib/util/getDefinitionNodeHash.js +0 -22
- package/lib/util/getModuleName.js +0 -32
- package/lib/util/joinArgumentDefinitions.js +0 -67
- package/lib/util/md5.js +0 -17
- package/lib/util/murmurHash.js +0 -86
- package/lib/util/nullthrowsOSS.js +0 -23
- package/lib/util/orList.js +0 -36
- package/lib/util/partitionArray.js +0 -35
- package/relay-compiler.js +0 -17
- package/relay-compiler.min.js +0 -22
- package/reporters/ConsoleReporter.js.flow +0 -81
- package/reporters/MultiReporter.js.flow +0 -43
- package/reporters/Reporter.js.flow +0 -19
- package/runner/Artifacts.js.flow +0 -215
- package/runner/BufferedFilesystem.js.flow +0 -194
- package/runner/GraphQLASTNodeGroup.js.flow +0 -174
- package/runner/GraphQLASTUtils.js.flow +0 -26
- package/runner/GraphQLNodeMap.js.flow +0 -55
- package/runner/Sources.js.flow +0 -227
- package/runner/StrictMap.js.flow +0 -96
- package/runner/compileArtifacts.js.flow +0 -75
- package/runner/extractAST.js.flow +0 -98
- package/runner/getChangedNodeNames.js.flow +0 -48
- package/runner/getSchemaInstance.js.flow +0 -36
- package/runner/types.js.flow +0 -37
- package/transforms/ApplyFragmentArgumentTransform.js.flow +0 -524
- package/transforms/ClientExtensionsTransform.js.flow +0 -224
- package/transforms/ConnectionTransform.js.flow +0 -850
- package/transforms/DeclarativeConnectionMutationTransform.js.flow +0 -245
- package/transforms/DeferStreamTransform.js.flow +0 -263
- package/transforms/DisallowIdAsAlias.js.flow +0 -46
- package/transforms/DisallowTypenameOnRoot.js.flow +0 -44
- package/transforms/FieldHandleTransform.js.flow +0 -77
- package/transforms/FilterCompilerDirectivesTransform.js.flow +0 -33
- package/transforms/FilterDirectivesTransform.js.flow +0 -45
- package/transforms/FlattenTransform.js.flow +0 -458
- package/transforms/GenerateIDFieldTransform.js.flow +0 -151
- package/transforms/GenerateTypeNameTransform.js.flow +0 -159
- package/transforms/InlineDataFragmentTransform.js.flow +0 -123
- package/transforms/InlineFragmentsTransform.js.flow +0 -70
- package/transforms/MaskTransform.js.flow +0 -124
- package/transforms/MatchTransform.js.flow +0 -587
- package/transforms/ReactFlightComponentTransform.js.flow +0 -194
- package/transforms/RefetchableFragmentTransform.js.flow +0 -266
- package/transforms/RelayDirectiveTransform.js.flow +0 -96
- package/transforms/RequiredFieldTransform.js.flow +0 -413
- package/transforms/SkipClientExtensionsTransform.js.flow +0 -54
- package/transforms/SkipHandleFieldTransform.js.flow +0 -44
- package/transforms/SkipRedundantNodesTransform.js.flow +0 -255
- package/transforms/SkipSplitOperationTransform.js.flow +0 -37
- package/transforms/SkipUnreachableNodeTransform.js.flow +0 -148
- package/transforms/SkipUnusedVariablesTransform.js.flow +0 -59
- package/transforms/SplitModuleImportTransform.js.flow +0 -97
- package/transforms/TestOperationTransform.js.flow +0 -142
- package/transforms/TransformUtils.js.flow +0 -26
- package/transforms/ValidateGlobalVariablesTransform.js.flow +0 -80
- package/transforms/ValidateRequiredArgumentsTransform.js.flow +0 -126
- package/transforms/ValidateServerOnlyDirectivesTransform.js.flow +0 -111
- package/transforms/ValidateUnusedVariablesTransform.js.flow +0 -88
- package/transforms/query-generators/FetchableQueryGenerator.js.flow +0 -188
- package/transforms/query-generators/NodeQueryGenerator.js.flow +0 -217
- package/transforms/query-generators/QueryQueryGenerator.js.flow +0 -57
- package/transforms/query-generators/ViewerQueryGenerator.js.flow +0 -97
- package/transforms/query-generators/index.js.flow +0 -89
- package/transforms/query-generators/utils.js.flow +0 -76
- package/util/CodeMarker.js.flow +0 -79
- package/util/DefaultHandleKey.js.flow +0 -17
- package/util/RelayCompilerCache.js.flow +0 -86
- package/util/Rollout.js.flow +0 -39
- package/util/TimeReporter.js.flow +0 -79
- package/util/areEqualArgValues.js.flow +0 -126
- package/util/argumentContainsVariables.js.flow +0 -38
- package/util/dedupeJSONStringify.js.flow +0 -152
- package/util/generateAbstractTypeRefinementKey.js.flow +0 -29
- package/util/getDefinitionNodeHash.js.flow +0 -24
- package/util/getModuleName.js.flow +0 -39
- package/util/joinArgumentDefinitions.js.flow +0 -105
- package/util/md5.js.flow +0 -19
- package/util/murmurHash.js.flow +0 -94
- package/util/nullthrowsOSS.js.flow +0 -25
- package/util/orList.js.flow +0 -37
- package/util/partitionArray.js.flow +0 -37
@@ -1,81 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
3
|
-
*
|
4
|
-
* This source code is licensed under the MIT license found in the
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
6
|
-
*
|
7
|
-
* @flow strict
|
8
|
-
* @format
|
9
|
-
*/
|
10
|
-
|
11
|
-
// flowlint ambiguous-object-type:error
|
12
|
-
|
13
|
-
'use strict';
|
14
|
-
|
15
|
-
import type {Reporter} from './Reporter';
|
16
|
-
|
17
|
-
const chalk = require('chalk');
|
18
|
-
|
19
|
-
function getMemoryUsageString() {
|
20
|
-
return chalk.blue(
|
21
|
-
Math.round(process.memoryUsage().heapUsed / 1024 / 1024) + 'Mb',
|
22
|
-
);
|
23
|
-
}
|
24
|
-
|
25
|
-
class ConsoleReporter implements Reporter {
|
26
|
-
_verbose: boolean;
|
27
|
-
_quiet: boolean;
|
28
|
-
|
29
|
-
constructor(options: {verbose: boolean, quiet: boolean, ...}) {
|
30
|
-
this._verbose = options.verbose;
|
31
|
-
this._quiet = options.quiet;
|
32
|
-
}
|
33
|
-
|
34
|
-
reportMessage(message: string): void {
|
35
|
-
if (!this._quiet) {
|
36
|
-
process.stdout.write(message + '\n');
|
37
|
-
}
|
38
|
-
}
|
39
|
-
|
40
|
-
reportTime(name: string, ms: number): void {
|
41
|
-
if (this._verbose && !this._quiet) {
|
42
|
-
const time =
|
43
|
-
ms === 0
|
44
|
-
? chalk.gray(' <1ms')
|
45
|
-
: ms < 1000
|
46
|
-
? chalk.blue(leftPad(5, ms + 'ms'))
|
47
|
-
: chalk.red(Math.floor(ms / 10) / 100 + 's');
|
48
|
-
process.stdout.write(
|
49
|
-
' ' +
|
50
|
-
time +
|
51
|
-
' ' +
|
52
|
-
chalk.gray(name) +
|
53
|
-
' [' +
|
54
|
-
getMemoryUsageString() +
|
55
|
-
']\n',
|
56
|
-
);
|
57
|
-
}
|
58
|
-
}
|
59
|
-
|
60
|
-
reportError(caughtLocation: string, error: Error): void {
|
61
|
-
if (!this._quiet) {
|
62
|
-
process.stdout.write(chalk.red('ERROR:\n' + error.message + '\n'));
|
63
|
-
if (this._verbose) {
|
64
|
-
const frames = error.stack.match(/^ {4}at .*$/gm);
|
65
|
-
if (frames) {
|
66
|
-
process.stdout.write(
|
67
|
-
chalk.gray(
|
68
|
-
'From: ' + caughtLocation + '\n' + frames.join('\n') + '\n',
|
69
|
-
),
|
70
|
-
);
|
71
|
-
}
|
72
|
-
}
|
73
|
-
}
|
74
|
-
}
|
75
|
-
}
|
76
|
-
|
77
|
-
function leftPad(len, str) {
|
78
|
-
return new Array(len - str.length + 1).join(' ') + str;
|
79
|
-
}
|
80
|
-
|
81
|
-
module.exports = ConsoleReporter;
|
@@ -1,43 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
3
|
-
*
|
4
|
-
* This source code is licensed under the MIT license found in the
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
6
|
-
*
|
7
|
-
* @flow strict
|
8
|
-
* @format
|
9
|
-
*/
|
10
|
-
|
11
|
-
// flowlint ambiguous-object-type:error
|
12
|
-
|
13
|
-
'use strict';
|
14
|
-
|
15
|
-
import type {Reporter} from './Reporter';
|
16
|
-
|
17
|
-
class MultiReporter implements Reporter {
|
18
|
-
_reporters: $ReadOnlyArray<Reporter>;
|
19
|
-
|
20
|
-
constructor(...reporters: $ReadOnlyArray<Reporter>) {
|
21
|
-
this._reporters = reporters;
|
22
|
-
}
|
23
|
-
|
24
|
-
reportMessage(message: string): void {
|
25
|
-
this._reporters.forEach(reporter => {
|
26
|
-
reporter.reportMessage(message);
|
27
|
-
});
|
28
|
-
}
|
29
|
-
|
30
|
-
reportTime(name: string, ms: number): void {
|
31
|
-
this._reporters.forEach(reporter => {
|
32
|
-
reporter.reportTime(name, ms);
|
33
|
-
});
|
34
|
-
}
|
35
|
-
|
36
|
-
reportError(caughtLocation: string, error: Error): void {
|
37
|
-
this._reporters.forEach(reporter => {
|
38
|
-
reporter.reportError(caughtLocation, error);
|
39
|
-
});
|
40
|
-
}
|
41
|
-
}
|
42
|
-
|
43
|
-
module.exports = MultiReporter;
|
@@ -1,19 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
3
|
-
*
|
4
|
-
* This source code is licensed under the MIT license found in the
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
6
|
-
*
|
7
|
-
* @flow strict
|
8
|
-
* @format
|
9
|
-
*/
|
10
|
-
|
11
|
-
// flowlint ambiguous-object-type:error
|
12
|
-
|
13
|
-
'use strict';
|
14
|
-
|
15
|
-
export interface Reporter {
|
16
|
-
reportMessage(message: string): void;
|
17
|
-
reportTime(name: string, ms: number): void;
|
18
|
-
reportError(caughtLocation: string, error: Error): void;
|
19
|
-
}
|
package/runner/Artifacts.js.flow
DELETED
@@ -1,215 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
3
|
-
*
|
4
|
-
* This source code is licensed under the MIT license found in the
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
6
|
-
*
|
7
|
-
* @format
|
8
|
-
* @flow strict-local
|
9
|
-
*/
|
10
|
-
|
11
|
-
// flowlint ambiguous-object-type:error
|
12
|
-
|
13
|
-
'use strict';
|
14
|
-
|
15
|
-
import type CodegenDirectory, {Filesystem} from '../codegen/CodegenDirectory';
|
16
|
-
import type {SourceChanges} from './Sources';
|
17
|
-
import type {ExecutableDefinitionNode} from 'graphql';
|
18
|
-
|
19
|
-
const {getName} = require('./GraphQLASTUtils');
|
20
|
-
const crypto = require('crypto');
|
21
|
-
const nullthrows = require('nullthrows');
|
22
|
-
|
23
|
-
type Filename = string;
|
24
|
-
|
25
|
-
type NodeName = string;
|
26
|
-
|
27
|
-
type FileSha1Hex = string;
|
28
|
-
|
29
|
-
type ArtifactFiles = Set<Filename>;
|
30
|
-
|
31
|
-
type ArtifactsMetadata = Map<Filename, FileSha1Hex>;
|
32
|
-
|
33
|
-
export type ArtifactMap = {|
|
34
|
-
// Map nodeName to the set of artifacts for this node
|
35
|
-
+artifacts: Map<NodeName, ArtifactFiles>,
|
36
|
-
// Artifacts metadata (for now it's just sha1 of the file)
|
37
|
-
+metadata: ArtifactsMetadata,
|
38
|
-
|};
|
39
|
-
|
40
|
-
export type ArtifactState = ArtifactMap;
|
41
|
-
|
42
|
-
export type SerializedArtifactState = $ReadOnlyArray<
|
43
|
-
[string, $ReadOnlyArray<[string, string]>],
|
44
|
-
>;
|
45
|
-
|
46
|
-
function createEmptyState(): ArtifactState {
|
47
|
-
return {
|
48
|
-
artifacts: new Map(),
|
49
|
-
metadata: new Map(),
|
50
|
-
};
|
51
|
-
}
|
52
|
-
|
53
|
-
function serializeState(state: ArtifactState): SerializedArtifactState {
|
54
|
-
const json = [];
|
55
|
-
for (const [name, artifacts] of state.artifacts) {
|
56
|
-
json.push([
|
57
|
-
name,
|
58
|
-
Array.from(artifacts).map(filename => {
|
59
|
-
return [filename, state.metadata.get(filename) ?? ''];
|
60
|
-
}),
|
61
|
-
]);
|
62
|
-
}
|
63
|
-
return json;
|
64
|
-
}
|
65
|
-
|
66
|
-
function deserializeState(json: SerializedArtifactState): ArtifactState {
|
67
|
-
const metadata = new Map();
|
68
|
-
const artifacts = new Map();
|
69
|
-
json.forEach(([name, artifactArray]) => {
|
70
|
-
const artifactsFiles = new Set();
|
71
|
-
artifactArray.forEach(([filename, sha1hex]) => {
|
72
|
-
artifactsFiles.add(filename);
|
73
|
-
metadata.set(filename, sha1hex);
|
74
|
-
});
|
75
|
-
artifacts.set(name, artifactsFiles);
|
76
|
-
});
|
77
|
-
return {
|
78
|
-
artifacts,
|
79
|
-
metadata,
|
80
|
-
};
|
81
|
-
}
|
82
|
-
|
83
|
-
function updateState(
|
84
|
-
state: ArtifactState,
|
85
|
-
changes: SourceChanges<ExecutableDefinitionNode>,
|
86
|
-
generatedArtifacts: ArtifactMap,
|
87
|
-
filesystem: Filesystem,
|
88
|
-
resolveFullPath: (relativeFilePath: string) => string,
|
89
|
-
): ArtifactState {
|
90
|
-
const nextState = {
|
91
|
-
artifacts: new Map(state.artifacts),
|
92
|
-
metadata: new Map(state.metadata),
|
93
|
-
};
|
94
|
-
const deletionCandidates = new Set();
|
95
|
-
|
96
|
-
const addedNames = new Set();
|
97
|
-
for (const {ast} of changes.added) {
|
98
|
-
addedNames.add(getName(ast));
|
99
|
-
}
|
100
|
-
|
101
|
-
// For every removed AST node, delete the generated artifacts tracked for that
|
102
|
-
// node, unless the AST node was also added when the file was moved or the
|
103
|
-
// AST changed which shows up as added and removed in changes.
|
104
|
-
for (const {ast} of changes.removed) {
|
105
|
-
const name = getName(ast);
|
106
|
-
|
107
|
-
if (addedNames.has(name)) {
|
108
|
-
// Update, we deal with that when iterating the added nodes.
|
109
|
-
continue;
|
110
|
-
}
|
111
|
-
const entry = nextState.artifacts.get(name);
|
112
|
-
if (entry == null) {
|
113
|
-
// No existing artifacts to delete
|
114
|
-
continue;
|
115
|
-
}
|
116
|
-
for (const outdatedFile of entry.keys()) {
|
117
|
-
deletionCandidates.add(outdatedFile);
|
118
|
-
}
|
119
|
-
nextState.artifacts.delete(name);
|
120
|
-
}
|
121
|
-
|
122
|
-
for (const [name, artifacts] of generatedArtifacts.artifacts) {
|
123
|
-
const oldEntry = nextState.artifacts.get(name);
|
124
|
-
if (oldEntry != null) {
|
125
|
-
for (const outdatedFile of oldEntry) {
|
126
|
-
if (!artifacts.has(outdatedFile)) {
|
127
|
-
deletionCandidates.add(outdatedFile);
|
128
|
-
}
|
129
|
-
}
|
130
|
-
}
|
131
|
-
nextState.artifacts.set(name, artifacts);
|
132
|
-
for (const filename of artifacts.keys()) {
|
133
|
-
nextState.metadata.set(
|
134
|
-
filename,
|
135
|
-
generatedArtifacts.metadata.get(filename) ?? '',
|
136
|
-
);
|
137
|
-
}
|
138
|
-
}
|
139
|
-
|
140
|
-
if (deletionCandidates.size === 0) {
|
141
|
-
return nextState;
|
142
|
-
}
|
143
|
-
|
144
|
-
const nextGeneratedArtifacts = new Set();
|
145
|
-
for (const [, artifact] of eachNameAndArtifact(nextState)) {
|
146
|
-
nextGeneratedArtifacts.add(artifact);
|
147
|
-
}
|
148
|
-
for (const candidate of deletionCandidates) {
|
149
|
-
const someoneElseArtifact = nextGeneratedArtifacts.has(candidate);
|
150
|
-
if (someoneElseArtifact) {
|
151
|
-
// Sometimes, there are artifacts that are generated by multiple files
|
152
|
-
// If this candidate is also generated by someone else in
|
153
|
-
// artifact map, we just skip it here
|
154
|
-
continue;
|
155
|
-
}
|
156
|
-
|
157
|
-
const candidatePath = resolveFullPath(candidate);
|
158
|
-
if (filesystem.existsSync(candidatePath)) {
|
159
|
-
filesystem.unlinkSync(candidatePath);
|
160
|
-
nextState.metadata.delete(candidate);
|
161
|
-
}
|
162
|
-
}
|
163
|
-
|
164
|
-
return nextState;
|
165
|
-
}
|
166
|
-
|
167
|
-
function producedFiles(
|
168
|
-
dirs: $ReadOnlyArray<{|
|
169
|
-
baseDir: string,
|
170
|
-
dir: CodegenDirectory,
|
171
|
-
|}>,
|
172
|
-
artifactsMetadata: ArtifactsMetadata,
|
173
|
-
): ArtifactsMetadata {
|
174
|
-
const result = new Map();
|
175
|
-
dirs.forEach(({baseDir, dir}) => {
|
176
|
-
const {deleted, updated, created, unchanged} = dir.changes;
|
177
|
-
if (deleted.length > 0) {
|
178
|
-
throw new Error('Did not expect to see a deletion entry here.');
|
179
|
-
}
|
180
|
-
[...updated, ...created].forEach(filename => {
|
181
|
-
const name = dir.getPath(filename).substr(baseDir.length + 1);
|
182
|
-
const sha1hex = sha1(nullthrows(dir.read(filename)));
|
183
|
-
result.set(name, sha1hex);
|
184
|
-
});
|
185
|
-
unchanged.forEach(filename => {
|
186
|
-
const name = dir.getPath(filename).substr(baseDir.length + 1);
|
187
|
-
const sha1hex = artifactsMetadata.get(name);
|
188
|
-
result.set(name, sha1hex ?? sha1(nullthrows(dir.read(filename))));
|
189
|
-
});
|
190
|
-
});
|
191
|
-
return result;
|
192
|
-
}
|
193
|
-
|
194
|
-
function* eachNameAndArtifact(
|
195
|
-
artifacts: ArtifactState,
|
196
|
-
): Iterator<[string, string]> {
|
197
|
-
for (const [name, artifactsForSource] of artifacts.artifacts) {
|
198
|
-
for (const artifactFile of artifactsForSource.keys()) {
|
199
|
-
yield [name, artifactFile];
|
200
|
-
}
|
201
|
-
}
|
202
|
-
}
|
203
|
-
|
204
|
-
function sha1(content: string): string {
|
205
|
-
return crypto.createHash('sha1').update(content).digest('hex');
|
206
|
-
}
|
207
|
-
|
208
|
-
module.exports = {
|
209
|
-
createEmptyState,
|
210
|
-
serializeState,
|
211
|
-
deserializeState,
|
212
|
-
updateState,
|
213
|
-
producedFiles,
|
214
|
-
eachNameAndArtifact,
|
215
|
-
};
|
@@ -1,194 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
3
|
-
*
|
4
|
-
* This source code is licensed under the MIT license found in the
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
6
|
-
*
|
7
|
-
* @emails oncall+relay
|
8
|
-
* @flow strict
|
9
|
-
* @format
|
10
|
-
*/
|
11
|
-
|
12
|
-
// flowlint ambiguous-object-type:error
|
13
|
-
|
14
|
-
'use strict';
|
15
|
-
|
16
|
-
import type {Filesystem} from '../codegen/CodegenDirectory';
|
17
|
-
import type {SourceControl} from '../codegen/SourceControl';
|
18
|
-
|
19
|
-
const fs = require('fs');
|
20
|
-
const invariant = require('invariant');
|
21
|
-
|
22
|
-
/**
|
23
|
-
* A filesystem wrapper that buffers file reads and writes until `commit()` is
|
24
|
-
* called.
|
25
|
-
*/
|
26
|
-
class BufferedFilesystem implements Filesystem {
|
27
|
-
buffer: Map<string, ?string> = new Map();
|
28
|
-
committed: boolean = false;
|
29
|
-
|
30
|
-
_assertNotComitted() {
|
31
|
-
invariant(
|
32
|
-
!this.committed,
|
33
|
-
'BufferedFilesystem: no operations allowed after commit().',
|
34
|
-
);
|
35
|
-
}
|
36
|
-
|
37
|
-
async commit(sourceControl: ?SourceControl) {
|
38
|
-
this._assertNotComitted();
|
39
|
-
this.committed = true;
|
40
|
-
|
41
|
-
const removed = [];
|
42
|
-
const added = [];
|
43
|
-
for (const [path, data] of this.buffer) {
|
44
|
-
if (data == null) {
|
45
|
-
removed.push(path);
|
46
|
-
fs.unlinkSync(path);
|
47
|
-
} else {
|
48
|
-
const fileExisits = fs.existsSync(path);
|
49
|
-
const currentData = fileExisits ? fs.readFileSync(path, 'utf8') : null;
|
50
|
-
if (currentData !== data) {
|
51
|
-
added.push(path);
|
52
|
-
fs.writeFileSync(path, data, 'utf8');
|
53
|
-
}
|
54
|
-
}
|
55
|
-
}
|
56
|
-
if (sourceControl) {
|
57
|
-
await sourceControl.addRemove(added, removed);
|
58
|
-
}
|
59
|
-
}
|
60
|
-
|
61
|
-
hasChanges(): boolean {
|
62
|
-
this._assertNotComitted();
|
63
|
-
return this.buffer.size > 0;
|
64
|
-
}
|
65
|
-
|
66
|
-
getChangesSummary(): string {
|
67
|
-
this._assertNotComitted();
|
68
|
-
const added = [];
|
69
|
-
const updated = [];
|
70
|
-
const removed = [];
|
71
|
-
for (const [path, data] of this.buffer) {
|
72
|
-
if (data == null) {
|
73
|
-
removed.push(path);
|
74
|
-
} else {
|
75
|
-
if (!fs.existsSync(path)) {
|
76
|
-
added.push(path);
|
77
|
-
} else {
|
78
|
-
updated.push(path);
|
79
|
-
}
|
80
|
-
}
|
81
|
-
}
|
82
|
-
return [
|
83
|
-
added.length > 0 ? `Added:\n${added.map(formatFilepath).join('')}` : '',
|
84
|
-
updated.length > 0
|
85
|
-
? `Updated:\n${updated.map(formatFilepath).join('')}`
|
86
|
-
: '',
|
87
|
-
removed.length > 0
|
88
|
-
? `Removed:\n${removed.map(formatFilepath).join('')}`
|
89
|
-
: '',
|
90
|
-
]
|
91
|
-
.filter(Boolean)
|
92
|
-
.join('\n');
|
93
|
-
}
|
94
|
-
|
95
|
-
getAddedRemovedFiles(): {|
|
96
|
-
+added: $ReadOnlyArray<string>,
|
97
|
-
+removed: $ReadOnlyArray<string>,
|
98
|
-
|} {
|
99
|
-
this._assertNotComitted();
|
100
|
-
const added = [];
|
101
|
-
const removed = [];
|
102
|
-
for (const [path, data] of this.buffer) {
|
103
|
-
if (data == null) {
|
104
|
-
removed.push(path);
|
105
|
-
} else {
|
106
|
-
if (!fs.existsSync(path)) {
|
107
|
-
added.push(path);
|
108
|
-
}
|
109
|
-
}
|
110
|
-
}
|
111
|
-
return {
|
112
|
-
added,
|
113
|
-
removed,
|
114
|
-
};
|
115
|
-
}
|
116
|
-
|
117
|
-
existsSync(path: string): boolean {
|
118
|
-
this._assertNotComitted();
|
119
|
-
return this.buffer.has(path)
|
120
|
-
? Boolean(this.buffer.get(path))
|
121
|
-
: fs.existsSync(path);
|
122
|
-
}
|
123
|
-
|
124
|
-
mkdirSync(path: string): void {
|
125
|
-
this._assertNotComitted();
|
126
|
-
fs.mkdirSync(path);
|
127
|
-
}
|
128
|
-
|
129
|
-
readdirSync(path: string): Array<string> {
|
130
|
-
this._assertNotComitted();
|
131
|
-
throw new Error('BufferedFilesystem: readdirSync is not implemented.');
|
132
|
-
}
|
133
|
-
|
134
|
-
readFileSync(path: string, encoding: string): string {
|
135
|
-
this._assertNotComitted();
|
136
|
-
if (this.buffer.has(path)) {
|
137
|
-
const data = this.buffer.get(path);
|
138
|
-
invariant(
|
139
|
-
data != null,
|
140
|
-
'BufferedFilesystem: trying to read deleted file.',
|
141
|
-
);
|
142
|
-
return data;
|
143
|
-
}
|
144
|
-
return fs.readFileSync(path, encoding);
|
145
|
-
}
|
146
|
-
|
147
|
-
statSync(path: string): interface {isDirectory(): boolean} {
|
148
|
-
this._assertNotComitted();
|
149
|
-
return fs.statSync(path);
|
150
|
-
}
|
151
|
-
|
152
|
-
unlinkSync(path: string): void {
|
153
|
-
this._assertNotComitted();
|
154
|
-
this.buffer.set(path, null);
|
155
|
-
}
|
156
|
-
|
157
|
-
writeFileSync(filename: string, data: string, encoding: string): void {
|
158
|
-
this._assertNotComitted();
|
159
|
-
this.buffer.set(filename, data);
|
160
|
-
}
|
161
|
-
|
162
|
-
changedFilesToJSON(): {|
|
163
|
-
+changed: $ReadOnlyArray<{|
|
164
|
-
+path: string,
|
165
|
-
+data: string,
|
166
|
-
|}>,
|
167
|
-
+removed: $ReadOnlyArray<{|
|
168
|
-
+path: string,
|
169
|
-
|}>,
|
170
|
-
|} {
|
171
|
-
this._assertNotComitted();
|
172
|
-
const changed = [];
|
173
|
-
const removed = [];
|
174
|
-
for (const [path, data] of this.buffer) {
|
175
|
-
if (data == null) {
|
176
|
-
removed.push({path});
|
177
|
-
} else {
|
178
|
-
changed.push({path, data});
|
179
|
-
}
|
180
|
-
}
|
181
|
-
return {
|
182
|
-
removed,
|
183
|
-
changed,
|
184
|
-
};
|
185
|
-
}
|
186
|
-
}
|
187
|
-
|
188
|
-
function formatFilepath(filepath: string): string {
|
189
|
-
const startIndex = filepath.length - 80;
|
190
|
-
const prefix = startIndex > 0 ? `\t - ${filepath.substr(0, 8)}...` : '\t - ';
|
191
|
-
return prefix + filepath.substr(startIndex, filepath.length) + '\n';
|
192
|
-
}
|
193
|
-
|
194
|
-
module.exports = BufferedFilesystem;
|