Skip to content

Commit b07554f

Browse files
committed
feat: commit it
1 parent a3dc185 commit b07554f

File tree

10 files changed

+204
-30
lines changed

10 files changed

+204
-30
lines changed

.grit/workflows/stainless-gritql-generator/config/.terraform.lock.hcl

-25
This file was deleted.

.grit/workflows/stainless/workflow.js

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
"use strict";
2+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4+
return new (P || (P = Promise))(function (resolve, reject) {
5+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8+
step((generator = generator.apply(thisArg, _arguments || [])).next());
9+
});
10+
};
11+
var __generator = (this && this.__generator) || function (thisArg, body) {
12+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14+
function verb(n) { return function (v) { return step([n, v]); }; }
15+
function step(op) {
16+
if (f) throw new TypeError("Generator is already executing.");
17+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
18+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19+
if (y = 0, t) op = [op[0] & 2, t.value];
20+
switch (op[0]) {
21+
case 0: case 1: t = op; break;
22+
case 4: _.label++; return { value: op[1], done: false };
23+
case 5: _.label++; y = op[1]; op = [0]; continue;
24+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
25+
default:
26+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30+
if (t[2]) _.ops.pop();
31+
_.trys.pop(); continue;
32+
}
33+
op = body.call(thisArg, _);
34+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36+
}
37+
};
38+
Object.defineProperty(exports, "__esModule", { value: true });
39+
var sdk = require("@getgrit/workflows-sdk");
40+
var grit = require("@getgrit/api");
41+
var fs_1 = require("fs");
42+
var zod_1 = require("zod");
43+
var BlockTypeSchema = zod_1.z.object({
44+
nesting_mode: zod_1.z.string(),
45+
});
46+
var ResourceSchema = zod_1.z.object({
47+
block: zod_1.z.object({
48+
block_types: zod_1.z.record(BlockTypeSchema).optional(),
49+
})
50+
});
51+
var CloudflareSchema = zod_1.z.object({
52+
format_version: zod_1.z.string(),
53+
provider_schemas: zod_1.z.record(zod_1.z.object({
54+
resource_schemas: zod_1.z.record(ResourceSchema),
55+
})),
56+
});
57+
function findListNestingModeBlockTypes(schema) {
58+
var results = [];
59+
var cloudflareSchema = schema.provider_schemas["registry.terraform.io/cloudflare/cloudflare"];
60+
var resourceSchemas = cloudflareSchema.resource_schemas;
61+
for (var _i = 0, _a = Object.entries(resourceSchemas); _i < _a.length; _i++) {
62+
var _b = _a[_i], resourceName = _b[0], resourceSchema = _b[1];
63+
if (resourceSchema.block_types) {
64+
for (var _c = 0, _d = Object.entries(resourceSchema.block_types); _c < _d.length; _c++) {
65+
var _e = _d[_c], attributeName = _e[0], blockType = _e[1];
66+
if (blockType.nesting_mode === "list") {
67+
results.push({ resource: resourceName, attribute: attributeName });
68+
}
69+
}
70+
}
71+
}
72+
return results;
73+
}
74+
var schema = {
75+
$schema: 'https://json-schema.org/draft/2020-12/schema',
76+
type: 'object',
77+
properties: {
78+
old_schema_path: { type: 'string' },
79+
},
80+
required: ['query'],
81+
};
82+
exports.default = await sdk.defineWorkflow({
83+
name: 'workflow',
84+
options: schema,
85+
run: function (options) { return __awaiter(void 0, void 0, void 0, function () {
86+
var oldSchemaPath, oldSchemaData, oldSchema, results;
87+
return __generator(this, function (_a) {
88+
switch (_a.label) {
89+
case 0:
90+
console.log('Running workflow');
91+
grit.logging.info('Generating a GritQL migration for the provided Terraform schema');
92+
oldSchemaPath = options.old_schema_path;
93+
return [4 /*yield*/, fs_1.default.promises.readFile(oldSchemaPath, 'utf-8')];
94+
case 1:
95+
oldSchemaData = _a.sent();
96+
oldSchema = CloudflareSchema.parse(JSON.parse(oldSchemaData));
97+
grit.logging.info("Successfully loaded and validated the old schema at ".concat(JSON.stringify(oldSchema)));
98+
console.log(oldSchema);
99+
results = findListNestingModeBlockTypes(oldSchema);
100+
grit.logging.info("Found ".concat(results.length, " resources with list nesting mode block types"));
101+
return [2 /*return*/, {
102+
success: true
103+
}];
104+
}
105+
});
106+
}); },
107+
});

.grit/workflows/stainless-gritql-generator/workflow.md renamed to .grit/workflows/stainless/workflow.md

+1-5
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,5 @@ Here is an example for the above attribute:
3939
```grit
4040
language hcl
4141
42-
`resource "cloudflare_access_application" $_ { $attr }` where {
43-
$attr <: contains bubble or {
44-
`cors_headers { $block }` => `cors_headers = { $block }`
45-
}
46-
}
42+
`cors_headers { $block }` => `cors_headers = { $block }` where { $block <: within `resource "cloudflare_access_application" $_ { $_ }` }
4743
```

.grit/workflows/stainless/workflow.ts

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
2+
import * as sdk from '@getgrit/workflows-sdk';
3+
import type { JSONSchema7 } from 'json-schema';
4+
import * as grit from '@getgrit/api';
5+
6+
import fs from 'fs';
7+
8+
import { z } from "zod";
9+
10+
const BlockTypeSchema = z.object({
11+
nesting_mode: z.string(),
12+
});
13+
14+
const ResourceSchema = z.object({
15+
block: z.object({
16+
block_types: z.record(BlockTypeSchema).optional(),
17+
})
18+
});
19+
20+
const CloudflareSchema = z.object({
21+
format_version: z.string(),
22+
provider_schemas: z.record(z.object({
23+
resource_schemas: z.record(ResourceSchema),
24+
})),
25+
});
26+
27+
interface Result {
28+
resource: string;
29+
attribute: string;
30+
}
31+
32+
function findListNestingModeBlockTypes(schema: z.infer<typeof CloudflareSchema>): Result[] {
33+
const results: Result[] = [];
34+
35+
const cloudflareSchema = schema.provider_schemas["registry.terraform.io/cloudflare/cloudflare"];
36+
const resourceSchemas = cloudflareSchema.resource_schemas;
37+
38+
for (const [resourceName, resourceSchema] of Object.entries(resourceSchemas)) {
39+
const blockTypes = resourceSchema.block.block_types;
40+
if (blockTypes) {
41+
for (const [attributeName, blockType] of Object.entries(blockTypes)) {
42+
if (blockType.nesting_mode === "list") {
43+
results.push({ resource: resourceName, attribute: attributeName });
44+
}
45+
}
46+
}
47+
}
48+
49+
return results;
50+
}
51+
52+
const schema = {
53+
$schema: 'https://json-schema.org/draft/2020-12/schema',
54+
type: 'object' as const,
55+
properties: {
56+
old_schema_path: { type: 'string' },
57+
},
58+
required: ['query'],
59+
} satisfies JSONSchema7;
60+
61+
export default await sdk.defineWorkflow<typeof schema>({
62+
name: 'workflow',
63+
options: schema,
64+
65+
run: async (options) => {
66+
console.log('Running workflow');
67+
grit.logging.info('Generating a GritQL migration for the provided Terraform schema');
68+
69+
const oldSchemaPath = options.old_schema_path;
70+
const oldSchemaData = await fs.promises.readFile(oldSchemaPath, 'utf-8');
71+
const oldSchema = CloudflareSchema.parse(JSON.parse(oldSchemaData));
72+
73+
const results = findListNestingModeBlockTypes(oldSchema);
74+
75+
grit.logging.info(`Found ${results.length} resources with list nesting mode block types`);
76+
77+
const subqueries = results.map(({ resource, attribute }) =>
78+
` \`${attribute} { $block }\` => \`${attribute} = { $block }\` where { $block <: within \`resource "${resource}" $_ { $_ }\` }`
79+
).join(',\n');
80+
81+
const query = `
82+
language hcl
83+
84+
or {
85+
${subqueries}
86+
}`;
87+
88+
console.log(query);
89+
90+
91+
return {
92+
success: true,
93+
subqueries,
94+
};
95+
}
96+
});

0 commit comments

Comments
 (0)