@awsless/cli 0.0.46-local.1 → 0.0.46-local.10
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/bin.js +608 -220
- package/dist/stack.json +1 -1
- package/dist/stack.stage.json +1 -1
- package/package.json +20 -20
package/dist/bin.js
CHANGED
|
@@ -102748,7 +102748,7 @@ var init_find_cache_dir = __esm(() => {
|
|
|
102748
102748
|
({ env: env3, cwd } = process4);
|
|
102749
102749
|
});
|
|
102750
102750
|
|
|
102751
|
-
// ../open-search/dist/chunk-
|
|
102751
|
+
// ../open-search/dist/chunk-M36HBITL.js
|
|
102752
102752
|
import { mkdir as mkdir6, rename as rename4, rm as rm7, stat as stat5 } from "fs/promises";
|
|
102753
102753
|
import { join as join27, resolve as resolve3 } from "path";
|
|
102754
102754
|
import { mkdir as mkdir22, readdir as readdir4, rename as rename22, rm as rm22, stat as stat22 } from "fs/promises";
|
|
@@ -102842,7 +102842,7 @@ var import_decompress, import_decompress2, getArchiveName = (version2) => {
|
|
|
102842
102842
|
}
|
|
102843
102843
|
return findJavaHome(dir);
|
|
102844
102844
|
}, VERSION_2_8_0;
|
|
102845
|
-
var
|
|
102845
|
+
var init_chunk_M36HBITL = __esm(() => {
|
|
102846
102846
|
init_find_cache_dir();
|
|
102847
102847
|
init_find_cache_dir();
|
|
102848
102848
|
import_decompress = __toESM(require_decompress(), 1);
|
|
@@ -102856,7 +102856,8 @@ var init_chunk_7I7EB23J = __esm(() => {
|
|
|
102856
102856
|
"http.port": port,
|
|
102857
102857
|
"path.data": `${cache3}/data`,
|
|
102858
102858
|
"path.logs": `${cache3}/logs`,
|
|
102859
|
-
"plugins.security.disabled": true
|
|
102859
|
+
"plugins.security.disabled": true,
|
|
102860
|
+
"cluster.routing.allocation.disk.threshold_enabled": false
|
|
102860
102861
|
})
|
|
102861
102862
|
};
|
|
102862
102863
|
});
|
|
@@ -103462,7 +103463,7 @@ var import_sleep_await, mock, searchClient = (options = {}, service = "es") => {
|
|
|
103462
103463
|
return new Schema2((input) => [...input].map((item) => struct.encode(item)), (encoded) => new Set(encoded.map((item) => struct.decode(item))), struct.mapping);
|
|
103463
103464
|
}, string2 = (props = {}) => new Schema2((value) => value, (value) => value, { type: "keyword", ...props }), uuid = (props = {}) => new Schema2((value) => value, (value) => value, { type: "keyword", ...props });
|
|
103464
103465
|
var init_dist2 = __esm(() => {
|
|
103465
|
-
|
|
103466
|
+
init_chunk_M36HBITL();
|
|
103466
103467
|
init_dist();
|
|
103467
103468
|
import_sleep_await = __toESM(require_dist3(), 1);
|
|
103468
103469
|
BulkError = class extends Error {
|
|
@@ -105671,7 +105672,7 @@ var require_readdirp = __commonJS((exports, module) => {
|
|
|
105671
105672
|
var sysPath = __require("path");
|
|
105672
105673
|
var { promisify: promisify2 } = __require("util");
|
|
105673
105674
|
var picomatch = require_picomatch3();
|
|
105674
|
-
var
|
|
105675
|
+
var readdir7 = promisify2(fs5.readdir);
|
|
105675
105676
|
var stat7 = promisify2(fs5.stat);
|
|
105676
105677
|
var lstat4 = promisify2(fs5.lstat);
|
|
105677
105678
|
var realpath2 = promisify2(fs5.realpath);
|
|
@@ -105804,7 +105805,7 @@ var require_readdirp = __commonJS((exports, module) => {
|
|
|
105804
105805
|
async _exploreDir(path6, depth) {
|
|
105805
105806
|
let files;
|
|
105806
105807
|
try {
|
|
105807
|
-
files = await
|
|
105808
|
+
files = await readdir7(path6, this._rdOptions);
|
|
105808
105809
|
} catch (error3) {
|
|
105809
105810
|
this._onError(error3);
|
|
105810
105811
|
}
|
|
@@ -150256,6 +150257,16 @@ var bootstrapAwsless = async (props) => {
|
|
|
150256
150257
|
// src/config/load/load.ts
|
|
150257
150258
|
import { basename as basename2, dirname as dirname5, join as join13 } from "path";
|
|
150258
150259
|
|
|
150260
|
+
// src/feature/config/schema.ts
|
|
150261
|
+
var ConfigNameSchema = exports_external.string().regex(/^[a-z0-9-]+$/, "Invalid config name");
|
|
150262
|
+
var ConfigsSchema = exports_external.array(ConfigNameSchema).optional().describe("Define the config values for your app.");
|
|
150263
|
+
var ConfigFileSchema = exports_external.record(ConfigNameSchema, exports_external.union([
|
|
150264
|
+
exports_external.string().describe("A committed default value for the local dev environment."),
|
|
150265
|
+
exports_external.object({
|
|
150266
|
+
secret: exports_external.literal(true).describe("Pulled from ssm into memory on local dev boot, never stored locally.")
|
|
150267
|
+
}).describe("A secret config value.")
|
|
150268
|
+
])).describe("The config values of your app.");
|
|
150269
|
+
|
|
150259
150270
|
// src/config/schema/config-ref.ts
|
|
150260
150271
|
var ConfigRefSchema = exports_external.string().regex(/^config:[a-z0-9-]+$/, "Invalid config reference");
|
|
150261
150272
|
var isConfigRef = (value) => {
|
|
@@ -150324,10 +150335,6 @@ var AuthDefaultSchema = exports_external.record(ResourceIdSchema, exports_extern
|
|
|
150324
150335
|
}).default({}).describe("Specifies the validity duration for every JWT token.")
|
|
150325
150336
|
})).default({}).describe("Define the authenticatable users in your app.");
|
|
150326
150337
|
|
|
150327
|
-
// src/feature/config/schema.ts
|
|
150328
|
-
var ConfigNameSchema = exports_external.string().regex(/^[a-z0-9-]+$/, "Invalid config name");
|
|
150329
|
-
var ConfigsSchema = exports_external.array(ConfigNameSchema).optional().describe("Define the config values for your app.");
|
|
150330
|
-
|
|
150331
150338
|
// src/feature/domain/schema.ts
|
|
150332
150339
|
var DomainNameSchema = exports_external.string().regex(/[a-z\-\_\.]/g, "Invalid domain name").describe("Enter a fully qualified domain name, for example, www.example.com. You can optionally include a trailing dot. If you omit the trailing dot, Amazon Route 53 assumes that the domain name that you specify is fully qualified. This means that Route 53 treats www.example.com (without a trailing dot) and www.example.com. (with a trailing dot) as identical.");
|
|
150333
150340
|
var DNSTypeSchema = exports_external.enum(["A", "AAAA", "CAA", "CNAME", "DS", "MX", "NAPTR", "NS", "PTR", "SOA", "SPF", "SRV", "TXT"]).describe("The DNS record type.");
|
|
@@ -151267,7 +151274,7 @@ var IndexSchema = exports_external.object({
|
|
|
151267
151274
|
strict: exports_external.boolean().optional().describe("Reject documents with fields that are missing from the schema."),
|
|
151268
151275
|
mappings: MappingsSchema.optional(),
|
|
151269
151276
|
settings: exports_external.record(exports_external.string(), exports_external.unknown()).optional().describe("The OpenSearch index settings, applied when the index is created.")
|
|
151270
|
-
}).refine((props) => !(props.schema && props.mappings), {
|
|
151277
|
+
}).strict().refine((props) => !(props.schema && props.mappings), {
|
|
151271
151278
|
message: 'Define either "schema" or "mappings" for an index, not both.'
|
|
151272
151279
|
}).refine((props) => !(props.strict && !props.schema), {
|
|
151273
151280
|
message: 'The "strict" option only works together with "schema".'
|
|
@@ -151372,6 +151379,22 @@ var AppSchema = exports_external.object({
|
|
|
151372
151379
|
test: TestDefaultSchema
|
|
151373
151380
|
}).strict();
|
|
151374
151381
|
|
|
151382
|
+
// src/config/schema/local-entry.ts
|
|
151383
|
+
import { stat as stat4 } from "fs/promises";
|
|
151384
|
+
var LocalEntrySchema = exports_external.union([
|
|
151385
|
+
RelativePathSchema.refine(async (path2) => {
|
|
151386
|
+
try {
|
|
151387
|
+
const s2 = await stat4(path2);
|
|
151388
|
+
return s2.isFile() || s2.isDirectory();
|
|
151389
|
+
} catch (error3) {
|
|
151390
|
+
return false;
|
|
151391
|
+
}
|
|
151392
|
+
}, `File or directory doesn't exist`),
|
|
151393
|
+
exports_external.object({
|
|
151394
|
+
nocheck: RelativePathSchema.describe("Specifies a local file or directory without checking if the file or directory exists.")
|
|
151395
|
+
}).transform((v3) => v3.nocheck)
|
|
151396
|
+
]);
|
|
151397
|
+
|
|
151375
151398
|
// src/feature/cache/schema.ts
|
|
151376
151399
|
var StorageSchema = SizeSchema.refine(sizeMin(gibibytes(1)), "Minimum storage size is 1 GB").refine(sizeMax(gibibytes(5000)), "Maximum storage size is 5000 GB");
|
|
151377
151400
|
var MinimumStorageSchema = StorageSchema.describe("The lower limit for data storage the cache is set to use. You can specify a size value from 1 GB to 5000 GB.");
|
|
@@ -151453,22 +151476,6 @@ example: "5 minutes"`),
|
|
|
151453
151476
|
payload: exports_external.unknown().optional().describe("The JSON payload that will be passed to the consumer.")
|
|
151454
151477
|
})).optional().describe(`Define the cron jobs in your stack.`);
|
|
151455
151478
|
|
|
151456
|
-
// src/config/schema/local-entry.ts
|
|
151457
|
-
import { stat as stat4 } from "fs/promises";
|
|
151458
|
-
var LocalEntrySchema = exports_external.union([
|
|
151459
|
-
RelativePathSchema.refine(async (path2) => {
|
|
151460
|
-
try {
|
|
151461
|
-
const s2 = await stat4(path2);
|
|
151462
|
-
return s2.isFile() || s2.isDirectory();
|
|
151463
|
-
} catch (error3) {
|
|
151464
|
-
return false;
|
|
151465
|
-
}
|
|
151466
|
-
}, `File or directory doesn't exist`),
|
|
151467
|
-
exports_external.object({
|
|
151468
|
-
nocheck: RelativePathSchema.describe("Specifies a local file or directory without checking if the file or directory exists.")
|
|
151469
|
-
}).transform((v3) => v3.nocheck)
|
|
151470
|
-
]);
|
|
151471
|
-
|
|
151472
151479
|
// src/feature/site/schema.ts
|
|
151473
151480
|
var SitesSchema = exports_external.record(ResourceIdSchema, exports_external.object({
|
|
151474
151481
|
router: ResourceIdSchema.describe("The router id to link your site with."),
|
|
@@ -151710,6 +151717,7 @@ var StackSchema = exports_external.object({
|
|
|
151710
151717
|
pubsub: PubSubSchema,
|
|
151711
151718
|
searchs: SearchsSchema,
|
|
151712
151719
|
sites: SitesSchema,
|
|
151720
|
+
seed: LocalEntrySchema.optional().describe("The file that seeds your local dev environment with data. It runs with the full local environment on the first dev boot & through the dashboard reseed button."),
|
|
151713
151721
|
tests: TestsSchema,
|
|
151714
151722
|
images: ImagesSchema,
|
|
151715
151723
|
icons: IconsSchema,
|
|
@@ -152480,8 +152488,32 @@ var loadAppConfig = async (options) => {
|
|
|
152480
152488
|
debug("Validate app config file");
|
|
152481
152489
|
const app = await validateConfig(AppSchema, appConfig.file, appConfig.data);
|
|
152482
152490
|
app.stage = options.stage;
|
|
152491
|
+
await loadConfigFile(app, root3, options.stage);
|
|
152483
152492
|
return app;
|
|
152484
152493
|
};
|
|
152494
|
+
var loadConfigFile = async (app, root3, stage) => {
|
|
152495
|
+
const ext2 = ["config.json", "config.jsonc", "config.json5"];
|
|
152496
|
+
const files = await glob(ext2, { cwd: root3 });
|
|
152497
|
+
const file2 = ext2.find((name) => files.includes(name));
|
|
152498
|
+
if (!file2) {
|
|
152499
|
+
return;
|
|
152500
|
+
}
|
|
152501
|
+
debug("Load config file:", color2.info(file2));
|
|
152502
|
+
const config = await readConfigWithStage(join13(root3, file2), stage);
|
|
152503
|
+
const entries2 = await validateConfig(ConfigFileSchema, config.file, config.data);
|
|
152504
|
+
const defaults2 = {};
|
|
152505
|
+
const secrets = [];
|
|
152506
|
+
for (const [name, value] of Object.entries(entries2)) {
|
|
152507
|
+
if (typeof value === "string") {
|
|
152508
|
+
defaults2[name] = value;
|
|
152509
|
+
} else {
|
|
152510
|
+
secrets.push(name);
|
|
152511
|
+
}
|
|
152512
|
+
}
|
|
152513
|
+
app.configs = [...new Set([...app.configs ?? [], ...Object.keys(entries2)])].sort();
|
|
152514
|
+
app.configDefaults = defaults2;
|
|
152515
|
+
app.configSecrets = secrets;
|
|
152516
|
+
};
|
|
152485
152517
|
var loadStackConfigs = async (options) => {
|
|
152486
152518
|
debug("Load stacks config files");
|
|
152487
152519
|
const ext2 = "{json,jsonc,json5}";
|
|
@@ -153511,7 +153543,7 @@ var bundleFeature = defineFeature({
|
|
|
153511
153543
|
ctx.registerBuild("bundle", name, buildBundle({
|
|
153512
153544
|
name,
|
|
153513
153545
|
handlers,
|
|
153514
|
-
minify: defaults2.minify,
|
|
153546
|
+
minify: ctx.dev ? false : defaults2.minify,
|
|
153515
153547
|
external: [...defaults2.external ?? [], ...layerPackages]
|
|
153516
153548
|
}));
|
|
153517
153549
|
const sourceHash = new Output(envDeps, async (resolve3) => {
|
|
@@ -154769,6 +154801,9 @@ var createSsmServer = (props) => {
|
|
|
154769
154801
|
let closeServer;
|
|
154770
154802
|
let log;
|
|
154771
154803
|
const warned2 = new Set;
|
|
154804
|
+
let defaults2 = {};
|
|
154805
|
+
let pulled = {};
|
|
154806
|
+
let secrets = new Set;
|
|
154772
154807
|
const loadValues = async () => {
|
|
154773
154808
|
try {
|
|
154774
154809
|
return JSON.parse(await readFile12(props.file, "utf8"));
|
|
@@ -154780,6 +154815,11 @@ var createSsmServer = (props) => {
|
|
|
154780
154815
|
connect(logFn) {
|
|
154781
154816
|
log = logFn;
|
|
154782
154817
|
},
|
|
154818
|
+
setValues(next) {
|
|
154819
|
+
defaults2 = next.defaults;
|
|
154820
|
+
pulled = next.pulled;
|
|
154821
|
+
secrets = next.secrets;
|
|
154822
|
+
},
|
|
154783
154823
|
async listen(port = 0) {
|
|
154784
154824
|
server = createServer2((req, res) => {
|
|
154785
154825
|
const chunks = [];
|
|
@@ -154799,12 +154839,12 @@ var createSsmServer = (props) => {
|
|
|
154799
154839
|
const parameters = [];
|
|
154800
154840
|
for (const name of Names ?? []) {
|
|
154801
154841
|
const key = name.split("/").at(-1);
|
|
154802
|
-
const value = values[key];
|
|
154842
|
+
const value = values[key] ?? defaults2[key] ?? pulled[key];
|
|
154803
154843
|
if (typeof value === "string") {
|
|
154804
154844
|
parameters.push({ Name: name, Type: "SecureString", Value: value });
|
|
154805
154845
|
} else if (!warned2.has(key)) {
|
|
154806
154846
|
warned2.add(key);
|
|
154807
|
-
log?.(`The "${key}" config has no local value yet. Set it on the dashboard or in
|
|
154847
|
+
log?.(secrets.has(key) ? `The "${key}" config secret has no value - the ssm pull didn't provide one. Set it with "awsless config set ${key}" or override it on the dashboard.` : `The "${key}" config has no local value yet. Set it on the dashboard or add a default in config.jsonc`);
|
|
154808
154848
|
}
|
|
154809
154849
|
}
|
|
154810
154850
|
res.writeHead(200, { "content-type": "application/x-amz-json-1.1" });
|
|
@@ -154972,25 +155012,73 @@ var configFeature = defineFeature({
|
|
|
154972
155012
|
},
|
|
154973
155013
|
async onDev(ctx) {
|
|
154974
155014
|
const names = new Set(ctx.appConfig.configs ?? []);
|
|
155015
|
+
for (const stack of ctx.stackConfigs) {
|
|
155016
|
+
for (const props of Object.values(stack.functions ?? {})) {
|
|
155017
|
+
for (const name of props.sandbox?.configs ?? []) {
|
|
155018
|
+
names.add(name);
|
|
155019
|
+
}
|
|
155020
|
+
}
|
|
155021
|
+
for (const site of Object.values(stack.sites ?? {})) {
|
|
155022
|
+
for (const name of site.build?.configs ?? []) {
|
|
155023
|
+
names.add(name);
|
|
155024
|
+
}
|
|
155025
|
+
for (const name of site.ssr?.sandbox?.configs ?? []) {
|
|
155026
|
+
names.add(name);
|
|
155027
|
+
}
|
|
155028
|
+
}
|
|
155029
|
+
}
|
|
154975
155030
|
if (names.size === 0) {
|
|
154976
155031
|
return;
|
|
154977
155032
|
}
|
|
155033
|
+
const secrets = new Set(ctx.appConfig.configSecrets ?? []);
|
|
154978
155034
|
for (const name of names) {
|
|
154979
155035
|
ctx.addEnv(`CONFIG_${constantCase(name)}`, name);
|
|
154980
|
-
ctx.registerResource({ kind: "config", id: name });
|
|
155036
|
+
ctx.registerResource({ kind: "config", id: name, detail: secrets.has(name) ? "secret" : "" });
|
|
154981
155037
|
}
|
|
154982
155038
|
const file2 = join18(directories.output, "local", "config.json");
|
|
154983
|
-
const server =
|
|
154984
|
-
|
|
155039
|
+
const { server, port } = await ctx.keep("shim:ssm", file2, async () => {
|
|
155040
|
+
const server2 = createSsmServer({ file: file2 });
|
|
155041
|
+
const port2 = await server2.listen();
|
|
155042
|
+
return { value: { server: server2, port: port2 }, stop: () => server2.stop() };
|
|
155043
|
+
});
|
|
154985
155044
|
ctx.addEnv("AWS_ENDPOINT_URL_SSM", `http://127.0.0.1:${port}`);
|
|
155045
|
+
let pulled = {};
|
|
155046
|
+
if (secrets.size > 0) {
|
|
155047
|
+
pulled = await ctx.keep("config:pull", [...secrets].sort().join(","), async () => {
|
|
155048
|
+
const values = {};
|
|
155049
|
+
try {
|
|
155050
|
+
ctx.log(`Pulling ${secrets.size} config secret${secrets.size === 1 ? "" : "s"} from SSM...`);
|
|
155051
|
+
const credentials2 = await getCredentials(ctx.appConfig.profile);
|
|
155052
|
+
const store = new SsmStore({ credentials: credentials2, appConfig: ctx.appConfig });
|
|
155053
|
+
let timer;
|
|
155054
|
+
const all5 = await Promise.race([
|
|
155055
|
+
store.list(),
|
|
155056
|
+
new Promise((_3, reject) => {
|
|
155057
|
+
timer = setTimeout(() => reject(new Error("the pull timed out after 15s")), 15000);
|
|
155058
|
+
})
|
|
155059
|
+
]).finally(() => clearTimeout(timer));
|
|
155060
|
+
for (const name of secrets) {
|
|
155061
|
+
if (typeof all5[name] === "string") {
|
|
155062
|
+
values[name] = all5[name];
|
|
155063
|
+
}
|
|
155064
|
+
}
|
|
155065
|
+
} catch (error3) {
|
|
155066
|
+
debug("Config secret pull failed", error3);
|
|
155067
|
+
ctx.log(`Couldn't pull the config secrets from SSM (${error3 instanceof Error ? error3.message : String(error3)}) - secret-backed features will fail when called.`);
|
|
155068
|
+
}
|
|
155069
|
+
return { value: values, stop: () => {} };
|
|
155070
|
+
});
|
|
155071
|
+
}
|
|
155072
|
+
server.setValues({
|
|
155073
|
+
defaults: ctx.appConfig.configDefaults ?? {},
|
|
155074
|
+
pulled,
|
|
155075
|
+
secrets
|
|
155076
|
+
});
|
|
154986
155077
|
ctx.restartOnChange(file2);
|
|
154987
155078
|
ctx.registerServer({
|
|
154988
155079
|
name: "config",
|
|
154989
155080
|
start({ log }) {
|
|
154990
155081
|
server.connect(log);
|
|
154991
|
-
},
|
|
154992
|
-
stop() {
|
|
154993
|
-
return server.stop();
|
|
154994
155082
|
}
|
|
154995
155083
|
});
|
|
154996
155084
|
}
|
|
@@ -155945,7 +156033,7 @@ var functionFeature = defineFeature({
|
|
|
155945
156033
|
onStack(ctx) {
|
|
155946
156034
|
for (const [id, props] of Object.entries(ctx.stackConfig.functions ?? {})) {
|
|
155947
156035
|
const routeKey = formatRouteKey(ctx.stack.name, "function", id);
|
|
155948
|
-
if (!isStandaloneFunction(props)) {
|
|
156036
|
+
if (!isStandaloneFunction(props) || ctx.dev) {
|
|
155949
156037
|
registerBundleFunction(ctx, routeKey, props);
|
|
155950
156038
|
continue;
|
|
155951
156039
|
}
|
|
@@ -157405,12 +157493,15 @@ var queueFeature = defineFeature({
|
|
|
157405
157493
|
queueRoutes.set(name, formatRouteKey(stackName, "queue", id));
|
|
157406
157494
|
return { stackName, id, name };
|
|
157407
157495
|
});
|
|
157408
|
-
const server =
|
|
157409
|
-
|
|
157410
|
-
|
|
157411
|
-
|
|
157496
|
+
const { server, port } = await ctx.keep("shim:sqs", queueRoutes, async () => {
|
|
157497
|
+
const server2 = createSqsServer({
|
|
157498
|
+
region: ctx.appConfig.region,
|
|
157499
|
+
accountId: "000000000000",
|
|
157500
|
+
queues: queueRoutes
|
|
157501
|
+
});
|
|
157502
|
+
const port2 = await server2.listen();
|
|
157503
|
+
return { value: { server: server2, port: port2 }, stop: () => server2.stop() };
|
|
157412
157504
|
});
|
|
157413
|
-
const port = await server.listen();
|
|
157414
157505
|
ctx.addEnv("AWS_ENDPOINT_URL_SQS", `http://127.0.0.1:${port}`);
|
|
157415
157506
|
for (const { stackName, id, name } of named) {
|
|
157416
157507
|
ctx.addEnv(`QUEUE_${constantCase(stackName)}_${constantCase(id)}_URL`, `http://127.0.0.1:${port}/000000000000/${name}`);
|
|
@@ -157426,9 +157517,6 @@ var queueFeature = defineFeature({
|
|
|
157426
157517
|
name: "sqs",
|
|
157427
157518
|
start({ dispatch, reportFailure }) {
|
|
157428
157519
|
server.connect(dispatch, reportFailure);
|
|
157429
|
-
},
|
|
157430
|
-
stop() {
|
|
157431
|
-
return server.stop();
|
|
157432
157520
|
}
|
|
157433
157521
|
});
|
|
157434
157522
|
},
|
|
@@ -157580,6 +157668,8 @@ var formatWebEvent = (request, route, body, url, sourceIp) => {
|
|
|
157580
157668
|
headers[name] = value;
|
|
157581
157669
|
}
|
|
157582
157670
|
headers[ROUTE_HEADER] = route.routeKey;
|
|
157671
|
+
headers["cloudfront-viewer-address"] ??= `${sourceIp}:0`;
|
|
157672
|
+
headers["cloudfront-viewer-country"] ??= "US";
|
|
157583
157673
|
for (const [name, value] of Object.entries(route.params)) {
|
|
157584
157674
|
headers[`x-param-${name.toLowerCase()}`] = value;
|
|
157585
157675
|
}
|
|
@@ -157690,7 +157780,11 @@ var startDevRouter = async (props) => {
|
|
|
157690
157780
|
body: request.body,
|
|
157691
157781
|
redirect: "manual"
|
|
157692
157782
|
});
|
|
157693
|
-
return new Response(proxied.body, {
|
|
157783
|
+
return new Response(proxied.body, {
|
|
157784
|
+
status: proxied.status,
|
|
157785
|
+
statusText: proxied.statusText,
|
|
157786
|
+
headers: proxied.headers
|
|
157787
|
+
});
|
|
157694
157788
|
}
|
|
157695
157789
|
if (!route.routeKey) {
|
|
157696
157790
|
return new Response(`No route matched: ${url.pathname}`, { status: 404 });
|
|
@@ -158658,7 +158752,7 @@ var siteFeature = defineFeature({
|
|
|
158658
158752
|
});
|
|
158659
158753
|
const addRoutes = ctx.shared.entry("router", "addRoutes", props.router);
|
|
158660
158754
|
const routeKey = props.path.endsWith("/") ? `${props.path}*` : `${props.path}/*`;
|
|
158661
|
-
if (props.build) {
|
|
158755
|
+
if (props.build && !(ctx.dev && props.dev)) {
|
|
158662
158756
|
const buildProps = props.build;
|
|
158663
158757
|
ctx.registerBuild("site", name, async (build2) => {
|
|
158664
158758
|
const fingerprint = await generateCacheKey(buildProps.cacheKey);
|
|
@@ -158705,7 +158799,7 @@ ${(errors3.trim() || output.trim()).slice(-2000)}`);
|
|
|
158705
158799
|
});
|
|
158706
158800
|
});
|
|
158707
158801
|
}
|
|
158708
|
-
if (props.ssr && isStandaloneFunction(props.ssr)) {
|
|
158802
|
+
if (props.ssr && ctx.dev && props.dev) {} else if (props.ssr && isStandaloneFunction(props.ssr) && !ctx.dev) {
|
|
158709
158803
|
const fn = createLambdaFunction(ctx, `${id}-ssr`, props.ssr);
|
|
158710
158804
|
if (ctx.shared.has("router", "endpoint", props.router)) {
|
|
158711
158805
|
fn.setEnvironment(`ROUTER_${constantCase(props.router)}_ENDPOINT`, ctx.shared.entry("router", "endpoint", props.router));
|
|
@@ -158989,7 +159083,83 @@ import { toSeconds as toSeconds9 } from "@awsless/duration";
|
|
|
158989
159083
|
import { CreateTableCommand as CreateTableCommand2, DeleteTableCommand } from "@aws-sdk/client-dynamodb";
|
|
158990
159084
|
import { PutCommand } from "@aws-sdk/lib-dynamodb";
|
|
158991
159085
|
import { readFile as readFile15 } from "fs/promises";
|
|
159086
|
+
import { join as join37 } from "path";
|
|
159087
|
+
|
|
159088
|
+
// src/dev/reset.ts
|
|
159089
|
+
var import_ioredis4 = __toESM(require_built3(), 1);
|
|
159090
|
+
import { DeleteCommand, ScanCommand } from "@aws-sdk/lib-dynamodb";
|
|
159091
|
+
import { Client as Client6 } from "@opensearch-project/opensearch";
|
|
159092
|
+
import { readdir as readdir6, rm as rm9 } from "fs/promises";
|
|
158992
159093
|
import { join as join36 } from "path";
|
|
159094
|
+
var wiping = false;
|
|
159095
|
+
var isWiping = () => wiping;
|
|
159096
|
+
var createDataReset = (props) => {
|
|
159097
|
+
return async () => {
|
|
159098
|
+
wiping = true;
|
|
159099
|
+
try {
|
|
159100
|
+
const dynamo = props.pool.peek("dynamo");
|
|
159101
|
+
if (dynamo) {
|
|
159102
|
+
const client = dynamo.server.getDocumentClient();
|
|
159103
|
+
for (const [name, fingerprint] of dynamo.tableFingerprints) {
|
|
159104
|
+
const keys = JSON.parse(fingerprint).KeySchema.map((key) => key.AttributeName);
|
|
159105
|
+
let cursor;
|
|
159106
|
+
do {
|
|
159107
|
+
const result = await client.send(new ScanCommand({ TableName: name, ExclusiveStartKey: cursor }));
|
|
159108
|
+
for (const item of result.Items ?? []) {
|
|
159109
|
+
await client.send(new DeleteCommand({
|
|
159110
|
+
TableName: name,
|
|
159111
|
+
Key: Object.fromEntries(keys.map((key) => [key, item[key]]))
|
|
159112
|
+
}));
|
|
159113
|
+
}
|
|
159114
|
+
cursor = result.LastEvaluatedKey;
|
|
159115
|
+
} while (cursor);
|
|
159116
|
+
}
|
|
159117
|
+
}
|
|
159118
|
+
for (const stack of props.stackConfigs) {
|
|
159119
|
+
for (const id of Object.keys(stack.caches ?? {})) {
|
|
159120
|
+
const port = props.pool.peek(`cache:${stack.name}:${id}`);
|
|
159121
|
+
if (!port) {
|
|
159122
|
+
continue;
|
|
159123
|
+
}
|
|
159124
|
+
const redis = new import_ioredis4.Redis({ host: "127.0.0.1", port, lazyConnect: true });
|
|
159125
|
+
await redis.connect();
|
|
159126
|
+
await redis.flushall();
|
|
159127
|
+
redis.disconnect();
|
|
159128
|
+
}
|
|
159129
|
+
}
|
|
159130
|
+
const search2 = props.pool.peek("opensearch");
|
|
159131
|
+
if (search2) {
|
|
159132
|
+
const client = new Client6({ node: `http://localhost:${search2.port}` });
|
|
159133
|
+
for (const stack of props.stackConfigs) {
|
|
159134
|
+
for (const [id, searchProps] of Object.entries(stack.searchs ?? {})) {
|
|
159135
|
+
const index = formatSearchIndexName(stack.name, id);
|
|
159136
|
+
try {
|
|
159137
|
+
await client.indices.delete({ index });
|
|
159138
|
+
} catch (_3) {}
|
|
159139
|
+
await applySearchIndex(client, {
|
|
159140
|
+
index,
|
|
159141
|
+
mappings: resolveSearchMappings(searchProps),
|
|
159142
|
+
settings: searchProps.settings
|
|
159143
|
+
});
|
|
159144
|
+
}
|
|
159145
|
+
}
|
|
159146
|
+
}
|
|
159147
|
+
const storeRoot = join36(directories.output, "local", "store");
|
|
159148
|
+
try {
|
|
159149
|
+
for (const bucket of await readdir6(storeRoot)) {
|
|
159150
|
+
for (const entry of await readdir6(join36(storeRoot, bucket))) {
|
|
159151
|
+
if (entry === "image" || entry === "icon") {
|
|
159152
|
+
continue;
|
|
159153
|
+
}
|
|
159154
|
+
await rm9(join36(storeRoot, bucket, entry), { recursive: true, force: true });
|
|
159155
|
+
}
|
|
159156
|
+
}
|
|
159157
|
+
} catch (_3) {}
|
|
159158
|
+
} finally {
|
|
159159
|
+
wiping = false;
|
|
159160
|
+
}
|
|
159161
|
+
};
|
|
159162
|
+
};
|
|
158993
159163
|
|
|
158994
159164
|
// src/feature/table/util.ts
|
|
158995
159165
|
var formatTableKeys = (props) => {
|
|
@@ -159049,7 +159219,7 @@ var createTableInput = (name, props) => {
|
|
|
159049
159219
|
};
|
|
159050
159220
|
};
|
|
159051
159221
|
var loadSeed = async (stackName, id) => {
|
|
159052
|
-
const file2 =
|
|
159222
|
+
const file2 = join37(directories.output, "local", "seed", "table", stackName, `${id}.json`);
|
|
159053
159223
|
try {
|
|
159054
159224
|
const items = JSON.parse(await readFile15(file2, "utf8"));
|
|
159055
159225
|
return Array.isArray(items) ? items : [];
|
|
@@ -159123,6 +159293,9 @@ var tableOnDev = async (ctx) => {
|
|
|
159123
159293
|
const routeKey = formatRouteKey(stackName, "table", id);
|
|
159124
159294
|
const eventSourceARN = `arn:aws:dynamodb:${ctx.appConfig.region}:000000000000:table/${name}/stream/local`;
|
|
159125
159295
|
const unsubscribe = server.onStreamRecord(name, (record) => {
|
|
159296
|
+
if (isWiping()) {
|
|
159297
|
+
return;
|
|
159298
|
+
}
|
|
159126
159299
|
const event = { Records: [{ ...record, eventSourceARN }] };
|
|
159127
159300
|
dispatch(event).catch((error3) => {
|
|
159128
159301
|
reportFailure({
|
|
@@ -159168,7 +159341,7 @@ var tableFeature = defineFeature({
|
|
|
159168
159341
|
const sort2 = props.sort ? typeValue(props.sort) : "undefined";
|
|
159169
159342
|
const indexes = props.indexes && Object.keys(props.indexes).length > 0 ? `{ ${Object.entries(props.indexes).map(([indexName, index]) => {
|
|
159170
159343
|
const indexSort = index.sort ? `; sort: ${typeValue(index.sort)}` : "";
|
|
159171
|
-
return
|
|
159344
|
+
return `'${indexName}': { hash: ${typeValue(index.hash)}${indexSort} }`;
|
|
159172
159345
|
}).join("; ")} }` : "undefined";
|
|
159173
159346
|
list2.addType(name, `{
|
|
159174
159347
|
readonly name: '${tableName}'
|
|
@@ -159415,16 +159588,16 @@ var taskFeature = defineFeature({
|
|
|
159415
159588
|
routeKey: formatRouteKey(stackName, "task", id)
|
|
159416
159589
|
});
|
|
159417
159590
|
}
|
|
159418
|
-
const server =
|
|
159419
|
-
|
|
159591
|
+
const { server, port } = await ctx.keep("shim:scheduler", null, async () => {
|
|
159592
|
+
const server2 = createSchedulerServer();
|
|
159593
|
+
const port2 = await server2.listen();
|
|
159594
|
+
return { value: { server: server2, port: port2 }, stop: () => server2.stop() };
|
|
159595
|
+
});
|
|
159420
159596
|
ctx.addEnv("AWS_ENDPOINT_URL_SCHEDULER", `http://127.0.0.1:${port}`);
|
|
159421
159597
|
ctx.registerServer({
|
|
159422
159598
|
name: "scheduler",
|
|
159423
159599
|
start({ dispatch, reportFailure }) {
|
|
159424
159600
|
server.connect(dispatch, reportFailure);
|
|
159425
|
-
},
|
|
159426
|
-
stop() {
|
|
159427
|
-
return server.stop();
|
|
159428
159601
|
}
|
|
159429
159602
|
});
|
|
159430
159603
|
},
|
|
@@ -159608,16 +159781,16 @@ var topicFeature = defineFeature({
|
|
|
159608
159781
|
});
|
|
159609
159782
|
}
|
|
159610
159783
|
}
|
|
159611
|
-
const server =
|
|
159612
|
-
|
|
159784
|
+
const { server, port } = await ctx.keep("shim:sns", null, async () => {
|
|
159785
|
+
const server2 = createSnsServer();
|
|
159786
|
+
const port2 = await server2.listen();
|
|
159787
|
+
return { value: { server: server2, port: port2 }, stop: () => server2.stop() };
|
|
159788
|
+
});
|
|
159613
159789
|
ctx.addEnv("AWS_ENDPOINT_URL_SNS", `http://127.0.0.1:${port}`);
|
|
159614
159790
|
ctx.registerServer({
|
|
159615
159791
|
name: "sns",
|
|
159616
159792
|
start({ dispatch, reportFailure }) {
|
|
159617
159793
|
server.connect(dispatch, reportFailure);
|
|
159618
|
-
},
|
|
159619
|
-
stop() {
|
|
159620
|
-
return server.stop();
|
|
159621
159794
|
}
|
|
159622
159795
|
});
|
|
159623
159796
|
},
|
|
@@ -159959,12 +160132,12 @@ import { toDays as toDays9 } from "@awsless/duration";
|
|
|
159959
160132
|
import { formatRouteEnvName as formatRouteEnvName5 } from "awsless";
|
|
159960
160133
|
import { createHash as createHash18 } from "crypto";
|
|
159961
160134
|
import { readFile as readFile16 } from "fs/promises";
|
|
159962
|
-
import { dirname as dirname18, join as
|
|
160135
|
+
import { dirname as dirname18, join as join39 } from "path";
|
|
159963
160136
|
import { fileURLToPath as fileURLToPath13 } from "url";
|
|
159964
160137
|
|
|
159965
160138
|
// src/feature/image/dev.ts
|
|
159966
160139
|
import { cp } from "fs/promises";
|
|
159967
|
-
import { isAbsolute as isAbsolute2, join as
|
|
160140
|
+
import { isAbsolute as isAbsolute2, join as join38 } from "path";
|
|
159968
160141
|
var imageOnDev = async (ctx) => {
|
|
159969
160142
|
const images = ctx.stackConfigs.flatMap((stack) => Object.keys(stack.images ?? {}));
|
|
159970
160143
|
if (images.length === 0) {
|
|
@@ -160002,8 +160175,8 @@ var imageOnDev = async (ctx) => {
|
|
|
160002
160175
|
}
|
|
160003
160176
|
if (props.origin.static) {
|
|
160004
160177
|
ctx.addEnv(`${routeKey}:IMAGE_ORIGIN_S3`, "true");
|
|
160005
|
-
const source = isAbsolute2(props.origin.static) ? props.origin.static :
|
|
160006
|
-
await cp(source,
|
|
160178
|
+
const source = isAbsolute2(props.origin.static) ? props.origin.static : join38(directories.root, props.origin.static);
|
|
160179
|
+
await cp(source, join38(directories.output, "local", "store", bucket, folder, "origin"), {
|
|
160007
160180
|
recursive: true
|
|
160008
160181
|
});
|
|
160009
160182
|
}
|
|
@@ -160033,7 +160206,7 @@ var imageFeature = defineFeature({
|
|
|
160033
160206
|
throw new FileError("app.json", "The image feature requires an arm64 function bundle.");
|
|
160034
160207
|
}
|
|
160035
160208
|
const group4 = new Group(ctx.base, "image", "layer");
|
|
160036
|
-
const path6 =
|
|
160209
|
+
const path6 = join39(dirname18(fileURLToPath13(import.meta.url)), "/layers/sharp-arm.zip");
|
|
160037
160210
|
const layerId = formatGlobalResourceName({
|
|
160038
160211
|
appName: ctx.appConfig.name,
|
|
160039
160212
|
resourceType: "layer",
|
|
@@ -160113,7 +160286,7 @@ var imageFeature = defineFeature({
|
|
|
160113
160286
|
const serverRouteKey = formatRouteKey(ctx.stack.name, "image", id);
|
|
160114
160287
|
bundle.addHandler({
|
|
160115
160288
|
routeKey: serverRouteKey,
|
|
160116
|
-
file:
|
|
160289
|
+
file: join39(dirname18(fileURLToPath13(import.meta.url)), "/handlers/image.js"),
|
|
160117
160290
|
exportName: "default",
|
|
160118
160291
|
external: ["sharp"]
|
|
160119
160292
|
});
|
|
@@ -160151,8 +160324,8 @@ var imageFeature = defineFeature({
|
|
|
160151
160324
|
new aws2.s3.BucketObject(group4, `static-${file2}`, {
|
|
160152
160325
|
bucket: bucket.name,
|
|
160153
160326
|
key: `${folder}origin/${file2}`,
|
|
160154
|
-
source:
|
|
160155
|
-
sourceHash: $hash(
|
|
160327
|
+
source: join39(props.origin.static, file2),
|
|
160328
|
+
sourceHash: $hash(join39(props.origin.static, file2))
|
|
160156
160329
|
}, {
|
|
160157
160330
|
replaceOnChanges: ["bucket", "key"]
|
|
160158
160331
|
});
|
|
@@ -160168,12 +160341,12 @@ var imageFeature = defineFeature({
|
|
|
160168
160341
|
// src/feature/icon/index.ts
|
|
160169
160342
|
import { toDays as toDays10 } from "@awsless/duration";
|
|
160170
160343
|
import { formatRouteEnvName as formatRouteEnvName6 } from "awsless";
|
|
160171
|
-
import { dirname as dirname19, join as
|
|
160344
|
+
import { dirname as dirname19, join as join41 } from "path";
|
|
160172
160345
|
import { fileURLToPath as fileURLToPath14 } from "url";
|
|
160173
160346
|
|
|
160174
160347
|
// src/feature/icon/dev.ts
|
|
160175
160348
|
import { cp as cp2 } from "fs/promises";
|
|
160176
|
-
import { isAbsolute as isAbsolute3, join as
|
|
160349
|
+
import { isAbsolute as isAbsolute3, join as join40 } from "path";
|
|
160177
160350
|
var iconOnDev = async (ctx) => {
|
|
160178
160351
|
const icons = ctx.stackConfigs.flatMap((stack) => Object.keys(stack.icons ?? {}));
|
|
160179
160352
|
if (icons.length === 0) {
|
|
@@ -160211,8 +160384,8 @@ var iconOnDev = async (ctx) => {
|
|
|
160211
160384
|
}
|
|
160212
160385
|
if (props.origin.static) {
|
|
160213
160386
|
ctx.addEnv(`${routeKey}:ICON_ORIGIN_S3`, "true");
|
|
160214
|
-
const source = isAbsolute3(props.origin.static) ? props.origin.static :
|
|
160215
|
-
await cp2(source,
|
|
160387
|
+
const source = isAbsolute3(props.origin.static) ? props.origin.static : join40(directories.root, props.origin.static);
|
|
160388
|
+
await cp2(source, join40(directories.output, "local", "store", bucket, folder, "origin"), {
|
|
160216
160389
|
recursive: true
|
|
160217
160390
|
});
|
|
160218
160391
|
}
|
|
@@ -160259,7 +160432,7 @@ var iconFeature = defineFeature({
|
|
|
160259
160432
|
const serverRouteKey = formatRouteKey(ctx.stack.name, "icon", id);
|
|
160260
160433
|
bundle.addHandler({
|
|
160261
160434
|
routeKey: serverRouteKey,
|
|
160262
|
-
file:
|
|
160435
|
+
file: join41(dirname19(fileURLToPath14(import.meta.url)), "/handlers/icon.js"),
|
|
160263
160436
|
exportName: "default"
|
|
160264
160437
|
});
|
|
160265
160438
|
addRoutes({
|
|
@@ -160299,8 +160472,8 @@ var iconFeature = defineFeature({
|
|
|
160299
160472
|
new aws2.s3.BucketObject(group4, `static-${file2}`, {
|
|
160300
160473
|
bucket: bucket.name,
|
|
160301
160474
|
key: `${folder}origin/${file2}`,
|
|
160302
|
-
source:
|
|
160303
|
-
sourceHash: $hash(
|
|
160475
|
+
source: join41(props.origin.static, file2),
|
|
160476
|
+
sourceHash: $hash(join41(props.origin.static, file2))
|
|
160304
160477
|
}, {
|
|
160305
160478
|
replaceOnChanges: ["bucket", "key"]
|
|
160306
160479
|
});
|
|
@@ -160327,10 +160500,10 @@ var import_deepmerge4 = __toESM(require_cjs2(), 1);
|
|
|
160327
160500
|
// src/feature/job/build/executable.ts
|
|
160328
160501
|
import { createHash as createHash19 } from "crypto";
|
|
160329
160502
|
import { readFile as readFile17, writeFile as writeFile8 } from "fs/promises";
|
|
160330
|
-
import { join as
|
|
160503
|
+
import { join as join42, resolve as resolve4 } from "path";
|
|
160331
160504
|
var buildJobExecutable = async (input, outputPath, architecture) => {
|
|
160332
|
-
const filePath =
|
|
160333
|
-
const wrapperPath =
|
|
160505
|
+
const filePath = join42(outputPath, "program");
|
|
160506
|
+
const wrapperPath = join42(outputPath, "wrapper.ts");
|
|
160334
160507
|
const handlerPath = resolve4(input);
|
|
160335
160508
|
await writeFile8(wrapperPath, `import { parse } from '@awsless/json'
|
|
160336
160509
|
import { getObject } from '@awsless/s3'
|
|
@@ -160843,7 +161016,7 @@ import { stringify as stringify3 } from "@awsless/json";
|
|
|
160843
161016
|
import { generateFileHash as generateFileHash4 } from "@awsless/ts-file-cache";
|
|
160844
161017
|
var import_deepmerge6 = __toESM(require_cjs2(), 1);
|
|
160845
161018
|
import { createHash as createHash21 } from "crypto";
|
|
160846
|
-
import { join as
|
|
161019
|
+
import { join as join43 } from "path";
|
|
160847
161020
|
var createFargateTask = (parentGroup, ctx, ns, id, local) => {
|
|
160848
161021
|
const group4 = new Group(parentGroup, "instance", ns);
|
|
160849
161022
|
const name = formatLocalResourceName({
|
|
@@ -161048,7 +161221,7 @@ var createFargateTask = (parentGroup, ctx, ns, id, local) => {
|
|
|
161048
161221
|
healthCheck: props.healthCheck ? {
|
|
161049
161222
|
command: [
|
|
161050
161223
|
"CMD-SHELL",
|
|
161051
|
-
`curl -f http://${
|
|
161224
|
+
`curl -f http://${join43("localhost", props.healthCheck.path)} || exit 1`
|
|
161052
161225
|
],
|
|
161053
161226
|
interval: toSeconds11(props.healthCheck.interval),
|
|
161054
161227
|
retries: props.healthCheck.retries,
|
|
@@ -163191,6 +163364,7 @@ var createApp = (props) => {
|
|
|
163191
163364
|
feature.onBefore?.({
|
|
163192
163365
|
...props,
|
|
163193
163366
|
import: props.import ?? false,
|
|
163367
|
+
dev: props.dev ?? false,
|
|
163194
163368
|
app,
|
|
163195
163369
|
appId,
|
|
163196
163370
|
base,
|
|
@@ -163205,6 +163379,7 @@ var createApp = (props) => {
|
|
|
163205
163379
|
feature.onApp?.({
|
|
163206
163380
|
...props,
|
|
163207
163381
|
import: props.import ?? false,
|
|
163382
|
+
dev: props.dev ?? false,
|
|
163208
163383
|
app,
|
|
163209
163384
|
appId,
|
|
163210
163385
|
base,
|
|
@@ -163266,6 +163441,7 @@ var createApp = (props) => {
|
|
|
163266
163441
|
feature.onStack?.({
|
|
163267
163442
|
...props,
|
|
163268
163443
|
import: props.import ?? false,
|
|
163444
|
+
dev: props.dev ?? false,
|
|
163269
163445
|
stackConfig,
|
|
163270
163446
|
app,
|
|
163271
163447
|
appId,
|
|
@@ -163803,12 +163979,12 @@ import { DynamoDBClient as DynamoDBClient3 } from "@awsless/dynamodb";
|
|
|
163803
163979
|
// src/cli/ui/complex/run-tests.ts
|
|
163804
163980
|
var import_wildstring3 = __toESM(require_wildstring(), 1);
|
|
163805
163981
|
import { mkdir as mkdir7, readFile as readFile18, writeFile as writeFile9 } from "fs/promises";
|
|
163806
|
-
import { join as
|
|
163982
|
+
import { join as join45 } from "path";
|
|
163807
163983
|
import { parse as parse7, stringify as stringify4 } from "@awsless/json";
|
|
163808
163984
|
import { generateFolderHash, loadWorkspace as loadWorkspace2 } from "@awsless/ts-file-cache";
|
|
163809
163985
|
|
|
163810
163986
|
// src/test/start.ts
|
|
163811
|
-
import { dirname as dirname20, join as
|
|
163987
|
+
import { dirname as dirname20, join as join44 } from "path";
|
|
163812
163988
|
import { fileURLToPath as fileURLToPath15 } from "url";
|
|
163813
163989
|
import { configDefaults } from "vitest/config";
|
|
163814
163990
|
import { startVitest } from "vitest/node";
|
|
@@ -163876,7 +164052,7 @@ var startTest = async (props) => {
|
|
|
163876
164052
|
reporters: [new NullReporter],
|
|
163877
164053
|
env: props.env,
|
|
163878
164054
|
setupFiles: [
|
|
163879
|
-
|
|
164055
|
+
join44(__dirname4, "test-global-setup.js")
|
|
163880
164056
|
]
|
|
163881
164057
|
}, {
|
|
163882
164058
|
logLevel: "silent",
|
|
@@ -164032,7 +164208,7 @@ var logTestErrors = (event) => {
|
|
|
164032
164208
|
};
|
|
164033
164209
|
var runTest = async (stack, dir, filters, workspace, opts) => {
|
|
164034
164210
|
await mkdir7(directories.test, { recursive: true });
|
|
164035
|
-
const file2 =
|
|
164211
|
+
const file2 = join45(directories.test, `${stack}.json`);
|
|
164036
164212
|
const fingerprint = await generateFolderHash(workspace, dir);
|
|
164037
164213
|
if (!process.env.NO_CACHE) {
|
|
164038
164214
|
const exists5 = await fileExist(file2);
|
|
@@ -164905,12 +165081,12 @@ var auth = (program3) => {
|
|
|
164905
165081
|
|
|
164906
165082
|
// src/cli/command/bind.ts
|
|
164907
165083
|
import { readFile as readFile19 } from "fs/promises";
|
|
164908
|
-
import { join as
|
|
165084
|
+
import { join as join46 } from "path";
|
|
164909
165085
|
var bind = (program3) => {
|
|
164910
165086
|
program3.command("bind").argument("[command...]", "The command to execute").option("--config <string...>", "List of config values that will be accessable", (v3) => v3.split(",")).option("--local", "Bind against the running local dev environment instead of the deployed app").description(`Bind your site environment variables to a command`).action(async (commands5 = [], opts) => {
|
|
164911
165087
|
await layout("bind", async ({ appConfig, stackConfigs }) => {
|
|
164912
165088
|
if (opts.local) {
|
|
164913
|
-
const file2 =
|
|
165089
|
+
const file2 = join46(directories.output, "local", "env.json");
|
|
164914
165090
|
let env5;
|
|
164915
165091
|
try {
|
|
164916
165092
|
env5 = JSON.parse(await readFile19(file2, "utf8"));
|
|
@@ -165044,7 +165220,7 @@ var {
|
|
|
165044
165220
|
isIBMi
|
|
165045
165221
|
} = require_constants7();
|
|
165046
165222
|
var stat7 = promisify2(fs5.stat);
|
|
165047
|
-
var
|
|
165223
|
+
var readdir7 = promisify2(fs5.readdir);
|
|
165048
165224
|
var arrify = (value = []) => Array.isArray(value) ? value : [value];
|
|
165049
165225
|
var flatten = (list3, result = []) => {
|
|
165050
165226
|
list3.forEach((item) => {
|
|
@@ -165116,7 +165292,7 @@ class DirEntry {
|
|
|
165116
165292
|
return;
|
|
165117
165293
|
const dir = this.path;
|
|
165118
165294
|
try {
|
|
165119
|
-
await
|
|
165295
|
+
await readdir7(dir);
|
|
165120
165296
|
} catch (err) {
|
|
165121
165297
|
if (this._removeWatcher) {
|
|
165122
165298
|
this._removeWatcher(sysPath.dirname(dir), sysPath.basename(dir));
|
|
@@ -165683,7 +165859,7 @@ var watchConfig = async (options, resolve5, reject) => {
|
|
|
165683
165859
|
await loadAppConfig(options);
|
|
165684
165860
|
debug("Start watching...");
|
|
165685
165861
|
const ext2 = "{json,jsonc,json5}";
|
|
165686
|
-
const watcher = $watch([`app.${ext2}`, `**/stack.${ext2}`, `**/*.stack.${ext2}`], {
|
|
165862
|
+
const watcher = $watch([`app.${ext2}`, `config.${ext2}`, `**/stack.${ext2}`, `**/*.stack.${ext2}`], {
|
|
165687
165863
|
cwd: directories.root,
|
|
165688
165864
|
ignored: ["**/node_modules/**", "**/dist/**"],
|
|
165689
165865
|
awaitWriteFinish: true
|
|
@@ -165703,18 +165879,18 @@ var watchConfig = async (options, resolve5, reject) => {
|
|
|
165703
165879
|
|
|
165704
165880
|
// src/dev/index.ts
|
|
165705
165881
|
import { loadWorkspace as loadWorkspace3 } from "@awsless/ts-file-cache";
|
|
165706
|
-
import { mkdir as mkdir10, rm as
|
|
165707
|
-
import { join as
|
|
165882
|
+
import { mkdir as mkdir10, rm as rm12, writeFile as writeFile13 } from "fs/promises";
|
|
165883
|
+
import { join as join53 } from "path";
|
|
165708
165884
|
|
|
165709
165885
|
// src/dev/context.ts
|
|
165710
165886
|
import { DynamoDBServer } from "@awsless/dynamodb-server";
|
|
165711
|
-
import { join as
|
|
165887
|
+
import { join as join48 } from "path";
|
|
165712
165888
|
|
|
165713
165889
|
// src/dev/servers/s3.ts
|
|
165714
165890
|
import { createHash as createHash22 } from "crypto";
|
|
165715
165891
|
import { createServer as createServer7 } from "http";
|
|
165716
|
-
import { mkdir as mkdir8, readdir as
|
|
165717
|
-
import { dirname as dirname21, join as
|
|
165892
|
+
import { mkdir as mkdir8, readdir as readdir8, readFile as readFile20, rm as rm10, stat as stat8, writeFile as writeFile10 } from "fs/promises";
|
|
165893
|
+
import { dirname as dirname21, join as join47, relative as relative9, sep as sep4 } from "path";
|
|
165718
165894
|
var readBody2 = (req) => {
|
|
165719
165895
|
return new Promise((resolve5, reject) => {
|
|
165720
165896
|
const chunks = [];
|
|
@@ -165784,8 +165960,8 @@ var createS3Server = (props) => {
|
|
|
165784
165960
|
res.end(xmlError("InvalidRequest", "Missing bucket name"));
|
|
165785
165961
|
return;
|
|
165786
165962
|
}
|
|
165787
|
-
const bucketDir =
|
|
165788
|
-
const file2 =
|
|
165963
|
+
const bucketDir = join47(props.root, bucket);
|
|
165964
|
+
const file2 = join47(bucketDir, ...keyParts);
|
|
165789
165965
|
if (relative9(bucketDir, file2).startsWith("..")) {
|
|
165790
165966
|
res.writeHead(400, { "content-type": "application/xml" });
|
|
165791
165967
|
res.end(xmlError("InvalidRequest", "Invalid object key"));
|
|
@@ -165797,12 +165973,12 @@ var createS3Server = (props) => {
|
|
|
165797
165973
|
const walk2 = async (dir) => {
|
|
165798
165974
|
let entries2;
|
|
165799
165975
|
try {
|
|
165800
|
-
entries2 = await
|
|
165976
|
+
entries2 = await readdir8(dir, { withFileTypes: true });
|
|
165801
165977
|
} catch (_4) {
|
|
165802
165978
|
return;
|
|
165803
165979
|
}
|
|
165804
165980
|
for (const entry of entries2) {
|
|
165805
|
-
const path6 =
|
|
165981
|
+
const path6 = join47(dir, entry.name);
|
|
165806
165982
|
if (entry.isDirectory()) {
|
|
165807
165983
|
await walk2(path6);
|
|
165808
165984
|
} else {
|
|
@@ -165853,7 +166029,7 @@ var createS3Server = (props) => {
|
|
|
165853
166029
|
return;
|
|
165854
166030
|
}
|
|
165855
166031
|
if (req.method === "DELETE") {
|
|
165856
|
-
await
|
|
166032
|
+
await rm10(file2, { force: true });
|
|
165857
166033
|
res.writeHead(204);
|
|
165858
166034
|
res.end();
|
|
165859
166035
|
notify("ObjectRemoved:Delete", bucket, key, 0, "");
|
|
@@ -165941,7 +166117,7 @@ var createDevContext = (props) => {
|
|
|
165941
166117
|
const value = await props.pool.keep("store", null, async () => {
|
|
165942
166118
|
const rules = [];
|
|
165943
166119
|
const server = createS3Server({
|
|
165944
|
-
root:
|
|
166120
|
+
root: join48(directories.output, "local", "store"),
|
|
165945
166121
|
region: props.appConfig.region,
|
|
165946
166122
|
rules
|
|
165947
166123
|
});
|
|
@@ -166010,19 +166186,67 @@ var createDevContext = (props) => {
|
|
|
166010
166186
|
};
|
|
166011
166187
|
};
|
|
166012
166188
|
|
|
166189
|
+
// src/dev/seed.ts
|
|
166190
|
+
import { spawn as spawn5 } from "child_process";
|
|
166191
|
+
import { isAbsolute as isAbsolute4, join as join49 } from "path";
|
|
166192
|
+
var createSeedRunner = (props) => {
|
|
166193
|
+
const seeds = props.stackConfigs.filter((stack) => stack.seed).map((stack) => ({
|
|
166194
|
+
name: stack.name,
|
|
166195
|
+
file: isAbsolute4(stack.seed) ? stack.seed : join49(directories.root, stack.seed)
|
|
166196
|
+
}));
|
|
166197
|
+
let running;
|
|
166198
|
+
const run = () => {
|
|
166199
|
+
running ??= (async () => {
|
|
166200
|
+
try {
|
|
166201
|
+
for (const entry of seeds) {
|
|
166202
|
+
debug(`Seeding the ${entry.name} stack`);
|
|
166203
|
+
await new Promise((resolve5, reject) => {
|
|
166204
|
+
const child = spawn5("bun", [entry.file], {
|
|
166205
|
+
cwd: directories.root,
|
|
166206
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
166207
|
+
env: { ...process.env, ...props.env }
|
|
166208
|
+
});
|
|
166209
|
+
const output = [];
|
|
166210
|
+
const capture = (chunk3) => output.push(chunk3.toString());
|
|
166211
|
+
child.stdout?.on("data", capture);
|
|
166212
|
+
child.stderr?.on("data", capture);
|
|
166213
|
+
child.on("error", reject);
|
|
166214
|
+
child.on("exit", (code) => {
|
|
166215
|
+
const logs = output.join("").trim();
|
|
166216
|
+
if (logs) {
|
|
166217
|
+
debug(logs);
|
|
166218
|
+
}
|
|
166219
|
+
if (code === 0) {
|
|
166220
|
+
resolve5();
|
|
166221
|
+
} else {
|
|
166222
|
+
reject(new Error(`The seed of the "${entry.name}" stack exited with code ${code}:
|
|
166223
|
+
${logs}`));
|
|
166224
|
+
}
|
|
166225
|
+
});
|
|
166226
|
+
});
|
|
166227
|
+
}
|
|
166228
|
+
} finally {
|
|
166229
|
+
running = undefined;
|
|
166230
|
+
}
|
|
166231
|
+
})();
|
|
166232
|
+
return running;
|
|
166233
|
+
};
|
|
166234
|
+
return { count: seeds.length, run };
|
|
166235
|
+
};
|
|
166236
|
+
|
|
166013
166237
|
// src/dev/dashboard/index.ts
|
|
166014
|
-
var
|
|
166238
|
+
var import_ioredis5 = __toESM(require_built3(), 1);
|
|
166015
166239
|
import { DynamoDBClient as DynamoDBClient4 } from "@aws-sdk/client-dynamodb";
|
|
166016
|
-
import { DynamoDBDocumentClient, ScanCommand } from "@aws-sdk/lib-dynamodb";
|
|
166240
|
+
import { DynamoDBDocumentClient, ScanCommand as ScanCommand2 } from "@aws-sdk/lib-dynamodb";
|
|
166017
166241
|
import { randomUUID as randomUUID5 } from "crypto";
|
|
166018
|
-
import { readdir as
|
|
166242
|
+
import { readdir as readdir9, readFile as readFile21, stat as stat9, writeFile as writeFile12 } from "fs/promises";
|
|
166019
166243
|
import { createServer as createServer8 } from "http";
|
|
166020
|
-
import { join as
|
|
166244
|
+
import { join as join51, relative as relative10, sep as sep5 } from "path";
|
|
166021
166245
|
|
|
166022
166246
|
// src/dev/worker.ts
|
|
166023
|
-
import { spawn as
|
|
166247
|
+
import { spawn as spawn6 } from "child_process";
|
|
166024
166248
|
import { writeFile as writeFile11 } from "fs/promises";
|
|
166025
|
-
import { join as
|
|
166249
|
+
import { join as join50 } from "path";
|
|
166026
166250
|
class WorkerError extends Error {
|
|
166027
166251
|
name;
|
|
166028
166252
|
constructor(name, message4, stack) {
|
|
@@ -166115,10 +166339,10 @@ var createBundleWorker = (props) => {
|
|
|
166115
166339
|
throw new Error("The bundle worker never became ready.");
|
|
166116
166340
|
};
|
|
166117
166341
|
const start = async () => {
|
|
166118
|
-
const entry =
|
|
166342
|
+
const entry = join50(props.buildDir, "worker.mjs");
|
|
166119
166343
|
await writeFile11(entry, WORKER_ENTRY);
|
|
166120
166344
|
port = await findFreePort();
|
|
166121
|
-
child =
|
|
166345
|
+
child = spawn6("node", ["--enable-source-maps", entry], {
|
|
166122
166346
|
cwd: props.buildDir,
|
|
166123
166347
|
stdio: ["ignore", "pipe", "pipe"],
|
|
166124
166348
|
env: {
|
|
@@ -166273,6 +166497,8 @@ var dashboardHtml = `<!doctype html>
|
|
|
166273
166497
|
cursor: pointer;
|
|
166274
166498
|
}
|
|
166275
166499
|
nav button .count { margin-left: auto; }
|
|
166500
|
+
nav button.reseed { margin-top: auto; color: var(--muted); }
|
|
166501
|
+
nav button.reseed:disabled { cursor: default; }
|
|
166276
166502
|
.icon {
|
|
166277
166503
|
width: 15px;
|
|
166278
166504
|
height: 15px;
|
|
@@ -166322,12 +166548,16 @@ var dashboardHtml = `<!doctype html>
|
|
|
166322
166548
|
.filters input { flex: 1; }
|
|
166323
166549
|
.filters input::placeholder { color: var(--muted); }
|
|
166324
166550
|
.filters .count { color: var(--muted); align-self: center; white-space: nowrap; }
|
|
166325
|
-
|
|
166551
|
+
/* The stack & name columns share one grid across every row, so the
|
|
166552
|
+
names line up no matter how long each stack name is. */
|
|
166553
|
+
.rows { display: grid; grid-template-columns: fit-content(280px) 1fr auto; }
|
|
166554
|
+
.rows > .empty { grid-column: 1 / -1; }
|
|
166326
166555
|
.row {
|
|
166327
|
-
display:
|
|
166556
|
+
display: grid;
|
|
166557
|
+
grid-template-columns: subgrid;
|
|
166558
|
+
grid-column: 1 / -1;
|
|
166328
166559
|
gap: 12px;
|
|
166329
166560
|
align-items: baseline;
|
|
166330
|
-
width: 100%;
|
|
166331
166561
|
text-align: left;
|
|
166332
166562
|
background: none;
|
|
166333
166563
|
border: none;
|
|
@@ -166345,14 +166575,20 @@ var dashboardHtml = `<!doctype html>
|
|
|
166345
166575
|
text-overflow: ellipsis;
|
|
166346
166576
|
white-space: nowrap;
|
|
166347
166577
|
}
|
|
166348
|
-
.row .id {
|
|
166578
|
+
.row .id {
|
|
166579
|
+
font-weight: bold;
|
|
166580
|
+
min-width: 0;
|
|
166581
|
+
overflow: hidden;
|
|
166582
|
+
text-overflow: ellipsis;
|
|
166583
|
+
white-space: nowrap;
|
|
166584
|
+
}
|
|
166349
166585
|
.row .info {
|
|
166350
166586
|
color: var(--muted);
|
|
166351
|
-
|
|
166587
|
+
justify-self: end;
|
|
166352
166588
|
overflow: hidden;
|
|
166353
166589
|
text-overflow: ellipsis;
|
|
166354
166590
|
white-space: nowrap;
|
|
166355
|
-
max-width:
|
|
166591
|
+
max-width: 100%;
|
|
166356
166592
|
}
|
|
166357
166593
|
textarea {
|
|
166358
166594
|
width: 100%;
|
|
@@ -166469,6 +166705,7 @@ const ICONS = {
|
|
|
166469
166705
|
config: svg('<line x1="4" y1="21" x2="4" y2="14"/><line x1="4" y1="10" x2="4" y2="3"/><line x1="12" y1="21" x2="12" y2="12"/><line x1="12" y1="8" x2="12" y2="3"/><line x1="20" y1="21" x2="20" y2="16"/><line x1="20" y1="12" x2="20" y2="3"/><line x1="1" y1="14" x2="7" y2="14"/><line x1="9" y1="8" x2="15" y2="8"/><line x1="17" y1="16" x2="23" y2="16"/>'),
|
|
166470
166706
|
route: svg('<circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/>'),
|
|
166471
166707
|
site: svg('<rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/>'),
|
|
166708
|
+
seed: svg('<path d="M12 22V8"/><path d="M12 8C12 5 9 2 5 2c0 4 3 6 7 6z"/><path d="M12 12c0-3 3-6 7-6 0 4-3 6-7 6z"/>'),
|
|
166472
166709
|
}
|
|
166473
166710
|
|
|
166474
166711
|
const icon = kind => {
|
|
@@ -166644,6 +166881,19 @@ const rpcPanel = (main, r) => {
|
|
|
166644
166881
|
}
|
|
166645
166882
|
|
|
166646
166883
|
const query = $('select', {}, r.queries.map(name => $('option', { value: name, textContent: name })))
|
|
166884
|
+
|
|
166885
|
+
// The token rides the same "authentication" header the rpc client
|
|
166886
|
+
// sends, & sticks around per api so a page reload keeps it.
|
|
166887
|
+
const authKey = 'rpc-auth-token:' + r.routeKey
|
|
166888
|
+
const auth = $('input', {
|
|
166889
|
+
type: 'text',
|
|
166890
|
+
placeholder: 'Auth token (optional)',
|
|
166891
|
+
value: localStorage.getItem(authKey) ?? '',
|
|
166892
|
+
autocomplete: 'off',
|
|
166893
|
+
spellcheck: false,
|
|
166894
|
+
})
|
|
166895
|
+
auth.oninput = () => localStorage.setItem(authKey, auth.value)
|
|
166896
|
+
|
|
166647
166897
|
const payload = $('textarea', { value: '{}', spellcheck: false })
|
|
166648
166898
|
const status = $('span', { className: 'status' })
|
|
166649
166899
|
const result = $('pre', { className: 'result', hidden: true })
|
|
@@ -166662,7 +166912,10 @@ const rpcPanel = (main, r) => {
|
|
|
166662
166912
|
version: '2.0',
|
|
166663
166913
|
rawPath: '/',
|
|
166664
166914
|
requestContext: { http: { method: 'POST', userAgent: 'awsless dev dashboard', sourceIp: '127.0.0.1' } },
|
|
166665
|
-
headers: {
|
|
166915
|
+
headers: {
|
|
166916
|
+
'content-type': 'application/json',
|
|
166917
|
+
...(auth.value.trim() ? { authentication: auth.value.trim() } : {}),
|
|
166918
|
+
},
|
|
166666
166919
|
body: JSON.stringify([{ name: query.value, ...(parsed === undefined ? {} : { payload: parsed }) }]),
|
|
166667
166920
|
}
|
|
166668
166921
|
|
|
@@ -166686,7 +166939,7 @@ const rpcPanel = (main, r) => {
|
|
|
166686
166939
|
}
|
|
166687
166940
|
|
|
166688
166941
|
main.append(
|
|
166689
|
-
$('div', { className: 'filters' }, [query]),
|
|
166942
|
+
$('div', { className: 'filters' }, [query, auth]),
|
|
166690
166943
|
payload,
|
|
166691
166944
|
$('div', { className: 'actions' }, [run, status]),
|
|
166692
166945
|
result,
|
|
@@ -166938,12 +167191,25 @@ const configPanel = async (main) => {
|
|
|
166938
167191
|
const names = [...new Set(state.resources.filter(r => r.kind === 'config').map(r => r.id))].sort()
|
|
166939
167192
|
const data = await api('/api/config')
|
|
166940
167193
|
const values = data.values ?? {}
|
|
167194
|
+
const defaults = data.defaults ?? {}
|
|
167195
|
+
const secrets = new Set(data.secrets ?? [])
|
|
166941
167196
|
|
|
166942
167197
|
const inputs = new Map()
|
|
166943
167198
|
const form = $('div', { className: 'config-form' })
|
|
166944
167199
|
|
|
166945
167200
|
for (const name of names) {
|
|
166946
|
-
|
|
167201
|
+
// An empty input falls through to the committed default or the
|
|
167202
|
+
// pulled ssm secret - the placeholder shows which one carries.
|
|
167203
|
+
const placeholder = secrets.has(name)
|
|
167204
|
+
? 'pulled from ssm'
|
|
167205
|
+
: defaults[name] !== undefined ? 'default: ' + defaults[name] : 'not set'
|
|
167206
|
+
|
|
167207
|
+
const input = $('input', {
|
|
167208
|
+
value: values[name] ?? '',
|
|
167209
|
+
placeholder,
|
|
167210
|
+
spellcheck: false,
|
|
167211
|
+
...(secrets.has(name) ? { type: 'password' } : {}),
|
|
167212
|
+
})
|
|
166947
167213
|
inputs.set(name, input)
|
|
166948
167214
|
form.append($('label', { className: 'field' }, [$('span', { className: 'name' }, name), input]))
|
|
166949
167215
|
}
|
|
@@ -167122,6 +167388,46 @@ const render = () => {
|
|
|
167122
167388
|
nav.append(button)
|
|
167123
167389
|
}
|
|
167124
167390
|
|
|
167391
|
+
if (state.seeds) {
|
|
167392
|
+
const reseed = $('button', { className: 'reseed' }, [icon('seed'), 'Reset & seed'])
|
|
167393
|
+
let armed = false
|
|
167394
|
+
let disarm
|
|
167395
|
+
|
|
167396
|
+
reseed.onclick = async () => {
|
|
167397
|
+
// The reset wipes all local data, so it asks for a second
|
|
167398
|
+
// click before running.
|
|
167399
|
+
if (!armed) {
|
|
167400
|
+
armed = true
|
|
167401
|
+
reseed.lastChild.textContent = 'Click to confirm'
|
|
167402
|
+
disarm = setTimeout(() => {
|
|
167403
|
+
armed = false
|
|
167404
|
+
reseed.lastChild.textContent = 'Reset & seed'
|
|
167405
|
+
}, 3000)
|
|
167406
|
+
return
|
|
167407
|
+
}
|
|
167408
|
+
|
|
167409
|
+
clearTimeout(disarm)
|
|
167410
|
+
armed = false
|
|
167411
|
+
reseed.disabled = true
|
|
167412
|
+
reseed.lastChild.textContent = 'Seeding...'
|
|
167413
|
+
|
|
167414
|
+
try {
|
|
167415
|
+
const res = await fetch('/api/seed', { method: 'POST' })
|
|
167416
|
+
const data = await res.json()
|
|
167417
|
+
reseed.lastChild.textContent = data.ok ? 'Done' : 'Failed'
|
|
167418
|
+
} catch {
|
|
167419
|
+
reseed.lastChild.textContent = 'Failed'
|
|
167420
|
+
}
|
|
167421
|
+
|
|
167422
|
+
setTimeout(() => {
|
|
167423
|
+
reseed.disabled = false
|
|
167424
|
+
reseed.lastChild.textContent = 'Reset & seed'
|
|
167425
|
+
}, 2000)
|
|
167426
|
+
}
|
|
167427
|
+
|
|
167428
|
+
nav.append(reseed)
|
|
167429
|
+
}
|
|
167430
|
+
|
|
167125
167431
|
const main = document.getElementById('main')
|
|
167126
167432
|
main.innerHTML = ''
|
|
167127
167433
|
|
|
@@ -167201,7 +167507,8 @@ var createDashboardServer = (props) => {
|
|
|
167201
167507
|
app: props.app,
|
|
167202
167508
|
routerPorts: props.routerPorts,
|
|
167203
167509
|
resources: props.resources,
|
|
167204
|
-
routes: props.routes
|
|
167510
|
+
routes: props.routes,
|
|
167511
|
+
seeds: Boolean(props.runSeeds)
|
|
167205
167512
|
}).replaceAll("<", "\\u003c");
|
|
167206
167513
|
return { status: 200, body: dashboardHtml.replace("__STATE__", state), type: "text/html" };
|
|
167207
167514
|
}
|
|
@@ -167244,7 +167551,7 @@ var createDashboardServer = (props) => {
|
|
|
167244
167551
|
if (url.pathname === "/api/table") {
|
|
167245
167552
|
const name = url.searchParams.get("name");
|
|
167246
167553
|
try {
|
|
167247
|
-
const result = await getDocumentClient().send(new
|
|
167554
|
+
const result = await getDocumentClient().send(new ScanCommand2({ TableName: name, Limit: 100 }));
|
|
167248
167555
|
return { status: 200, body: JSON.stringify({ items: result.Items ?? [], count: result.Count ?? 0 }) };
|
|
167249
167556
|
} catch (error3) {
|
|
167250
167557
|
throw new Error(`Scanning "${name}" via ${props.env.AWS_ENDPOINT_URL_DYNAMODB ?? "no dynamodb endpoint"} failed: ${error3 instanceof Error ? error3.message : String(error3)}`);
|
|
@@ -167252,7 +167559,7 @@ var createDashboardServer = (props) => {
|
|
|
167252
167559
|
}
|
|
167253
167560
|
if (url.pathname === "/api/cache") {
|
|
167254
167561
|
const [host, port] = (url.searchParams.get("target") ?? "").split(":");
|
|
167255
|
-
const redis = new
|
|
167562
|
+
const redis = new import_ioredis5.Redis({ host, port: Number(port), lazyConnect: true });
|
|
167256
167563
|
try {
|
|
167257
167564
|
await redis.connect();
|
|
167258
167565
|
const keyspace = await redis.info("keyspace");
|
|
@@ -167299,12 +167606,12 @@ var createDashboardServer = (props) => {
|
|
|
167299
167606
|
const walk2 = async (dir) => {
|
|
167300
167607
|
let entries2;
|
|
167301
167608
|
try {
|
|
167302
|
-
entries2 = await
|
|
167609
|
+
entries2 = await readdir9(dir, { withFileTypes: true });
|
|
167303
167610
|
} catch (_4) {
|
|
167304
167611
|
return;
|
|
167305
167612
|
}
|
|
167306
167613
|
for (const entry of entries2) {
|
|
167307
|
-
const path6 =
|
|
167614
|
+
const path6 = join51(dir, entry.name);
|
|
167308
167615
|
if (entry.isDirectory()) {
|
|
167309
167616
|
await walk2(path6);
|
|
167310
167617
|
} else {
|
|
@@ -167319,6 +167626,20 @@ var createDashboardServer = (props) => {
|
|
|
167319
167626
|
await walk2(props.storeRoot);
|
|
167320
167627
|
return { status: 200, body: JSON.stringify({ files }) };
|
|
167321
167628
|
}
|
|
167629
|
+
if (url.pathname === "/api/seed" && req.method === "POST") {
|
|
167630
|
+
if (!props.runSeeds) {
|
|
167631
|
+
return { status: 400, body: JSON.stringify({ error: "No seed files configured." }) };
|
|
167632
|
+
}
|
|
167633
|
+
try {
|
|
167634
|
+
await props.runSeeds();
|
|
167635
|
+
return { status: 200, body: JSON.stringify({ ok: true }) };
|
|
167636
|
+
} catch (error3) {
|
|
167637
|
+
return {
|
|
167638
|
+
status: 500,
|
|
167639
|
+
body: JSON.stringify({ error: error3 instanceof Error ? error3.message : String(error3) })
|
|
167640
|
+
};
|
|
167641
|
+
}
|
|
167642
|
+
}
|
|
167322
167643
|
if (url.pathname === "/api/config") {
|
|
167323
167644
|
if (req.method === "PUT") {
|
|
167324
167645
|
const values2 = JSON.parse((await readBody3(req)).toString() || "{}");
|
|
@@ -167330,7 +167651,14 @@ var createDashboardServer = (props) => {
|
|
|
167330
167651
|
try {
|
|
167331
167652
|
values = JSON.parse(await readFile21(props.configFile, "utf8"));
|
|
167332
167653
|
} catch (_4) {}
|
|
167333
|
-
return {
|
|
167654
|
+
return {
|
|
167655
|
+
status: 200,
|
|
167656
|
+
body: JSON.stringify({
|
|
167657
|
+
values,
|
|
167658
|
+
defaults: props.configMeta?.defaults ?? {},
|
|
167659
|
+
secrets: props.configMeta?.secrets ?? []
|
|
167660
|
+
})
|
|
167661
|
+
};
|
|
167334
167662
|
}
|
|
167335
167663
|
return { status: 404, body: JSON.stringify({ error: `Unknown dashboard path: ${url.pathname}` }) };
|
|
167336
167664
|
};
|
|
@@ -167552,22 +167880,22 @@ var createLambdaServer = (props) => {
|
|
|
167552
167880
|
};
|
|
167553
167881
|
|
|
167554
167882
|
// src/dev/sdk.ts
|
|
167555
|
-
import { readdir as
|
|
167883
|
+
import { readdir as readdir10, readFile as readFile22, mkdir as mkdir9, rm as rm11, symlink } from "fs/promises";
|
|
167556
167884
|
import { createRequire } from "module";
|
|
167557
|
-
import { dirname as dirname22, join as
|
|
167885
|
+
import { dirname as dirname22, join as join52 } from "path";
|
|
167558
167886
|
var linkSdkPackages = async (buildDir, onWarn) => {
|
|
167559
|
-
const filesDir =
|
|
167887
|
+
const filesDir = join52(buildDir, "files");
|
|
167560
167888
|
const packages = new Set;
|
|
167561
|
-
for (const file2 of await
|
|
167889
|
+
for (const file2 of await readdir10(filesDir)) {
|
|
167562
167890
|
if (!file2.endsWith(".mjs")) {
|
|
167563
167891
|
continue;
|
|
167564
167892
|
}
|
|
167565
|
-
const code = await readFile22(
|
|
167893
|
+
const code = await readFile22(join52(filesDir, file2), "utf8");
|
|
167566
167894
|
for (const match3 of code.matchAll(/(?:from\s*|import\()\s*["'](@aws-sdk\/[a-z0-9-]+|sharp)["']/g)) {
|
|
167567
167895
|
packages.add(match3[1]);
|
|
167568
167896
|
}
|
|
167569
167897
|
}
|
|
167570
|
-
const projectRequire = createRequire(
|
|
167898
|
+
const projectRequire = createRequire(join52(directories.root, "noop.js"));
|
|
167571
167899
|
const ownRequire = createRequire(import.meta.url);
|
|
167572
167900
|
for (const name of packages) {
|
|
167573
167901
|
try {
|
|
@@ -167581,9 +167909,9 @@ var linkSdkPackages = async (buildDir, onWarn) => {
|
|
|
167581
167909
|
onWarn?.(`The bundle imports "${name}", which is neither a project dependency nor shipped with the cli. Add it to your project dependencies.`);
|
|
167582
167910
|
continue;
|
|
167583
167911
|
}
|
|
167584
|
-
const target2 =
|
|
167912
|
+
const target2 = join52(buildDir, "node_modules", name);
|
|
167585
167913
|
await mkdir9(dirname22(target2), { recursive: true });
|
|
167586
|
-
await
|
|
167914
|
+
await rm11(target2, { recursive: true, force: true });
|
|
167587
167915
|
await symlink(source, target2, "dir");
|
|
167588
167916
|
}
|
|
167589
167917
|
};
|
|
@@ -167592,73 +167920,90 @@ var linkSdkPackages = async (buildDir, onWarn) => {
|
|
|
167592
167920
|
var LOCAL_ACCOUNT_ID = "000000000000";
|
|
167593
167921
|
var startDev = async (props) => {
|
|
167594
167922
|
const log = props.onLog ?? (() => {});
|
|
167923
|
+
const phase = props.phase ?? (async ({ start }, fn) => (log(start), fn()));
|
|
167595
167924
|
const { appConfig, stackConfigs } = props;
|
|
167596
167925
|
const { builders, appId } = createApp({
|
|
167597
167926
|
appConfig,
|
|
167598
167927
|
stackConfigs,
|
|
167599
|
-
accountId: LOCAL_ACCOUNT_ID
|
|
167928
|
+
accountId: LOCAL_ACCOUNT_ID,
|
|
167929
|
+
dev: true
|
|
167600
167930
|
});
|
|
167601
|
-
await mkdir10(
|
|
167931
|
+
await mkdir10(join53(directories.output, "local"), { recursive: true });
|
|
167602
167932
|
const routerPorts = {};
|
|
167603
167933
|
Object.keys(appConfig.router ?? {}).forEach((id, index) => {
|
|
167604
167934
|
routerPorts[id] = props.port + 1 + index;
|
|
167605
167935
|
});
|
|
167936
|
+
const firstBoot = props.pool.peek("session") === undefined;
|
|
167606
167937
|
props.pool.begin();
|
|
167938
|
+
await props.pool.keep("session", null, async () => ({ value: true, stop: () => {} }));
|
|
167607
167939
|
const dev = createDevContext({ appConfig, stackConfigs, appId, routerPorts, log, pool: props.pool });
|
|
167608
|
-
log("Preparing the local resources...");
|
|
167609
|
-
for (const feature of features) {
|
|
167610
|
-
await feature.onDev?.(dev.context);
|
|
167611
|
-
}
|
|
167612
|
-
await props.pool.sweep();
|
|
167613
|
-
const blocked = await props.pool.keep("blocked", null, async () => {
|
|
167614
|
-
const server = createBlockedServer({ onLog: (message4) => debug(message4) });
|
|
167615
|
-
const port = await server.listen();
|
|
167616
|
-
return { value: { server, port }, stop: () => server.stop() };
|
|
167617
|
-
});
|
|
167618
|
-
const blockedPort = blocked.port;
|
|
167619
167940
|
const bundleName = getBundleFunctionName(appConfig.name);
|
|
167620
167941
|
const buildDir = getBuildPath("bundle", bundleName, ".");
|
|
167621
|
-
const
|
|
167622
|
-
|
|
167623
|
-
|
|
167624
|
-
|
|
167625
|
-
|
|
167626
|
-
|
|
167627
|
-
|
|
167628
|
-
|
|
167629
|
-
|
|
167630
|
-
|
|
167631
|
-
|
|
167632
|
-
|
|
167633
|
-
|
|
167634
|
-
|
|
167635
|
-
|
|
167636
|
-
|
|
167637
|
-
|
|
167638
|
-
|
|
167639
|
-
|
|
167640
|
-
|
|
167641
|
-
|
|
167642
|
-
|
|
167643
|
-
|
|
167644
|
-
|
|
167645
|
-
|
|
167942
|
+
const { env: env4, lambda } = await phase({ start: "Preparing the local resources...", done: "Prepared the local resources" }, async () => {
|
|
167943
|
+
for (const feature of features) {
|
|
167944
|
+
await feature.onDev?.(dev.context);
|
|
167945
|
+
}
|
|
167946
|
+
props.pool.retain("blocked");
|
|
167947
|
+
props.pool.retain("lambda");
|
|
167948
|
+
await props.pool.sweep();
|
|
167949
|
+
const blocked = await props.pool.keep("blocked", null, async () => {
|
|
167950
|
+
const server = createBlockedServer({ onLog: (message4) => debug(message4) });
|
|
167951
|
+
const port = await server.listen();
|
|
167952
|
+
return { value: { server, port }, stop: () => server.stop() };
|
|
167953
|
+
});
|
|
167954
|
+
const blockedPort = blocked.port;
|
|
167955
|
+
const pooledLambda = await props.pool.keep("lambda", bundleName, async () => {
|
|
167956
|
+
const server = createLambdaServer({ functionName: bundleName });
|
|
167957
|
+
const port = await server.listen();
|
|
167958
|
+
return { value: { server, port }, stop: () => server.stop() };
|
|
167959
|
+
});
|
|
167960
|
+
const lambda2 = pooledLambda.server;
|
|
167961
|
+
const lambdaPort = pooledLambda.port;
|
|
167962
|
+
const env5 = {
|
|
167963
|
+
APP: appConfig.name,
|
|
167964
|
+
APP_ID: appId,
|
|
167965
|
+
AWSLESS_ENV: "local",
|
|
167966
|
+
AWS_REGION: appConfig.region,
|
|
167967
|
+
AWS_ACCOUNT_ID: LOCAL_ACCOUNT_ID,
|
|
167968
|
+
AWS_ACCESS_KEY_ID: "local",
|
|
167969
|
+
AWS_SECRET_ACCESS_KEY: "local",
|
|
167970
|
+
AWS_LAMBDA_FUNCTION_NAME: bundleName,
|
|
167971
|
+
AWS_LAMBDA_FUNCTION_VERSION: "local",
|
|
167972
|
+
AWS_ENDPOINT_URL: `http://127.0.0.1:${blockedPort}`,
|
|
167973
|
+
AWS_ENDPOINT_URL_LAMBDA: `http://127.0.0.1:${lambdaPort}`,
|
|
167974
|
+
...dev.env
|
|
167975
|
+
};
|
|
167976
|
+
for (const [id, port] of Object.entries(routerPorts)) {
|
|
167977
|
+
env5[`ROUTER_${constantCase(id)}_ENDPOINT`] = `localhost:${port}`;
|
|
167978
|
+
}
|
|
167979
|
+
await writeFile13(join53(directories.output, "local", "env.json"), JSON.stringify(env5, null, "\t") + `
|
|
167646
167980
|
`);
|
|
167981
|
+
return { env: env5, lambda: lambda2 };
|
|
167982
|
+
});
|
|
167647
167983
|
const sorted = [...builders].sort((a4, b6) => Number(a4.type === "bundle") - Number(b6.type === "bundle"));
|
|
167648
|
-
|
|
167984
|
+
let workspace;
|
|
167649
167985
|
const buildAll = async () => {
|
|
167986
|
+
let changed = false;
|
|
167650
167987
|
for (const builder of sorted) {
|
|
167651
|
-
await build(builder.type, builder.name, builder.builder, { workspace });
|
|
167988
|
+
const meta = await build(builder.type, builder.name, builder.builder, { workspace });
|
|
167989
|
+
if (!meta?.cached) {
|
|
167990
|
+
changed = true;
|
|
167991
|
+
}
|
|
167992
|
+
debug(`Build ${builder.type}:${builder.name}`, meta?.cached ? "cached" : String(meta?.buildTime));
|
|
167652
167993
|
}
|
|
167653
167994
|
await writeFile13(getBuildPath("bundle", bundleName, "files/awsless-env.mjs"), `export default {}
|
|
167654
167995
|
`);
|
|
167655
167996
|
await linkSdkPackages(buildDir, log);
|
|
167997
|
+
return changed;
|
|
167656
167998
|
};
|
|
167657
|
-
|
|
167658
|
-
|
|
167999
|
+
await phase({ start: "Building the bundle...", done: "Built the bundle" }, async () => {
|
|
168000
|
+
workspace = await loadWorkspace3(directories.root);
|
|
168001
|
+
await buildAll();
|
|
168002
|
+
});
|
|
167659
168003
|
const worker = createBundleWorker({ buildDir, env: env4, functionName: bundleName });
|
|
167660
168004
|
let dirty = false;
|
|
167661
168005
|
let fresh;
|
|
168006
|
+
let restartNeeded = false;
|
|
167662
168007
|
const ensureFresh = async () => {
|
|
167663
168008
|
if (!dirty) {
|
|
167664
168009
|
return;
|
|
@@ -167667,9 +168012,16 @@ var startDev = async (props) => {
|
|
|
167667
168012
|
dirty = false;
|
|
167668
168013
|
const started = Date.now();
|
|
167669
168014
|
try {
|
|
167670
|
-
await buildAll();
|
|
167671
|
-
|
|
167672
|
-
|
|
168015
|
+
const changed = await buildAll();
|
|
168016
|
+
const built = Date.now();
|
|
168017
|
+
if (changed || restartNeeded) {
|
|
168018
|
+
restartNeeded = true;
|
|
168019
|
+
await worker.restart();
|
|
168020
|
+
restartNeeded = false;
|
|
168021
|
+
log(`Reloaded the bundle in ${Date.now() - started}ms (build ${built - started}ms, worker ${Date.now() - built}ms)`);
|
|
168022
|
+
} else {
|
|
168023
|
+
debug(`Rebuild found no changes in ${Date.now() - started}ms`);
|
|
168024
|
+
}
|
|
167673
168025
|
} catch (error3) {
|
|
167674
168026
|
dirty = true;
|
|
167675
168027
|
throw error3;
|
|
@@ -167689,17 +168041,29 @@ var startDev = async (props) => {
|
|
|
167689
168041
|
log
|
|
167690
168042
|
});
|
|
167691
168043
|
lambda.connect(dispatch, reportFailure);
|
|
167692
|
-
|
|
167693
|
-
|
|
167694
|
-
|
|
167695
|
-
|
|
167696
|
-
|
|
167697
|
-
|
|
167698
|
-
|
|
167699
|
-
|
|
167700
|
-
|
|
167701
|
-
|
|
167702
|
-
|
|
168044
|
+
await phase({ start: "Starting the local servers...", done: "Started the local servers" }, async () => {
|
|
168045
|
+
for (const server of dev.servers) {
|
|
168046
|
+
await server.start({ dispatch, log, reportFailure, env: env4 });
|
|
168047
|
+
}
|
|
168048
|
+
});
|
|
168049
|
+
await phase({ start: "Starting the bundle worker...", done: "Started the bundle worker" }, async () => {
|
|
168050
|
+
try {
|
|
168051
|
+
await worker.start();
|
|
168052
|
+
} catch (error3) {
|
|
168053
|
+
log(`The bundle worker failed to start: ${error3 instanceof Error ? error3.message : String(error3)}`);
|
|
168054
|
+
log("Fix the error - the next invoke retries.");
|
|
168055
|
+
dirty = true;
|
|
168056
|
+
restartNeeded = true;
|
|
168057
|
+
}
|
|
168058
|
+
});
|
|
168059
|
+
const seeder = createSeedRunner({ stackConfigs, env: env4 });
|
|
168060
|
+
const resetData = createDataReset({ pool: props.pool, appConfig, stackConfigs });
|
|
168061
|
+
if (firstBoot && seeder.count > 0 && !dirty) {
|
|
168062
|
+
try {
|
|
168063
|
+
await phase({ start: "Seeding the local data...", done: "Seeded the local data" }, () => seeder.run());
|
|
168064
|
+
} catch (error3) {
|
|
168065
|
+
log(`Seeding failed: ${error3 instanceof Error ? error3.message : String(error3)}`);
|
|
168066
|
+
}
|
|
167703
168067
|
}
|
|
167704
168068
|
const routers = [];
|
|
167705
168069
|
for (const [id, port] of Object.entries(routerPorts)) {
|
|
@@ -167711,14 +168075,22 @@ var startDev = async (props) => {
|
|
|
167711
168075
|
}
|
|
167712
168076
|
const dashboardPort = props.port;
|
|
167713
168077
|
const dashboard = createDashboardServer({
|
|
168078
|
+
runSeeds: seeder.count > 0 ? async () => {
|
|
168079
|
+
await resetData();
|
|
168080
|
+
await seeder.run();
|
|
168081
|
+
} : undefined,
|
|
167714
168082
|
app: appConfig.name,
|
|
167715
168083
|
region: appConfig.region,
|
|
167716
168084
|
routerPorts,
|
|
167717
168085
|
resources: dev.resources,
|
|
167718
168086
|
routes: dev.routes,
|
|
167719
168087
|
env: env4,
|
|
167720
|
-
storeRoot:
|
|
167721
|
-
configFile:
|
|
168088
|
+
storeRoot: join53(directories.output, "local", "store"),
|
|
168089
|
+
configFile: join53(directories.output, "local", "config.json"),
|
|
168090
|
+
configMeta: {
|
|
168091
|
+
defaults: appConfig.configDefaults ?? {},
|
|
168092
|
+
secrets: appConfig.configSecrets ?? []
|
|
168093
|
+
},
|
|
167722
168094
|
events: dev.events
|
|
167723
168095
|
});
|
|
167724
168096
|
dashboard.connect(dispatch);
|
|
@@ -167728,8 +168100,15 @@ var startDev = async (props) => {
|
|
|
167728
168100
|
ignoreInitial: true,
|
|
167729
168101
|
awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 50 }
|
|
167730
168102
|
});
|
|
168103
|
+
let rebuildTimer;
|
|
167731
168104
|
watcher.on("all", () => {
|
|
167732
168105
|
dirty = true;
|
|
168106
|
+
clearTimeout(rebuildTimer);
|
|
168107
|
+
rebuildTimer = setTimeout(() => {
|
|
168108
|
+
ensureFresh().catch((error3) => {
|
|
168109
|
+
debug("Background rebuild failed", error3);
|
|
168110
|
+
});
|
|
168111
|
+
}, 150);
|
|
167733
168112
|
});
|
|
167734
168113
|
const restartWatcher = dev.restartPaths.length > 0 ? $watch(dev.restartPaths, { ignoreInitial: true }) : undefined;
|
|
167735
168114
|
restartWatcher?.on("all", () => {
|
|
@@ -167740,7 +168119,8 @@ var startDev = async (props) => {
|
|
|
167740
168119
|
dashboardPort,
|
|
167741
168120
|
routerPorts,
|
|
167742
168121
|
async stop() {
|
|
167743
|
-
await
|
|
168122
|
+
await rm12(join53(directories.output, "local", "env.json"), { force: true });
|
|
168123
|
+
clearTimeout(rebuildTimer);
|
|
167744
168124
|
await watcher.close();
|
|
167745
168125
|
await restartWatcher?.close();
|
|
167746
168126
|
for (const router of routers) {
|
|
@@ -167804,7 +168184,7 @@ var createServerPool = () => {
|
|
|
167804
168184
|
|
|
167805
168185
|
// src/type-gen/generate.ts
|
|
167806
168186
|
import { mkdir as mkdir11, writeFile as writeFile14 } from "fs/promises";
|
|
167807
|
-
import { dirname as dirname23, join as
|
|
168187
|
+
import { dirname as dirname23, join as join54, relative as relative11 } from "path";
|
|
167808
168188
|
var generateTypes = async (props) => {
|
|
167809
168189
|
const files = [];
|
|
167810
168190
|
await Promise.all(features.map((feature) => {
|
|
@@ -167812,7 +168192,7 @@ var generateTypes = async (props) => {
|
|
|
167812
168192
|
...props,
|
|
167813
168193
|
async write(file2, data, include = false) {
|
|
167814
168194
|
const code = data?.toString("utf8");
|
|
167815
|
-
const path6 =
|
|
168195
|
+
const path6 = join54(directories.types, file2);
|
|
167816
168196
|
if (code) {
|
|
167817
168197
|
if (include) {
|
|
167818
168198
|
files.push(relative11(directories.root, path6));
|
|
@@ -167826,7 +168206,7 @@ var generateTypes = async (props) => {
|
|
|
167826
168206
|
if (files.length) {
|
|
167827
168207
|
const code = files.map((file2) => `/// <reference path='${file2}' />`).join(`
|
|
167828
168208
|
`);
|
|
167829
|
-
await writeFile14(
|
|
168209
|
+
await writeFile14(join54(directories.root, `awsless.d.ts`), code);
|
|
167830
168210
|
}
|
|
167831
168211
|
};
|
|
167832
168212
|
|
|
@@ -167856,25 +168236,33 @@ var dev = (program3) => {
|
|
|
167856
168236
|
};
|
|
167857
168237
|
const start = async (appConfig = props.appConfig, stackConfigs = props.stackConfigs) => {
|
|
167858
168238
|
let logger = (message4) => logs_exports.step(message4);
|
|
167859
|
-
|
|
167860
|
-
|
|
167861
|
-
|
|
167862
|
-
|
|
167863
|
-
|
|
167864
|
-
|
|
167865
|
-
|
|
167866
|
-
|
|
167867
|
-
|
|
167868
|
-
|
|
167869
|
-
|
|
167870
|
-
|
|
167871
|
-
|
|
167872
|
-
|
|
167873
|
-
|
|
167874
|
-
|
|
167875
|
-
|
|
168239
|
+
const phase = async (titles, fn) => {
|
|
168240
|
+
const time2 = createTimer();
|
|
168241
|
+
return logs_exports.task({
|
|
168242
|
+
initialMessage: titles.start,
|
|
168243
|
+
errorMessage: `${titles.start.replace(/\.\.\.$/, "")} failed.`,
|
|
168244
|
+
task: ({ updateMessage, updateSuccessMessage }) => {
|
|
168245
|
+
logger = updateMessage;
|
|
168246
|
+
return fn().then((result) => {
|
|
168247
|
+
updateSuccessMessage(`${titles.done} in ${time2()}`);
|
|
168248
|
+
return result;
|
|
168249
|
+
}).finally(() => {
|
|
168250
|
+
logger = (message4) => logs_exports.step(message4);
|
|
168251
|
+
});
|
|
168252
|
+
}
|
|
168253
|
+
});
|
|
168254
|
+
};
|
|
168255
|
+
instance = await startDev({
|
|
168256
|
+
appConfig,
|
|
168257
|
+
stackConfigs,
|
|
168258
|
+
port,
|
|
168259
|
+
pool,
|
|
168260
|
+
phase,
|
|
168261
|
+
onLog(message4) {
|
|
168262
|
+
logger(message4);
|
|
167876
168263
|
}
|
|
167877
168264
|
});
|
|
168265
|
+
logs_exports.success("Local dev environment ready.");
|
|
167878
168266
|
logs_exports.list("Endpoints", {
|
|
167879
168267
|
Dashboard: color2.info(`http://localhost:${instance.dashboardPort}`),
|
|
167880
168268
|
...Object.fromEntries(Object.entries(instance.routerPorts).map(([id, routerPort]) => [
|
|
@@ -167971,7 +168359,7 @@ import { DynamoDBClient as DynamoDBClient6, dynamoDBClient } from "@awsless/dyna
|
|
|
167971
168359
|
|
|
167972
168360
|
// ../../node_modules/.pnpm/@aws-sdk+client-iot-data-plane@3.1023.0_aws-crt@1.30.0_supports-color@8.1.1_/node_modules/@aws-sdk/client-iot-data-plane/dist-es/IoTDataPlaneClient.js
|
|
167973
168361
|
var import_core50 = __toESM(require_dist_cjs2(), 1);
|
|
167974
|
-
var
|
|
168362
|
+
var import_schema68 = __toESM(require_schema(), 1);
|
|
167975
168363
|
|
|
167976
168364
|
// ../../node_modules/.pnpm/@aws-sdk+client-iot-data-plane@3.1023.0_aws-crt@1.30.0_supports-color@8.1.1_/node_modules/@aws-sdk/client-iot-data-plane/dist-es/auth/httpAuthSchemeProvider.js
|
|
167977
168365
|
var import_httpAuthSchemes4 = __toESM(require_httpAuthSchemes(), 1);
|
|
@@ -168177,7 +168565,7 @@ var defaultEndpointResolver3 = (endpointParams, context = {}) => {
|
|
|
168177
168565
|
customEndpointFunctions.aws = awsEndpointFunctions;
|
|
168178
168566
|
|
|
168179
168567
|
// ../../node_modules/.pnpm/@aws-sdk+client-iot-data-plane@3.1023.0_aws-crt@1.30.0_supports-color@8.1.1_/node_modules/@aws-sdk/client-iot-data-plane/dist-es/schemas/schemas_0.js
|
|
168180
|
-
var
|
|
168568
|
+
var import_schema67 = __toESM(require_schema(), 1);
|
|
168181
168569
|
|
|
168182
168570
|
// ../../node_modules/.pnpm/@aws-sdk+client-iot-data-plane@3.1023.0_aws-crt@1.30.0_supports-color@8.1.1_/node_modules/@aws-sdk/client-iot-data-plane/dist-es/models/IoTDataPlaneServiceException.js
|
|
168183
168571
|
class IoTDataPlaneServiceException extends ServiceException {
|
|
@@ -168407,10 +168795,10 @@ var _xamcd = "x-amz-mqtt5-correlation-data";
|
|
|
168407
168795
|
var _xampfi = "x-amz-mqtt5-payload-format-indicator";
|
|
168408
168796
|
var _xamup = "x-amz-mqtt5-user-properties";
|
|
168409
168797
|
var n03 = "com.amazonaws.iotdataplane";
|
|
168410
|
-
var _s_registry3 =
|
|
168798
|
+
var _s_registry3 = import_schema67.TypeRegistry.for(_s3);
|
|
168411
168799
|
var IoTDataPlaneServiceException$ = [-3, _s3, "IoTDataPlaneServiceException", 0, [], []];
|
|
168412
168800
|
_s_registry3.registerError(IoTDataPlaneServiceException$, IoTDataPlaneServiceException);
|
|
168413
|
-
var n0_registry3 =
|
|
168801
|
+
var n0_registry3 = import_schema67.TypeRegistry.for(n03);
|
|
168414
168802
|
var ConflictException$ = [
|
|
168415
168803
|
-3,
|
|
168416
168804
|
n03,
|
|
@@ -168846,7 +169234,7 @@ class IoTDataPlaneClient extends Client {
|
|
|
168846
169234
|
const _config_7 = resolveHttpAuthSchemeConfig3(_config_6);
|
|
168847
169235
|
const _config_8 = resolveRuntimeExtensions3(_config_7, configuration?.extensions || []);
|
|
168848
169236
|
this.config = _config_8;
|
|
168849
|
-
this.middlewareStack.use(
|
|
169237
|
+
this.middlewareStack.use(import_schema68.getSchemaSerdePlugin(this.config));
|
|
168850
169238
|
this.middlewareStack.use(getUserAgentPlugin(this.config));
|
|
168851
169239
|
this.middlewareStack.use(getRetryPlugin(this.config));
|
|
168852
169240
|
this.middlewareStack.use(getContentLengthPlugin(this.config));
|
|
@@ -183447,12 +183835,12 @@ var state = (program3) => {
|
|
|
183447
183835
|
|
|
183448
183836
|
// src/cli/command/test.ts
|
|
183449
183837
|
import { mkdir as mkdir12, writeFile as writeFile15 } from "fs/promises";
|
|
183450
|
-
import { join as
|
|
183838
|
+
import { join as join56 } from "path";
|
|
183451
183839
|
|
|
183452
183840
|
// src/test/manifest.ts
|
|
183453
|
-
import { isAbsolute as
|
|
183841
|
+
import { isAbsolute as isAbsolute5, join as join55 } from "path";
|
|
183454
183842
|
var absolute = (file2) => {
|
|
183455
|
-
return
|
|
183843
|
+
return isAbsolute5(file2) ? file2 : join55(directories.root, file2);
|
|
183456
183844
|
};
|
|
183457
183845
|
var createTestManifest = (appConfig, stackConfigs) => {
|
|
183458
183846
|
const manifest = {
|
|
@@ -183548,7 +183936,7 @@ var test2 = (program3) => {
|
|
|
183548
183936
|
return "No tests found.";
|
|
183549
183937
|
}
|
|
183550
183938
|
const manifest = createTestManifest(props.appConfig, props.stackConfigs);
|
|
183551
|
-
const manifestFile =
|
|
183939
|
+
const manifestFile = join56(directories.output, "test", "manifest.json");
|
|
183552
183940
|
let redis;
|
|
183553
183941
|
let killSearch;
|
|
183554
183942
|
manifest.servers = {};
|
|
@@ -183575,7 +183963,7 @@ var test2 = (program3) => {
|
|
|
183575
183963
|
await redis.ping();
|
|
183576
183964
|
manifest.servers.redis = { host: "127.0.0.1", port: await redis.getPort() };
|
|
183577
183965
|
}
|
|
183578
|
-
await mkdir12(
|
|
183966
|
+
await mkdir12(join56(directories.output, "test"), { recursive: true });
|
|
183579
183967
|
await writeFile15(manifestFile, JSON.stringify(manifest));
|
|
183580
183968
|
process.env.AWSLESS_TEST_MANIFEST = manifestFile;
|
|
183581
183969
|
let passed = false;
|