@ankhorage/infra 0.3.6 → 0.3.7

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/CHANGELOG.md CHANGED
@@ -1,10 +1,16 @@
1
1
  # @ankhorage/infra
2
2
 
3
+ ## 0.3.7
4
+
5
+ ### Patch Changes
6
+
7
+ - 1f86a8e: Finalize the generated API handler promise normalization so the package passes CI and generated apps remain compatible with `@typescript-eslint/require-await`.
8
+
3
9
  ## 0.3.6
4
10
 
5
11
  ### Patch Changes
6
12
 
7
- - 89eb7cf: Generate in-memory API store methods as explicit promises without unnecessary `async`, so generated apps pass `@typescript-eslint/require-await`.
13
+ - 89eb7cf: Generate in-memory API store methods with explicit `Promise.resolve(...)` returns instead of unnecessary `async`, so generated apps pass `@typescript-eslint/require-await`.
8
14
 
9
15
  ## 0.3.5
10
16
 
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  # INFRA
5
5
 
6
- ![license: MIT](././paradox/badges/license.svg) ![npm: v0.3.4](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
6
+ ![license: MIT](././paradox/badges/license.svg) ![npm: v0.3.6](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
7
7
 
8
8
  Executable infra provider and standalone CLI for Ankhorage project workflows.
9
9
 
@@ -1 +1 @@
1
- {"version":3,"file":"apiArtifacts.d.ts","sourceRoot":"","sources":["../src/apiArtifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,QAAQ,CAAC;AAIhB,YAAY,EAAE,0BAA0B,EAAE,MAAM,QAAQ,CAAC;AAEzD,wBAAgB,kCAAkC,CAAC,IAAI,EAAE;IACvD,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/C,GAAG,0BAA0B,CAW7B"}
1
+ {"version":3,"file":"apiArtifacts.d.ts","sourceRoot":"","sources":["../src/apiArtifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EACL,KAAK,0BAA0B,EAEhC,MAAM,QAAQ,CAAC;AAIhB,YAAY,EAAE,0BAA0B,EAAE,MAAM,QAAQ,CAAC;AAEzD,wBAAgB,kCAAkC,CAAC,IAAI,EAAE;IACvD,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/C,GAAG,0BAA0B,CAW7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"apiArtifacts.js","sourceRoot":"","sources":["../src/apiArtifacts.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,kCAAkC,IAAI,qCAAqC,GAE5E,MAAM,QAAQ,CAAC;AAEhB,MAAM,2BAA2B,GAAG,mCAAmC,CAAC;AAIxE,MAAM,UAAU,kCAAkC,CAAC,IAGlD;IACC,MAAM,SAAS,GAAG,qCAAqC,CAAC,IAAI,CAAC,CAAC;IAE9D,OAAO;QACL,GAAG,SAAS;QACZ,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAClC,IAAI,CAAC,IAAI,KAAK,2BAA2B;YACvC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACtE,CAAC,CAAC,IAAI,CACT;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gCAAgC,CAAC,MAAc;IACtD,IAAI,MAAM,GAAG,MAAM,CAAC;IAEpB,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,yEAAyE,EACzE,mEAAmE,CACpE,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,wDAAwD,EACxD,yEAAyE,CAC1E,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,iFAAiF,EACjF,2EAA2E,CAC5E,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,6CAA6C,EAC7C,8DAA8D,EAC9D,CAAC,CACF,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,iEAAiE,EACjE,kFAAkF,CACnF,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,4FAA4F,EAC5F,sFAAsF,CACvF,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,uCAAuC,EACvC,wDAAwD,EACxD,CAAC,CACF,CAAC;IACF,MAAM,GAAG,uBAAuB,CAAC,MAAM,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC;IACjF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,mCAAmC,EACnC,oDAAoD,CACrD,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,mFAAmF,EACnF,6EAA6E,CAC9E,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,+CAA+C,EAC/C,gEAAgE,CACjE,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,oCAAoC,EACpC,qDAAqD,CACtD,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAAc,EACd,OAAe,EACf,WAAmB,EACnB,aAAa,GAAG,CAAC;IAEjB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,0CAA0C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,aAAa,mBAAmB,KAAK,GAAG,CAC9G,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACjD,CAAC","sourcesContent":["import type { AppDataManifest } from '@ankhorage/contracts';\n\nimport {\n generateApiInfrastructureArtifacts as generateRawApiInfrastructureArtifacts,\n type ApiInfrastructureArtifacts,\n} from './apis';\n\nconst GENERATED_API_HANDLERS_PATH = 'src/generated/apis/apiHandlers.ts';\n\nexport type { ApiInfrastructureArtifacts } from './apis';\n\nexport function generateApiInfrastructureArtifacts(args: {\n readonly data: AppDataManifest | undefined;\n readonly databaseProvider: string | undefined;\n}): ApiInfrastructureArtifacts {\n const artifacts = generateRawApiInfrastructureArtifacts(args);\n\n return {\n ...artifacts,\n files: artifacts.files.map((file) =>\n file.path === GENERATED_API_HANDLERS_PATH\n ? { ...file, content: makeGeneratedApiHandlersLintSafe(file.content) }\n : file,\n ),\n };\n}\n\nfunction makeGeneratedApiHandlersLintSafe(source: string): string {\n let result = source;\n\n result = replaceGeneratedSnippet(\n result,\n ' async list(apiId: string): Promise<readonly GeneratedApiRecord[]> {',\n ' list(apiId: string): Promise<readonly GeneratedApiRecord[]> {',\n );\n result = replaceGeneratedSnippet(\n result,\n ' return getRows(records, apiId).map(cloneRecord);',\n ' return Promise.resolve(getRows(records, apiId).map(cloneRecord));',\n );\n result = replaceGeneratedSnippet(\n result,\n ' async read(apiId: string, id: string): Promise<GeneratedApiRecord | null> {',\n ' read(apiId: string, id: string): Promise<GeneratedApiRecord | null> {',\n );\n result = replaceGeneratedSnippet(\n result,\n ' if (primaryKey === null) return null;',\n ' if (primaryKey === null) return Promise.resolve(null);',\n 3,\n );\n result = replaceGeneratedSnippet(\n result,\n ' return record === undefined ? null : cloneRecord(record);',\n ' return Promise.resolve(record === undefined ? null : cloneRecord(record));',\n );\n result = replaceGeneratedSnippet(\n result,\n ' async create(apiId: string, values: GeneratedApiRecord): Promise<GeneratedApiRecord> {',\n ' create(apiId: string, values: GeneratedApiRecord): Promise<GeneratedApiRecord> {',\n );\n result = replaceGeneratedSnippet(\n result,\n ' return cloneRecord(nextRecord);',\n ' return Promise.resolve(cloneRecord(nextRecord));',\n 2,\n );\n result = replaceGeneratedSnippet(result, ' async update(\\n', ' update(\\n');\n result = replaceGeneratedSnippet(\n result,\n ' if (index < 0) return null;',\n ' if (index < 0) return Promise.resolve(null);',\n );\n result = replaceGeneratedSnippet(\n result,\n ' async delete(apiId: string, id: string): Promise<GeneratedApiRecord | null> {',\n ' delete(apiId: string, id: string): Promise<GeneratedApiRecord | null> {',\n );\n result = replaceGeneratedSnippet(\n result,\n ' if (deleted === undefined) return null;',\n ' if (deleted === undefined) return Promise.resolve(null);',\n );\n result = replaceGeneratedSnippet(\n result,\n ' return cloneRecord(deleted);',\n ' return Promise.resolve(cloneRecord(deleted));',\n );\n\n return result;\n}\n\nfunction replaceGeneratedSnippet(\n source: string,\n snippet: string,\n replacement: string,\n expectedCount = 1,\n): string {\n const count = source.split(snippet).length - 1;\n if (count !== expectedCount) {\n throw new Error(\n `Expected generated API handler snippet ${JSON.stringify(snippet)} ${expectedCount} time(s), found ${count}.`,\n );\n }\n\n return source.replaceAll(snippet, replacement);\n}\n"]}
1
+ {"version":3,"file":"apiArtifacts.js","sourceRoot":"","sources":["../src/apiArtifacts.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,kCAAkC,IAAI,qCAAqC,GAC5E,MAAM,QAAQ,CAAC;AAEhB,MAAM,2BAA2B,GAAG,mCAAmC,CAAC;AAIxE,MAAM,UAAU,kCAAkC,CAAC,IAGlD;IACC,MAAM,SAAS,GAAG,qCAAqC,CAAC,IAAI,CAAC,CAAC;IAE9D,OAAO;QACL,GAAG,SAAS;QACZ,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAClC,IAAI,CAAC,IAAI,KAAK,2BAA2B;YACvC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACtE,CAAC,CAAC,IAAI,CACT;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gCAAgC,CAAC,MAAc;IACtD,IAAI,MAAM,GAAG,MAAM,CAAC;IAEpB,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,yEAAyE,EACzE,mEAAmE,CACpE,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,wDAAwD,EACxD,yEAAyE,CAC1E,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,iFAAiF,EACjF,2EAA2E,CAC5E,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,6CAA6C,EAC7C,8DAA8D,EAC9D,CAAC,CACF,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,iEAAiE,EACjE,kFAAkF,CACnF,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,4FAA4F,EAC5F,sFAAsF,CACvF,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,uCAAuC,EACvC,wDAAwD,EACxD,CAAC,CACF,CAAC;IACF,MAAM,GAAG,uBAAuB,CAAC,MAAM,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC;IACjF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,mCAAmC,EACnC,oDAAoD,CACrD,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,mFAAmF,EACnF,6EAA6E,CAC9E,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,+CAA+C,EAC/C,gEAAgE,CACjE,CAAC;IACF,MAAM,GAAG,uBAAuB,CAC9B,MAAM,EACN,oCAAoC,EACpC,qDAAqD,CACtD,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAAc,EACd,OAAe,EACf,WAAmB,EACnB,aAAa,GAAG,CAAC;IAEjB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,0CAA0C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,aAAa,mBAAmB,KAAK,GAAG,CAC9G,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACjD,CAAC","sourcesContent":["import type { AppDataManifest } from '@ankhorage/contracts';\n\nimport {\n type ApiInfrastructureArtifacts,\n generateApiInfrastructureArtifacts as generateRawApiInfrastructureArtifacts,\n} from './apis';\n\nconst GENERATED_API_HANDLERS_PATH = 'src/generated/apis/apiHandlers.ts';\n\nexport type { ApiInfrastructureArtifacts } from './apis';\n\nexport function generateApiInfrastructureArtifacts(args: {\n readonly data: AppDataManifest | undefined;\n readonly databaseProvider: string | undefined;\n}): ApiInfrastructureArtifacts {\n const artifacts = generateRawApiInfrastructureArtifacts(args);\n\n return {\n ...artifacts,\n files: artifacts.files.map((file) =>\n file.path === GENERATED_API_HANDLERS_PATH\n ? { ...file, content: makeGeneratedApiHandlersLintSafe(file.content) }\n : file,\n ),\n };\n}\n\nfunction makeGeneratedApiHandlersLintSafe(source: string): string {\n let result = source;\n\n result = replaceGeneratedSnippet(\n result,\n ' async list(apiId: string): Promise<readonly GeneratedApiRecord[]> {',\n ' list(apiId: string): Promise<readonly GeneratedApiRecord[]> {',\n );\n result = replaceGeneratedSnippet(\n result,\n ' return getRows(records, apiId).map(cloneRecord);',\n ' return Promise.resolve(getRows(records, apiId).map(cloneRecord));',\n );\n result = replaceGeneratedSnippet(\n result,\n ' async read(apiId: string, id: string): Promise<GeneratedApiRecord | null> {',\n ' read(apiId: string, id: string): Promise<GeneratedApiRecord | null> {',\n );\n result = replaceGeneratedSnippet(\n result,\n ' if (primaryKey === null) return null;',\n ' if (primaryKey === null) return Promise.resolve(null);',\n 3,\n );\n result = replaceGeneratedSnippet(\n result,\n ' return record === undefined ? null : cloneRecord(record);',\n ' return Promise.resolve(record === undefined ? null : cloneRecord(record));',\n );\n result = replaceGeneratedSnippet(\n result,\n ' async create(apiId: string, values: GeneratedApiRecord): Promise<GeneratedApiRecord> {',\n ' create(apiId: string, values: GeneratedApiRecord): Promise<GeneratedApiRecord> {',\n );\n result = replaceGeneratedSnippet(\n result,\n ' return cloneRecord(nextRecord);',\n ' return Promise.resolve(cloneRecord(nextRecord));',\n 2,\n );\n result = replaceGeneratedSnippet(result, ' async update(\\n', ' update(\\n');\n result = replaceGeneratedSnippet(\n result,\n ' if (index < 0) return null;',\n ' if (index < 0) return Promise.resolve(null);',\n );\n result = replaceGeneratedSnippet(\n result,\n ' async delete(apiId: string, id: string): Promise<GeneratedApiRecord | null> {',\n ' delete(apiId: string, id: string): Promise<GeneratedApiRecord | null> {',\n );\n result = replaceGeneratedSnippet(\n result,\n ' if (deleted === undefined) return null;',\n ' if (deleted === undefined) return Promise.resolve(null);',\n );\n result = replaceGeneratedSnippet(\n result,\n ' return cloneRecord(deleted);',\n ' return Promise.resolve(cloneRecord(deleted));',\n );\n\n return result;\n}\n\nfunction replaceGeneratedSnippet(\n source: string,\n snippet: string,\n replacement: string,\n expectedCount = 1,\n): string {\n const count = source.split(snippet).length - 1;\n if (count !== expectedCount) {\n throw new Error(\n `Expected generated API handler snippet ${JSON.stringify(snippet)} ${expectedCount} time(s), found ${count}.`,\n );\n }\n\n return source.replaceAll(snippet, replacement);\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ankhorage/infra",
3
3
  "type": "module",
4
- "version": "0.3.6",
4
+ "version": "0.3.7",
5
5
  "description": "Project-aware infrastructure generation library and executable Ankh provider for Ankhorage.",
6
6
  "homepage": "https://github.com/ankhorage/infra#readme",
7
7
  "bugs": {
@@ -40,9 +40,7 @@ describe('generated API artifacts', () => {
40
40
  },
41
41
  });
42
42
 
43
- const handlers = result.files.find(
44
- (file) => file.path === 'src/generated/apis/apiHandlers.ts',
45
- );
43
+ const handlers = result.files.find((file) => file.path === 'src/generated/apis/apiHandlers.ts');
46
44
 
47
45
  expect(handlers).toBeDefined();
48
46
  expect(handlers?.content).not.toMatch(/\basync (?:list|read|create|update|delete)\(/);
@@ -1,8 +1,8 @@
1
1
  import type { AppDataManifest } from '@ankhorage/contracts';
2
2
 
3
3
  import {
4
- generateApiInfrastructureArtifacts as generateRawApiInfrastructureArtifacts,
5
4
  type ApiInfrastructureArtifacts,
5
+ generateApiInfrastructureArtifacts as generateRawApiInfrastructureArtifacts,
6
6
  } from './apis';
7
7
 
8
8
  const GENERATED_API_HANDLERS_PATH = 'src/generated/apis/apiHandlers.ts';