@awsless/awsless 0.0.627 → 0.0.629
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/dist/app.stage.json +1 -0
- package/dist/bin.js +124 -33
- package/dist/build-json-schema.js +266 -4
- package/dist/prebuild/icon/bundle.zip +0 -0
- package/dist/prebuild/image/bundle.zip +0 -0
- package/dist/prebuild/rpc/bundle.zip +0 -0
- package/dist/stack.json +1 -1
- package/dist/stack.stage.json +1 -0
- package/package.json +19 -18
package/dist/bin.js
CHANGED
|
@@ -2434,10 +2434,10 @@ var TablesSchema = z41.record(
|
|
|
2434
2434
|
indexes: z41.record(
|
|
2435
2435
|
z41.string(),
|
|
2436
2436
|
z41.object({
|
|
2437
|
-
hash: KeySchema.describe(
|
|
2437
|
+
hash: z41.union([KeySchema.transform((v) => [v]), KeySchema.array()]).describe(
|
|
2438
2438
|
"Specifies the name of the partition / hash key that makes up the primary key for the global secondary index."
|
|
2439
2439
|
),
|
|
2440
|
-
sort: KeySchema.optional().describe(
|
|
2440
|
+
sort: z41.union([KeySchema.transform((v) => [v]), KeySchema.array()]).optional().describe(
|
|
2441
2441
|
"Specifies the name of the range / sort key that makes up the primary key for the global secondary index."
|
|
2442
2442
|
),
|
|
2443
2443
|
projection: z41.enum(["all", "keys-only"]).default("all").describe(
|
|
@@ -2525,6 +2525,78 @@ var StackSchema = z44.object({
|
|
|
2525
2525
|
// src/config/load/read.ts
|
|
2526
2526
|
import { readFile as readFile2 } from "fs/promises";
|
|
2527
2527
|
import { basename, dirname as dirname2, extname, join as join4 } from "path";
|
|
2528
|
+
|
|
2529
|
+
// src/config/stage-patch.ts
|
|
2530
|
+
import jsonPatch from "fast-json-patch";
|
|
2531
|
+
import { z as z45 } from "zod";
|
|
2532
|
+
var AddOperationSchema = z45.object({
|
|
2533
|
+
op: z45.literal("add"),
|
|
2534
|
+
path: z45.string(),
|
|
2535
|
+
value: z45.unknown()
|
|
2536
|
+
}).strict();
|
|
2537
|
+
var RemoveOperationSchema = z45.object({
|
|
2538
|
+
op: z45.literal("remove"),
|
|
2539
|
+
path: z45.string()
|
|
2540
|
+
}).strict();
|
|
2541
|
+
var ReplaceOperationSchema = z45.object({
|
|
2542
|
+
op: z45.literal("replace"),
|
|
2543
|
+
path: z45.string(),
|
|
2544
|
+
value: z45.unknown()
|
|
2545
|
+
}).strict();
|
|
2546
|
+
var MoveOperationSchema = z45.object({
|
|
2547
|
+
op: z45.literal("move"),
|
|
2548
|
+
from: z45.string(),
|
|
2549
|
+
path: z45.string()
|
|
2550
|
+
}).strict();
|
|
2551
|
+
var CopyOperationSchema = z45.object({
|
|
2552
|
+
op: z45.literal("copy"),
|
|
2553
|
+
from: z45.string(),
|
|
2554
|
+
path: z45.string()
|
|
2555
|
+
}).strict();
|
|
2556
|
+
var TestOperationSchema = z45.object({
|
|
2557
|
+
op: z45.literal("test"),
|
|
2558
|
+
path: z45.string(),
|
|
2559
|
+
value: z45.unknown()
|
|
2560
|
+
}).strict();
|
|
2561
|
+
var JsonPatchOperationSchema = z45.discriminatedUnion("op", [
|
|
2562
|
+
AddOperationSchema,
|
|
2563
|
+
RemoveOperationSchema,
|
|
2564
|
+
ReplaceOperationSchema,
|
|
2565
|
+
MoveOperationSchema,
|
|
2566
|
+
CopyOperationSchema,
|
|
2567
|
+
TestOperationSchema
|
|
2568
|
+
]);
|
|
2569
|
+
var StagePatchSchema = z45.object({
|
|
2570
|
+
$schema: z45.string().optional(),
|
|
2571
|
+
operations: JsonPatchOperationSchema.array()
|
|
2572
|
+
}).strict();
|
|
2573
|
+
var applyStagePatch = (source, patch, file) => {
|
|
2574
|
+
try {
|
|
2575
|
+
const result = jsonPatch.applyPatch(structuredClone(source), patch.operations, true, false);
|
|
2576
|
+
return result.newDocument;
|
|
2577
|
+
} catch (error) {
|
|
2578
|
+
if (error instanceof Error) {
|
|
2579
|
+
throw new FileError(file, error.message);
|
|
2580
|
+
}
|
|
2581
|
+
throw error;
|
|
2582
|
+
}
|
|
2583
|
+
};
|
|
2584
|
+
|
|
2585
|
+
// src/config/load/validate.ts
|
|
2586
|
+
import { z as z46 } from "zod";
|
|
2587
|
+
var validateConfig = async (schema, file, data) => {
|
|
2588
|
+
try {
|
|
2589
|
+
const result = await schema.parseAsync(data);
|
|
2590
|
+
return result;
|
|
2591
|
+
} catch (error) {
|
|
2592
|
+
if (error instanceof z46.ZodError) {
|
|
2593
|
+
throw new ConfigError(file, error, data);
|
|
2594
|
+
}
|
|
2595
|
+
throw error;
|
|
2596
|
+
}
|
|
2597
|
+
};
|
|
2598
|
+
|
|
2599
|
+
// src/config/load/read.ts
|
|
2528
2600
|
var readConfig = async (file) => {
|
|
2529
2601
|
try {
|
|
2530
2602
|
const json2 = await readFile2(file, "utf8");
|
|
@@ -2540,32 +2612,28 @@ var readConfig = async (file) => {
|
|
|
2540
2612
|
var readConfigWithStage = async (file, stage) => {
|
|
2541
2613
|
const config2 = await readConfig(file);
|
|
2542
2614
|
if (!stage) {
|
|
2543
|
-
return
|
|
2615
|
+
return {
|
|
2616
|
+
file,
|
|
2617
|
+
data: config2
|
|
2618
|
+
};
|
|
2544
2619
|
}
|
|
2545
2620
|
const ext = extname(file);
|
|
2546
2621
|
const stageFileName = basename(file, ext) + "." + stage + ext;
|
|
2547
2622
|
const stageFile = join4(dirname2(file), stageFileName);
|
|
2548
2623
|
const stageFileExists = await fileExist(stageFile);
|
|
2549
2624
|
if (!stageFileExists) {
|
|
2550
|
-
return
|
|
2625
|
+
return {
|
|
2626
|
+
file,
|
|
2627
|
+
data: config2
|
|
2628
|
+
};
|
|
2551
2629
|
}
|
|
2552
2630
|
debug("Load env file:", color.info(stageFile));
|
|
2553
2631
|
const stageConfig = await readConfig(stageFile);
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
var validateConfig = async (schema, file, data) => {
|
|
2560
|
-
try {
|
|
2561
|
-
const result = await schema.parseAsync(data);
|
|
2562
|
-
return result;
|
|
2563
|
-
} catch (error) {
|
|
2564
|
-
if (error instanceof z45.ZodError) {
|
|
2565
|
-
throw new ConfigError(file, error, data);
|
|
2566
|
-
}
|
|
2567
|
-
throw error;
|
|
2568
|
-
}
|
|
2632
|
+
const patch = await validateConfig(StagePatchSchema, stageFile, stageConfig);
|
|
2633
|
+
return {
|
|
2634
|
+
file: stageFile,
|
|
2635
|
+
data: applyStagePatch(config2, patch, stageFile)
|
|
2636
|
+
};
|
|
2569
2637
|
};
|
|
2570
2638
|
|
|
2571
2639
|
// src/config/load/load.ts
|
|
@@ -2580,7 +2648,7 @@ var loadAppConfig = async (options) => {
|
|
|
2580
2648
|
debug("Load app config file");
|
|
2581
2649
|
const appConfig = await readConfigWithStage(appFileName, options.stage);
|
|
2582
2650
|
debug("Validate app config file");
|
|
2583
|
-
const app = await validateConfig(AppSchema,
|
|
2651
|
+
const app = await validateConfig(AppSchema, appConfig.file, appConfig.data);
|
|
2584
2652
|
return app;
|
|
2585
2653
|
};
|
|
2586
2654
|
var loadStackConfigs = async (options) => {
|
|
@@ -2600,7 +2668,7 @@ var loadStackConfigs = async (options) => {
|
|
|
2600
2668
|
debug("Load stack file:", color.info(file));
|
|
2601
2669
|
const stackConfig = await readConfigWithStage(join5(directories.root, file), options.stage);
|
|
2602
2670
|
setLocalBasePath(join5(directories.root, dirname3(file)));
|
|
2603
|
-
const stack = await validateConfig(StackSchema, file, stackConfig);
|
|
2671
|
+
const stack = await validateConfig(StackSchema, stackConfig.file, stackConfig.data);
|
|
2604
2672
|
stacks.push({
|
|
2605
2673
|
...stack,
|
|
2606
2674
|
file
|
|
@@ -5312,14 +5380,15 @@ var siteFeature = defineFeature({
|
|
|
5312
5380
|
const instance = Bun.spawn(buildProps.command.split(" "), {
|
|
5313
5381
|
cwd,
|
|
5314
5382
|
env,
|
|
5315
|
-
stdout: "
|
|
5316
|
-
stderr: "
|
|
5383
|
+
stdout: "pipe",
|
|
5384
|
+
stderr: "pipe"
|
|
5385
|
+
// stdout: 'ignore',
|
|
5386
|
+
// stderr: ''
|
|
5317
5387
|
// stdout: 'inherit',
|
|
5318
5388
|
// stderr: 'inherit',
|
|
5319
5389
|
});
|
|
5320
5390
|
await instance.exited;
|
|
5321
5391
|
if (instance.exitCode !== null && instance.exitCode > 0) {
|
|
5322
|
-
console.log(instance.stderr);
|
|
5323
5392
|
throw new Error("Site build failed");
|
|
5324
5393
|
}
|
|
5325
5394
|
await write("HASH", fingerprint);
|
|
@@ -5754,9 +5823,17 @@ var tableFeature = defineFeature({
|
|
|
5754
5823
|
},
|
|
5755
5824
|
globalSecondaryIndex: Object.entries(props.indexes ?? {}).map(([name2, index]) => ({
|
|
5756
5825
|
name: name2,
|
|
5757
|
-
|
|
5758
|
-
|
|
5759
|
-
|
|
5826
|
+
projectionType: constantCase11(index.projection),
|
|
5827
|
+
keySchema: [
|
|
5828
|
+
...index.hash.map((name3) => ({
|
|
5829
|
+
keyType: "HASH",
|
|
5830
|
+
attributeName: name3
|
|
5831
|
+
})),
|
|
5832
|
+
...(index.sort ?? []).map((name3) => ({
|
|
5833
|
+
keyType: "RANGE",
|
|
5834
|
+
attributeName: name3
|
|
5835
|
+
}))
|
|
5836
|
+
]
|
|
5760
5837
|
})),
|
|
5761
5838
|
deletionProtectionEnabled: ctx.appConfig.removal === "retain"
|
|
5762
5839
|
},
|
|
@@ -8863,6 +8940,14 @@ var startTest = async (props) => {
|
|
|
8863
8940
|
exclude: ["**/_*", "**/_*/**", ...configDefaults.exclude],
|
|
8864
8941
|
globals: true,
|
|
8865
8942
|
reporters: [new NullReporter()],
|
|
8943
|
+
// isolate: false,
|
|
8944
|
+
// typecheck: {
|
|
8945
|
+
// enabled: true,
|
|
8946
|
+
// only: false,
|
|
8947
|
+
// exclude: ['**/_*', '**/_*/**', ...configDefaults.exclude],
|
|
8948
|
+
// include: ['**/*.{js,jsx,ts,tsx}'],
|
|
8949
|
+
// checker: 'tsc',
|
|
8950
|
+
// },
|
|
8866
8951
|
// reporters: 'json',
|
|
8867
8952
|
// typecheck: {
|
|
8868
8953
|
// checker: 'tsc',
|
|
@@ -10261,6 +10346,7 @@ var parseJsonLog = (message) => {
|
|
|
10261
10346
|
// src/cli/command/image/clear-cache.ts
|
|
10262
10347
|
import { DeleteObjectsCommand, ListObjectsV2Command, S3Client as S3Client3 } from "@aws-sdk/client-s3";
|
|
10263
10348
|
import { Cancelled as Cancelled3, log as log28, prompt as prompt14 } from "@awsless/clui";
|
|
10349
|
+
import { CloudFrontClient as CloudFrontClient2 } from "@aws-sdk/client-cloudfront";
|
|
10264
10350
|
var clearCache = (program2) => {
|
|
10265
10351
|
program2.command("clear-cache").argument("[stack]", "The stack name of the image proxy").argument("[name]", "The name of the image proxy").description("Clears the cache of the image proxy").action(async (stack, name) => {
|
|
10266
10352
|
await layout("image clear-cache", async ({ appConfig, stackConfigs }) => {
|
|
@@ -10325,6 +10411,10 @@ var clearCache = (program2) => {
|
|
|
10325
10411
|
credentials,
|
|
10326
10412
|
region
|
|
10327
10413
|
});
|
|
10414
|
+
const cloudFrontClient = new CloudFrontClient2({
|
|
10415
|
+
credentials,
|
|
10416
|
+
region
|
|
10417
|
+
});
|
|
10328
10418
|
let totalDeleted = 0;
|
|
10329
10419
|
await log28.task({
|
|
10330
10420
|
initialMessage: "Clearing cache...",
|
|
@@ -10359,9 +10449,7 @@ var clearCache = (program2) => {
|
|
|
10359
10449
|
break;
|
|
10360
10450
|
}
|
|
10361
10451
|
}
|
|
10362
|
-
await createInvalidationForDistributionTenants({
|
|
10363
|
-
credentials,
|
|
10364
|
-
region,
|
|
10452
|
+
await createInvalidationForDistributionTenants(cloudFrontClient, {
|
|
10365
10453
|
distributionId,
|
|
10366
10454
|
paths: [shared.entry("image", "path", name)]
|
|
10367
10455
|
});
|
|
@@ -10382,6 +10470,7 @@ var image = (program2) => {
|
|
|
10382
10470
|
// src/cli/command/icon/clear-cache.ts
|
|
10383
10471
|
import { DeleteObjectsCommand as DeleteObjectsCommand2, ListObjectsV2Command as ListObjectsV2Command2, S3Client as S3Client4 } from "@aws-sdk/client-s3";
|
|
10384
10472
|
import { Cancelled as Cancelled4, log as log29, prompt as prompt15 } from "@awsless/clui";
|
|
10473
|
+
import { CloudFrontClient as CloudFrontClient3 } from "@aws-sdk/client-cloudfront";
|
|
10385
10474
|
var clearCache2 = (program2) => {
|
|
10386
10475
|
program2.command("clear-cache").argument("[stack]", "The stack name of the icon proxy").argument("[name]", "The name of the icon proxy").description("Clears the cache of the icon proxy").action(async (stack, name) => {
|
|
10387
10476
|
await layout("icon clear-cache", async ({ appConfig, stackConfigs }) => {
|
|
@@ -10446,6 +10535,10 @@ var clearCache2 = (program2) => {
|
|
|
10446
10535
|
credentials,
|
|
10447
10536
|
region
|
|
10448
10537
|
});
|
|
10538
|
+
const cloudFrontClient = new CloudFrontClient3({
|
|
10539
|
+
credentials,
|
|
10540
|
+
region
|
|
10541
|
+
});
|
|
10449
10542
|
let totalDeleted = 0;
|
|
10450
10543
|
await log29.task({
|
|
10451
10544
|
initialMessage: "Clearing cache...",
|
|
@@ -10480,9 +10573,7 @@ var clearCache2 = (program2) => {
|
|
|
10480
10573
|
break;
|
|
10481
10574
|
}
|
|
10482
10575
|
}
|
|
10483
|
-
await createInvalidationForDistributionTenants({
|
|
10484
|
-
credentials,
|
|
10485
|
-
region,
|
|
10576
|
+
await createInvalidationForDistributionTenants(cloudFrontClient, {
|
|
10486
10577
|
distributionId,
|
|
10487
10578
|
paths: [shared.entry("icon", "path", name)]
|
|
10488
10579
|
});
|
|
@@ -942,6 +942,259 @@ var AppSchema = z24.object({
|
|
|
942
942
|
}).default({}).describe("Default properties")
|
|
943
943
|
});
|
|
944
944
|
|
|
945
|
+
// src/config/stage-patch-json-schema.ts
|
|
946
|
+
var clone = (value) => {
|
|
947
|
+
return JSON.parse(JSON.stringify(value));
|
|
948
|
+
};
|
|
949
|
+
var escapePointerSegment = (value) => {
|
|
950
|
+
return value.replaceAll("~", "~0").replaceAll("/", "~1");
|
|
951
|
+
};
|
|
952
|
+
var escapeRegexSegment = (value) => {
|
|
953
|
+
return value.replace(/[|\\{}()[\]^$+*?.-]/g, "\\$&");
|
|
954
|
+
};
|
|
955
|
+
var makeExactPath = (prefix, segment) => {
|
|
956
|
+
return `${prefix}/${escapePointerSegment(segment)}`;
|
|
957
|
+
};
|
|
958
|
+
var makeExactPattern = (path) => {
|
|
959
|
+
return `^${path.split("/").map(escapeRegexSegment).join("/")}$`;
|
|
960
|
+
};
|
|
961
|
+
var makePatternPath = (prefix, segmentPattern) => {
|
|
962
|
+
return prefix ? `${prefix}/${segmentPattern}` : `/${segmentPattern}`;
|
|
963
|
+
};
|
|
964
|
+
var appendExactPattern = (pattern, segment) => {
|
|
965
|
+
const base = pattern.slice(1, -1);
|
|
966
|
+
return `^${base}/${escapeRegexSegment(segment)}$`;
|
|
967
|
+
};
|
|
968
|
+
var appendRegexPattern = (pattern, segmentPattern) => {
|
|
969
|
+
const base = pattern.slice(1, -1);
|
|
970
|
+
return `^${base}/${segmentPattern}$`;
|
|
971
|
+
};
|
|
972
|
+
var mergeSchemas = (schemas) => {
|
|
973
|
+
const list = schemas.map((schema) => clone(schema));
|
|
974
|
+
if (list.length === 1) {
|
|
975
|
+
return list[0];
|
|
976
|
+
}
|
|
977
|
+
return {
|
|
978
|
+
anyOf: list
|
|
979
|
+
};
|
|
980
|
+
};
|
|
981
|
+
var dereference = (schema, root) => {
|
|
982
|
+
if (typeof schema.$ref !== "string" || !schema.$ref.startsWith("#/")) {
|
|
983
|
+
return schema;
|
|
984
|
+
}
|
|
985
|
+
const target = schema.$ref.slice(2).split("/").map((segment) => segment.replaceAll("~1", "/").replaceAll("~0", "~")).reduce((value, segment) => {
|
|
986
|
+
if (typeof value === "object" && value !== null) {
|
|
987
|
+
return value[segment];
|
|
988
|
+
}
|
|
989
|
+
return void 0;
|
|
990
|
+
}, root);
|
|
991
|
+
if (!target || typeof target !== "object") {
|
|
992
|
+
return schema;
|
|
993
|
+
}
|
|
994
|
+
const { $ref: _, ...rest } = schema;
|
|
995
|
+
return {
|
|
996
|
+
...clone(target),
|
|
997
|
+
...rest
|
|
998
|
+
};
|
|
999
|
+
};
|
|
1000
|
+
var listBranches = (schema) => {
|
|
1001
|
+
const groups = [schema.anyOf, schema.oneOf, schema.allOf].filter(Boolean);
|
|
1002
|
+
if (groups.length === 0) {
|
|
1003
|
+
return [schema];
|
|
1004
|
+
}
|
|
1005
|
+
return groups.flatMap((group) => group);
|
|
1006
|
+
};
|
|
1007
|
+
var childSegmentPattern = (schema) => {
|
|
1008
|
+
const propertyNameSchema = schema.propertyNames;
|
|
1009
|
+
if (propertyNameSchema && typeof propertyNameSchema.pattern === "string") {
|
|
1010
|
+
return propertyNameSchema.pattern;
|
|
1011
|
+
}
|
|
1012
|
+
const firstPattern = Object.keys(schema.patternProperties ?? {})[0];
|
|
1013
|
+
if (firstPattern) {
|
|
1014
|
+
return firstPattern;
|
|
1015
|
+
}
|
|
1016
|
+
return "[^/]+";
|
|
1017
|
+
};
|
|
1018
|
+
var joinEntries = (entries) => {
|
|
1019
|
+
const map = /* @__PURE__ */ new Map();
|
|
1020
|
+
for (const entry of entries) {
|
|
1021
|
+
const key = [entry.path, entry.pattern ?? "", entry.addOnly ? "1" : "0"].join("|");
|
|
1022
|
+
const previous = map.get(key);
|
|
1023
|
+
if (!previous) {
|
|
1024
|
+
map.set(key, {
|
|
1025
|
+
...entry,
|
|
1026
|
+
schema: clone(entry.schema)
|
|
1027
|
+
});
|
|
1028
|
+
continue;
|
|
1029
|
+
}
|
|
1030
|
+
previous.schema = mergeSchemas([previous.schema, entry.schema]);
|
|
1031
|
+
}
|
|
1032
|
+
return [...map.values()];
|
|
1033
|
+
};
|
|
1034
|
+
var collectEntries = (schema, pointer = "", pattern = makeExactPattern(pointer), root = schema) => {
|
|
1035
|
+
const resolved = dereference(schema, root);
|
|
1036
|
+
const entries = [
|
|
1037
|
+
{
|
|
1038
|
+
path: pointer,
|
|
1039
|
+
pattern,
|
|
1040
|
+
schema: clone(resolved)
|
|
1041
|
+
}
|
|
1042
|
+
];
|
|
1043
|
+
for (const branch of listBranches(resolved)) {
|
|
1044
|
+
const branchType = Array.isArray(branch.type) ? branch.type : branch.type ? [branch.type] : [];
|
|
1045
|
+
const isObject = branchType.includes("object") || branch.properties !== void 0 || branch.additionalProperties !== void 0 || branch.patternProperties !== void 0;
|
|
1046
|
+
const isArray = branchType.includes("array") || branch.items !== void 0 || branch.prefixItems !== void 0;
|
|
1047
|
+
if (isObject) {
|
|
1048
|
+
for (const [property, propertySchema] of Object.entries(branch.properties ?? {})) {
|
|
1049
|
+
const path = makeExactPath(pointer, property);
|
|
1050
|
+
entries.push(...collectEntries(propertySchema, path, appendExactPattern(pattern, property), root));
|
|
1051
|
+
}
|
|
1052
|
+
for (const [propertyPattern, propertySchema] of Object.entries(branch.patternProperties ?? {})) {
|
|
1053
|
+
const path = makePatternPath(pointer, propertyPattern);
|
|
1054
|
+
entries.push(...collectEntries(propertySchema, path, appendRegexPattern(pattern, propertyPattern), root));
|
|
1055
|
+
}
|
|
1056
|
+
if (branch.additionalProperties && typeof branch.additionalProperties === "object") {
|
|
1057
|
+
const segmentPattern = childSegmentPattern(branch);
|
|
1058
|
+
const path = makePatternPath(pointer, segmentPattern);
|
|
1059
|
+
entries.push(...collectEntries(branch.additionalProperties, path, appendRegexPattern(pattern, segmentPattern), root));
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
if (isArray) {
|
|
1063
|
+
if (Array.isArray(branch.items)) {
|
|
1064
|
+
branch.items.forEach((itemSchema, index) => {
|
|
1065
|
+
entries.push(...collectEntries(itemSchema, `${pointer}/${index}`, appendExactPattern(pattern, `${index}`), root));
|
|
1066
|
+
});
|
|
1067
|
+
} else if (branch.items && typeof branch.items === "object") {
|
|
1068
|
+
entries.push(...collectEntries(branch.items, `${pointer}/\\d+`, appendRegexPattern(pattern, "\\d+"), root));
|
|
1069
|
+
entries.push({
|
|
1070
|
+
path: `${pointer}/-`,
|
|
1071
|
+
pattern: makeExactPattern(`${pointer}/-`),
|
|
1072
|
+
schema: clone(branch.items),
|
|
1073
|
+
addOnly: true
|
|
1074
|
+
});
|
|
1075
|
+
}
|
|
1076
|
+
for (const [index, itemSchema] of (branch.prefixItems ?? []).entries()) {
|
|
1077
|
+
entries.push(...collectEntries(itemSchema, `${pointer}/${index}`, appendExactPattern(pattern, `${index}`), root));
|
|
1078
|
+
}
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
return joinEntries(entries);
|
|
1082
|
+
};
|
|
1083
|
+
var pathMatcherSchema = (entry) => {
|
|
1084
|
+
if (entry.pattern && entry.pattern !== makeExactPattern(entry.path)) {
|
|
1085
|
+
return {
|
|
1086
|
+
type: "string",
|
|
1087
|
+
pattern: entry.pattern
|
|
1088
|
+
};
|
|
1089
|
+
}
|
|
1090
|
+
return {
|
|
1091
|
+
type: "string",
|
|
1092
|
+
const: entry.path
|
|
1093
|
+
};
|
|
1094
|
+
};
|
|
1095
|
+
var objectSchema = (properties, required) => {
|
|
1096
|
+
return {
|
|
1097
|
+
type: "object",
|
|
1098
|
+
properties,
|
|
1099
|
+
required,
|
|
1100
|
+
additionalProperties: false
|
|
1101
|
+
};
|
|
1102
|
+
};
|
|
1103
|
+
var conditionalValueSchema = (entry) => {
|
|
1104
|
+
return {
|
|
1105
|
+
if: {
|
|
1106
|
+
type: "object",
|
|
1107
|
+
properties: {
|
|
1108
|
+
path: pathMatcherSchema(entry)
|
|
1109
|
+
},
|
|
1110
|
+
required: ["path"]
|
|
1111
|
+
},
|
|
1112
|
+
then: {
|
|
1113
|
+
properties: {
|
|
1114
|
+
value: clone(entry.schema)
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
};
|
|
1118
|
+
};
|
|
1119
|
+
var matchersSchema = (entries) => {
|
|
1120
|
+
return {
|
|
1121
|
+
oneOf: entries.map(pathMatcherSchema)
|
|
1122
|
+
};
|
|
1123
|
+
};
|
|
1124
|
+
var patchOperationSchema = (op, entries) => {
|
|
1125
|
+
const props = {
|
|
1126
|
+
op: {
|
|
1127
|
+
type: "string",
|
|
1128
|
+
const: op
|
|
1129
|
+
},
|
|
1130
|
+
path: matchersSchema(entries)
|
|
1131
|
+
};
|
|
1132
|
+
const required = ["op", "path"];
|
|
1133
|
+
const schema = objectSchema(props, required);
|
|
1134
|
+
switch (op) {
|
|
1135
|
+
case "add":
|
|
1136
|
+
case "replace":
|
|
1137
|
+
case "test":
|
|
1138
|
+
schema.properties = {
|
|
1139
|
+
...schema.properties,
|
|
1140
|
+
value: {}
|
|
1141
|
+
};
|
|
1142
|
+
schema.required = [...required, "value"];
|
|
1143
|
+
schema.allOf = entries.map(conditionalValueSchema);
|
|
1144
|
+
return schema;
|
|
1145
|
+
case "move":
|
|
1146
|
+
case "copy":
|
|
1147
|
+
schema.properties = {
|
|
1148
|
+
...schema.properties,
|
|
1149
|
+
from: matchersSchema(entries)
|
|
1150
|
+
};
|
|
1151
|
+
schema.required = ["op", "from", "path"];
|
|
1152
|
+
return schema;
|
|
1153
|
+
default:
|
|
1154
|
+
return schema;
|
|
1155
|
+
}
|
|
1156
|
+
};
|
|
1157
|
+
var normalizeEntry = (entry) => {
|
|
1158
|
+
return {
|
|
1159
|
+
...entry,
|
|
1160
|
+
pattern: entry.pattern ?? makeExactPattern(entry.path)
|
|
1161
|
+
};
|
|
1162
|
+
};
|
|
1163
|
+
var isSchemaMetadataPath = (entry) => {
|
|
1164
|
+
return entry.path === "/$schema" || entry.path.startsWith("/$schema/");
|
|
1165
|
+
};
|
|
1166
|
+
var createStagePatchJsonSchema = (baseSchema, title) => {
|
|
1167
|
+
const entries = collectEntries(baseSchema).map(normalizeEntry).filter((entry) => !isSchemaMetadataPath(entry));
|
|
1168
|
+
const standardEntries = entries.filter((entry) => !entry.addOnly);
|
|
1169
|
+
const addEntries = entries;
|
|
1170
|
+
const moveCopyEntries = standardEntries.filter((entry) => entry.path !== "");
|
|
1171
|
+
return {
|
|
1172
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
1173
|
+
title,
|
|
1174
|
+
type: "object",
|
|
1175
|
+
additionalProperties: false,
|
|
1176
|
+
properties: {
|
|
1177
|
+
$schema: {
|
|
1178
|
+
type: "string"
|
|
1179
|
+
},
|
|
1180
|
+
operations: {
|
|
1181
|
+
type: "array",
|
|
1182
|
+
items: {
|
|
1183
|
+
oneOf: [
|
|
1184
|
+
patchOperationSchema("add", addEntries),
|
|
1185
|
+
patchOperationSchema("remove", standardEntries),
|
|
1186
|
+
patchOperationSchema("replace", standardEntries),
|
|
1187
|
+
patchOperationSchema("move", moveCopyEntries),
|
|
1188
|
+
patchOperationSchema("copy", moveCopyEntries),
|
|
1189
|
+
patchOperationSchema("test", standardEntries)
|
|
1190
|
+
]
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
},
|
|
1194
|
+
required: ["operations"]
|
|
1195
|
+
};
|
|
1196
|
+
};
|
|
1197
|
+
|
|
945
1198
|
// src/config/stack.ts
|
|
946
1199
|
import { z as z40 } from "zod";
|
|
947
1200
|
|
|
@@ -1496,10 +1749,10 @@ var TablesSchema = z37.record(
|
|
|
1496
1749
|
indexes: z37.record(
|
|
1497
1750
|
z37.string(),
|
|
1498
1751
|
z37.object({
|
|
1499
|
-
hash: KeySchema.describe(
|
|
1752
|
+
hash: z37.union([KeySchema.transform((v) => [v]), KeySchema.array()]).describe(
|
|
1500
1753
|
"Specifies the name of the partition / hash key that makes up the primary key for the global secondary index."
|
|
1501
1754
|
),
|
|
1502
|
-
sort: KeySchema.optional().describe(
|
|
1755
|
+
sort: z37.union([KeySchema.transform((v) => [v]), KeySchema.array()]).optional().describe(
|
|
1503
1756
|
"Specifies the name of the range / sort key that makes up the primary key for the global secondary index."
|
|
1504
1757
|
),
|
|
1505
1758
|
projection: z37.enum(["all", "keys-only"]).default("all").describe(
|
|
@@ -1597,6 +1850,7 @@ var generateJsonSchema = (props) => {
|
|
|
1597
1850
|
appendDefaults(schema);
|
|
1598
1851
|
schema.title = props.title;
|
|
1599
1852
|
writeFileSync(file, JSON.stringify(schema));
|
|
1853
|
+
return schema;
|
|
1600
1854
|
};
|
|
1601
1855
|
var appendDefaults = (object) => {
|
|
1602
1856
|
if (Array.isArray(object)) {
|
|
@@ -1619,13 +1873,21 @@ var appendDefaults = (object) => {
|
|
|
1619
1873
|
}
|
|
1620
1874
|
}
|
|
1621
1875
|
};
|
|
1622
|
-
generateJsonSchema({
|
|
1876
|
+
var appSchema = generateJsonSchema({
|
|
1623
1877
|
schema: AppSchema,
|
|
1624
1878
|
name: "app",
|
|
1625
1879
|
title: "Awsless App Config"
|
|
1626
1880
|
});
|
|
1627
|
-
generateJsonSchema({
|
|
1881
|
+
var stackSchema = generateJsonSchema({
|
|
1628
1882
|
schema: StackSchema,
|
|
1629
1883
|
name: "stack",
|
|
1630
1884
|
title: "Awsless Stack Config"
|
|
1631
1885
|
});
|
|
1886
|
+
writeFileSync(
|
|
1887
|
+
join2(process.cwd(), "dist/app.stage.json"),
|
|
1888
|
+
JSON.stringify(createStagePatchJsonSchema(appSchema, "Awsless App Stage Patch Config"))
|
|
1889
|
+
);
|
|
1890
|
+
writeFileSync(
|
|
1891
|
+
join2(process.cwd(), "dist/stack.stage.json"),
|
|
1892
|
+
JSON.stringify(createStagePatchJsonSchema(stackSchema, "Awsless Stack Stage Patch Config"))
|
|
1893
|
+
);
|
|
Binary file
|
|
Binary file
|
|
Binary file
|