@toolproof-core/lib 1.0.3 → 1.0.5

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 (85) hide show
  1. package/dist/artifacts/artifacts.d.ts +4 -3
  2. package/dist/artifacts/artifacts.d.ts.map +1 -1
  3. package/dist/firebase/firebaseAdminHelpers.d.ts +2 -2
  4. package/dist/firebase/firebaseAdminHelpers.d.ts.map +1 -1
  5. package/dist/firebase/firebaseAdminHelpers.js.map +1 -1
  6. package/dist/shared.d.ts +33 -0
  7. package/dist/shared.d.ts.map +1 -0
  8. package/dist/shared.js +67 -0
  9. package/dist/shared.js.map +1 -0
  10. package/dist/types/types.d.ts +2 -5
  11. package/dist/types/types.d.ts.map +1 -1
  12. package/dist/types/types.js.map +1 -1
  13. package/dist/utils/extractFrom.d.ts +5 -0
  14. package/dist/utils/extractFrom.d.ts.map +1 -0
  15. package/dist/utils/extractFrom.js +72 -0
  16. package/dist/utils/extractFrom.js.map +1 -0
  17. package/dist/utils/extractFromCosmosData.d.ts +9 -0
  18. package/dist/utils/extractFromCosmosData.d.ts.map +1 -0
  19. package/dist/utils/extractFromCosmosData.js +20 -0
  20. package/dist/utils/extractFromCosmosData.js.map +1 -0
  21. package/dist/utils/extractFromResourceDict.d.ts +12 -0
  22. package/dist/utils/extractFromResourceDict.d.ts.map +1 -0
  23. package/dist/utils/extractFromResourceDict.js +23 -0
  24. package/dist/utils/extractFromResourceDict.js.map +1 -0
  25. package/dist/utils/extractFromResourceMap.d.ts +12 -0
  26. package/dist/utils/extractFromResourceMap.d.ts.map +1 -0
  27. package/dist/utils/extractFromResourceMap.js +23 -0
  28. package/dist/utils/extractFromResourceMap.js.map +1 -0
  29. package/dist/utils/extractFromResourcesByResourceTypeHandle.d.ts +8 -0
  30. package/dist/utils/extractFromResourcesByResourceTypeHandle.d.ts.map +1 -0
  31. package/dist/utils/extractFromResourcesByResourceTypeHandle.js +31 -0
  32. package/dist/utils/extractFromResourcesByResourceTypeHandle.js.map +1 -0
  33. package/dist/utils/extractFromStrategy.d.ts +5 -0
  34. package/dist/utils/extractFromStrategy.d.ts.map +1 -0
  35. package/dist/utils/extractFromStrategy.js +72 -0
  36. package/dist/utils/extractFromStrategy.js.map +1 -0
  37. package/dist/utils/extraction.d.ts +12 -0
  38. package/dist/utils/extraction.d.ts.map +1 -0
  39. package/dist/utils/extraction.js +27 -0
  40. package/dist/utils/extraction.js.map +1 -0
  41. package/dist/utils/generateFrom.d.ts +4 -0
  42. package/dist/utils/generateFrom.d.ts.map +1 -0
  43. package/dist/utils/generateFrom.js +18 -0
  44. package/dist/utils/generateFrom.js.map +1 -0
  45. package/dist/utils/generateFromTo.d.ts +4 -0
  46. package/dist/utils/generateFromTo.d.ts.map +1 -0
  47. package/dist/utils/generateFromTo.js +18 -0
  48. package/dist/utils/generateFromTo.js.map +1 -0
  49. package/dist/utils/parallelization.d.ts +3 -0
  50. package/dist/utils/parallelization.d.ts.map +1 -0
  51. package/dist/utils/parallelization.js +136 -0
  52. package/dist/utils/parallelization.js.map +1 -0
  53. package/dist/utils/resourceChain.d.ts +22 -0
  54. package/dist/utils/resourceChain.d.ts.map +1 -0
  55. package/dist/utils/resourceChain.js +38 -0
  56. package/dist/utils/resourceChain.js.map +1 -0
  57. package/dist/utils/roleResourceBinding.d.ts +5 -0
  58. package/dist/utils/roleResourceBinding.d.ts.map +1 -0
  59. package/dist/utils/roleResourceBinding.js +74 -0
  60. package/dist/utils/roleResourceBinding.js.map +1 -0
  61. package/dist/utils/runnableStrategyCreation.d.ts +8 -0
  62. package/dist/utils/runnableStrategyCreation.d.ts.map +1 -0
  63. package/dist/utils/runnableStrategyCreation.js +24 -0
  64. package/dist/utils/runnableStrategyCreation.js.map +1 -0
  65. package/dist/utils/stepCreation.d.ts +10 -0
  66. package/dist/utils/stepCreation.d.ts.map +1 -0
  67. package/dist/utils/stepCreation.js +80 -0
  68. package/dist/utils/stepCreation.js.map +1 -0
  69. package/package.json +48 -41
  70. package/src/_lib/setup/firebaseAdminInit.ts +38 -38
  71. package/src/artifacts/artifacts.ts +40 -40
  72. package/src/firebase/firebaseAdminHelpers.ts +157 -157
  73. package/src/shared.ts +126 -0
  74. package/src/types/types.ts +20 -24
  75. package/src/utils/extractFrom.ts +93 -0
  76. package/src/utils/extractFromResourcesByResourceTypeHandle.ts +55 -0
  77. package/src/utils/{creation.ts → generateFrom.ts} +26 -26
  78. package/src/utils/parallelization.ts +177 -0
  79. package/src/utils/resourceChain.ts +66 -0
  80. package/src/utils/roleResourceBinding.ts +109 -0
  81. package/src/utils/runnableStrategyCreation.ts +47 -0
  82. package/src/utils/stepCreation.ts +112 -0
  83. package/tsconfig.json +14 -14
  84. package/tsconfig.tsbuildinfo +1 -1
  85. package/src/utils/resourceMapExtraction.ts +0 -47
@@ -0,0 +1,109 @@
1
+ import type {
2
+ ResourceJson,
3
+ ResourceMissingJson,
4
+ ResourceInputPotentialJson,
5
+ ResourceOutputPotentialJson,
6
+ CreationContextJson,
7
+ StrategyStateJson,
8
+ } from '@toolproof-core/schema';
9
+ import { resolveResourceChain } from './resourceChain.js';
10
+
11
+ export function bindInputResInStrategyState(
12
+ strategyState: StrategyStateJson,
13
+ target: CreationContextJson,
14
+ resource: ResourceJson
15
+ ): StrategyStateJson {
16
+ const bucket = strategyState[target.jobStepHandle] ?? {};
17
+ return {
18
+ ...strategyState,
19
+ [target.jobStepHandle]: {
20
+ ...bucket,
21
+ [target.resourceRoleHandle]: resource,
22
+ },
23
+ };
24
+ }
25
+
26
+ export function bindInputRefInStrategyState(
27
+ strategyState: StrategyStateJson,
28
+ target: CreationContextJson,
29
+ source: CreationContextJson
30
+ ): StrategyStateJson {
31
+ const sourceEntry = strategyState?.[source.jobStepHandle]?.[source.resourceRoleHandle] as (
32
+ | ResourceJson
33
+ | ResourceMissingJson
34
+ | ResourceInputPotentialJson
35
+ | ResourceOutputPotentialJson
36
+ | undefined
37
+ );
38
+ if (!sourceEntry) {
39
+ throw new Error(`resourceEntry not found for source (${source.jobStepHandle}, ${source.resourceRoleHandle})`);
40
+ }
41
+
42
+ const result = resolveResourceChain(strategyState, source);
43
+ const bucket = strategyState[target.jobStepHandle] ?? {};
44
+
45
+ if (result.status === 'materialized') {
46
+ return {
47
+ ...strategyState,
48
+ [target.jobStepHandle]: {
49
+ ...bucket,
50
+ [target.resourceRoleHandle]: result.entry,
51
+ },
52
+ };
53
+ }
54
+
55
+ if (result.status === 'missing') {
56
+ const missing = result.entry;
57
+ const reusedMissing: ResourceMissingJson = {
58
+ identity: missing.identity,
59
+ resourceTypeHandle: missing.resourceTypeHandle,
60
+ resourceShellKind: 'missing',
61
+ };
62
+
63
+ return {
64
+ ...strategyState,
65
+ [target.jobStepHandle]: {
66
+ ...bucket,
67
+ [target.resourceRoleHandle]: reusedMissing,
68
+ },
69
+ };
70
+ }
71
+
72
+ if (result.status === 'outputPotential') {
73
+ const potentialInput: ResourceInputPotentialJson = {
74
+ identity: sourceEntry.identity,
75
+ resourceTypeHandle: sourceEntry.resourceTypeHandle,
76
+ creationContext: {
77
+ jobStepHandle: source.jobStepHandle,
78
+ resourceRoleHandle: source.resourceRoleHandle,
79
+ },
80
+ resourceShellKind: 'inputPotential',
81
+ };
82
+
83
+ return {
84
+ ...strategyState,
85
+ [target.jobStepHandle]: {
86
+ ...bucket,
87
+ [target.resourceRoleHandle]: potentialInput,
88
+ },
89
+ };
90
+ }
91
+
92
+ throw new Error(`Failed to resolve resource chain: ${result.reason}`);
93
+ }
94
+
95
+ export function clearInputBindingInStrategyState(
96
+ strategyState: StrategyStateJson,
97
+ target: CreationContextJson
98
+ ): StrategyStateJson {
99
+ const bucket = strategyState?.[target.jobStepHandle];
100
+ if (!bucket?.[target.resourceRoleHandle]) return strategyState;
101
+
102
+ const nextBucket = { ...bucket } as Record<string, unknown>;
103
+ delete nextBucket[target.resourceRoleHandle];
104
+
105
+ return {
106
+ ...strategyState,
107
+ [target.jobStepHandle]: nextBucket as any,
108
+ };
109
+ }
@@ -0,0 +1,47 @@
1
+ import type {
2
+ RawStrategyJson,
3
+ RunnableStrategyIdentityJson,
4
+ RunnableStrategyJson,
5
+ RunnableStrategyStatusJson,
6
+ StepJson,
7
+ StrategyThreadIdentityJson,
8
+ } from '@toolproof-core/schema';
9
+ import type { IdentityName } from '../types/types.js';
10
+ import { getIndependentThreads } from './parallelization.js';
11
+
12
+
13
+ export type GetNewIdentity = (identityName: IdentityName) => string | Promise<string>;
14
+
15
+
16
+ export async function createRunnableStrategy(
17
+ rawStrategy: RawStrategyJson,
18
+ opts: {
19
+ getNewIdentity: GetNewIdentity;
20
+ status?: RunnableStrategyStatusJson;
21
+ }
22
+ ): Promise<RunnableStrategyJson> {
23
+ if (!opts?.getNewIdentity) {
24
+ throw new Error('createRunnableStrategy: opts.getNewIdentity is required');
25
+ }
26
+
27
+ const runnableStrategyIdentity = (await opts.getNewIdentity('RunnableStrategyIdentity')) as RunnableStrategyIdentityJson;
28
+ const steps = (rawStrategy.steps ?? []) as StepJson[];
29
+ const strategyState = (rawStrategy.strategyState ?? {}) as RunnableStrategyJson['strategyState'];
30
+
31
+ const threadStepGroups = getIndependentThreads(steps, strategyState);
32
+ const strategyThreadDict: Record<StrategyThreadIdentityJson, StepJson[]> = {} as any;
33
+
34
+ for (const group of threadStepGroups) {
35
+ const threadIdentity = (await opts.getNewIdentity('StrategyThreadIdentity')) as StrategyThreadIdentityJson;
36
+ strategyThreadDict[threadIdentity] = group;
37
+ }
38
+
39
+ return {
40
+ identity: runnableStrategyIdentity,
41
+ runnableStrategyContext: {
42
+ status: opts.status ?? 'running',
43
+ },
44
+ strategyThreadDict,
45
+ strategyState,
46
+ } as RunnableStrategyJson;
47
+ }
@@ -0,0 +1,112 @@
1
+ import type {
2
+ BranchStepJson,
3
+ ConditionalJson,
4
+ ForStepJson,
5
+ JobJson,
6
+ JobStepJson,
7
+ ResourceRoleIdentityJson,
8
+ WhileStepJson,
9
+ } from '@toolproof-core/schema';
10
+ import { getNewStepIdentity } from '../firebase/firebaseAdminHelpers.js';
11
+
12
+
13
+ function assertNonEmpty<T>(arr: T[], msg: string): asserts arr is [T, ...T[]] {
14
+ if (arr.length === 0) throw new Error(msg);
15
+ }
16
+
17
+
18
+ export async function createJobStepFromJob(job: JobJson): Promise<JobStepJson> {
19
+ const inputBindings = Object.keys(job.roles.inputDict ?? {}) as ResourceRoleIdentityJson[];
20
+ const outputBindings = Object.keys(job.roles.outputDict ?? {}) as ResourceRoleIdentityJson[];
21
+
22
+ return {
23
+ identity: getNewStepIdentity('job'),
24
+ stepKind: 'job',
25
+ jobHandle: job.identity,
26
+ roleBindings: {
27
+ inputBindings,
28
+ outputBindings,
29
+ },
30
+ };
31
+ }
32
+
33
+
34
+ export async function createLoopStepFromJobs(
35
+ whatJob: JobJson,
36
+ whenJob: JobJson,
37
+ stepKind: 'for' | 'while'
38
+ ): Promise<ForStepJson | WhileStepJson> {
39
+ const what = await createJobStepFromJob(whatJob);
40
+ const when = await createJobStepFromJob(whenJob);
41
+
42
+ if (stepKind === 'for') {
43
+ return {
44
+ identity: getNewStepIdentity('for'),
45
+ stepKind: 'for',
46
+ case: { what, when },
47
+ };
48
+ }
49
+
50
+ return {
51
+ identity: getNewStepIdentity('while'),
52
+ stepKind: 'while',
53
+ case: { what, when },
54
+ };
55
+ }
56
+
57
+
58
+ export async function createBranchStepFromJobPairs(
59
+ cases: Array<{ whatJob: JobJson; whenJob: JobJson }>
60
+ ): Promise<BranchStepJson> {
61
+ const resolved = await Promise.all(
62
+ cases.map(async ({ whatJob, whenJob }) => {
63
+ const what = await createJobStepFromJob(whatJob);
64
+ const when = await createJobStepFromJob(whenJob);
65
+ return { what, when } satisfies ConditionalJson;
66
+ })
67
+ );
68
+
69
+ assertNonEmpty(resolved, 'createBranchStepFromJobPairs requires at least one case');
70
+
71
+ return {
72
+ identity: getNewStepIdentity('branch'),
73
+ stepKind: 'branch',
74
+ cases: resolved,
75
+ };
76
+ }
77
+
78
+
79
+ export function cloneForStep(forStep: ForStepJson): ForStepJson {
80
+ return {
81
+ identity: getNewStepIdentity('for'),
82
+ stepKind: 'for',
83
+ case: {
84
+ what: {
85
+ ...forStep.case.what,
86
+ identity: getNewStepIdentity('job'),
87
+ },
88
+ when: {
89
+ ...forStep.case.when,
90
+ identity: getNewStepIdentity('job'),
91
+ },
92
+ },
93
+ };
94
+ }
95
+
96
+
97
+ export function cloneWhileStep(whileStep: WhileStepJson): WhileStepJson {
98
+ return {
99
+ identity: getNewStepIdentity('while'),
100
+ stepKind: 'while',
101
+ case: {
102
+ what: {
103
+ ...whileStep.case.what,
104
+ identity: getNewStepIdentity('job'),
105
+ },
106
+ when: {
107
+ ...whileStep.case.when,
108
+ identity: getNewStepIdentity('job'),
109
+ },
110
+ },
111
+ };
112
+ }
package/tsconfig.json CHANGED
@@ -1,15 +1,15 @@
1
- {
2
- "extends": "../../tsconfig.base.json",
3
- "compilerOptions": {
4
- "rootDir": "./src",
5
- "outDir": "./dist",
6
- "types": ["node"]
7
- },
8
- "include": [
9
- "src"
10
- ],
11
- "exclude": [
12
- "dist",
13
- "node_modules"
14
- ]
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "rootDir": "./src",
5
+ "outDir": "./dist",
6
+ "types": ["node"]
7
+ },
8
+ "include": [
9
+ "src"
10
+ ],
11
+ "exclude": [
12
+ "dist",
13
+ "node_modules"
14
+ ]
15
15
  }
@@ -1 +1 @@
1
- {"root":["./src/_lib/setup/firebaseAdminInit.ts","./src/artifacts/artifacts.ts","./src/firebase/firebaseAdminHelpers.ts","./src/types/types.ts","./src/utils/creation.ts","./src/utils/resourceMapExtraction.ts"],"version":"5.9.3"}
1
+ {"root":["./src/shared.ts","./src/_lib/setup/firebaseadmininit.ts","./src/artifacts/artifacts.ts","./src/firebase/firebaseadminhelpers.ts","./src/types/types.ts","./src/utils/extractfrom.ts","./src/utils/extractfromresourcesbyresourcetypehandle.ts","./src/utils/generatefrom.ts","./src/utils/parallelization.ts","./src/utils/resourcechain.ts","./src/utils/roleresourcebinding.ts","./src/utils/runnablestrategycreation.ts","./src/utils/stepcreation.ts"],"version":"5.9.3"}
@@ -1,47 +0,0 @@
1
- import type {
2
- ResourceIdentityJson,
3
- ResourceTypeIdentityJson,
4
- ResourceJson,
5
- } from '@toolproof-core/schema';
6
- import type { ResourceMap } from '../types/types.js';
7
-
8
-
9
- export function extractResourcesByType<TResource extends ResourceJson = ResourceJson>(
10
- resourceMap: ResourceMap,
11
- resourceTypeHandle: ResourceTypeIdentityJson
12
- ): Record<ResourceIdentityJson, TResource> {
13
- const resources = (resourceMap[resourceTypeHandle] ?? []) as TResource[];
14
- const result: Record<ResourceIdentityJson, TResource> = {} as Record<ResourceIdentityJson, TResource>;
15
-
16
- for (const resource of resources) {
17
- result[resource.identity] = resource;
18
- }
19
-
20
- return result;
21
- }
22
-
23
- /**
24
-
25
- */
26
- export function extractNucleusMap<
27
- TKey extends string = string,
28
- TNucleus extends { identity: string | number | boolean } = { identity: string | number | boolean },
29
- TResource extends ResourceJson = ResourceJson
30
- >(
31
- resourceMap: ResourceMap,
32
- resourceTypeHandle: ResourceTypeIdentityJson,
33
- ): Map<TKey, TNucleus> {
34
- const resources = extractResourcesByType<TResource>(resourceMap, resourceTypeHandle);
35
- const out = new Map<TKey, TNucleus>();
36
-
37
- for (const resource of Object.values(resources)) {
38
- const data = (resource as any).nucleus as unknown;
39
-
40
- const value = data as TNucleus;
41
- const key = String(value.identity) as TKey;
42
-
43
- out.set(key, value);
44
- }
45
-
46
- return out;
47
- }