perttool 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +53 -0
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/dist/analysis/graph.d.ts +41 -0
- package/dist/analysis/graph.d.ts.map +1 -0
- package/dist/analysis/graph.js +199 -0
- package/dist/analysis/graph.js.map +1 -0
- package/dist/analysis/precedence.d.ts +52 -0
- package/dist/analysis/precedence.d.ts.map +1 -0
- package/dist/analysis/precedence.js +187 -0
- package/dist/analysis/precedence.js.map +1 -0
- package/dist/analysis/resource.d.ts +96 -0
- package/dist/analysis/resource.d.ts.map +1 -0
- package/dist/analysis/resource.js +522 -0
- package/dist/analysis/resource.js.map +1 -0
- package/dist/application/analyze.d.ts +32 -0
- package/dist/application/analyze.d.ts.map +1 -0
- package/dist/application/analyze.js +144 -0
- package/dist/application/analyze.js.map +1 -0
- package/dist/application/check.d.ts +24 -0
- package/dist/application/check.d.ts.map +1 -0
- package/dist/application/check.js +43 -0
- package/dist/application/check.js.map +1 -0
- package/dist/application/format.d.ts +21 -0
- package/dist/application/format.d.ts.map +1 -0
- package/dist/application/format.js +52 -0
- package/dist/application/format.js.map +1 -0
- package/dist/application/mutate.d.ts +4 -0
- package/dist/application/mutate.d.ts.map +1 -0
- package/dist/application/mutate.js +175 -0
- package/dist/application/mutate.js.map +1 -0
- package/dist/application/next.d.ts +86 -0
- package/dist/application/next.d.ts.map +1 -0
- package/dist/application/next.js +310 -0
- package/dist/application/next.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +2103 -0
- package/dist/cli.js.map +1 -0
- package/dist/conversion/mermaid-import.d.ts +26 -0
- package/dist/conversion/mermaid-import.d.ts.map +1 -0
- package/dist/conversion/mermaid-import.js +655 -0
- package/dist/conversion/mermaid-import.js.map +1 -0
- package/dist/conversion/mermaid.d.ts +38 -0
- package/dist/conversion/mermaid.d.ts.map +1 -0
- package/dist/conversion/mermaid.js +362 -0
- package/dist/conversion/mermaid.js.map +1 -0
- package/dist/editing/unified-diff.d.ts +7 -0
- package/dist/editing/unified-diff.d.ts.map +1 -0
- package/dist/editing/unified-diff.js +81 -0
- package/dist/editing/unified-diff.js.map +1 -0
- package/dist/formatter/source-formatter.d.ts +17 -0
- package/dist/formatter/source-formatter.d.ts.map +1 -0
- package/dist/formatter/source-formatter.js +210 -0
- package/dist/formatter/source-formatter.js.map +1 -0
- package/dist/help/registry.d.ts +37 -0
- package/dist/help/registry.d.ts.map +1 -0
- package/dist/help/registry.js +657 -0
- package/dist/help/registry.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/io/document-file.d.ts +9 -0
- package/dist/io/document-file.d.ts.map +1 -0
- package/dist/io/document-file.js +19 -0
- package/dist/io/document-file.js.map +1 -0
- package/dist/io/safe-write.d.ts +33 -0
- package/dist/io/safe-write.d.ts.map +1 -0
- package/dist/io/safe-write.js +280 -0
- package/dist/io/safe-write.js.map +1 -0
- package/dist/model/diagnostics.d.ts +43 -0
- package/dist/model/diagnostics.d.ts.map +1 -0
- package/dist/model/diagnostics.js +47 -0
- package/dist/model/diagnostics.js.map +1 -0
- package/dist/model/rational.d.ts +21 -0
- package/dist/model/rational.d.ts.map +1 -0
- package/dist/model/rational.js +84 -0
- package/dist/model/rational.js.map +1 -0
- package/dist/model/syntax.d.ts +67 -0
- package/dist/model/syntax.d.ts.map +1 -0
- package/dist/model/syntax.js +15 -0
- package/dist/model/syntax.js.map +1 -0
- package/dist/model/units.d.ts +18 -0
- package/dist/model/units.d.ts.map +1 -0
- package/dist/model/units.js +29 -0
- package/dist/model/units.js.map +1 -0
- package/dist/mutation/advance.d.ts +26 -0
- package/dist/mutation/advance.d.ts.map +1 -0
- package/dist/mutation/advance.js +261 -0
- package/dist/mutation/advance.js.map +1 -0
- package/dist/mutation/diagnostics.d.ts +10 -0
- package/dist/mutation/diagnostics.d.ts.map +1 -0
- package/dist/mutation/diagnostics.js +10 -0
- package/dist/mutation/diagnostics.js.map +1 -0
- package/dist/mutation/entity-editor.d.ts +16 -0
- package/dist/mutation/entity-editor.d.ts.map +1 -0
- package/dist/mutation/entity-editor.js +103 -0
- package/dist/mutation/entity-editor.js.map +1 -0
- package/dist/mutation/milestone.d.ts +5 -0
- package/dist/mutation/milestone.d.ts.map +1 -0
- package/dist/mutation/milestone.js +194 -0
- package/dist/mutation/milestone.js.map +1 -0
- package/dist/mutation/resource.d.ts +5 -0
- package/dist/mutation/resource.d.ts.map +1 -0
- package/dist/mutation/resource.js +145 -0
- package/dist/mutation/resource.js.map +1 -0
- package/dist/mutation/source.d.ts +22 -0
- package/dist/mutation/source.d.ts.map +1 -0
- package/dist/mutation/source.js +155 -0
- package/dist/mutation/source.js.map +1 -0
- package/dist/mutation/task.d.ts +10 -0
- package/dist/mutation/task.d.ts.map +1 -0
- package/dist/mutation/task.js +644 -0
- package/dist/mutation/task.js.map +1 -0
- package/dist/mutation/text-edits.d.ts +8 -0
- package/dist/mutation/text-edits.d.ts.map +1 -0
- package/dist/mutation/text-edits.js +33 -0
- package/dist/mutation/text-edits.js.map +1 -0
- package/dist/mutation/types.d.ts +153 -0
- package/dist/mutation/types.d.ts.map +1 -0
- package/dist/mutation/types.js +2 -0
- package/dist/mutation/types.js.map +1 -0
- package/dist/parser/document-parser.d.ts +6 -0
- package/dist/parser/document-parser.d.ts.map +1 -0
- package/dist/parser/document-parser.js +735 -0
- package/dist/parser/document-parser.js.map +1 -0
- package/dist/recommendation/explanation-types.d.ts +226 -0
- package/dist/recommendation/explanation-types.d.ts.map +1 -0
- package/dist/recommendation/explanation-types.js +2 -0
- package/dist/recommendation/explanation-types.js.map +1 -0
- package/dist/recommendation/explanation-validation.d.ts +4 -0
- package/dist/recommendation/explanation-validation.d.ts.map +1 -0
- package/dist/recommendation/explanation-validation.js +745 -0
- package/dist/recommendation/explanation-validation.js.map +1 -0
- package/dist/recommendation/explanation-values.d.ts +7 -0
- package/dist/recommendation/explanation-values.d.ts.map +1 -0
- package/dist/recommendation/explanation-values.js +283 -0
- package/dist/recommendation/explanation-values.js.map +1 -0
- package/dist/recommendation/explanation.d.ts +8 -0
- package/dist/recommendation/explanation.d.ts.map +1 -0
- package/dist/recommendation/explanation.js +1022 -0
- package/dist/recommendation/explanation.js.map +1 -0
- package/dist/recommendation/failure.d.ts +3 -0
- package/dist/recommendation/failure.d.ts.map +1 -0
- package/dist/recommendation/failure.js +4 -0
- package/dist/recommendation/failure.js.map +1 -0
- package/dist/recommendation/json.d.ts +3 -0
- package/dist/recommendation/json.d.ts.map +1 -0
- package/dist/recommendation/json.js +252 -0
- package/dist/recommendation/json.js.map +1 -0
- package/dist/recommendation/override-types.d.ts +117 -0
- package/dist/recommendation/override-types.d.ts.map +1 -0
- package/dist/recommendation/override-types.js +2 -0
- package/dist/recommendation/override-types.js.map +1 -0
- package/dist/recommendation/override.d.ts +7 -0
- package/dist/recommendation/override.d.ts.map +1 -0
- package/dist/recommendation/override.js +717 -0
- package/dist/recommendation/override.js.map +1 -0
- package/dist/recommendation/ranking.d.ts +7 -0
- package/dist/recommendation/ranking.d.ts.map +1 -0
- package/dist/recommendation/ranking.js +391 -0
- package/dist/recommendation/ranking.js.map +1 -0
- package/dist/recommendation/types.d.ts +83 -0
- package/dist/recommendation/types.d.ts.map +1 -0
- package/dist/recommendation/types.js +2 -0
- package/dist/recommendation/types.js.map +1 -0
- package/dist/semantic/validator.d.ts +4 -0
- package/dist/semantic/validator.d.ts.map +1 -0
- package/dist/semantic/validator.js +490 -0
- package/dist/semantic/validator.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +61 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export { checkDocument } from "./application/check.js";
|
|
2
|
+
export { analyzeDocument } from "./application/analyze.js";
|
|
3
|
+
export { planFormat } from "./application/format.js";
|
|
4
|
+
export { selectNextTasks } from "./application/next.js";
|
|
5
|
+
export { recommendationAnalysisToJson } from "./recommendation/json.js";
|
|
6
|
+
export { canonicalOverrideArtifact, humanOverrideDecisionToJson, overrideValidationResultToJson, validateOverride, } from "./recommendation/override.js";
|
|
7
|
+
export { planMutation } from "./application/mutate.js";
|
|
8
|
+
export { planAdvance } from "./mutation/advance.js";
|
|
9
|
+
export { exportMermaid } from "./conversion/mermaid.js";
|
|
10
|
+
export { importMermaid } from "./conversion/mermaid-import.js";
|
|
11
|
+
export { buildResidualGraph, computeEffectiveReached } from "./analysis/graph.js";
|
|
12
|
+
export { analyzePrecedence } from "./analysis/precedence.js";
|
|
13
|
+
export { analyzeResources } from "./analysis/resource.js";
|
|
14
|
+
export { getHelp } from "./help/registry.js";
|
|
15
|
+
export { formatDocument } from "./formatter/source-formatter.js";
|
|
16
|
+
export { digestDocumentBytes, documentContentFromBytes, readDocumentFile, } from "./io/document-file.js";
|
|
17
|
+
export { createArtifactFile, createDocumentFile, replaceDocumentFile, SafeWriteConflictError, SafeWriteVerificationError, } from "./io/safe-write.js";
|
|
18
|
+
export { DEFAULT_MAX_DIAGNOSTICS, MAX_DIAGNOSTICS_LIMIT, } from "./model/diagnostics.js";
|
|
19
|
+
export * from "./model/rational.js";
|
|
20
|
+
export * from "./model/units.js";
|
|
21
|
+
export { parseDocument } from "./parser/document-parser.js";
|
|
22
|
+
export { validateDocument } from "./semantic/validator.js";
|
|
23
|
+
export type { CheckOptions, CheckResult, CheckSummary } from "./application/check.js";
|
|
24
|
+
export type { ConversionLoss, ConversionLossReport, MermaidAnalysisMode, MermaidExportOptions, MermaidExportResult, MermaidProfile, } from "./conversion/mermaid.js";
|
|
25
|
+
export type { GeneratedId, MermaidImportOptions, MermaidImportResult, } from "./conversion/mermaid-import.js";
|
|
26
|
+
export type { FormatPreviewOptions, FormatPreviewResult, } from "./application/format.js";
|
|
27
|
+
export type { AnalysisMode, AnalysisResult, AnalyzeOptions, } from "./application/analyze.js";
|
|
28
|
+
export type { ExplanationNode, NextGroups, NextOptions, NextResult, NextResultV3, NextTask, ResourceRejection, TaskClassification, UnsatisfiedEdgeExplanation, } from "./application/next.js";
|
|
29
|
+
export type { RecommendationAnalysis, RecommendationComparison, RecommendationComparisonScope, RecommendationDecisionPhase, RecommendationDecisionRole, RecommendationDecisionStep, RecommendationDescription, RecommendationDescriptionParameter, RecommendationEntityKind, RecommendationEntityReference, RecommendationExplanationStatus, RecommendationExplanationTaskDecision, RecommendationExpression, RecommendationExpressionTerm, RecommendationFact, RecommendationProvenance, RecommendationProvenanceKind, RecommendationReasonCode, RecommendationReasonEffect, RecommendationReasonOccurrence, RecommendationRelation, RecommendationResultDecision, RecommendationScalarValue, RecommendationUnit, RecommendationValue, } from "./recommendation/explanation-types.js";
|
|
30
|
+
export type { RecommendationCriticalClass, RecommendationDistance, RecommendationRankingRuleId, RecommendationTier, } from "./recommendation/types.js";
|
|
31
|
+
export type { HumanOverrideDecision, HumanOverrideReasonCode, OverrideActor, OverrideDecisionSource, OverrideEvidenceKind, OverrideEvidenceReference, OverrideFeasibility, OverrideReason, OverrideRequest, OverrideResourceWitness, OverrideSelection, OverrideTaskDecision, OverrideTriggerCode, OverrideValidationResult, } from "./recommendation/override-types.js";
|
|
32
|
+
export type { AnalysisEdge, AnalysisResource, ResidualGraph, TaskStatus, } from "./analysis/graph.js";
|
|
33
|
+
export type { CriticalPath, CriticalResult, EdgeTiming, MilestoneTiming, PrecedenceResult, } from "./analysis/precedence.js";
|
|
34
|
+
export type { ResourceArc, ResourceCapacity, ResourceScheduleResult, ResourceStatistic, ResourceTimelineEntry, ScheduleCriticalResult, ScheduledTask, SchedulePath, } from "./analysis/resource.js";
|
|
35
|
+
export type { Diagnostic, DiagnosticCounts, SourcePosition, SourceSpan, } from "./model/diagnostics.js";
|
|
36
|
+
export type { DocumentNode, DeclarationNode, FieldNode, TriviaNode, VelocityValue, } from "./model/syntax.js";
|
|
37
|
+
export type { ParseOptions } from "./parser/document-parser.js";
|
|
38
|
+
export type { FormatOptions, FormatResult, } from "./formatter/source-formatter.js";
|
|
39
|
+
export type { TextEdit } from "./mutation/text-edits.js";
|
|
40
|
+
export type { AdvanceDetails, AdvanceResult, AdvanceRetainedEdge, AdvanceRetentionReason, } from "./mutation/advance.js";
|
|
41
|
+
export type { DocumentContent } from "./io/document-file.js";
|
|
42
|
+
export type { CreateArtifactOptions, CreateDocumentOptions, DocumentWriteResult, ReplaceDocumentOptions, SafeWriteConflictReason, SafeWriteVerificationReason, } from "./io/safe-write.js";
|
|
43
|
+
export type { AddMilestoneMutation, AddResourceMutation, AddTaskMutation, AtomicMutation, BatchMutation, FinishTaskMutation, MilestoneClearableField, MilestoneDefinition, MilestoneFieldSet, MilestoneMutation, MilestoneMutationState, Mutation, MutationOptions, MutationResult, RemoveMilestoneMutation, RemoveResourceMutation, RemoveTaskMutation, ResourceClearableField, ResourceDefinition, ResourceFieldSet, ResourceMutation, SetMilestoneMutation, SetResourceMutation, SetTaskMutation, TaskClearableField, TaskDefinition, TaskEstimateInput, TaskFieldSet, TaskMutation, TaskMutationStatus, TaskRequirementInput, } from "./mutation/types.js";
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export { checkDocument } from "./application/check.js";
|
|
2
|
+
export { analyzeDocument } from "./application/analyze.js";
|
|
3
|
+
export { planFormat } from "./application/format.js";
|
|
4
|
+
export { selectNextTasks } from "./application/next.js";
|
|
5
|
+
export { recommendationAnalysisToJson } from "./recommendation/json.js";
|
|
6
|
+
export { canonicalOverrideArtifact, humanOverrideDecisionToJson, overrideValidationResultToJson, validateOverride, } from "./recommendation/override.js";
|
|
7
|
+
export { planMutation } from "./application/mutate.js";
|
|
8
|
+
export { planAdvance } from "./mutation/advance.js";
|
|
9
|
+
export { exportMermaid } from "./conversion/mermaid.js";
|
|
10
|
+
export { importMermaid } from "./conversion/mermaid-import.js";
|
|
11
|
+
export { buildResidualGraph, computeEffectiveReached } from "./analysis/graph.js";
|
|
12
|
+
export { analyzePrecedence } from "./analysis/precedence.js";
|
|
13
|
+
export { analyzeResources } from "./analysis/resource.js";
|
|
14
|
+
export { getHelp } from "./help/registry.js";
|
|
15
|
+
export { formatDocument } from "./formatter/source-formatter.js";
|
|
16
|
+
export { digestDocumentBytes, documentContentFromBytes, readDocumentFile, } from "./io/document-file.js";
|
|
17
|
+
export { createArtifactFile, createDocumentFile, replaceDocumentFile, SafeWriteConflictError, SafeWriteVerificationError, } from "./io/safe-write.js";
|
|
18
|
+
export { DEFAULT_MAX_DIAGNOSTICS, MAX_DIAGNOSTICS_LIMIT, } from "./model/diagnostics.js";
|
|
19
|
+
export * from "./model/rational.js";
|
|
20
|
+
export * from "./model/units.js";
|
|
21
|
+
export { parseDocument } from "./parser/document-parser.js";
|
|
22
|
+
export { validateDocument } from "./semantic/validator.js";
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,8BAA8B,EAC9B,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface DocumentContent {
|
|
2
|
+
readonly bytes: Buffer;
|
|
3
|
+
readonly text: string;
|
|
4
|
+
readonly digest: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function digestDocumentBytes(bytes: Uint8Array): string;
|
|
7
|
+
export declare function documentContentFromBytes(bytes: Uint8Array): DocumentContent;
|
|
8
|
+
export declare function readDocumentFile(path: string): Promise<DocumentContent>;
|
|
9
|
+
//# sourceMappingURL=document-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-file.d.ts","sourceRoot":"","sources":["../../src/io/document-file.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAE7D;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,CAQ3E;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAE7E"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { TextDecoder } from "node:util";
|
|
4
|
+
export function digestDocumentBytes(bytes) {
|
|
5
|
+
return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
|
|
6
|
+
}
|
|
7
|
+
export function documentContentFromBytes(bytes) {
|
|
8
|
+
const ownedBytes = Buffer.from(bytes);
|
|
9
|
+
const decoder = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
|
|
10
|
+
return {
|
|
11
|
+
bytes: ownedBytes,
|
|
12
|
+
text: decoder.decode(ownedBytes),
|
|
13
|
+
digest: digestDocumentBytes(ownedBytes),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export async function readDocumentFile(path) {
|
|
17
|
+
return documentContentFromBytes(await readFile(path));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=document-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-file.js","sourceRoot":"","sources":["../../src/io/document-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAQxC,MAAM,UAAU,mBAAmB,CAAC,KAAiB;IACnD,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAiB;IACxD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,OAAO;QACL,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;QAChC,MAAM,EAAE,mBAAmB,CAAC,UAAU,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,OAAO,wBAAwB,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Diagnostic } from "../model/diagnostics.js";
|
|
2
|
+
export type SafeWriteConflictReason = "expected_digest_mismatch" | "source_changed" | "symlink" | "not_regular_file" | "target_exists";
|
|
3
|
+
export declare class SafeWriteConflictError extends Error {
|
|
4
|
+
readonly reason: SafeWriteConflictReason;
|
|
5
|
+
constructor(reason: SafeWriteConflictReason, message: string);
|
|
6
|
+
}
|
|
7
|
+
export type SafeWriteVerificationReason = "invalid_candidate" | "post_write_digest_mismatch" | "post_write_invalid";
|
|
8
|
+
export declare class SafeWriteVerificationError extends Error {
|
|
9
|
+
readonly reason: SafeWriteVerificationReason;
|
|
10
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
11
|
+
constructor(reason: SafeWriteVerificationReason, message: string, diagnostics?: readonly Diagnostic[]);
|
|
12
|
+
}
|
|
13
|
+
export interface ReplaceDocumentOptions {
|
|
14
|
+
readonly initialDigest: string;
|
|
15
|
+
readonly expectedDigest?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface CreateDocumentOptions {
|
|
18
|
+
readonly mode?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface CreateArtifactOptions {
|
|
21
|
+
readonly mode?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface DocumentWriteResult {
|
|
24
|
+
readonly mode: "in_place" | "out";
|
|
25
|
+
readonly target: string;
|
|
26
|
+
readonly digest: string;
|
|
27
|
+
readonly bytesWritten: number;
|
|
28
|
+
readonly written: boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare function replaceDocumentFile(target: string, candidateText: string, options: ReplaceDocumentOptions): Promise<DocumentWriteResult>;
|
|
31
|
+
export declare function createDocumentFile(target: string, candidateText: string, options?: CreateDocumentOptions): Promise<DocumentWriteResult>;
|
|
32
|
+
export declare function createArtifactFile(target: string, artifact: string, options?: CreateArtifactOptions): Promise<DocumentWriteResult>;
|
|
33
|
+
//# sourceMappingURL=safe-write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-write.d.ts","sourceRoot":"","sources":["../../src/io/safe-write.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAM1D,MAAM,MAAM,uBAAuB,GAC/B,0BAA0B,GAC1B,gBAAgB,GAChB,SAAS,GACT,kBAAkB,GAClB,eAAe,CAAC;AAEpB,qBAAa,sBAAuB,SAAQ,KAAK;IAE7C,QAAQ,CAAC,MAAM,EAAE,uBAAuB;IAD1C,YACW,MAAM,EAAE,uBAAuB,EACxC,OAAO,EAAE,MAAM,EAIhB;CACF;AAED,MAAM,MAAM,2BAA2B,GACnC,mBAAmB,GACnB,4BAA4B,GAC5B,oBAAoB,CAAC;AAEzB,qBAAa,0BAA2B,SAAQ,KAAK;IAEjD,QAAQ,CAAC,MAAM,EAAE,2BAA2B;IAE5C,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE;IAH7C,YACW,MAAM,EAAE,2BAA2B,EAC5C,OAAO,EAAE,MAAM,EACN,WAAW,GAAE,SAAS,UAAU,EAAO,EAIjD;CACF;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,KAAK,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAyLD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CA4D9B;AAeD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAsC9B;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAsC9B"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { link, lstat, open, rename, unlink, } from "node:fs/promises";
|
|
4
|
+
import { basename, dirname, join } from "node:path";
|
|
5
|
+
import { checkDocument } from "../application/check.js";
|
|
6
|
+
import { digestDocumentBytes, readDocumentFile, } from "./document-file.js";
|
|
7
|
+
export class SafeWriteConflictError extends Error {
|
|
8
|
+
reason;
|
|
9
|
+
constructor(reason, message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.reason = reason;
|
|
12
|
+
this.name = "SafeWriteConflictError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class SafeWriteVerificationError extends Error {
|
|
16
|
+
reason;
|
|
17
|
+
diagnostics;
|
|
18
|
+
constructor(reason, message, diagnostics = []) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.reason = reason;
|
|
21
|
+
this.diagnostics = diagnostics;
|
|
22
|
+
this.name = "SafeWriteVerificationError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function errorCode(error) {
|
|
26
|
+
return typeof error === "object" && error !== null && "code" in error
|
|
27
|
+
? String(error.code)
|
|
28
|
+
: undefined;
|
|
29
|
+
}
|
|
30
|
+
async function writableSource(path) {
|
|
31
|
+
const pathStat = await lstat(path);
|
|
32
|
+
if (pathStat.isSymbolicLink()) {
|
|
33
|
+
throw new SafeWriteConflictError("symlink", `symlink inputへのwriteは拒否されました: ${path}`);
|
|
34
|
+
}
|
|
35
|
+
if (!pathStat.isFile()) {
|
|
36
|
+
throw new SafeWriteConflictError("not_regular_file", `regular file以外へのwriteは拒否されました: ${path}`);
|
|
37
|
+
}
|
|
38
|
+
let handle;
|
|
39
|
+
try {
|
|
40
|
+
handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (errorCode(error) === "ELOOP") {
|
|
44
|
+
throw new SafeWriteConflictError("symlink", `symlink inputへのwriteは拒否されました: ${path}`);
|
|
45
|
+
}
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const openedStat = await handle.stat();
|
|
50
|
+
if (!openedStat.isFile()) {
|
|
51
|
+
throw new SafeWriteConflictError("not_regular_file", `regular file以外へのwriteは拒否されました: ${path}`);
|
|
52
|
+
}
|
|
53
|
+
if (openedStat.dev !== pathStat.dev || openedStat.ino !== pathStat.ino) {
|
|
54
|
+
throw new SafeWriteConflictError("source_changed", `document pathがread中に置き換えられました: ${path}`);
|
|
55
|
+
}
|
|
56
|
+
const bytes = await handle.readFile();
|
|
57
|
+
return {
|
|
58
|
+
digest: digestDocumentBytes(bytes),
|
|
59
|
+
mode: openedStat.mode & 0o7777,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
await handle.close();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function currentWritableSource(path) {
|
|
67
|
+
try {
|
|
68
|
+
return await writableSource(path);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (errorCode(error) === "ENOENT") {
|
|
72
|
+
throw new SafeWriteConflictError("source_changed", `documentが初回read後に削除されました: ${path}`);
|
|
73
|
+
}
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function validateCandidate(candidateText) {
|
|
78
|
+
const checked = checkDocument(candidateText);
|
|
79
|
+
if (!checked.ok) {
|
|
80
|
+
throw new SafeWriteVerificationError("invalid_candidate", "safe-write candidateがdocument検査に失敗しました", checked.diagnostics);
|
|
81
|
+
}
|
|
82
|
+
return Buffer.from(candidateText, "utf8");
|
|
83
|
+
}
|
|
84
|
+
async function exclusiveTemporary(target, mode) {
|
|
85
|
+
const directory = dirname(target);
|
|
86
|
+
const stem = basename(target);
|
|
87
|
+
for (let attempt = 0; attempt < 16; attempt += 1) {
|
|
88
|
+
const token = randomBytes(12).toString("hex");
|
|
89
|
+
const temporaryPath = join(directory, `.${stem}.perttool-${process.pid}-${token}.tmp`);
|
|
90
|
+
try {
|
|
91
|
+
const handle = await open(temporaryPath, constants.O_WRONLY |
|
|
92
|
+
constants.O_CREAT |
|
|
93
|
+
constants.O_EXCL |
|
|
94
|
+
constants.O_NOFOLLOW, mode);
|
|
95
|
+
return { path: temporaryPath, handle };
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (errorCode(error) !== "EEXIST")
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
throw new Error(`exclusive temporary fileを作成できませんでした: ${target}`);
|
|
103
|
+
}
|
|
104
|
+
async function writeAndSyncTemporary(target, bytes, mode) {
|
|
105
|
+
const temporary = await exclusiveTemporary(target, mode);
|
|
106
|
+
try {
|
|
107
|
+
await temporary.handle.writeFile(bytes);
|
|
108
|
+
await temporary.handle.chmod(mode);
|
|
109
|
+
await temporary.handle.sync();
|
|
110
|
+
await temporary.handle.close();
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
await temporary.handle.close().catch(() => undefined);
|
|
114
|
+
await unlink(temporary.path).catch(() => undefined);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
return temporary.path;
|
|
118
|
+
}
|
|
119
|
+
async function syncParentDirectory(target) {
|
|
120
|
+
let handle;
|
|
121
|
+
try {
|
|
122
|
+
handle = await open(dirname(target), constants.O_RDONLY);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (["EACCES", "EISDIR", "ENOTSUP"].includes(errorCode(error) ?? ""))
|
|
126
|
+
return;
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
await handle.sync();
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (!["EINVAL", "ENOTSUP", "EOPNOTSUPP"].includes(errorCode(error) ?? "")) {
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
await handle.close();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function verifyWrittenDocument(target, candidateDigest) {
|
|
142
|
+
const written = await readDocumentFile(target);
|
|
143
|
+
if (written.digest !== candidateDigest) {
|
|
144
|
+
throw new SafeWriteVerificationError("post_write_digest_mismatch", `written document digestがcandidateと一致しません: ${target}`);
|
|
145
|
+
}
|
|
146
|
+
const checked = checkDocument(written.text);
|
|
147
|
+
if (!checked.ok) {
|
|
148
|
+
throw new SafeWriteVerificationError("post_write_invalid", `written documentが再検査に失敗しました: ${target}`, checked.diagnostics);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async function verifyWrittenArtifact(target, candidateDigest) {
|
|
152
|
+
const written = await readDocumentFile(target);
|
|
153
|
+
if (written.digest !== candidateDigest) {
|
|
154
|
+
throw new SafeWriteVerificationError("post_write_digest_mismatch", `written artifact digestがcandidateと一致しません: ${target}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export async function replaceDocumentFile(target, candidateText, options) {
|
|
158
|
+
const candidateBytes = validateCandidate(candidateText);
|
|
159
|
+
const candidateDigest = digestDocumentBytes(candidateBytes);
|
|
160
|
+
if (options.expectedDigest !== undefined &&
|
|
161
|
+
options.expectedDigest !== options.initialDigest) {
|
|
162
|
+
throw new SafeWriteConflictError("expected_digest_mismatch", "--expect-digestがinitial document digestと一致しません");
|
|
163
|
+
}
|
|
164
|
+
const beforeWrite = await currentWritableSource(target);
|
|
165
|
+
if (beforeWrite.digest !== options.initialDigest) {
|
|
166
|
+
throw new SafeWriteConflictError("source_changed", `documentが初回read後に変更されました: ${target}`);
|
|
167
|
+
}
|
|
168
|
+
if (candidateDigest === options.initialDigest) {
|
|
169
|
+
return {
|
|
170
|
+
mode: "in_place",
|
|
171
|
+
target,
|
|
172
|
+
digest: candidateDigest,
|
|
173
|
+
bytesWritten: 0,
|
|
174
|
+
written: false,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
const temporaryPath = await writeAndSyncTemporary(target, candidateBytes, beforeWrite.mode);
|
|
178
|
+
let renamed = false;
|
|
179
|
+
try {
|
|
180
|
+
const beforeRename = await currentWritableSource(target);
|
|
181
|
+
if (beforeRename.digest !== options.initialDigest) {
|
|
182
|
+
throw new SafeWriteConflictError("source_changed", `documentがcommit直前に変更されました: ${target}`);
|
|
183
|
+
}
|
|
184
|
+
await rename(temporaryPath, target);
|
|
185
|
+
renamed = true;
|
|
186
|
+
await syncParentDirectory(target);
|
|
187
|
+
await verifyWrittenDocument(target, candidateDigest);
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
if (!renamed)
|
|
191
|
+
await unlink(temporaryPath).catch(() => undefined);
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
mode: "in_place",
|
|
195
|
+
target,
|
|
196
|
+
digest: candidateDigest,
|
|
197
|
+
bytesWritten: candidateBytes.byteLength,
|
|
198
|
+
written: true,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
async function assertTargetAbsent(target) {
|
|
202
|
+
try {
|
|
203
|
+
const targetStat = await lstat(target);
|
|
204
|
+
throw new SafeWriteConflictError(targetStat.isSymbolicLink() ? "symlink" : "target_exists", `--out targetは既に存在します: ${target}`);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
if (errorCode(error) === "ENOENT")
|
|
208
|
+
return;
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
export async function createDocumentFile(target, candidateText, options = {}) {
|
|
213
|
+
const candidateBytes = validateCandidate(candidateText);
|
|
214
|
+
const candidateDigest = digestDocumentBytes(candidateBytes);
|
|
215
|
+
await assertTargetAbsent(target);
|
|
216
|
+
const temporaryPath = await writeAndSyncTemporary(target, candidateBytes, options.mode ?? (0o666 & ~process.umask()));
|
|
217
|
+
let linked = false;
|
|
218
|
+
try {
|
|
219
|
+
await assertTargetAbsent(target);
|
|
220
|
+
try {
|
|
221
|
+
await link(temporaryPath, target);
|
|
222
|
+
linked = true;
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
if (errorCode(error) === "EEXIST") {
|
|
226
|
+
throw new SafeWriteConflictError("target_exists", `--out targetがcommit前に作成されました: ${target}`);
|
|
227
|
+
}
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
await syncParentDirectory(target);
|
|
231
|
+
await verifyWrittenDocument(target, candidateDigest);
|
|
232
|
+
}
|
|
233
|
+
finally {
|
|
234
|
+
await unlink(temporaryPath).catch(() => undefined);
|
|
235
|
+
if (linked)
|
|
236
|
+
await syncParentDirectory(target);
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
mode: "out",
|
|
240
|
+
target,
|
|
241
|
+
digest: candidateDigest,
|
|
242
|
+
bytesWritten: candidateBytes.byteLength,
|
|
243
|
+
written: true,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
export async function createArtifactFile(target, artifact, options = {}) {
|
|
247
|
+
const candidateBytes = Buffer.from(artifact, "utf8");
|
|
248
|
+
const candidateDigest = digestDocumentBytes(candidateBytes);
|
|
249
|
+
await assertTargetAbsent(target);
|
|
250
|
+
const temporaryPath = await writeAndSyncTemporary(target, candidateBytes, options.mode ?? (0o666 & ~process.umask()));
|
|
251
|
+
let linked = false;
|
|
252
|
+
try {
|
|
253
|
+
await assertTargetAbsent(target);
|
|
254
|
+
try {
|
|
255
|
+
await link(temporaryPath, target);
|
|
256
|
+
linked = true;
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
if (errorCode(error) === "EEXIST") {
|
|
260
|
+
throw new SafeWriteConflictError("target_exists", `--out targetがcommit前に作成されました: ${target}`);
|
|
261
|
+
}
|
|
262
|
+
throw error;
|
|
263
|
+
}
|
|
264
|
+
await syncParentDirectory(target);
|
|
265
|
+
await verifyWrittenArtifact(target, candidateDigest);
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
await unlink(temporaryPath).catch(() => undefined);
|
|
269
|
+
if (linked)
|
|
270
|
+
await syncParentDirectory(target);
|
|
271
|
+
}
|
|
272
|
+
return {
|
|
273
|
+
mode: "out",
|
|
274
|
+
target,
|
|
275
|
+
digest: candidateDigest,
|
|
276
|
+
bytesWritten: candidateBytes.byteLength,
|
|
277
|
+
written: true,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=safe-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-write.js","sourceRoot":"","sources":["../../src/io/safe-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export type DiagnosticSeverity = "error" | "warning" | "info";
|
|
2
|
+
export declare const DEFAULT_MAX_DIAGNOSTICS = 100;
|
|
3
|
+
export declare const MAX_DIAGNOSTICS_LIMIT = 1000;
|
|
4
|
+
export interface SourcePosition {
|
|
5
|
+
readonly offset: number;
|
|
6
|
+
readonly line: number;
|
|
7
|
+
readonly column: number;
|
|
8
|
+
}
|
|
9
|
+
export interface SourceSpan {
|
|
10
|
+
readonly start: SourcePosition;
|
|
11
|
+
readonly end: SourcePosition;
|
|
12
|
+
}
|
|
13
|
+
export interface RelatedLocation {
|
|
14
|
+
readonly message: string;
|
|
15
|
+
readonly span: SourceSpan;
|
|
16
|
+
}
|
|
17
|
+
export interface Diagnostic {
|
|
18
|
+
readonly code: string;
|
|
19
|
+
readonly severity: DiagnosticSeverity;
|
|
20
|
+
readonly message: string;
|
|
21
|
+
readonly entityId?: string;
|
|
22
|
+
readonly span?: SourceSpan;
|
|
23
|
+
readonly related?: readonly RelatedLocation[];
|
|
24
|
+
readonly helpTopic?: string;
|
|
25
|
+
readonly expectedSyntax?: string;
|
|
26
|
+
readonly data?: Readonly<Record<string, unknown>>;
|
|
27
|
+
}
|
|
28
|
+
export interface LimitedDiagnostics {
|
|
29
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
30
|
+
readonly truncated: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface DiagnosticCounts {
|
|
33
|
+
readonly errors: number;
|
|
34
|
+
readonly warnings: number;
|
|
35
|
+
readonly info: number;
|
|
36
|
+
}
|
|
37
|
+
export declare function countDiagnostics(diagnostics: readonly Diagnostic[]): DiagnosticCounts;
|
|
38
|
+
export declare function normalizeMaxDiagnostics(value: number | undefined): number;
|
|
39
|
+
export declare function limitDiagnostics(diagnostics: readonly Diagnostic[], maximum: number): LimitedDiagnostics;
|
|
40
|
+
export declare function sortDiagnostics(diagnostics: readonly Diagnostic[]): readonly Diagnostic[];
|
|
41
|
+
export declare function compareStableStrings(left: string, right: string): number;
|
|
42
|
+
export declare function hasErrors(diagnostics: readonly Diagnostic[]): boolean;
|
|
43
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/model/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAE9D,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,SAAS,UAAU,EAAE,GACjC,gBAAgB,CAMlB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAYzE;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,SAAS,UAAU,EAAE,EAClC,OAAO,EAAE,MAAM,GACd,kBAAkB,CAMpB;AAQD,wBAAgB,eAAe,CAC7B,WAAW,EAAE,SAAS,UAAU,EAAE,GACjC,SAAS,UAAU,EAAE,CAWvB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,CAErE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export const DEFAULT_MAX_DIAGNOSTICS = 100;
|
|
2
|
+
export const MAX_DIAGNOSTICS_LIMIT = 1000;
|
|
3
|
+
export function countDiagnostics(diagnostics) {
|
|
4
|
+
return {
|
|
5
|
+
errors: diagnostics.filter(({ severity }) => severity === "error").length,
|
|
6
|
+
warnings: diagnostics.filter(({ severity }) => severity === "warning").length,
|
|
7
|
+
info: diagnostics.filter(({ severity }) => severity === "info").length,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function normalizeMaxDiagnostics(value) {
|
|
11
|
+
const normalized = value ?? DEFAULT_MAX_DIAGNOSTICS;
|
|
12
|
+
if (!Number.isSafeInteger(normalized) ||
|
|
13
|
+
normalized < 1 ||
|
|
14
|
+
normalized > MAX_DIAGNOSTICS_LIMIT) {
|
|
15
|
+
throw new RangeError(`maxDiagnostics must be an integer from 1 to ${MAX_DIAGNOSTICS_LIMIT}`);
|
|
16
|
+
}
|
|
17
|
+
return normalized;
|
|
18
|
+
}
|
|
19
|
+
export function limitDiagnostics(diagnostics, maximum) {
|
|
20
|
+
const normalized = normalizeMaxDiagnostics(maximum);
|
|
21
|
+
return {
|
|
22
|
+
diagnostics: diagnostics.slice(0, normalized),
|
|
23
|
+
truncated: diagnostics.length > normalized,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const severityRank = {
|
|
27
|
+
error: 0,
|
|
28
|
+
warning: 1,
|
|
29
|
+
info: 2,
|
|
30
|
+
};
|
|
31
|
+
export function sortDiagnostics(diagnostics) {
|
|
32
|
+
return [...diagnostics].sort((left, right) => {
|
|
33
|
+
const leftOffset = left.span?.start.offset ?? Number.MAX_SAFE_INTEGER;
|
|
34
|
+
const rightOffset = right.span?.start.offset ?? Number.MAX_SAFE_INTEGER;
|
|
35
|
+
return (leftOffset - rightOffset ||
|
|
36
|
+
severityRank[left.severity] - severityRank[right.severity] ||
|
|
37
|
+
compareStableStrings(left.code, right.code) ||
|
|
38
|
+
compareStableStrings(left.entityId ?? "", right.entityId ?? ""));
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export function compareStableStrings(left, right) {
|
|
42
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
43
|
+
}
|
|
44
|
+
export function hasErrors(diagnostics) {
|
|
45
|
+
return diagnostics.some((diagnostic) => diagnostic.severity === "error");
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/model/diagnostics.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAC3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAyC1C,MAAM,UAAU,gBAAgB,CAC9B,WAAkC;IAElC,OAAO;QACL,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM;QACzE,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM;QAC7E,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;KACvE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAyB;IAC/D,MAAM,UAAU,GAAG,KAAK,IAAI,uBAAuB,CAAC;IACpD,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC;QACjC,UAAU,GAAG,CAAC;QACd,UAAU,GAAG,qBAAqB,EAClC,CAAC;QACD,MAAM,IAAI,UAAU,CAClB,+CAA+C,qBAAqB,EAAE,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,WAAkC,EAClC,OAAe;IAEf,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO;QACL,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;QAC7C,SAAS,EAAE,WAAW,CAAC,MAAM,GAAG,UAAU;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAAiD;IACjE,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,WAAkC;IAElC,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,gBAAgB,CAAC;QACtE,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,gBAAgB,CAAC;QACxE,OAAO,CACL,UAAU,GAAG,WAAW;YACxB,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC1D,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;YAC3C,oBAAoB,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAChE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,KAAa;IAC9D,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,WAAkC;IAC1D,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { DurationValue } from "./syntax.js";
|
|
2
|
+
export interface Rational {
|
|
3
|
+
readonly numerator: bigint;
|
|
4
|
+
readonly denominator: bigint;
|
|
5
|
+
}
|
|
6
|
+
export declare function rational(numerator: bigint, denominator?: bigint): Rational;
|
|
7
|
+
export declare const ZERO: Rational;
|
|
8
|
+
export declare const ONE: Rational;
|
|
9
|
+
export declare function rationalFromDuration(value: DurationValue): Rational;
|
|
10
|
+
export declare function add(left: Rational, right: Rational): Rational;
|
|
11
|
+
export declare function subtract(left: Rational, right: Rational): Rational;
|
|
12
|
+
export declare function multiply(left: Rational, right: Rational): Rational;
|
|
13
|
+
export declare function divide(left: Rational, right: Rational): Rational;
|
|
14
|
+
export declare function square(value: Rational): Rational;
|
|
15
|
+
export declare function absolute(value: Rational): Rational;
|
|
16
|
+
export declare function compare(left: Rational, right: Rational): number;
|
|
17
|
+
export declare function minimum(left: Rational, right: Rational): Rational;
|
|
18
|
+
export declare function maximum(left: Rational, right: Rational): Rational;
|
|
19
|
+
export declare function isZero(value: Rational): boolean;
|
|
20
|
+
export declare function formatDecimal(value: Rational, precision: number): string;
|
|
21
|
+
//# sourceMappingURL=rational.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rational.d.ts","sourceRoot":"","sources":["../../src/model/rational.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAaD,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,QAAQ,CAStE;AAED,eAAO,MAAM,IAAI,UAAe,CAAC;AACjC,eAAO,MAAM,GAAG,UAAe,CAAC;AAEhC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,QAAQ,CAEnE;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAK7D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAKlE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAKlE;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAMhE;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAEhD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAIlD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,CAI/D;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAEjE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAEjE;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAE/C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAiBxE"}
|