@tailor-platform/sdk 1.76.2 → 1.79.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/application-BB6BlUfk.mjs +3 -0
  3. package/dist/{application-CqjCcZ2n.mjs → application-fjqb-Gh8.mjs} +57 -10
  4. package/dist/application-fjqb-Gh8.mjs.map +1 -0
  5. package/dist/cli/commands/deploy/deploy.d.mts +8 -3
  6. package/dist/cli/commands/show.d.mts +9 -3
  7. package/dist/cli/commands/workspace/create.d.mts +3 -0
  8. package/dist/cli/commands/workspace/list.d.mts +1 -0
  9. package/dist/cli/commands/workspace/transform.d.mts +2 -0
  10. package/dist/cli/index.mjs +47 -22
  11. package/dist/cli/index.mjs.map +1 -1
  12. package/dist/cli/lib.d.mts +2 -2
  13. package/dist/cli/lib.mjs +2 -2
  14. package/dist/cli/lib.mjs.map +1 -1
  15. package/dist/cli/shared/workspace-name.d.mts +1 -0
  16. package/dist/cli/skills.mjs +1 -1
  17. package/dist/completion/zsh-worker.zsh +18 -1
  18. package/dist/configure/index.mjs +202 -7
  19. package/dist/configure/index.mjs.map +1 -1
  20. package/dist/configure/services/idp/index.d.mts +1 -4
  21. package/dist/configure/services/tailordb/schema.d.mts +1 -7
  22. package/dist/configure/services/workflow/execution-policy.d.mts +2 -2
  23. package/dist/configure/types/type.d.mts +1 -9
  24. package/dist/{crashreport-DZDr-TvH.mjs → crashreport-BNWUM6Kf.mjs} +2 -2
  25. package/dist/{crashreport-DZDr-TvH.mjs.map → crashreport-BNWUM6Kf.mjs.map} +1 -1
  26. package/dist/{crashreport-np4-_DX2.mjs → crashreport-BafWvjjX.mjs} +1 -1
  27. package/dist/errors-DVFS0AZk.mjs +100 -0
  28. package/dist/errors-DVFS0AZk.mjs.map +1 -0
  29. package/dist/{globals-z6zYMjlr.mjs → globals-B-n_3uYu.mjs} +11 -5
  30. package/dist/globals-B-n_3uYu.mjs.map +1 -0
  31. package/dist/{logger-BEiZZ3qT.mjs → logger-BwS4ppwO.mjs} +3 -3
  32. package/dist/logger-BwS4ppwO.mjs.map +1 -0
  33. package/dist/{registry-CTgoVWc_.mjs → registry-CXi7rJq7.mjs} +4 -3
  34. package/dist/registry-CXi7rJq7.mjs.map +1 -0
  35. package/dist/runtime/field-parse.d.mts +11 -0
  36. package/dist/runtime/globals.d.mts +4 -1
  37. package/dist/runtime/index.mjs +1 -1
  38. package/dist/runtime/workflow.d.mts +79 -15
  39. package/dist/runtime/workflow.mjs +2 -2
  40. package/dist/{runtime-DlklyuHN.mjs → runtime-CjMeYuPA.mjs} +1169 -539
  41. package/dist/runtime-CjMeYuPA.mjs.map +1 -0
  42. package/dist/{schema-DbTR1c6M.mjs → schema-CYrle8JZ.mjs} +222 -4
  43. package/dist/schema-CYrle8JZ.mjs.map +1 -0
  44. package/dist/{secretmanager-Bd45j7an.mjs → secretmanager-IY4UvinW.mjs} +42 -9
  45. package/dist/secretmanager-IY4UvinW.mjs.map +1 -0
  46. package/dist/service-CghpdV-9.mjs +3 -0
  47. package/dist/{service-DBFZQloR.mjs → service-Cp0I7ZFe.mjs} +3 -3
  48. package/dist/{service-DBFZQloR.mjs.map → service-Cp0I7ZFe.mjs.map} +1 -1
  49. package/dist/{service-BCRJ-3NV.mjs → service-D12iQGcS.mjs} +2 -2
  50. package/dist/{service-BCRJ-3NV.mjs.map → service-D12iQGcS.mjs.map} +1 -1
  51. package/dist/{test-env-key-IPapa1KJ.mjs → test-env-key-DuZycyWM.mjs} +2 -2
  52. package/dist/{test-env-key-IPapa1KJ.mjs.map → test-env-key-DuZycyWM.mjs.map} +1 -1
  53. package/dist/types/auth.generated.d.mts +9 -36
  54. package/dist/types/executor.generated.d.mts +19 -59
  55. package/dist/types/idp.generated.d.mts +518 -517
  56. package/dist/types/resolver.generated.d.mts +6 -2
  57. package/dist/types/tailordb.generated.d.mts +8 -7
  58. package/dist/utils/test/index.mjs +1 -1
  59. package/dist/vitest/environment.mjs +1 -1
  60. package/dist/vitest/index.d.mts +8 -8
  61. package/dist/vitest/index.mjs +635 -195
  62. package/dist/vitest/index.mjs.map +1 -1
  63. package/dist/vitest/mock.d.mts +8 -8
  64. package/dist/vitest/mocks/aigateway.d.mts +14 -4
  65. package/dist/vitest/mocks/authconnection.d.mts +14 -4
  66. package/dist/vitest/mocks/file.d.mts +24 -6
  67. package/dist/vitest/mocks/iconv.d.mts +28 -4
  68. package/dist/vitest/mocks/idp.d.mts +25 -9
  69. package/dist/vitest/mocks/secretmanager.d.mts +13 -4
  70. package/dist/vitest/mocks/tailordb.d.mts +48 -7
  71. package/dist/vitest/mocks/workflow.d.mts +68 -22
  72. package/dist/vitest/setup.mjs +2 -2
  73. package/dist/workflow-CkIDJpdg.mjs +69 -0
  74. package/dist/workflow-CkIDJpdg.mjs.map +1 -0
  75. package/docs/cli/application.md +58 -11
  76. package/docs/cli/setup.md +1 -1
  77. package/docs/cli/workspace.md +6 -4
  78. package/docs/cli-reference.md +12 -8
  79. package/docs/runtime.md +5 -6
  80. package/docs/services/aigateway.md +2 -0
  81. package/docs/services/tailordb.md +44 -0
  82. package/docs/services/workflow.md +3 -3
  83. package/docs/testing.md +105 -91
  84. package/package.json +7 -7
  85. package/dist/application-6zsDLGKv.mjs +0 -3
  86. package/dist/application-CqjCcZ2n.mjs.map +0 -1
  87. package/dist/configure/types/field-runtime.d.mts +0 -17
  88. package/dist/errors-Dtf2WPaW.mjs +0 -42
  89. package/dist/errors-Dtf2WPaW.mjs.map +0 -1
  90. package/dist/field-runtime-D4QWRiB1.mjs +0 -203
  91. package/dist/field-runtime-D4QWRiB1.mjs.map +0 -1
  92. package/dist/globals-z6zYMjlr.mjs.map +0 -1
  93. package/dist/logger-BEiZZ3qT.mjs.map +0 -1
  94. package/dist/registry-CTgoVWc_.mjs.map +0 -1
  95. package/dist/runtime-DlklyuHN.mjs.map +0 -1
  96. package/dist/schema-DbTR1c6M.mjs.map +0 -1
  97. package/dist/secretmanager-Bd45j7an.mjs.map +0 -1
  98. package/dist/service-CPMlIg3X.mjs +0 -3
  99. package/dist/types-BzJ7A_fn.mjs +0 -199
  100. package/dist/types-BzJ7A_fn.mjs.map +0 -1
  101. package/dist/types-CG9H7HuE.mjs +0 -4
  102. package/dist/workflow-DSwnYPPP.mjs +0 -45
  103. package/dist/workflow-DSwnYPPP.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,43 @@
1
1
  # @tailor-platform/sdk
2
2
 
3
+ ## 1.79.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1768](https://github.com/tailor-platform/sdk/pull/1768) [`813f86e`](https://github.com/tailor-platform/sdk/commit/813f86eb0b0df1a768db5de6a39a550d6633749a) Thanks [@k1LoW](https://github.com/k1LoW)! - Add canonical `tailor.workflow.*` names that mirror the public `tailor.v1` RPC vocabulary. The `startWorkflow`, `startJobFunction`, and `resumeWorkflowExecution` methods are now available on `tailor.workflow`, alongside `workflow.startWorkflow` / `workflow.startJobFunction` / `workflow.resumeWorkflowExecution` from `@tailor-platform/sdk/runtime`. The pre-alignment names (`triggerWorkflow`, `triggerJobFunction`, `resumeWorkflow`) continue to work as frozen aliases, but are now marked `@deprecated` so IDEs surface a hint to migrate to the canonical names.
8
+
9
+ ### Patch Changes
10
+
11
+ - [#1769](https://github.com/tailor-platform/sdk/pull/1769) [`9837182`](https://github.com/tailor-platform/sdk/commit/983718288eab23a4c15762c179a67569dd78a287) Thanks [@dqn](https://github.com/dqn)! - Fix `tailor function test-run` crashing with `TypeError: Cannot convert undefined or null to object` when `--arg` is a non-object JSON value such as `null`. The argument is now forwarded to the server, which reports the validation error. Local input validation also runs the same logic as deployed resolvers.
12
+
13
+ - [#1777](https://github.com/tailor-platform/sdk/pull/1777) [`322b69c`](https://github.com/tailor-platform/sdk/commit/322b69c843953551ccb4b32d7cbd528ae2b0e10c) Thanks [@toiroakr](https://github.com/toiroakr)! - Fail fast at `generate`/`deploy` time when a TailorDB type is missing `.permission()`, or missing `.gqlPermission()` while GraphQL operations are enabled for it (`.gqlPermission()` is not required when GraphQL exposure is fully disabled via `gqlOperations`). Previously these omissions deployed silently and only surfaced later as an opaque `internal error` on insert.
14
+
15
+ ## 1.78.0
16
+
17
+ ### Minor Changes
18
+
19
+ - [#1753](https://github.com/tailor-platform/sdk/pull/1753) [`6bff945`](https://github.com/tailor-platform/sdk/commit/6bff94505f3dbe11a8be36ef301e3641ee2cba89) Thanks [@dqn](https://github.com/dqn)! - Add typed, service-specific Vitest mock controls for runtime APIs and update generated project tests to use them.
20
+
21
+ - [#1754](https://github.com/tailor-platform/sdk/pull/1754) [`10392ff`](https://github.com/tailor-platform/sdk/commit/10392ff07fa50d90ba7e4846bf1dc14011dde2eb) Thanks [@dqn](https://github.com/dqn)! - Guide workspace selection and optional creation during deploy when no workspace is configured, with machine-readable recovery actions that preserve environment and profile settings
22
+
23
+ ### Patch Changes
24
+
25
+ - [#1763](https://github.com/tailor-platform/sdk/pull/1763) [`2abbe40`](https://github.com/tailor-platform/sdk/commit/2abbe409ed77eb5e1c50d4aa0b65fbf26843fdb1) Thanks [@dqn](https://github.com/dqn)! - Reduce duplicated schema-derived type declarations.
26
+
27
+ - [#1770](https://github.com/tailor-platform/sdk/pull/1770) [`9ca5eaa`](https://github.com/tailor-platform/sdk/commit/9ca5eaa4c92b699aa49c79913975cdcfd702214d) Thanks [@toiroakr](https://github.com/toiroakr)! - Document the type-level `gqlOperations` feature (`.features({ gqlOperations })`, including the `"query"` read-only alias) and the namespace-level `db.tailordb.gqlOperations` default in `tailor.config.ts`, clarifying that the namespace default also updates types that already exist on the platform.
28
+
29
+ - [#1764](https://github.com/tailor-platform/sdk/pull/1764) [`7895ed6`](https://github.com/tailor-platform/sdk/commit/7895ed621dc87ec0307ddb511307a0daac637556) Thanks [@k1LoW](https://github.com/k1LoW)! - Correct the execution policy matching semantics in the workflow docs: overlapping policies now stack (every matching cap is enforced independently and the tightest blocks), not longest-prefix-wins.
30
+
31
+ ## 1.77.0
32
+
33
+ ### Minor Changes
34
+
35
+ - [#1758](https://github.com/tailor-platform/sdk/pull/1758) [`e596975`](https://github.com/tailor-platform/sdk/commit/e596975eeb4ca1479554f98aaf449b5c21c98610) Thanks [@toiroakr](https://github.com/toiroakr)! - Show the URL of each configured AI Gateway in the `show` command output.
36
+
37
+ ### Patch Changes
38
+
39
+ - [#1717](https://github.com/tailor-platform/sdk/pull/1717) [`34aff11`](https://github.com/tailor-platform/sdk/commit/34aff110c6f2cebd2e86fa82e45216d6360368e1) Thanks [@renovate](https://github.com/apps/renovate)! - fix(deps): update oxc
40
+
3
41
  ## 1.76.2
4
42
 
5
43
  ### Patch Changes
@@ -0,0 +1,3 @@
1
+ import { n as generatePluginFilesIfNeeded, r as loadApplication, t as defineApplication } from "./application-fjqb-Gh8.mjs";
2
+
3
+ export { defineApplication, generatePluginFilesIfNeeded };
@@ -1,7 +1,7 @@
1
1
  import { n as isSdkBranded } from "./brand-Eo4pLXPJ.mjs";
2
2
  import { t as assertDefined } from "./assert-DBxo8jPo.mjs";
3
- import { a as parseBoolean, n as logger, r as styles } from "./logger-BEiZZ3qT.mjs";
4
- import { a as TailorFieldSchema, i as AuthInvokerSchema, n as ExecutorSchema, o as loadFilesWithIgnores, r as AuthConfigSchema, s as functionSchema, t as createExecutorService } from "./service-BCRJ-3NV.mjs";
3
+ import { a as parseBoolean, n as logger, r as styles } from "./logger-BwS4ppwO.mjs";
4
+ import { a as TailorFieldSchema, i as AuthInvokerSchema, n as ExecutorSchema, o as loadFilesWithIgnores, r as AuthConfigSchema, s as functionSchema, t as createExecutorService } from "./service-D12iQGcS.mjs";
5
5
  import { t as multiline } from "./multiline-sfHpTZZK.mjs";
6
6
  import { t as isPluginGeneratedType } from "./type-source-DH_LH20p.mjs";
7
7
  import { t as userAgent } from "./user-agent-DX2Jnw0-.mjs";
@@ -234,9 +234,9 @@ async function bearerTokenInterceptor(accessToken) {
234
234
  /**
235
235
  * Create an interceptor that retries failed unary requests with backoff.
236
236
  *
237
- * Retries any unary method on `Unavailable`/`ResourceExhausted`, and `Internal`
238
- * only for methods declared idempotent, up to 3 attempts (despite the historical
239
- * "idempotent" naming, the first two codes are retried regardless of idempotency).
237
+ * Retries unary methods on `Unavailable`/`ResourceExhausted`, and `Internal`
238
+ * only for methods declared idempotent, up to 3 attempts. Workspace creation is
239
+ * excluded because it has no idempotency key and a lost response is ambiguous.
240
240
  * As a targeted exception for the deploy/apply flow, a post-retry `AlreadyExists`
241
241
  * from an allowlisted Create (see `RETRY_SAFE_CREATE_METHODS`) is treated as
242
242
  * success, since it means a prior attempt already committed the resource
@@ -261,10 +261,10 @@ function retryInterceptor() {
261
261
  logger.debug(`retry: ${req.method.name} returned AlreadyExists on attempt ${i + 1}; treating as success (prior attempt likely committed)`);
262
262
  return synthesizeEmptyUnaryResponse(req);
263
263
  }
264
- const { reportCrash } = await import("./crashreport-np4-_DX2.mjs");
264
+ const { reportCrash } = await import("./crashreport-BafWvjjX.mjs");
265
265
  await reportCrash(error, "handledError");
266
266
  }
267
- if (isRetirable(error, req.method.idempotency)) {
267
+ if (req.method.name !== "CreateWorkspace" && isRetirable(error, req.method.idempotency)) {
268
268
  lastError = error;
269
269
  logger.debug(`retry: ${req.method.name} attempt ${i + 1} failed with ${connectCodeName(error)}; retrying`);
270
270
  continue;
@@ -2491,6 +2491,36 @@ function findOmittedPermitRules(rawPermissions) {
2491
2491
  });
2492
2492
  return locations;
2493
2493
  }
2494
+ /**
2495
+ * Check whether GraphQL exposure is fully disabled for a type, given its
2496
+ * effective gqlOperations (the type's own setting, falling back to the
2497
+ * TailorDB namespace default). `undefined` means the default of all
2498
+ * operations enabled, so it is never considered fully disabled.
2499
+ * @param gqlOperations - Effective, normalized gqlOperations configuration
2500
+ * @returns Whether create, update, delete, and read are all explicitly disabled
2501
+ */
2502
+ function isGqlOperationsFullyDisabled(gqlOperations) {
2503
+ if (!gqlOperations) return false;
2504
+ return gqlOperations.create === false && gqlOperations.update === false && gqlOperations.delete === false && gqlOperations.read === false;
2505
+ }
2506
+ /**
2507
+ * Find missing permission configuration for a TailorDB type.
2508
+ *
2509
+ * Record-level permission is always required: TailorDB denies all record
2510
+ * operations for a type without it, regardless of whether the type is
2511
+ * exposed via GraphQL. GraphQL permission is required whenever GraphQL
2512
+ * exposure is enabled for the type (the default, unless every operation is
2513
+ * explicitly disabled via `gqlOperations`).
2514
+ * @param rawPermissions - Raw permissions definition for the type
2515
+ * @param effectiveGqlOperations - The type's own gqlOperations, falling back to the namespace default
2516
+ * @returns Which permission configuration, if any, is missing
2517
+ */
2518
+ function findMissingPermissionConfig(rawPermissions, effectiveGqlOperations) {
2519
+ return {
2520
+ missingPermission: !rawPermissions.record,
2521
+ missingGqlPermission: !rawPermissions.gql && !isGqlOperationsFullyDisabled(effectiveGqlOperations)
2522
+ };
2523
+ }
2494
2524
 
2495
2525
  //#endregion
2496
2526
  //#region src/parser/service/tailordb/relation.ts
@@ -3533,6 +3563,19 @@ function createTailorDBService(params) {
3533
3563
  if (locations.length > 0) logger.warn(`TailorDB type "${typeName}" has permission rule(s) ${locations.join(", ")} in object form without an explicit "permit"; they default to "deny". Set permit: true (allow) or permit: false (deny) to silence this warning.`);
3534
3564
  }
3535
3565
  };
3566
+ const validateRequiredPermissions = () => {
3567
+ const errors = [];
3568
+ for (const fileTypes of Object.values(rawTypes)) for (const [typeName, type] of Object.entries(fileTypes)) {
3569
+ const effectiveGqlOperations = type.metadata.settings?.gqlOperations ?? config.gqlOperations;
3570
+ const { missingPermission, missingGqlPermission } = findMissingPermissionConfig(type.metadata.permissions, effectiveGqlOperations);
3571
+ if (!missingPermission && !missingGqlPermission) continue;
3572
+ const source = formatTailorDBTypeSourceInfo(typeSourceInfo[typeName]);
3573
+ const location = source ? ` (${source})` : "";
3574
+ if (missingPermission) errors.push(`TailorDB type "${typeName}"${location} has no .permission() configured. TailorDB denies all record operations for types without permission; call .permission(...) to grant access explicitly.`);
3575
+ if (missingGqlPermission) errors.push(`TailorDB type "${typeName}"${location} has no .gqlPermission() configured, but GraphQL operations are enabled for it. Call .gqlPermission(...) to grant GraphQL access explicitly, or disable GraphQL exposure with .features({ gqlOperations: { create: false, update: false, delete: false, read: false } }).`);
3576
+ }
3577
+ if (errors.length > 0) throw new Error(`TailorDB permission configuration errors in service "${namespace}":\n${errors.map((e) => ` - ${e}`).join("\n")}`);
3578
+ };
3536
3579
  /**
3537
3580
  * Process plugins for a type and add generated types to rawTypes
3538
3581
  * @param rawType - The raw TailorDB type being processed
@@ -3625,6 +3668,7 @@ function createTailorDBService(params) {
3625
3668
  else await Promise.all(typeFiles.map((typeFile) => loadTypeFile(typeFile, tsconfig)));
3626
3669
  doParseTypes();
3627
3670
  warnOmittedPermit();
3671
+ validateRequiredPermissions();
3628
3672
  return types;
3629
3673
  })();
3630
3674
  return loadPromise;
@@ -3666,7 +3710,10 @@ function createTailorDBService(params) {
3666
3710
  hasGeneratedTypes = true;
3667
3711
  logger.log(` Generated: ${styles.success(generatedType.name)} by namespace plugin ${styles.info(pluginId)}`);
3668
3712
  }
3669
- if (hasGeneratedTypes || hadPreviousGeneratedTypes) doParseTypes();
3713
+ if (hasGeneratedTypes || hadPreviousGeneratedTypes) {
3714
+ doParseTypes();
3715
+ validateRequiredPermissions();
3716
+ }
3670
3717
  }
3671
3718
  };
3672
3719
  }
@@ -4819,7 +4866,7 @@ const RetryPolicySchema = z.object({
4819
4866
  });
4820
4867
  const ConcurrencyPolicySchema = z.object({ maxConcurrentExecutions: z.number().int().min(1).max(1e3).describe("Maximum number of concurrent executions (1-1000)") });
4821
4868
  const ExecutionPolicyNameSchema = z.string().regex(/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/, "Invalid execution policy name: must match [a-z0-9-] (3-63 chars; must start and end with [a-z0-9])").describe("Workspace-unique execution policy name embedded in the resource TRN");
4822
- const ExecutionPolicyKeySchema = z.string().regex(/^[a-z0-9][a-z0-9_:.-]{0,62}[a-z0-9*]$/, "Invalid execution policy key: must match [a-z0-9_:.-] (2-64 chars; must start with [a-z0-9] and end with [a-z0-9] or a trailing '*')").describe("Execution policy key passed to triggerJobFunction's executionPolicyKey option");
4869
+ const ExecutionPolicyKeySchema = z.string().regex(/^[a-z0-9][a-z0-9_:.-]{0,62}[a-z0-9*]$/, "Invalid execution policy key: must match [a-z0-9_:.-] (2-64 chars; must start with [a-z0-9] and end with [a-z0-9] or a trailing '*')").describe("Execution policy key passed to startJobFunction's (or its frozen alias triggerJobFunction's) executionPolicyKey option");
4823
4870
  const WorkflowJobFunctionExecutionPolicySchema = z.object({
4824
4871
  name: ExecutionPolicyNameSchema,
4825
4872
  key: ExecutionPolicyKeySchema,
@@ -5546,4 +5593,4 @@ async function loadApplication(params) {
5546
5593
 
5547
5594
  //#endregion
5548
5595
  export { fetchAllTolerant as A, initOperatorClient as B, createBundleCache as C, closeConnectionPool as D, hashFile as E, getConsoleBaseUrl as F, byName as G, normalizeBaseUrl as H, getOAuth2ClientId as I, LOG_LEVELS as K, getOrNull as L, fetchPaged as M, fetchPlatformMachineUserToken as N, defaultPlatformBaseUrl as O, fetchUserInfo as P, getPlatformBaseUrl as R, hasGenerationHooks as S, hashContent as T, rememberPlatformConfigForToken as U, isDefaultPlatform as V, resolveStaticWebsiteUrls as W, platformBundleDefinePlugin as _, resolveInlineSourcemap as a, resolveBundleLogLevel as b, ResolverSchema as c, buildExecutorArgsExpr as d, buildResolverOperationHookExpr as f, stringifyFunction as g, TailorDBTypeSchema as h, resolverBundleKey as i, fetchMachineUserToken as j, fetchAll as k, HTTP_METHODS as l, assertUniqueTailorDBTypeNamesWithExternal as m, generatePluginFilesIfNeeded as n, WorkflowJobFunctionExecutionPolicySchema as o, assertUniqueLocalTailorDBTypeNames as p, loadApplication as r, WorkflowJobSchema as s, defineApplication as t, INVOKER_EXPR as u, composeFunctionTreeshakeOptions as v, getDistDir as w, getPluginGenerationDependencies as x, createLogLevelTreeshakeOptions as y, initOAuth2Client as z };
5549
- //# sourceMappingURL=application-CqjCcZ2n.mjs.map
5596
+ //# sourceMappingURL=application-fjqb-Gh8.mjs.map