Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .changeset/migrate-to-structurer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
"@platforma-open/milaboratories.table": patch
"@platforma-open/milaboratories.table.model": patch
"@platforma-open/milaboratories.table.ui": patch
"@platforma-open/milaboratories.table.workflow": patch
---

Migrate to the block-tools structurer and to BlockModelV3.

- Adopt the tool-managed layout (oxlint/oxfmt, managed tsconfig/turbo/catalog) and
complete the SDK upgrade (model/ui-vue 1.79, workflow-tengo 6, tengo-builder 4).
- Migrate the model from the legacy V1 API to BlockModelV3 with a unified data
model; persisted state is carried over by a one-time legacy upgrader. All state
is UI-only (column selection + table grid state); args project to an empty object.
- Build the data table with createPlDataTableV3 (replacing createPlDataTableV2).
- UI bindings move from app.model.ui to app.model.data; the app uses defineAppV3.
35 changes: 18 additions & 17 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,67 +11,68 @@ on:
workflow_dispatch: {}
jobs:
init:
if: github.repository != 'milaboratory/platforma-block-boilerplate'
runs-on: ubuntu-latest
runs-on: hz-ubuntu-dind
steps:
- uses: milaboratory/github-ci/actions/context/init@v4
with:
version-canonize: false
branch-versioning: main
run:
if: github.repository != 'milaboratory/platforma-block-boilerplate'
needs:
- init

uses: milaboratory/github-ci/.github/workflows/node-simple-pnpm.yaml@v4
with:
app-name: 'Block: Table'
app-name-slug: 'block-table'

node-version: '20.x'
build-script-name: 'build'
gha-runner-label: hz-ubuntu-dind
build-script-name: 'build:dev-local'
build-before-publish-script-name: 'build:release'
pnpm-recursive-build: false

test: false
test: true
test-script-name: 'test'
pnpm-recursive-tests: false
team-id: 'ciplopen'

publish-to-public: 'true'
package-path: 'block'
publish-to-public: true
create-tag: true
create-tag: 'true'

npmrc-config: |
{
"registries": {
"https://registry.npmjs.org/": {
"scopes": ["milaboratories", "platforma-open", "platforma-sdk"],
"scopes": ["milaboratories", "platforma-sdk", "platforma-open"],
"tokenVar": "NPMJS_TOKEN"
},
"https://npm.pkg.github.com/": {
"scopes": ["milaboratory"],
"tokenVar": "NODE_AUTH_TOKEN"
}
}
}

secrets:
env: |
{ "PL_LICENSE": ${{ toJSON(secrets.MI_LICENSE) }},
"MI_LICENSE": ${{ toJSON(secrets.MI_LICENSE) }},

"NPMJS_TOKEN": ${{ toJSON(secrets.NPMJS_TOKEN) }},
"PL_CI_TEST_USER": ${{ toJSON(secrets.PL_CI_TEST_USER) }},
"PL_CI_TEST_PASSWORD": ${{ toJSON(secrets.PL_CI_TEST_PASSWORD) }},

"AWS_CI_IAM_MONOREPO_SIMPLE_ROLE": ${{ toJSON(secrets.AWS_CI_IAM_MONOREPO_SIMPLE_ROLE) }},
"AWS_CI_TURBOREPO_S3_BUCKET": ${{ toJSON(secrets.AWS_CI_TURBOREPO_S3_BUCKET) }},

"HZ_CI_TURBO_S3_BUCKET": ${{ toJSON(vars.HZ_CI_TURBO_S3_BUCKET) }},
"HZ_CI_TURBO_S3_ENDPOINT": ${{ toJSON(vars.HZ_CI_TURBO_S3_ENDPOINT) }},
"HZ_CI_TURBO_S3_REGION": ${{ toJSON(vars.HZ_CI_TURBO_S3_REGION) }},
"HZ_CI_TURBO_S3_ACCESS_KEY": ${{ toJSON(secrets.HZ_CI_TURBO_S3_ACCESS_KEY) }},
"HZ_CI_TURBO_S3_SECRET_KEY": ${{ toJSON(secrets.HZ_CI_TURBO_S3_SECRET_KEY) }},
"HZ_CI_CACHE_S3_ACCESS_KEY": ${{ toJSON(secrets.HZ_CI_CACHE_S3_ACCESS_KEY) }},
"HZ_CI_CACHE_S3_SECRET_KEY": ${{ toJSON(secrets.HZ_CI_CACHE_S3_SECRET_KEY) }},

"PL_REGISTRY_PLATFORMA_OPEN_UPLOAD_URL": ${{ toJSON(secrets.PL_REGISTRY_PLOPEN_UPLOAD_URL) }},
"QUAY_USERNAME": ${{ toJSON(secrets.QUAY_USERNAME) }},
"QUAY_ROBOT_TOKEN": ${{ toJSON(secrets.QUAY_ROBOT_TOKEN) }} }

SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_CHANNEL: ${{ secrets.SLACK_BLOCKS_CI_CHANNEL }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}

GH_ZEN_APP_ID: ${{ secrets.GH_ZEN_APP_ID }}
GH_ZEN_APP_PRIVATE_KEY: ${{ secrets.GH_ZEN_APP_PRIVATE_KEY }}
4 changes: 1 addition & 3 deletions .github/workflows/mark-stable.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,13 @@ on:
workflow_dispatch: {}
jobs:
init:
if: github.repository != 'milaboratory/platforma-block-boilerplate'
runs-on: ubuntu-latest
steps:
- uses: milaboratory/github-ci/actions/context/init@v4
with:
version-canonize: false
branch-versioning: main
run:
if: github.repository != 'milaboratory/platforma-block-boilerplate'
needs:
- init
uses: milaboratory/github-ci/.github/workflows/block-mark-stable.yaml@v4
Expand All @@ -32,5 +30,5 @@ jobs:
{ "NPMJS_TOKEN": ${{ toJSON(secrets.NPMJS_TOKEN) }},
"AWS_CI_IAM_MONOREPO_SIMPLE_ROLE": ${{ toJSON(secrets.AWS_CI_IAM_MONOREPO_SIMPLE_ROLE) }} }

SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_CHANNEL: ${{ secrets.SLACK_BLOCKS_CI_CHANNEL }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,7 @@ log/
.DS_Store
.test_auth.json
.turbo
vite.config.*.timestamp-*
vite.config.*.timestamp-*
software/**/*.tgz
.vscode/sftp.json
test-dry-run.json
7 changes: 0 additions & 7 deletions .prettierrc

This file was deleted.

1 change: 1 addition & 0 deletions .structure
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"version":2}
19 changes: 1 addition & 18 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,20 +1,3 @@
{
"vitest.disableWorkspaceWarning": true,
"editor.defaultFormatter": "dbaeumer.vscode-eslint",
"[typescript]": {
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
},
"[vue]": {
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
},
"cSpell.words": [
"datasource",
"pframe",
"prerun"
],
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "always"
},
"eslint.enable": true,
"eslint.format.enable": true
"typescript.tsdk": "node_modules/typescript/lib"
}
38 changes: 28 additions & 10 deletions block/package.json
Original file line number Diff line number Diff line change
@@ -1,21 +1,39 @@
{
"name": "@platforma-open/milaboratories.table",
"version": "1.1.2",
"files": [
"dist",
"block-pack"
],
"type": "module",
"main": "./dist/index.js",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"sources": "./src/index.ts",
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
},
"scripts": {
"pretty": "prettier --write \"./**/*.{js,jsx,mjs,cjs,ts,tsx,json,vue}\"",
"build": "rm -rf ./block-pack && block-tools pack",
"mark-stable": "block-tools mark-stable -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'",
"prepublishOnly": "block-tools pack && block-tools publish -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'",
"do-pack": "rm -f *.tgz && block-tools pack && pnpm pack && mv *.tgz package.tgz"
"build": "ts-builder build --target block-facade && block-tools pack",
"prepublishOnly": "block-tools publish -r s3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1 --registry-serve-url https://blocks.pl-open.science",
"do-pack": "shx rm -f package.tgz && pnpm pack && shx mv *.tgz package.tgz",
"check": "ts-builder type-check --target block-facade"
},
"dependencies": {
"@platforma-sdk/model": "catalog:",
"dependencies": {},
"devDependencies": {
"@milaboratories/ts-builder": "catalog:",
"@milaboratories/ts-configs": "catalog:",
"@platforma-open/milaboratories.table.model": "workspace:*",
"@platforma-open/milaboratories.table.ui": "workspace:*",
"@platforma-open/milaboratories.table.workflow": "workspace:*"
},
"devDependencies": {
"@platforma-sdk/block-tools": "catalog:"
"@platforma-open/milaboratories.table.workflow": "workspace:*",
"@platforma-sdk/block-tools": "catalog:",
"@platforma-sdk/model": "catalog:",
"shx": "catalog:",
"typescript": "catalog:"
},
"block": {
"components": {
Expand Down
5 changes: 5 additions & 0 deletions block/src/AGENTS.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// This file is managed by `block-tools structure`. Do not edit by hand.
// Narrow MCP / AI surface.

export type { BlockContract, BlockOutputs, BlockData } from "./index";
export * from "./agents-extra";
8 changes: 8 additions & 0 deletions block/src/agents-extra.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// Author-owned. `block-tools structure` does not modify this file.
// MCP / AI extension surface. Add types and functions the agent
// surface should expose.
//
// In the future this file will host JS functions the MCP runtime
// can execute. The `.d.ts` declarations stay visible to the agent;
// the JS bodies execute in the MCP code-execution context (the
// agent sees the types but not the implementation).
9 changes: 9 additions & 0 deletions block/src/block-extra.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// Author-owned. `block-tools structure` does not modify this file.
// Add block-specific helper types or values the consumer surface
// should expose. Anything you `export` here flows out via the
// main entry (./index re-exports this file).
//
// Do NOT redefine: BlockContract, BlockOutputs, BlockData,
// BlockPointer, platforma, or the block-named <PascalName>Block*
// aliases — those names come from ./index and `export *` from this
// file would shadow them.
55 changes: 55 additions & 0 deletions block/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// This file is managed by `block-tools structure`. Do not edit by hand.
// Author content lives in ./block-extra.ts.

import { platforma } from "@platforma-open/milaboratories.table.model";
import {
InferOutputsType,
InferDataType,
InferHrefType,
} from "@platforma-sdk/model";

export { platforma };

export type BlockContract = {
outputs: InferOutputsType<typeof platforma>;
data: InferDataType<typeof platforma>;
href: InferHrefType<typeof platforma>;
};

export type BlockOutputs = BlockContract["outputs"];
export type BlockData = BlockContract["data"];

// import.meta.url is a file: URL (always forward-slash, even on Windows:
// file:///C:/…). We expose URLs, NOT paths — the facade stays dependency-free
// and loadable in minimal engines (e.g. QuickJS), and each consumer converts
// at its own edge with the right tool (fileURLToPath in Node), where Windows
// drive letters / %-encoding / UNC are handled correctly. The bundled entry
// sits one dir under the package root (dist/index.js, or src/index.ts in dev),
// so the root is two URL segments up. The structurer owns this layout —
// consumers read these URLs, they never reconstruct <root>/block-pack.
//
// TypeScript ships `ImportMeta.url` only in the `dom`/`webworker` libs; the
// facade tsconfig is lib-minimal (no `dom`, no `@types/node`) by design. We
// type the one ESM-standard member we use with a local cast rather than a
// `declare global` — a global augmentation would leak into the published
// `dist/index.d.ts` and clash with `@types/node`'s `ImportMeta` in full-Node
// consumers (test packages, the Middle Layer).
const selfUrl = (import.meta as ImportMeta & { url: string }).url;
const dirUrl = selfUrl.slice(0, selfUrl.lastIndexOf("/"));
const rootUrl = dirUrl.slice(0, dirUrl.lastIndexOf("/"));

export const BlockPointer = {
type: "from-pack-v2" as const,
packUrl: rootUrl + "/block-pack",
rootUrl,
} as const;

// Block-named aliases for readable cross-block imports in tests and
// consumer code. Same types / same runtime value as the universal
// names above; the aliases avoid `as`-renames at the import site.
export type TableBlockContract = BlockContract;
export type TableBlockOutputs = BlockOutputs;
export type TableBlockData = BlockData;
export const TableBlockPointer = BlockPointer;

export * from "./block-extra";
4 changes: 4 additions & 0 deletions block/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"extends": "@milaboratories/ts-configs/block/facade",
"include": ["src/**/*"]
}
4 changes: 4 additions & 0 deletions model/.oxfmtrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"extends": ["node_modules/@milaboratories/ts-builder/configs/oxfmt.json"],
"ignorePatterns": ["dist", "coverage", "CHANGELOG.md"]
}
3 changes: 3 additions & 0 deletions model/.oxlintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": ["node_modules/@milaboratories/ts-builder/dist/configs/oxlint-block-model.json"]
}
4 changes: 0 additions & 4 deletions model/eslint.config.mjs

This file was deleted.

24 changes: 19 additions & 5 deletions model/package.json
Original file line number Diff line number Diff line change
@@ -1,25 +1,39 @@
{
"name": "@platforma-open/milaboratories.table.model",
"version": "1.1.2",
"private": true,
"description": "Block model",
"type": "module",
"main": "dist/index.cjs",
"module": "dist/index.js",
"types": "dist/index.d.ts",
"exports": {
".": {
"types": "./dist/index.d.ts",
"sources": "./src/index.ts",
"import": "./dist/index.js"
},
"./dist/*": "./dist/*"
},
"scripts": {
"type-check": "ts-builder types --target block-model",
"build": "ts-builder build --target block-model && block-tools build-model",
"lint": "eslint ."
"fmt": "ts-builder format",
"watch": "ts-builder build --target block-model --watch",
"check": "ts-builder check --target block-model"
},
"dependencies": {
"@milaboratories/helpers": "catalog:",
"@platforma-sdk/model": "catalog:"
},
"devDependencies": {
"@milaboratories/ts-builder": "catalog:",
"@milaboratories/ts-configs": "catalog:",
"@platforma-sdk/block-tools": "catalog:",
"@platforma-sdk/eslint-config": "catalog:",
"@types/node": "catalog:",
"eslint": "catalog:",
"typescript": "catalog:"
"eslint": "catalog:"
},
"peerDependencies": {
"@types/node": "*",
"typescript": "*"
}
}
22 changes: 22 additions & 0 deletions model/src/dataModel.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { createPlDataTableStateV2, DataModelBuilder } from "@platforma-sdk/model";
import type { BlockData, ColumnGroup, LegacyBlockArgs, LegacyUiState } from "./types";

const emptyGroup = (): ColumnGroup => ({
mainColumn: undefined,
additionalColumns: [],
enrichmentColumns: [],
});

export const blockDataModel = new DataModelBuilder()
.from<BlockData>("v1")
// Legacy V1 stored everything under `uiState`; args was always empty. Pick the
// two fields we keep — obsolete keys (filtersOpen, filterModel, tableState,
// settingsOpened) are dropped here instead of by the old UI-side upgrader.
.upgradeLegacy<LegacyBlockArgs, LegacyUiState>(({ uiState }) => ({
group: uiState?.group ?? emptyGroup(),
tableStateV2: uiState?.tableStateV2 ?? createPlDataTableStateV2(),
}))
Comment thread
vadimpiven marked this conversation as resolved.
.init(() => ({
group: emptyGroup(),
tableStateV2: createPlDataTableStateV2(),
}));
Loading
Loading