@awsless/cli 0.1.8 → 0.1.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/app.json +1 -1
- package/dist/app.stage.json +1 -1
- package/dist/bin.js +84 -16
- package/dist/handlers/pubsub-publisher.js +21 -21
- package/package.json +12 -12
package/dist/bin.js
CHANGED
|
@@ -108408,6 +108408,7 @@ import { join, normalize, relative } from "path";
|
|
|
108408
108408
|
var root = process.cwd();
|
|
108409
108409
|
var directories = {
|
|
108410
108410
|
root,
|
|
108411
|
+
buildFolder: "build",
|
|
108411
108412
|
get output() {
|
|
108412
108413
|
return join(this.root, ".awsless");
|
|
108413
108414
|
},
|
|
@@ -108418,7 +108419,7 @@ var directories = {
|
|
|
108418
108419
|
return join(this.output, "state");
|
|
108419
108420
|
},
|
|
108420
108421
|
get build() {
|
|
108421
|
-
return join(this.output,
|
|
108422
|
+
return join(this.output, this.buildFolder);
|
|
108422
108423
|
},
|
|
108423
108424
|
get types() {
|
|
108424
108425
|
return join(this.output, "types");
|
|
@@ -108433,6 +108434,9 @@ var directories = {
|
|
|
108433
108434
|
var setRoot = (path = root) => {
|
|
108434
108435
|
directories.root = path;
|
|
108435
108436
|
};
|
|
108437
|
+
var useDevBuildDir = () => {
|
|
108438
|
+
directories.buildFolder = "build-dev";
|
|
108439
|
+
};
|
|
108436
108440
|
var findRootDir = async (path, configFiles, level = 5) => {
|
|
108437
108441
|
if (!level) {
|
|
108438
108442
|
throw new TypeError("No awsless project found");
|
|
@@ -143971,6 +143975,14 @@ var createOpenSearchProvider = ({ credentials: credentials2, region }) => {
|
|
|
143971
143975
|
async updateResource(props) {
|
|
143972
143976
|
return apply(props.proposedState);
|
|
143973
143977
|
},
|
|
143978
|
+
async planResourceChange(props) {
|
|
143979
|
+
const prior = props.priorState;
|
|
143980
|
+
const proposed = props.proposedState;
|
|
143981
|
+
return {
|
|
143982
|
+
state: props.proposedState,
|
|
143983
|
+
requiresReplacement: !!prior && (prior.endpoint !== proposed?.endpoint || prior.index !== proposed?.index)
|
|
143984
|
+
};
|
|
143985
|
+
},
|
|
143974
143986
|
async deleteResource(props) {
|
|
143975
143987
|
const state = inputSchema.parse(props.state);
|
|
143976
143988
|
await getClient(state.endpoint).indices.delete({ index: state.index }, { ignore: [404] });
|
|
@@ -151140,7 +151152,7 @@ var JobDefaultSchema = exports_external.object({
|
|
|
151140
151152
|
|
|
151141
151153
|
// src/feature/search/schema.ts
|
|
151142
151154
|
var VersionSchema = exports_external.union([
|
|
151143
|
-
exports_external.enum(["2.13", "2.11", "2.9", "2.7", "2.5", "2.3", "1.3"]),
|
|
151155
|
+
exports_external.enum(["3.7", "3.5", "3.3", "3.1", "2.19", "2.17", "2.15", "2.13", "2.11", "2.9", "2.7", "2.5", "2.3", "1.3"]),
|
|
151144
151156
|
exports_external.string()
|
|
151145
151157
|
]).describe("Specify the OpenSearch engine version.");
|
|
151146
151158
|
var TypeSchema = exports_external.union([
|
|
@@ -151182,7 +151194,7 @@ var StorageSizeSchema = SizeSchema.refine(sizeMin(gibibytes(10)), "Minimum stora
|
|
|
151182
151194
|
var SearchDefaultSchema = exports_external.object({
|
|
151183
151195
|
type: TypeSchema.default("t3.small"),
|
|
151184
151196
|
count: CountSchema.default(1),
|
|
151185
|
-
version: VersionSchema.default("
|
|
151197
|
+
version: VersionSchema.default("3.7"),
|
|
151186
151198
|
storage: StorageSizeSchema.default("10 GB")
|
|
151187
151199
|
}).strict().default({}).describe("Configure the shared OpenSearch domain that backs every search index in your app.");
|
|
151188
151200
|
var IndexNameSchema = exports_external.string().regex(/^[a-z0-9][a-z0-9\-_.]*$/, 'Index names must be lowercase & start with a letter or number, like "users" or "game-events".');
|
|
@@ -155701,7 +155713,8 @@ var createDnsValidatedCertificate = (group4, id, props) => {
|
|
|
155701
155713
|
}, {
|
|
155702
155714
|
...props.dependsOn ? { dependsOn: props.dependsOn } : {},
|
|
155703
155715
|
...props.provider ? { provider: props.provider } : {},
|
|
155704
|
-
replaceOnChanges: ["certificateArn", "validationRecordFqdns"]
|
|
155716
|
+
replaceOnChanges: ["certificateArn", "validationRecordFqdns"],
|
|
155717
|
+
createBeforeReplace: true
|
|
155705
155718
|
});
|
|
155706
155719
|
return validation;
|
|
155707
155720
|
};
|
|
@@ -158963,7 +158976,8 @@ var searchFeature = defineFeature({
|
|
|
158963
158976
|
})
|
|
158964
158977
|
}, {
|
|
158965
158978
|
retainOnDelete: ctx.appConfig.removal === "retain",
|
|
158966
|
-
import: ctx.import ? name : undefined
|
|
158979
|
+
import: ctx.import ? name : undefined,
|
|
158980
|
+
replaceOnChanges: ["engineVersion", "domainName"]
|
|
158967
158981
|
});
|
|
158968
158982
|
ctx.addEnv("SEARCH_DOMAIN", openSearch.endpointV2);
|
|
158969
158983
|
ctx.addPermission({
|
|
@@ -158977,7 +158991,8 @@ var searchFeature = defineFeature({
|
|
|
158977
158991
|
mappings: JSON.stringify(resolveSearchMappings(indexProps) ?? {}),
|
|
158978
158992
|
settings: JSON.stringify(indexProps.settings ?? {})
|
|
158979
158993
|
}, {
|
|
158980
|
-
retainOnDelete: ctx.appConfig.removal === "retain"
|
|
158994
|
+
retainOnDelete: ctx.appConfig.removal === "retain",
|
|
158995
|
+
replaceOnChanges: ["endpoint", "index"]
|
|
158981
158996
|
});
|
|
158982
158997
|
}
|
|
158983
158998
|
}
|
|
@@ -164714,11 +164729,16 @@ var startTest = async (props) => {
|
|
|
164714
164729
|
}
|
|
164715
164730
|
for (const error3 of module.errors()) {
|
|
164716
164731
|
const stack = error3.stacks?.[0];
|
|
164732
|
+
const { code, syscall, address, port } = error3;
|
|
164717
164733
|
errors3.push({
|
|
164718
164734
|
type: error3.name,
|
|
164719
164735
|
message: error3.message,
|
|
164720
164736
|
location: stack ? { line: stack.line, column: stack.column } : undefined,
|
|
164721
|
-
stack: error3.stack
|
|
164737
|
+
stack: error3.stack,
|
|
164738
|
+
code,
|
|
164739
|
+
syscall,
|
|
164740
|
+
address,
|
|
164741
|
+
port
|
|
164722
164742
|
});
|
|
164723
164743
|
}
|
|
164724
164744
|
}
|
|
@@ -164814,6 +164834,11 @@ var logTestErrors = (event) => {
|
|
|
164814
164834
|
}
|
|
164815
164835
|
}
|
|
164816
164836
|
};
|
|
164837
|
+
var formatModuleError = (error3) => {
|
|
164838
|
+
const syscall = [error3.syscall, error3.address, error3.port && `port ${error3.port}`].filter(Boolean).join(" ");
|
|
164839
|
+
return [error3.message, syscall && `(${syscall})`, `
|
|
164840
|
+
`, error3.stack ?? "(no stack captured)"].filter(Boolean).join(" ");
|
|
164841
|
+
};
|
|
164817
164842
|
var runTest = async (stack, dir, filters, workspace, opts) => {
|
|
164818
164843
|
await mkdir8(directories.test, { recursive: true });
|
|
164819
164844
|
const file2 = join49(directories.test, `${stack}.json`);
|
|
@@ -164841,15 +164866,26 @@ var runTest = async (stack, dir, filters, workspace, opts) => {
|
|
|
164841
164866
|
initialMessage: `Run tests for the ${color2.info(stack)} stack`,
|
|
164842
164867
|
errorMessage: `Running tests for the ${color2.info(stack)} stack failed`,
|
|
164843
164868
|
async task(ctx) {
|
|
164844
|
-
const
|
|
164869
|
+
const transient = (error3) => ["ECONNREFUSED", "ECONNRESET", "ETIMEDOUT", "EPIPE"].includes(error3.code ?? "") || ["ECONNREFUSED", "ECONNRESET", "ETIMEDOUT", "EPIPE"].some((code) => error3.message.includes(code));
|
|
164870
|
+
let result2 = await startTest({
|
|
164845
164871
|
dir,
|
|
164846
164872
|
filters,
|
|
164847
164873
|
env: opts.env
|
|
164848
164874
|
});
|
|
164875
|
+
if (result2.errors.length > 0 && result2.errors.every(transient)) {
|
|
164876
|
+
for (const error3 of result2.errors) {
|
|
164877
|
+
debug(`Transient module error in ${stack} tests, retrying once: ${formatModuleError(error3)}`);
|
|
164878
|
+
}
|
|
164879
|
+
await new Promise((resolve5) => setTimeout(resolve5, 1000));
|
|
164880
|
+
result2 = await startTest({
|
|
164881
|
+
dir,
|
|
164882
|
+
filters,
|
|
164883
|
+
env: opts.env
|
|
164884
|
+
});
|
|
164885
|
+
}
|
|
164849
164886
|
if (result2.errors.length > 0) {
|
|
164850
164887
|
for (const error3 of result2.errors) {
|
|
164851
|
-
debug(`Module error in ${stack} tests: ${error3
|
|
164852
|
-
${error3.stack ?? "(no stack captured)"}`);
|
|
164888
|
+
debug(`Module error in ${stack} tests: ${formatModuleError(error3)}`);
|
|
164853
164889
|
}
|
|
164854
164890
|
throw result2.errors.map((error3) => new ExpectedError(error3.type && error3.type !== "Error" ? `${error3.type}: ${error3.message}` : error3.message));
|
|
164855
164891
|
}
|
|
@@ -167722,6 +167758,26 @@ var dashboardHtml = `<!doctype html>
|
|
|
167722
167758
|
.health .chip.down { border-color: var(--bad); }
|
|
167723
167759
|
.health .chip.down .dot { background: var(--bad); }
|
|
167724
167760
|
.health .chip .detail-text { color: var(--muted); }
|
|
167761
|
+
.home-cols {
|
|
167762
|
+
display: grid;
|
|
167763
|
+
grid-template-columns: repeat(auto-fit, minmax(380px, 1fr));
|
|
167764
|
+
gap: 0 20px;
|
|
167765
|
+
align-items: start;
|
|
167766
|
+
}
|
|
167767
|
+
/* The activity feed reads like the log cards. */
|
|
167768
|
+
.activity-card {
|
|
167769
|
+
background: var(--panel);
|
|
167770
|
+
border: 1px solid var(--border);
|
|
167771
|
+
border-radius: 6px;
|
|
167772
|
+
padding: 8px;
|
|
167773
|
+
margin-top: 8px;
|
|
167774
|
+
max-height: 420px;
|
|
167775
|
+
overflow-y: auto;
|
|
167776
|
+
font-size: 12px;
|
|
167777
|
+
}
|
|
167778
|
+
.activity-card .rows { grid-template-columns: fit-content(110px) 1fr auto; }
|
|
167779
|
+
.activity-card .row { padding: 3px 4px; gap: 8px; }
|
|
167780
|
+
.activity-card .empty { padding: 4px; }
|
|
167725
167781
|
.row.problem .id { color: var(--bad); }
|
|
167726
167782
|
.empty.good { color: var(--good); }
|
|
167727
167783
|
.row .stack {
|
|
@@ -167897,7 +167953,7 @@ const ICONS = {
|
|
|
167897
167953
|
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"/>'),
|
|
167898
167954
|
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"/>'),
|
|
167899
167955
|
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"/>'),
|
|
167900
|
-
auth: svg('<
|
|
167956
|
+
auth: svg('<rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/>'),
|
|
167901
167957
|
worker: svg('<polyline points="4 17 10 11 4 5"/><line x1="12" y1="19" x2="20" y2="19"/>'),
|
|
167902
167958
|
}
|
|
167903
167959
|
|
|
@@ -169260,11 +169316,22 @@ const renderHome = main => {
|
|
|
169260
169316
|
// ----------------------------------------------------------------
|
|
169261
169317
|
// Activity: every dispatch through the bundle, newest first.
|
|
169262
169318
|
|
|
169263
|
-
|
|
169319
|
+
// Activity & the handler logs sit side by side, both as cards.
|
|
169320
|
+
const cols = $('div', { className: 'home-cols' })
|
|
169321
|
+
const activityCol = $('div', {})
|
|
169322
|
+
const logsCol = $('div', {})
|
|
169264
169323
|
|
|
169324
|
+
cols.append(activityCol, logsCol)
|
|
169325
|
+
main.append(cols)
|
|
169326
|
+
|
|
169327
|
+
activityCol.append($('h3', {}, 'Activity'))
|
|
169328
|
+
|
|
169329
|
+
const card = $('div', { className: 'activity-card' })
|
|
169265
169330
|
const activity = $('div', { className: 'rows' })
|
|
169266
169331
|
const idle = $('p', { className: 'empty' }, 'Nothing ran yet.')
|
|
169267
|
-
|
|
169332
|
+
|
|
169333
|
+
card.append(idle, activity)
|
|
169334
|
+
activityCol.append(card)
|
|
169268
169335
|
|
|
169269
169336
|
const activityRows = []
|
|
169270
169337
|
|
|
@@ -169274,8 +169341,8 @@ const renderHome = main => {
|
|
|
169274
169341
|
const resource = state.resources.find(r => r.routeKey === data.route)
|
|
169275
169342
|
const row = $('button', { className: 'row' + (data.ok ? '' : ' problem') }, [
|
|
169276
169343
|
$('span', { className: 'stack' }, new Date(data.date).toLocaleTimeString()),
|
|
169277
|
-
$('span', { className: 'id' }, (data.ok ? '' : '\\u2717 ') + data.route),
|
|
169278
|
-
$('span', { className: 'info' }, data.ok ? data.ms + 'ms' : (data.error ?? 'failed').slice(0, 80)),
|
|
169344
|
+
$('span', { className: 'id', title: data.route }, (data.ok ? '' : '\\u2717 ') + data.route),
|
|
169345
|
+
$('span', { className: 'info', title: data.ok ? '' : (data.error ?? '') }, data.ok ? data.ms + 'ms' : (data.error ?? 'failed').slice(0, 80)),
|
|
169279
169346
|
])
|
|
169280
169347
|
|
|
169281
169348
|
if (resource) {
|
|
@@ -169301,7 +169368,7 @@ const renderHome = main => {
|
|
|
169301
169368
|
// Logs: the handlers' own console output, live - the full feed
|
|
169302
169369
|
// (incl. the dev server stream) lives on the Logs tab.
|
|
169303
169370
|
|
|
169304
|
-
const logsFeed = attachLogFeed(
|
|
169371
|
+
const logsFeed = attachLogFeed(logsCol, 'worker', undefined, 'Logs')
|
|
169305
169372
|
|
|
169306
169373
|
cleanupPanel = () => {
|
|
169307
169374
|
clearInterval(uptimeTimer)
|
|
@@ -169924,6 +169991,7 @@ var startDev = async (props) => {
|
|
|
169924
169991
|
const phase = props.phase ?? (async ({ start }, fn) => (log(start), fn(() => {})));
|
|
169925
169992
|
const { appConfig, stackConfigs } = props;
|
|
169926
169993
|
const startedAt = Date.now();
|
|
169994
|
+
useDevBuildDir();
|
|
169927
169995
|
const { builders, appId, ready: ready2 } = createApp({
|
|
169928
169996
|
appConfig,
|
|
169929
169997
|
stackConfigs,
|
|
@@ -9934,19 +9934,25 @@ import { stringify } from "@awsless/json";
|
|
|
9934
9934
|
import { lambda } from "@awsless/lambda";
|
|
9935
9935
|
import { maxLength, minLength, object, optional, pipe, string, unknown } from "@awsless/validate";
|
|
9936
9936
|
import { getRouteEnv } from "awsless";
|
|
9937
|
-
var
|
|
9938
|
-
|
|
9939
|
-
|
|
9940
|
-
|
|
9941
|
-
|
|
9942
|
-
|
|
9943
|
-
|
|
9944
|
-
|
|
9945
|
-
|
|
9946
|
-
|
|
9947
|
-
|
|
9948
|
-
|
|
9949
|
-
|
|
9937
|
+
var client;
|
|
9938
|
+
var getClient = () => {
|
|
9939
|
+
if (!client || client.status === "end") {
|
|
9940
|
+
client = new import_ioredis.Redis({
|
|
9941
|
+
host: getRouteEnv("REDIS_HOST"),
|
|
9942
|
+
port: Number(getRouteEnv("REDIS_PORT") ?? 6379),
|
|
9943
|
+
tls: getRouteEnv("REDIS_TLS") === "disabled" ? undefined : {},
|
|
9944
|
+
lazyConnect: true,
|
|
9945
|
+
keepAlive: 0,
|
|
9946
|
+
noDelay: true,
|
|
9947
|
+
enableReadyCheck: false,
|
|
9948
|
+
maxRetriesPerRequest: 10,
|
|
9949
|
+
retryStrategy: (times) => times > 20 ? null : Math.min(times * 250, 2000),
|
|
9950
|
+
connectTimeout: 1e4,
|
|
9951
|
+
commandTimeout: 1e4
|
|
9952
|
+
});
|
|
9953
|
+
client.on("error", () => {});
|
|
9954
|
+
}
|
|
9955
|
+
return client;
|
|
9950
9956
|
};
|
|
9951
9957
|
var handle_default = lambda({
|
|
9952
9958
|
schema: object({
|
|
@@ -9954,14 +9960,8 @@ var handle_default = lambda({
|
|
|
9954
9960
|
event: pipe(string(), minLength(1), maxLength(64)),
|
|
9955
9961
|
payload: optional(unknown())
|
|
9956
9962
|
}),
|
|
9957
|
-
async handle({ topic, event, payload }
|
|
9958
|
-
|
|
9959
|
-
ctx.onFinally(() => {
|
|
9960
|
-
return redis.quit().catch(() => {
|
|
9961
|
-
redis.disconnect();
|
|
9962
|
-
});
|
|
9963
|
-
});
|
|
9964
|
-
await redis.publish(getRouteEnv("CHANNEL"), stringify({
|
|
9963
|
+
async handle({ topic, event, payload }) {
|
|
9964
|
+
await getClient().publish(getRouteEnv("CHANNEL"), stringify({
|
|
9965
9965
|
topic,
|
|
9966
9966
|
event,
|
|
9967
9967
|
payload: typeof payload === "undefined" ? undefined : stringify(payload)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@awsless/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -42,13 +42,13 @@
|
|
|
42
42
|
"@awsless/ts-file-cache": "^0.0.16"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
|
-
"@awsless/big-float": "^0.1.7",
|
|
46
45
|
"@awsless/duration": "^0.0.4",
|
|
47
|
-
"@awsless/dynamodb": "^0.3.23",
|
|
48
46
|
"@awsless/json": "^0.0.11",
|
|
49
47
|
"@awsless/lambda": "^0.0.48",
|
|
50
|
-
"@awsless/
|
|
48
|
+
"@awsless/big-float": "^0.1.7",
|
|
49
|
+
"@awsless/dynamodb": "^0.3.23",
|
|
51
50
|
"@awsless/validate": "^0.2.0",
|
|
51
|
+
"@awsless/s3": "^0.0.22",
|
|
52
52
|
"awsless": "^0.1.4",
|
|
53
53
|
"@awsless/weak-cache": "^0.0.1"
|
|
54
54
|
},
|
|
@@ -111,22 +111,22 @@
|
|
|
111
111
|
"@awsless/big-float": "^0.1.7",
|
|
112
112
|
"@awsless/clui": "^0.0.9",
|
|
113
113
|
"@awsless/cloudwatch": "^0.0.1",
|
|
114
|
-
"@awsless/duration": "^0.0.4",
|
|
115
114
|
"@awsless/dynamodb": "^0.3.23",
|
|
116
|
-
"@awsless/
|
|
115
|
+
"@awsless/duration": "^0.0.4",
|
|
117
116
|
"@awsless/json": "^0.0.11",
|
|
118
|
-
"@awsless/lambda": "^0.0.48",
|
|
119
117
|
"@awsless/open-search": "^0.0.28",
|
|
120
|
-
"@awsless/
|
|
118
|
+
"@awsless/iot": "^0.0.5",
|
|
121
119
|
"@awsless/redis": "^0.1.13",
|
|
120
|
+
"@awsless/s3": "^0.0.22",
|
|
122
121
|
"@awsless/size": "^0.0.2",
|
|
122
|
+
"@awsless/lambda": "^0.0.48",
|
|
123
123
|
"@awsless/sns": "^0.0.11",
|
|
124
|
-
"@awsless/
|
|
124
|
+
"@awsless/scheduler": "^0.0.5",
|
|
125
125
|
"@awsless/sqs": "^0.0.24",
|
|
126
|
-
"awsless": "^0.1.4",
|
|
127
126
|
"@awsless/ssm": "^0.0.8",
|
|
128
|
-
"@awsless/
|
|
129
|
-
"@awsless/
|
|
127
|
+
"@awsless/validate": "^0.2.0",
|
|
128
|
+
"@awsless/weak-cache": "^0.0.1",
|
|
129
|
+
"awsless": "^0.1.4"
|
|
130
130
|
},
|
|
131
131
|
"scripts": {
|
|
132
132
|
"test": "bun cli/build-handlers.ts && pnpm vitest",
|