@mannyc1/ts-release 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/ARCHITECTURE.md +60 -0
  2. package/CHANGELOG.md +82 -0
  3. package/README.md +129 -6
  4. package/SPEC.md +51 -0
  5. package/apps/release-ts/README.md +7 -0
  6. package/apps/ts-release-agents/package.json +1 -1
  7. package/apps/ts-release-agents/src/check.ts +7 -2
  8. package/apps/ts-release-agents/test/contract.test.ts +2 -2
  9. package/dist/bin/ts-release.js +154 -47
  10. package/dist/drivers/archive.d.ts +2 -1
  11. package/dist/drivers/archive.d.ts.map +1 -1
  12. package/dist/drivers/archive.js +12 -8
  13. package/dist/drivers/archive.js.map +1 -1
  14. package/dist/drivers/process.d.ts.map +1 -1
  15. package/dist/drivers/process.js +4 -4
  16. package/dist/drivers/process.js.map +1 -1
  17. package/dist/drivers/python-wheel.d.ts +21 -0
  18. package/dist/drivers/python-wheel.d.ts.map +1 -0
  19. package/dist/drivers/python-wheel.js +109 -0
  20. package/dist/drivers/python-wheel.js.map +1 -0
  21. package/dist/drivers/workspace.d.ts +3 -0
  22. package/dist/drivers/workspace.d.ts.map +1 -1
  23. package/dist/drivers/workspace.js +5 -1
  24. package/dist/drivers/workspace.js.map +1 -1
  25. package/dist/operation-journal/authority.d.ts +3 -0
  26. package/dist/operation-journal/authority.d.ts.map +1 -0
  27. package/dist/operation-journal/authority.js +147 -0
  28. package/dist/operation-journal/authority.js.map +1 -0
  29. package/dist/operation-journal/aws/deadline.d.ts +12 -0
  30. package/dist/operation-journal/aws/deadline.d.ts.map +1 -0
  31. package/dist/operation-journal/aws/deadline.js +38 -0
  32. package/dist/operation-journal/aws/deadline.js.map +1 -0
  33. package/dist/operation-journal/aws/oidc.d.ts +27 -0
  34. package/dist/operation-journal/aws/oidc.d.ts.map +1 -0
  35. package/dist/operation-journal/aws/oidc.js +361 -0
  36. package/dist/operation-journal/aws/oidc.js.map +1 -0
  37. package/dist/operation-journal/aws/policy.d.ts +42 -0
  38. package/dist/operation-journal/aws/policy.d.ts.map +1 -0
  39. package/dist/operation-journal/aws/policy.js +404 -0
  40. package/dist/operation-journal/aws/policy.js.map +1 -0
  41. package/dist/operation-journal/aws/s3-boundary.d.ts +17 -0
  42. package/dist/operation-journal/aws/s3-boundary.d.ts.map +1 -0
  43. package/dist/operation-journal/aws/s3-boundary.js +417 -0
  44. package/dist/operation-journal/aws/s3-boundary.js.map +1 -0
  45. package/dist/operation-journal/aws.d.ts +11 -0
  46. package/dist/operation-journal/aws.d.ts.map +1 -0
  47. package/dist/operation-journal/aws.js +50 -0
  48. package/dist/operation-journal/aws.js.map +1 -0
  49. package/dist/operation-journal/canonical.d.ts +52 -0
  50. package/dist/operation-journal/canonical.d.ts.map +1 -0
  51. package/dist/operation-journal/canonical.js +282 -0
  52. package/dist/operation-journal/canonical.js.map +1 -0
  53. package/dist/operation-journal/model.d.ts +251 -0
  54. package/dist/operation-journal/model.d.ts.map +1 -0
  55. package/dist/operation-journal/model.js +56 -0
  56. package/dist/operation-journal/model.js.map +1 -0
  57. package/dist/operation-journal/reducer.d.ts +28 -0
  58. package/dist/operation-journal/reducer.d.ts.map +1 -0
  59. package/dist/operation-journal/reducer.js +73 -0
  60. package/dist/operation-journal/reducer.js.map +1 -0
  61. package/dist/operation-journal/s3.d.ts +7 -0
  62. package/dist/operation-journal/s3.d.ts.map +1 -0
  63. package/dist/operation-journal/s3.js +667 -0
  64. package/dist/operation-journal/s3.js.map +1 -0
  65. package/dist/operation-journal.d.ts +14 -0
  66. package/dist/operation-journal.d.ts.map +1 -0
  67. package/dist/operation-journal.js +12 -0
  68. package/dist/operation-journal.js.map +1 -0
  69. package/dist/platform/credentials.d.ts.map +1 -1
  70. package/dist/platform/credentials.js +65 -3
  71. package/dist/platform/credentials.js.map +1 -1
  72. package/dist/publication/github.d.ts.map +1 -1
  73. package/dist/publication/github.js +66 -15
  74. package/dist/publication/github.js.map +1 -1
  75. package/dist/release/capabilities.d.ts.map +1 -1
  76. package/dist/release/capabilities.js +2 -2
  77. package/dist/release/capabilities.js.map +1 -1
  78. package/dist/release/prepare.d.ts.map +1 -1
  79. package/dist/release/prepare.js +4 -5
  80. package/dist/release/prepare.js.map +1 -1
  81. package/dist/release/prepared-store.d.ts.map +1 -1
  82. package/dist/release/prepared-store.js +11 -9
  83. package/dist/release/prepared-store.js.map +1 -1
  84. package/package.json +19 -4
  85. package/src/drivers/archive.ts +17 -8
  86. package/src/drivers/process.ts +3 -4
  87. package/src/drivers/python-wheel.ts +145 -0
  88. package/src/drivers/workspace.ts +7 -1
  89. package/src/operation-journal/authority.ts +162 -0
  90. package/src/operation-journal/aws/deadline.ts +41 -0
  91. package/src/operation-journal/aws/oidc.ts +439 -0
  92. package/src/operation-journal/aws/policy.ts +491 -0
  93. package/src/operation-journal/aws/s3-boundary.ts +562 -0
  94. package/src/operation-journal/aws.ts +60 -0
  95. package/src/operation-journal/canonical.ts +373 -0
  96. package/src/operation-journal/model.ts +301 -0
  97. package/src/operation-journal/reducer.ts +112 -0
  98. package/src/operation-journal/s3.ts +884 -0
  99. package/src/operation-journal.ts +51 -0
  100. package/src/platform/credentials.ts +71 -3
  101. package/src/publication/github.ts +83 -15
  102. package/src/release/capabilities.ts +3 -2
  103. package/src/release/prepare.ts +3 -5
  104. package/src/release/prepared-store.ts +8 -7
  105. package/templates/README.md +2 -2
  106. package/templates/github-actions/release.yml +24 -7
  107. package/templates/github-actions/reviewed-release.yml +49 -14
@@ -0,0 +1,112 @@
1
+ import {
2
+ JournalIntegrityError,
3
+ JournalTransitionError,
4
+ type JournalRecordTag,
5
+ type JournalStateTag
6
+ } from "./model.js"
7
+ import type {
8
+ CanonicalJournalEvent,
9
+ CanonicalJournalHead,
10
+ CanonicalJournalRecord
11
+ } from "./canonical.js"
12
+
13
+ const admittedTransitions: Readonly<Record<JournalStateTag, ReadonlySet<JournalRecordTag>>> = {
14
+ Empty: new Set(["IntentRecorded"]),
15
+ IntentRecorded: new Set(["ReceiptRecorded", "OutcomeUnknown"]),
16
+ ReceiptRecorded: new Set(["ObservationRecorded", "TerminalRecorded"]),
17
+ ObservationRecorded: new Set(["ObservationRecorded", "TerminalRecorded"]),
18
+ TerminalRecorded: new Set(),
19
+ OutcomeUnknown: new Set()
20
+ }
21
+
22
+ export const admitJournalTransition = (
23
+ state: JournalStateTag,
24
+ next: JournalRecordTag
25
+ ): JournalRecordTag => {
26
+ if (!admittedTransitions[state].has(next)) {
27
+ throw JournalTransitionError.make({
28
+ reason: `Journal transition ${state} -> ${next} is not admitted.`
29
+ })
30
+ }
31
+ return next
32
+ }
33
+
34
+ export const reduceJournalEvents = (
35
+ events: ReadonlyArray<CanonicalJournalEvent>
36
+ ): JournalStateTag => {
37
+ let state: JournalStateTag = "Empty"
38
+ let expectedSequence = 1
39
+ const transactions = new Set<string>()
40
+ for (const event of events) {
41
+ if (event.sequence !== expectedSequence) {
42
+ throw JournalIntegrityError.make({ reason: "Reachable journal sequences are not contiguous from one." })
43
+ }
44
+ if (transactions.has(event.transactionId)) {
45
+ throw JournalIntegrityError.make({ reason: "Reachable journal chain repeats a transaction ID." })
46
+ }
47
+ transactions.add(event.transactionId)
48
+ try {
49
+ admitJournalTransition(state, event.record.tag)
50
+ } catch (cause) {
51
+ if (cause instanceof JournalTransitionError) {
52
+ throw JournalIntegrityError.make({ reason: cause.reason })
53
+ }
54
+ throw cause
55
+ }
56
+ state = event.record.tag
57
+ expectedSequence += 1
58
+ }
59
+ return state
60
+ }
61
+
62
+ export const makeJournalEvent = (input: {
63
+ readonly releasePoint: string
64
+ readonly operationKey: string
65
+ readonly sequence: number
66
+ readonly transactionId: string
67
+ readonly previous: CanonicalJournalEvent | null
68
+ readonly previousHead: {
69
+ readonly versionId: string
70
+ readonly etag: string
71
+ readonly eventDigest: string
72
+ } | null
73
+ readonly workflow: CanonicalJournalEvent["workflow"]
74
+ readonly record: CanonicalJournalRecord
75
+ }): CanonicalJournalEvent => ({
76
+ schemaVersion: "ts-release-operation-journal-event/v1",
77
+ releasePoint: input.releasePoint,
78
+ operationKey: input.operationKey,
79
+ sequence: input.sequence,
80
+ transactionId: input.transactionId,
81
+ previous: input.previous === null || input.previousHead === null
82
+ ? null
83
+ : {
84
+ eventDigest: input.previousHead.eventDigest,
85
+ headVersionId: input.previousHead.versionId,
86
+ headEtag: input.previousHead.etag
87
+ },
88
+ workflow: input.workflow,
89
+ record: input.record
90
+ })
91
+
92
+ export const makeJournalHead = (input: {
93
+ readonly event: CanonicalJournalEvent
94
+ readonly eventKey: string
95
+ readonly eventVersionId: string
96
+ readonly eventChecksumSha256: string
97
+ readonly eventDigest: string
98
+ readonly previousHeadVersionId: string | null
99
+ readonly previousHeadEtag: string | null
100
+ }): CanonicalJournalHead => ({
101
+ schemaVersion: "ts-release-operation-journal-head/v1",
102
+ releasePoint: input.event.releasePoint,
103
+ operationKey: input.event.operationKey,
104
+ sequence: input.event.sequence,
105
+ transactionId: input.event.transactionId,
106
+ eventKey: input.eventKey,
107
+ eventVersionId: input.eventVersionId,
108
+ eventChecksumSha256: input.eventChecksumSha256,
109
+ eventDigest: input.eventDigest,
110
+ previousHeadVersionId: input.previousHeadVersionId,
111
+ previousHeadEtag: input.previousHeadEtag
112
+ })